diff -Nru openlp-1.9.9/copyright.txt openlp-1.9.10/copyright.txt --- openlp-1.9.9/copyright.txt 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/copyright.txt 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/debian/changelog openlp-1.9.10/debian/changelog --- openlp-1.9.9/debian/changelog 2012-05-22 21:50:14.000000000 +0000 +++ openlp-1.9.10/debian/changelog 2012-08-12 09:40:00.000000000 +0000 @@ -1,8 +1,14 @@ -openlp (1.9.9-1~ubuntu12.04.1) precise-backports; urgency=low +openlp (1.9.10-1~ubuntu12.04.1) precise-backports; urgency=low - * No-change backport to precise (LP: #1003143) + * No-change backport to precise (LP: #1023115) - -- Iain Lane Tue, 22 May 2012 22:50:14 +0100 + -- Micah Gersten Sun, 12 Aug 2012 04:40:00 -0500 + +openlp (1.9.10-1) unstable; urgency=low + + * New upstream release + + -- Raoul Snyman Sat, 23 Jun 2012 21:54:30 +0200 openlp (1.9.9-1) unstable; urgency=low diff -Nru openlp-1.9.9/debian/control openlp-1.9.10/debian/control --- openlp-1.9.9/debian/control 2012-05-09 22:04:14.000000000 +0000 +++ openlp-1.9.10/debian/control 2012-06-24 19:33:11.000000000 +0000 @@ -9,7 +9,7 @@ qt4-linguist-tools Standards-Version: 3.9.3 Vcs-Bzr: lp:openlp/debian-package -Vcs-Browse: http://bazaar.launchpad.net/~openlp-core/openlp/debian-package/files +Vcs-Browser: http://bazaar.launchpad.net/~openlp-core/openlp/debian-package/files Homepage: http://openlp.org/ Package: openlp diff -Nru openlp-1.9.9/openlp/core/__init__.py openlp-1.9.10/openlp/core/__init__.py --- openlp-1.9.9/openlp/core/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -41,6 +42,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, check_directory_exists +from openlp.core.lib.settings import Settings from openlp.core.lib.ui import UiStrings from openlp.core.resources import qInitResources from openlp.core.ui.mainwindow import MainWindow @@ -49,7 +51,7 @@ from openlp.core.ui.exceptionform import ExceptionForm from openlp.core.ui import SplashScreen, ScreenList from openlp.core.utils import AppLocation, LanguageManager, VersionThread, \ - get_application_version, DelayStartThread + get_application_version __all__ = [u'OpenLP', u'main'] @@ -91,6 +93,7 @@ """ Override exec method to allow the shared memory to be released on exit """ + self.eventLoopIsActive = True QtGui.QApplication.exec_() self.sharedMemory.detach() @@ -98,6 +101,7 @@ """ Run the OpenLP application. """ + self.eventLoopIsActive = False # On Windows, the args passed into the constructor are # ignored. Not very handy, so set the ones we want to use. self.args.extend(args) @@ -109,17 +113,17 @@ QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cursor_normal'), self.setNormalCursor) # Decide how many screens we have and their size - screens = ScreenList(self.desktop()) + screens = ScreenList.create(self.desktop()) # First time checks in settings - has_run_wizard = QtCore.QSettings().value( + has_run_wizard = Settings().value( u'general/has run wizard', QtCore.QVariant(False)).toBool() if not has_run_wizard: if FirstTimeForm(screens).exec_() == QtGui.QDialog.Accepted: - QtCore.QSettings().setValue(u'general/has run wizard', + Settings().setValue(u'general/has run wizard', QtCore.QVariant(True)) if os.name == u'nt': self.setStyleSheet(application_stylesheet) - show_splash = QtCore.QSettings().value( + show_splash = Settings().value( u'general/show splash', QtCore.QVariant(True)).toBool() if show_splash: self.splash = SplashScreen() @@ -127,7 +131,7 @@ # make sure Qt really display the splash screen self.processEvents() # start the main app window - self.mainWindow = MainWindow(self.clipboard(), self.args) + self.mainWindow = MainWindow(self) self.mainWindow.show() if show_splash: # now kill the splashscreen @@ -139,13 +143,12 @@ self.processEvents() if not has_run_wizard: self.mainWindow.firstTime() - update_check = QtCore.QSettings().value( + update_check = Settings().value( u'general/update check', QtCore.QVariant(True)).toBool() if update_check: VersionThread(self.mainWindow).start() Receiver.send_message(u'live_display_blank_check') self.mainWindow.appStartup() - DelayStartThread(self.mainWindow).start() # Skip exec_() for gui tests if not testing: return self.exec_() @@ -257,7 +260,28 @@ app = OpenLP(qt_args) app.setOrganizationName(u'OpenLP') app.setOrganizationDomain(u'openlp.org') - app.setApplicationName(u'OpenLP') + if options.portable: + log.info(u'Running portable') + app.setApplicationName(u'OpenLPPortable') + Settings.setDefaultFormat(Settings.IniFormat) + # Get location OpenLPPortable.ini + app_path = AppLocation.get_directory(AppLocation.AppDir) + portable_settings_file = os.path.abspath(os.path.join(app_path, u'..', + u'..', u'Data', u'OpenLP.ini')) + # Make this our settings file + log.info(u'INI file: %s', portable_settings_file) + Settings.setFilename(portable_settings_file) + portable_settings = Settings() + # Set our data path + data_path = os.path.abspath(os.path.join(app_path, + u'..', u'..', u'Data',)) + log.info(u'Data path: %s', data_path) + # Point to our data path + portable_settings.setValue(u'advanced/data path', data_path) + portable_settings.setValue(u'advanced/is portable', True) + portable_settings.sync() + else: + app.setApplicationName(u'OpenLP') app.setApplicationVersion(get_application_version()[u'version']) # Instance check if not options.testing: @@ -265,7 +289,7 @@ if app.isAlreadyRunning(): sys.exit() # First time checks in settings - if not QtCore.QSettings().value(u'general/has run wizard', + if not Settings().value(u'general/has run wizard', QtCore.QVariant(False)).toBool(): if not FirstTimeLanguageForm().exec_(): # if cancel then stop processing diff -Nru openlp-1.9.9/openlp/core/lib/db.py openlp-1.9.10/openlp/core/lib/db.py --- openlp-1.9.9/openlp/core/lib/db.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/db.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -41,6 +42,7 @@ from openlp.core.lib import translate from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, delete_file +from openlp.core.lib.settings import Settings log = logging.getLogger(__name__) @@ -179,7 +181,7 @@ The file name to use for this database. Defaults to None resulting in the plugin_name being used. """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(plugin_name) self.db_url = u'' self.is_dirty = False @@ -238,27 +240,30 @@ ``commit`` Commit the session with this object """ - try: - self.session.add(object_instance) - if commit: - self.session.commit() - self.is_dirty = True - return True - except OperationalError: - # This exception clause is for users running MySQL which likes - # to terminate connections on its own without telling anyone. - # See bug #927473 - log.exception(u'Probably a MySQL issue - "MySQL has gone away"') - self.session.rollback() - self.session.add(object_instance) - if commit: - self.session.commit() - self.is_dirty = True - return True - except InvalidRequestError: - self.session.rollback() - log.exception(u'Object save failed') - return False + for try_count in range(3): + try: + self.session.add(object_instance) + if commit: + self.session.commit() + self.is_dirty = True + return True + except OperationalError: + # This exception clause is for users running MySQL which likes + # to terminate connections on its own without telling anyone. + # See bug #927473 + # However, other dbms can raise it, usually in a non-recoverable + # way. So we only retry 3 times. + log.exception(u'Probably a MySQL issue - "MySQL has gone away"') + self.session.rollback() + if try_count >= 2: + raise + except InvalidRequestError: + self.session.rollback() + log.exception(u'Object list save failed') + return False + except: + self.session.rollback() + raise def save_objects(self, object_list, commit=True): """ @@ -270,27 +275,30 @@ ``commit`` Commit the session with this object """ - try: - self.session.add_all(object_list) - if commit: - self.session.commit() - self.is_dirty = True - return True - except OperationalError: - # This exception clause is for users running MySQL which likes - # to terminate connections on its own without telling anyone. - # See bug #927473 - log.exception(u'Probably a MySQL issue, "MySQL has gone away"') - self.session.rollback() - self.session.add_all(object_list) - if commit: - self.session.commit() - self.is_dirty = True - return True - except InvalidRequestError: - self.session.rollback() - log.exception(u'Object list save failed') - return False + for try_count in range(3): + try: + self.session.add_all(object_list) + if commit: + self.session.commit() + self.is_dirty = True + return True + except OperationalError: + # This exception clause is for users running MySQL which likes + # to terminate connections on its own without telling anyone. + # See bug #927473 + # However, other dbms can raise it, usually in a non-recoverable + # way. So we only retry 3 times. + log.exception(u'Probably a MySQL issue, "MySQL has gone away"') + self.session.rollback() + if try_count >= 2: + raise + except InvalidRequestError: + self.session.rollback() + log.exception(u'Object list save failed') + return False + except: + self.session.rollback() + raise def get_object(self, object_class, key=None): """ @@ -305,15 +313,18 @@ if not key: return object_class() else: - try: - return self.session.query(object_class).get(key) - except OperationalError: - # This exception clause is for users running MySQL which likes - # to terminate connections on its own without telling anyone. - # See bug #927473 - log.exception(u'Probably a MySQL issue, "MySQL has gone away"') - self.session.rollback() - return self.session.query(object_class).get(key) + for try_count in range(3): + try: + return self.session.query(object_class).get(key) + except OperationalError: + # This exception clause is for users running MySQL which likes + # to terminate connections on its own without telling anyone. + # See bug #927473 + # However, other dbms can raise it, usually in a non-recoverable + # way. So we only retry 3 times. + log.exception(u'Probably a MySQL issue, "MySQL has gone away"') + if try_count >= 2: + raise def get_object_filtered(self, object_class, filter_clause): """ @@ -325,15 +336,18 @@ ``filter_clause`` The criteria to select the object by """ - try: - return self.session.query(object_class).filter(filter_clause).first() - except OperationalError: - # This exception clause is for users running MySQL which likes - # to terminate connections on its own without telling anyone. - # See bug #927473 - log.exception(u'Probably a MySQL issue, "MySQL has gone away"') - self.session.rollback() - return self.session.query(object_class).filter(filter_clause).first() + for try_count in range(3): + try: + return self.session.query(object_class).filter(filter_clause).first() + except OperationalError: + # This exception clause is for users running MySQL which likes + # to terminate connections on its own without telling anyone. + # See bug #927473 + # However, other dbms can raise it, usually in a non-recoverable + # way. So we only retry 3 times. + log.exception(u'Probably a MySQL issue, "MySQL has gone away"') + if try_count >= 2: + raise def get_all_objects(self, object_class, filter_clause=None, order_by_ref=None): @@ -357,15 +371,18 @@ query = query.order_by(*order_by_ref) elif order_by_ref is not None: query = query.order_by(order_by_ref) - try: - return query.all() - except OperationalError: - # This exception clause is for users running MySQL which likes - # to terminate connections on its own without telling anyone. - # See bug #927473 - log.exception(u'Probably a MySQL issue, "MySQL has gone away"') - self.session.rollback() - return query.all() + for try_count in range(3): + try: + return query.all() + except OperationalError: + # This exception clause is for users running MySQL which likes + # to terminate connections on its own without telling anyone. + # See bug #927473 + # However, other dbms can raise it, usually in a non-recoverable + # way. So we only retry 3 times. + log.exception(u'Probably a MySQL issue, "MySQL has gone away"') + if try_count >= 2: + raise def get_object_count(self, object_class, filter_clause=None): """ @@ -381,15 +398,18 @@ query = self.session.query(object_class) if filter_clause is not None: query = query.filter(filter_clause) - try: - return query.count() - except OperationalError: - # This exception clause is for users running MySQL which likes - # to terminate connections on its own without telling anyone. - # See bug #927473 - log.exception(u'Probably a MySQL issue, "MySQL has gone away"') - self.session.rollback() - return query.count() + for try_count in range(3): + try: + return query.count() + except OperationalError: + # This exception clause is for users running MySQL which likes + # to terminate connections on its own without telling anyone. + # See bug #927473 + # However, other dbms can raise it, usually in a non-recoverable + # way. So we only retry 3 times. + log.exception(u'Probably a MySQL issue, "MySQL has gone away"') + if try_count >= 2: + raise def delete_object(self, object_class, key): """ @@ -403,25 +423,29 @@ """ if key != 0: object_instance = self.get_object(object_class, key) - try: - self.session.delete(object_instance) - self.session.commit() - self.is_dirty = True - return True - except OperationalError: - # This exception clause is for users running MySQL which likes - # to terminate connections on its own without telling anyone. - # See bug #927473 - log.exception(u'Probably a MySQL issue, "MySQL has gone away"') - self.session.rollback() - self.session.delete(object_instance) - self.session.commit() - self.is_dirty = True - return True - except InvalidRequestError: - self.session.rollback() - log.exception(u'Failed to delete object') - return False + for try_count in range(3): + try: + self.session.delete(object_instance) + self.session.commit() + self.is_dirty = True + return True + except OperationalError: + # This exception clause is for users running MySQL which likes + # to terminate connections on its own without telling anyone. + # See bug #927473 + # However, other dbms can raise it, usually in a non-recoverable + # way. So we only retry 3 times. + log.exception(u'Probably a MySQL issue, "MySQL has gone away"') + self.session.rollback() + if try_count >= 2: + raise + except InvalidRequestError: + self.session.rollback() + log.exception(u'Failed to delete object') + return False + except: + self.session.rollback() + raise else: return True @@ -439,31 +463,32 @@ The filter governing selection of objects to return. Defaults to None. """ - try: - query = self.session.query(object_class) - if filter_clause is not None: - query = query.filter(filter_clause) - query.delete(synchronize_session=False) - self.session.commit() - self.is_dirty = True - return True - except OperationalError: - # This exception clause is for users running MySQL which likes - # to terminate connections on its own without telling anyone. - # See bug #927473 - log.exception(u'Probably a MySQL issue, "MySQL has gone away"') - self.session.rollback() - query = self.session.query(object_class) - if filter_clause is not None: - query = query.filter(filter_clause) - query.delete(synchronize_session=False) - self.session.commit() - self.is_dirty = True - return True - except InvalidRequestError: - self.session.rollback() - log.exception(u'Failed to delete %s records', object_class.__name__) - return False + for try_count in range(3): + try: + query = self.session.query(object_class) + if filter_clause is not None: + query = query.filter(filter_clause) + query.delete(synchronize_session=False) + self.session.commit() + self.is_dirty = True + return True + except OperationalError: + # This exception clause is for users running MySQL which likes + # to terminate connections on its own without telling anyone. + # See bug #927473 + # However, other dbms can raise it, usually in a non-recoverable + # way. So we only retry 3 times. + log.exception(u'Probably a MySQL issue, "MySQL has gone away"') + self.session.rollback() + if try_count >= 2: + raise + except InvalidRequestError: + self.session.rollback() + log.exception(u'Failed to delete %s records', object_class.__name__) + return False + except: + self.session.rollback() + raise def finalise(self): """ diff -Nru openlp-1.9.9/openlp/core/lib/dockwidget.py openlp-1.9.10/openlp/core/lib/dockwidget.py --- openlp-1.9.9/openlp/core/lib/dockwidget.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/dockwidget.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -52,9 +53,8 @@ if icon: self.setWindowIcon(build_icon(icon)) # Sort out the minimum width. - screens = ScreenList.get_instance() - screen_width = screens.current[u'size'].width() - mainwindow_docbars = screen_width / 5 + screens = ScreenList() + mainwindow_docbars = screens.current[u'size'].width() / 5 if mainwindow_docbars > 300: self.setMinimumWidth(300) else: diff -Nru openlp-1.9.9/openlp/core/lib/eventreceiver.py openlp-1.9.10/openlp/core/lib/eventreceiver.py --- openlp-1.9.9/openlp/core/lib/eventreceiver.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/eventreceiver.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -111,7 +112,7 @@ ``slidecontroller_live_spin_delay`` Pushes out the loop delay. - + ``slidecontroller_update_slide_limits`` Updates the slide_limits variable from the saved settings. @@ -268,7 +269,7 @@ <> )`` """ - eventreceiver = EventReceiver() + __eventreceiver__ = EventReceiver() @staticmethod def send_message(event, msg=None): @@ -281,11 +282,11 @@ ``msg`` Defaults to *None*. The message to send with the event. """ - Receiver.eventreceiver.send_message(event, msg) + Receiver.__eventreceiver__.send_message(event, msg) @staticmethod def get_receiver(): """ - Get the global ``eventreceiver`` instance. + Get the global ``__eventreceiver__`` instance. """ - return Receiver.eventreceiver + return Receiver.__eventreceiver__ diff -Nru openlp-1.9.9/openlp/core/lib/formattingtags.py openlp-1.9.10/openlp/core/lib/formattingtags.py --- openlp-1.9.9/openlp/core/lib/formattingtags.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/formattingtags.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -32,6 +33,7 @@ from PyQt4 import QtCore from openlp.core.lib import translate +from openlp.core.lib.settings import Settings class FormattingTags(object): @@ -46,14 +48,36 @@ """ Provide access to the html_expands list. """ - # Load user defined tags otherwise user defined tags are not present. - FormattingTags.load_tags() return FormattingTags.html_expands @staticmethod - def reset_html_tags(): + def save_html_tags(): + """ + Saves all formatting tags except protected ones. + """ + tags = [] + for tag in FormattingTags.html_expands: + if not tag[u'protected'] and not tag.get(u'temporary'): + # Using dict ensures that copy is made and encoding of values + # a little later does not affect tags in the original list + tags.append(dict(tag)) + tag = tags[-1] + # Remove key 'temporary' from tags. + # It is not needed to be saved. + if u'temporary' in tag: + del tag[u'temporary'] + for element in tag: + if isinstance(tag[element], unicode): + tag[element] = tag[element].encode('utf8') + # Formatting Tags were also known as display tags. + Settings().setValue(u'displayTags/html_tags', + QtCore.QVariant(cPickle.dumps(tags) if tags else u'')) + + @staticmethod + def load_tags(): """ - Resets the html_expands list. + Load the Tags from store so can be used in the system or used to + update the display. """ temporary_tags = [tag for tag in FormattingTags.html_expands if tag.get(u'temporary')] @@ -141,40 +165,8 @@ FormattingTags.add_html_tags(base_tags) FormattingTags.add_html_tags(temporary_tags) - @staticmethod - def save_html_tags(): - """ - Saves all formatting tags except protected ones. - """ - tags = [] - for tag in FormattingTags.html_expands: - if not tag[u'protected'] and not tag.get(u'temporary'): - # Using dict ensures that copy is made and encoding of values - # a little later does not affect tags in the original list - tags.append(dict(tag)) - tag = tags[-1] - # Remove key 'temporary' from tags. - # It is not needed to be saved. - if u'temporary' in tag: - del tag[u'temporary'] - for element in tag: - if isinstance(tag[element], unicode): - tag[element] = tag[element].encode('utf8') - # Formatting Tags were also known as display tags. - QtCore.QSettings().setValue(u'displayTags/html_tags', - QtCore.QVariant(cPickle.dumps(tags) if tags else u'')) - - @staticmethod - def load_tags(): - """ - Load the Tags from store so can be used in the system or used to - update the display. If Cancel was selected this is needed to reset the - dsiplay to the correct version. - """ - # Initial Load of the Tags - FormattingTags.reset_html_tags() # Formatting Tags were also known as display tags. - user_expands = QtCore.QSettings().value(u'displayTags/html_tags', + user_expands = Settings().value(u'displayTags/html_tags', QtCore.QVariant(u'')).toString() # cPickle only accepts str not unicode strings user_expands_string = str(user_expands) @@ -188,17 +180,13 @@ FormattingTags.add_html_tags(user_tags) @staticmethod - def add_html_tags(tags, save=False): + def add_html_tags(tags): """ Add a list of tags to the list. ``tags`` The list with tags to add. - ``save`` - Defaults to ``False``. If set to ``True`` the given ``tags`` are - saved to the config. - Each **tag** has to be a ``dict`` and should have the following keys: * desc @@ -226,8 +214,6 @@ displaying text containing the tag. It has to be a ``boolean``. """ FormattingTags.html_expands.extend(tags) - if save: - FormattingTags.save_html_tags() @staticmethod def remove_html_tag(tag_id): diff -Nru openlp-1.9.9/openlp/core/lib/htmlbuilder.py openlp-1.9.10/openlp/core/lib/htmlbuilder.py --- openlp-1.9.9/openlp/core/lib/htmlbuilder.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/htmlbuilder.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -45,7 +46,7 @@ padding: 0; border: 0; overflow: hidden; - -webkit-user-select: none; + -webkit-user-select: none; } body { %s; diff -Nru openlp-1.9.9/openlp/core/lib/imagemanager.py openlp-1.9.10/openlp/core/lib/imagemanager.py --- openlp-1.9.9/openlp/core/lib/imagemanager.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/imagemanager.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -100,6 +101,7 @@ variables ``image`` and ``image_bytes`` to ``None`` and add the image object to the queue of images to process. """ + secondary_priority = 0 def __init__(self, name, path, source, background): self.name = name self.path = path @@ -108,25 +110,40 @@ self.priority = Priority.Normal self.source = source self.background = background + self.secondary_priority = Image.secondary_priority + Image.secondary_priority += 1 class PriorityQueue(Queue.PriorityQueue): """ Customised ``Queue.PriorityQueue``. + + Each item in the queue must be tuple with three values. The first value + is the :class:`Image`'s ``priority`` attribute, the second value + the :class:`Image`'s ``secondary_priority`` attribute. The last value the + :class:`Image` instance itself:: + + (image.priority, image.secondary_priority, image) + + Doing this, the :class:`Queue.PriorityQueue` will sort the images according + to their priorities, but also according to there number. However, the number + only has an impact on the result if there are more images with the same + priority. In such case the image which has been added earlier is privileged. """ def modify_priority(self, image, new_priority): """ Modifies the priority of the given ``image``. ``image`` - The image to remove. This should be an ``Image`` instance. + The image to remove. This should be an :class:`Image` instance. ``new_priority`` - The image's new priority. + The image's new priority. See the :class:`Priority` class for + priorities. """ self.remove(image) image.priority = new_priority - self.put((image.priority, image)) + self.put((image.priority, image.secondary_priority, image)) def remove(self, image): """ @@ -135,8 +152,8 @@ ``image`` The image to remove. This should be an ``Image`` instance. """ - if (image.priority, image) in self.queue: - self.queue.remove((image.priority, image)) + if (image.priority, image.secondary_priority, image) in self.queue: + self.queue.remove((image.priority, image.secondary_priority, image)) class ImageManager(QtCore.QObject): @@ -147,142 +164,144 @@ def __init__(self): QtCore.QObject.__init__(self) - current_screen = ScreenList.get_instance().current - self.width = current_screen[u'size'].width() - self.height = current_screen[u'size'].height() + currentScreen = ScreenList().current + self.width = currentScreen[u'size'].width() + self.height = currentScreen[u'size'].height() self._cache = {} - self._imageThread = ImageThread(self) - self._conversion_queue = PriorityQueue() + self.imageThread = ImageThread(self) + self._conversionQueue = PriorityQueue() + self.stopManager = False QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'config_updated'), self.process_updates) + QtCore.SIGNAL(u'config_updated'), self.processUpdates) - def update_display(self): + def updateDisplay(self): """ Screen has changed size so rebuild the cache to new size. """ - log.debug(u'update_display') - current_screen = ScreenList.get_instance().current - self.width = current_screen[u'size'].width() - self.height = current_screen[u'size'].height() + log.debug(u'updateDisplay') + currentScreen = ScreenList().current + self.width = currentScreen[u'size'].width() + self.height = currentScreen[u'size'].height() # Mark the images as dirty for a rebuild by setting the image and byte # stream to None. for image in self._cache.values(): - self._reset_image(image) + self._resetImage(image) - def update_images(self, image_type, background): + def updateImages(self, imageType, background): """ Border has changed so update all the images affected. """ - log.debug(u'update_images') + log.debug(u'updateImages') # Mark the images as dirty for a rebuild by setting the image and byte # stream to None. for image in self._cache.values(): - if image.source == image_type: + if image.source == imageType: image.background = background - self._reset_image(image) + self._resetImage(image) - def update_image(self, name, image_type, background): + def updateImage(self, name, imageType, background): """ Border has changed so update the image affected. """ - log.debug(u'update_images') + log.debug(u'updateImage') # Mark the images as dirty for a rebuild by setting the image and byte # stream to None. for image in self._cache.values(): - if image.source == image_type and image.name == name: + if image.source == imageType and image.name == name: image.background = background - self._reset_image(image) + self._resetImage(image) - def _reset_image(self, image): + def _resetImage(self, image): image.image = None image.image_bytes = None - self._conversion_queue.modify_priority(image, Priority.Normal) + self._conversionQueue.modify_priority(image, Priority.Normal) - def process_updates(self): + def processUpdates(self): """ Flush the queue to updated any data to update """ # We want only one thread. - if not self._imageThread.isRunning(): - self._imageThread.start() + if not self.imageThread.isRunning(): + self.imageThread.start() - def get_image(self, name): + def getImage(self, name): """ Return the ``QImage`` from the cache. If not present wait for the background thread to process it. """ - log.debug(u'get_image %s' % name) + log.debug(u'getImage %s' % name) image = self._cache[name] if image.image is None: - self._conversion_queue.modify_priority(image, Priority.High) + self._conversionQueue.modify_priority(image, Priority.High) # make sure we are running and if not give it a kick - self.process_updates() + self.processUpdates() while image.image is None: - log.debug(u'get_image - waiting') + log.debug(u'getImage - waiting') time.sleep(0.1) elif image.image_bytes is None: # Set the priority to Low, because the image was requested but the # byte stream was not generated yet. However, we only need to do # this, when the image was generated before it was requested # (otherwise this is already taken care of). - self._conversion_queue.modify_priority(image, Priority.Low) + self._conversionQueue.modify_priority(image, Priority.Low) return image.image - def get_image_bytes(self, name): + def getImageBytes(self, name): """ Returns the byte string for an image. If not present wait for the background thread to process it. """ - log.debug(u'get_image_bytes %s' % name) + log.debug(u'getImageBytes %s' % name) image = self._cache[name] if image.image_bytes is None: - self._conversion_queue.modify_priority(image, Priority.Urgent) + self._conversionQueue.modify_priority(image, Priority.Urgent) # make sure we are running and if not give it a kick - self.process_updates() + self.processUpdates() while image.image_bytes is None: - log.debug(u'get_image_bytes - waiting') + log.debug(u'getImageBytes - waiting') time.sleep(0.1) return image.image_bytes - def del_image(self, name): + def deleteImage(self, name): """ Delete the Image from the cache. """ - log.debug(u'del_image %s' % name) + log.debug(u'deleteImage %s' % name) if name in self._cache: - self._conversion_queue.remove(self._cache[name]) + self._conversionQueue.remove(self._cache[name]) del self._cache[name] - def add_image(self, name, path, source, background): + def addImage(self, name, path, source, background): """ Add image to cache if it is not already there. """ - log.debug(u'add_image %s:%s' % (name, path)) + log.debug(u'addImage %s:%s' % (name, path)) if not name in self._cache: image = Image(name, path, source, background) self._cache[name] = image - self._conversion_queue.put((image.priority, image)) + self._conversionQueue.put( + (image.priority, image.secondary_priority, image)) else: log.debug(u'Image in cache %s:%s' % (name, path)) # We want only one thread. - if not self._imageThread.isRunning(): - self._imageThread.start() + if not self.imageThread.isRunning(): + self.imageThread.start() def _process(self): """ Controls the processing called from a ``QtCore.QThread``. """ log.debug(u'_process - started') - while not self._conversion_queue.empty(): - self._process_cache() + while not self._conversionQueue.empty() and not self.stopManager: + self._processCache() log.debug(u'_process - ended') - def _process_cache(self): + def _processCache(self): """ Actually does the work. """ - log.debug(u'_process_cache') - image = self._conversion_queue.get()[1] + log.debug(u'_processCache') + image = self._conversionQueue.get()[2] # Generate the QImage for the image. if image.image is None: image.image = resize_image(image.path, self.width, self.height, @@ -290,14 +309,14 @@ # Set the priority to Lowest and stop here as we need to process # more important images first. if image.priority == Priority.Normal: - self._conversion_queue.modify_priority(image, Priority.Lowest) + self._conversionQueue.modify_priority(image, Priority.Lowest) return # For image with high priority we set the priority to Low, as the # byte stream might be needed earlier the byte stream of image with # Normal priority. We stop here as we need to process more important # images first. elif image.priority == Priority.High: - self._conversion_queue.modify_priority(image, Priority.Low) + self._conversionQueue.modify_priority(image, Priority.Low) return # Generate the byte stream for the image. if image.image_bytes is None: diff -Nru openlp-1.9.9/openlp/core/lib/__init__.py openlp-1.9.10/openlp/core/lib/__init__.py --- openlp-1.9.9/openlp/core/lib/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -29,8 +30,7 @@ OpenLP work. """ import logging -import os.path -import types +import os from PyQt4 import QtCore, QtGui, Qt @@ -63,6 +63,7 @@ PreviousLastSlide = 2 Next = 3 + def translate(context, text, comment=None, encoding=QtCore.QCoreApplication.CodecForTr, n=-1, translate=QtCore.QCoreApplication.translate): @@ -84,6 +85,7 @@ """ return translate(context, text, comment, encoding, n) + def get_text_file_string(text_file): """ Open a file and return its content as unicode string. If the supplied file @@ -112,6 +114,7 @@ file_handle.close() return content_string + def str_to_bool(stringvalue): """ Convert a string version of a boolean into a real boolean. @@ -123,6 +126,7 @@ return stringvalue return unicode(stringvalue).strip().lower() in (u'true', u'yes', u'y') + def build_icon(icon): """ Build a QIcon instance from an existing QIcon, a resource location, or a @@ -149,6 +153,7 @@ QtGui.QIcon.Normal, QtGui.QIcon.Off) return button_icon + def image_to_byte(image): """ Resize an image to fit on the current screen for the web and returns @@ -167,6 +172,7 @@ # convert to base64 encoding so does not get missed! return byte_array.toBase64() + def create_thumb(image_path, thumb_path, return_icon=True, size=None): """ Create a thumbnail from the given image path and depending on @@ -202,6 +208,7 @@ # Fallback for files with animation support. return build_icon(unicode(image_path)) + def validate_thumb(file_path, thumb_path): """ Validates whether an file's thumb still exists and if is up to date. @@ -220,6 +227,7 @@ thumb_date = os.stat(thumb_path).st_mtime return image_date <= thumb_date + def resize_image(image_path, width, height, background=u'#000000'): """ Resize an image to fit on the current screen. @@ -267,6 +275,7 @@ painter.drawImage((width - realw) / 2, (height - realh) / 2, preview) return new_image + def check_item_selected(list_widget, message): """ Check if a list item is selected so an action may be performed on it @@ -283,6 +292,7 @@ return False return True + def clean_tags(text): """ Remove Tags from text for display @@ -295,6 +305,7 @@ text = text.replace(tag[u'end tag'], u'') return text + def expand_tags(text): """ Expand tags HTML for display @@ -304,6 +315,7 @@ text = text.replace(tag[u'end tag'], tag[u'end html']) return text + def check_directory_exists(dir): """ Check a theme directory exists and if not create it @@ -318,6 +330,7 @@ except IOError: pass + def create_separated_list(stringlist): """ Returns a string that represents a join of a list of strings with a @@ -346,6 +359,7 @@ return unicode(translate('OpenLP.core.lib', '%1, %2', u'Locale list separator: start').arg(stringlist[0], merged)) + from eventreceiver import Receiver from listwidgetwithdnd import ListWidgetWithDnD from formattingtags import FormattingTags diff -Nru openlp-1.9.9/openlp/core/lib/listwidgetwithdnd.py openlp-1.9.10/openlp/core/lib/listwidgetwithdnd.py --- openlp-1.9.9/openlp/core/lib/listwidgetwithdnd.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/listwidgetwithdnd.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -27,7 +28,7 @@ """ Extend QListWidget to handle drag and drop functionality """ -import os.path +import os from PyQt4 import QtCore, QtGui diff -Nru openlp-1.9.9/openlp/core/lib/mediamanageritem.py openlp-1.9.10/openlp/core/lib/mediamanageritem.py --- openlp-1.9.9/openlp/core/lib/mediamanageritem.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/mediamanageritem.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -38,6 +39,7 @@ from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings, create_widget_action, \ critical_error_message_box +from openlp.core.lib.settings import Settings log = logging.getLogger(__name__) @@ -260,7 +262,7 @@ self.menu.addActions(self.listView.actions()) QtCore.QObject.connect(self.listView, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), - self.onClickPressed) + self.onDoubleClicked) QtCore.QObject.connect(self.listView, QtCore.SIGNAL(u'itemSelectionChanged()'), self.onSelectionChange) @@ -295,9 +297,9 @@ self.pageLayout.addWidget(self.searchWidget) # Signals and slots QtCore.QObject.connect(self.searchTextEdit, - QtCore.SIGNAL(u'returnPressed()'), self.onSearchTextButtonClick) + QtCore.SIGNAL(u'returnPressed()'), self.onSearchTextButtonClicked) QtCore.QObject.connect(self.searchTextButton, - QtCore.SIGNAL(u'pressed()'), self.onSearchTextButtonClick) + QtCore.SIGNAL(u'clicked()'), self.onSearchTextButtonClicked) QtCore.QObject.connect(self.searchTextEdit, QtCore.SIGNAL(u'textChanged(const QString&)'), self.onSearchTextEditChanged) @@ -348,8 +350,9 @@ can run it. ``files`` - The list of files to be loaded + The list of files to be loaded """ + #FIXME: change local variables to words_separated_by_underscores. newFiles = [] errorShown = False for file in files: @@ -365,7 +368,7 @@ errorShown = True else: newFiles.append(file) - if file: + if files: self.validateAndLoad(newFiles) def validateAndLoad(self, files): @@ -373,12 +376,13 @@ Process a list for files either from the File Dialog or from Drag and Drop - ``files`` - The files to be loaded + ``files`` + The files to be loaded. """ + #FIXME: change local variables to words_separated_by_underscores. names = [] fullList = [] - for count in range(0, self.listView.count()): + for count in range(self.listView.count()): names.append(unicode(self.listView.item(count).text())) fullList.append(unicode(self.listView.item(count). data(QtCore.Qt.UserRole).toString())) @@ -458,11 +462,11 @@ raise NotImplementedError(u'MediaManagerItem.generateSlideData needs ' u'to be defined by the plugin') - def onClickPressed(self): + def onDoubleClicked(self): """ Allows the list click action to be determined dynamically """ - if QtCore.QSettings().value(u'advanced/double click live', + if Settings().value(u'advanced/double click live', QtCore.QVariant(False)).toBool(): self.onLiveClick() else: @@ -472,7 +476,7 @@ """ Allows the change of current item in the list to be actioned """ - if QtCore.QSettings().value(u'advanced/single click preview', + if Settings().value(u'advanced/single click preview', QtCore.QVariant(False)).toBool() and self.quickPreviewAllowed \ and self.listView.selectedIndexes() \ and self.autoSelectId == -1: @@ -582,7 +586,7 @@ Common method for generating a service item """ serviceItem = ServiceItem(self.plugin) - serviceItem.add_icon(self.plugin.icon_path) + serviceItem.add_icon(self.plugin.iconPath) if self.generateSlideData(serviceItem, item, xmlVersion, remote): return serviceItem else: diff -Nru openlp-1.9.9/openlp/core/lib/mediaplayer.py openlp-1.9.10/openlp/core/lib/mediaplayer.py --- openlp-1.9.9/openlp/core/lib/mediaplayer.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/mediaplayer.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -29,7 +30,7 @@ class MediaPlayer(object): """ - This is the base class media Player class to provide OpenLP with a pluggable media display + This is the base class media Player class to provide OpenLP with a pluggable media display framework. """ @@ -65,7 +66,7 @@ def resize(self, display): """ - If the main display size or position is changed, the media widgets + If the main display size or position is changed, the media widgets should also resized """ pass diff -Nru openlp-1.9.9/openlp/core/lib/pluginmanager.py openlp-1.9.10/openlp/core/lib/pluginmanager.py --- openlp-1.9.9/openlp/core/lib/pluginmanager.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/pluginmanager.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -41,13 +42,13 @@ and executes all the hooks, as and when necessary. """ log.info(u'Plugin manager loaded') - + __instance__ = None @staticmethod def get_instance(): """ Obtain a single instance of class. """ - return PluginManager.instance + return PluginManager.__instance__ def __init__(self, plugin_dir): """ @@ -58,7 +59,7 @@ The directory to search for plugins. """ log.info(u'Plugin manager Initialising') - PluginManager.instance = self + PluginManager.__instance__ = self if not plugin_dir in sys.path: log.debug(u'Inserting %s into sys.path', plugin_dir) sys.path.insert(0, plugin_dir) diff -Nru openlp-1.9.9/openlp/core/lib/plugin.py openlp-1.9.10/openlp/core/lib/plugin.py --- openlp-1.9.9/openlp/core/lib/plugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/plugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -32,6 +33,7 @@ from PyQt4 import QtCore from openlp.core.lib import Receiver +from openlp.core.lib.settings import Settings from openlp.core.lib.ui import UiStrings from openlp.core.utils import get_application_version @@ -155,9 +157,9 @@ self.version = get_application_version()[u'version'] self.settingsSection = self.name self.icon = None - self.media_item_class = media_item_class - self.settings_tab_class = settings_tab_class - self.settings_tab = None + self.mediaItemClass = media_item_class + self.settingsTabClass = settings_tab_class + self.settingsTab = None self.mediaItem = None self.weight = 0 self.status = PluginStatus.Inactive @@ -166,9 +168,9 @@ self.renderer = plugin_helpers[u'renderer'] self.serviceManager = plugin_helpers[u'service'] self.settingsForm = plugin_helpers[u'settings form'] - self.mediadock = plugin_helpers[u'toolbox'] + self.mediaDock = plugin_helpers[u'toolbox'] self.pluginManager = plugin_helpers[u'pluginmanager'] - self.formparent = plugin_helpers[u'formparent'] + self.formParent = plugin_helpers[u'formparent'] self.mediaController = plugin_helpers[u'mediacontroller'] QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'%s_add_service_item' % self.name), @@ -190,7 +192,7 @@ """ Sets the status of the plugin """ - self.status = QtCore.QSettings().value( + self.status = Settings().value( self.settingsSection + u'/status', QtCore.QVariant(PluginStatus.Inactive)).toInt()[0] @@ -199,7 +201,7 @@ Changes the status of the plugin and remembers it """ self.status = new_status - QtCore.QSettings().setValue( + Settings().setValue( self.settingsSection + u'/status', QtCore.QVariant(self.status)) if new_status == PluginStatus.Active: self.initialise() @@ -219,8 +221,8 @@ Construct a MediaManagerItem object with all the buttons and things you need, and return it for integration into OpenLP. """ - if self.media_item_class: - self.mediaItem = self.media_item_class(self.mediadock.media_dock, + if self.mediaItemClass: + self.mediaItem = self.mediaItemClass(self.mediaDock.media_dock, self, self.icon) def addImportMenuItem(self, importMenu): @@ -255,10 +257,10 @@ Create a tab for the settings window to display the configurable options for this plugin to the user. """ - if self.settings_tab_class: - self.settings_tab = self.settings_tab_class(parent, self.name, + if self.settingsTabClass: + self.settingsTab = self.settingsTabClass(parent, self.name, self.getString(StringContent.VisibleName)[u'title'], - self.icon_path) + self.iconPath) def addToMenu(self, menubar): """ @@ -294,14 +296,14 @@ """ if self.mediaItem: self.mediaItem.initialise() - self.mediadock.insert_dock(self.mediaItem, self.icon, self.weight) + self.mediaDock.insert_dock(self.mediaItem, self.icon, self.weight) def finalise(self): """ Called by the plugin Manager to cleanup things. """ if self.mediaItem: - self.mediadock.remove_dock(self.mediaItem) + self.mediaDock.remove_dock(self.mediaItem) def appStartup(self): """ diff -Nru openlp-1.9.9/openlp/core/lib/renderer.py openlp-1.9.10/openlp/core/lib/renderer.py --- openlp-1.9.9/openlp/core/lib/renderer.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/renderer.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -55,29 +56,32 @@ """ log.info(u'Renderer Loaded') - def __init__(self, imageManager, themeManager): + def __init__(self, image_manager, theme_manager): """ Initialise the renderer. - ``imageManager`` - A imageManager instance which takes care of e. g. caching and resizing - images. + ``image_manager`` + A image_manager instance which takes care of e. g. caching and + resizing images. - ``themeManager`` - The themeManager instance, used to get the current theme details. + ``theme_manager`` + The theme_manager instance, used to get the current theme details. """ log.debug(u'Initialisation started') - self.themeManager = themeManager - self.imageManager = imageManager - self.screens = ScreenList.get_instance() - self.service_theme = u'' - self.theme_level = u'' - self.override_background = None - self.theme_data = None - self.bg_frame = None + self.theme_manager = theme_manager + self.image_manager = image_manager + self.screens = ScreenList() + self.theme_level = ThemeLevel.Global + self.global_theme_name = u'' + self.service_theme_name = u'' + self.item_theme_name = u'' self.force_page = False - self.display = MainDisplay(None, self.imageManager, False, self) + self.display = MainDisplay(None, self.image_manager, False, self) self.display.setup() + self._theme_dimensions = {} + self._calculate_default() + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'theme_update_global'), self.set_global_theme) def update_display(self): """ @@ -87,89 +91,132 @@ self._calculate_default() if self.display: self.display.close() - self.display = MainDisplay(None, self.imageManager, False, self) + self.display = MainDisplay(None, self.image_manager, False, self) self.display.setup() - self.bg_frame = None - self.theme_data = None + self._theme_dimensions = {} + + def update_theme(self, theme_name, old_theme_name=None, only_delete=False): + """ + This method updates the theme in ``_theme_dimensions`` when a theme + has been edited or renamed. + + ``theme_name`` + The current theme name. + + ``old_theme_name`` + The old theme name. Has only to be passed, when the theme has been + renamed. Defaults to *None*. + + ``only_delete`` + Only remove the given ``theme_name`` from the ``_theme_dimensions`` + list. This can be used when a theme is permanently deleted. + """ + if old_theme_name is not None and \ + old_theme_name in self._theme_dimensions: + del self._theme_dimensions[old_theme_name] + if theme_name in self._theme_dimensions: + del self._theme_dimensions[theme_name] + if not only_delete: + self._set_theme(theme_name) + + def _set_theme(self, theme_name): + """ + Helper method to save theme names and theme data. - def set_global_theme(self, global_theme, theme_level=ThemeLevel.Global): + ``theme_name`` + The theme name. """ - Set the global-level theme and the theme level. + if theme_name not in self._theme_dimensions: + theme_data = self.theme_manager.getThemeData(theme_name) + main_rect = self.get_main_rectangle(theme_data) + footer_rect = self.get_footer_rectangle(theme_data) + self._theme_dimensions[theme_name] = \ + [theme_data, main_rect, footer_rect] + else: + theme_data, main_rect, footer_rect = \ + self._theme_dimensions[theme_name] + # if No file do not update cache + if theme_data.background_filename: + self.image_manager.addImage(theme_data.theme_name, + theme_data.background_filename, u'theme', + QtGui.QColor(theme_data.background_border_color)) + + def pre_render(self, override_theme_data=None): + """ + Set up the theme to be used before rendering an item. + + ``override_theme_data`` + The theme data should be passed, when we want to use our own theme + data, regardless of the theme level. This should for example be used + in the theme manager. **Note**, this is **not** to be mixed up with + the ``set_item_theme`` method. + """ + # Just assume we use the global theme. + theme_to_use = self.global_theme_name + # The theme level is either set to Service or Item. Use the service + # theme if one is set. We also have to use the service theme, even when + # the theme level is set to Item, because the item does not necessarily + # have to have a theme. + if self.theme_level != ThemeLevel.Global: + # When the theme level is at Service and we actually have a service + # theme then use it. + if self.service_theme_name: + theme_to_use = self.service_theme_name + # If we have Item level and have an item theme then use it. + if self.theme_level == ThemeLevel.Song and self.item_theme_name: + theme_to_use = self.item_theme_name + if override_theme_data is None: + if theme_to_use not in self._theme_dimensions: + self._set_theme(theme_to_use) + theme_data, main_rect, footer_rect = \ + self._theme_dimensions[theme_to_use] + else: + # Ignore everything and use own theme data. + theme_data = override_theme_data + main_rect = self.get_main_rectangle(override_theme_data) + footer_rect = self.get_footer_rectangle(override_theme_data) + self._set_text_rectangle(theme_data, main_rect, footer_rect) + return theme_data, self._rect, self._rect_footer - ``global_theme`` - The global-level theme to be set. + def set_theme_level(self, theme_level): + """ + Sets the theme level. ``theme_level`` - Defaults to ``ThemeLevel.Global``. The theme level, can be - ``ThemeLevel.Global``, ``ThemeLevel.Service`` or - ``ThemeLevel.Song``. + The theme level to be used. """ - self.global_theme = global_theme self.theme_level = theme_level - self.global_theme_data = \ - self.themeManager.getThemeData(self.global_theme) - self.theme_data = None - def set_service_theme(self, service_theme): + def set_global_theme(self, global_theme_name): + """ + Set the global-level theme name. + + ``global_theme_name`` + The global-level theme's name. + """ + self._set_theme(global_theme_name) + self.global_theme_name = global_theme_name + + def set_service_theme(self, service_theme_name): """ Set the service-level theme. - ``service_theme`` - The service-level theme to be set. + ``service_theme_name`` + The service level theme's name. """ - self.service_theme = service_theme - self.theme_data = None + self._set_theme(service_theme_name) + self.service_theme_name = service_theme_name - def set_override_theme(self, override_theme, override_levels=False): + def set_item_theme(self, item_theme_name): """ - Set the appropriate theme depending on the theme level. - Called by the service item when building a display frame - - ``theme`` - The name of the song-level theme. None means the service - item wants to use the given value. - - ``override_levels`` - Used to force the theme data passed in to be used. - - """ - log.debug(u'set override theme to %s', override_theme) - theme_level = self.theme_level - if override_levels: - theme_level = ThemeLevel.Song - if theme_level == ThemeLevel.Global: - theme = self.global_theme - elif theme_level == ThemeLevel.Service: - if self.service_theme == u'': - theme = self.global_theme - else: - theme = self.service_theme - else: - # Images have a theme of -1 - if override_theme and override_theme != -1: - theme = override_theme - elif theme_level == ThemeLevel.Song or \ - theme_level == ThemeLevel.Service: - if self.service_theme == u'': - theme = self.global_theme - else: - theme = self.service_theme - else: - theme = self.global_theme - log.debug(u'theme is now %s', theme) - # Force the theme to be the one passed in. - if override_levels: - self.theme_data = override_theme - else: - self.theme_data = self.themeManager.getThemeData(theme) - self._calculate_default() - self._build_text_rectangle(self.theme_data) - # if No file do not update cache - if self.theme_data.background_filename: - self.imageManager.add_image(self.theme_data.theme_name, - self.theme_data.background_filename, u'theme', - QtGui.QColor(self.theme_data.background_border_color)) - return self._rect, self._rect_footer + Set the item-level theme. **Note**, this has to be done for each item we + are rendering. + + ``item_theme_name`` + The item theme's name. + """ + self._set_theme(item_theme_name) + self.item_theme_name = item_theme_name def generate_preview(self, theme_data, force_page=False): """ @@ -184,27 +231,31 @@ log.debug(u'generate preview') # save value for use in format_slide self.force_page = force_page - # set the default image size for previews - self._calculate_default() # build a service item to generate preview serviceItem = ServiceItem() - serviceItem.theme = theme_data if self.force_page: # make big page for theme edit dialog to get line count - serviceItem.add_from_text(u'', VERSE_FOR_LINE_COUNT) + serviceItem.add_from_text(VERSE_FOR_LINE_COUNT) else: - self.imageManager.del_image(theme_data.theme_name) - serviceItem.add_from_text(u'', VERSE) + self.image_manager.deleteImage(theme_data.theme_name) + serviceItem.add_from_text(VERSE) serviceItem.renderer = self serviceItem.raw_footer = FOOTER + # if No file do not update cache + if theme_data.background_filename: + self.image_manager.addImage(theme_data.theme_name, + theme_data.background_filename, u'theme', + QtGui.QColor(theme_data.background_border_color)) + theme_data, main, footer = self.pre_render(theme_data) + serviceItem.themedata = theme_data + serviceItem.main = main + serviceItem.footer = footer serviceItem.render(True) if not self.force_page: self.display.buildHtml(serviceItem) raw_html = serviceItem.get_rendered_frame(0) self.display.text(raw_html) preview = self.display.preview() - # Reset the real screen size for subsequent render requests - self._calculate_default() return preview self.force_page = False @@ -236,26 +287,30 @@ # the first two slides (and neglect the last for now). if len(slides) == 3: html_text = expand_tags(u'\n'.join(slides[:2])) - # We check both slides to determine if the virtual break is - # needed (there is only one virtual break). + # We check both slides to determine if the optional split is + # needed (there is only one optional split). else: html_text = expand_tags(u'\n'.join(slides)) html_text = html_text.replace(u'\n', u'
') if self._text_fits_on_slide(html_text): - # The first two virtual slides fit (as a whole) on one + # The first two optional slides fit (as a whole) on one # slide. Replace the first occurrence of [---]. text = text.replace(u'\n[---]', u'', 1) else: - # The first virtual slide fits, which means we have to - # render the first virtual slide. - text_contains_break = u'[---]' in text - if text_contains_break: + # The first optional slide fits, which means we have to + # render the first optional slide. + text_contains_split = u'[---]' in text + if text_contains_split: try: text_to_render, text = \ text.split(u'\n[---]\n', 1) - except: + except ValueError: text_to_render = text.split(u'\n[---]\n')[0] text = u'' + text_to_render, raw_tags, html_tags = \ + self._get_start_tags(text_to_render) + if text: + text = raw_tags + text else: text_to_render = text text = u'' @@ -264,7 +319,7 @@ if len(slides) > 1 and text: # Add all slides apart from the last one the list. pages.extend(slides[:-1]) - if text_contains_break: + if text_contains_split: text = slides[-1] + u'\n[---]\n' + text else: text = slides[-1] + u'\n'+ text @@ -300,52 +355,41 @@ # 90% is start of footer self.footer_start = int(self.height * 0.90) - def _build_text_rectangle(self, theme): - """ - Builds a text block using the settings in ``theme`` - and the size of the display screen.height. - Note the system has a 10 pixel border round the screen - - ``theme`` - The theme to build a text block for. - """ - log.debug(u'_build_text_rectangle') - main_rect = self.get_main_rectangle(theme) - footer_rect = self.get_footer_rectangle(theme) - self._set_text_rectangle(main_rect, footer_rect) - - def get_main_rectangle(self, theme): + def get_main_rectangle(self, theme_data): """ Calculates the placement and size of the main rectangle. - ``theme`` + ``theme_data`` The theme information """ - if not theme.font_main_override: - return QtCore.QRect(10, 0, self.width - 20, self.footer_start) + if not theme_data.font_main_override: + return QtCore.QRect(10, 0, self.width, self.footer_start) else: - return QtCore.QRect(theme.font_main_x, theme.font_main_y, - theme.font_main_width - 1, theme.font_main_height - 1) + return QtCore.QRect(theme_data.font_main_x, theme_data.font_main_y, + theme_data.font_main_width - 1, theme_data.font_main_height - 1) - def get_footer_rectangle(self, theme): + def get_footer_rectangle(self, theme_data): """ Calculates the placement and size of the footer rectangle. - ``theme`` - The theme information + ``theme_data`` + The theme data. """ - if not theme.font_footer_override: + if not theme_data.font_footer_override: return QtCore.QRect(10, self.footer_start, self.width - 20, self.height - self.footer_start) else: - return QtCore.QRect(theme.font_footer_x, - theme.font_footer_y, theme.font_footer_width - 1, - theme.font_footer_height - 1) + return QtCore.QRect(theme_data.font_footer_x, + theme_data.font_footer_y, theme_data.font_footer_width - 1, + theme_data.font_footer_height - 1) - def _set_text_rectangle(self, rect_main, rect_footer): + def _set_text_rectangle(self, theme_data, rect_main, rect_footer): """ Sets the rectangle within which text should be rendered. + ``theme_data`` + The theme data. + ``rect_main`` The main text block. @@ -357,14 +401,14 @@ self._rect_footer = rect_footer self.page_width = self._rect.width() self.page_height = self._rect.height() - if self.theme_data.font_main_shadow: - self.page_width -= int(self.theme_data.font_main_shadow_size) - self.page_height -= int(self.theme_data.font_main_shadow_size) + if theme_data.font_main_shadow: + self.page_width -= int(theme_data.font_main_shadow_size) + self.page_height -= int(theme_data.font_main_shadow_size) self.web = QtWebKit.QWebView() self.web.setVisible(False) self.web.resize(self.page_width, self.page_height) self.web_frame = self.web.page().mainFrame() - # Adjust width and height to account for shadow. outline done in css + # Adjust width and height to account for shadow. outline done in css. html = u"""
""" % \ - (build_lyrics_format_css(self.theme_data, self.page_width, - self.page_height), build_lyrics_outline_css(self.theme_data)) + (build_lyrics_format_css(theme_data, self.page_width, + self.page_height), build_lyrics_outline_css(theme_data)) self.web.setHtml(html) self.empty_height = self.web_frame.contentsSize().height() @@ -493,19 +537,22 @@ (raw_text.find(tag[u'start tag']), tag[u'start tag'], tag[u'end tag'])) html_tags.append( - (raw_text.find(tag[u'start tag']), tag[u'start html'])) + (raw_text.find(tag[u'start tag']), tag[u'start html'])) # Sort the lists, so that the tags which were opened first on the first # slide (the text we are checking) will be opened first on the next # slide as well. raw_tags.sort(key=lambda tag: tag[0]) html_tags.sort(key=lambda tag: tag[0]) # Create a list with closing tags for the raw_text. - end_tags = [tag[2] for tag in raw_tags] + end_tags = [] + start_tags = [] + for tag in raw_tags: + start_tags.append(tag[1]) + end_tags.append(tag[2]) end_tags.reverse() # Remove the indexes. - raw_tags = [tag[1] for tag in raw_tags] html_tags = [tag[1] for tag in html_tags] - return raw_text + u''.join(end_tags), u''.join(raw_tags), \ + return raw_text + u''.join(end_tags), u''.join(start_tags), \ u''.join(html_tags) def _binary_chop(self, formatted, previous_html, previous_raw, html_list, diff -Nru openlp-1.9.9/openlp/core/lib/searchedit.py openlp-1.9.10/openlp/core/lib/searchedit.py --- openlp-1.9.9/openlp/core/lib/searchedit.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/searchedit.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -122,6 +123,13 @@ menu = self.menuButton.menu() for action in menu.actions(): if identifier == action.data().toInt()[0]: + # setPlaceholderText has been implemented in Qt 4.7 and in at + # least PyQt 4.9 (I am not sure, if it was implemented in + # PyQt 4.8). + try: + self.setPlaceholderText(action.placeholderText) + except AttributeError: + pass self.menuButton.setDefaultAction(action) self._currentSearchType = identifier self.emit(QtCore.SIGNAL(u'searchTypeChanged(int)'), identifier) @@ -137,21 +145,22 @@ identifier, an icon (QIcon instance or string) and a title for the item in the menu. In short, they should look like this:: - (, , ) + (<identifier>, <icon>, <title>, <place holder text>) For instance:: - (1, <QIcon instance>, "Titles") + (1, <QIcon instance>, "Titles", "Search Song Titles...") Or:: - (2, ":/songs/authors.png", "Authors") + (2, ":/songs/authors.png", "Authors", "Search Authors...") """ menu = QtGui.QMenu(self) first = None - for identifier, icon, title in items: + for identifier, icon, title, placeholder in items: action = create_widget_action(menu, text=title, icon=icon, data=identifier, triggers=self._onMenuActionTriggered) + action.placeholderText = placeholder if first is None: first = action self._currentSearchType = identifier @@ -181,7 +190,7 @@ def _onClearButtonClicked(self): """ - Internally implemented slot to react to the clear button being pressed + Internally implemented slot to react to the clear button being clicked to clear the line edit. Once it has cleared the line edit, it emits the ``cleared()`` signal so that an application can react to the clearing of the line edit. @@ -202,5 +211,12 @@ action.setChecked(False) self.menuButton.setDefaultAction(sender) self._currentSearchType = sender.data().toInt()[0] + # setPlaceholderText has been implemented in Qt 4.7 and in at least + # PyQt 4.9 (I am not sure, if it was implemented in PyQt 4.8). + try: + self.setPlaceholderText( + self.menuButton.defaultAction().placeholderText) + except AttributeError: + pass self.emit(QtCore.SIGNAL(u'searchTypeChanged(int)'), self._currentSearchType) diff -Nru openlp-1.9.9/openlp/core/lib/serviceitem.py openlp-1.9.10/openlp/core/lib/serviceitem.py --- openlp-1.9.9/openlp/core/lib/serviceitem.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/serviceitem.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -158,19 +159,24 @@ self.icon = icon self.iconic_representation = build_icon(icon) - def render(self, use_override=False): + def render(self, provides_own_theme_data=False): """ The render method is what generates the frames for the screen and obtains the display information from the renderer. At this point all slides are built for the given display size. + + ``provides_own_theme_data`` + This switch disables the usage of the item's theme. However, this is + disabled by default. If this is used, it has to be taken care, that + the renderer knows the correct theme data. However, this is needed + for the theme manager. """ log.debug(u'Render called') self._display_frames = [] self.bg_image_bytes = None - theme = self.theme if self.theme else None - self.main, self.footer = \ - self.renderer.set_override_theme(theme, use_override) - self.themedata = self.renderer.theme_data + if not provides_own_theme_data: + self.renderer.set_item_theme(self.theme) + self.themedata, self.main, self.footer = self.renderer.pre_render() if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides') for slide in self._raw_frames: @@ -195,8 +201,7 @@ # avoid tracebacks. if self.raw_footer is None: self.raw_footer = [] - self.foot_text = \ - u'<br>'.join([footer for footer in self.raw_footer if footer]) + self.foot_text = u'<br>'.join(filter(None, self.raw_footer)) def add_from_image(self, path, title, background=None): """ @@ -212,24 +217,21 @@ self.image_border = background self.service_item_type = ServiceItemType.Image self._raw_frames.append({u'title': title, u'path': path}) - self.renderer.imageManager.add_image(title, path, u'image', + self.renderer.image_manager.addImage(title, path, u'image', self.image_border) self._new_item() - def add_from_text(self, title, raw_slide, verse_tag=None): + def add_from_text(self, raw_slide, verse_tag=None): """ Add a text slide to the service item. - ``frame_title`` - The title of the slide in the service item. - ``raw_slide`` The raw text of the slide. """ if verse_tag: verse_tag = verse_tag.upper() self.service_item_type = ServiceItemType.Text - title = title.split(u'\n')[0] + title = raw_slide[:30].split(u'\n')[0] self._raw_frames.append( {u'title': title, u'raw_slide': raw_slide, u'verseTag': verse_tag}) self._new_item() @@ -314,17 +316,12 @@ self.from_plugin = header[u'from_plugin'] self.capabilities = header[u'capabilities'] # Added later so may not be present in older services. - if u'search' in header: - self.search_string = header[u'search'] - self.data_string = header[u'data'] - if u'xml_version' in header: - self.xml_version = header[u'xml_version'] - if u'start_time' in header: - self.start_time = header[u'start_time'] - if u'end_time' in header: - self.end_time = header[u'end_time'] - if u'media_length' in header: - self.media_length = header[u'media_length'] + self.search_string = header.get(u'search', u'') + self.data_string = header.get(u'data', u'') + self.xml_version = header.get(u'xml_version') + self.start_time = header.get(u'start_time', 0) + self.end_time = header.get(u'end_time', 0) + self.media_length = header.get(u'media_length', 0) if u'background_audio' in header: self.background_audio = [] for filename in header[u'background_audio']: diff -Nru openlp-1.9.9/openlp/core/lib/settingsmanager.py openlp-1.9.10/openlp/core/lib/settingsmanager.py --- openlp-1.9.9/openlp/core/lib/settingsmanager.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/settingsmanager.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -34,6 +35,7 @@ from PyQt4 import QtCore +from openlp.core.lib.settings import Settings from openlp.core.utils import AppLocation class SettingsManager(object): @@ -58,7 +60,7 @@ name = u'last directory %d' % num else: name = u'last directory' - last_dir = unicode(QtCore.QSettings().value( + last_dir = unicode(Settings().value( section + u'/' + name, QtCore.QVariant(u'')).toString()) return last_dir @@ -81,7 +83,7 @@ name = u'last directory %d' % num else: name = u'last directory' - QtCore.QSettings().setValue( + Settings().setValue( section + u'/' + name, QtCore.QVariant(directory)) @staticmethod @@ -98,13 +100,13 @@ ``list`` The list of values to save. """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(section) old_count = settings.value( u'%s count' % name, QtCore.QVariant(0)).toInt()[0] new_count = len(list) settings.setValue(u'%s count' % name, QtCore.QVariant(new_count)) - for counter in range (0, new_count): + for counter in range(new_count): settings.setValue( u'%s %d' % (name, counter), QtCore.QVariant(list[counter-1])) if old_count > new_count: @@ -124,13 +126,13 @@ ``name`` The name of the list. """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(section) list_count = settings.value( u'%s count' % name, QtCore.QVariant(0)).toInt()[0] list = [] if list_count: - for counter in range(0, list_count): + for counter in range(list_count): item = unicode( settings.value(u'%s %d' % (name, counter)).toString()) if item: diff -Nru openlp-1.9.9/openlp/core/lib/settings.py openlp-1.9.10/openlp/core/lib/settings.py --- openlp-1.9.9/openlp/core/lib/settings.py 1970-01-01 00:00:00.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/settings.py 2012-06-23 16:35:18.000000000 +0000 @@ -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-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # +############################################################################### +""" +The :mod:``settings`` module provides a thin wrapper for QSettings, which OpenLP +uses to manage settings persistence. +""" + +import logging + +from PyQt4 import QtCore + +log = logging.getLogger() + +class Settings(QtCore.QSettings): + """ + Class to wrap QSettings. + + * Exposes all the methods of QSettings. + * Adds functionality for OpenLP Portable. If the ``defaultFormat`` is set to + ``IniFormat``, and the path to the Ini file is set using ``setFilename``, + then the Settings constructor (without any arguments) will create a Settings + object for accessing settings stored in that Ini file. + """ + + __filePath = u'' + + @staticmethod + def setFilename(iniFile): + """ + Sets the complete path to an Ini file to be used by Settings objects. + + Does not affect existing Settings objects. + """ + Settings.__filePath = iniFile + + def __init__(self, *args): + if not args and Settings.__filePath and (Settings.defaultFormat() == + Settings.IniFormat): + QtCore.QSettings.__init__(self, Settings.__filePath, + Settings.IniFormat) + else: + QtCore.QSettings.__init__(self, *args) diff -Nru openlp-1.9.9/openlp/core/lib/settingstab.py openlp-1.9.10/openlp/core/lib/settingstab.py --- openlp-1.9.9/openlp/core/lib/settingstab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/settingstab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -47,7 +48,7 @@ self.tabTitleVisible = visible_title self.settingsSection = self.tabTitle.lower() if icon_path: - self.icon_path = icon_path + self.iconPath = icon_path self.setupUi() self.retranslateUi() self.initialise() @@ -112,7 +113,7 @@ def cancel(self): """ - Reset any settings if cancel pressed + Reset any settings if cancel triggered """ self.load() diff -Nru openlp-1.9.9/openlp/core/lib/spelltextedit.py openlp-1.9.10/openlp/core/lib/spelltextedit.py --- openlp-1.9.9/openlp/core/lib/spelltextedit.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/spelltextedit.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/core/lib/theme.py openlp-1.9.10/openlp/core/lib/theme.py --- openlp-1.9.9/openlp/core/lib/theme.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/theme.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -306,7 +307,7 @@ def add_font(self, name, color, size, override, fonttype=u'main', bold=u'False', italics=u'False', line_adjustment=0, - xpos=0, ypos=0, width=0, height=0 , outline=u'False', + xpos=0, ypos=0, width=0, height=0, outline=u'False', outline_color=u'#ffffff', outline_pixel=2, shadow=u'False', shadow_color=u'#ffffff', shadow_pixel=5): """ @@ -444,6 +445,20 @@ element.appendChild(child) return child + def set_default_header_footer(self): + """ + Set the header and footer size into the current primary screen. + 10 px on each side is removed to allow for a border. + """ + from openlp.core.ui import ScreenList + current_screen = ScreenList().current + self.font_main_y = 0 + self.font_main_width = current_screen[u'size'].width() - 20 + self.font_main_height = current_screen[u'size'].height() * 9 / 10 + self.font_footer_width = current_screen[u'size'].width() - 20 + self.font_footer_y = current_screen[u'size'].height() * 9 / 10 + self.font_footer_height = current_screen[u'size'].height() / 10 + def dump_xml(self): """ Dump the XML to file used for debugging @@ -550,7 +565,7 @@ element = u'size' return False, master, element, value - def _create_attr(self, master , element, value): + def _create_attr(self, master, element, value): """ Create the attributes with the correct data types and name format """ diff -Nru openlp-1.9.9/openlp/core/lib/toolbar.py openlp-1.9.10/openlp/core/lib/toolbar.py --- openlp-1.9.9/openlp/core/lib/toolbar.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/toolbar.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/core/lib/ui.py openlp-1.9.10/openlp/core/lib/ui.py --- openlp-1.9.9/openlp/core/lib/ui.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/lib/ui.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -80,6 +81,10 @@ self.Help = translate('OpenLP.Ui', 'Help') self.Hours = translate('OpenLP.Ui', 'h', 'The abbreviated unit for hours') + self.IFdSs = translate('OpenLP.Ui', 'Invalid Folder Selected', + 'Singular') + self.IFSs = translate('OpenLP.Ui', 'Invalid File Selected', 'Singular') + self.IFSp = translate('OpenLP.Ui', 'Invalid Files Selected', 'Plural') self.Image = translate('OpenLP.Ui', 'Image') self.Import = translate('OpenLP.Ui', 'Import') self.LayoutStyle = translate('OpenLP.Ui', 'Layout style:') @@ -94,6 +99,7 @@ self.NewService = translate('OpenLP.Ui', 'New Service') self.NewTheme = translate('OpenLP.Ui', 'New Theme') self.NextTrack = translate('OpenLP.Ui', 'Next Track') + self.NFdSs = translate('OpenLP.Ui', 'No Folder Selected', 'Singular') self.NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular') self.NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural') self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular') @@ -115,6 +121,8 @@ 'The abbreviated unit for seconds') self.SaveAndPreview = translate('OpenLP.Ui', 'Save && Preview') self.Search = translate('OpenLP.Ui', 'Search') + self.SearchThemes = translate( + 'OpenLP.Ui', 'Search Themes...', 'Search bar place holder text ') self.SelectDelete = translate('OpenLP.Ui', 'You must select an item ' 'to delete.') self.SelectEdit = translate('OpenLP.Ui', 'You must select an item to ' @@ -122,7 +130,7 @@ self.Settings = translate('OpenLP.Ui', 'Settings') self.SaveService = translate('OpenLP.Ui', 'Save Service') self.Service = translate('OpenLP.Ui', 'Service') - self.Split = translate('OpenLP.Ui', '&Split') + self.Split = translate('OpenLP.Ui', 'Optional &Split') self.SplitToolTip = translate('OpenLP.Ui', 'Split a slide into two ' 'only if it does not fit on the screen as one slide.') self.StartTimeCode = unicode(translate('OpenLP.Ui', 'Start %s')) @@ -141,6 +149,7 @@ self.View = translate('OpenLP.Ui', 'View') self.ViewMode = translate('OpenLP.Ui', 'View Mode') + def add_welcome_page(parent, image): """ Generate an opening welcome page for a wizard using a provided image. @@ -168,33 +177,54 @@ parent.welcomeLayout.addStretch() parent.addPage(parent.welcomePage) -def create_accept_reject_button_box(parent, okay=False): + +def create_button_box(dialog, name, standard_buttons, custom_buttons=[]): """ - Creates a standard dialog button box with two buttons. The buttons default - to save and cancel but the ``okay`` parameter can be used to make the - buttons okay and cancel instead. - The button box is connected to the parent's ``accept()`` and ``reject()`` - methods to handle the default ``accepted()`` and ``rejected()`` signals. + Creates a QDialogButtonBox with the given buttons. The ``accepted()`` and + ``rejected()`` signals of the button box are connected with the dialogs + ``accept()`` and ``reject()`` slots. - ``parent`` - The parent object. This should be a ``QWidget`` descendant. + ``dialog`` + The parent object. This has to be a ``QDialog`` descendant. - ``okay`` - If true creates an okay/cancel combination instead of save/cancel. - """ - button_box = QtGui.QDialogButtonBox(parent) - accept_button = QtGui.QDialogButtonBox.Save - if okay: - accept_button = QtGui.QDialogButtonBox.Ok - button_box.setStandardButtons( - accept_button | QtGui.QDialogButtonBox.Cancel) - button_box.setObjectName(u'%sButtonBox' % parent) + ``name`` + A string which is set as object name. + + ``standard_buttons`` + A list of strings for the used buttons. It might contain: ``ok``, + ``save``, ``cancel``, ``close``, and ``defaults``. + + ``custom_buttons`` + A list of additional buttons. If a item is a instance of + QtGui.QAbstractButton it is added with QDialogButtonBox.ActionRole. + Otherwhise the item has to be a tuple of a button and a ButtonRole. + """ + buttons = QtGui.QDialogButtonBox.NoButton + if u'ok' in standard_buttons: + buttons |= QtGui.QDialogButtonBox.Ok + if u'save' in standard_buttons: + buttons |= QtGui.QDialogButtonBox.Save + if u'cancel' in standard_buttons: + buttons |= QtGui.QDialogButtonBox.Cancel + if u'close' in standard_buttons: + buttons |= QtGui.QDialogButtonBox.Close + if u'defaults' in standard_buttons: + buttons |= QtGui.QDialogButtonBox.RestoreDefaults + button_box = QtGui.QDialogButtonBox(dialog) + button_box.setObjectName(name) + button_box.setStandardButtons(buttons) + for button in custom_buttons: + if isinstance(button, QtGui.QAbstractButton): + button_box.addButton(button, QtGui.QDialogButtonBox.ActionRole) + else: + button_box.addButton(*button) QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'accepted()'), - parent.accept) + dialog.accept) QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'rejected()'), - parent.reject) + dialog.reject) return button_box + def critical_error_message_box(title=None, message=None, parent=None, question=False): """ @@ -221,9 +251,16 @@ data[u'title'] = title if title else UiStrings().Error return Receiver.send_message(u'openlp_error_message', data) -def media_item_combo_box(parent, name): + +def create_horizontal_adjusting_combo_box(parent, name): """ - Provide a standard combo box for media items. + Creates a QComboBox with adapting width for media items. + + ``parent`` + The parent widget. + + ``name`` + A string set as object name for the combo box. """ combo = QtGui.QComboBox(parent) combo.setObjectName(name) @@ -231,55 +268,73 @@ combo.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) return combo -def create_delete_push_button(parent, icon=None): + +def create_button(parent, name, **kwargs): """ - Creates a standard push button with a delete label and optional icon. The - button is connected to the parent's ``onDeleteButtonClicked()`` method to - handle the ``clicked()`` signal. + Return an button with the object name set and the given parameters. ``parent`` - The parent object. This should be a ``QWidget`` descendant. + A QtCore.QWidget for the buttons parent (required). + + ``name`` + A string which is set as object name (required). + + ``role`` + A string which can have one value out of ``delete``, ``up``, and + ``down``. This decides about default values for properties like text, + icon, or tooltip. + + ``text`` + A string for the action text. ``icon`` - An icon to display on the button. This can be either a ``QIcon``, a - resource path or a file name. - """ - delete_button = QtGui.QPushButton(parent) - delete_button.setObjectName(u'deleteButton') - delete_icon = icon if icon else u':/general/general_delete.png' - delete_button.setIcon(build_icon(delete_icon)) - delete_button.setText(UiStrings().Delete) - delete_button.setToolTip( - translate('OpenLP.Ui', 'Delete the selected item.')) - QtCore.QObject.connect(delete_button, - QtCore.SIGNAL(u'clicked()'), parent.onDeleteButtonClicked) - return delete_button - -def create_up_down_push_button_set(parent): - """ - Creates a standard set of two push buttons, one for up and the other for - down, for use with lists. The buttons use arrow icons and no text and are - connected to the parent's ``onUpButtonClicked()`` and - ``onDownButtonClicked()`` to handle their respective ``clicked()`` signals. + Either a QIcon, a resource string, or a file location string for the + action icon. - ``parent`` - The parent object. This should be a ``QWidget`` descendant. + ``tooltip`` + A string for the action tool tip. + + ``enabled`` + False in case the button should be disabled. """ - up_button = QtGui.QPushButton(parent) - up_button.setIcon(build_icon(u':/services/service_up.png')) - up_button.setObjectName(u'upButton') - up_button.setToolTip( - translate('OpenLP.Ui', 'Move selection up one position.')) - down_button = QtGui.QPushButton(parent) - down_button.setIcon(build_icon(u':/services/service_down.png')) - down_button.setObjectName(u'downButton') - down_button.setToolTip( - translate('OpenLP.Ui', 'Move selection down one position.')) - QtCore.QObject.connect(up_button, - QtCore.SIGNAL(u'clicked()'), parent.onUpButtonClicked) - QtCore.QObject.connect(down_button, - QtCore.SIGNAL(u'clicked()'), parent.onDownButtonClicked) - return up_button, down_button + if u'role' in kwargs: + role = kwargs.pop(u'role') + if role == u'delete': + kwargs.setdefault(u'text', UiStrings().Delete) + kwargs.setdefault(u'tooltip', + translate('OpenLP.Ui', 'Delete the selected item.')) + elif role == u'up': + kwargs.setdefault(u'icon', u':/services/service_up.png') + kwargs.setdefault(u'tooltip', + translate('OpenLP.Ui', 'Move selection up one position.')) + elif role == u'down': + kwargs.setdefault(u'icon', u':/services/service_down.png') + kwargs.setdefault(u'tooltip', + translate('OpenLP.Ui', 'Move selection down one position.')) + else: + log.warn(u'The role "%s" is not defined in create_push_button().', + role) + if kwargs.pop(u'class', u'') == u'toolbutton': + button = QtGui.QToolButton(parent) + else: + button = QtGui.QPushButton(parent) + button.setObjectName(name) + if kwargs.get(u'text'): + button.setText(kwargs.pop(u'text')) + if kwargs.get(u'icon'): + button.setIcon(build_icon(kwargs.pop(u'icon'))) + if kwargs.get(u'tooltip'): + button.setToolTip(kwargs.pop(u'tooltip')) + if not kwargs.pop(u'enabled', True): + button.setEnabled(False) + if kwargs.get(u'click'): + QtCore.QObject.connect(button, QtCore.SIGNAL(u'clicked()'), + kwargs.pop(u'click')) + for key in kwargs.keys(): + if key not in [u'text', u'icon', u'tooltip', u'click']: + log.warn(u'Parameter %s was not consumed in create_button().', key) + return button + def create_action(parent, name, **kwargs): """ @@ -368,72 +423,53 @@ log.warn(u'Parameter %s was not consumed in create_action().', key) return action + def create_widget_action(parent, name=u'', **kwargs): """ Return a new QAction by calling ``create_action(parent, name, **kwargs)``. The shortcut context defaults to ``QtCore.Qt.WidgetShortcut`` and the action is added to the parents action list. """ - kwargs.setdefault(u'context', QtCore.Qt.WidgetShortcut) + kwargs.setdefault(u'context', QtCore.Qt.WidgetShortcut) action = create_action(parent, name, **kwargs) parent.addAction(action) return action -def context_menu(base, icon, text): - """ - Utility method to help build context menus. - - ``base`` - The parent object to add this menu to - - ``icon`` - An icon for this menu - - ``text`` - The text to display for this menu - """ - action = QtGui.QMenu(text, base) - action.setIcon(build_icon(icon)) - return action -def add_widget_completer(cache, widget): +def set_case_insensitive_completer(cache, widget): """ - Adds a text autocompleter to a widget. + Sets a case insensitive text completer for a widget. ``cache`` The list of items to use as suggestions. ``widget`` - The object to use the completer. + A widget to set the completer (QComboBox or QTextEdit instance) """ completer = QtGui.QCompleter(cache) completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) widget.setCompleter(completer) -def create_valign_combo(form, parent, layout): + +def create_valign_selection_widgets(parent): """ Creates a standard label and combo box for asking users to select a vertical alignment. - ``form`` - The UI screen that the label and combo will appear on. - ``parent`` The parent object. This should be a ``QWidget`` descendant. - ``layout`` - A layout object to add the label and combo widgets to. + Returns a tuple of QLabel and QComboBox. """ - verticalLabel = QtGui.QLabel(parent) - verticalLabel.setObjectName(u'VerticalLabel') - verticalLabel.setText(translate('OpenLP.Ui', '&Vertical Align:')) - form.verticalComboBox = QtGui.QComboBox(parent) - form.verticalComboBox.setObjectName(u'VerticalComboBox') - form.verticalComboBox.addItem(UiStrings().Top) - form.verticalComboBox.addItem(UiStrings().Middle) - form.verticalComboBox.addItem(UiStrings().Bottom) - verticalLabel.setBuddy(form.verticalComboBox) - layout.addRow(verticalLabel, form.verticalComboBox) + label = QtGui.QLabel(parent) + label.setText(translate('OpenLP.Ui', '&Vertical Align:')) + combo_box = QtGui.QComboBox(parent) + combo_box.addItem(UiStrings().Top) + combo_box.addItem(UiStrings().Middle) + combo_box.addItem(UiStrings().Bottom) + label.setBuddy(combo_box) + return label, combo_box + def find_and_set_in_combo_box(combo_box, value_to_find): """ diff -Nru openlp-1.9.9/openlp/core/theme/__init__.py openlp-1.9.10/openlp/core/theme/__init__.py --- openlp-1.9.9/openlp/core/theme/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/theme/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/core/theme/theme.py openlp-1.9.10/openlp/core/theme/theme.py --- openlp-1.9.9/openlp/core/theme/theme.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/theme/theme.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -209,7 +210,7 @@ val = int(element_text[1:], 16) except ValueError: # nope pass - elif DELPHI_COLORS.has_key(element_text): + elif element_text in DELPHI_COLORS: val = DELPHI_COLORS[element_text] delphi_color_change = True else: diff -Nru openlp-1.9.9/openlp/core/ui/aboutdialog.py openlp-1.9.10/openlp/core/ui/aboutdialog.py --- openlp-1.9.9/openlp/core/ui/aboutdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/aboutdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,10 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import build_icon, translate -from openlp.core.lib.ui import UiStrings +from openlp.core.lib.ui import UiStrings, create_button, create_button_box class Ui_AboutDialog(object): def setupUi(self, aboutDialog): @@ -71,21 +72,13 @@ self.licenseTabLayout.addWidget(self.licenseTextEdit) self.aboutNotebook.addTab(self.licenseTab, u'') self.aboutDialogLayout.addWidget(self.aboutNotebook) - self.buttonBox = QtGui.QDialogButtonBox(aboutDialog) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) - self.buttonBox.setObjectName(u'buttonBox') - self.contributeButton = QtGui.QPushButton() - self.contributeButton.setIcon( - build_icon(u':/system/system_contribute.png')) - self.contributeButton.setObjectName(u'contributeButton') - self.buttonBox.addButton(self.contributeButton, - QtGui.QDialogButtonBox.ActionRole) + self.contributeButton = create_button(None, u'contributeButton', + icon=u':/system/system_contribute.png') + self.buttonBox = create_button_box(aboutDialog, u'buttonBox', + [u'close'], [self.contributeButton]) self.aboutDialogLayout.addWidget(self.buttonBox) self.retranslateUi(aboutDialog) self.aboutNotebook.setCurrentIndex(0) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), - aboutDialog.close) - QtCore.QMetaObject.connectSlotsByName(aboutDialog) def retranslateUi(self, aboutDialog): aboutDialog.setWindowTitle(u'%s OpenLP' % UiStrings().About) @@ -113,13 +106,14 @@ u'Andreas "googol" Preikschat', u'Raoul "superfly" Snyman', u'Martin "mijiti" Thompson', u'Jon "Meths" Tibble'] contributors = [u'Gerald "jerryb" Britton', - u'Scott "sguerrieri" Guerrieri', + u'Samuel "MrGamgee" Findlay', u'Scott "sguerrieri" Guerrieri', u'Matthias "matthub" Hub', u'Meinert "m2j" Jordan', - u'Armin "orangeshirt" K\xf6hler', u'Joshua "milleja46" Miller', - u'Stevan "ElderP" Pettit', u'Mattias "mahfiaz" P\xf5ldaru', - u'Christian "crichter" Richter', u'Philip "Phill" Ridout', - u'Simon "samscudder" Scudder', u'Jeffrey "whydoubt" Smith', - u'Maikel Stuivenberg', u'Frode "frodus" Woldsund'] + u'Armin "orangeshirt" K\xf6hler', u'Edwin "edwinlunando" Lunando', + u'Joshua "milleja46" Miller', u'Stevan "ElderP" Pettit', + u'Mattias "mahfiaz" P\xf5ldaru', u'Christian "crichter" Richter', + u'Philip "Phill" Ridout', u'Simon "samscudder" Scudder', + u'Jeffrey "whydoubt" Smith', u'Maikel Stuivenberg', + u'Dave "Dave42W" Warnock', u'Frode "frodus" Woldsund'] testers = [u'Philip "Phill" Ridout', u'Wesley "wrst" Stout', u'John "jseagull1" Cegalis (lead)'] packagers = ['Thomas "tabthorpe" Abthorpe (FreeBSD)', @@ -229,12 +223,12 @@ copyright = unicode(translate('OpenLP.AboutForm', 'Copyright \xa9 2004-2012 %s\n' 'Portions copyright \xa9 2004-2012 %s')) % (u'Raoul Snyman', - u'Tim Bentley, Jonathan Corwin, Michael Gorven, Gerald Britton, ' - u'Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin K\xf6hler, ' - u'Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias ' - u'P\xf5ldaru, Christian Richter, Philip Ridout, Simon Scudder, ' - u'Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, ' - u'Frode Woldsund') + u'Tim Bentley, Gerald Britton, Jonathan Corwin, Samuel Findlay, ' + u'Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, ' + u'Armin K\xf6hler, Edwin Lunando, Joshua Miller, Stevan Pettit, ' + u'Andreas Preikschat, Mattias P\xf5ldaru, Christian Richter, ' + u'Philip Ridout, Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, ' + u'Martin Thompson, Jon Tibble, Dave Warnock, Frode Woldsund') licence = translate('OpenLP.AboutForm', 'This program is free software; you can redistribute it and/or ' 'modify it under the terms of the GNU General Public License as ' diff -Nru openlp-1.9.9/openlp/core/ui/aboutform.py openlp-1.9.10/openlp/core/ui/aboutform.py --- openlp-1.9.9/openlp/core/ui/aboutform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/aboutform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/core/ui/advancedtab.py openlp-1.9.10/openlp/core/ui/advancedtab.py --- openlp-1.9.9/openlp/core/ui/advancedtab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/advancedtab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -31,10 +32,16 @@ from PyQt4 import QtCore, QtGui +import logging +import os +import sys from openlp.core.lib import SettingsTab, translate, build_icon, Receiver +from openlp.core.lib.settings import Settings from openlp.core.lib.ui import UiStrings +from openlp.core.utils import get_images_filter, AppLocation from openlp.core.lib import SlideLimits -from openlp.core.utils import get_images_filter + +log = logging.getLogger(__name__) class AdvancedTab(SettingsTab): """ @@ -59,7 +66,8 @@ '#strftime-strptime-behavior for more information.')) self.defaultImage = u':/graphics/openlp-splash-screen.png' self.defaultColor = u'#ffffff' - self.icon_path = u':/system/system_settings.png' + self.dataExists = False + self.iconPath = u':/system/system_settings.png' advanced_translated = translate('OpenLP.AdvancedTab', 'Advanced') SettingsTab.__init__(self, parent, u'Advanced', advanced_translated) @@ -151,6 +159,71 @@ self.serviceNameLayout.addRow(self.serviceNameExampleLabel, self.serviceNameExample) self.leftLayout.addWidget(self.serviceNameGroupBox) + # Data Directory + self.dataDirectoryGroupBox = QtGui.QGroupBox(self.leftColumn) + self.dataDirectoryGroupBox.setObjectName(u'dataDirectoryGroupBox') + self.dataDirectoryLayout = QtGui.QFormLayout(self.dataDirectoryGroupBox) + self.dataDirectoryLayout.setObjectName(u'dataDirectoryLayout') + self.dataDirectoryCurrentLabel = QtGui.QLabel(self.dataDirectoryGroupBox) + self.dataDirectoryCurrentLabel.setObjectName( + u'dataDirectoryCurrentLabel') + self.dataDirectoryLabel = QtGui.QLabel(self.dataDirectoryGroupBox) + self.dataDirectoryLabel.setObjectName(u'dataDirectoryLabel') + self.dataDirectoryNewLabel = QtGui.QLabel(self.dataDirectoryGroupBox) + self.dataDirectoryNewLabel.setObjectName(u'dataDirectoryCurrentLabel') + self.newDataDirectoryEdit = QtGui.QLineEdit(self.dataDirectoryGroupBox) + self.newDataDirectoryEdit.setObjectName(u'newDataDirectoryEdit') + self.newDataDirectoryEdit.setReadOnly(True) + self.newDataDirectoryHasFilesLabel = QtGui.QLabel( + self.dataDirectoryGroupBox) + self.newDataDirectoryHasFilesLabel.setObjectName( + u'newDataDirectoryHasFilesLabel') + self.newDataDirectoryHasFilesLabel.setWordWrap(True) + self.dataDirectoryBrowseButton = QtGui.QToolButton( + self.dataDirectoryGroupBox) + self.dataDirectoryBrowseButton.setObjectName( + u'dataDirectoryBrowseButton') + self.dataDirectoryBrowseButton.setIcon( + build_icon(u':/general/general_open.png')) + self.dataDirectoryDefaultButton = QtGui.QToolButton( + self.dataDirectoryGroupBox) + self.dataDirectoryDefaultButton.setObjectName( + u'dataDirectoryDefaultButton') + self.dataDirectoryDefaultButton.setIcon( + build_icon(u':/general/general_revert.png')) + self.dataDirectoryCancelButton = QtGui.QToolButton( + self.dataDirectoryGroupBox) + self.dataDirectoryCancelButton.setObjectName( + u'dataDirectoryCancelButton') + self.dataDirectoryCancelButton.setIcon( + build_icon(u':/general/general_delete.png')) + self.newDataDirectoryLabelHBox = QtGui.QHBoxLayout() + self.newDataDirectoryLabelHBox.setObjectName( + u'newDataDirectoryLabelHBox') + self.newDataDirectoryLabelHBox.addWidget(self.newDataDirectoryEdit) + self.newDataDirectoryLabelHBox.addWidget( + self.dataDirectoryBrowseButton) + self.newDataDirectoryLabelHBox.addWidget( + self.dataDirectoryDefaultButton) + self.dataDirectoryCopyCheckHBox = QtGui.QHBoxLayout() + self.dataDirectoryCopyCheckHBox.setObjectName( + u'dataDirectoryCopyCheckHBox') + self.dataDirectoryCopyCheckBox = QtGui.QCheckBox( + self.dataDirectoryGroupBox) + self.dataDirectoryCopyCheckBox.setObjectName( + u'dataDirectoryCopyCheckBox') + self.dataDirectoryCopyCheckHBox.addWidget( + self.dataDirectoryCopyCheckBox) + self.dataDirectoryCopyCheckHBox.addStretch() + self.dataDirectoryCopyCheckHBox.addWidget( + self.dataDirectoryCancelButton) + self.dataDirectoryLayout.addRow(self.dataDirectoryCurrentLabel, + self.dataDirectoryLabel) + self.dataDirectoryLayout.addRow(self.dataDirectoryNewLabel, + self.newDataDirectoryLabelHBox) + self.dataDirectoryLayout.addRow(self.dataDirectoryCopyCheckHBox) + self.dataDirectoryLayout.addRow(self.newDataDirectoryHasFilesLabel) + self.leftLayout.addWidget(self.dataDirectoryGroupBox) self.leftLayout.addStretch() # Default Image self.defaultImageGroupBox = QtGui.QGroupBox(self.rightColumn) @@ -195,33 +268,20 @@ # Service Item Slide Limits self.slideGroupBox = QtGui.QGroupBox(self.rightColumn) self.slideGroupBox.setObjectName(u'slideGroupBox') - self.slideLayout = QtGui.QFormLayout(self.slideGroupBox) - self.slideLayout.setLabelAlignment( - QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) - self.slideLayout.setFormAlignment( - QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) + self.slideLayout = QtGui.QVBoxLayout(self.slideGroupBox) self.slideLayout.setObjectName(u'slideLayout') + self.slideLabel = QtGui.QLabel(self.slideGroupBox) + self.slideLabel.setWordWrap(True) + self.slideLayout.addWidget(self.slideLabel) self.endSlideRadioButton = QtGui.QRadioButton(self.slideGroupBox) self.endSlideRadioButton.setObjectName(u'endSlideRadioButton') - self.endSlideLabel = QtGui.QLabel(self.slideGroupBox) - self.endSlideLabel.setWordWrap(True) - self.endSlideLabel.setObjectName(u'endSlideLabel') - self.slideLayout.addRow(self.endSlideRadioButton, self.endSlideLabel) + self.slideLayout.addWidget(self.endSlideRadioButton) self.wrapSlideRadioButton = QtGui.QRadioButton(self.slideGroupBox) self.wrapSlideRadioButton.setObjectName(u'wrapSlideRadioButton') - self.wrapSlideLabel = QtGui.QLabel(self.slideGroupBox) - self.wrapSlideLabel.setWordWrap(True) - self.wrapSlideLabel.setObjectName(u'wrapSlideLabel') - self.slideLayout.addRow(self.wrapSlideRadioButton, - self.wrapSlideLabel) + self.slideLayout.addWidget(self.wrapSlideRadioButton) self.nextItemRadioButton = QtGui.QRadioButton(self.slideGroupBox) - self.nextItemRadioButton.setChecked(True) self.nextItemRadioButton.setObjectName(u'nextItemRadioButton') - self.nextItemLabel = QtGui.QLabel(self.slideGroupBox) - self.nextItemLabel.setWordWrap(True) - self.nextItemLabel.setObjectName(u'nextItemLabel') - self.slideLayout.addRow(self.nextItemRadioButton, - self.nextItemLabel) + self.slideLayout.addWidget(self.nextItemRadioButton) self.rightLayout.addWidget(self.slideGroupBox) self.x11GroupBox = QtGui.QGroupBox(self.leftColumn) self.x11GroupBox.setObjectName(u'x11GroupBox') @@ -232,7 +292,6 @@ self.x11Layout.addWidget(self.x11BypassCheckBox) self.rightLayout.addWidget(self.x11GroupBox) self.rightLayout.addStretch() - self.shouldUpdateServiceNameExample = False QtCore.QObject.connect(self.serviceNameCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.serviceNameCheckBoxToggled) @@ -246,22 +305,34 @@ QtCore.SIGNAL(u'textChanged(QString)'), self.updateServiceNameExample) QtCore.QObject.connect(self.serviceNameRevertButton, - QtCore.SIGNAL(u'pressed()'), - self.onServiceNameRevertButtonPressed) + QtCore.SIGNAL(u'clicked()'), + self.onServiceNameRevertButtonClicked) QtCore.QObject.connect(self.defaultColorButton, - QtCore.SIGNAL(u'pressed()'), self.onDefaultColorButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onDefaultColorButtonClicked) QtCore.QObject.connect(self.defaultBrowseButton, - QtCore.SIGNAL(u'pressed()'), self.onDefaultBrowseButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onDefaultBrowseButtonClicked) QtCore.QObject.connect(self.defaultRevertButton, - QtCore.SIGNAL(u'pressed()'), self.onDefaultRevertButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onDefaultRevertButtonClicked) QtCore.QObject.connect(self.x11BypassCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.onX11BypassCheckBoxToggled) + QtCore.QObject.connect(self.dataDirectoryBrowseButton, + QtCore.SIGNAL(u'clicked()'), + self.onDataDirectoryBrowseButtonClicked) + QtCore.QObject.connect(self.dataDirectoryDefaultButton, + QtCore.SIGNAL(u'clicked()'), + self.onDataDirectoryDefaultButtonClicked) + QtCore.QObject.connect(self.dataDirectoryCancelButton, + QtCore.SIGNAL(u'clicked()'), + self.onDataDirectoryCancelButtonClicked) + QtCore.QObject.connect(self.dataDirectoryCopyCheckBox, + QtCore.SIGNAL(u'toggled(bool)'), + self.onDataDirectoryCopyCheckBoxToggled) QtCore.QObject.connect(self.endSlideRadioButton, - QtCore.SIGNAL(u'pressed()'), self.onEndSlideButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onEndSlideButtonClicked) QtCore.QObject.connect(self.wrapSlideRadioButton, - QtCore.SIGNAL(u'pressed()'), self.onWrapSlideButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onWrapSlideButtonClicked) QtCore.QObject.connect(self.nextItemRadioButton, - QtCore.SIGNAL(u'pressed()'), self.onnextItemButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onnextItemButtonClicked) def retranslateUi(self): """ @@ -270,6 +341,8 @@ self.tabTitleVisible = UiStrings().Advanced self.uiGroupBox.setTitle( translate('OpenLP.AdvancedTab', 'UI Settings')) + self.dataDirectoryGroupBox.setTitle( + translate('OpenLP.AdvancedTab', 'Data Location')) self.recentLabel.setText( translate('OpenLP.AdvancedTab', 'Number of recent files to display:')) @@ -333,6 +406,32 @@ 'Browse for an image file to display.')) self.defaultRevertButton.setToolTip(translate('OpenLP.AdvancedTab', 'Revert to the default OpenLP logo.')) + self.dataDirectoryCurrentLabel.setText(translate('OpenLP.AdvancedTab', + 'Current path:')) + self.dataDirectoryNewLabel.setText(translate('OpenLP.AdvancedTab', + 'Custom path:')) + self.dataDirectoryBrowseButton.setToolTip( + translate('OpenLP.AdvancedTab', + 'Browse for new data file location.')) + self.dataDirectoryDefaultButton.setToolTip( + translate('OpenLP.AdvancedTab', + 'Set the data location to the default.')) + self.dataDirectoryCancelButton.setText( + translate('OpenLP.AdvancedTab', + 'Cancel')) + self.dataDirectoryCancelButton.setToolTip( + translate('OpenLP.AdvancedTab', + 'Cancel OpenLP data directory location change.')) + self.dataDirectoryCopyCheckBox.setText( + translate('OpenLP.AdvancedTab', + 'Copy data to new location.')) + self.dataDirectoryCopyCheckBox.setToolTip( + translate('OpenLP.AdvancedTab', + 'Copy the OpenLP data files to the new location.')) + self.newDataDirectoryHasFilesLabel.setText( + translate('OpenLP.AdvancedTab', + '<strong>WARNING:</strong> New data directory location contains ' + 'OpenLP data files. These files WILL be replaced during a copy.')) self.x11GroupBox.setTitle(translate('OpenLP.AdvancedTab', 'X11')) self.x11BypassCheckBox.setText(translate('OpenLP.AdvancedTab', @@ -340,33 +439,25 @@ # Slide Limits self.slideGroupBox.setTitle( translate('OpenLP.GeneralTab', 'Service Item Slide Limits')) + self.slideLabel.setText(translate('OpenLP.GeneralTab', + 'Behavior of next/previous on the last/first slide:')) self.endSlideRadioButton.setText( - translate('OpenLP.GeneralTab', '&End Slide')) - self.endSlideLabel.setText( - translate('OpenLP.GeneralTab', 'Up and down arrow keys ' - 'stop at the top and bottom slides of each Service Item.')) + translate('OpenLP.GeneralTab', '&Remain on Slide')) self.wrapSlideRadioButton.setText( - translate('OpenLP.GeneralTab', '&Wrap Slide')) - self.wrapSlideLabel.setText( - translate('OpenLP.GeneralTab', 'Up and down arrow keys ' - 'wrap around at the top and bottom slides of each Service Item.')) - self.nextItemRadioButton.setText( - translate('OpenLP.GeneralTab', '&Next Item')) - self.nextItemLabel.setText( - translate('OpenLP.GeneralTab', 'Up and down arrow keys ' - 'advance to the next or previous Service Item from the ' - 'top and bottom slides of each Service Item.')) + translate('OpenLP.GeneralTab', '&Wrap around')) + self.nextItemRadioButton.setText(translate('OpenLP.GeneralTab', + '&Move to next/previous service item')) def load(self): """ Load settings from disk. """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) # The max recent files value does not have an interface and so never # gets actually stored in the settings therefore the default value of # 20 will always be used. - self.recentSpinBox.setMaximum(QtCore.QSettings().value( + self.recentSpinBox.setMaximum(Settings().value( u'max recent files', QtCore.QVariant(20)).toInt()[0]) self.recentSpinBox.setValue(settings.value(u'recent file count', QtCore.QVariant(4)).toInt()[0]) @@ -418,6 +509,40 @@ else: self.nextItemRadioButton.setChecked(True) settings.endGroup() + self.dataDirectoryCopyCheckBox.hide() + self.newDataDirectoryHasFilesLabel.hide() + self.dataDirectoryCancelButton.hide() + # Since data location can be changed, make sure the path is present. + self.currentDataPath = AppLocation.get_data_path() + if not os.path.exists(self.currentDataPath): + log.error(u'Data path not found %s' % self.currentDataPath) + answer = QtGui.QMessageBox.critical(self, + translate('OpenLP.AdvancedTab', + 'Data Directory Error'), + translate('OpenLP.AdvancedTab', + 'OpenLP data directory was not found\n\n%s\n\n' + 'This data directory was previously changed from the OpenLP ' + 'default location. If the new location was on removable ' + 'media, that media needs to be made available.\n\n' + 'Click "No" to stop loading OpenLP. allowing you to fix ' + 'the the problem.\n\n' + 'Click "Yes" to reset the data directory to the default ' + 'location.' % self.currentDataPath), + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Yes | + QtGui.QMessageBox.No), + QtGui.QMessageBox.No) + if answer == QtGui.QMessageBox.No: + log.info(u'User requested termination') + Receiver.send_message(u'cleanup') + sys.exit() + # Set data location to default. + settings.remove(u'advanced/data path') + self.currentDataPath = AppLocation.get_data_path() + log.warning(u'User requested data path set to default %s' + % self.currentDataPath) + self.dataDirectoryLabel.setText(os.path.abspath( + self.currentDataPath)) self.defaultColorButton.setStyleSheet( u'background-color: %s' % self.defaultColor) @@ -425,7 +550,7 @@ """ Save settings to disk. """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) settings.setValue(u'default service enabled', self.serviceNameCheckBox.isChecked()) @@ -467,6 +592,11 @@ self.displayChanged = False Receiver.send_message(u'slidecontroller_update_slide_limits') + def cancel(self): + # Dialogue was cancelled, remove any pending data path change. + self.onDataDirectoryCancelButtonClicked() + SettingsTab.cancel(self) + def serviceNameCheckBoxToggled(self, default_service_enabled): self.serviceNameDay.setEnabled(default_service_enabled) time_enabled = default_service_enabled and \ @@ -506,11 +636,11 @@ self.serviceNameTime.setEnabled(service_day is not 7) self.updateServiceNameExample(None) - def onServiceNameRevertButtonPressed(self): + def onServiceNameRevertButtonClicked(self): self.serviceNameEdit.setText(self.defaultServiceName) self.serviceNameEdit.setFocus() - def onDefaultColorButtonPressed(self): + def onDefaultColorButtonClicked(self): new_color = QtGui.QColorDialog.getColor( QtGui.QColor(self.defaultColor), self) if new_color.isValid(): @@ -518,7 +648,7 @@ self.defaultColorButton.setStyleSheet( u'background-color: %s' % self.defaultColor) - def onDefaultBrowseButtonPressed(self): + def onDefaultBrowseButtonClicked(self): file_filters = u'%s;;%s (*.*) (*)' % (get_images_filter(), UiStrings().AllFiles) filename = QtGui.QFileDialog.getOpenFileName(self, @@ -528,7 +658,123 @@ self.defaultFileEdit.setText(filename) self.defaultFileEdit.setFocus() - def onDefaultRevertButtonPressed(self): + def onDataDirectoryBrowseButtonClicked(self): + """ + Browse for a new data directory location. + """ + old_root_path = unicode(self.dataDirectoryLabel.text()) + # Get the new directory location. + new_data_path = unicode(QtGui.QFileDialog.getExistingDirectory(self, + translate('OpenLP.AdvancedTab', + 'Select Data Directory Location'), old_root_path, + options = QtGui.QFileDialog.ShowDirsOnly)) + # Set the new data path. + if new_data_path: + if self.currentDataPath.lower() == new_data_path.lower(): + self.onDataDirectoryCancelButtonClicked() + return + else: + return + # Make sure they want to change the data. + answer = QtGui.QMessageBox.question(self, + translate('OpenLP.AdvancedTab', 'Confirm Data Directory Change'), + translate('OpenLP.AdvancedTab', + 'Are you sure you want to change the location of the OpenLP ' + 'data directory to:\n\n%s\n\n' + 'The data directory will be changed when OpenLP is closed.' + % new_data_path), + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Yes | + QtGui.QMessageBox.No), + QtGui.QMessageBox.No) + if answer != QtGui.QMessageBox.Yes: + return + # Check if data already exists here. + self.checkDataOverwrite(new_data_path) + # Save the new location. + Receiver.send_message(u'set_new_data_path', new_data_path) + self.newDataDirectoryEdit.setText(new_data_path) + self.dataDirectoryCancelButton.show() + + def onDataDirectoryDefaultButtonClicked(self): + """ + Re-set the data directory location to the 'default' location. + """ + new_data_path = AppLocation.get_directory(AppLocation.DataDir) + if self.currentDataPath.lower() != new_data_path.lower(): + # Make sure they want to change the data location back to the default. + answer = QtGui.QMessageBox.question(self, + translate('OpenLP.AdvancedTab', 'Reset Data Directory'), + translate('OpenLP.AdvancedTab', + 'Are you sure you want to change the location of the OpenLP ' + 'data directory to the default location?\n\n' + 'This location will be used after OpenLP is closed.'), + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Yes | + QtGui.QMessageBox.No), + QtGui.QMessageBox.No) + if answer != QtGui.QMessageBox.Yes: + return + self.checkDataOverwrite(new_data_path) + # Save the new location. + Receiver.send_message(u'set_new_data_path', new_data_path) + self.newDataDirectoryEdit.setText(os.path.abspath(new_data_path)) + self.dataDirectoryCancelButton.show() + else: + # We cancel the change in case user changed their mind. + self.onDataDirectoryCancelButtonClicked() + + def onDataDirectoryCopyCheckBoxToggled(self): + Receiver.send_message(u'set_copy_data', + self.dataDirectoryCopyCheckBox.isChecked()) + if self.dataExists: + if self.dataDirectoryCopyCheckBox.isChecked(): + self.newDataDirectoryHasFilesLabel.show() + else: + self.newDataDirectoryHasFilesLabel.hide() + + def checkDataOverwrite(self, data_path ): + test_path = os.path.join(data_path, u'songs') + self.dataDirectoryCopyCheckBox.show() + if os.path.exists(test_path): + self.dataExists = True + # Check is they want to replace existing data. + answer = QtGui.QMessageBox.warning(self, + translate('OpenLP.AdvancedTab', 'Overwrite Existing Data'), + translate('OpenLP.AdvancedTab', + 'WARNING: \n\n' + 'The location you have selected \n\n%s\n\n' + 'appears to contain OpenLP data files. Do you wish to replace ' + 'these files with the current data files?' + % os.path.abspath(data_path,)), + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Yes | + QtGui.QMessageBox.No), + QtGui.QMessageBox.No) + if answer == QtGui.QMessageBox.Yes: + self.dataDirectoryCopyCheckBox.setChecked(True) + self.newDataDirectoryHasFilesLabel.show() + else: + self.dataDirectoryCopyCheckBox.setChecked(False) + self.newDataDirectoryHasFilesLabel.hide() + else: + self.dataExists = False + self.dataDirectoryCopyCheckBox.setChecked(True) + self.newDataDirectoryHasFilesLabel.hide() + + def onDataDirectoryCancelButtonClicked(self): + """ + Cancel the data directory location change + """ + self.newDataDirectoryEdit.clear() + self.dataDirectoryCopyCheckBox.setChecked(False) + Receiver.send_message(u'set_new_data_path', u'') + Receiver.send_message(u'set_copy_data', False) + self.dataDirectoryCopyCheckBox.hide() + self.dataDirectoryCancelButton.hide() + self.newDataDirectoryHasFilesLabel.hide() + + def onDefaultRevertButtonClicked(self): self.defaultFileEdit.setText(u':/graphics/openlp-splash-screen.png') self.defaultFileEdit.setFocus() @@ -541,11 +787,11 @@ """ self.displayChanged = True - def onEndSlideButtonPressed(self): + def onEndSlideButtonClicked(self): self.slide_limits = SlideLimits.End - def onWrapSlideButtonPressed(self): + def onWrapSlideButtonClicked(self): self.slide_limits = SlideLimits.Wrap - def onnextItemButtonPressed(self): + def onnextItemButtonClicked(self): self.slide_limits = SlideLimits.Next diff -Nru openlp-1.9.9/openlp/core/ui/exceptiondialog.py openlp-1.9.10/openlp/core/ui/exceptiondialog.py --- openlp-1.9.9/openlp/core/ui/exceptiondialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/exceptiondialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,6 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate, build_icon +from openlp.core.lib.ui import create_button, create_button_box class Ui_ExceptionDialog(object): def setupUi(self, exceptionDialog): @@ -62,39 +64,23 @@ self.exceptionTextEdit.setReadOnly(True) self.exceptionTextEdit.setObjectName(u'exceptionTextEdit') self.exceptionLayout.addWidget(self.exceptionTextEdit) - self.exceptionButtonBox = QtGui.QDialogButtonBox(exceptionDialog) - self.exceptionButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) - self.exceptionButtonBox.setObjectName(u'exceptionButtonBox') - self.exceptionLayout.addWidget(self.exceptionButtonBox) - self.sendReportButton = QtGui.QPushButton(exceptionDialog) - self.sendReportButton.setIcon(build_icon( - u':/general/general_email.png')) - self.sendReportButton.setObjectName(u'sendReportButton') - self.exceptionButtonBox.addButton(self.sendReportButton, - QtGui.QDialogButtonBox.ActionRole) - self.saveReportButton = QtGui.QPushButton(exceptionDialog) - self.saveReportButton.setIcon(build_icon(u':/general/general_save.png')) - self.saveReportButton.setObjectName(u'saveReportButton') - self.exceptionButtonBox.addButton(self.saveReportButton, - QtGui.QDialogButtonBox.ActionRole) - self.attachFileButton = QtGui.QPushButton(exceptionDialog) - self.attachFileButton.setIcon(build_icon(u':/general/general_open.png')) - self.attachFileButton.setObjectName(u'attachFileButton') - self.exceptionButtonBox.addButton(self.attachFileButton, - QtGui.QDialogButtonBox.ActionRole) + self.sendReportButton = create_button(exceptionDialog, + u'sendReportButton', icon=u':/general/general_email.png', + click=self.onSendReportButtonClicked) + self.saveReportButton = create_button(exceptionDialog, + u'saveReportButton', icon=u':/general/general_save.png', + click=self.onSaveReportButtonClicked) + self.attachFileButton = create_button(exceptionDialog, + u'attachFileButton', icon=u':/general/general_open.png', + click=self.onAttachFileButtonClicked) + self.buttonBox = create_button_box(exceptionDialog, u'buttonBox', + [u'close'], [self.sendReportButton, self.saveReportButton, + self.attachFileButton]) + self.exceptionLayout.addWidget(self.buttonBox) self.retranslateUi(exceptionDialog) QtCore.QObject.connect(self.descriptionTextEdit, QtCore.SIGNAL(u'textChanged()'), self.onDescriptionUpdated) - QtCore.QObject.connect(self.exceptionButtonBox, - QtCore.SIGNAL(u'rejected()'), exceptionDialog.reject) - QtCore.QObject.connect(self.sendReportButton, - QtCore.SIGNAL(u'pressed()'), self.onSendReportButtonPressed) - QtCore.QObject.connect(self.saveReportButton, - QtCore.SIGNAL(u'pressed()'), self.onSaveReportButtonPressed) - QtCore.QObject.connect(self.attachFileButton, - QtCore.SIGNAL(u'pressed()'), self.onAttachFileButtonPressed) - QtCore.QMetaObject.connectSlotsByName(exceptionDialog) def retranslateUi(self, exceptionDialog): exceptionDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/core/ui/exceptionform.py openlp-1.9.10/openlp/core/ui/exceptionform.py --- openlp-1.9.9/openlp/core/ui/exceptionform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/exceptionform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -77,6 +78,8 @@ UNO_VERSION = node.getByName(u'ooSetupVersion') except ImportError: UNO_VERSION = u'-' +except: + UNO_VERSION = u'- (Possible non-standard UNO installation)' try: WEBKIT_VERSION = QtWebKit.qWebKitVersion() except AttributeError: @@ -133,7 +136,7 @@ system = system + u'Desktop: GNOME\n' return (openlp_version, description, traceback, system, libraries) - def onSaveReportButtonPressed(self): + def onSaveReportButtonClicked(self): """ Saving exception log and system informations to a file. """ @@ -169,7 +172,7 @@ finally: report_file.close() - def onSendReportButtonPressed(self): + def onSendReportButtonClicked(self): """ Opening systems default email client and inserting exception log and system informations. @@ -210,7 +213,7 @@ unicode(translate('OpenLP.ExceptionDialog', 'Description characters to enter : %s')) % count) - def onAttachFileButtonPressed(self): + def onAttachFileButtonClicked(self): files = QtGui.QFileDialog.getOpenFileName( self,translate('ImagePlugin.ExceptionDialog', 'Select Attachment'), diff -Nru openlp-1.9.9/openlp/core/ui/filerenamedialog.py openlp-1.9.10/openlp/core/ui/filerenamedialog.py --- openlp-1.9.9/openlp/core/ui/filerenamedialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/filerenamedialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,7 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import create_accept_reject_button_box +from openlp.core.lib.ui import create_button_box class Ui_FileRenameDialog(object): def setupUi(self, fileRenameDialog): @@ -44,11 +45,11 @@ QtCore.QRegExp(r'[^/\\?*|<>\[\]":+%]+'), self)) self.fileNameEdit.setObjectName(u'fileNameEdit') self.dialogLayout.addWidget(self.fileNameEdit, 0, 1) - self.buttonBox = create_accept_reject_button_box(fileRenameDialog, True) + self.buttonBox = create_button_box(fileRenameDialog, u'buttonBox', + [u'cancel', u'ok']) self.dialogLayout.addWidget(self.buttonBox, 1, 0, 1, 2) self.retranslateUi(fileRenameDialog) self.setMaximumHeight(self.sizeHint().height()) - QtCore.QMetaObject.connectSlotsByName(fileRenameDialog) def retranslateUi(self, fileRenameDialog): self.fileNameLabel.setText(translate('OpenLP.FileRenameForm', diff -Nru openlp-1.9.9/openlp/core/ui/filerenameform.py openlp-1.9.10/openlp/core/ui/filerenameform.py --- openlp-1.9.9/openlp/core/ui/filerenameform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/filerenameform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/core/ui/firsttimeform.py openlp-1.9.10/openlp/core/ui/firsttimeform.py --- openlp-1.9.9/openlp/core/ui/firsttimeform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/firsttimeform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -39,6 +40,7 @@ from openlp.core.lib import translate, PluginStatus, Receiver, build_icon, \ check_directory_exists +from openlp.core.lib.settings import Settings from openlp.core.utils import get_web_page, AppLocation from firsttimewizard import Ui_FirstTimeWizard, FirstTimePage @@ -56,6 +58,9 @@ themes = themes.split(u',') config = self.parent().config for theme in themes: + # Stop if the wizard has been cancelled. + if self.parent().downloadCancelled: + return title = config.get(u'theme_%s' % theme, u'title') filename = config.get(u'theme_%s' % theme, u'filename') screenshot = config.get(u'theme_%s' % theme, u'screenshot') @@ -86,7 +91,7 @@ files = self.webAccess.read() self.config.readfp(io.BytesIO(files)) self.updateScreenListCombo() - self.downloadCanceled = False + self.downloadCancelled = False self.downloading = unicode(translate('OpenLP.FirstTimeWizard', 'Downloading %s...')) QtCore.QObject.connect(self.cancelButton, QtCore.SIGNAL('clicked()'), @@ -113,7 +118,7 @@ check_directory_exists(os.path.join(gettempdir(), u'openlp')) self.noInternetFinishButton.setVisible(False) # Check if this is a re-run of the wizard. - self.hasRunWizard = QtCore.QSettings().value( + self.hasRunWizard = Settings().value( u'general/has run wizard', QtCore.QVariant(False)).toBool() # Sort out internet access for downloads if self.webAccess: @@ -183,7 +188,7 @@ """ Detects Page changes and updates as approprate. """ - # Keep track of the page we are at. Pressing "Cancel" causes pageId + # Keep track of the page we are at. Triggering "Cancel" causes pageId # to be a -1. if pageId != -1: self.lastId = pageId @@ -206,7 +211,7 @@ index = self.themeComboBox.findText(theme) if index == -1: self.themeComboBox.addItem(theme) - default_theme = unicode(QtCore.QSettings().value( + default_theme = unicode(Settings().value( u'themes/global theme', QtCore.QVariant(u'')).toString()) # Pre-select the current default theme. @@ -239,25 +244,26 @@ def onCancelButtonClicked(self): """ - Process the pressing of the cancel button. + Process the triggering of the cancel button. """ if self.lastId == FirstTimePage.NoInternet or \ - (self.lastId <= FirstTimePage.Plugins and \ - not self.hasRunWizard): + (self.lastId <= FirstTimePage.Plugins and not self.hasRunWizard): QtCore.QCoreApplication.exit() sys.exit() - self.downloadCanceled = True + self.downloadCancelled = True + while self.themeScreenshotThread.isRunning(): + time.sleep(0.1) Receiver.send_message(u'cursor_normal') def onNoInternetFinishButtonClicked(self): """ - Process the pressing of the "Finish" button on the No Internet page. + Process the triggering of the "Finish" button on the No Internet page. """ Receiver.send_message(u'cursor_busy') self._performWizard() Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'cursor_normal') - QtCore.QSettings().setValue(u'general/has run wizard', + Settings().setValue(u'general/has run wizard', QtCore.QVariant(True)) self.close() @@ -272,7 +278,7 @@ filesize = urlfile.headers["Content-Length"] filename = open(fpath, "wb") # Download until finished or canceled. - while not self.downloadCanceled: + while not self.downloadCancelled: data = urlfile.read(block_size) if not data: break @@ -280,8 +286,8 @@ block_count += 1 self._downloadProgress(block_count, block_size, filesize) filename.close() - # Delete file if canceled, it may be a partial file. - if self.downloadCanceled: + # Delete file if cancelled, it may be a partial file. + if self.downloadCancelled: os.remove(fpath) def _buildThemeScreenshots(self): @@ -456,16 +462,16 @@ os.path.join(themes_destination, theme)) # Set Default Display if self.displayComboBox.currentIndex() != -1: - QtCore.QSettings().setValue(u'General/monitor', + Settings().setValue(u'General/monitor', QtCore.QVariant(self.displayComboBox.currentIndex())) self.screens.set_current_display( self.displayComboBox.currentIndex()) # Set Global Theme if self.themeComboBox.currentIndex() != -1: - QtCore.QSettings().setValue(u'themes/global theme', + Settings().setValue(u'themes/global theme', QtCore.QVariant(self.themeComboBox.currentText())) def _setPluginStatus(self, field, tag): status = PluginStatus.Active if field.checkState() \ == QtCore.Qt.Checked else PluginStatus.Inactive - QtCore.QSettings().setValue(tag, QtCore.QVariant(status)) + Settings().setValue(tag, QtCore.QVariant(status)) diff -Nru openlp-1.9.9/openlp/core/ui/firsttimelanguagedialog.py openlp-1.9.10/openlp/core/ui/firsttimelanguagedialog.py --- openlp-1.9.9/openlp/core/ui/firsttimelanguagedialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/firsttimelanguagedialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,10 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import create_accept_reject_button_box +from openlp.core.lib.ui import create_button_box class Ui_FirstTimeLanguageDialog(object): def setupUi(self, languageDialog): @@ -52,12 +53,12 @@ self.languageComboBox.setObjectName("languageComboBox") self.languageLayout.addWidget(self.languageComboBox) self.dialogLayout.addLayout(self.languageLayout) - self.buttonBox = create_accept_reject_button_box(languageDialog, True) + self.buttonBox = create_button_box(languageDialog, u'buttonBox', + [u'cancel', u'ok']) self.dialogLayout.addWidget(self.buttonBox) self.retranslateUi(languageDialog) self.setMaximumHeight(self.sizeHint().height()) - QtCore.QMetaObject.connectSlotsByName(languageDialog) def retranslateUi(self, languageDialog): self.setWindowTitle(translate('OpenLP.FirstTimeLanguageForm', diff -Nru openlp-1.9.9/openlp/core/ui/firsttimelanguageform.py openlp-1.9.10/openlp/core/ui/firsttimelanguageform.py --- openlp-1.9.9/openlp/core/ui/firsttimelanguageform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/firsttimelanguageform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/core/ui/firsttimewizard.py openlp-1.9.10/openlp/core/ui/firsttimewizard.py --- openlp-1.9.9/openlp/core/ui/firsttimewizard.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/firsttimewizard.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -233,14 +234,14 @@ self.noInternetText = 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. Press the Finish button now to start ' + 'songs, Bibles and themes. Click the Finish button now to start ' 'OpenLP with initial settings and no sample data.\n\nTo re-run the ' 'First Time Wizard and import this sample data at a later time, ' 'check your Internet connection and re-run this wizard by ' 'selecting "Tools/Re-run First Time Wizard" from OpenLP.') self.cancelWizardText = translate('OpenLP.FirstTimeWizard', '\n\nTo cancel the First Time Wizard completely (and not start ' - 'OpenLP), press the Cancel button now.') + 'OpenLP), click the Cancel button now.') self.songsPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Sample Songs')) self.songsPage.setSubTitle(translate('OpenLP.FirstTimeWizard', @@ -263,5 +264,5 @@ 'Select default theme:')) self.progressLabel.setText(translate('OpenLP.FirstTimeWizard', 'Starting configuration process...')) - FirstTimeWizard.setButtonText(QtGui.QWizard.CustomButton1, + FirstTimeWizard.setButtonText(QtGui.QWizard.CustomButton1, translate('OpenLP.FirstTimeWizard', 'Finish')) diff -Nru openlp-1.9.9/openlp/core/ui/formattingtagdialog.py openlp-1.9.10/openlp/core/ui/formattingtagdialog.py --- openlp-1.9.9/openlp/core/ui/formattingtagdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/formattingtagdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,7 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import UiStrings +from openlp.core.lib.ui import UiStrings, create_button_box class Ui_FormattingTagDialog(object): @@ -112,13 +113,11 @@ self.savePushButton.setObjectName(u'savePushButton') self.dataGridLayout.addWidget(self.savePushButton, 4, 2, 1, 1) self.listdataGridLayout.addWidget(self.editGroupBox, 2, 0, 1, 1) - self.buttonBox = QtGui.QDialogButtonBox(formattingTagDialog) - self.buttonBox.setObjectName('formattingTagDialogButtonBox') - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) + self.buttonBox = create_button_box(formattingTagDialog, 'buttonBox', + [u'close']) self.listdataGridLayout.addWidget(self.buttonBox, 3, 0, 1, 1) self.retranslateUi(formattingTagDialog) - QtCore.QMetaObject.connectSlotsByName(formattingTagDialog) def retranslateUi(self, formattingTagDialog): formattingTagDialog.setWindowTitle(translate( diff -Nru openlp-1.9.9/openlp/core/ui/formattingtagform.py openlp-1.9.10/openlp/core/ui/formattingtagform.py --- openlp-1.9.9/openlp/core/ui/formattingtagform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/formattingtagform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -50,13 +51,21 @@ QtCore.QObject.connect(self.tagTableWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onRowSelected) QtCore.QObject.connect(self.newPushButton, - QtCore.SIGNAL(u'pressed()'), self.onNewPushed) + QtCore.SIGNAL(u'clicked()'), self.onNewClicked) QtCore.QObject.connect(self.savePushButton, - QtCore.SIGNAL(u'pressed()'), self.onSavedPushed) + QtCore.SIGNAL(u'clicked()'), self.onSavedClicked) QtCore.QObject.connect(self.deletePushButton, - QtCore.SIGNAL(u'pressed()'), self.onDeletePushed) + QtCore.SIGNAL(u'clicked()'), self.onDeleteClicked) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), self.close) + QtCore.QObject.connect(self.descriptionLineEdit, + QtCore.SIGNAL(u'textEdited(QString)'), self.onTextEdited) + QtCore.QObject.connect(self.tagLineEdit, + QtCore.SIGNAL(u'textEdited(QString)'), self.onTextEdited) + QtCore.QObject.connect(self.startTagLineEdit, + QtCore.SIGNAL(u'textEdited(QString)'), self.onTextEdited) + QtCore.QObject.connect(self.endTagLineEdit, + QtCore.SIGNAL(u'textEdited(QString)'), self.onTextEdited) # Forces reloading of tags from openlp configuration. FormattingTags.load_tags() @@ -65,7 +74,7 @@ Load Display and set field state. """ # Create initial copy from master - self._resetTable() + self._reloadTable() self.selected = -1 return QtGui.QDialog.exec_(self) @@ -73,9 +82,9 @@ """ Table Row selected so display items and set field state. """ - row = self.tagTableWidget.currentRow() - html = FormattingTags.html_expands[row] - self.selected = row + self.savePushButton.setEnabled(False) + self.selected = self.tagTableWidget.currentRow() + html = FormattingTags.get_html_tags()[self.selected] self.descriptionLineEdit.setText(html[u'desc']) self.tagLineEdit.setText(self._strip(html[u'start tag'])) self.startTagLineEdit.setText(html[u'start html']) @@ -85,21 +94,26 @@ self.tagLineEdit.setEnabled(False) self.startTagLineEdit.setEnabled(False) self.endTagLineEdit.setEnabled(False) - self.savePushButton.setEnabled(False) self.deletePushButton.setEnabled(False) else: self.descriptionLineEdit.setEnabled(True) self.tagLineEdit.setEnabled(True) self.startTagLineEdit.setEnabled(True) self.endTagLineEdit.setEnabled(True) - self.savePushButton.setEnabled(True) self.deletePushButton.setEnabled(True) - def onNewPushed(self): + def onTextEdited(self, text): + """ + Enable the ``savePushButton`` when any of the selected tag's properties + has been changed. + """ + self.savePushButton.setEnabled(True) + + def onNewClicked(self): """ Add a new tag to list only if it is not a duplicate. """ - for html in FormattingTags.html_expands: + for html in FormattingTags.get_html_tags(): if self._strip(html[u'start tag']) == u'n': critical_error_message_box( translate('OpenLP.FormattingTagForm', 'Update Error'), @@ -117,27 +131,29 @@ u'temporary': False } FormattingTags.add_html_tags([tag]) - self._resetTable() + FormattingTags.save_html_tags() + self._reloadTable() # Highlight new row self.tagTableWidget.selectRow(self.tagTableWidget.rowCount() - 1) self.onRowSelected() self.tagTableWidget.scrollToBottom() + #self.savePushButton.setEnabled(False) - def onDeletePushed(self): + def onDeleteClicked(self): """ Delete selected custom tag. """ if self.selected != -1: FormattingTags.remove_html_tag(self.selected) self.selected = -1 - self._resetTable() - FormattingTags.save_html_tags() + FormattingTags.save_html_tags() + self._reloadTable() - def onSavedPushed(self): + def onSavedClicked(self): """ Update Custom Tag details if not duplicate and save the data. """ - html_expands = FormattingTags.html_expands + html_expands = FormattingTags.get_html_tags() if self.selected != -1: html = html_expands[self.selected] tag = unicode(self.tagLineEdit.text()) @@ -157,10 +173,10 @@ # Keep temporary tags when the user changes one. html[u'temporary'] = False self.selected = -1 - self._resetTable() FormattingTags.save_html_tags() + self._reloadTable() - def _resetTable(self): + def _reloadTable(self): """ Reset List for loading. """ @@ -169,7 +185,7 @@ self.newPushButton.setEnabled(True) self.savePushButton.setEnabled(False) self.deletePushButton.setEnabled(False) - for linenumber, html in enumerate(FormattingTags.html_expands): + for linenumber, html in enumerate(FormattingTags.get_html_tags()): self.tagTableWidget.setRowCount(self.tagTableWidget.rowCount() + 1) self.tagTableWidget.setItem(linenumber, 0, QtGui.QTableWidgetItem(html[u'desc'])) diff -Nru openlp-1.9.9/openlp/core/ui/generaltab.py openlp-1.9.10/openlp/core/ui/generaltab.py --- openlp-1.9.9/openlp/core/ui/generaltab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/generaltab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -30,6 +31,7 @@ from openlp.core.lib import SettingsTab, Receiver, translate from openlp.core.lib.ui import UiStrings +from openlp.core.lib.settings import Settings from openlp.core.ui import ScreenList log = logging.getLogger(__name__) @@ -42,8 +44,8 @@ """ Initialise the general settings tab """ - self.screens = ScreenList.get_instance() - self.icon_path = u':/icon/openlp-logo-16x16.png' + self.screens = ScreenList() + self.iconPath = u':/icon/openlp-logo-16x16.png' generalTranslated = translate('OpenLP.GeneralTab', 'General') SettingsTab.__init__(self, parent, u'General', generalTranslated) @@ -65,42 +67,42 @@ self.monitorComboBox = QtGui.QComboBox(self.monitorGroupBox) self.monitorComboBox.setObjectName(u'monitorComboBox') self.monitorLayout.addWidget(self.monitorComboBox, 1, 1, 1, 4) - self.displayOnMonitorCheck = QtGui.QCheckBox(self.monitorGroupBox) - self.displayOnMonitorCheck.setObjectName(u'monitorComboBox') - self.monitorLayout.addWidget(self.displayOnMonitorCheck, 2, 1, 1, 4) # Display Position self.overrideRadioButton = QtGui.QRadioButton(self.monitorGroupBox) self.overrideRadioButton.setObjectName(u'overrideRadioButton') - self.monitorLayout.addWidget(self.overrideRadioButton, 3, 0, 1, 5) + self.monitorLayout.addWidget(self.overrideRadioButton, 2, 0, 1, 5) # Custom position self.customXLabel = QtGui.QLabel(self.monitorGroupBox) self.customXLabel.setObjectName(u'customXLabel') - self.monitorLayout.addWidget(self.customXLabel, 4, 1) + self.monitorLayout.addWidget(self.customXLabel, 3, 1) self.customXValueEdit = QtGui.QSpinBox(self.monitorGroupBox) self.customXValueEdit.setObjectName(u'customXValueEdit') self.customXValueEdit.setRange(-9999, 9999) - self.monitorLayout.addWidget(self.customXValueEdit, 5, 1) + self.monitorLayout.addWidget(self.customXValueEdit, 4, 1) self.customYLabel = QtGui.QLabel(self.monitorGroupBox) self.customYLabel.setObjectName(u'customYLabel') - self.monitorLayout.addWidget(self.customYLabel, 4, 2) + self.monitorLayout.addWidget(self.customYLabel, 3, 2) self.customYValueEdit = QtGui.QSpinBox(self.monitorGroupBox) self.customYValueEdit.setObjectName(u'customYValueEdit') self.customYValueEdit.setRange(-9999, 9999) - self.monitorLayout.addWidget(self.customYValueEdit, 5, 2) + self.monitorLayout.addWidget(self.customYValueEdit, 4, 2) self.customWidthLabel = QtGui.QLabel(self.monitorGroupBox) self.customWidthLabel.setObjectName(u'customWidthLabel') - self.monitorLayout.addWidget(self.customWidthLabel, 4, 3) + self.monitorLayout.addWidget(self.customWidthLabel, 3, 3) self.customWidthValueEdit = QtGui.QSpinBox(self.monitorGroupBox) self.customWidthValueEdit.setObjectName(u'customWidthValueEdit') self.customWidthValueEdit.setMaximum(9999) - self.monitorLayout.addWidget(self.customWidthValueEdit, 5, 3) + self.monitorLayout.addWidget(self.customWidthValueEdit, 4, 3) self.customHeightLabel = QtGui.QLabel(self.monitorGroupBox) self.customHeightLabel.setObjectName(u'customHeightLabel') - self.monitorLayout.addWidget(self.customHeightLabel, 4, 4) + self.monitorLayout.addWidget(self.customHeightLabel, 3, 4) self.customHeightValueEdit = QtGui.QSpinBox(self.monitorGroupBox) self.customHeightValueEdit.setObjectName(u'customHeightValueEdit') self.customHeightValueEdit.setMaximum(9999) - self.monitorLayout.addWidget(self.customHeightValueEdit, 5, 4) + self.monitorLayout.addWidget(self.customHeightValueEdit, 4, 4) + self.displayOnMonitorCheck = QtGui.QCheckBox(self.monitorGroupBox) + self.displayOnMonitorCheck.setObjectName(u'monitorComboBox') + self.monitorLayout.addWidget(self.displayOnMonitorCheck, 5, 0, 1, 5) # Set up the stretchiness of each column, so that the first column # less stretchy (and therefore smaller) than the others self.monitorLayout.setColumnStretch(0, 1) @@ -265,7 +267,7 @@ """ Load the settings to populate the form """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) self.monitorComboBox.clear() self.monitorComboBox.addItems(self.screens.get_screen_list()) @@ -314,8 +316,6 @@ u'audio repeat list', QtCore.QVariant(False)).toBool()) settings.endGroup() self.monitorComboBox.setDisabled(self.overrideRadioButton.isChecked()) - self.displayOnMonitorCheck.setDisabled( - self.overrideRadioButton.isChecked()) self.customXValueEdit.setEnabled(self.overrideRadioButton.isChecked()) self.customYValueEdit.setEnabled(self.overrideRadioButton.isChecked()) self.customHeightValueEdit.setEnabled( @@ -329,7 +329,7 @@ """ Save the settings from the form """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) settings.setValue(u'monitor', QtCore.QVariant(self.monitorComboBox.currentIndex())) @@ -408,7 +408,6 @@ The state of the check box (boolean). """ self.monitorComboBox.setDisabled(checked) - self.displayOnMonitorCheck.setDisabled(checked) self.customXValueEdit.setEnabled(checked) self.customYValueEdit.setEnabled(checked) self.customHeightValueEdit.setEnabled(checked) diff -Nru openlp-1.9.9/openlp/core/ui/__init__.py openlp-1.9.10/openlp/core/ui/__init__.py --- openlp-1.9.9/openlp/core/ui/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/core/ui/maindisplay.py openlp-1.9.10/openlp/core/ui/maindisplay.py --- openlp-1.9.9/openlp/core/ui/maindisplay.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/maindisplay.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -38,6 +39,7 @@ from openlp.core.lib import Receiver, build_html, ServiceItem, image_to_byte, \ translate, PluginManager, expand_tags from openlp.core.lib.theme import BackgroundType +from openlp.core.lib.settings import Settings from openlp.core.ui import HideMode, ScreenList, AlertLocation @@ -100,9 +102,8 @@ self.frame.setScrollBarPolicy(QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff) - def resizeEvent(self, ev): - self.webView.setGeometry(0, 0, - self.width(), self.height()) + def resizeEvent(self, event): + self.webView.setGeometry(0, 0, self.width(), self.height()) def isWebLoaded(self): """ @@ -119,8 +120,7 @@ def __init__(self, parent, imageManager, live, controller): Display.__init__(self, parent, live, controller) self.imageManager = imageManager - self.screens = ScreenList.get_instance() - self.plugins = PluginManager.get_instance().plugins + self.screens = ScreenList() self.rebuildCSS = False self.hideMode = None self.override = {} @@ -131,10 +131,11 @@ else: self.audioPlayer = None self.firstTime = True + self.webLoaded = True self.setStyleSheet(u'border: 0px; margin: 0px; padding: 0px;') windowFlags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Tool | \ - QtCore.Qt.WindowStaysOnTopHint - if QtCore.QSettings().value(u'advanced/x11 bypass wm', + QtCore.Qt.WindowStaysOnTopHint + if Settings().value(u'advanced/x11 bypass wm', QtCore.QVariant(True)).toBool(): windowFlags |= QtCore.Qt.X11BypassWindowManagerHint # FIXME: QtCore.Qt.SplashScreen is workaround to make display screen @@ -195,15 +196,15 @@ Display.setup(self) if self.isLive: # Build the initial frame. - image_file = QtCore.QSettings().value(u'advanced/default image', - QtCore.QVariant(u':/graphics/openlp-splash-screen.png'))\ - .toString() background_color = QtGui.QColor() - background_color.setNamedColor(QtCore.QSettings().value( + background_color.setNamedColor(Settings().value( u'advanced/default color', QtCore.QVariant(u'#ffffff')).toString()) if not background_color.isValid(): background_color = QtCore.Qt.white + image_file = Settings().value(u'advanced/default image', + QtCore.QVariant(u':/graphics/openlp-splash-screen.png'))\ + .toString() splash_image = QtGui.QImage(image_file) self.initialFrame = QtGui.QImage( self.screen[u'size'].width(), @@ -221,11 +222,6 @@ self.webView.setHtml(build_html(serviceItem, self.screen, self.isLive, None, plugins=self.plugins)) self.__hideMouse() - # To display or not to display? - if not self.screen[u'primary']: - self.primary = False - else: - self.primary = True log.debug(u'Finished MainDisplay setup') def text(self, slide): @@ -253,10 +249,10 @@ log.debug(u'alert to display') # First we convert <>& marks to html variants, then apply # formattingtags, finally we double all backslashes for JavaScript. - text_prepared = expand_tags(cgi.escape(text)) \ - .replace(u'\\', u'\\\\').replace(u'\"', u'\\\"') - if self.height() != self.screen[u'size'].height() or \ - not self.isVisible(): + text_prepared = expand_tags( + cgi.escape(text)).replace(u'\\', u'\\\\').replace(u'\"', u'\\\"') + if self.height() != self.screen[u'size'].height() or not \ + self.isVisible(): shrink = True js = u'show_alert("%s", "%s")' % (text_prepared, u'top') else: @@ -282,7 +278,7 @@ """ API for replacement backgrounds so Images are added directly to cache. """ - self.imageManager.add_image(name, path, u'image', background) + self.imageManager.addImage(name, path, u'image', background) if hasattr(self, u'serviceItem'): self.override[u'image'] = name self.override[u'theme'] = self.serviceItem.themedata.theme_name @@ -295,14 +291,14 @@ def image(self, name): """ - Add an image as the background. The image has already been added - to the cache. + Add an image as the background. The image has already been added to the + cache. - ``Image`` + ``name`` The name of the image to be displayed. """ log.debug(u'image to display') - image = self.imageManager.get_image_bytes(name) + image = self.imageManager.getImageBytes(name) self.controller.mediaController.video_reset(self.controller) self.displayImage(image) @@ -336,7 +332,7 @@ """ log.debug(u'preview for %s', self.isLive) Receiver.send_message(u'openlp_process_events') - # We must have a service item to preview + # We must have a service item to preview. if self.isLive and hasattr(self, u'serviceItem'): # Wait for the fade to finish before geting the preview. # Important otherwise preview will have incorrect text if at all! @@ -345,7 +341,7 @@ while self.frame.evaluateJavaScript(u'show_text_complete()') \ .toString() == u'false': Receiver.send_message(u'openlp_process_events') - # Wait for the webview to update before geting the preview. + # Wait for the webview to update before getting the preview. # Important otherwise first preview will miss the background ! while not self.webLoaded: Receiver.send_message(u'openlp_process_events') @@ -356,8 +352,8 @@ else: # Single screen active if self.screens.display_count == 1: - # Only make visible if setting enabled - if QtCore.QSettings().value(u'general/display on monitor', + # Only make visible if setting enabled. + if Settings().value(u'general/display on monitor', QtCore.QVariant(True)).toBool(): self.setVisible(True) else: @@ -374,9 +370,9 @@ self.initialFrame = None self.serviceItem = serviceItem background = None - # We have an image override so keep the image till the theme changes + # We have an image override so keep the image till the theme changes. if self.override: - # We have an video override so allow it to be stopped + # We have an video override so allow it to be stopped. if u'video' in self.override: Receiver.send_message(u'video_background_replaced') self.override = {} @@ -387,14 +383,14 @@ else: # replace the background background = self.imageManager. \ - get_image_bytes(self.override[u'image']) + getImageBytes(self.override[u'image']) self.setTransparency(self.serviceItem.themedata.background_type == BackgroundType.to_string(BackgroundType.Transparent)) if self.serviceItem.themedata.background_filename: self.serviceItem.bg_image_bytes = self.imageManager. \ - get_image_bytes(self.serviceItem.themedata.theme_name) + getImageBytes(self.serviceItem.themedata.theme_name) if image: - image_bytes = self.imageManager.get_image_bytes(image) + image_bytes = self.imageManager.getImageBytes(image) else: image_bytes = None html = build_html(self.serviceItem, self.screen, self.isLive, @@ -406,7 +402,7 @@ self.footer(serviceItem.foot_text) # if was hidden keep it hidden if self.hideMode and self.isLive and not serviceItem.is_media(): - if QtCore.QSettings().value(u'general/auto unblank', + if Settings().value(u'general/auto unblank', QtCore.QVariant(False)).toBool(): Receiver.send_message(u'slidecontroller_live_unblank') else: @@ -429,8 +425,8 @@ """ log.debug(u'hideDisplay mode = %d', mode) if self.screens.display_count == 1: - # Only make visible if setting enabled - if not QtCore.QSettings().value(u'general/display on monitor', + # Only make visible if setting enabled. + if not Settings().value(u'general/display on monitor', QtCore.QVariant(True)).toBool(): return if mode == HideMode.Screen: @@ -454,21 +450,23 @@ """ log.debug(u'showDisplay') if self.screens.display_count == 1: - # Only make visible if setting enabled - if not QtCore.QSettings().value(u'general/display on monitor', + # Only make visible if setting enabled. + if not Settings().value(u'general/display on monitor', QtCore.QVariant(True)).toBool(): return self.frame.evaluateJavaScript('show_blank("show");') if self.isHidden(): self.setVisible(True) self.hideMode = None - # Trigger actions when display is active again + # Trigger actions when display is active again. if self.isLive: Receiver.send_message(u'live_display_active') def __hideMouse(self): - # Hide mouse cursor when moved over display if enabled in settings - if QtCore.QSettings().value(u'advanced/hide mouse', + """ + Hide mouse cursor when moved over display. + """ + if Settings().value(u'advanced/hide mouse', QtCore.QVariant(False)).toBool(): self.setCursor(QtCore.Qt.BlankCursor) self.frame.evaluateJavaScript('document.body.style.cursor = "none"') @@ -569,13 +567,12 @@ """ Add another file to the playlist. - ``filename`` - The file to add to the playlist. + ``filenames`` + A list with files to be added to the playlist. """ if not isinstance(filenames, list): filenames = [filenames] - for filename in filenames: - self.playlist.append(Phonon.MediaSource(filename)) + self.playlist.extend(map(Phonon.MediaSource, filenames)) def next(self): if not self.repeat and self.currentIndex + 1 == len(self.playlist): diff -Nru openlp-1.9.9/openlp/core/ui/mainwindow.py openlp-1.9.10/openlp/core/ui/mainwindow.py --- openlp-1.9.9/openlp/core/ui/mainwindow.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/mainwindow.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -29,7 +30,10 @@ import os import sys import shutil +from distutils import dir_util +from distutils.errors import DistutilsFileError from tempfile import gettempdir +import time from datetime import datetime from PyQt4 import QtCore, QtGui @@ -37,6 +41,7 @@ from openlp.core.lib import Renderer, build_icon, OpenLPDockWidget, \ PluginManager, Receiver, translate, ImageManager, PluginStatus from openlp.core.lib.ui import UiStrings, create_action +from openlp.core.lib.settings import Settings from openlp.core.lib import SlideLimits from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \ ThemeManager, SlideController, PluginForm, MediaDockManager, \ @@ -99,12 +104,12 @@ # Create slide controllers self.previewController = SlideController(self) self.liveController = SlideController(self, True) - previewVisible = QtCore.QSettings().value( + previewVisible = Settings().value( u'user interface/preview panel', QtCore.QVariant(True)).toBool() self.previewController.panel.setVisible(previewVisible) - liveVisible = QtCore.QSettings().value(u'user interface/live panel', + liveVisible = Settings().value(u'user interface/live panel', QtCore.QVariant(True)).toBool() - panelLocked = QtCore.QSettings().value(u'user interface/lock panel', + panelLocked = Settings().value(u'user interface/lock panel', QtCore.QVariant(False)).toBool() self.liveController.panel.setVisible(liveVisible) # Create menu @@ -372,7 +377,6 @@ # Connect up some signals and slots QtCore.QObject.connect(self.fileMenu, QtCore.SIGNAL(u'aboutToShow()'), self.updateRecentFilesMenu) - QtCore.QMetaObject.connectSlotsByName(mainWindow) # Hide the entry, as it does not have any functionality yet. self.toolsAddToolItem.setVisible(False) self.importLanguageItem.setVisible(False) @@ -543,21 +547,22 @@ """ log.info(u'MainWindow loaded') - def __init__(self, clipboard, arguments): + def __init__(self, application): """ This constructor sets up the interface, the various managers, and the plugins. """ QtGui.QMainWindow.__init__(self) - self.clipboard = clipboard - self.arguments = arguments + self.application = application + self.clipboard = self.application.clipboard() + self.arguments = self.application.args # Set up settings sections for the main application # (not for use by plugins) self.uiSettingsSection = u'user interface' self.generalSettingsSection = u'general' - self.advancedlSettingsSection = u'advanced' + self.advancedSettingsSection = u'advanced' self.shortcutsSettingsSection = u'shortcuts' - self.servicemanagerSettingsSection = u'servicemanager' + self.serviceManagerSettingsSection = u'servicemanager' self.songsSettingsSection = u'songs' self.themesSettingsSection = u'themes' self.displayTagsSection = u'displayTags' @@ -569,8 +574,8 @@ self.shortcutForm = ShortcutListForm(self) self.recentFiles = QtCore.QStringList() # Set up the path with plugins - pluginpath = AppLocation.get_directory(AppLocation.PluginsDir) - self.pluginManager = PluginManager(pluginpath) + plugin_path = AppLocation.get_directory(AppLocation.PluginsDir) + self.pluginManager = PluginManager(plugin_path) self.pluginHelpers = {} self.imageManager = ImageManager() self.mediaController = MediaController(self) @@ -581,6 +586,8 @@ # Once settings are loaded update the menu with the recent files. self.updateRecentFilesMenu() self.pluginForm = PluginForm(self) + self.newDataPath = u'' + self.copyData = False # Set up signals and slots QtCore.QObject.connect(self.importThemeItem, QtCore.SIGNAL(u'triggered()'), @@ -633,6 +640,8 @@ QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mainwindow_status_text'), self.showStatusMessage) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'cleanup'), self.cleanUp) # Media Manager QtCore.QObject.connect(self.mediaToolBox, QtCore.SIGNAL(u'currentChanged(int)'), self.onMediaToolBoxChanged) @@ -645,6 +654,10 @@ QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_information_message'), self.onInformationMessage) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'set_new_data_path'), self.setNewDataPath) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'set_copy_data'), self.setCopyData) # warning cyclic dependency # renderer needs to call ThemeManager and # ThemeManager needs to call Renderer @@ -662,7 +675,7 @@ self.pluginHelpers[u'pluginmanager'] = self.pluginManager self.pluginHelpers[u'formparent'] = self self.pluginHelpers[u'mediacontroller'] = self.mediaController - self.pluginManager.find_plugins(pluginpath, self.pluginHelpers) + self.pluginManager.find_plugins(plugin_path, self.pluginHelpers) # hook methods have to happen after find_plugins. Find plugins needs # the controllers hence the hooks have moved from setupUI() to here # Find and insert settings tabs @@ -685,9 +698,9 @@ self.previewController.screenSizeChanged() self.liveController.screenSizeChanged() log.info(u'Load data from Settings') - if QtCore.QSettings().value(u'advanced/save current plugin', + if Settings().value(u'advanced/save current plugin', QtCore.QVariant(False)).toBool(): - savedPlugin = QtCore.QSettings().value( + savedPlugin = Settings().value( u'advanced/current media plugin', QtCore.QVariant()).toInt()[0] if savedPlugin != -1: self.mediaToolBox.setCurrentIndex(savedPlugin) @@ -731,7 +744,7 @@ if self.liveController.display.isVisible(): self.liveController.display.setFocus() self.activateWindow() - if len(self.arguments): + if self.arguments: args = [] for a in self.arguments: args.extend([a]) @@ -739,11 +752,11 @@ if not isinstance(filename, unicode): filename = unicode(filename, sys.getfilesystemencoding()) self.serviceManagerContents.loadFile(filename) - elif QtCore.QSettings().value( + elif Settings().value( self.generalSettingsSection + u'/auto open', QtCore.QVariant(False)).toBool(): self.serviceManagerContents.loadLastFile() - view_mode = QtCore.QSettings().value(u'%s/view mode' % \ + view_mode = Settings().value(u'%s/view mode' % \ self.generalSettingsSection, u'default').toString() if view_mode == u'default': self.modeDefaultItem.setChecked(True) @@ -796,7 +809,7 @@ if answer == QtGui.QMessageBox.No: return Receiver.send_message(u'cursor_busy') - screens = ScreenList.get_instance() + screens = ScreenList() FirstTimeForm(screens, self).exec_() self.firstTime() for plugin in self.pluginManager.plugins: @@ -821,7 +834,7 @@ """ Check and display message if screen blank on setup. """ - settings = QtCore.QSettings() + settings = Settings() self.liveController.mainDisplaySetBackground() if settings.value(u'%s/screen blank' % self.generalSettingsSection, QtCore.QVariant(False)).toBool(): @@ -831,7 +844,7 @@ translate('OpenLP.MainWindow', 'OpenLP Main Display Blanked'), translate('OpenLP.MainWindow', - 'The Main Display has been blanked out')) + 'The Main Display has been blanked out')) def onErrorMessage(self, data): Receiver.send_message(u'close_splash') @@ -945,19 +958,19 @@ setting_sections = [] # Add main sections. setting_sections.extend([self.generalSettingsSection]) - setting_sections.extend([self.advancedlSettingsSection]) + setting_sections.extend([self.advancedSettingsSection]) setting_sections.extend([self.uiSettingsSection]) setting_sections.extend([self.shortcutsSettingsSection]) - setting_sections.extend([self.servicemanagerSettingsSection]) + setting_sections.extend([self.serviceManagerSettingsSection]) setting_sections.extend([self.themesSettingsSection]) setting_sections.extend([self.displayTagsSection]) setting_sections.extend([self.headerSection]) # Add plugin sections. for plugin in self.pluginManager.plugins: setting_sections.extend([plugin.name]) - settings = QtCore.QSettings() - import_settings = QtCore.QSettings(import_file_name, - QtCore.QSettings.IniFormat) + settings = Settings() + import_settings = Settings(import_file_name, + Settings.IniFormat) import_keys = import_settings.allKeys() for section_key in import_keys: # We need to handle the really bad files. @@ -986,11 +999,11 @@ # We have a good file, import it. for section_key in import_keys: value = import_settings.value(section_key) - settings.setValue(u'%s' % (section_key) , + settings.setValue(u'%s' % (section_key), QtCore.QVariant(value)) now = datetime.now() settings.beginGroup(self.headerSection) - settings.setValue( u'file_imported' , QtCore.QVariant(import_file_name)) + settings.setValue(u'file_imported', QtCore.QVariant(import_file_name)) settings.setValue(u'file_date_imported', now.strftime("%Y-%m-%d %H:%M")) settings.endGroup() @@ -1019,7 +1032,7 @@ 'OpenLP Export Settings File (*.conf)'))) if not export_file_name: return - # Make sure it's a .conf file. + # Make sure it's a .conf file. if not export_file_name.endswith(u'conf'): export_file_name = export_file_name + u'.conf' temp_file = os.path.join(unicode(gettempdir()), @@ -1028,10 +1041,10 @@ setting_sections = [] # Add main sections. setting_sections.extend([self.generalSettingsSection]) - setting_sections.extend([self.advancedlSettingsSection]) + setting_sections.extend([self.advancedSettingsSection]) setting_sections.extend([self.uiSettingsSection]) setting_sections.extend([self.shortcutsSettingsSection]) - setting_sections.extend([self.servicemanagerSettingsSection]) + setting_sections.extend([self.serviceManagerSettingsSection]) setting_sections.extend([self.themesSettingsSection]) setting_sections.extend([self.displayTagsSection]) # Add plugin sections. @@ -1042,12 +1055,12 @@ os.remove(temp_file) if os.path.exists(export_file_name): os.remove(export_file_name) - settings = QtCore.QSettings() + settings = Settings() settings.remove(self.headerSection) # Get the settings. keys = settings.allKeys() - export_settings = QtCore.QSettings(temp_file, - QtCore.QSettings.IniFormat) + export_settings = Settings(temp_file, + Settings.IniFormat) # Add a header section. # This is to insure it's our conf file for import. now = datetime.now() @@ -1105,7 +1118,7 @@ Set OpenLP to a different view mode. """ if mode: - settings = QtCore.QSettings() + settings = Settings() settings.setValue(u'%s/view mode' % self.generalSettingsSection, mode) self.mediaManagerDock.setVisible(media) @@ -1121,7 +1134,7 @@ """ log.debug(u'screenChanged') Receiver.send_message(u'cursor_busy') - self.imageManager.update_display() + self.imageManager.updateDisplay() self.renderer.update_display() self.previewController.screenSizeChanged() self.liveController.screenSizeChanged() @@ -1133,8 +1146,14 @@ """ Hook to close the main window and display windows on exit """ + # The MainApplication did not even enter the event loop (this happens + # when OpenLP is not fully loaded). Just ignore the event. + if not self.application.eventLoopIsActive: + event.ignore() + return # If we just did a settings import, close without saving changes. if self.settingsImported: + self.cleanUp(False) event.accept() if self.serviceManagerContents.isModified(): ret = self.serviceManagerContents.saveModifiedService() @@ -1150,15 +1169,14 @@ else: event.ignore() else: - if QtCore.QSettings().value(u'advanced/enable exit confirmation', + if Settings().value(u'advanced/enable exit confirmation', QtCore.QVariant(True)).toBool(): ret = QtGui.QMessageBox.question(self, translate('OpenLP.MainWindow', 'Close OpenLP'), translate('OpenLP.MainWindow', 'Are you sure you want to close OpenLP?'), QtGui.QMessageBox.StandardButtons( - QtGui.QMessageBox.Yes | - QtGui.QMessageBox.No), + QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.Yes) if ret == QtGui.QMessageBox.Yes: self.cleanUp() @@ -1169,23 +1187,38 @@ self.cleanUp() event.accept() - def cleanUp(self): + def cleanUp(self, save_settings=True): """ - Runs all the cleanup code before OpenLP shuts down + Runs all the cleanup code before OpenLP shuts down. + + ``save_settings`` + Switch to prevent saving settings. Defaults to **True**. """ + self.imageManager.stopManager = True + while self.imageManager.imageThread.isRunning(): + time.sleep(0.1) # Clean temporary files used by services self.serviceManagerContents.cleanUp() - if QtCore.QSettings().value(u'advanced/save current plugin', - QtCore.QVariant(False)).toBool(): - QtCore.QSettings().setValue(u'advanced/current media plugin', - QtCore.QVariant(self.mediaToolBox.currentIndex())) + if save_settings: + if Settings().value(u'advanced/save current plugin', + QtCore.QVariant(False)).toBool(): + Settings().setValue(u'advanced/current media plugin', + QtCore.QVariant(self.mediaToolBox.currentIndex())) # Call the cleanup method to shutdown plugins. log.info(u'cleanup plugins') self.pluginManager.finalise_plugins() - # Save settings - self.saveSettings() + if save_settings: + # Save settings + self.saveSettings() + # Check if we need to change the data directory + if self.newDataPath: + self.changeDataDirectory() # Close down the display - self.liveController.display.close() + if self.liveController.display: + self.liveController.display.close() + self.liveController.display = None + # Allow the main process to exit + self.application = None def serviceChanged(self, reset=False, serviceName=None): """ @@ -1255,7 +1288,7 @@ False - Hidden """ self.previewController.panel.setVisible(visible) - QtCore.QSettings().setValue(u'user interface/preview panel', + Settings().setValue(u'user interface/preview panel', QtCore.QVariant(visible)) self.viewPreviewPanel.setChecked(visible) @@ -1287,7 +1320,7 @@ self.viewThemeManagerItem.setEnabled(True) self.viewPreviewPanel.setEnabled(True) self.viewLivePanel.setEnabled(True) - QtCore.QSettings().setValue(u'user interface/lock panel', + Settings().setValue(u'user interface/lock panel', QtCore.QVariant(lock)) def setLivePanelVisibility(self, visible): @@ -1301,7 +1334,7 @@ False - Hidden """ self.liveController.panel.setVisible(visible) - QtCore.QSettings().setValue(u'user interface/live panel', + Settings().setValue(u'user interface/live panel', QtCore.QVariant(visible)) self.viewLivePanel.setChecked(visible) @@ -1311,19 +1344,19 @@ """ log.debug(u'Loading QSettings') # Migrate Wrap Settings to Slide Limits Settings - if QtCore.QSettings().contains(self.generalSettingsSection + + if Settings().contains(self.generalSettingsSection + u'/enable slide loop'): - if QtCore.QSettings().value(self.generalSettingsSection + + if Settings().value(self.generalSettingsSection + u'/enable slide loop', QtCore.QVariant(True)).toBool(): - QtCore.QSettings().setValue(self.advancedlSettingsSection + + Settings().setValue(self.advancedSettingsSection + u'/slide limits', QtCore.QVariant(SlideLimits.Wrap)) else: - QtCore.QSettings().setValue(self.advancedlSettingsSection + + Settings().setValue(self.advancedSettingsSection + u'/slide limits', QtCore.QVariant(SlideLimits.End)) - QtCore.QSettings().remove(self.generalSettingsSection + + Settings().remove(self.generalSettingsSection + u'/enable slide loop') Receiver.send_message(u'slidecontroller_update_slide_limits') - settings = QtCore.QSettings() + settings = Settings() # Remove obsolete entries. settings.remove(u'custom slide') settings.remove(u'service') @@ -1352,7 +1385,7 @@ if self.settingsImported: return log.debug(u'Saving QSettings') - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.generalSettingsSection) recentFiles = QtCore.QVariant(self.recentFiles) \ if self.recentFiles else QtCore.QVariant() @@ -1378,7 +1411,7 @@ Updates the recent file menu with the latest list of service files accessed. """ - recentFileCount = QtCore.QSettings().value( + recentFileCount = Settings().value( u'advanced/recent file count', QtCore.QVariant(4)).toInt()[0] existingRecentFiles = [recentFile for recentFile in self.recentFiles if os.path.isfile(unicode(recentFile))] @@ -1411,7 +1444,7 @@ # The maxRecentFiles value does not have an interface and so never gets # actually stored in the settings therefore the default value of 20 will # always be used. - maxRecentFiles = QtCore.QSettings().value(u'advanced/max recent files', + maxRecentFiles = Settings().value(u'advanced/max recent files', QtCore.QVariant(20)).toInt()[0] if filename: # Add some cleanup to reduce duplication in the recent file list @@ -1458,3 +1491,45 @@ self.timer_id = 0 self.loadProgressBar.hide() Receiver.send_message(u'openlp_process_events') + + def setNewDataPath(self, new_data_path): + self.newDataPath = new_data_path + + def setCopyData(self, copy_data): + self.copyData = copy_data + + def changeDataDirectory(self): + log.info(u'Changing data path to %s' % self.newDataPath ) + old_data_path = unicode(AppLocation.get_data_path()) + # Copy OpenLP data to new location if requested. + if self.copyData: + log.info(u'Copying data to new path') + try: + Receiver.send_message(u'openlp_process_events') + Receiver.send_message(u'cursor_busy') + self.showStatusMessage( + translate('OpenLP.MainWindow', + 'Copying OpenLP data to new data directory location - %s ' + '- Please wait for copy to finish' + % self.newDataPath)) + dir_util.copy_tree(old_data_path, self.newDataPath) + log.info(u'Copy sucessful') + except (IOError, os.error, DistutilsFileError), why: + Receiver.send_message(u'cursor_normal') + log.exception(u'Data copy failed %s' % unicode(why)) + QtGui.QMessageBox.critical(self, + translate('OpenLP.MainWindow', 'New Data Directory Error'), + translate('OpenLP.MainWindow', + 'OpenLP Data directory copy failed\n\n%s' + % unicode(why)), + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Ok)) + return False + else: + log.info(u'No data copy requested') + # Change the location of data directory in config file. + settings = QtCore.QSettings() + settings.setValue(u'advanced/data path', self.newDataPath) + # Check if the new data path is our default. + if self.newDataPath == AppLocation.get_directory(AppLocation.DataDir): + settings.remove(u'advanced/data path') diff -Nru openlp-1.9.9/openlp/core/ui/media/__init__.py openlp-1.9.10/openlp/core/ui/media/__init__.py --- openlp-1.9.9/openlp/core/ui/media/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/media/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -26,6 +27,8 @@ ############################################################################### import logging +from openlp.core.lib.settings import Settings + from PyQt4 import QtCore log = logging.getLogger(__name__) @@ -69,19 +72,20 @@ def get_media_players(): """ This method extract the configured media players and overridden player from - the settings + the settings. ``players_list`` - this is a python list with all active media players + A list with all active media players. + ``overridden_player`` - here an special media player is choosen for all media actions + Here an special media player is chosen for all media actions. """ log.debug(u'get_media_players') - players = unicode(QtCore.QSettings().value(u'media/players').toString()) + players = unicode(Settings().value(u'media/players').toString()) if not players: players = u'webkit' reg_ex = QtCore.QRegExp(".*\[(.*)\].*") - if QtCore.QSettings().value(u'media/override player', + if Settings().value(u'media/override player', QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0] == QtCore.Qt.Checked: if reg_ex.exactMatch(players): overridden_player = u'%s' % reg_ex.cap(1) @@ -92,22 +96,24 @@ players_list = players.replace(u'[', u'').replace(u']', u'').split(u',') return players_list, overridden_player + def set_media_players(players_list, overridden_player=u'auto'): """ This method saves the configured media players and overridden player to the settings ``players_list`` - this is a python list with all active media players + A list with all active media players. + ``overridden_player`` - here an special media player is choosen for all media actions + Here an special media player is chosen for all media actions. """ log.debug(u'set_media_players') players = u','.join(players_list) - if QtCore.QSettings().value(u'media/override player', + if Settings().value(u'media/override player', QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0] == \ QtCore.Qt.Checked and overridden_player != u'auto': players = players.replace(overridden_player, u'[%s]' % overridden_player) - QtCore.QSettings().setValue(u'media/players', QtCore.QVariant(players)) + Settings().setValue(u'media/players', QtCore.QVariant(players)) from mediacontroller import MediaController diff -Nru openlp-1.9.9/openlp/core/ui/media/mediacontroller.py openlp-1.9.10/openlp/core/ui/media/mediacontroller.py --- openlp-1.9.9/openlp/core/ui/media/mediacontroller.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/media/mediacontroller.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -30,6 +31,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, Receiver, translate +from openlp.core.lib.settings import Settings from openlp.core.lib.mediaplayer import MediaPlayer from openlp.core.lib.ui import critical_error_message_box from openlp.core.ui.media import MediaState, MediaInfo, MediaType, \ @@ -84,10 +86,7 @@ def set_active_players(self): savedPlayers = get_media_players()[0] for player in self.mediaPlayers.keys(): - if player in savedPlayers: - self.mediaPlayers[player].isActive = True - else: - self.mediaPlayers[player].isActive = False + self.mediaPlayers[player].isActive = player in savedPlayers def register_controllers(self, controller): """ @@ -106,8 +105,8 @@ AppLocation.get_directory(AppLocation.AppDir), u'core', u'ui', u'media') for filename in os.listdir(controller_dir): - if filename.endswith(u'player.py') and \ - not filename == 'media_player.py': + if filename.endswith(u'player.py') and not \ + filename == 'media_player.py': path = os.path.join(controller_dir, filename) if os.path.isfile(path): modulename = u'openlp.core.ui.media.' + \ @@ -122,38 +121,36 @@ for controller_class in controller_classes: controller = controller_class(self) self.register_controllers(controller) - if self.mediaPlayers: - savedPlayers, overriddenPlayer = get_media_players() - invalidMediaPlayers = [mediaPlayer for mediaPlayer in savedPlayers \ - if not mediaPlayer in self.mediaPlayers or \ - not self.mediaPlayers[mediaPlayer].check_available()] - if len(invalidMediaPlayers) > 0: - for invalidPlayer in invalidMediaPlayers: - savedPlayers.remove(invalidPlayer) - set_media_players(savedPlayers, overriddenPlayer) - self.set_active_players() - return True - else: + if not self.mediaPlayers: return False + savedPlayers, overriddenPlayer = get_media_players() + invalidMediaPlayers = [mediaPlayer for mediaPlayer in savedPlayers + if not mediaPlayer in self.mediaPlayers or not + self.mediaPlayers[mediaPlayer].check_available()] + if invalidMediaPlayers: + for invalidPlayer in invalidMediaPlayers: + savedPlayers.remove(invalidPlayer) + set_media_players(savedPlayers, overriddenPlayer) + self.set_active_players() + return True def video_state(self): """ Check if there is a running media Player and do updating stuff (e.g. update the UI) """ - if len(self.curDisplayMediaPlayer.keys()) == 0: + if not self.curDisplayMediaPlayer.keys(): self.timer.stop() else: for display in self.curDisplayMediaPlayer.keys(): self.curDisplayMediaPlayer[display].resize(display) self.curDisplayMediaPlayer[display].update_ui(display) - if self.curDisplayMediaPlayer[display] \ - .state == MediaState.Playing: + if self.curDisplayMediaPlayer[display].state == \ + MediaState.Playing: return # no players are active anymore for display in self.curDisplayMediaPlayer.keys(): - if self.curDisplayMediaPlayer[display] \ - .state != MediaState.Paused: + if self.curDisplayMediaPlayer[display].state != MediaState.Paused: display.controller.seekSlider.setSliderPosition(0) self.timer.stop() @@ -333,16 +330,14 @@ 'Unsupported File'))) return False # dont care about actual theme, set a black background - if controller.isLive and ( \ - controller.media_info.is_background == False): + if controller.isLive and not controller.media_info.is_background: display.frame.evaluateJavaScript(u'show_video( \ "setBackBoard", null, null, null,"visible");') # now start playing if controller.isLive and \ - (QtCore.QSettings().value(u'general/auto unblank', + (Settings().value(u'general/auto unblank', QtCore.QVariant(False)).toBool() or \ - controller.media_info.is_background == True) or \ - controller.isLive == False: + controller.media_info.is_background) or not controller.isLive: if not self.video_play([controller]): critical_error_message_box( translate('MediaPlugin.MediaItem', 'Unsupported File'), @@ -395,7 +390,7 @@ """ Responds to the request to play a loaded video - ``msg`` + ``msg`` First element is the controller which should be used """ log.debug(u'video_play') @@ -497,15 +492,15 @@ First element is the boolean for Live indication """ isLive = msg[1] - if isLive: - controller = self.parent.liveController - for display in self.curDisplayMediaPlayer.keys(): - if display.controller == controller: - if self.curDisplayMediaPlayer[display] \ - .state == MediaState.Playing: - self.curDisplayMediaPlayer[display].pause(display) - self.curDisplayMediaPlayer[display] \ - .set_visible(display, False) + if not isLive: + return + controller = self.parent.liveController + for display in self.curDisplayMediaPlayer.keys(): + if display.controller != controller or \ + self.curDisplayMediaPlayer[display].state != MediaState.Playing: + continue + self.curDisplayMediaPlayer[display].pause(display) + self.curDisplayMediaPlayer[display].set_visible(display, False) def video_blank(self, msg): """ @@ -517,16 +512,16 @@ """ isLive = msg[1] hide_mode = msg[2] - if isLive: - Receiver.send_message(u'live_display_hide', hide_mode) - controller = self.parent.liveController - for display in self.curDisplayMediaPlayer.keys(): - if display.controller == controller: - if self.curDisplayMediaPlayer[display] \ - .state == MediaState.Playing: - self.curDisplayMediaPlayer[display].pause(display) - self.curDisplayMediaPlayer[display] \ - .set_visible(display, False) + if not isLive: + return + Receiver.send_message(u'live_display_hide', hide_mode) + controller = self.parent.liveController + for display in self.curDisplayMediaPlayer.keys(): + if display.controller != controller or \ + self.curDisplayMediaPlayer[display].state != MediaState.Playing: + continue + self.curDisplayMediaPlayer[display].pause(display) + self.curDisplayMediaPlayer[display].set_visible(display, False) def video_unblank(self, msg): """ @@ -538,19 +533,18 @@ """ Receiver.send_message(u'live_display_show') isLive = msg[1] - if isLive: - controller = self.parent.liveController - for display in self.curDisplayMediaPlayer.keys(): - if display.controller == controller: - if self.curDisplayMediaPlayer[display] \ - .state == MediaState.Paused: - if self.curDisplayMediaPlayer[display].play(display): - self.curDisplayMediaPlayer[display] \ - .set_visible(display, True) - # Start Timer for ui updates - if not self.timer.isActive(): - self.timer.start() - + if not isLive: + return + controller = self.parent.liveController + for display in self.curDisplayMediaPlayer.keys(): + if display.controller != controller or \ + self.curDisplayMediaPlayer[display].state != MediaState.Paused: + continue + if self.curDisplayMediaPlayer[display].play(display): + self.curDisplayMediaPlayer[display].set_visible(display, True) + # Start Timer for ui updates + if not self.timer.isActive(): + self.timer.start() def get_audio_extensions_list(self): audio_list = [] @@ -565,9 +559,8 @@ video_list = [] for player in self.mediaPlayers.values(): if player.isActive: - for item in player.video_extensions_list: - if not item in video_list: - video_list.append(item) + video_list.extend([item for item in player.video_extensions_list + if item not in video_list]) return video_list def finalise(self): diff -Nru openlp-1.9.9/openlp/core/ui/media/phononplayer.py openlp-1.9.10/openlp/core/ui/media/phononplayer.py --- openlp-1.9.9/openlp/core/ui/media/phononplayer.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/media/phononplayer.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -38,21 +39,21 @@ log = logging.getLogger(__name__) ADDITIONAL_EXT = { - u'audio/ac3': [u'.ac3'], - u'audio/flac': [u'.flac'], - u'audio/x-m4a': [u'.m4a'], - u'audio/midi': [u'.mid', u'.midi'], - 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-flv': [u'.flv'], - u'video/x-matroska': [u'.mpv', u'.mkv'], - u'video/x-wmv': [u'.wmv'], - u'video/x-mpg': [u'.mpg'], - u'video/mpeg' : [u'.mp4', u'.mts'], - u'video/x-ms-wmv': [u'.wmv']} + u'audio/ac3': [u'.ac3'], + u'audio/flac': [u'.flac'], + u'audio/x-m4a': [u'.m4a'], + u'audio/midi': [u'.mid', u'.midi'], + 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-flv': [u'.flv'], + u'video/x-matroska': [u'.mpv', u'.mkv'], + u'video/x-wmv': [u'.wmv'], + u'video/x-mpg': [u'.mpg'], + u'video/mpeg' : [u'.mp4', u'.mts'], + u'video/x-ms-wmv': [u'.wmv']} class PhononPlayer(MediaPlayer): @@ -101,7 +102,7 @@ display.mediaObject = Phonon.MediaObject(display) Phonon.createPath(display.mediaObject, display.phononWidget) if display.hasAudio: - display.audio = Phonon.AudioOutput( \ + display.audio = Phonon.AudioOutput( Phonon.VideoCategory, display.mediaObject) Phonon.createPath(display.mediaObject, display.audio) display.phononWidget.raise_() @@ -148,18 +149,17 @@ controller.media_info.start_time > 0: start_time = controller.media_info.start_time display.mediaObject.play() - if self.media_state_wait(display, Phonon.PlayingState): - if start_time > 0: - self.seek(display, controller.media_info.start_time*1000) - self.volume(display, controller.media_info.volume) - controller.media_info.length = \ - int(display.mediaObject.totalTime()/1000) - controller.seekSlider.setMaximum(controller.media_info.length*1000) - self.state = MediaState.Playing - display.phononWidget.raise_() - return True - else: + if not self.media_state_wait(display, Phonon.PlayingState): return False + if start_time > 0: + self.seek(display, controller.media_info.start_time * 1000) + self.volume(display, controller.media_info.volume) + controller.media_info.length = \ + int(display.mediaObject.totalTime() / 1000) + controller.seekSlider.setMaximum(controller.media_info.length * 1000) + self.state = MediaState.Playing + display.phononWidget.raise_() + return True def pause(self, display): display.mediaObject.pause() @@ -198,9 +198,9 @@ controller = display.controller if controller.media_info.end_time > 0: if display.mediaObject.currentTime() > \ - controller.media_info.end_time*1000: + controller.media_info.end_time * 1000: self.stop(display) self.set_visible(display, False) if not controller.seekSlider.isSliderDown(): - controller.seekSlider.setSliderPosition( \ + controller.seekSlider.setSliderPosition( display.mediaObject.currentTime()) diff -Nru openlp-1.9.9/openlp/core/ui/media/vlcplayer.py openlp-1.9.10/openlp/core/ui/media/vlcplayer.py --- openlp-1.9.9/openlp/core/ui/media/vlcplayer.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/media/vlcplayer.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,32 +26,45 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -import logging -import sys, os from datetime import datetime +from distutils.version import LooseVersion +import logging +import os +import sys + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import Receiver +from openlp.core.lib.settings import Settings +from openlp.core.lib.mediaplayer import MediaPlayer +from openlp.core.ui.media import MediaState + +log = logging.getLogger(__name__) + +VLC_AVAILABLE = False try: import vlc - vlc_available = bool(vlc.get_default_instance()) -except (ImportError, NameError): - vlc_available = False + VLC_AVAILABLE = bool(vlc.get_default_instance()) +except (ImportError, NameError, NotImplementedError): + pass except OSError, e: if sys.platform.startswith('win'): - if isinstance(e, WindowsError) and e.winerror == 126: - vlc_available = False - else: + if not isinstance(e, WindowsError) and e.winerror != 126: raise else: raise -from PyQt4 import QtCore, QtGui -from openlp.core.lib import Receiver -from openlp.core.lib.mediaplayer import MediaPlayer -from openlp.core.ui.media import MediaState - -log = logging.getLogger(__name__) +if VLC_AVAILABLE: + try: + version = vlc.libvlc_get_version() + except: + version = u'0.0.0' + if LooseVersion(version) < LooseVersion('1.1.0'): + VLC_AVAILABLE = False + log.debug(u'VLC could not be loaded: %s' % version) AUDIO_EXT = [ - u'*.mp3' + u'*.mp3' , u'*.wav' , u'*.ogg' ] @@ -102,7 +116,7 @@ command_line_options = u'--no-video-title-show' if not display.hasAudio: command_line_options += u' --no-audio --no-video-title-show' - if QtCore.QSettings().value(u'advanced/hide mouse', + if Settings().value(u'advanced/hide mouse', QtCore.QVariant(False)).toBool() and \ display.controller.isLive: command_line_options += u' --mouse-hide-timeout=0' @@ -118,9 +132,9 @@ # this is platform specific! # you have to give the id of the QFrame (or similar object) to # vlc, different platforms have different functions for this - if sys.platform == "win32": # for Windows + if sys.platform == "win32": display.vlcMediaPlayer.set_hwnd(int(display.vlcWidget.winId())) - elif sys.platform == "darwin": # for MacOS + elif sys.platform == "darwin": display.vlcMediaPlayer.set_agl(int(display.vlcWidget.winId())) else: # for Linux using the X Server @@ -128,7 +142,7 @@ self.hasOwnWidget = True def check_available(self): - return vlc_available + return VLC_AVAILABLE def load(self, display): log.debug(u'load vid in Vlc Controller') @@ -169,17 +183,16 @@ if controller.media_info.start_time > 0: start_time = controller.media_info.start_time display.vlcMediaPlayer.play() - if self.media_state_wait(display, vlc.State.Playing): - if start_time > 0: - self.seek(display, controller.media_info.start_time * 1000) - controller.media_info.length = \ - int(display.vlcMediaPlayer.get_media().get_duration() / 1000) - controller.seekSlider.setMaximum(controller.media_info.length * 1000) - self.state = MediaState.Playing - display.vlcWidget.raise_() - return True - else: + if not self.media_state_wait(display, vlc.State.Playing): return False + if start_time > 0: + self.seek(display, controller.media_info.start_time * 1000) + controller.media_info.length = \ + int(display.vlcMediaPlayer.get_media().get_duration() / 1000) + controller.seekSlider.setMaximum(controller.media_info.length * 1000) + self.state = MediaState.Playing + display.vlcWidget.raise_() + return True def pause(self, display): if display.vlcMedia.get_state() != vlc.State.Playing: diff -Nru openlp-1.9.9/openlp/core/ui/media/vlc.py openlp-1.9.10/openlp/core/ui/media/vlc.py --- openlp-1.9.9/openlp/core/ui/media/vlc.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/media/vlc.py 2012-06-23 16:35:18.000000000 +0000 @@ -2,25 +2,26 @@ # Python ctypes bindings for VLC # -# Copyright (C) 2009-2010 the VideoLAN team +# Copyright (C) 2009-2012 the VideoLAN team # $Id: $ # # Authors: Olivier Aubert <olivier.aubert at liris.cnrs.fr> # Jean Brouwers <MrJean1 at gmail.com> +# Geoff Salmon <geoff.salmon at gmail.com> # -# 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; either version 2 of the License, or -# (at your option) any later version. +# This library is free software; you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as +# published by the Free Software Foundation; either version 2.1 of the +# License, or (at your option) any later version. # -# 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. +# This library 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 +# Lesser 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA """This module provides bindings for the LibVLC public API, see U{http://wiki.videolan.org/LibVLC}. @@ -47,7 +48,7 @@ from inspect import getargspec __version__ = "N/A" -build_date = "Tue Jan 17 12:20:48 2012" +build_date = "Thu Jun 14 15:22:46 2012" # Internal guard to prevent internal classes to be directly # instanciated. @@ -126,7 +127,7 @@ try: _Ints = (int, long) except NameError: # no long in Python 3+ - _Ints = int + _Ints = int _Seqs = (list, tuple) # Default instance. It is used to instanciate classes directly in the @@ -234,6 +235,23 @@ return classname(result) return wrap_errcheck +# FILE* ctypes wrapper, copied from +# http://svn.python.org/projects/ctypes/trunk/ctypeslib/ctypeslib/contrib/pythonhdr.py +class FILE(ctypes.Structure): + pass +FILE_ptr = ctypes.POINTER(FILE) + +PyFile_FromFile = ctypes.pythonapi.PyFile_FromFile +PyFile_FromFile.restype = ctypes.py_object +PyFile_FromFile.argtypes = [FILE_ptr, + ctypes.c_char_p, + ctypes.c_char_p, + ctypes.CFUNCTYPE(ctypes.c_int, FILE_ptr)] + +PyFile_AsFile = ctypes.pythonapi.PyFile_AsFile +PyFile_AsFile.restype = FILE_ptr +PyFile_AsFile.argtypes = [ctypes.py_object] + # Generated enum types # class _Enum(ctypes.c_uint): @@ -255,6 +273,21 @@ def __ne__(self, other): return not self.__eq__(other) +class LogLevel(_Enum): + '''Logging messages level. +\note future libvlc versions may define new levels. + ''' + _enum_names_ = { + 0: 'DEBUG', + 2: 'NOTICE', + 3: 'WARNING', + 4: 'ERROR', + } +LogLevel.DEBUG = LogLevel(0) +LogLevel.ERROR = LogLevel(4) +LogLevel.NOTICE = LogLevel(2) +LogLevel.WARNING = LogLevel(3) + class EventType(_Enum): '''Event types. ''' @@ -576,6 +609,247 @@ AudioOutputChannel.Right = AudioOutputChannel(4) AudioOutputChannel.Stereo = AudioOutputChannel(1) +class Callback(ctypes.c_void_p): + """Callback function notification +\param p_event the event triggering the callback + """ + pass +class LogCb(ctypes.c_void_p): + """Callback prototype for LibVLC log message handler. +\param data data pointer as given to L{libvlc_log_subscribe}() +\param level message level (@ref enum libvlc_log_level) +\param fmt printf() format string (as defined by ISO C11) +\param args variable argument list for the format +\note Log message handlers <b>must</b> be thread-safe. + """ + pass +class VideoUnlockCb(ctypes.c_void_p): + """Callback prototype to unlock a picture buffer. +When the video frame decoding is complete, the unlock callback is invoked. +This callback might not be needed at all. It is only an indication that the +application can now read the pixel values if it needs to. +\warning A picture buffer is unlocked after the picture is decoded, +but before the picture is displayed. +\param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] +\param picture private pointer returned from the @ref libvlc_video_lock_cb + callback [IN] +\param planes pixel planes as defined by the @ref libvlc_video_lock_cb + callback (this parameter is only for convenience) [IN] + """ + pass +class VideoDisplayCb(ctypes.c_void_p): + """Callback prototype to display a picture. +When the video frame needs to be shown, as determined by the media playback +clock, the display callback is invoked. +\param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] +\param picture private pointer returned from the @ref libvlc_video_lock_cb + callback [IN] + """ + pass +class VideoFormatCb(ctypes.c_void_p): + """Callback prototype to configure picture buffers format. +This callback gets the format of the video as output by the video decoder +and the chain of video filters (if any). It can opt to change any parameter +as it needs. In that case, LibVLC will attempt to convert the video format +(rescaling and chroma conversion) but these operations can be CPU intensive. +\param opaque pointer to the private pointer passed to + libvlc_video_set_callbacks() [IN/OUT] +\param chroma pointer to the 4 bytes video format identifier [IN/OUT] +\param width pointer to the pixel width [IN/OUT] +\param height pointer to the pixel height [IN/OUT] +\param pitches table of scanline pitches in bytes for each pixel plane + (the table is allocated by LibVLC) [OUT] +\param lines table of scanlines count for each plane [OUT] +\return the number of picture buffers allocated, 0 indicates failure +\note +For each pixels plane, the scanline pitch must be bigger than or equal to +the number of bytes per pixel multiplied by the pixel width. +Similarly, the number of scanlines must be bigger than of equal to +the pixel height. +Furthermore, we recommend that pitches and lines be multiple of 32 +to not break assumption that might be made by various optimizations +in the video decoders, video filters and/or video converters. + """ + pass +class VideoCleanupCb(ctypes.c_void_p): + """Callback prototype to configure picture buffers format. +\param opaque private pointer as passed to libvlc_video_set_callbacks() + (and possibly modified by @ref libvlc_video_format_cb) [IN] + """ + pass +class AudioPlayCb(ctypes.c_void_p): + """Callback prototype for audio playback. +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] +\param samples pointer to the first audio sample to play back [IN] +\param count number of audio samples to play back +\param pts expected play time stamp (see libvlc_delay()) + """ + pass +class AudioPauseCb(ctypes.c_void_p): + """Callback prototype for audio pause. +\note The pause callback is never called if the audio is already paused. +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] +\param pts time stamp of the pause request (should be elapsed already) + """ + pass +class AudioResumeCb(ctypes.c_void_p): + """Callback prototype for audio resumption (i.e. restart from pause). +\note The resume callback is never called if the audio is not paused. +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] +\param pts time stamp of the resumption request (should be elapsed already) + """ + pass +class AudioFlushCb(ctypes.c_void_p): + """Callback prototype for audio buffer flush +(i.e. discard all pending buffers and stop playback as soon as possible). +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] + """ + pass +class AudioDrainCb(ctypes.c_void_p): + """Callback prototype for audio buffer drain +(i.e. wait for pending buffers to be played). +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] + """ + pass +class AudioSetVolumeCb(ctypes.c_void_p): + """Callback prototype for audio volume change. +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] +\param volume software volume (1. = nominal, 0. = mute) +\param mute muted flag + """ + pass +class AudioSetupCb(ctypes.c_void_p): + """Callback prototype to setup the audio playback. +This is called when the media player needs to create a new audio output. +\param opaque pointer to the data pointer passed to + L{libvlc_audio_set_callbacks}() [IN/OUT] +\param format 4 bytes sample format [IN/OUT] +\param rate sample rate [IN/OUT] +\param channels channels count [IN/OUT] +\return 0 on success, anything else to skip audio playback + """ + pass +class AudioCleanupCb(ctypes.c_void_p): + """Callback prototype for audio playback cleanup. +This is called when the media player no longer needs an audio output. +\param opaque data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] + """ + pass +class CallbackDecorators(object): + "Class holding various method decorators for callback functions." + Callback = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p) + Callback.__doc__ = '''Callback function notification +\param p_event the event triggering the callback + ''' + LogCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int, ctypes.c_char_p, ctypes.c_void_p) + LogCb.__doc__ = '''Callback prototype for LibVLC log message handler. +\param data data pointer as given to L{libvlc_log_subscribe}() +\param level message level (@ref enum libvlc_log_level) +\param fmt printf() format string (as defined by ISO C11) +\param args variable argument list for the format +\note Log message handlers <b>must</b> be thread-safe. + ''' + VideoUnlockCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ListPOINTER(ctypes.c_void_p)) + VideoUnlockCb.__doc__ = '''Callback prototype to unlock a picture buffer. +When the video frame decoding is complete, the unlock callback is invoked. +This callback might not be needed at all. It is only an indication that the +application can now read the pixel values if it needs to. +\warning A picture buffer is unlocked after the picture is decoded, +but before the picture is displayed. +\param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] +\param picture private pointer returned from the @ref libvlc_video_lock_cb + callback [IN] +\param planes pixel planes as defined by the @ref libvlc_video_lock_cb + callback (this parameter is only for convenience) [IN] + ''' + VideoDisplayCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p) + VideoDisplayCb.__doc__ = '''Callback prototype to display a picture. +When the video frame needs to be shown, as determined by the media playback +clock, the display callback is invoked. +\param opaque private pointer as passed to libvlc_video_set_callbacks() [IN] +\param picture private pointer returned from the @ref libvlc_video_lock_cb + callback [IN] + ''' + VideoFormatCb = ctypes.CFUNCTYPE(ctypes.POINTER(ctypes.c_uint), ListPOINTER(ctypes.c_void_p), ctypes.c_char_p, ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint)) + VideoFormatCb.__doc__ = '''Callback prototype to configure picture buffers format. +This callback gets the format of the video as output by the video decoder +and the chain of video filters (if any). It can opt to change any parameter +as it needs. In that case, LibVLC will attempt to convert the video format +(rescaling and chroma conversion) but these operations can be CPU intensive. +\param opaque pointer to the private pointer passed to + libvlc_video_set_callbacks() [IN/OUT] +\param chroma pointer to the 4 bytes video format identifier [IN/OUT] +\param width pointer to the pixel width [IN/OUT] +\param height pointer to the pixel height [IN/OUT] +\param pitches table of scanline pitches in bytes for each pixel plane + (the table is allocated by LibVLC) [OUT] +\param lines table of scanlines count for each plane [OUT] +\return the number of picture buffers allocated, 0 indicates failure +\note +For each pixels plane, the scanline pitch must be bigger than or equal to +the number of bytes per pixel multiplied by the pixel width. +Similarly, the number of scanlines must be bigger than of equal to +the pixel height. +Furthermore, we recommend that pitches and lines be multiple of 32 +to not break assumption that might be made by various optimizations +in the video decoders, video filters and/or video converters. + ''' + VideoCleanupCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p) + VideoCleanupCb.__doc__ = '''Callback prototype to configure picture buffers format. +\param opaque private pointer as passed to libvlc_video_set_callbacks() + (and possibly modified by @ref libvlc_video_format_cb) [IN] + ''' + AudioPlayCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint, ctypes.c_int64) + AudioPlayCb.__doc__ = '''Callback prototype for audio playback. +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] +\param samples pointer to the first audio sample to play back [IN] +\param count number of audio samples to play back +\param pts expected play time stamp (see libvlc_delay()) + ''' + AudioPauseCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int64) + AudioPauseCb.__doc__ = '''Callback prototype for audio pause. +\note The pause callback is never called if the audio is already paused. +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] +\param pts time stamp of the pause request (should be elapsed already) + ''' + AudioResumeCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int64) + AudioResumeCb.__doc__ = '''Callback prototype for audio resumption (i.e. restart from pause). +\note The resume callback is never called if the audio is not paused. +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] +\param pts time stamp of the resumption request (should be elapsed already) + ''' + AudioFlushCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int64) + AudioFlushCb.__doc__ = '''Callback prototype for audio buffer flush +(i.e. discard all pending buffers and stop playback as soon as possible). +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] + ''' + AudioDrainCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p) + AudioDrainCb.__doc__ = '''Callback prototype for audio buffer drain +(i.e. wait for pending buffers to be played). +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] + ''' + AudioSetVolumeCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p, ctypes.c_float, ctypes.c_bool) + AudioSetVolumeCb.__doc__ = '''Callback prototype for audio volume change. +\param data data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] +\param volume software volume (1. = nominal, 0. = mute) +\param mute muted flag + ''' + AudioSetupCb = ctypes.CFUNCTYPE(ctypes.POINTER(ctypes.c_int), ListPOINTER(ctypes.c_void_p), ctypes.c_char_p, ctypes.POINTER(ctypes.c_uint), ctypes.POINTER(ctypes.c_uint)) + AudioSetupCb.__doc__ = '''Callback prototype to setup the audio playback. +This is called when the media player needs to create a new audio output. +\param opaque pointer to the data pointer passed to + L{libvlc_audio_set_callbacks}() [IN/OUT] +\param format 4 bytes sample format [IN/OUT] +\param rate sample rate [IN/OUT] +\param channels channels count [IN/OUT] +\return 0 on success, anything else to skip audio playback + ''' + AudioCleanupCb = ctypes.CFUNCTYPE(ctypes.c_void_p, ctypes.c_void_p) + AudioCleanupCb.__doc__ = '''Callback prototype for audio playback cleanup. +This is called when the media player no longer needs an audio output. +\param opaque data pointer as passed to L{libvlc_audio_set_callbacks}() [IN] + ''' +cb = CallbackDecorators # End of generated enum types # # From libvlc_structures.h @@ -904,6 +1178,11 @@ def media_new(self, mrl, *options): """Create a new Media instance. + If mrl contains a colon (:) preceded by more than 1 letter, it + will be treated as a URL. Else, it will be considered as a + local path. If you need more control, directly use + media_new_location/media_new_path methods. + Options can be specified as supplementary string parameters, e.g. C{m = i.media_new('foo.avi', 'sub-filter=marq{marquee=Hello}', 'vout-filter=invert')} @@ -914,7 +1193,12 @@ @param options: optional media option=value strings """ - m = libvlc_media_new_location(self, mrl) + if ':' in mrl and mrl.index(':') > 1: + # Assume it is a URL + m = libvlc_media_new_location(self, mrl) + else: + # Else it should be a local path. + m = libvlc_media_new_path(self, mrl) for o in options: libvlc_media_add_option(m, o) m._instance = self @@ -984,12 +1268,6 @@ ''' return libvlc_add_intf(self, name) - def wait(self): - '''Waits until an interface causes the instance to exit. - You should start at least one interface first, using L{add_intf}(). - ''' - return libvlc_wait(self) - def set_user_agent(self, name, http): '''Sets the application name. LibVLC passes this as the user agent string when a protocol requires it. @@ -1444,7 +1722,11 @@ This option will be used to determine how the media_player will read the media. This allows to use VLC's advanced reading/streaming options on a per-media basis. - The options are detailed in vlc --long-help, for instance "--sout-all". + The options are detailed in vlc --long-help, for instance + "--sout-all". Note that all options are not usable on medias: + specifically, due to architectural issues, video-related options + such as text renderer options cannot be set on a single media. They + must be set on the whole libvlc instance instead. @param ppsz_options: the options (as a string). ''' return libvlc_media_add_option(self, ppsz_options) @@ -1454,7 +1736,11 @@ This option will be used to determine how the media_player will read the media. This allows to use VLC's advanced reading/streaming options on a per-media basis. - The options are detailed in vlc --long-help, for instance "--sout-all". + The options are detailed in vlc --long-help, for instance + "--sout-all". Note that all options are not usable on medias: + specifically, due to architectural issues, video-related options + such as text renderer options cannot be set on a single media. They + must be set on the whole libvlc instance instead. @param ppsz_options: the options (as a string). @param i_flags: the flags for this option. ''' @@ -1511,7 +1797,7 @@ def save_meta(self): '''Save the meta previously set. - @return: true if the write operation was successfull. + @return: true if the write operation was successful. ''' return libvlc_media_save_meta(self) @@ -1597,7 +1883,7 @@ Note, you need to call L{parse}() or play the media at least once before calling this function. Not doing this will result in an empty array. - @param tracks: address to store an allocated array of Elementary Streams descriptions (must be freed by the caller). + @param tracks: address to store an allocated array of Elementary Streams descriptions (must be freed by the caller) [OUT]. @return: the number of Elementary Streams. ''' return libvlc_media_get_tracks_info(self) @@ -1707,7 +1993,7 @@ """Add media instance to media list. The L{lock} should be held upon entering this function. - @param p_md: a media instance or a MRL. + @param mrl: a media instance or a MRL. @return: 0 on success, -1 if the media list is read-only. """ if isinstance(mrl, basestring): @@ -2138,16 +2424,25 @@ def video_set_format(self, chroma, width, height, pitch): '''Set decoded video chroma and dimensions. This only works in combination with libvlc_video_set_callbacks(), - and is mutually exclusive with libvlc_video_set_format_callbacks(). + and is mutually exclusive with L{video_set_format_callbacks}(). @param chroma: a four-characters string identifying the chroma (e.g. "RV32" or "YUYV"). @param width: pixel width. @param height: pixel height. @param pitch: line pitch (in bytes). @version: LibVLC 1.1.1 or later. - @bug: All pixel planes are expected to have the same pitch. To use the YCbCr color space with chrominance subsampling, consider using libvlc_video_set_format_callbacks() instead. + @bug: All pixel planes are expected to have the same pitch. To use the YCbCr color space with chrominance subsampling, consider using L{video_set_format_callbacks}() instead. ''' return libvlc_video_set_format(self, chroma, width, height, pitch) + def video_set_format_callbacks(self, setup, cleanup): + '''Set decoded video chroma and dimensions. This only works in combination with + libvlc_video_set_callbacks(). + @param setup: callback to select the video format (cannot be NULL). + @param cleanup: callback to release any allocated resources (or NULL). + @version: LibVLC 2.0.0 or later. + ''' + return libvlc_video_set_format_callbacks(self, setup, cleanup) + def set_nsobject(self, drawable): '''Set the NSView handler where the media player should render its video output. Use the vout called "macosx". @@ -2223,14 +2518,46 @@ ''' return libvlc_media_player_get_hwnd(self) + def audio_set_callbacks(self, play, pause, resume, flush, drain, opaque): + '''Set callbacks and private data for decoded audio. + Use L{audio_set_format}() or L{audio_set_format_callbacks}() + to configure the decoded audio format. + @param play: callback to play audio samples (must not be NULL). + @param pause: callback to pause playback (or NULL to ignore). + @param resume: callback to resume playback (or NULL to ignore). + @param flush: callback to flush audio buffers (or NULL to ignore). + @param drain: callback to drain audio buffers (or NULL to ignore). + @param opaque: private pointer for the audio callbacks (as first parameter). + @version: LibVLC 2.0.0 or later. + ''' + return libvlc_audio_set_callbacks(self, play, pause, resume, flush, drain, opaque) + + def audio_set_volume_callback(self, set_volume): + '''Set callbacks and private data for decoded audio. + Use L{audio_set_format}() or L{audio_set_format_callbacks}() + to configure the decoded audio format. + @param set_volume: callback to apply audio volume, or NULL to apply volume in software. + @version: LibVLC 2.0.0 or later. + ''' + return libvlc_audio_set_volume_callback(self, set_volume) + + def audio_set_format_callbacks(self, setup, cleanup): + '''Set decoded audio format. This only works in combination with + L{audio_set_callbacks}(). + @param setup: callback to select the audio format (cannot be NULL). + @param cleanup: callback to release any allocated resources (or NULL). + @version: LibVLC 2.0.0 or later. + ''' + return libvlc_audio_set_format_callbacks(self, setup, cleanup) + def audio_set_format(self, format, rate, channels): '''Set decoded audio format. - This only works in combination with libvlc_audio_set_callbacks(), - and is mutually exclusive with libvlc_audio_set_format_callbacks(). + This only works in combination with L{audio_set_callbacks}(), + and is mutually exclusive with L{audio_set_format_callbacks}(). @param format: a four-characters string identifying the sample format (e.g. "S16N" or "FL32"). @param rate: sample rate (expressed in Hz). @param channels: channels count. - @version: LibVLC 1.2.0 or later. + @version: LibVLC 2.0.0 or later. ''' return libvlc_audio_set_format(self, format, rate, channels) @@ -2378,7 +2705,7 @@ def navigate(self, navigate): '''Navigate through DVD Menu. @param navigate: the Navigation mode. - @version: libVLC 1.2.0 or later. + @version: libVLC 2.0.0 or later. ''' return libvlc_media_player_navigate(self, navigate) @@ -2489,7 +2816,7 @@ '''Get the current subtitle delay. Positive values means subtitles are being displayed later, negative values earlier. @return: time (in microseconds) the display of subtitles is being delayed. - @version: LibVLC 1.2.0 or later. + @version: LibVLC 2.0.0 or later. ''' return libvlc_video_get_spu_delay(self) @@ -2500,7 +2827,7 @@ The subtitle delay will be reset to zero each time the media changes. @param i_delay: time (in microseconds) the display of subtitles should be delayed. @return: 0 on success, -1 on error. - @version: LibVLC 1.2.0 or later. + @version: LibVLC 2.0.0 or later. ''' return libvlc_video_set_spu_delay(self, i_delay) @@ -2786,6 +3113,30 @@ None) return f() +def libvlc_vprinterr(fmt, ap): + '''Sets the LibVLC error status and message for the current thread. + Any previous error is overridden. + @param fmt: the format string. + @param ap: the arguments. + @return: a nul terminated string in any case. + ''' + f = _Cfunctions.get('libvlc_vprinterr', None) or \ + _Cfunction('libvlc_vprinterr', ((1,), (1,),), None, + ctypes.c_char_p, ctypes.c_char_p, ctypes.c_void_p) + return f(fmt, ap) + +def libvlc_printerr(fmt, args): + '''Sets the LibVLC error status and message for the current thread. + Any previous error is overridden. + @param fmt: the format string. + @param args: the arguments. + @return: a nul terminated string in any case. + ''' + f = _Cfunctions.get('libvlc_printerr', None) or \ + _Cfunction('libvlc_printerr', ((1,), (1,),), None, + ctypes.c_char_p, ctypes.c_char_p, ctypes.c_void_p) + return f(fmt, args) + def libvlc_new(argc, argv): '''Create and initialize a libvlc instance. This functions accept a list of "command line" arguments similar to the @@ -2831,16 +3182,6 @@ ctypes.c_int, Instance, ctypes.c_char_p) return f(p_instance, name) -def libvlc_wait(p_instance): - '''Waits until an interface causes the instance to exit. - You should start at least one interface first, using L{libvlc_add_intf}(). - @param p_instance: the instance. - ''' - f = _Cfunctions.get('libvlc_wait', None) or \ - _Cfunction('libvlc_wait', ((1,),), None, - None, Instance) - return f(p_instance) - def libvlc_set_user_agent(p_instance, name, http): '''Sets the application name. LibVLC passes this as the user agent string when a protocol requires it. @@ -2905,7 +3246,7 @@ ''' f = _Cfunctions.get('libvlc_event_attach', None) or \ _Cfunction('libvlc_event_attach', ((1,), (1,), (1,), (1,),), None, - ctypes.c_int, EventManager, ctypes.c_uint, ctypes.c_void_p, ctypes.c_void_p) + ctypes.c_int, EventManager, ctypes.c_uint, Callback, ctypes.c_void_p) return f(p_event_manager, i_event_type, f_callback, user_data) def libvlc_event_detach(p_event_manager, i_event_type, f_callback, p_user_data): @@ -2917,7 +3258,7 @@ ''' f = _Cfunctions.get('libvlc_event_detach', None) or \ _Cfunction('libvlc_event_detach', ((1,), (1,), (1,), (1,),), None, - None, EventManager, ctypes.c_uint, ctypes.c_void_p, ctypes.c_void_p) + None, EventManager, ctypes.c_uint, Callback, ctypes.c_void_p) return f(p_event_manager, i_event_type, f_callback, p_user_data) def libvlc_event_type_name(event_type): @@ -2929,6 +3270,45 @@ ctypes.c_char_p, ctypes.c_uint) return f(event_type) +def libvlc_log_subscribe(sub, cb, data): + '''Registers a logging callback to LibVLC. + This function is thread-safe. + @param sub: uninitialized subscriber structure. + @param cb: callback function pointer. + @param data: opaque data pointer for the callback function @note Some log messages (especially debug) are emitted by LibVLC while initializing, before any LibVLC instance even exists. Thus this function does not require a LibVLC instance parameter. @warning As a consequence of not depending on a LibVLC instance, all logging callbacks are shared by all LibVLC instances within the process / address space. This also enables log messages to be emitted by LibVLC components that are not specific to any given LibVLC instance. @warning Do not call this function from within a logging callback. It would trigger a dead lock. + @version: LibVLC 2.1.0 or later. + ''' + f = _Cfunctions.get('libvlc_log_subscribe', None) or \ + _Cfunction('libvlc_log_subscribe', ((1,), (1,), (1,),), None, + None, ctypes.c_void_p, LogCb, ctypes.c_void_p) + return f(sub, cb, data) + +def libvlc_log_subscribe_file(sub, stream): + '''Registers a logging callback to a file. + @param stream: FILE pointer opened for writing (the FILE pointer must remain valid until L{libvlc_log_unsubscribe}()). + @version: LibVLC 2.1.0 or later. + ''' + f = _Cfunctions.get('libvlc_log_subscribe_file', None) or \ + _Cfunction('libvlc_log_subscribe_file', ((1,), (1,),), None, + None, ctypes.c_void_p, FILE_ptr) + return f(sub, stream) + +def libvlc_log_unsubscribe(sub): + '''Deregisters a logging callback from LibVLC. + This function is thread-safe. + @note: After (and only after) L{libvlc_log_unsubscribe}() has returned, + LibVLC warrants that there are no more pending calls of the subscription + callback function. + @warning: Do not call this function from within a logging callback. + It would trigger a dead lock. + @param sub: initialized subscriber structure. + @version: LibVLC 2.1.0 or later. + ''' + f = _Cfunctions.get('libvlc_log_unsubscribe', None) or \ + _Cfunction('libvlc_log_unsubscribe', ((1,),), None, + None, ctypes.c_void_p) + return f(sub) + def libvlc_get_log_verbosity(p_instance): '''Always returns minus one. This function is only provided for backward compatibility. @@ -3147,7 +3527,11 @@ This option will be used to determine how the media_player will read the media. This allows to use VLC's advanced reading/streaming options on a per-media basis. - The options are detailed in vlc --long-help, for instance "--sout-all". + The options are detailed in vlc --long-help, for instance + "--sout-all". Note that all options are not usable on medias: + specifically, due to architectural issues, video-related options + such as text renderer options cannot be set on a single media. They + must be set on the whole libvlc instance instead. @param p_md: the media descriptor. @param ppsz_options: the options (as a string). ''' @@ -3161,7 +3545,11 @@ This option will be used to determine how the media_player will read the media. This allows to use VLC's advanced reading/streaming options on a per-media basis. - The options are detailed in vlc --long-help, for instance "--sout-all". + The options are detailed in vlc --long-help, for instance + "--sout-all". Note that all options are not usable on medias: + specifically, due to architectural issues, video-related options + such as text renderer options cannot be set on a single media. They + must be set on the whole libvlc instance instead. @param p_md: the media descriptor. @param ppsz_options: the options (as a string). @param i_flags: the flags for this option. @@ -3247,7 +3635,7 @@ def libvlc_media_save_meta(p_md): '''Save the meta previously set. @param p_md: the media desriptor. - @return: true if the write operation was successfull. + @return: true if the write operation was successful. ''' f = _Cfunctions.get('libvlc_media_save_meta', None) or \ _Cfunction('libvlc_media_save_meta', ((1,),), None, @@ -3373,7 +3761,7 @@ before calling this function. Not doing this will result in an empty array. @param p_md: media descriptor object. - @param tracks: address to store an allocated array of Elementary Streams descriptions (must be freed by the caller). + @param tracks: address to store an allocated array of Elementary Streams descriptions (must be freed by the caller) [OUT]. @return: the number of Elementary Streams. ''' f = _Cfunctions.get('libvlc_media_get_tracks_info', None) or \ @@ -3947,20 +4335,33 @@ def libvlc_video_set_format(mp, chroma, width, height, pitch): '''Set decoded video chroma and dimensions. This only works in combination with libvlc_video_set_callbacks(), - and is mutually exclusive with libvlc_video_set_format_callbacks(). + and is mutually exclusive with L{libvlc_video_set_format_callbacks}(). @param mp: the media player. @param chroma: a four-characters string identifying the chroma (e.g. "RV32" or "YUYV"). @param width: pixel width. @param height: pixel height. @param pitch: line pitch (in bytes). @version: LibVLC 1.1.1 or later. - @bug: All pixel planes are expected to have the same pitch. To use the YCbCr color space with chrominance subsampling, consider using libvlc_video_set_format_callbacks() instead. + @bug: All pixel planes are expected to have the same pitch. To use the YCbCr color space with chrominance subsampling, consider using L{libvlc_video_set_format_callbacks}() instead. ''' f = _Cfunctions.get('libvlc_video_set_format', None) or \ _Cfunction('libvlc_video_set_format', ((1,), (1,), (1,), (1,), (1,),), None, None, MediaPlayer, ctypes.c_char_p, ctypes.c_uint, ctypes.c_uint, ctypes.c_uint) return f(mp, chroma, width, height, pitch) +def libvlc_video_set_format_callbacks(mp, setup, cleanup): + '''Set decoded video chroma and dimensions. This only works in combination with + libvlc_video_set_callbacks(). + @param mp: the media player. + @param setup: callback to select the video format (cannot be NULL). + @param cleanup: callback to release any allocated resources (or NULL). + @version: LibVLC 2.0.0 or later. + ''' + f = _Cfunctions.get('libvlc_video_set_format_callbacks', None) or \ + _Cfunction('libvlc_video_set_format_callbacks', ((1,), (1,), (1,),), None, + None, MediaPlayer, VideoFormatCb, VideoCleanupCb) + return f(mp, setup, cleanup) + def libvlc_media_player_set_nsobject(p_mi, drawable): '''Set the NSView handler where the media player should render its video output. Use the vout called "macosx". @@ -4076,15 +4477,59 @@ ctypes.c_void_p, MediaPlayer) return f(p_mi) +def libvlc_audio_set_callbacks(mp, play, pause, resume, flush, drain, opaque): + '''Set callbacks and private data for decoded audio. + Use L{libvlc_audio_set_format}() or L{libvlc_audio_set_format_callbacks}() + to configure the decoded audio format. + @param mp: the media player. + @param play: callback to play audio samples (must not be NULL). + @param pause: callback to pause playback (or NULL to ignore). + @param resume: callback to resume playback (or NULL to ignore). + @param flush: callback to flush audio buffers (or NULL to ignore). + @param drain: callback to drain audio buffers (or NULL to ignore). + @param opaque: private pointer for the audio callbacks (as first parameter). + @version: LibVLC 2.0.0 or later. + ''' + f = _Cfunctions.get('libvlc_audio_set_callbacks', None) or \ + _Cfunction('libvlc_audio_set_callbacks', ((1,), (1,), (1,), (1,), (1,), (1,), (1,),), None, + None, MediaPlayer, AudioPlayCb, AudioPauseCb, AudioResumeCb, AudioFlushCb, AudioDrainCb, ctypes.c_void_p) + return f(mp, play, pause, resume, flush, drain, opaque) + +def libvlc_audio_set_volume_callback(mp, set_volume): + '''Set callbacks and private data for decoded audio. + Use L{libvlc_audio_set_format}() or L{libvlc_audio_set_format_callbacks}() + to configure the decoded audio format. + @param mp: the media player. + @param set_volume: callback to apply audio volume, or NULL to apply volume in software. + @version: LibVLC 2.0.0 or later. + ''' + f = _Cfunctions.get('libvlc_audio_set_volume_callback', None) or \ + _Cfunction('libvlc_audio_set_volume_callback', ((1,), (1,),), None, + None, MediaPlayer, AudioSetVolumeCb) + return f(mp, set_volume) + +def libvlc_audio_set_format_callbacks(mp, setup, cleanup): + '''Set decoded audio format. This only works in combination with + L{libvlc_audio_set_callbacks}(). + @param mp: the media player. + @param setup: callback to select the audio format (cannot be NULL). + @param cleanup: callback to release any allocated resources (or NULL). + @version: LibVLC 2.0.0 or later. + ''' + f = _Cfunctions.get('libvlc_audio_set_format_callbacks', None) or \ + _Cfunction('libvlc_audio_set_format_callbacks', ((1,), (1,), (1,),), None, + None, MediaPlayer, AudioSetupCb, AudioCleanupCb) + return f(mp, setup, cleanup) + def libvlc_audio_set_format(mp, format, rate, channels): '''Set decoded audio format. - This only works in combination with libvlc_audio_set_callbacks(), - and is mutually exclusive with libvlc_audio_set_format_callbacks(). + This only works in combination with L{libvlc_audio_set_callbacks}(), + and is mutually exclusive with L{libvlc_audio_set_format_callbacks}(). @param mp: the media player. @param format: a four-characters string identifying the sample format (e.g. "S16N" or "FL32"). @param rate: sample rate (expressed in Hz). @param channels: channels count. - @version: LibVLC 1.2.0 or later. + @version: LibVLC 2.0.0 or later. ''' f = _Cfunctions.get('libvlc_audio_set_format', None) or \ _Cfunction('libvlc_audio_set_format', ((1,), (1,), (1,), (1,),), None, @@ -4328,7 +4773,7 @@ '''Navigate through DVD Menu. @param p_mi: the Media Player. @param navigate: the Navigation mode. - @version: libVLC 1.2.0 or later. + @version: libVLC 2.0.0 or later. ''' f = _Cfunctions.get('libvlc_media_player_navigate', None) or \ _Cfunction('libvlc_media_player_navigate', ((1,), (1,),), None, @@ -4554,7 +4999,7 @@ displayed later, negative values earlier. @param p_mi: media player. @return: time (in microseconds) the display of subtitles is being delayed. - @version: LibVLC 1.2.0 or later. + @version: LibVLC 2.0.0 or later. ''' f = _Cfunctions.get('libvlc_video_get_spu_delay', None) or \ _Cfunction('libvlc_video_get_spu_delay', ((1,),), None, @@ -4569,7 +5014,7 @@ @param p_mi: media player. @param i_delay: time (in microseconds) the display of subtitles should be delayed. @return: 0 on success, -1 on error. - @version: LibVLC 1.2.0 or later. + @version: LibVLC 2.0.0 or later. ''' f = _Cfunctions.get('libvlc_video_set_spu_delay', None) or \ _Cfunction('libvlc_video_set_spu_delay', ((1,), (1,),), None, @@ -5383,17 +5828,11 @@ return f(p_instance) -# 8 function(s) blacklisted: -# libvlc_audio_set_callbacks -# libvlc_audio_set_format_callbacks -# libvlc_audio_set_volume_callback -# libvlc_printerr +# 2 function(s) blacklisted: # libvlc_set_exit_handler # libvlc_video_set_callbacks -# libvlc_video_set_format_callbacks -# libvlc_vprinterr -# 13 function(s) not wrapped as methods: +# 18 function(s) not wrapped as methods: # libvlc_audio_output_list_release # libvlc_clearerr # libvlc_clock @@ -5403,10 +5842,15 @@ # libvlc_get_changeset # libvlc_get_compiler # libvlc_get_version +# libvlc_log_subscribe +# libvlc_log_subscribe_file +# libvlc_log_unsubscribe # libvlc_module_description_list_release # libvlc_new +# libvlc_printerr # libvlc_track_description_list_release # libvlc_track_description_release +# libvlc_vprinterr # Start of footer.py # @@ -5584,7 +6028,7 @@ print('Aspect ratio: %s' % player.video_get_aspect_ratio()) #print('Window:' % player.get_hwnd() except Exception: - print('Error: %s', sys.exc_info()[1]) + print('Error: %s' % sys.exc_info()[1]) def sec_forward(): """Go forward one sec""" diff -Nru openlp-1.9.9/openlp/core/ui/media/webkitplayer.py openlp-1.9.10/openlp/core/ui/media/webkitplayer.py --- openlp-1.9.9/openlp/core/ui/media/webkitplayer.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/media/webkitplayer.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -227,33 +228,33 @@ """ VIDEO_EXT = [ - u'*.3gp' - , u'*.3gpp' - , u'*.3g2' - , u'*.3gpp2' - , u'*.aac' - , u'*.flv' - , u'*.f4a' - , u'*.f4b' - , u'*.f4p' - , u'*.f4v' - , u'*.mov' - , u'*.m4a' - , u'*.m4b' - , u'*.m4p' - , u'*.m4v' - , u'*.mkv' - , u'*.mp4' - , u'*.ogv' - , u'*.webm' - , u'*.mpg', u'*.wmv', u'*.mpeg', u'*.avi' - , u'*.swf' - ] + u'*.3gp' + , u'*.3gpp' + , u'*.3g2' + , u'*.3gpp2' + , u'*.aac' + , u'*.flv' + , u'*.f4a' + , u'*.f4b' + , u'*.f4p' + , u'*.f4v' + , u'*.mov' + , u'*.m4a' + , u'*.m4b' + , u'*.m4p' + , u'*.m4v' + , u'*.mkv' + , u'*.mp4' + , u'*.ogv' + , u'*.webm' + , u'*.mpg', u'*.wmv', u'*.mpeg', u'*.avi' + , u'*.swf' + ] AUDIO_EXT = [ - u'*.mp3' - , u'*.ogg' - ] + u'*.mp3' + , u'*.ogg' + ] class WebkitPlayer(MediaPlayer): @@ -339,7 +340,7 @@ else: display.frame.evaluateJavaScript(u'show_video("play");') if start_time > 0: - self.seek(display, controller.media_info.start_time*1000) + self.seek(display, controller.media_info.start_time * 1000) # TODO add playing check and get the correct media length controller.media_info.length = length self.state = MediaState.Playing @@ -375,11 +376,11 @@ controller = display.controller if controller.media_info.is_flash: seek = seekVal - display.frame.evaluateJavaScript( \ + display.frame.evaluateJavaScript( u'show_flash("seek", null, null, "%s");' % (seek)) else: - seek = float(seekVal)/1000 - display.frame.evaluateJavaScript( \ + seek = float(seekVal) / 1000 + display.frame.evaluateJavaScript( u'show_video("seek", null, null, null, "%f");' % (seek)) def reset(self, display): @@ -406,24 +407,24 @@ def update_ui(self, display): controller = display.controller if controller.media_info.is_flash: - currentTime = display.frame.evaluateJavaScript( \ + currentTime = display.frame.evaluateJavaScript( u'show_flash("currentTime");').toInt()[0] - length = display.frame.evaluateJavaScript( \ + length = display.frame.evaluateJavaScript( u'show_flash("length");').toInt()[0] else: - if display.frame.evaluateJavaScript( \ + if display.frame.evaluateJavaScript( u'show_video("isEnded");').toString() == 'true': self.stop(display) - (currentTime, ok) = display.frame.evaluateJavaScript( \ + (currentTime, ok) = display.frame.evaluateJavaScript( u'show_video("currentTime");').toFloat() # check if conversion was ok and value is not 'NaN' if ok and currentTime != float('inf'): - currentTime = int(currentTime*1000) - (length, ok) = display.frame.evaluateJavaScript( \ + currentTime = int(currentTime * 1000) + (length, ok) = display.frame.evaluateJavaScript( u'show_video("length");').toFloat() # check if conversion was ok and value is not 'NaN' if ok and length != float('inf'): - length = int(length*1000) + length = int(length * 1000) if currentTime > 0: controller.media_info.length = length controller.seekSlider.setMaximum(length) diff -Nru openlp-1.9.9/openlp/core/ui/mediadockmanager.py openlp-1.9.10/openlp/core/ui/mediadockmanager.py --- openlp-1.9.9/openlp/core/ui/mediadockmanager.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/mediadockmanager.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -64,7 +65,7 @@ visible_title = media_item.plugin.getString(StringContent.VisibleName) log.debug(u'Inserting %s dock' % visible_title[u'title']) match = False - for dock_index in range(0, self.media_dock.count()): + for dock_index in range(self.media_dock.count()): if self.media_dock.widget(dock_index).settingsSection == \ media_item.plugin.name: match = True @@ -81,7 +82,7 @@ """ visible_title = media_item.plugin.getString(StringContent.VisibleName) log.debug(u'remove %s dock' % visible_title[u'title']) - for dock_index in range(0, self.media_dock.count()): + for dock_index in range(self.media_dock.count()): if self.media_dock.widget(dock_index): if self.media_dock.widget(dock_index).settingsSection == \ media_item.plugin.name: diff -Nru openlp-1.9.9/openlp/core/ui/plugindialog.py openlp-1.9.10/openlp/core/ui/plugindialog.py --- openlp-1.9.9/openlp/core/ui/plugindialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/plugindialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,7 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import UiStrings +from openlp.core.lib.ui import UiStrings, create_button_box class Ui_PluginViewDialog(object): def setupUi(self, pluginViewDialog): @@ -65,14 +66,10 @@ self.pluginInfoLayout.addRow(self.aboutLabel, self.aboutTextBrowser) self.listLayout.addWidget(self.pluginInfoGroupBox) self.pluginLayout.addLayout(self.listLayout) - self.pluginListButtonBox = QtGui.QDialogButtonBox(pluginViewDialog) - self.pluginListButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) - self.pluginListButtonBox.setObjectName(u'pluginListButtonBox') - self.pluginLayout.addWidget(self.pluginListButtonBox) + self.buttonBox = create_button_box(pluginViewDialog, u'buttonBox', + [u'ok']) + self.pluginLayout.addWidget(self.buttonBox) self.retranslateUi(pluginViewDialog) - QtCore.QObject.connect(self.pluginListButtonBox, - QtCore.SIGNAL(u'accepted()'), pluginViewDialog.close) - QtCore.QMetaObject.connectSlotsByName(pluginViewDialog) def retranslateUi(self, pluginViewDialog): pluginViewDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/core/ui/pluginform.py openlp-1.9.10/openlp/core/ui/pluginform.py --- openlp-1.9.9/openlp/core/ui/pluginform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/pluginform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -102,9 +103,9 @@ self.versionNumberLabel.setText(self.activePlugin.version) self.aboutTextBrowser.setHtml(self.activePlugin.about()) self.programaticChange = True - status = 1 + status = PluginStatus.Active if self.activePlugin.status == PluginStatus.Active: - status = 0 + status = PluginStatus.Inactive self.statusComboBox.setCurrentIndex(status) self.statusComboBox.setEnabled(True) self.programaticChange = False @@ -129,7 +130,7 @@ def onStatusComboBoxChanged(self, status): if self.programaticChange or status == PluginStatus.Disabled: return - if status == 0: + if status == PluginStatus.Inactive: Receiver.send_message(u'cursor_busy') self.activePlugin.toggleStatus(PluginStatus.Active) Receiver.send_message(u'cursor_normal') diff -Nru openlp-1.9.9/openlp/core/ui/printservicedialog.py openlp-1.9.10/openlp/core/ui/printservicedialog.py --- openlp-1.9.9/openlp/core/ui/printservicedialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/printservicedialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -126,7 +127,6 @@ self.optionsLayout.addWidget(self.optionsGroupBox) self.retranslateUi(printServiceDialog) - QtCore.QMetaObject.connectSlotsByName(printServiceDialog) QtCore.QObject.connect(self.optionsButton, QtCore.SIGNAL(u'toggled(bool)'), self.toggleOptions) diff -Nru openlp-1.9.9/openlp/core/ui/printserviceform.py openlp-1.9.10/openlp/core/ui/printserviceform.py --- openlp-1.9.9/openlp/core/ui/printserviceform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/printserviceform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -33,6 +34,7 @@ from openlp.core.lib import translate, get_text_file_string, Receiver from openlp.core.lib.ui import UiStrings +from openlp.core.lib.settings import Settings from openlp.core.ui.printservicedialog import Ui_PrintServiceDialog, ZoomSize from openlp.core.utils import AppLocation @@ -120,7 +122,7 @@ self.zoom = 0 self.setupUi(self) # Load the settings for the dialog. - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(u'advanced') self.slideTextCheckBox.setChecked(settings.value( u'print slide text', QtCore.QVariant(False)).toBool()) @@ -318,7 +320,7 @@ elif display == ZoomSize.TwentyFive: self.previewWidget.fitToWidth() self.previewWidget.zoomIn(0.25) - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(u'advanced') settings.setValue(u'display size', QtCore.QVariant(display)) settings.endGroup() @@ -389,7 +391,7 @@ Save the settings and close the dialog. """ # Save the settings for this dialog. - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(u'advanced') settings.setValue(u'print slide text', QtCore.QVariant(self.slideTextCheckBox.isChecked())) diff -Nru openlp-1.9.9/openlp/core/ui/screen.py openlp-1.9.10/openlp/core/ui/screen.py --- openlp-1.9.9/openlp/core/ui/screen.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/screen.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -34,6 +35,7 @@ from PyQt4 import QtCore from openlp.core.lib import Receiver, translate +from openlp.core.lib.settings import Settings log = logging.getLogger(__name__) @@ -41,36 +43,40 @@ """ Wrapper to handle the parameters of the display screen. - To get access to the screen list call ``ScreenList.get_instance()``. + To get access to the screen list call ``ScreenList()``. """ log.info(u'Screen loaded') - instance = None + __instance__ = None - @staticmethod - def get_instance(): - return ScreenList.instance + def __new__(cls): + if not cls.__instance__: + cls.__instance__ = object.__new__(cls) + return cls.__instance__ - def __init__(self, desktop): + @classmethod + def create(cls, desktop): """ Initialise the screen list. ``desktop`` A ``QDesktopWidget`` object. """ - ScreenList.instance = self - self.desktop = desktop - self.preview = None - self.current = None - self.override = None - self.screen_list = [] - self.display_count = 0 - self.screen_count_changed() - self._load_screen_settings() + screen_list = cls() + screen_list.desktop = desktop + screen_list.preview = None + screen_list.current = None + screen_list.override = None + screen_list.screen_list = [] + screen_list.display_count = 0 + screen_list.screen_count_changed() + screen_list._load_screen_settings() QtCore.QObject.connect(desktop, - QtCore.SIGNAL(u'resized(int)'), self.screen_resolution_changed) + QtCore.SIGNAL(u'resized(int)'), + screen_list.screen_resolution_changed) QtCore.QObject.connect(desktop, QtCore.SIGNAL(u'screenCountChanged(int)'), - self.screen_count_changed) + screen_list.screen_count_changed) + return screen_list def screen_resolution_changed(self, number): """ @@ -106,13 +112,13 @@ """ # Do not log at start up. if changed_screen != -1: - log.info(u'screen_count_changed %d' % self.desktop.numScreens()) + log.info(u'screen_count_changed %d' % self.desktop.screenCount()) # Remove unplugged screens. for screen in copy.deepcopy(self.screen_list): - if screen[u'number'] == self.desktop.numScreens(): + if screen[u'number'] == self.desktop.screenCount(): self.remove_screen(screen[u'number']) # Add new screens. - for number in xrange(0, self.desktop.numScreens()): + for number in xrange(self.desktop.screenCount()): if not self.screen_exists(number): self.add_screen({ u'number': number, @@ -233,15 +239,15 @@ y = window.y() + (window.height() / 2) for screen in self.screen_list: size = screen[u'size'] - if x >= size.x() and x <= (size.x() + size.width()) \ - and y >= size.y() and y <= (size.y() + size.height()): + if x >= size.x() and x <= (size.x() + size.width()) and \ + y >= size.y() and y <= (size.y() + size.height()): return screen[u'number'] def _load_screen_settings(self): """ Loads the screen size and the monitor number from the settings. """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(u'general') self.set_current_display(settings.value(u'monitor', QtCore.QVariant(self.display_count - 1)).toInt()[0]) diff -Nru openlp-1.9.9/openlp/core/ui/serviceitemeditdialog.py openlp-1.9.10/openlp/core/ui/serviceitemeditdialog.py --- openlp-1.9.9/openlp/core/ui/serviceitemeditdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/serviceitemeditdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,11 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import create_accept_reject_button_box, \ - create_delete_push_button, create_up_down_push_button_set +from openlp.core.lib.ui import create_button_box, create_button class Ui_ServiceItemEditDialog(object): def setupUi(self, serviceItemEditDialog): @@ -44,18 +44,22 @@ self.dialogLayout.addWidget(self.listWidget, 0, 0) self.buttonLayout = QtGui.QVBoxLayout() self.buttonLayout.setObjectName(u'buttonLayout') - self.deleteButton = create_delete_push_button(serviceItemEditDialog) + self.deleteButton = create_button(serviceItemEditDialog, + u'deleteButton', role=u'delete', + click=serviceItemEditDialog.onDeleteButtonClicked) self.buttonLayout.addWidget(self.deleteButton) self.buttonLayout.addStretch() - self.upButton, self.downButton = create_up_down_push_button_set( - serviceItemEditDialog) + self.upButton = create_button(serviceItemEditDialog, u'upButton', + role=u'up', click=serviceItemEditDialog.onUpButtonClicked) + self.downButton = create_button(serviceItemEditDialog, u'downButton', + role=u'down', click=serviceItemEditDialog.onDownButtonClicked) self.buttonLayout.addWidget(self.upButton) self.buttonLayout.addWidget(self.downButton) self.dialogLayout.addLayout(self.buttonLayout, 0, 1) - self.dialogLayout.addWidget( - create_accept_reject_button_box(serviceItemEditDialog), 1, 0, 1, 2) + self.buttonBox = create_button_box(serviceItemEditDialog, u'buttonBox', + [u'cancel', u'save']) + self.dialogLayout.addWidget(self.buttonBox, 1, 0, 1, 2) self.retranslateUi(serviceItemEditDialog) - QtCore.QMetaObject.connectSlotsByName(serviceItemEditDialog) def retranslateUi(self, serviceItemEditDialog): serviceItemEditDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/core/ui/serviceitemeditform.py openlp-1.9.10/openlp/core/ui/serviceitemeditform.py --- openlp-1.9.9/openlp/core/ui/serviceitemeditform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/serviceitemeditform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/core/ui/servicemanager.py openlp-1.9.10/openlp/core/ui/servicemanager.py --- openlp-1.9.9/openlp/core/ui/servicemanager.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/servicemanager.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -40,6 +41,7 @@ from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, \ ItemCapabilities, SettingsManager, translate, str_to_bool from openlp.core.lib.theme import ThemeLevel +from openlp.core.lib.settings import Settings from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ create_widget_action, find_and_set_in_combo_box from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm @@ -51,7 +53,7 @@ """ Set up key bindings and mouse behaviour for the service list """ - def __init__(self, serviceManager, parent=None, name=None): + def __init__(self, serviceManager, parent=None): QtGui.QTreeWidget.__init__(self, parent) self.serviceManager = serviceManager @@ -64,6 +66,9 @@ elif event.key() == QtCore.Qt.Key_Down: self.serviceManager.onMoveSelectionDown() event.accept() + elif event.key() == QtCore.Qt.Key_Delete: + self.serviceManager.onDeleteFromService() + event.accept() event.ignore() else: event.ignore() @@ -77,7 +82,7 @@ if event.buttons() != QtCore.Qt.LeftButton: event.ignore() return - if not self.selectedItems(): + if not self.itemAt(self.mapFromGlobal(QtGui.QCursor.pos())): event.ignore() return drag = QtGui.QDrag(self) @@ -101,10 +106,10 @@ QtGui.QWidget.__init__(self, parent) self.mainwindow = mainwindow self.serviceItems = [] - self.serviceName = u'' self.suffixes = [] self.dropPosition = 0 self.expandTabs = False + self.serviceId = 0 # is a new service and has not been saved self._modified = False self._fileName = u'' @@ -181,7 +186,7 @@ self.serviceManagerList.moveUp = self.orderToolbar.addToolbarAction( u'moveUp', text=translate('OpenLP.ServiceManager', 'Move &up'), icon=u':/services/service_up.png', - tooltip=translate( 'OpenLP.ServiceManager', + tooltip=translate('OpenLP.ServiceManager', 'Move item up one position in the service.'), shortcuts=[QtCore.Qt.Key_PageUp], category=UiStrings().Service, triggers=self.onServiceUp) @@ -218,6 +223,7 @@ icon=u':/general/general_delete.png', tooltip=translate('OpenLP.ServiceManager', 'Delete the selected item from the service.'), + shortcuts=[QtCore.Qt.Key_Delete], triggers=self.onDeleteFromService) self.orderToolbar.addSeparator() self.serviceManagerList.expand = self.orderToolbar.addToolbarAction( @@ -270,8 +276,8 @@ QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'service_item_update'), self.serviceItemUpdate) # Last little bits of setting up - self.service_theme = unicode(QtCore.QSettings().value( - self.mainwindow.servicemanagerSettingsSection + u'/service theme', + self.service_theme = unicode(Settings().value( + self.mainwindow.serviceManagerSettingsSection + u'/service theme', QtCore.QVariant(u'')).toString()) self.servicePath = AppLocation.get_section_data_path(u'servicemanager') # build the drag and drop context menu @@ -298,17 +304,14 @@ self.timeAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', '&Start Time'), icon=u':/media/media_time.png', triggers=self.onStartTimeForm) - self.deleteAction = create_widget_action(self.menu, - text=translate('OpenLP.ServiceManager', '&Delete From Service'), - icon=u':/general/general_delete.png', - triggers=self.onDeleteFromService) + # Add already existing delete action to the menu. + self.menu.addAction(self.serviceManagerList.delete) self.menu.addSeparator() self.previewAction = create_widget_action(self.menu, text=translate('OpenLP.ServiceManager', 'Show &Preview'), icon=u':/general/general_preview.png', triggers=self.makePreview) - self.liveAction = create_widget_action(self.menu, - text=translate('OpenLP.ServiceManager', 'Show &Live'), - icon=u':/general/general_live.png', triggers=self.makeLive) + # Add already existing make live action to the menu. + self.menu.addAction(self.serviceManagerList.makeLive) self.menu.addSeparator() self.themeMenu = QtGui.QMenu( translate('OpenLP.ServiceManager', '&Change Item Theme')) @@ -331,6 +334,8 @@ Setter for property "modified". Sets whether or not the current service has been modified. """ + if modified: + self.serviceId += 1 self._modified = modified serviceFile = self.shortFileName() or translate( 'OpenLP.ServiceManager', 'Untitled Service') @@ -349,7 +354,7 @@ self._fileName = unicode(fileName) self.mainwindow.setServiceModified(self.isModified(), self.shortFileName()) - QtCore.QSettings(). \ + Settings(). \ setValue(u'servicemanager/last file',QtCore.QVariant(fileName)) def fileName(self): @@ -368,7 +373,7 @@ """ Triggered when Config dialog is updated. """ - self.expandTabs = QtCore.QSettings().value( + self.expandTabs = Settings().value( u'advanced/expand service item', QtCore.QVariant(u'False')).toBool() @@ -408,7 +413,7 @@ self.mainwindow, translate('OpenLP.ServiceManager', 'Open File'), SettingsManager.get_last_dir( - self.mainwindow.servicemanagerSettingsSection), + self.mainwindow.serviceManagerSettingsSection), translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz)'))) if not fileName: @@ -416,7 +421,7 @@ else: fileName = loadFile SettingsManager.set_last_dir( - self.mainwindow.servicemanagerSettingsSection, + self.mainwindow.serviceManagerSettingsSection, split_filename(fileName)[0]) self.loadFile(fileName) @@ -439,8 +444,9 @@ self.serviceManagerList.clear() self.serviceItems = [] self.setFileName(u'') + self.serviceId += 1 self.setModified(False) - QtCore.QSettings(). \ + Settings(). \ setValue(u'servicemanager/last file',QtCore.QVariant(u'')) Receiver.send_message(u'servicemanager_new_service') @@ -465,7 +471,7 @@ service_file_name = '%s.osd' % basename log.debug(u'ServiceManager.saveFile - %s', path_file_name) SettingsManager.set_last_dir( - self.mainwindow.servicemanagerSettingsSection, + self.mainwindow.serviceManagerSettingsSection, path) service = [] write_list = [] @@ -479,7 +485,7 @@ service_item = item[u'service_item'].get_service_repr() # Get all the audio files, and ready them for embedding in the # service file. - if len(service_item[u'header'][u'background_audio']) > 0: + if service_item[u'header'][u'background_audio']: for i, filename in \ enumerate(service_item[u'header'][u'background_audio']): new_file = os.path.join(u'audio', @@ -557,14 +563,12 @@ zip.write(audio_from, audio_to.encode(u'utf-8')) except IOError: log.exception(u'Failed to save service to disk: %s', temp_file_name) - # Add this line in after the release to notify the user that saving - # their file failed. Commented out due to string freeze. - #Receiver.send_message(u'openlp_error_message', { - # u'title': translate(u'OpenLP.ServiceManager', - # u'Error Saving File'), - # u'message': translate(u'OpenLP.ServiceManager', - # u'There was an error saving your file.') - #}) + Receiver.send_message(u'openlp_error_message', { + u'title': translate(u'OpenLP.ServiceManager', + u'Error Saving File'), + u'message': translate(u'OpenLP.ServiceManager', + u'There was an error saving your file.') + }) success = False finally: if zip: @@ -578,10 +582,7 @@ return self.saveFileAs() self.mainwindow.addRecentFile(path_file_name) self.setModified(False) - try: - delete_file(temp_file_name) - except: - pass + delete_file(temp_file_name) return success def saveFileAs(self): @@ -589,17 +590,17 @@ Get a file name and then call :func:`ServiceManager.saveFile` to save the file. """ - default_service_enabled = QtCore.QSettings().value( + default_service_enabled = Settings().value( u'advanced/default service enabled', QtCore.QVariant(True)).toBool() if default_service_enabled: - service_day = QtCore.QSettings().value( + service_day = Settings().value( u'advanced/default service day', 7).toInt()[0] if service_day == 7: time = datetime.now() else: - service_hour = QtCore.QSettings().value( + service_hour = Settings().value( u'advanced/default service hour', 11).toInt()[0] - service_minute = QtCore.QSettings().value( + service_minute = Settings().value( u'advanced/default service minute', 0).toInt()[0] now = datetime.now() day_delta = service_day - now.weekday() @@ -607,7 +608,7 @@ day_delta += 7 time = now + timedelta(days=day_delta) time = time.replace(hour=service_hour, minute=service_minute) - default_pattern = unicode(QtCore.QSettings().value( + default_pattern = unicode(Settings().value( u'advanced/default service name', translate('OpenLP.AdvancedTab', 'Service %Y-%m-%d %H-%M', 'This may not contain any of the following characters: ' @@ -618,7 +619,7 @@ else: default_filename = u'' directory = unicode(SettingsManager.get_last_dir( - self.mainwindow.servicemanagerSettingsSection)) + self.mainwindow.serviceManagerSettingsSection)) path = os.path.join(directory, default_filename) fileName = unicode(QtGui.QFileDialog.getSaveFileName(self.mainwindow, UiStrings().SaveService, path, @@ -688,7 +689,7 @@ self.setFileName(fileName) self.mainwindow.addRecentFile(fileName) self.setModified(False) - QtCore.QSettings().setValue( + Settings().setValue( 'servicemanager/last file', QtCore.QVariant(fileName)) else: critical_error_message_box( @@ -730,7 +731,7 @@ service was last closed. Can be blank if there was no service present. """ - fileName = QtCore.QSettings(). \ + fileName = Settings(). \ value(u'servicemanager/last file',QtCore.QVariant(u'')).toString() if fileName: self.loadFile(fileName) @@ -818,7 +819,7 @@ """ Called by the SlideController to select the next service item. """ - if len(self.serviceManagerList.selectedItems()) == 0: + if not self.serviceManagerList.selectedItems(): return selected = self.serviceManagerList.selectedItems()[0] lookFor = 0 @@ -836,7 +837,7 @@ """ Called by the SlideController to select the previous service item. """ - if len(self.serviceManagerList.selectedItems()) == 0: + if not self.serviceManagerList.selectedItems(): return selected = self.serviceManagerList.selectedItems()[0] prevItem = None @@ -1102,11 +1103,11 @@ log.debug(u'onThemeComboBoxSelected') self.service_theme = unicode(self.themeComboBox.currentText()) self.mainwindow.renderer.set_service_theme(self.service_theme) - QtCore.QSettings().setValue( - self.mainwindow.servicemanagerSettingsSection + + Settings().setValue( + self.mainwindow.serviceManagerSettingsSection + u'/service theme', QtCore.QVariant(self.service_theme)) - self.regenerateServiceItems() + self.regenerateServiceItems(True) def themeChange(self): """ @@ -1118,7 +1119,7 @@ self.themeLabel.setVisible(visible) self.themeComboBox.setVisible(visible) - def regenerateServiceItems(self): + def regenerateServiceItems(self, changed=False): """ Rebuild the service list as things have changed and a repaint is the easiest way to do this. @@ -1154,7 +1155,8 @@ repaint=False, selected=item[u'selected']) # Set to False as items may have changed rendering # does not impact the saved song so True may also be valid - self.setModified() + if changed: + self.setModified() # Repaint it once only at the end self.repaintServiceList(-1, -1) Receiver.send_message(u'cursor_normal') @@ -1282,7 +1284,7 @@ if self.serviceItems[item][u'service_item'].is_valid: self.mainwindow.liveController.addServiceManagerItem( self.serviceItems[item][u'service_item'], child) - if QtCore.QSettings().value( + if Settings().value( self.mainwindow.generalSettingsSection + u'/auto preview', QtCore.QVariant(False)).toBool(): item += 1 @@ -1313,15 +1315,15 @@ def findServiceItem(self): """ - Finds the selected ServiceItem in the list and returns the position of - the serviceitem and its selected child item. For example, if the third - child item (in the Slidecontroller known as slide) in the second service - item is selected this will return:: + Finds the first selected ServiceItem in the list and returns the + position of the serviceitem and its selected child item. For example, + if the third child item (in the Slidecontroller known as slide) in the + second service item is selected this will return:: (1, 2) """ items = self.serviceManagerList.selectedItems() - serviceItem = 0 + serviceItem = -1 serviceItemChild = -1 for item in items: parentitem = item.parent() @@ -1330,8 +1332,10 @@ else: serviceItem = parentitem.data(0, QtCore.Qt.UserRole).toInt()[0] serviceItemChild = item.data(0, QtCore.Qt.UserRole).toInt()[0] - # Adjust for zero based arrays. - serviceItem -= 1 + # Adjust for zero based arrays. + serviceItem -= 1 + # Only process the first item on the list for this method. + break return serviceItem, serviceItemChild def dragEnterEvent(self, event): @@ -1439,7 +1443,7 @@ theme = None item = self.findServiceItem()[0] self.serviceItems[item][u'service_item'].update_theme(theme) - self.regenerateServiceItems() + self.regenerateServiceItems(True) def _getParentItemData(self, item): parentitem = item.parent() diff -Nru openlp-1.9.9/openlp/core/ui/servicenoteform.py openlp-1.9.10/openlp/core/ui/servicenoteform.py --- openlp-1.9.9/openlp/core/ui/servicenoteform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/servicenoteform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,10 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import translate, SpellTextEdit -from openlp.core.lib.ui import create_accept_reject_button_box +from openlp.core.lib.ui import create_button_box class ServiceNoteForm(QtGui.QDialog): """ @@ -55,8 +56,9 @@ self.textEdit = SpellTextEdit(self, False) self.textEdit.setObjectName(u'textEdit') self.dialogLayout.addWidget(self.textEdit) - self.dialogLayout.addWidget(create_accept_reject_button_box(self)) - QtCore.QMetaObject.connectSlotsByName(self) + self.buttonBox = create_button_box(self, u'buttonBox', + [u'cancel', u'save']) + self.dialogLayout.addWidget(self.buttonBox) def retranslateUi(self): self.setWindowTitle( diff -Nru openlp-1.9.9/openlp/core/ui/settingsdialog.py openlp-1.9.10/openlp/core/ui/settingsdialog.py --- openlp-1.9.9/openlp/core/ui/settingsdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/settingsdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,7 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate, build_icon -from openlp.core.lib.ui import create_accept_reject_button_box +from openlp.core.lib.ui import create_button_box class Ui_SettingsDialog(object): def setupUi(self, settingsDialog): @@ -49,10 +50,10 @@ self.stackedLayout = QtGui.QStackedLayout() self.stackedLayout.setObjectName(u'stackedLayout') self.dialogLayout.addLayout(self.stackedLayout, 0, 1, 1, 1) - self.buttonBox = create_accept_reject_button_box(settingsDialog, True) + self.buttonBox = create_button_box(settingsDialog, u'buttonBox', + [u'cancel', u'ok']) self.dialogLayout.addWidget(self.buttonBox, 1, 1, 1, 1) self.retranslateUi(settingsDialog) - QtCore.QMetaObject.connectSlotsByName(settingsDialog) QtCore.QObject.connect(self.settingListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.tabChanged) diff -Nru openlp-1.9.9/openlp/core/ui/settingsform.py openlp-1.9.10/openlp/core/ui/settingsform.py --- openlp-1.9.9/openlp/core/ui/settingsform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/settingsform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -29,7 +30,7 @@ """ import logging -from PyQt4 import QtGui +from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, build_icon, PluginStatus from openlp.core.ui import AdvancedTab, GeneralTab, ThemesTab @@ -65,8 +66,8 @@ self.insertTab(self.advancedTab, 2, PluginStatus.Active) count = 3 for plugin in self.plugins: - if plugin.settings_tab: - self.insertTab(plugin.settings_tab, count, plugin.status) + if plugin.settingsTab: + self.insertTab(plugin.settingsTab, count, plugin.status) count += 1 self.settingListWidget.setCurrentRow(0) return QtGui.QDialog.exec_(self) @@ -80,7 +81,7 @@ pos = self.stackedLayout.addWidget(tab) if is_active: item_name = QtGui.QListWidgetItem(tab.tabTitleVisible) - icon = build_icon(tab.icon_path) + icon = build_icon(tab.iconPath) item_name.setIcon(icon) self.settingListWidget.insertItem(location, item_name) else: @@ -92,7 +93,7 @@ """ Process the form saving the settings """ - for tabIndex in range(0, self.stackedLayout.count()): + for tabIndex in range(self.stackedLayout.count()): self.stackedLayout.widget(tabIndex).save() # Must go after all settings are save Receiver.send_message(u'config_updated') @@ -102,7 +103,7 @@ """ Process the form saving the settings """ - for tabIndex in range(0, self.stackedLayout.count()): + for tabIndex in range(self.stackedLayout.count()): self.stackedLayout.widget(tabIndex).cancel() return QtGui.QDialog.reject(self) @@ -114,8 +115,8 @@ self.themesTab.postSetUp() self.advancedTab.postSetUp() for plugin in self.plugins: - if plugin.settings_tab: - plugin.settings_tab.postSetUp() + if plugin.settingsTab: + plugin.settingsTab.postSetUp() def tabChanged(self, tabIndex): """ diff -Nru openlp-1.9.9/openlp/core/ui/shortcutlistdialog.py openlp-1.9.10/openlp/core/ui/shortcutlistdialog.py --- openlp-1.9.9/openlp/core/ui/shortcutlistdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/shortcutlistdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,6 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate, build_icon +from openlp.core.lib.ui import create_button_box class CaptureShortcutButton(QtGui.QPushButton): """ @@ -108,18 +110,11 @@ self.alternateLabel.setObjectName(u'alternateLabel') self.detailsLayout.addWidget(self.alternateLabel, 0, 2, 1, 1) self.shortcutListLayout.addLayout(self.detailsLayout) - self.buttonBox = QtGui.QDialogButtonBox(shortcutListDialog) - self.buttonBox.setObjectName(u'buttonBox') + self.buttonBox = create_button_box(shortcutListDialog, u'buttonBox', + [u'cancel', u'ok', u'defaults']) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | - QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.RestoreDefaults) self.shortcutListLayout.addWidget(self.buttonBox) self.retranslateUi(shortcutListDialog) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), - shortcutListDialog.accept) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), - shortcutListDialog.reject) - QtCore.QMetaObject.connectSlotsByName(shortcutListDialog) def retranslateUi(self, shortcutListDialog): shortcutListDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/core/ui/shortcutlistform.py openlp-1.9.10/openlp/core/ui/shortcutlistform.py --- openlp-1.9.9/openlp/core/ui/shortcutlistform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/shortcutlistform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -31,6 +32,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver +from openlp.core.lib.settings import Settings from openlp.core.utils import translate from openlp.core.utils.actions import ActionList from shortcutlistdialog import Ui_ShortcutListDialog @@ -151,7 +153,7 @@ if action is None: continue shortcuts = self._actionShortcuts(action) - if len(shortcuts) == 0: + if not shortcuts: item.setText(1, u'') item.setText(2, u'') elif len(shortcuts) == 1: @@ -195,7 +197,7 @@ return shortcuts = self._actionShortcuts(action) new_shortcuts = [] - if len(shortcuts) != 0: + if shortcuts: new_shortcuts.append(shortcuts[0]) new_shortcuts.append( QtGui.QKeySequence(self.alternatePushButton.text())) @@ -241,7 +243,7 @@ self.primaryPushButton.setChecked(False) self.alternatePushButton.setChecked(False) else: - if len(action.defaultShortcuts) != 0: + if action.defaultShortcuts: primary_label_text = action.defaultShortcuts[0].toString() if len(action.defaultShortcuts) == 2: alternate_label_text = action.defaultShortcuts[1].toString() @@ -313,7 +315,7 @@ self.refreshShortcutList() primary_button_text = u'' alternate_button_text = u'' - if len(temp_shortcuts) != 0: + if temp_shortcuts: primary_button_text = temp_shortcuts[0].toString() if len(temp_shortcuts) == 2: alternate_button_text = temp_shortcuts[1].toString() @@ -337,7 +339,7 @@ Save the shortcuts. **Note**, that we do not have to load the shortcuts, as they are loaded in :class:`~openlp.core.utils.ActionList`. """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(u'shortcuts') for category in self.action_list.categories: # Check if the category is for internal use only. @@ -363,7 +365,7 @@ return shortcuts = self._actionShortcuts(action) new_shortcuts = [] - if len(action.defaultShortcuts) != 0: + if action.defaultShortcuts: new_shortcuts.append(action.defaultShortcuts[0]) # We have to check if the primary default shortcut is available. But # we only have to check, if the action has a default primary @@ -391,7 +393,7 @@ return shortcuts = self._actionShortcuts(action) new_shortcuts = [] - if len(shortcuts) != 0: + if shortcuts: new_shortcuts.append(shortcuts[0]) if len(action.defaultShortcuts) == 2: new_shortcuts.append(action.defaultShortcuts[1]) diff -Nru openlp-1.9.9/openlp/core/ui/slidecontroller.py openlp-1.9.10/openlp/core/ui/slidecontroller.py --- openlp-1.9.9/openlp/core/ui/slidecontroller.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/slidecontroller.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -35,6 +36,7 @@ from openlp.core.lib import OpenLPToolbar, Receiver, ItemCapabilities, \ translate, build_icon, build_html, PluginManager, ServiceItem from openlp.core.lib.ui import UiStrings, create_action +from openlp.core.lib.settings import Settings from openlp.core.lib import SlideLimits, ServiceItemAction from openlp.core.ui import HideMode, MainDisplay, Display, ScreenList from openlp.core.utils.actions import ActionList, CategoryOrder @@ -73,6 +75,7 @@ controller = self Receiver.send_message('%s' % sender, [controller, args]) + class SlideController(Controller): """ SlideController is the slide controller widget. This widget is what the @@ -83,7 +86,7 @@ Set up the Slide Controller. """ Controller.__init__(self, parent, isLive) - self.screens = ScreenList.get_instance() + self.screens = ScreenList() try: self.ratio = float(self.screens.current[u'size'].width()) / \ float(self.screens.current[u'size'].height()) @@ -236,7 +239,7 @@ text=UiStrings().PlaySlidesToEnd, icon=u':/media/media_time.png', checked=False, shortcuts=[], category=self.category, triggers=self.onPlaySlidesOnce) - if QtCore.QSettings().value(self.parent().generalSettingsSection + + if Settings().value(self.parent().generalSettingsSection + u'/enable slide loop', QtCore.QVariant(True)).toBool(): self.playSlidesMenu.setDefaultAction(self.playSlidesLoop) else: @@ -291,7 +294,7 @@ self.toolbar.widgetForAction(self.audioPauseItem).setPopupMode( QtGui.QToolButton.MenuButtonPopup) self.nextTrackItem = create_action(self, u'nextTrackItem', - text=translate('OpenLP.SlideController', 'Next Track'), + text=UiStrings().NextTrack, icon=u':/slides/media_playback_next.png', tooltip=translate( 'OpenLP.SlideController', 'Go to next audio track.'), category=self.category, context=QtCore.Qt.WindowShortcut, @@ -373,7 +376,7 @@ u'text': translate('OpenLP.SlideController', 'Go to "Ending"')}, {u'key': u'O', u'configurable': True, u'text': translate('OpenLP.SlideController', 'Go to "Other"')}] - shortcuts += [{u'key': unicode(number)} for number in range(0, 10)] + shortcuts += [{u'key': unicode(number)} for number in range(10)] self.previewListWidget.addActions([create_action(self, u'shortcutAction_%s' % s[u'key'], text=s.get(u'text'), shortcuts=[QtGui.QKeySequence(s[u'key'])], @@ -555,7 +558,7 @@ Process the service item request queue. The key presses can arrive faster than the processing so implement a FIFO queue. """ - if len(self.keypress_queue): + if self.keypress_queue: while len(self.keypress_queue) and not self.keypress_loop: self.keypress_loop = True keypressCommand = self.keypress_queue.popleft() @@ -577,8 +580,7 @@ # rebuild display as screen size changed if self.display: self.display.close() - self.display = MainDisplay(self, self.imageManager, self.isLive, - self) + self.display = MainDisplay(self, self.imageManager, self.isLive, self) self.display.setup() if self.isLive: self.__addActionsToWidget(self.display) @@ -648,8 +650,8 @@ def onSongBarHandler(self): request = unicode(self.sender().text()) - slideno = self.slideList[request] - self.__updatePreviewSelection(slideno) + slide_no = self.slideList[request] + self.__updatePreviewSelection(slide_no) self.slideSelected() def receiveSpinDelay(self, value): @@ -662,8 +664,8 @@ """ Updates the Slide Limits variable from the settings. """ - self.slide_limits = QtCore.QSettings().value( - self.parent().advancedlSettingsSection + u'/slide limits', + self.slide_limits = Settings().value( + self.parent().advancedSettingsSection + u'/slide limits', QtCore.QVariant(SlideLimits.End)).toInt()[0] def enableToolBar(self, item): @@ -692,9 +694,9 @@ self.playSlidesLoop.setChecked(False) self.playSlidesLoop.setIcon(build_icon(u':/media/media_time.png')) if item.is_text(): - if QtCore.QSettings().value( + if Settings().value( self.parent().songsSettingsSection + u'/display songbar', - QtCore.QVariant(True)).toBool() and len(self.slideList) > 0: + QtCore.QVariant(True)).toBool() and self.slideList: self.songMenu.show() if item.is_capable(ItemCapabilities.CanLoop) and \ len(item.get_frames()) > 1: @@ -813,11 +815,11 @@ QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), self.onTrackTriggered) - self.display.audioPlayer.repeat = QtCore.QSettings().value( + self.display.audioPlayer.repeat = Settings().value( self.parent().generalSettingsSection + \ u'/audio repeat list', QtCore.QVariant(False)).toBool() - if QtCore.QSettings().value( + if Settings().value( self.parent().generalSettingsSection + \ u'/audio start paused', QtCore.QVariant(True)).toBool(): @@ -859,11 +861,11 @@ # If current slide set background to image if framenumber == slideno: self.serviceItem.bg_image_bytes = \ - self.imageManager.get_image_bytes(frame[u'title']) - image = self.imageManager.get_image(frame[u'title']) + self.imageManager.getImageBytes(frame[u'title']) + image = self.imageManager.getImage(frame[u'title']) label.setPixmap(QtGui.QPixmap.fromImage(image)) self.previewListWidget.setCellWidget(framenumber, 0, label) - slideHeight = width * self.parent().renderer.screen_ratio + slideHeight = width * (1 / self.ratio) row += 1 self.slideList[unicode(row)] = row - 1 text.append(unicode(row)) @@ -930,7 +932,7 @@ Allow the main display to blank the main display at startup time """ log.debug(u'mainDisplaySetBackground live = %s' % self.isLive) - display_type = QtCore.QSettings().value( + display_type = Settings().value( self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'')).toString() if self.screens.which_screen(self.window()) != \ @@ -971,11 +973,11 @@ self.themeScreen.setChecked(False) self.desktopScreen.setChecked(False) if checked: - QtCore.QSettings().setValue( + Settings().setValue( self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'blanked')) else: - QtCore.QSettings().remove( + Settings().remove( self.parent().generalSettingsSection + u'/screen blank') self.blankPlugin() self.updatePreview() @@ -992,11 +994,11 @@ self.themeScreen.setChecked(checked) self.desktopScreen.setChecked(False) if checked: - QtCore.QSettings().setValue( + Settings().setValue( self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'themed')) else: - QtCore.QSettings().remove( + Settings().remove( self.parent().generalSettingsSection + u'/screen blank') self.blankPlugin() self.updatePreview() @@ -1013,11 +1015,11 @@ self.themeScreen.setChecked(False) self.desktopScreen.setChecked(checked) if checked: - QtCore.QSettings().setValue( + Settings().setValue( self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'hidden')) else: - QtCore.QSettings().remove( + Settings().remove( self.parent().generalSettingsSection + u'/screen blank') self.hidePlugin(checked) self.updatePreview() @@ -1311,7 +1313,7 @@ """ triggered by clicking the Preview slide items """ - if QtCore.QSettings().value(u'advanced/double click live', + if Settings().value(u'advanced/double click live', QtCore.QVariant(False)).toBool(): # Live and Preview have issues if we have video or presentations # playing in both at the same time. diff -Nru openlp-1.9.9/openlp/core/ui/splashscreen.py openlp-1.9.10/openlp/core/ui/splashscreen.py --- openlp-1.9.9/openlp/core/ui/splashscreen.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/splashscreen.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -42,4 +43,3 @@ self.setPixmap(splash_image) self.setMask(splash_image.mask()) self.resize(370, 370) - QtCore.QMetaObject.connectSlotsByName(self) diff -Nru openlp-1.9.9/openlp/core/ui/starttimedialog.py openlp-1.9.10/openlp/core/ui/starttimedialog.py --- openlp-1.9.9/openlp/core/ui/starttimedialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/starttimedialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,7 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box +from openlp.core.lib.ui import UiStrings, create_button_box class Ui_StartTimeDialog(object): def setupUi(self, StartTimeDialog): @@ -99,11 +100,11 @@ self.secondFinishLabel.setAlignment(QtCore.Qt.AlignRight) self.dialogLayout.addWidget(self.secondFinishLabel, 3, 3, 1, 1) self.dialogLayout.addWidget(self.secondSpinBox, 3, 1, 1, 1) - self.buttonBox = create_accept_reject_button_box(StartTimeDialog, True) + self.buttonBox = create_button_box(StartTimeDialog, u'buttonBox', + [u'cancel', u'ok']) self.dialogLayout.addWidget(self.buttonBox, 5, 2, 1, 2) self.retranslateUi(StartTimeDialog) self.setMaximumHeight(self.sizeHint().height()) - QtCore.QMetaObject.connectSlotsByName(StartTimeDialog) def retranslateUi(self, StartTimeDialog): self.setWindowTitle(translate('OpenLP.StartTimeForm', diff -Nru openlp-1.9.9/openlp/core/ui/starttimeform.py openlp-1.9.10/openlp/core/ui/starttimeform.py --- openlp-1.9.9/openlp/core/ui/starttimeform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/starttimeform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/core/ui/themeform.py openlp-1.9.10/openlp/core/ui/themeform.py --- openlp-1.9.9/openlp/core/ui/themeform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/themeform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -136,16 +137,14 @@ """ self.backgroundPage.registerField( u'background_type', self.backgroundComboBox) - self.backgroundPage.registerField( - u'color', self.colorButton) + self.backgroundPage.registerField(u'color', self.colorButton) self.backgroundPage.registerField( u'grandient_start', self.gradientStartButton) self.backgroundPage.registerField( u'grandient_end', self.gradientEndButton) self.backgroundPage.registerField( u'background_image', self.imageFileEdit) - self.backgroundPage.registerField( - u'gradient', self.gradientComboBox) + self.backgroundPage.registerField(u'gradient', self.gradientComboBox) self.mainAreaPage.registerField( u'mainColorButton', self.mainColorButton) self.mainAreaPage.registerField( @@ -158,8 +157,7 @@ u'outlineColorButton', self.outlineColorButton) self.mainAreaPage.registerField( u'outlineSizeSpinBox', self.outlineSizeSpinBox) - self.mainAreaPage.registerField( - u'shadowCheckBox', self.shadowCheckBox) + self.mainAreaPage.registerField(u'shadowCheckBox', self.shadowCheckBox) self.mainAreaPage.registerField( u'mainBoldCheckBox', self.mainBoldCheckBox) self.mainAreaPage.registerField( @@ -170,10 +168,8 @@ u'shadowSizeSpinBox', self.shadowSizeSpinBox) self.mainAreaPage.registerField( u'footerSizeSpinBox', self.footerSizeSpinBox) - self.areaPositionPage.registerField( - u'mainPositionX', self.mainXSpinBox) - self.areaPositionPage.registerField( - u'mainPositionY', self.mainYSpinBox) + self.areaPositionPage.registerField(u'mainPositionX', self.mainXSpinBox) + self.areaPositionPage.registerField(u'mainPositionY', self.mainYSpinBox) self.areaPositionPage.registerField( u'mainPositionWidth', self.mainWidthSpinBox) self.areaPositionPage.registerField( @@ -188,12 +184,10 @@ u'footerPositionHeight', self.footerHeightSpinBox) self.backgroundPage.registerField( u'horizontal', self.horizontalComboBox) - self.backgroundPage.registerField( - u'vertical', self.verticalComboBox) + self.backgroundPage.registerField(u'vertical', self.verticalComboBox) self.backgroundPage.registerField( u'slideTransition', self.transitionsCheckBox) - self.backgroundPage.registerField( - u'name', self.themeNameEdit) + self.backgroundPage.registerField(u'name', self.themeNameEdit) def calculateLines(self): """ @@ -269,10 +263,7 @@ Change state as Outline check box changed """ if self.updateThemeAllowed: - if state == QtCore.Qt.Checked: - self.theme.font_main_outline = True - else: - self.theme.font_main_outline = False + self.theme.font_main_outline = state == QtCore.Qt.Checked self.outlineColorButton.setEnabled(self.theme.font_main_outline) self.outlineSizeSpinBox.setEnabled(self.theme.font_main_outline) self.calculateLines() @@ -350,19 +341,19 @@ if self.theme.background_type == \ BackgroundType.to_string(BackgroundType.Solid): self.colorButton.setStyleSheet(u'background-color: %s' % - self.theme.background_color) + self.theme.background_color) self.setField(u'background_type', QtCore.QVariant(0)) elif self.theme.background_type == \ BackgroundType.to_string(BackgroundType.Gradient): self.gradientStartButton.setStyleSheet(u'background-color: %s' % - self.theme.background_start_color) + self.theme.background_start_color) self.gradientEndButton.setStyleSheet(u'background-color: %s' % - self.theme.background_end_color) + self.theme.background_end_color) self.setField(u'background_type', QtCore.QVariant(1)) elif self.theme.background_type == \ BackgroundType.to_string(BackgroundType.Image): self.imageColorButton.setStyleSheet(u'background-color: %s' % - self.theme.background_border_color) + self.theme.background_border_color) self.imageFileEdit.setText(self.theme.background_filename) self.setField(u'background_type', QtCore.QVariant(2)) elif self.theme.background_type == \ @@ -608,7 +599,7 @@ def accept(self): """ - Lets save the theme as Finish has been pressed + Lets save the theme as Finish has been triggered """ # Save the theme name self.theme.theme_name = unicode(self.field(u'name').toString()) @@ -642,8 +633,7 @@ """ Handle Color buttons """ - new_color = QtGui.QColorDialog.getColor( - QtGui.QColor(field), self) + new_color = QtGui.QColorDialog.getColor(QtGui.QColor(field), self) if new_color.isValid(): field = new_color.name() return field diff -Nru openlp-1.9.9/openlp/core/ui/themelayoutdialog.py openlp-1.9.10/openlp/core/ui/themelayoutdialog.py --- openlp-1.9.9/openlp/core/ui/themelayoutdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/themelayoutdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,9 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import translate +from openlp.core.lib.ui import create_button_box class Ui_ThemeLayoutDialog(object): @@ -35,34 +37,30 @@ themeLayoutDialog.setObjectName(u'themeLayoutDialogDialog') #themeLayoutDialog.resize(300, 200) self.previewLayout = QtGui.QVBoxLayout(themeLayoutDialog) - self.previewLayout.setObjectName(u'PreviewLayout') + self.previewLayout.setObjectName(u'previewLayout') self.previewArea = QtGui.QWidget(themeLayoutDialog) - self.previewArea.setObjectName(u'PreviewArea') + self.previewArea.setObjectName(u'previewArea') self.previewAreaLayout = QtGui.QGridLayout(self.previewArea) self.previewAreaLayout.setMargin(0) self.previewAreaLayout.setColumnStretch(0, 1) self.previewAreaLayout.setRowStretch(0, 1) - self.previewAreaLayout.setObjectName(u'PreviewAreaLayout') + self.previewAreaLayout.setObjectName(u'previewAreaLayout') self.themeDisplayLabel = QtGui.QLabel(self.previewArea) self.themeDisplayLabel.setFrameShape(QtGui.QFrame.Box) self.themeDisplayLabel.setScaledContents(True) - self.themeDisplayLabel.setObjectName(u'ThemeDisplayLabel') + self.themeDisplayLabel.setObjectName(u'themeDisplayLabel') self.previewAreaLayout.addWidget(self.themeDisplayLabel) self.previewLayout.addWidget(self.previewArea) self.mainColourLabel = QtGui.QLabel(self.previewArea) - self.mainColourLabel.setObjectName(u'MainColourLabel') + self.mainColourLabel.setObjectName(u'mainColourLabel') self.previewLayout.addWidget(self.mainColourLabel) self.footerColourLabel = QtGui.QLabel(self.previewArea) - self.footerColourLabel.setObjectName(u'FooterColourLabel') + self.footerColourLabel.setObjectName(u'footerColourLabel') self.previewLayout.addWidget(self.footerColourLabel) - self.buttonBox = QtGui.QDialogButtonBox(themeLayoutDialog) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName(u'ButtonBox') - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), - themeLayoutDialog.accept) + self.buttonBox = create_button_box(themeLayoutDialog, u'buttonBox', + [u'ok']) self.previewLayout.addWidget(self.buttonBox) self.retranslateUi(themeLayoutDialog) - QtCore.QMetaObject.connectSlotsByName(themeLayoutDialog) def retranslateUi(self, themeLayoutDialog): themeLayoutDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/core/ui/themelayoutform.py openlp-1.9.10/openlp/core/ui/themelayoutform.py --- openlp-1.9.9/openlp/core/ui/themelayoutform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/themelayoutform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/core/ui/thememanager.py openlp-1.9.10/openlp/core/ui/thememanager.py --- openlp-1.9.9/openlp/core/ui/thememanager.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/thememanager.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -40,6 +41,7 @@ check_directory_exists, create_thumb, validate_thumb from openlp.core.lib.theme import ThemeXML, BackgroundType, VerticalType, \ BackgroundGradientType +from openlp.core.lib.settings import Settings from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ create_widget_action from openlp.core.theme import Theme @@ -164,7 +166,7 @@ """ Triggered when Config dialog is updated. """ - self.global_theme = unicode(QtCore.QSettings().value( + self.global_theme = unicode(Settings().value( self.settingsSection + u'/global theme', QtCore.QVariant(u'')).toString()) @@ -220,6 +222,8 @@ name = unicode(translate('OpenLP.ThemeManager', '%s (default)')) % new_name self.themeListWidget.item(count).setText(name) + self.deleteToolbarAction.setVisible( + item not in self.themeListWidget.selectedItems()) def changeGlobalFromScreen(self, index=-1): """ @@ -242,11 +246,10 @@ name = unicode(translate('OpenLP.ThemeManager', '%s (default)')) % self.global_theme self.themeListWidget.item(count).setText(name) - QtCore.QSettings().setValue( + Settings().setValue( self.settingsSection + u'/global theme', QtCore.QVariant(self.global_theme)) - Receiver.send_message(u'theme_update_global', - self.global_theme) + Receiver.send_message(u'theme_update_global', self.global_theme) self._pushThemes() def onAddTheme(self): @@ -255,6 +258,7 @@ editing form for the user to make their customisations. """ theme = ThemeXML() + theme.set_default_header_footer() self.themeForm.theme = theme self.themeForm.exec_() @@ -282,6 +286,8 @@ if plugin.usesTheme(old_theme_name): plugin.renameTheme(old_theme_name, new_theme_name) self.loadThemes() + self.mainwindow.renderer.update_theme( + new_theme_name, old_theme_name) def onCopyTheme(self): """ @@ -318,9 +324,8 @@ Loads the settings for the theme that is to be edited and launches the theme editing form so the user can make their changes. """ - if check_item_selected(self.themeListWidget, - translate('OpenLP.ThemeManager', - 'You must select a theme to edit.')): + if check_item_selected(self.themeListWidget, translate( + 'OpenLP.ThemeManager', 'You must select a theme to edit.')): item = self.themeListWidget.currentItem() theme = self.getThemeData( unicode(item.data(QtCore.Qt.UserRole).toString())) @@ -329,6 +334,7 @@ self.themeForm.theme = theme self.themeForm.exec_(True) self.old_background_image = None + self.mainwindow.renderer.update_theme(theme.theme_name) def onDeleteTheme(self): """ @@ -346,6 +352,7 @@ # As we do not reload the themes, push out the change. Reload the # list as the internal lists and events need to be triggered. self._pushThemes() + self.mainwindow.renderer.update_theme(theme, only_delete=True) def deleteTheme(self, theme): """ @@ -442,11 +449,11 @@ self.firstTime() files = SettingsManager.get_files(self.settingsSection, u'.png') # No themes have been found so create one - if len(files) == 0: + if not files: theme = ThemeXML() theme.theme_name = UiStrings().Default self._writeTheme(theme, None, None) - QtCore.QSettings().setValue( + Settings().setValue( self.settingsSection + u'/global theme', QtCore.QVariant(theme.theme_name)) self.configUpdated() @@ -529,6 +536,7 @@ zip = None out_file = None file_xml = None + abort_import = True try: zip = zipfile.ZipFile(file_name) xml_file = filter(lambda name: @@ -661,9 +669,9 @@ self._writeTheme(theme, image_from, image_to) if theme.background_type == \ BackgroundType.to_string(BackgroundType.Image): - self.mainwindow.imageManager.update_image(theme.theme_name, + self.mainwindow.imageManager.updateImage(theme.theme_name, u'theme', QtGui.QColor(theme.background_border_color)) - self.mainwindow.imageManager.process_updates() + self.mainwindow.imageManager.processUpdates() self.loadThemes() def _writeTheme(self, theme, image_from, image_to): @@ -765,7 +773,7 @@ Check to see if theme has been selected and the destructive action is allowed. """ - self.global_theme = unicode(QtCore.QSettings().value( + self.global_theme = unicode(Settings().value( self.settingsSection + u'/global theme', QtCore.QVariant(u'')).toString()) if check_item_selected(self.themeListWidget, select_text): diff -Nru openlp-1.9.9/openlp/core/ui/themestab.py openlp-1.9.10/openlp/core/ui/themestab.py --- openlp-1.9.9/openlp/core/ui/themestab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/themestab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -30,6 +31,7 @@ from openlp.core.lib import SettingsTab, Receiver, translate from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box +from openlp.core.lib.settings import Settings class ThemesTab(SettingsTab): """ @@ -39,7 +41,7 @@ self.mainwindow = mainwindow generalTranslated = translate('OpenLP.ThemesTab', 'Themes') SettingsTab.__init__(self, parent, u'Themes', generalTranslated) - self.icon_path = u':/themes/theme_new.png' + self.iconPath = u':/themes/theme_new.png' def setupUi(self): self.setObjectName(u'ThemesTab') @@ -71,32 +73,36 @@ self.SongLevelRadioButton = QtGui.QRadioButton(self.LevelGroupBox) self.SongLevelRadioButton.setObjectName(u'SongLevelRadioButton') self.SongLevelLabel = QtGui.QLabel(self.LevelGroupBox) - self.SongLevelLabel.setWordWrap(True) self.SongLevelLabel.setObjectName(u'SongLevelLabel') self.LevelLayout.addRow(self.SongLevelRadioButton, self.SongLevelLabel) self.ServiceLevelRadioButton = QtGui.QRadioButton(self.LevelGroupBox) self.ServiceLevelRadioButton.setObjectName(u'ServiceLevelRadioButton') self.ServiceLevelLabel = QtGui.QLabel(self.LevelGroupBox) - self.ServiceLevelLabel.setWordWrap(True) self.ServiceLevelLabel.setObjectName(u'ServiceLevelLabel') self.LevelLayout.addRow(self.ServiceLevelRadioButton, self.ServiceLevelLabel) self.GlobalLevelRadioButton = QtGui.QRadioButton(self.LevelGroupBox) - self.GlobalLevelRadioButton.setChecked(True) self.GlobalLevelRadioButton.setObjectName(u'GlobalLevelRadioButton') self.GlobalLevelLabel = QtGui.QLabel(self.LevelGroupBox) - self.GlobalLevelLabel.setWordWrap(True) self.GlobalLevelLabel.setObjectName(u'GlobalLevelLabel') self.LevelLayout.addRow(self.GlobalLevelRadioButton, self.GlobalLevelLabel) + label_top_margin = (self.SongLevelRadioButton.sizeHint().height() - + self.SongLevelLabel.sizeHint().height()) / 2 + for label in [self.SongLevelLabel, self.ServiceLevelLabel, + self.GlobalLevelLabel]: + rect = label.rect() + rect.setTop(rect.top() + label_top_margin) + label.setFrameRect(rect) + label.setWordWrap(True) self.rightLayout.addWidget(self.LevelGroupBox) self.rightLayout.addStretch() QtCore.QObject.connect(self.SongLevelRadioButton, - QtCore.SIGNAL(u'pressed()'), self.onSongLevelButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onSongLevelButtonClicked) QtCore.QObject.connect(self.ServiceLevelRadioButton, - QtCore.SIGNAL(u'pressed()'), self.onServiceLevelButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onServiceLevelButtonClicked) QtCore.QObject.connect(self.GlobalLevelRadioButton, - QtCore.SIGNAL(u'pressed()'), self.onGlobalLevelButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onGlobalLevelButtonClicked) QtCore.QObject.connect(self.DefaultComboBox, QtCore.SIGNAL(u'activated(int)'), self.onDefaultComboBoxChanged) QtCore.QObject.connect(Receiver.get_receiver(), @@ -128,12 +134,11 @@ 'any themes associated with either the service or the songs.')) def load(self): - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) self.theme_level = settings.value( - u'theme level', QtCore.QVariant(ThemeLevel.Global)).toInt()[0] - self.global_theme = unicode(settings.value( - u'global theme', QtCore.QVariant(u'')).toString()) + u'theme level', ThemeLevel.Song).toInt()[0] + self.global_theme = unicode(settings.value(u'global theme').toString()) settings.endGroup() if self.theme_level == ThemeLevel.Global: self.GlobalLevelRadioButton.setChecked(True) @@ -143,31 +148,31 @@ self.SongLevelRadioButton.setChecked(True) def save(self): - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) settings.setValue(u'theme level', QtCore.QVariant(self.theme_level)) settings.setValue(u'global theme', QtCore.QVariant(self.global_theme)) settings.endGroup() - self.mainwindow.renderer.set_global_theme( - self.global_theme, self.theme_level) + self.mainwindow.renderer.set_global_theme(self.global_theme) + self.mainwindow.renderer.set_theme_level(self.theme_level) Receiver.send_message(u'theme_update_global', self.global_theme) def postSetUp(self): Receiver.send_message(u'theme_update_global', self.global_theme) - def onSongLevelButtonPressed(self): + def onSongLevelButtonClicked(self): self.theme_level = ThemeLevel.Song - def onServiceLevelButtonPressed(self): + def onServiceLevelButtonClicked(self): self.theme_level = ThemeLevel.Service - def onGlobalLevelButtonPressed(self): + def onGlobalLevelButtonClicked(self): self.theme_level = ThemeLevel.Global def onDefaultComboBoxChanged(self, value): self.global_theme = unicode(self.DefaultComboBox.currentText()) - self.mainwindow.renderer.set_global_theme( - self.global_theme, self.theme_level) + self.mainwindow.renderer.set_global_theme(self.global_theme) + self.mainwindow.renderer.set_theme_level(self.theme_level) self.__previewGlobalTheme() def updateThemeList(self, theme_list): @@ -180,14 +185,14 @@ [u'Bible Theme', u'Song Theme'] """ # Reload as may have been triggered by the ThemeManager. - self.global_theme = unicode(QtCore.QSettings().value( + self.global_theme = unicode(Settings().value( self.settingsSection + u'/global theme', QtCore.QVariant(u'')).toString()) self.DefaultComboBox.clear() self.DefaultComboBox.addItems(theme_list) find_and_set_in_combo_box(self.DefaultComboBox, self.global_theme) - self.mainwindow.renderer.set_global_theme( - self.global_theme, self.theme_level) + self.mainwindow.renderer.set_global_theme(self.global_theme) + self.mainwindow.renderer.set_theme_level(self.theme_level) if self.global_theme is not u'': self.__previewGlobalTheme() diff -Nru openlp-1.9.9/openlp/core/ui/themewizard.py openlp-1.9.10/openlp/core/ui/themewizard.py --- openlp-1.9.9/openlp/core/ui/themewizard.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/themewizard.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -30,7 +31,8 @@ from openlp.core.lib import translate, build_icon from openlp.core.lib.theme import HorizontalType, BackgroundType, \ BackgroundGradientType -from openlp.core.lib.ui import UiStrings, add_welcome_page, create_valign_combo +from openlp.core.lib.ui import UiStrings, add_welcome_page, \ + create_valign_selection_widgets class Ui_ThemeWizard(object): def setupUi(self, themeWizard): @@ -257,8 +259,11 @@ self.horizontalComboBox.setObjectName(u'HorizontalComboBox') self.alignmentLayout.addRow(self.horizontalLabel, self.horizontalComboBox) - create_valign_combo(themeWizard, self.alignmentPage, - self.alignmentLayout) + self.verticalLabel, self.verticalComboBox = \ + create_valign_selection_widgets(self.alignmentPage) + self.verticalLabel.setObjectName(u'verticalLabel') + self.verticalComboBox.setObjectName(u'verticalComboBox') + self.alignmentLayout.addRow(self.verticalLabel, self.verticalComboBox) self.transitionsLabel = QtGui.QLabel(self.alignmentPage) self.transitionsLabel.setObjectName(u'TransitionsLabel') self.transitionsCheckBox = QtGui.QCheckBox(self.alignmentPage) @@ -413,7 +418,6 @@ QtCore.QObject.connect(self.footerPositionCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.footerHeightSpinBox, QtCore.SLOT(u'setDisabled(bool)')) - QtCore.QMetaObject.connectSlotsByName(themeWizard) def retranslateUi(self, themeWizard): themeWizard.setWindowTitle( diff -Nru openlp-1.9.9/openlp/core/ui/wizard.py openlp-1.9.10/openlp/core/ui/wizard.py --- openlp-1.9.9/openlp/core/ui/wizard.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/ui/wizard.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -44,18 +45,9 @@ # Applications/Formats we import from or export to. These get used in # multiple places but do not need translating unless you find evidence of # the writers translating their own product name. - CCLI = u'CCLI/SongSelect' CSV = u'CSV' - EW = u'EasyWorship' - ES = u'EasySlides' - FP = u'Foilpresenter' - OL = u'OpenLyrics' OS = u'OpenSong' OSIS = u'OSIS' - SB = u'SongBeamer' - SoF = u'Songs of Fellowship' - SSP = u'SongShow Plus' - WoW = u'Words of Worship' # These strings should need a good reason to be retranslated elsewhere. FinishedImport = translate('OpenLP.Ui', 'Finished import.') FormatLabel = translate('OpenLP.Ui', 'Format:') @@ -70,11 +62,16 @@ 'importer, you will need to install the "python-sqlite" ' 'module.') OpenTypeFile = unicode(translate('OpenLP.Ui', 'Open %s File')) + OpenTypeFolder = unicode(translate('OpenLP.Ui', 'Open %s Folder')) PercentSymbolFormat = unicode(translate('OpenLP.Ui', '%p%')) Ready = translate('OpenLP.Ui', 'Ready.') StartingImport = translate('OpenLP.Ui', 'Starting import...') - YouSpecifyFile = unicode(translate('OpenLP.Ui', 'You need to specify at ' + YouSpecifyFile = unicode(translate('OpenLP.Ui', 'You need to specify one ' + '%s file to import from.', 'A file type e.g. OpenSong')) + YouSpecifyFiles = unicode(translate('OpenLP.Ui', 'You need to specify at ' 'least one %s file to import from.', 'A file type e.g. OpenSong')) + YouSpecifyFolder = unicode(translate('OpenLP.Ui', 'You need to specify one ' + '%s folder to import from.', 'A song format e.g. PowerSong')) class OpenLPWizard(QtGui.QWizard): @@ -103,7 +100,7 @@ def setupUi(self, image): """ - Set up the wizard UI + Set up the wizard UI. """ self.setModal(True) self.setWizardStyle(QtGui.QWizard.ModernStyle) @@ -114,7 +111,6 @@ self.addCustomPages() self.addProgressPage() self.retranslateUi() - QtCore.QMetaObject.connectSlotsByName(self) def registerFields(self): """ @@ -253,7 +249,7 @@ The title of the dialog (unicode). ``editbox`` - A editbox (QLineEdit). + An editbox (QLineEdit). ``filters`` The file extension filters. It should contain the file description @@ -264,11 +260,28 @@ if filters: filters += u';;' filters += u'%s (*)' % UiStrings().AllFiles - filename = QtGui.QFileDialog.getOpenFileName(self, title, + filename = unicode(QtGui.QFileDialog.getOpenFileName(self, title, os.path.dirname(SettingsManager.get_last_dir( - self.plugin.settingsSection, 1)), filters) + self.plugin.settingsSection, 1)), filters)) if filename: editbox.setText(filename) SettingsManager.set_last_dir(self.plugin.settingsSection, filename, 1) + def getFolder(self, title, editbox): + """ + Opens a QFileDialog and saves the selected folder to the given editbox. + + ``title`` + The title of the dialog (unicode). + + ``editbox`` + An editbox (QLineEdit). + """ + folder = unicode(QtGui.QFileDialog.getExistingDirectory(self, title, + os.path.dirname(SettingsManager.get_last_dir( + self.plugin.settingsSection, 1)), QtGui.QFileDialog.ShowDirsOnly)) + if folder: + editbox.setText(folder) + SettingsManager.set_last_dir(self.plugin.settingsSection, + folder, 1) diff -Nru openlp-1.9.9/openlp/core/utils/actions.py openlp-1.9.10/openlp/core/utils/actions.py --- openlp-1.9.9/openlp/core/utils/actions.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/utils/actions.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -30,6 +31,8 @@ """ from PyQt4 import QtCore, QtGui +from openlp.core.lib.settings import Settings + class ActionCategory(object): """ The :class:`~openlp.core.utils.ActionCategory` class encapsulates a @@ -90,7 +93,7 @@ def append(self, name): weight = 0 - if len(self.actions) > 0: + if self.actions: weight = self.actions[-1][0] + 1 self.add(name, weight) @@ -156,7 +159,7 @@ def append(self, name, actions=None): weight = 0 - if len(self.categories) > 0: + if self.categories: weight = self.categories[-1].weight + 1 if actions: self.add(name, weight, actions) @@ -226,7 +229,7 @@ else: self.categories[category].actions.add(action, weight) # Load the shortcut from the config. - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(u'shortcuts') shortcuts = settings.value(action.objectName(), QtCore.QVariant(action.shortcuts())).toStringList() @@ -369,7 +372,7 @@ elif action in self.getAllChildObjects(existing_action.parent()): return False return True - + def getAllChildObjects(self, qobject): """ Goes recursively through the children of ``qobject`` and returns a list diff -Nru openlp-1.9.9/openlp/core/utils/__init__.py openlp-1.9.10/openlp/core/utils/__init__.py --- openlp-1.9.9/openlp/core/utils/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/utils/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -27,14 +28,16 @@ """ The :mod:`openlp.core.utils` module provides the utility libraries for OpenLP. """ +from datetime import datetime +from distutils.version import LooseVersion import logging import os import re +from subprocess import Popen, PIPE import sys -import time import urllib2 -from datetime import datetime -from subprocess import Popen, PIPE + +from openlp.core.lib.settings import Settings from PyQt4 import QtGui, QtCore @@ -55,7 +58,6 @@ #UNO_CONNECTION_TYPE = u'socket' CONTROL_CHARS = re.compile(r'[\x00-\x1F\x7F-\x9F]', re.UNICODE) INVALID_FILE_CHARS = re.compile(r'[\\/:\*\?"<>\|\+\[\]%]', re.UNICODE) -VERSION_SPLITTER = re.compile(r'([0-9]+).([0-9]+).([0-9]+)(?:-bzr([0-9]+))?') class VersionThread(QtCore.QThread): """ @@ -69,51 +71,11 @@ """ Run the thread. """ - time.sleep(1) + self.sleep(1) app_version = get_application_version() version = check_latest_version(app_version) - remote_version = {} - local_version = {} - match = VERSION_SPLITTER.match(version) - if match: - remote_version[u'major'] = int(match.group(1)) - remote_version[u'minor'] = int(match.group(2)) - remote_version[u'release'] = int(match.group(3)) - if len(match.groups()) > 3 and match.group(4): - remote_version[u'revision'] = int(match.group(4)) - else: - return - match = VERSION_SPLITTER.match(app_version[u'full']) - if match: - local_version[u'major'] = int(match.group(1)) - local_version[u'minor'] = int(match.group(2)) - local_version[u'release'] = int(match.group(3)) - if len(match.groups()) > 3 and match.group(4): - local_version[u'revision'] = int(match.group(4)) - else: - return - if remote_version[u'major'] > local_version[u'major'] or \ - remote_version[u'minor'] > local_version[u'minor'] or \ - remote_version[u'release'] > local_version[u'release']: + if LooseVersion(str(version)) > LooseVersion(str(app_version[u'full'])): Receiver.send_message(u'openlp_version_check', u'%s' % version) - elif remote_version.get(u'revision') and \ - local_version.get(u'revision') and \ - remote_version[u'revision'] > local_version[u'revision']: - Receiver.send_message(u'openlp_version_check', u'%s' % version) - - -class DelayStartThread(QtCore.QThread): - """ - A special Qt thread class to build things after OpenLP has started - """ - def __init__(self, parent): - QtCore.QThread.__init__(self, parent) - - def run(self): - """ - Run the thread. - """ - Receiver.send_message(u'openlp_phonon_creation') class AppLocation(object): @@ -128,7 +90,7 @@ VersionDir = 5 CacheDir = 6 LanguageDir = 7 - + # Base path where data/config/cache dir is located BaseDir = None @@ -167,8 +129,13 @@ """ Return the path OpenLP stores all its data under. """ - path = AppLocation.get_directory(AppLocation.DataDir) - check_directory_exists(path) + # Check if we have a different data location. + if Settings().contains(u'advanced/data path'): + path = unicode(Settings().value( + u'advanced/data path').toString()) + else: + path = AppLocation.get_directory(AppLocation.DataDir) + check_directory_exists(path) return path @staticmethod @@ -181,6 +148,7 @@ check_directory_exists(path) return path + def _get_os_dir_path(dir_type): """ Return a path based on which OS and environment we are running in. @@ -220,6 +188,7 @@ u'.openlp', u'data') return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'.openlp') + def _get_frozen_path(frozen_option, non_frozen_option): """ Return a path based on the system status. @@ -228,6 +197,7 @@ return frozen_option return non_frozen_option + def get_application_version(): """ Returns the application version of the running instance of OpenLP:: @@ -267,7 +237,7 @@ if code != 0: raise Exception(u'Error running bzr tags') lines = output.splitlines() - if len(lines) == 0: + if not lines: tag = u'0.0.0' revision = u'0' else: @@ -307,6 +277,7 @@ log.info(u'Openlp version %s' % APPLICATION_VERSION[u'version']) return APPLICATION_VERSION + def check_latest_version(current_version): """ Check the latest version of OpenLP against the version file on the OpenLP @@ -317,7 +288,7 @@ """ version_string = current_version[u'full'] # set to prod in the distribution config file. - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(u'general') last_test = unicode(settings.value(u'last version test', QtCore.QVariant(datetime.now().date())).toString()) @@ -340,6 +311,7 @@ version_string = remote_version return version_string + def add_actions(target, actions): """ Adds multiple actions to a menu or toolbar in one command. @@ -357,6 +329,7 @@ else: target.addAction(action) + def get_filesystem_encoding(): """ Returns the name of the encoding used to convert Unicode filenames into @@ -367,6 +340,7 @@ encoding = sys.getdefaultencoding() return encoding + def get_images_filter(): """ Returns a filter string for a file dialog containing all the supported @@ -383,6 +357,7 @@ visible_formats, actual_formats) return IMAGES_FILTER + def split_filename(path): """ Return a list of the parts in a given path. @@ -393,6 +368,7 @@ else: return os.path.split(path) + def clean_filename(filename): """ Removes invalid characters from the given ``filename``. @@ -404,6 +380,7 @@ filename = unicode(filename, u'utf-8') return INVALID_FILE_CHARS.sub(u'_', CONTROL_CHARS.sub(u'', filename)) + def delete_file(file_path_name): """ Deletes a file from the system. @@ -421,6 +398,7 @@ log.exception("Unable to delete file %s" % file_path_name) return False + def get_web_page(url, header=None, update_openlp=False): """ Attempts to download the webpage at url and returns that page or None. @@ -457,6 +435,7 @@ log.debug(page) return page + def get_uno_command(): """ Returns the UNO command to launch an openoffice.org instance. @@ -469,6 +448,7 @@ CONNECTION = u'"-accept=socket,host=localhost,port=2002;urp;"' return u'%s %s %s' % (COMMAND, OPTIONS, CONNECTION) + def get_uno_instance(resolver): """ Returns a running openoffice.org instance. diff -Nru openlp-1.9.9/openlp/core/utils/languagemanager.py openlp-1.9.10/openlp/core/utils/languagemanager.py --- openlp-1.9.9/openlp/core/utils/languagemanager.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/core/utils/languagemanager.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -35,6 +36,7 @@ from openlp.core.utils import AppLocation from openlp.core.lib import translate +from openlp.core.lib.settings import Settings log = logging.getLogger(__name__) @@ -101,7 +103,7 @@ """ Retrieve a saved language to use from settings """ - settings = QtCore.QSettings() + settings = Settings() language = unicode(settings.value( u'general/language', QtCore.QVariant(u'[en]')).toString()) log.info(u'Language file: \'%s\' Loaded from conf file' % language) @@ -133,7 +135,7 @@ language = unicode(qm_list[action_name]) if LanguageManager.auto_language: language = u'[%s]' % language - QtCore.QSettings().setValue( + Settings().setValue( u'general/language', QtCore.QVariant(language)) log.info(u'Language file: \'%s\' written to conf file' % language) if message: diff -Nru openlp-1.9.9/openlp/__init__.py openlp-1.9.10/openlp/__init__.py --- openlp-1.9.9/openlp/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/alerts/alertsplugin.py openlp-1.9.10/openlp/plugins/alerts/alertsplugin.py --- openlp-1.9.9/openlp/plugins/alerts/alertsplugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/alerts/alertsplugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -32,6 +33,7 @@ from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.db import Manager from openlp.core.lib.ui import create_action, UiStrings +from openlp.core.lib.settings import Settings from openlp.core.lib.theme import VerticalType from openlp.core.utils.actions import ActionList from openlp.plugins.alerts.lib import AlertsManager, AlertsTab @@ -117,8 +119,8 @@ Plugin.__init__(self, u'alerts', plugin_helpers, settings_tab_class=AlertsTab) self.weight = -3 - self.icon_path = u':/plugins/plugin_alerts.png' - self.icon = build_icon(self.icon_path) + self.iconPath = u':/plugins/plugin_alerts.png' + self.icon = build_icon(self.iconPath) self.alertsmanager = AlertsManager(self) self.manager = Manager(u'alerts', init_schema) self.alertForm = AlertForm(self) @@ -160,7 +162,7 @@ def toggleAlertsState(self): self.alertsActive = not self.alertsActive - QtCore.QSettings().setValue(self.settingsSection + u'/active', + Settings().setValue(self.settingsSection + u'/active', QtCore.QVariant(self.alertsActive)) def onAlertsTrigger(self): @@ -197,10 +199,10 @@ """ Add CSS to the main display. """ - align = VerticalType.Names[self.settings_tab.location] - return CSS % (align, self.settings_tab.font_face, - self.settings_tab.font_size, self.settings_tab.font_color, - self.settings_tab.bg_color) + align = VerticalType.Names[self.settingsTab.location] + return CSS % (align, self.settingsTab.font_face, + self.settingsTab.font_size, self.settingsTab.font_color, + self.settingsTab.bg_color) def getDisplayHtml(self): """ @@ -215,7 +217,7 @@ ``frame`` The Web frame holding the page. """ - align = VerticalType.Names[self.settings_tab.location] + align = VerticalType.Names[self.settingsTab.location] frame.evaluateJavaScript(u'update_css("%s", "%s", "%s", "%s", "%s")' % - (align, self.settings_tab.font_face, self.settings_tab.font_size, - self.settings_tab.font_color, self.settings_tab.bg_color)) + (align, self.settingsTab.font_face, self.settingsTab.font_size, + self.settingsTab.font_color, self.settingsTab.bg_color)) diff -Nru openlp-1.9.9/openlp/plugins/alerts/forms/alertdialog.py openlp-1.9.10/openlp/plugins/alerts/forms/alertdialog.py --- openlp-1.9.9/openlp/plugins/alerts/forms/alertdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/alerts/forms/alertdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,10 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import build_icon, translate -from openlp.core.lib.ui import create_delete_push_button +from openlp.core.lib.ui import create_button, create_button_box class Ui_AlertDialog(object): def setupUi(self, alertDialog): @@ -67,31 +68,21 @@ self.saveButton.setIcon(build_icon(u':/general/general_save.png')) self.saveButton.setObjectName(u'saveButton') self.manageButtonLayout.addWidget(self.saveButton) - self.deleteButton = create_delete_push_button(alertDialog) - self.deleteButton.setEnabled(False) + self.deleteButton = create_button(alertDialog, u'deleteButton', + role=u'delete', enabled=False, + click=alertDialog.onDeleteButtonClicked) self.manageButtonLayout.addWidget(self.deleteButton) self.manageButtonLayout.addStretch() self.alertDialogLayout.addLayout(self.manageButtonLayout, 1, 1) - self.buttonBox = QtGui.QDialogButtonBox(alertDialog) - self.buttonBox.addButton(QtGui.QDialogButtonBox.Close) displayIcon = build_icon(u':/general/general_live.png') - self.displayButton = QtGui.QPushButton(alertDialog) - self.displayButton.setEnabled(False) - self.displayButton.setIcon(displayIcon) - self.displayButton.setObjectName(u'displayButton') - self.buttonBox.addButton(self.displayButton, - QtGui.QDialogButtonBox.ActionRole) - self.displayCloseButton = QtGui.QPushButton(alertDialog) - self.displayCloseButton.setEnabled(False) - self.displayCloseButton.setIcon(displayIcon) - self.displayCloseButton.setObjectName(u'displayCloseButton') - self.buttonBox.addButton(self.displayCloseButton, - QtGui.QDialogButtonBox.ActionRole) + self.displayButton = create_button(alertDialog, u'displayButton', + icon=displayIcon, enabled=False) + self.displayCloseButton = create_button(alertDialog, + u'displayCloseButton', icon=displayIcon, enabled=False) + self.buttonBox = create_button_box(alertDialog, u'buttonBox', + [u'close'], [self.displayButton, self.displayCloseButton]) self.alertDialogLayout.addWidget(self.buttonBox, 2, 0, 1, 2) self.retranslateUi(alertDialog) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), - alertDialog.close) - QtCore.QMetaObject.connectSlotsByName(alertDialog) def retranslateUi(self, alertDialog): alertDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/plugins/alerts/forms/alertform.py openlp-1.9.10/openlp/plugins/alerts/forms/alertform.py --- openlp-1.9.9/openlp/plugins/alerts/forms/alertform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/alerts/forms/alertform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -43,7 +44,7 @@ self.manager = plugin.manager self.plugin = plugin self.item_id = None - QtGui.QDialog.__init__(self, plugin.formparent) + QtGui.QDialog.__init__(self, plugin.formParent) self.setupUi(self) QtCore.QObject.connect(self.displayButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayClicked) @@ -101,7 +102,7 @@ self.alertTextEdit.setText(u'') def onNewClick(self): - if len(self.alertTextEdit.text()) == 0: + if not self.alertTextEdit.text(): QtGui.QMessageBox.information(self, translate('AlertsPlugin.AlertForm', 'New Alert'), translate('AlertsPlugin.AlertForm', 'You haven\'t specified ' diff -Nru openlp-1.9.9/openlp/plugins/alerts/forms/__init__.py openlp-1.9.10/openlp/plugins/alerts/forms/__init__.py --- openlp-1.9.9/openlp/plugins/alerts/forms/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/alerts/forms/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/alerts/__init__.py openlp-1.9.10/openlp/plugins/alerts/__init__.py --- openlp-1.9.9/openlp/plugins/alerts/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/alerts/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/alerts/lib/alertsmanager.py openlp-1.9.10/openlp/plugins/alerts/lib/alertsmanager.py --- openlp-1.9.9/openlp/plugins/alerts/lib/alertsmanager.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/alerts/lib/alertsmanager.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -84,7 +85,7 @@ if not self.alertList: return text = self.alertList.pop(0) - alertTab = self.parent().settings_tab + alertTab = self.parent().settingsTab self.parent().liveController.display.alert(text, alertTab.location) # Check to see if we have a timer running. if self.timer_id == 0: @@ -100,7 +101,7 @@ """ log.debug(u'timer event') if event.timerId() == self.timer_id: - alertTab = self.parent().settings_tab + alertTab = self.parent().settingsTab self.parent().liveController.display.alert(u'', alertTab.location) self.killTimer(self.timer_id) self.timer_id = 0 diff -Nru openlp-1.9.9/openlp/plugins/alerts/lib/alertstab.py openlp-1.9.10/openlp/plugins/alerts/lib/alertstab.py --- openlp-1.9.9/openlp/plugins/alerts/lib/alertstab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/alerts/lib/alertstab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -29,7 +30,8 @@ from openlp.core.lib import SettingsTab, translate, Receiver from openlp.core.ui import AlertLocation -from openlp.core.lib.ui import UiStrings, create_valign_combo +from openlp.core.lib.ui import UiStrings, create_valign_selection_widgets +from openlp.core.lib.settings import Settings class AlertsTab(SettingsTab): """ @@ -76,7 +78,11 @@ self.timeoutSpinBox.setMaximum(180) self.timeoutSpinBox.setObjectName(u'timeoutSpinBox') self.fontLayout.addRow(self.timeoutLabel, self.timeoutSpinBox) - create_valign_combo(self, self.fontGroupBox, self.fontLayout) + self.verticalLabel, self.verticalComboBox = \ + create_valign_selection_widgets(self.fontGroupBox) + self.verticalLabel.setObjectName(u'verticalLabel') + self.verticalComboBox.setObjectName(u'verticalComboBox') + self.fontLayout.addRow(self.verticalLabel, self.verticalComboBox) self.leftLayout.addWidget(self.fontGroupBox) self.leftLayout.addStretch() self.previewGroupBox = QtGui.QGroupBox(self.rightColumn) @@ -90,9 +96,9 @@ self.rightLayout.addStretch() # Signals and slots QtCore.QObject.connect(self.backgroundColorButton, - QtCore.SIGNAL(u'pressed()'), self.onBackgroundColorButtonClicked) + QtCore.SIGNAL(u'clicked()'), self.onBackgroundColorButtonClicked) QtCore.QObject.connect(self.fontColorButton, - QtCore.SIGNAL(u'pressed()'), self.onFontColorButtonClicked) + QtCore.SIGNAL(u'clicked()'), self.onFontColorButtonClicked) QtCore.QObject.connect(self.fontComboBox, QtCore.SIGNAL(u'activated(int)'), self.onFontComboBoxClicked) QtCore.QObject.connect(self.timeoutSpinBox, @@ -148,7 +154,7 @@ self.updateDisplay() def load(self): - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) self.timeout = settings.value(u'timeout', QtCore.QVariant(5)).toInt()[0] self.font_color = unicode(settings.value( @@ -176,7 +182,7 @@ self.changed = False def save(self): - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) # Check value has changed as no event handles this field if settings.value(u'location', QtCore.QVariant(1)).toInt()[0] != \ diff -Nru openlp-1.9.9/openlp/plugins/alerts/lib/db.py openlp-1.9.10/openlp/plugins/alerts/lib/db.py --- openlp-1.9.9/openlp/plugins/alerts/lib/db.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/alerts/lib/db.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/alerts/lib/__init__.py openlp-1.9.10/openlp/plugins/alerts/lib/__init__.py --- openlp-1.9.9/openlp/plugins/alerts/lib/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/alerts/lib/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/bibles/bibleplugin.py openlp-1.9.10/openlp/plugins/bibles/bibleplugin.py --- openlp-1.9.9/openlp/plugins/bibles/bibleplugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/bibleplugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -27,10 +28,11 @@ import logging -from PyQt4 import QtGui +from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.ui import create_action, UiStrings +from openlp.core.lib.settings import Settings from openlp.core.utils.actions import ActionList from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem from openlp.plugins.bibles.forms import BibleUpgradeForm @@ -44,8 +46,8 @@ Plugin.__init__(self, u'bibles', plugin_helpers, BibleMediaItem, BiblesTab) self.weight = -9 - self.icon_path = u':/plugins/plugin_bibles.png' - self.icon = build_icon(self.icon_path) + self.iconPath = u':/plugins/plugin_bibles.png' + self.icon = build_icon(self.iconPath) self.manager = None def initialise(self): @@ -62,8 +64,7 @@ # unicode(UiStrings().Export)) # Set to invisible until we can export bibles self.exportBibleItem.setVisible(False) - if len(self.manager.old_bible_databases): - self.toolsUpgradeItem.setVisible(True) + self.toolsUpgradeItem.setVisible(bool(self.manager.old_bible_databases)) def finalise(self): """ @@ -81,16 +82,23 @@ def appStartup(self): """ - Perform tasks on application starup + Perform tasks on application startup """ - if len(self.manager.old_bible_databases): - if QtGui.QMessageBox.information(self.formparent, + if self.manager.old_bible_databases: + if QtGui.QMessageBox.information(self.formParent, translate('OpenLP', 'Information'), translate('OpenLP', 'Bible format has changed.\nYou have to upgrade your ' 'existing Bibles.\nShould OpenLP upgrade now?'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) == QtGui.QMessageBox.Yes: self.onToolsUpgradeItemTriggered() + settings = Settings() + settings.beginGroup(self.settingsSection) + if settings.contains(u'bookname language'): + settings.setValue(u'book name language', settings.value( + u'bookname language', QtCore.QVariant(0)).toInt()[0]) + settings.remove(u'bookname language') + settings.endGroup() def addImportMenuItem(self, import_menu): self.importBibleItem = create_action(import_menu, u'importBibleItem', @@ -126,7 +134,7 @@ Upgrade older bible databases. """ if not hasattr(self, u'upgrade_wizard'): - self.upgrade_wizard = BibleUpgradeForm(self.formparent, + self.upgrade_wizard = BibleUpgradeForm(self.formParent, self.manager, self) # If the import was not cancelled then reload. if self.upgrade_wizard.exec_(): @@ -145,11 +153,10 @@ def usesTheme(self, theme): """ Called to find out if the bible plugin is currently using a theme. - Returns True if the theme is being used, otherwise returns False. + Returns ``True`` if the theme is being used, otherwise returns + ``False``. """ - if unicode(self.settings_tab.bible_theme) == theme: - return True - return False + return unicode(self.settingsTab.bible_theme) == theme def renameTheme(self, oldTheme, newTheme): """ @@ -163,8 +170,8 @@ ``newTheme`` The new name the plugin should now use. """ - self.settings_tab.bible_theme = newTheme - self.settings_tab.save() + self.settingsTab.bible_theme = newTheme + self.settingsTab.save() def setPluginTextStrings(self): """ diff -Nru openlp-1.9.9/openlp/plugins/bibles/forms/bibleimportform.py openlp-1.9.10/openlp/plugins/bibles/forms/bibleimportform.py --- openlp-1.9.9/openlp/plugins/bibles/forms/bibleimportform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/forms/bibleimportform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -29,7 +30,6 @@ """ import logging import os -import os.path import locale from PyQt4 import QtCore, QtGui @@ -37,6 +37,7 @@ from openlp.core.lib import Receiver, translate from openlp.core.lib.db import delete_database from openlp.core.lib.ui import UiStrings, critical_error_message_box +from openlp.core.lib.settings import Settings from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.utils import AppLocation from openlp.plugins.bibles.lib.manager import BibleFormat @@ -591,7 +592,7 @@ """ Set default values for the wizard pages. """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.plugin.settingsSection) self.restart() self.finishButton.setVisible(False) diff -Nru openlp-1.9.9/openlp/plugins/bibles/forms/bibleupgradeform.py openlp-1.9.10/openlp/plugins/bibles/forms/bibleupgradeform.py --- openlp-1.9.9/openlp/plugins/bibles/forms/bibleupgradeform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/forms/bibleupgradeform.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,10 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # -# Portions copyright (c) 2008-2012 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # # Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -36,6 +38,7 @@ from openlp.core.lib import Receiver, SettingsManager, translate, \ check_directory_exists from openlp.core.lib.ui import UiStrings, critical_error_message_box +from openlp.core.lib.settings import Settings from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.utils import AppLocation, delete_file from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, OldBibleDB, \ @@ -341,7 +344,7 @@ Set default values for the wizard pages. """ log.debug(u'BibleUpgrade setDefaults') - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.plugin.settingsSection) self.stop_import_flag = False self.success.clear() @@ -371,7 +374,7 @@ """ Perform the actual upgrade. """ - self.include_webbible = False + self.includeWebBible = False proxy_server = None if not self.files: self.progressLabel.setText( @@ -383,14 +386,14 @@ for number, file in enumerate(self.files): if self.checkBox[number].checkState() == QtCore.Qt.Checked: max_bibles += 1 - oldBible = None + old_bible = None for number, filename in enumerate(self.files): # Close the previous bible's connection. - if oldBible is not None: - oldBible.close_connection() + if old_bible is not None: + old_bible.close_connection() # Set to None to make obvious that we have already closed the # database. - oldBible = None + old_bible = None if self.stop_import_flag: self.success[number] = False break @@ -398,7 +401,7 @@ self.success[number] = False continue self.progressBar.reset() - oldBible = OldBibleDB(self.mediaItem, path=self.temp_dir, + old_bible = OldBibleDB(self.mediaItem, path=self.temp_dir, file=filename[0]) name = filename[1] self.progressLabel.setText(unicode(translate( @@ -408,33 +411,38 @@ self.newbibles[number] = BibleDB(self.mediaItem, path=self.path, name=name, file=filename[0]) self.newbibles[number].register(self.plugin.upgrade_wizard) - metadata = oldBible.get_metadata() - webbible = False + metadata = old_bible.get_metadata() + web_bible = False meta_data = {} for meta in metadata: + # Upgrade the names of the metadata keys + if meta[u'key'] == u'Version': + meta[u'key'] = u'name' + if meta[u'key'] == u'Bookname language': + meta[u'key'] = 'book_name_language' + meta[u'key'] = meta[u'key'].lower().replace(' ', '_') + # Copy the metadata meta_data[meta[u'key']] = meta[u'value'] - if not meta[u'key'] == u'Version' and not meta[u'key'] == \ - u'dbversion': - self.newbibles[number].create_meta(meta[u'key'], + if meta[u'key'] != u'name' and meta[u'key'] != u'dbversion': + self.newbibles[number].save_meta(meta[u'key'], meta[u'value']) - if meta[u'key'] == u'download source': - webbible = True - self.include_webbible = True - if meta.has_key(u'proxy server'): - proxy_server = meta[u'proxy server'] - if webbible: - if meta_data[u'download source'].lower() == u'crosswalk': + if meta[u'key'] == u'download_source': + web_bible = True + self.includeWebBible = True + proxy_server = meta.get(u'proxy_server') + if web_bible: + if meta_data[u'download_source'].lower() == u'crosswalk': handler = CWExtract(proxy_server) - elif meta_data[u'download source'].lower() == u'biblegateway': + elif meta_data[u'download_source'].lower() == u'biblegateway': handler = BGExtract(proxy_server) - elif meta_data[u'download source'].lower() == u'bibleserver': + elif meta_data[u'download_source'].lower() == u'bibleserver': handler = BSExtract(proxy_server) - books = handler.get_books_from_http(meta_data[u'download name']) + books = handler.get_books_from_http(meta_data[u'download_name']) if not books: log.error(u'Upgrading books from %s - download '\ u'name: "%s" failed' % ( - meta_data[u'download source'], - meta_data[u'download name'])) + meta_data[u'download_source'], + meta_data[u'download_name'])) self.newbibles[number].session.close() del self.newbibles[number] critical_error_message_box( @@ -451,11 +459,11 @@ self.success[number] = False continue bible = BiblesResourcesDB.get_webbible( - meta_data[u'download name'], - meta_data[u'download source'].lower()) + meta_data[u'download_name'], + meta_data[u'download_source'].lower()) if bible and bible[u'language_id']: language_id = bible[u'language_id'] - self.newbibles[number].create_meta(u'language_id', + self.newbibles[number].save_meta(u'language_id', language_id) else: language_id = self.newbibles[number].get_language(name) @@ -485,8 +493,8 @@ if not book_ref_id: log.warn(u'Upgrading books from %s - download '\ u'name: "%s" aborted by user' % ( - meta_data[u'download source'], - meta_data[u'download name'])) + meta_data[u'download_source'], + meta_data[u'download_name'])) self.newbibles[number].session.close() del self.newbibles[number] self.success[number] = False @@ -495,9 +503,9 @@ db_book = self.newbibles[number].create_book(book, book_ref_id, book_details[u'testament_id']) # Try to import already downloaded verses. - oldbook = oldBible.get_book(book) + oldbook = old_bible.get_book(book) if oldbook: - verses = oldBible.get_verses(oldbook[u'id']) + verses = old_bible.get_verses(oldbook[u'id']) if not verses: log.warn(u'No verses found to import for book ' u'"%s"', book) @@ -527,7 +535,7 @@ self.progressBar.maximum() - self.progressBar.value()) self.success[number] = False continue - books = oldBible.get_books() + books = old_bible.get_books() self.progressBar.setMaximum(len(books)) for book in books: if self.stop_import_flag: @@ -551,7 +559,7 @@ book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) db_book = self.newbibles[number].create_book(book[u'name'], book_ref_id, book_details[u'testament_id']) - verses = oldBible.get_verses(book[u'id']) + verses = old_bible.get_verses(book[u'id']) if not verses: log.warn(u'No verses found to import for book ' u'"%s"', book[u'name']) @@ -566,7 +574,7 @@ int(verse[u'verse']), unicode(verse[u'text'])) Receiver.send_message(u'openlp_process_events') self.newbibles[number].session.commit() - if self.success.has_key(number) and not self.success[number]: + if not self.success.get(number, True): self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed')) % @@ -574,17 +582,17 @@ self.progressBar.maximum() - self.progressBar.value()) else: self.success[number] = True - self.newbibles[number].create_meta(u'Version', name) + self.newbibles[number].save_meta(u'name', name) self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\n' 'Complete')) % (number + 1, max_bibles, name)) - if self.newbibles.has_key(number): + if number in self.newbibles: self.newbibles[number].session.close() # Close the last bible's connection if possible. - if oldBible is not None: - oldBible.close_connection() + if old_bible is not None: + old_bible.close_connection() def postWizard(self): """ @@ -593,7 +601,7 @@ successful_import = 0 failed_import = 0 for number, filename in enumerate(self.files): - if self.success.has_key(number) and self.success[number]: + if self.success.get(number): successful_import += 1 elif self.checkBox[number].checkState() == QtCore.Qt.Checked: failed_import += 1 @@ -608,7 +616,7 @@ else: failed_import_text = u'' if successful_import > 0: - if self.include_webbible: + if self.includeWebBible: self.progressLabel.setText(unicode( translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading ' 'Bible(s): %s successful%s\nPlease note that verses from ' diff -Nru openlp-1.9.9/openlp/plugins/bibles/forms/booknamedialog.py openlp-1.9.10/openlp/plugins/bibles/forms/booknamedialog.py --- openlp-1.9.9/openlp/plugins/bibles/forms/booknamedialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/forms/booknamedialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,10 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # -# Portions copyright (c) 2008-2012 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 # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -27,6 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate +from openlp.core.lib.ui import create_button_box class Ui_BookNameDialog(object): def setupUi(self, bookNameDialog): @@ -78,37 +81,27 @@ self.apocryphaCheckBox.setCheckState(QtCore.Qt.Checked) self.optionsLayout.addWidget(self.apocryphaCheckBox) self.bookNameLayout.addWidget(self.optionsGroupBox) - self.buttonBox = QtGui.QDialogButtonBox(bookNameDialog) - self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons( - QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName(u'buttonBox') + self.buttonBox = create_button_box(bookNameDialog, u'buttonBox', + [u'cancel', u'ok']) self.bookNameLayout.addWidget(self.buttonBox) self.retranslateUi(bookNameDialog) - QtCore.QObject.connect( - self.buttonBox, QtCore.SIGNAL(u'accepted()'), - bookNameDialog.accept) - QtCore.QObject.connect( - self.buttonBox, QtCore.SIGNAL(u'rejected()'), - bookNameDialog.reject) - QtCore.QMetaObject.connectSlotsByName(bookNameDialog) def retranslateUi(self, bookNameDialog): - bookNameDialog.setWindowTitle(translate('BiblesPlugin.BookNameDialog', + bookNameDialog.setWindowTitle(translate('BiblesPlugin.BookNameDialog', 'Select Book Name')) - self.infoLabel.setText(translate('BiblesPlugin.BookNameDialog', + self.infoLabel.setText(translate('BiblesPlugin.BookNameDialog', 'The following book name cannot be matched up internally. Please ' - 'select the corresponding English name from the list.')) - self.currentLabel.setText(translate('BiblesPlugin.BookNameDialog', + 'select the corresponding name from the list.')) + self.currentLabel.setText(translate('BiblesPlugin.BookNameDialog', 'Current name:')) self.correspondingLabel.setText(translate( 'BiblesPlugin.BookNameDialog', 'Corresponding name:')) - self.optionsGroupBox.setTitle(translate('BiblesPlugin.BookNameDialog', + self.optionsGroupBox.setTitle(translate('BiblesPlugin.BookNameDialog', 'Show Books From')) self.oldTestamentCheckBox.setText(translate( 'BiblesPlugin.BookNameDialog', 'Old Testament')) self.newTestamentCheckBox.setText(translate( 'BiblesPlugin.BookNameDialog', 'New Testament')) - self.apocryphaCheckBox.setText(translate('BiblesPlugin.BookNameDialog', + self.apocryphaCheckBox.setText(translate('BiblesPlugin.BookNameDialog', 'Apocrypha')) diff -Nru openlp-1.9.9/openlp/plugins/bibles/forms/booknameform.py openlp-1.9.10/openlp/plugins/bibles/forms/booknameform.py --- openlp-1.9.9/openlp/plugins/bibles/forms/booknameform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/forms/booknameform.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,10 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # -# Portions copyright (c) 2008-2012 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 # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,6 +30,7 @@ Module implementing BookNameForm. """ import logging +import re from PyQt4.QtGui import QDialog from PyQt4 import QtCore @@ -36,17 +39,18 @@ from openlp.core.lib.ui import critical_error_message_box from openlp.plugins.bibles.forms.booknamedialog import \ Ui_BookNameDialog +from openlp.plugins.bibles.lib import BibleStrings from openlp.plugins.bibles.lib.db import BiblesResourcesDB log = logging.getLogger(__name__) class BookNameForm(QDialog, Ui_BookNameDialog): """ - Class to manage a dialog which help the user to refer a book name a + Class to manage a dialog which help the user to refer a book name a to a english book name """ log.info(u'BookNameForm loaded') - + def __init__(self, parent = None): """ Constructor @@ -54,6 +58,8 @@ QDialog.__init__(self, parent) self.setupUi(self) self.customSignals() + self.book_names = BibleStrings().BookNames + self.book_id = False def customSignals(self): """ @@ -97,7 +103,8 @@ and item[u'testament_id'] == 3: addBook = False if addBook: - self.correspondingComboBox.addItem(item[u'name']) + self.correspondingComboBox.addItem( + self.book_names[item[u'abbreviation']]) def exec_(self, name, books, maxbooks): self.books = books @@ -111,7 +118,7 @@ self.currentBookLabel.setText(unicode(name)) self.correspondingComboBox.setFocus() return QDialog.exec_(self) - + def accept(self): if self.correspondingComboBox.currentText() == u'': critical_error_message_box( @@ -120,4 +127,13 @@ self.correspondingComboBox.setFocus() return False else: + cor_book = unicode(self.correspondingComboBox.currentText()) + for character in u'\\.^$*+?{}[]()': + cor_book = cor_book.replace(character, u'\\' + character) + books = filter(lambda key: + re.match(cor_book, unicode(self.book_names[key]), re.UNICODE), + self.book_names.keys()) + books = filter(None, map(BiblesResourcesDB.get_book, books)) + if books: + self.book_id = books[0][u'id'] return QDialog.accept(self) diff -Nru openlp-1.9.9/openlp/plugins/bibles/forms/editbibledialog.py openlp-1.9.10/openlp/plugins/bibles/forms/editbibledialog.py --- openlp-1.9.9/openlp/plugins/bibles/forms/editbibledialog.py 1970-01-01 00:00:00.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/forms/editbibledialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 build_icon, translate +from openlp.core.lib.ui import create_button_box +from openlp.plugins.bibles.lib import LanguageSelection, BibleStrings +from openlp.plugins.bibles.lib.db import BiblesResourcesDB + + +class Ui_EditBibleDialog(object): + def setupUi(self, editBibleDialog): + editBibleDialog.setObjectName(u'editBibleDialog') + editBibleDialog.resize(520, 400) + editBibleDialog.setWindowIcon( + build_icon(u':/icon/openlp-logo-16x16.png')) + editBibleDialog.setModal(True) + self.dialogLayout = QtGui.QVBoxLayout(editBibleDialog) + self.dialogLayout.setSpacing(8) + self.dialogLayout.setContentsMargins(8, 8, 8, 8) + self.dialogLayout.setObjectName(u'dialogLayout') + self.bibleTabWidget = QtGui.QTabWidget(editBibleDialog) + self.bibleTabWidget.setObjectName(u'BibleTabWidget') + # Meta tab + self.metaTab = QtGui.QWidget() + self.metaTab.setObjectName(u'metaTab') + self.metaTabLayout = QtGui.QVBoxLayout(self.metaTab) + self.metaTabLayout.setObjectName(u'metaTabLayout') + self.licenseDetailsGroupBox = QtGui.QGroupBox(self.metaTab) + self.licenseDetailsGroupBox.setObjectName(u'licenseDetailsGroupBox') + self.licenseDetailsLayout = QtGui.QFormLayout( + self.licenseDetailsGroupBox) + self.licenseDetailsLayout.setObjectName(u'licenseDetailsLayout') + self.versionNameLabel = QtGui.QLabel(self.licenseDetailsGroupBox) + self.versionNameLabel.setObjectName(u'versionNameLabel') + self.versionNameEdit = QtGui.QLineEdit(self.licenseDetailsGroupBox) + self.versionNameEdit.setObjectName(u'versionNameEdit') + self.versionNameLabel.setBuddy(self.versionNameEdit) + self.licenseDetailsLayout.addRow(self.versionNameLabel, + self.versionNameEdit) + self.copyrightLabel = QtGui.QLabel(self.licenseDetailsGroupBox) + self.copyrightLabel.setObjectName(u'copyrightLabel') + self.copyrightEdit = QtGui.QLineEdit(self.licenseDetailsGroupBox) + self.copyrightEdit.setObjectName(u'copyrightEdit') + self.copyrightLabel.setBuddy(self.copyrightEdit) + self.licenseDetailsLayout.addRow(self.copyrightLabel, + self.copyrightEdit) + self.permissionsLabel = QtGui.QLabel(self.licenseDetailsGroupBox) + self.permissionsLabel.setObjectName(u'permissionsLabel') + self.permissionsEdit = QtGui.QLineEdit(self.licenseDetailsGroupBox) + self.permissionsEdit.setObjectName(u'permissionsEdit') + self.permissionsLabel.setBuddy(self.permissionsEdit) + self.licenseDetailsLayout.addRow(self.permissionsLabel, + self.permissionsEdit) + self.metaTabLayout.addWidget(self.licenseDetailsGroupBox) + self.languageSelectionGroupBox = QtGui.QGroupBox(self.metaTab) + self.languageSelectionGroupBox.setObjectName( + u'languageSelectionGroupBox') + self.languageSelectionLayout = QtGui.QVBoxLayout( + self.languageSelectionGroupBox) + self.languageSelectionLabel = QtGui.QLabel( + self.languageSelectionGroupBox) + self.languageSelectionLabel.setObjectName(u'languageSelectionLabel') + self.languageSelectionComboBox = QtGui.QComboBox( + self.languageSelectionGroupBox) + self.languageSelectionComboBox.setObjectName( + u'languageSelectionComboBox') + self.languageSelectionComboBox.addItems([u'', u'', u'', u'']) + self.languageSelectionLayout.addWidget(self.languageSelectionLabel) + self.languageSelectionLayout.addWidget(self.languageSelectionComboBox) + self.metaTabLayout.addWidget(self.languageSelectionGroupBox) + self.metaTabLayout.addStretch() + self.bibleTabWidget.addTab(self.metaTab, u'') + # Book name tab + self.bookNameTab = QtGui.QWidget() + self.bookNameTab.setObjectName(u'bookNameTab') + self.bookNameTabLayout = QtGui.QVBoxLayout(self.bookNameTab) + self.bookNameTabLayout.setObjectName(u'bookNameTabLayout') + self.bookNameNotice = QtGui.QLabel(self.bookNameTab) + self.bookNameNotice.setObjectName(u'bookNameNotice') + self.bookNameNotice.setWordWrap(True) + self.bookNameTabLayout.addWidget(self.bookNameNotice) + self.scrollArea = QtGui.QScrollArea(self.bookNameTab) + self.scrollArea.setWidgetResizable(True) + self.scrollArea.setObjectName(u'scrollArea') + self.scrollArea.setHorizontalScrollBarPolicy( + QtCore.Qt.ScrollBarAlwaysOff) + self.bookNameWidget = QtGui.QWidget(self.scrollArea) + self.bookNameWidget.setObjectName(u'bookNameWidget') + self.bookNameWidgetLayout = QtGui.QFormLayout(self.bookNameWidget) + self.bookNameWidgetLayout.setObjectName(u'bookNameWidgetLayout') + self.bookNameLabel = {} + self.bookNameEdit= {} + for book in BiblesResourcesDB.get_books(): + self.bookNameLabel[book[u'abbreviation']] = QtGui.QLabel( + self.bookNameWidget) + self.bookNameLabel[book[u'abbreviation']].setObjectName( + u'bookNameLabel[%s]' % book[u'abbreviation']) + self.bookNameEdit[book[u'abbreviation']] = QtGui.QLineEdit( + self.bookNameWidget) + self.bookNameEdit[book[u'abbreviation']].setObjectName( + u'bookNameEdit[%s]' % book[u'abbreviation']) + self.bookNameWidgetLayout.addRow( + self.bookNameLabel[book[u'abbreviation']], + self.bookNameEdit[book[u'abbreviation']]) + self.scrollArea.setWidget(self.bookNameWidget) + self.bookNameTabLayout.addWidget(self.scrollArea) + self.bookNameTabLayout.addStretch() + self.bibleTabWidget.addTab(self.bookNameTab, u'') + # Last few bits + self.dialogLayout.addWidget(self.bibleTabWidget) + self.buttonBox = create_button_box(editBibleDialog, u'buttonBox', + [u'cancel', u'save']) + self.dialogLayout.addWidget(self.buttonBox) + self.retranslateUi(editBibleDialog) + QtCore.QMetaObject.connectSlotsByName(editBibleDialog) + + def retranslateUi(self, editBibleDialog): + self.book_names = BibleStrings().BookNames + editBibleDialog.setWindowTitle( + translate('BiblesPlugin.EditBibleForm', 'Bible Editor')) + # Meta tab + self.bibleTabWidget.setTabText( + self.bibleTabWidget.indexOf(self.metaTab), + translate('SongsPlugin.EditBibleForm', 'Meta Data')) + self.licenseDetailsGroupBox.setTitle( + translate('BiblesPlugin.EditBibleForm', 'License Details')) + self.versionNameLabel.setText( + translate('BiblesPlugin.EditBibleForm', 'Version name:')) + self.copyrightLabel.setText( + translate('BiblesPlugin.EditBibleForm', 'Copyright:')) + self.permissionsLabel.setText( + translate('BiblesPlugin.EditBibleForm', 'Permissions:')) + self.languageSelectionGroupBox.setTitle(translate( + 'BiblesPlugin.EditBibleForm', 'Default Bible Language')) + self.languageSelectionLabel.setText( + translate('BiblesPlugin.EditBibleForm', + 'Book name language in search field, search results and on ' + 'display:')) + self.languageSelectionComboBox.setItemText(0, + translate('BiblesPlugin.EditBibleForm', 'Global Settings')) + self.languageSelectionComboBox.setItemText(LanguageSelection.Bible + 1, + translate('BiblesPlugin.EditBibleForm', 'Bible Language')) + self.languageSelectionComboBox.setItemText( + LanguageSelection.Application + 1, + translate('BiblesPlugin.EditBibleForm', 'Application Language')) + self.languageSelectionComboBox.setItemText( + LanguageSelection.English + 1, + translate('BiblesPlugin.EditBibleForm', 'English')) + # Book name tab + self.bibleTabWidget.setTabText( + self.bibleTabWidget.indexOf(self.bookNameTab), + translate('SongsPlugin.EditBibleForm', 'Custom Book Names')) + for book in BiblesResourcesDB.get_books(): + self.bookNameLabel[book[u'abbreviation']].setText( + u'%s:' % unicode(self.book_names[book[u'abbreviation']])) diff -Nru openlp-1.9.9/openlp/plugins/bibles/forms/editbibleform.py openlp-1.9.10/openlp/plugins/bibles/forms/editbibleform.py --- openlp-1.9.9/openlp/plugins/bibles/forms/editbibleform.py 1970-01-01 00:00:00.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/forms/editbibleform.py 2012-06-23 16:35:18.000000000 +0000 @@ -0,0 +1,212 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # +############################################################################### + +import logging +import re + +from PyQt4 import QtGui + +from openlp.core.lib import Receiver, translate +from openlp.core.lib.ui import UiStrings, critical_error_message_box +from editbibledialog import Ui_EditBibleDialog +from openlp.plugins.bibles.lib import BibleStrings +from openlp.plugins.bibles.lib.db import BiblesResourcesDB + +log = logging.getLogger(__name__) + +class EditBibleForm(QtGui.QDialog, Ui_EditBibleDialog): + """ + Class to manage the editing of a bible + """ + log.info(u'%s EditBibleForm loaded', __name__) + + def __init__(self, mediaitem, parent, manager): + """ + Constructor + """ + QtGui.QDialog.__init__(self, parent) + self.mediaitem = mediaitem + self.book_names = BibleStrings().BookNames + self.setupUi(self) + self.manager = manager + + def loadBible(self, bible): + """ + Loads a bible. + + ``bible`` + The name of the bible. + """ + log.debug(u'Load Bible') + self.bible = bible + self.versionNameEdit.setText( + self.manager.get_meta_data(self.bible, u'name').value) + self.copyrightEdit.setText( + self.manager.get_meta_data(self.bible, u'copyright').value) + self.permissionsEdit.setText( + self.manager.get_meta_data(self.bible, u'permissions').value) + book_name_language = self.manager.get_meta_data(self.bible, + u'book_name_language') + if book_name_language and book_name_language.value != u'None': + self.languageSelectionComboBox.setCurrentIndex( + int(book_name_language.value) + 1) + self.books = {} + self.webbible = self.manager.get_meta_data(self.bible, + u'download_source') + if self.webbible: + self.bookNameNotice.setText(translate('BiblesPlugin.EditBibleForm', + 'This is a Web Download Bible.\nIt is not possible to ' + 'customize the Book Names.')) + self.scrollArea.hide() + else: + self.bookNameNotice.setText(translate('BiblesPlugin.EditBibleForm', + 'To use the customized book names, "Bible language" must be ' + 'selected on the Meta Data tab or, if "Global settings" is ' + 'selected, on the Bible page in Configure OpenLP.')) + for book in BiblesResourcesDB.get_books(): + self.books[book[u'abbreviation']] = self.manager.get_book_by_id( + self.bible, book[u'id']) + if self.books[book[u'abbreviation']] and not self.webbible: + self.bookNameEdit[book[u'abbreviation']].setText( + self.books[book[u'abbreviation']].name) + else: + # It is nessecary to remove the Widget otherwise there still + # exists the vertical spacing in QFormLayout + self.bookNameWidgetLayout.removeWidget( + self.bookNameLabel[book[u'abbreviation']]) + self.bookNameLabel[book[u'abbreviation']].hide() + self.bookNameWidgetLayout.removeWidget( + self.bookNameEdit[book[u'abbreviation']]) + self.bookNameEdit[book[u'abbreviation']].hide() + + def reject(self): + """ + Exit Dialog and do not save + """ + log.debug(u'BibleEditForm.reject') + self.bible = None + QtGui.QDialog.reject(self) + + def accept(self): + """ + Exit Dialog and save data + """ + log.debug(u'BibleEditForm.accept') + version = unicode(self.versionNameEdit.text()) + copyright = unicode(self.copyrightEdit.text()) + permissions = unicode(self.permissionsEdit.text()) + book_name_language = self.languageSelectionComboBox.currentIndex() - 1 + if book_name_language == -1: + book_name_language = None + if not self.validateMeta(version, copyright): + return + if not self.webbible: + custom_names = {} + for abbr, book in self.books.iteritems(): + if book: + custom_names[abbr] = unicode(self.bookNameEdit[abbr].text()) + if book.name != custom_names[abbr]: + if not self.validateBook(custom_names[abbr], abbr): + return + Receiver.send_message(u'openlp_process_events') + Receiver.send_message(u'cursor_busy') + self.manager.save_meta_data(self.bible, version, copyright, permissions, + book_name_language) + if not self.webbible: + for abbr, book in self.books.iteritems(): + if book: + if book.name != custom_names[abbr]: + book.name = custom_names[abbr] + self.manager.update_book(self.bible, book) + self.bible = None + Receiver.send_message(u'cursor_normal') + QtGui.QDialog.accept(self) + + def validateMeta(self, name, copyright): + """ + Validate the Meta before saving. + """ + if not name: + self.versionNameEdit.setFocus() + critical_error_message_box(UiStrings().EmptyField, + translate('BiblesPlugin.BibleEditForm', + 'You need to specify a version name for your Bible.')) + return False + elif not copyright: + self.copyrightEdit.setFocus() + critical_error_message_box(UiStrings().EmptyField, + translate('BiblesPlugin.BibleEditForm', + 'You need to set a copyright for your Bible. ' + 'Bibles in the Public Domain need to be marked as such.')) + return False + elif self.manager.exists(name) and \ + self.manager.get_meta_data(self.bible, u'name').value != \ + name: + self.versionNameEdit.setFocus() + critical_error_message_box( + translate('BiblesPlugin.BibleEditForm', 'Bible Exists'), + translate('BiblesPlugin.BibleEditForm', + 'This Bible already exists. Please import ' + 'a different Bible or first delete the existing one.')) + return False + return True + + def validateBook(self, new_book_name, abbreviation): + """ + Validate a book. + """ + book_regex = re.compile(u'[\d]*[^\d]+$') + if not new_book_name: + self.bookNameEdit[abbreviation].setFocus() + critical_error_message_box(UiStrings().EmptyField, + unicode(translate('BiblesPlugin.BibleEditForm', + 'You need to specify a book name for "%s".')) % + self.book_names[abbreviation]) + return False + elif not book_regex.match(new_book_name): + self.bookNameEdit[abbreviation].setFocus() + critical_error_message_box(UiStrings().EmptyField, + unicode(translate('BiblesPlugin.BibleEditForm', + 'The book name "%s" is not correct.\nNumbers can only be used ' + 'at the beginning and must\nbe followed by one or more ' + 'non-numeric characters.')) % new_book_name) + return False + for abbr, book in self.books.iteritems(): + if book: + if abbr == abbreviation: + continue + if unicode(self.bookNameEdit[abbr].text()) == new_book_name: + self.bookNameEdit[abbreviation].setFocus() + critical_error_message_box( + translate('BiblesPlugin.BibleEditForm', + 'Duplicate Book Name'), + unicode(translate('BiblesPlugin.BibleEditForm', + 'The Book Name "%s" has been entered more than once.')) + % new_book_name) + return False + return True diff -Nru openlp-1.9.9/openlp/plugins/bibles/forms/__init__.py openlp-1.9.10/openlp/plugins/bibles/forms/__init__.py --- openlp-1.9.9/openlp/plugins/bibles/forms/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/forms/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -55,6 +56,7 @@ from languageform import LanguageForm from bibleimportform import BibleImportForm from bibleupgradeform import BibleUpgradeForm +from editbibleform import EditBibleForm -__all__ = [u'BookNameForm', u'LanguageForm', u'BibleImportForm', - u'BibleUpgradeForm'] +__all__ = [u'BookNameForm', u'LanguageForm', u'BibleImportForm', + u'BibleUpgradeForm', u'EditBibleForm'] diff -Nru openlp-1.9.9/openlp/plugins/bibles/forms/languagedialog.py openlp-1.9.10/openlp/plugins/bibles/forms/languagedialog.py --- openlp-1.9.9/openlp/plugins/bibles/forms/languagedialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/forms/languagedialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,10 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # -# Portions copyright (c) 2008-2012 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 # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -24,9 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import translate +from openlp.core.lib.ui import create_button_box class Ui_LanguageDialog(object): def setupUi(self, languageDialog): @@ -60,25 +63,18 @@ self.languageComboBox.setObjectName(u'languageComboBox') self.languageHBoxLayout.addWidget(self.languageComboBox) self.languageLayout.addLayout(self.languageHBoxLayout) - self.buttonBox = QtGui.QDialogButtonBox(languageDialog) - self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel| - QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName(u'buttonBox') + self.buttonBox = create_button_box(languageDialog, u'buttonBox', + [u'cancel', u'ok']) self.languageLayout.addWidget(self.buttonBox) self.retranslateUi(languageDialog) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), - languageDialog.accept) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), - languageDialog.reject) def retranslateUi(self, languageDialog): languageDialog.setWindowTitle( translate('BiblesPlugin.LanguageDialog', 'Select Language')) self.bibleLabel.setText(translate('BiblesPlugin.LanguageDialog', '')) - self.infoLabel.setText(translate('BiblesPlugin.LanguageDialog', + self.infoLabel.setText(translate('BiblesPlugin.LanguageDialog', 'OpenLP is unable to determine the language of this translation ' 'of the Bible. Please select the language from the list below.')) - self.languageLabel.setText(translate('BiblesPlugin.LanguageDialog', + self.languageLabel.setText(translate('BiblesPlugin.LanguageDialog', 'Language:')) diff -Nru openlp-1.9.9/openlp/plugins/bibles/forms/languageform.py openlp-1.9.10/openlp/plugins/bibles/forms/languageform.py --- openlp-1.9.9/openlp/plugins/bibles/forms/languageform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/forms/languageform.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,10 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # -# Portions copyright (c) 2008-2012 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 # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/bibles/__init__.py openlp-1.9.10/openlp/plugins/bibles/__init__.py --- openlp-1.9.9/openlp/plugins/bibles/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/biblestab.py openlp-1.9.10/openlp/plugins/bibles/lib/biblestab.py --- openlp-1.9.9/openlp/plugins/bibles/lib/biblestab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/biblestab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -31,6 +32,7 @@ from openlp.core.lib import Receiver, SettingsTab, translate from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box +from openlp.core.lib.settings import Settings from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ update_reference_separators, get_reference_separator, LanguageSelection @@ -276,23 +278,18 @@ 'end marks may be defined.\nThey have to be separated by a ' 'vertical bar "|".\nPlease clear this edit line to use the ' 'default value.')) - self.languageSelectionGroupBox.setTitle( - translate('BiblesPlugin.BiblesTab', 'Preferred Bookname Language')) + self.languageSelectionGroupBox.setTitle(translate( + 'BiblesPlugin.BiblesTab', 'Default Bible Language')) self.languageSelectionLabel.setText(translate('BiblesPlugin.BiblesTab', - 'Choose the language in which the book names of the\nBible should ' - 'be displayed in the Bible search:')) + 'Book name language in search field,\nsearch results and on ' + 'display:')) self.languageSelectionComboBox.setItemText(LanguageSelection.Bible, - translate('BiblesPlugin.BiblesTab', 'Bible language')) + translate('BiblesPlugin.BiblesTab', 'Bible Language')) self.languageSelectionComboBox.setItemText( LanguageSelection.Application, - translate('BiblesPlugin.BiblesTab', 'Application language')) + translate('BiblesPlugin.BiblesTab', 'Application Language')) self.languageSelectionComboBox.setItemText(LanguageSelection.English, translate('BiblesPlugin.BiblesTab', 'English')) - self.languageSelectionComboBox.setToolTip( - translate('BiblesPlugin.BiblesTab', 'Multiple options:\n ' - 'Bible language - the language in which the Bible book names ' - 'were imported\n Application language - the language you have ' - 'chosen for OpenLP\n English - always use English book names')) def onBibleThemeComboBoxChanged(self): self.bible_theme = self.bibleThemeComboBox.currentText() @@ -419,7 +416,7 @@ self.getGreyTextPalette(True)) def load(self): - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) self.show_new_chapters = settings.value( u'display new chapter', QtCore.QVariant(False)).toBool() @@ -488,12 +485,12 @@ self.getGreyTextPalette(False)) self.endSeparatorCheckBox.setChecked(True) self.language_selection = settings.value( - u'bookname language', QtCore.QVariant(0)).toInt()[0] + u'book name language', QtCore.QVariant(0)).toInt()[0] self.languageSelectionComboBox.setCurrentIndex(self.language_selection) settings.endGroup() def save(self): - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) settings.setValue(u'display new chapter', QtCore.QVariant(self.show_new_chapters)) @@ -501,7 +498,7 @@ QtCore.QVariant(self.display_style)) settings.setValue(u'verse layout style', QtCore.QVariant(self.layout_style)) - settings.setValue(u'bookname language', + settings.setValue(u'book name language', QtCore.QVariant(self.language_selection)) settings.setValue(u'second bibles', QtCore.QVariant(self.second_bibles)) settings.setValue(u'bible theme', QtCore.QVariant(self.bible_theme)) diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/csvbible.py openlp-1.9.10/openlp/plugins/bibles/lib/csvbible.py --- openlp-1.9.9/openlp/plugins/bibles/lib/csvbible.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/csvbible.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -73,7 +74,7 @@ def __init__(self, parent, **kwargs): """ - Loads a Bible from a set of CVS files. + Loads a Bible from a set of CSV files. This class assumes the files contain all the information and a clean bible is being loaded. """ diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/db.py openlp-1.9.10/openlp/plugins/bibles/lib/db.py --- openlp-1.9.9/openlp/plugins/bibles/lib/db.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/db.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,13 +26,13 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -import logging import chardet +import logging import os import sqlite3 from PyQt4 import QtCore -from sqlalchemy import Column, ForeignKey, or_, Table, types +from sqlalchemy import Column, ForeignKey, or_, Table, types, func from sqlalchemy.orm import class_mapper, mapper, relation from sqlalchemy.orm.exc import UnmappedClassError @@ -39,6 +40,7 @@ from openlp.core.lib.db import BaseModel, init_db, Manager from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, clean_filename +import upgrade log = logging.getLogger(__name__) @@ -62,6 +64,7 @@ """ pass + def init_schema(url): """ Setup a bible database connection and initialise the database schema. @@ -147,7 +150,7 @@ self.file = clean_filename(self.name) + u'.sqlite' if u'file' in kwargs: self.file = kwargs[u'file'] - Manager.__init__(self, u'bibles', init_schema, self.file) + Manager.__init__(self, u'bibles', init_schema, self.file, upgrade) if u'file' in kwargs: self.get_name() if u'path' in kwargs: @@ -167,7 +170,7 @@ """ Returns the version name of the Bible. """ - version_name = self.get_object(BibleMeta, u'Version') + version_name = self.get_object(BibleMeta, u'name') self.name = version_name.value if version_name else None return self.name @@ -182,7 +185,6 @@ The actual Qt wizard form. """ self.wizard = wizard - self.create_meta(u'dbversion', u'2') return self.name def create_book(self, name, bk_ref_id, testament=1): @@ -205,6 +207,16 @@ self.save_object(book) return book + def update_book(self, book): + """ + Update a book in the database. + + ``book`` + The book object + """ + log.debug(u'BibleDB.update_book("%s")', book.name) + return self.save_object(book) + def delete_book(self, db_book): """ Delete a book from the database. @@ -271,9 +283,9 @@ self.session.add(verse) return verse - def create_meta(self, key, value): + def save_meta(self, key, value): """ - Utility method to save BibleMeta objects in a Bible database. + Utility method to save or update BibleMeta objects in a Bible database. ``key`` The key for this instance. @@ -284,7 +296,12 @@ if not isinstance(value, unicode): value = unicode(value) log.debug(u'BibleDB.save_meta("%s/%s")', key, value) - self.save_object(BibleMeta.populate(key=key, value=value)) + meta = self.get_object(BibleMeta, key) + if meta: + meta.value = value + self.save_object(meta) + else: + self.save_object(BibleMeta.populate(key=key, value=value)) def get_book(self, book): """ @@ -317,6 +334,7 @@ def get_book_ref_id_by_name(self, book, maxbooks, language_id=None): log.debug(u'BibleDB.get_book_ref_id_by_name:("%s", "%s")', book, language_id) + book_id = None if BiblesResourcesDB.get_book(book, True): book_temp = BiblesResourcesDB.get_book(book, True) book_id = book_temp[u'id'] @@ -326,26 +344,13 @@ book_id = AlternativeBookNamesDB.get_book_reference_id(book) else: from openlp.plugins.bibles.forms import BookNameForm - book_ref = None book_name = BookNameForm(self.wizard) if book_name.exec_(book, self.get_books(), maxbooks): - book_ref = unicode( - book_name.correspondingComboBox.currentText()) - if not book_ref: - return None - else: - book_temp = BiblesResourcesDB.get_book(book_ref) - if book_temp: - book_id = book_temp[u'id'] - else: - return None + book_id = book_name.book_id if book_id: AlternativeBookNamesDB.create_alternative_book_name( book, book_id, language_id) - if book_id: - return book_id - else: - return None + return book_id def get_verses(self, reference_list, show_error=True): """ @@ -427,13 +432,11 @@ The book object to get the chapter count for. """ log.debug(u'BibleDB.get_chapter_count("%s")', book.name) - count = self.session.query(Verse.chapter).join(Book)\ - .filter(Book.book_reference_id==book.book_reference_id)\ - .distinct().count() + count = self.session.query(func.max(Verse.chapter)).join(Book).filter( + Book.book_reference_id==book.book_reference_id).scalar() if not count: return 0 - else: - return count + return count def get_verse_count(self, book_ref_id, chapter): """ @@ -446,14 +449,13 @@ The chapter to get the verse count for. """ log.debug(u'BibleDB.get_verse_count("%s", "%s")', book_ref_id, chapter) - count = self.session.query(Verse).join(Book)\ + count = self.session.query(func.max(Verse.verse)).join(Book)\ .filter(Book.book_reference_id==book_ref_id)\ .filter(Verse.chapter==chapter)\ - .count() + .scalar() if not count: return 0 - else: - return count + return count def get_language(self, bible_name=None): """ @@ -474,7 +476,7 @@ return False language = BiblesResourcesDB.get_language(language) language_id = language[u'id'] - self.create_meta(u'language_id', language_id) + self.save_meta(u'language_id', language_id) return language_id def is_old_database(self): @@ -483,7 +485,7 @@ prior to 1.9.6. """ try: - columns = self.session.query(Book).all() + self.session.query(Book).all() except: return True return False @@ -550,16 +552,13 @@ log.debug(u'BiblesResourcesDB.get_books()') books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' u'abbreviation, chapters FROM book_reference ORDER BY id') - return [ - { - u'id': book[0], - u'testament_id': book[1], - u'name': unicode(book[2]), - u'abbreviation': unicode(book[3]), - u'chapters': book[4] - } - for book in books - ] + return [{ + u'id': book[0], + u'testament_id': book[1], + u'name': unicode(book[2]), + u'abbreviation': unicode(book[3]), + u'chapters': book[4] + } for book in books] @staticmethod def get_book(name, lower=False): @@ -601,7 +600,7 @@ Return the books which include string. ``string`` - The string to search for in the booknames or abbreviations. + The string to search for in the book names or abbreviations. """ log.debug(u'BiblesResourcesDB.get_book_like("%s")', string) if not isinstance(string, unicode): @@ -611,16 +610,13 @@ u'LOWER(name) LIKE ? OR LOWER(abbreviation) LIKE ?', (u'%' + string.lower() + u'%', u'%' + string.lower() + u'%')) if books: - return [ - { + return [{ u'id': book[0], u'testament_id': book[1], u'name': unicode(book[2]), u'abbreviation': unicode(book[3]), u'chapters': book[4] - } - for book in books - ] + } for book in books] else: return None @@ -747,16 +743,13 @@ u'language_id, download_source_id FROM webbibles WHERE ' u'download_source_id = ?', (source[u'id'],)) if bibles: - return [ - { + return [{ u'id': bible[0], u'name': bible[1], u'abbreviation': bible[2], u'language_id': bible[3], u'download_source_id': bible[4] - } - for bible in bibles - ] + } for bible in bibles] else: return None @@ -789,7 +782,7 @@ u'abbreviation': bible[0][2], u'language_id': bible[0][3], u'download_source_id': bible[0][4] - } + } except (IndexError, TypeError): return None @@ -850,14 +843,11 @@ languages = BiblesResourcesDB.run_sql(u'SELECT id, name, code FROM ' u'language ORDER by name') if languages: - return [ - { + return [{ u'id': language[0], u'name': unicode(language[1]), u'code': unicode(language[2]) - } - for language in languages - ] + } for language in languages] else: return None @@ -1036,7 +1026,7 @@ Returns the version name of the Bible. """ version_name = self.run_sql(u'SELECT value FROM ' - u'metadata WHERE key = "Version"') + u'metadata WHERE key = "name"') if version_name: self.name = version_name[0][0] else: @@ -1050,13 +1040,10 @@ metadata = self.run_sql(u'SELECT key, value FROM metadata ' u'ORDER BY rowid') if metadata: - return [ - { + return [{ u'key': unicode(meta[0]), u'value': unicode(meta[1]) - } - for meta in metadata - ] + } for meta in metadata] else: return None @@ -1088,13 +1075,10 @@ """ books = self.run_sql(u'SELECT name, id FROM book ORDER BY id') if books: - return [ - { + return [{ u'name': unicode(book[0]), u'id':int(book[1]) - } - for book in books - ] + } for book in books] else: return None @@ -1105,15 +1089,12 @@ verses = self.run_sql(u'SELECT book_id, chapter, verse, text FROM ' u'verse WHERE book_id = ? ORDER BY id', (book_id, )) if verses: - return [ - { + return [{ u'book_id': int(verse[0]), u'chapter': int(verse[1]), u'verse': int(verse[2]), u'text': unicode(verse[3]) - } - for verse in verses - ] + } for verse in verses] else: return None diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/http.py openlp-1.9.10/openlp/plugins/bibles/lib/http.py --- openlp-1.9.9/openlp/plugins/bibles/lib/http.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/http.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -43,34 +44,140 @@ from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB, \ Book +UGLY_CHARS = { + u'\u2014': u' - ', + u'\u2018': u'\'', + u'\u2019': u'\'', + u'\u201c': u'"', + u'\u201d': u'"', + u' ': u' ' +} + log = logging.getLogger(__name__) class BGExtract(object): """ Extract verses from BibleGateway """ - def __init__(self, proxyurl=None): - log.debug(u'BGExtract.init("%s")', proxyurl) - self.proxyurl = proxyurl + def __init__(self, proxy_url=None): + log.debug(u'BGExtract.init("%s")', proxy_url) + self.proxy_url = proxy_url socket.setdefaulttimeout(30) - def get_bible_chapter(self, version, bookname, chapter): + def _remove_elements(self, parent, tag, class_=None): + """ + Remove a particular element from the BeautifulSoup tree. + + ``parent`` + The element from which items need to be removed. + + ``tag`` + A string of the tab type, e.g. "div" + + ``class_`` + An HTML class attribute for further qualification. + """ + if class_: + all_tags = parent.findAll(tag, class_) + else: + all_tags = parent.findAll(tag) + for element in all_tags: + element.extract() + + def _extract_verse(self, tag): + """ + Extract a verse (or part of a verse) from a tag. + + ``tag`` + The BeautifulSoup Tag element with the stuff we want. + """ + if isinstance(tag, NavigableString): + return None, unicode(tag) + elif tag.get('class') == 'versenum': + verse = unicode(tag.string)\ + .replace('[', '').replace(']', '').strip() + return verse, None + elif tag.get('class') == 'chapternum': + verse = '1' + return verse, None + else: + verse, text = None, '' + for child in tag.contents: + c_verse, c_text = self._extract_verse(child) + if c_verse: + verse = c_verse + if text and c_text: + text += c_text + elif c_text is not None: + text = c_text + return verse, text + + def _clean_soup(self, tag): + """ + Remove all the rubbish from the HTML page. + + ``tag`` + The base tag within which we want to remove stuff. + """ + self._remove_elements(tag, 'sup', 'crossreference') + self._remove_elements(tag, 'sup', 'footnote') + self._remove_elements(tag, 'div', 'footnotes') + self._remove_elements(tag, 'div', 'crossrefs') + self._remove_elements(tag, 'h3') + + def _extract_verses(self, tags): + """ + Extract all the verses from a pre-prepared list of HTML tags. + + ``tags`` + A list of BeautifulSoup Tag elements. + """ + verses = [] + tags = tags[::-1] + current_text = '' + for tag in tags: + verse, text = None, '' + for child in tag.contents: + c_verse, c_text = self._extract_verse(child) + if c_verse: + verse = c_verse + if text and c_text: + text += c_text + elif c_text is not None: + text = c_text + if not verse: + current_text = text + ' ' + current_text + else: + text += ' ' + current_text + current_text = '' + if text: + for old, new in UGLY_CHARS.iteritems(): + text = text.replace(old, new) + text = u' '.join(text.split()) + if verse and text: + verses.append((int(verse.strip()), text)) + verse_list = {} + for verse, text in verses[::-1]: + verse_list[verse] = text + return verse_list + + def get_bible_chapter(self, version, book_name, chapter): """ Access and decode Bibles via the BibleGateway website. ``version`` The version of the Bible like 31 for New International version. - ``bookname`` + ``book_name`` Name of the Book. ``chapter`` Chapter number. """ log.debug(u'BGExtract.get_bible_chapter("%s", "%s", "%s")', version, - bookname, chapter) - urlbookname = urllib.quote(bookname.encode("utf-8")) - url_params = u'search=%s+%s&version=%s' % (urlbookname, chapter, + book_name, chapter) + url_book_name = urllib.quote(book_name.encode("utf-8")) + url_params = u'search=%s+%s&version=%s' % (url_book_name, chapter, version) cleaner = [(re.compile(' |<br />|\'\+\''), lambda match: '')] soup = get_soup_for_bible_ref( @@ -80,65 +187,14 @@ if not soup: return None Receiver.send_message(u'openlp_process_events') - footnotes = soup.findAll(u'sup', u'footnote') - if footnotes: - for footnote in footnotes: - footnote.extract() - crossrefs = soup.findAll(u'sup', u'xref') - if crossrefs: - for crossref in crossrefs: - crossref.extract() - headings = soup.findAll(u'h5') - if headings: - for heading in headings: - heading.extract() - chapter_notes = soup.findAll('div', 'footnotes') - if chapter_notes: - log.debug('Found chapter notes') - for note in chapter_notes: - note.extract() - note_comments = soup.findAll(text=u'end of footnotes') - if note_comments: - for comment in note_comments: - comment.extract() - cleanup = [(re.compile('\s+'), lambda match: ' ')] - verses = BeautifulSoup(str(soup), markupMassage=cleanup) - verse_list = {} - # Cater for inconsistent mark up in the first verse of a chapter. - first_verse = verses.find(u'versenum') - if first_verse and len(first_verse.contents): - verse_list[1] = unicode(first_verse.contents[0]) - for verse in verses(u'sup', u'versenum'): - raw_verse_num = verse.next - clean_verse_num = 0 - # Not all verses exist in all translations and may or may not be - # represented by a verse number. If they are not fine, if they are - # it will probably be in a format that breaks int(). We will then - # have no idea what garbage may be sucked in to the verse text so - # if we do not get a clean int() then ignore the verse completely. - try: - clean_verse_num = int(str(raw_verse_num)) - except ValueError: - log.warn(u'Illegal verse number in %s %s %s:%s', - version, bookname, chapter, unicode(raw_verse_num)) - if clean_verse_num: - verse_text = raw_verse_num.next - part = raw_verse_num.next.next - while not (isinstance(part, Tag) and part.attrMap and - part.attrMap[u'class'] == u'versenum'): - # While we are still in the same verse grab all the text. - if isinstance(part, NavigableString): - verse_text = verse_text + part - if isinstance(part.next, Tag) and part.next.name == u'div': - # Run out of verses so stop. - break - part = part.next - verse_list[clean_verse_num] = unicode(verse_text) + div = soup.find('div', 'result-text-style-normal') + self._clean_soup(div) + verse_list = self._extract_verses(div.findAll('span', 'text')) if not verse_list: log.debug(u'No content found in the BibleGateway response.') send_error_message(u'parse') return None - return SearchResults(bookname, chapter, verse_list) + return SearchResults(book_name, chapter, verse_list) def get_books_from_http(self, version): """ @@ -195,30 +251,30 @@ """ Extract verses from Bibleserver.com """ - def __init__(self, proxyurl=None): - log.debug(u'BSExtract.init("%s")', proxyurl) - self.proxyurl = proxyurl + def __init__(self, proxy_url=None): + log.debug(u'BSExtract.init("%s")', proxy_url) + self.proxy_url = proxy_url socket.setdefaulttimeout(30) - def get_bible_chapter(self, version, bookname, chapter): + def get_bible_chapter(self, version, book_name, chapter): """ Access and decode bibles via Bibleserver mobile website ``version`` The version of the bible like NIV for New International Version - ``bookname`` + ``book_name`` Text name of bible book e.g. Genesis, 1. John, 1John or Offenbarung ``chapter`` Chapter number """ log.debug(u'BSExtract.get_bible_chapter("%s", "%s", "%s")', version, - bookname, chapter) - urlversion = urllib.quote(version.encode("utf-8")) - urlbookname = urllib.quote(bookname.encode("utf-8")) + book_name, chapter) + url_version = urllib.quote(version.encode("utf-8")) + url_book_name = urllib.quote(book_name.encode("utf-8")) chapter_url = u'http://m.bibleserver.com/text/%s/%s%d' % \ - (urlversion, urlbookname, chapter) + (url_version, url_book_name, chapter) header = (u'Accept-Language', u'en') soup = get_soup_for_bible_ref(chapter_url, header) if not soup: @@ -236,7 +292,7 @@ Receiver.send_message(u'openlp_process_events') versenumber = int(verse_number.sub(r'\3', verse[u'class'])) verses[versenumber] = verse.contents[1].rstrip(u'\n') - return SearchResults(bookname, chapter, verses) + return SearchResults(book_name, chapter, verses) def get_books_from_http(self, version): """ @@ -268,72 +324,72 @@ """ Extract verses from CrossWalk/BibleStudyTools """ - def __init__(self, proxyurl=None): - log.debug(u'CWExtract.init("%s")', proxyurl) - self.proxyurl = proxyurl + def __init__(self, proxy_url=None): + log.debug(u'CWExtract.init("%s")', proxy_url) + self.proxy_url = proxy_url socket.setdefaulttimeout(30) - def get_bible_chapter(self, version, bookname, chapter): + def get_bible_chapter(self, version, book_name, chapter): """ Access and decode bibles via the Crosswalk website ``version`` The version of the Bible like niv for New International Version - ``bookname`` + ``book_name`` Text name of in english e.g. 'gen' for Genesis ``chapter`` Chapter number """ log.debug(u'CWExtract.get_bible_chapter("%s", "%s", "%s")', version, - bookname, chapter) - urlbookname = bookname.replace(u' ', u'-') - urlbookname = urlbookname.lower() - urlbookname = urllib.quote(urlbookname.encode("utf-8")) + book_name, chapter) + url_book_name = book_name.replace(u' ', u'-') + url_book_name = url_book_name.lower() + url_book_name = urllib.quote(url_book_name.encode("utf-8")) chapter_url = u'http://www.biblestudytools.com/%s/%s/%s.html' % \ - (version, urlbookname, chapter) + (version, url_book_name, chapter) soup = get_soup_for_bible_ref(chapter_url) if not soup: return None Receiver.send_message(u'openlp_process_events') - htmlverses = soup.findAll(u'span', u'versetext') - if not htmlverses: + html_verses = soup.findAll(u'span', u'versetext') + if not html_verses: log.error(u'No verses found in the CrossWalk response.') send_error_message(u'parse') return None verses = {} reduce_spaces = re.compile(r'[ ]{2,}') fix_punctuation = re.compile(r'[ ]+([.,;])') - for verse in htmlverses: + for verse in html_verses: Receiver.send_message(u'openlp_process_events') - versenumber = int(verse.contents[0].contents[0]) - versetext = u'' + verse_number = int(verse.contents[0].contents[0]) + verse_text = u'' for part in verse.contents: Receiver.send_message(u'openlp_process_events') if isinstance(part, NavigableString): - versetext = versetext + part + verse_text = verse_text + part elif part and part.attrMap and \ (part.attrMap[u'class'] == u'WordsOfChrist' or \ part.attrMap[u'class'] == u'strongs'): for subpart in part.contents: Receiver.send_message(u'openlp_process_events') if isinstance(subpart, NavigableString): - versetext = versetext + subpart + verse_text = verse_text + subpart elif subpart and subpart.attrMap and \ subpart.attrMap[u'class'] == u'strongs': for subsub in subpart.contents: Receiver.send_message(u'openlp_process_events') if isinstance(subsub, NavigableString): - versetext = versetext + subsub + verse_text = verse_text + subsub Receiver.send_message(u'openlp_process_events') # Fix up leading and trailing spaces, multiple spaces, and spaces # between text and , and . - versetext = versetext.strip(u'\n\r\t ') - versetext = reduce_spaces.sub(u' ', versetext) - versetext = fix_punctuation.sub(r'\1', versetext) - verses[versenumber] = versetext - return SearchResults(bookname, chapter, verses) + verse_text = verse_text.strip(u'\n\r\t ') + verse_text = reduce_spaces.sub(u' ', verse_text) + verse_text = fix_punctuation.sub(r'\1', verse_text) + verses[verse_number] = verse_text + return SearchResults(book_name, chapter, verses) def get_books_from_http(self, version): """ @@ -363,7 +419,7 @@ class HTTPBible(BibleDB): - log.info(u'%s HTTPBible loaded' , __name__) + log.info(u'%s HTTPBible loaded', __name__) def __init__(self, parent, **kwargs): """ @@ -401,16 +457,16 @@ self.wizard.incrementProgressBar(unicode(translate( 'BiblesPlugin.HTTPBible', 'Registering Bible and loading books...'))) - self.create_meta(u'download source', self.download_source) - self.create_meta(u'download name', self.download_name) + self.save_meta(u'download_source', self.download_source) + self.save_meta(u'download_name', self.download_name) if self.proxy_server: - self.create_meta(u'proxy server', self.proxy_server) + self.save_meta(u'proxy_server', self.proxy_server) if self.proxy_username: # Store the proxy userid. - self.create_meta(u'proxy username', self.proxy_username) + self.save_meta(u'proxy_username', self.proxy_username) if self.proxy_password: # Store the proxy password. - self.create_meta(u'proxy password', self.proxy_password) + self.save_meta(u'proxy_password', self.proxy_password) if self.download_source.lower() == u'crosswalk': handler = CWExtract(self.proxy_server) elif self.download_source.lower() == u'biblegateway': @@ -429,7 +485,7 @@ self.download_source.lower()) if bible[u'language_id']: language_id = bible[u'language_id'] - self.create_meta(u'language_id', language_id) + self.save_meta(u'language_id', language_id) else: language_id = self.get_language(bible_name) if not language_id: @@ -499,10 +555,10 @@ ## if it was there. By reusing the returned book name ## we get a correct book. For example it is possible ## to request ac and get Acts back. - bookname = search_results.book + book_name = search_results.book Receiver.send_message(u'openlp_process_events') # Check to see if book/chapter exists. - db_book = self.get_book(bookname) + db_book = self.get_book(book_name) self.create_chapter(db_book.id, search_results.chapter, search_results.verselist) Receiver.send_message(u'openlp_process_events') diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/__init__.py openlp-1.9.10/openlp/plugins/bibles/lib/__init__.py --- openlp-1.9.9/openlp/plugins/bibles/lib/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -31,9 +32,8 @@ import logging import re -from PyQt4 import QtCore - from openlp.core.lib import translate +from openlp.core.lib.settings import Settings from openlp.plugins.bibles.lib.db import BiblesResourcesDB log = logging.getLogger(__name__) @@ -88,7 +88,7 @@ """ These strings should need a good reason to be retranslated elsewhere. """ - self.Booknames = { + self.BookNames = { u'Gen': translate('BiblesPlugin', 'Genesis'), u'Exod': translate('BiblesPlugin', 'Exodus'), u'Lev': translate('BiblesPlugin', 'Leviticus'), @@ -185,7 +185,7 @@ ':|v|V|verse|verses;;-|to;;,|and;;end', 'Double-semicolon delimited separators for parsing references. ' 'Consult the developers for further information.')).split(u';;') - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(u'bibles') custom_separators = [ unicode(settings.value(u'verse separator').toString()), @@ -236,7 +236,7 @@ ``separator_type`` The role and format of the separator. """ - if len(REFERENCE_SEPARATORS) == 0: + if not REFERENCE_SEPARATORS: update_reference_separators() return REFERENCE_SEPARATORS[separator_type] @@ -247,7 +247,7 @@ ``match_type`` The type of match is ``range_separator``, ``range`` or ``full``. """ - if len(REFERENCE_MATCHES) == 0: + if not REFERENCE_MATCHES: update_reference_separators() return REFERENCE_MATCHES[match_type] @@ -259,14 +259,14 @@ ``reference`` A string. The Bible reference to parse. - + ``bible`` A object. The Bible database object. - + ``language_selection`` An int. The language selection the user has choosen in settings section. - + ``book_ref_id`` A string. The book reference id. @@ -355,7 +355,7 @@ log.debug(u'Matched reference %s' % reference) book = match.group(u'book') if not book_ref_id: - booknames = BibleStrings().Booknames + book_names = BibleStrings().BookNames # escape reserved characters book_escaped = book for character in u'\\.^$*+?{}[]()': @@ -368,37 +368,26 @@ if db_book: book_ref_id = db_book.book_reference_id elif language_selection == LanguageSelection.Application: - book_list = [] - for key, value in booknames.iteritems(): - if regex_book.match(unicode(value)): - book_list.append(key) - books = [] - if book_list: - for value in book_list: - item = BiblesResourcesDB.get_book(value) - if item: - books.append(item) - if books: - for value in books: - if bible.get_book_by_book_ref_id(value[u'id']): - book_ref_id = value[u'id'] - break + books = filter(lambda key: + regex_book.match(unicode(book_names[key])), book_names.keys()) + books = filter(None, map(BiblesResourcesDB.get_book, books)) + for value in books: + if bible.get_book_by_book_ref_id(value[u'id']): + book_ref_id = value[u'id'] + break elif language_selection == LanguageSelection.English: books = BiblesResourcesDB.get_books_like(book) if books: - book_list = [] - for value in books: - if regex_book.match(value[u'name']): - book_list.append(value) + book_list = filter( + lambda value: regex_book.match(value[u'name']), books) if not book_list: book_list = books - for value in book_list: + for value in book_list: if bible.get_book_by_book_ref_id(value[u'id']): book_ref_id = value[u'id'] break - else: - if not bible.get_book_by_book_ref_id(book_ref_id): - book_ref_id = False + elif not bible.get_book_by_book_ref_id(book_ref_id): + book_ref_id = False ranges = match.group(u'ranges') range_list = get_reference_match(u'range_separator').split(ranges) ref_list = [] diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/manager.py openlp-1.9.10/openlp/plugins/bibles/lib/manager.py --- openlp-1.9.9/openlp/plugins/bibles/lib/manager.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/manager.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -31,8 +32,8 @@ from PyQt4 import QtCore from openlp.core.lib import Receiver, SettingsManager, translate -from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, delete_file +from openlp.core.lib.settings import Settings from openlp.plugins.bibles.lib import parse_reference, \ get_reference_separator, LanguageSelection from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta @@ -127,7 +128,7 @@ self.db_cache = None self.path = AppLocation.get_section_data_path(self.settingsSection) self.proxy_name = unicode( - QtCore.QSettings().value(self.settingsSection + u'/proxy name', + Settings().value(self.settingsSection + u'/proxy name', QtCore.QVariant(u'')).toString()) self.suffix = u'.sqlite' self.import_wizard = None @@ -141,7 +142,8 @@ BibleDB class. """ log.debug(u'Reload bibles') - files = SettingsManager.get_files(self.settingsSection, self.suffix) + files = SettingsManager.get_files(self.settingsSection, + self.suffix) if u'alternative_book_names.sqlite' in files: files.remove(u'alternative_book_names.sqlite') log.debug(u'Bible Files %s', files) @@ -164,12 +166,12 @@ self.db_cache[name] = bible # Look to see if lazy load bible exists and get create getter. source = self.db_cache[name].get_object(BibleMeta, - u'download source') + u'download_source') if source: download_name = self.db_cache[name].get_object(BibleMeta, - u'download name').value + u'download_name').value meta_proxy = self.db_cache[name].get_object(BibleMeta, - u'proxy url') + u'proxy_server') web_bible = HTTPBible(self.parent, path=self.path, file=filename, download_source=source.value, download_name=download_name) @@ -204,6 +206,27 @@ self.db_cache[name] = importer return importer + def delete_bible(self, name): + """ + Delete a bible completly. + + ``name`` + The name of the bible. + """ + log.debug(u'BibleManager.delete_bible("%s")', name) + files = SettingsManager.get_files(self.settingsSection, + self.suffix) + if u'alternative_book_names.sqlite' in files: + files.remove(u'alternative_book_names.sqlite') + for filename in files: + bible = BibleDB(self.parent, path=self.path, file=filename) + # Remove the bible files + if name == bible.get_name(): + bible.session.close() + if delete_file(os.path.join(self.path, filename)): + return True + return False + def get_bibles(self): """ Returns a dict with all available Bibles. @@ -293,7 +316,7 @@ - Genesis 1:1-10,15-20 - Genesis 1:1-2:10 - Genesis 1:1-10,2:1-10 - + ``book_ref_id`` Unicode. The book referece id from the book in versetext. For second bible this is necessary. @@ -309,9 +332,7 @@ 'Import Wizard to install one or more Bibles.') }) return None - language_selection = QtCore.QSettings().value( - self.settingsSection + u'/bookname language', - QtCore.QVariant(0)).toInt()[0] + language_selection = self.get_language_selection(bible) reflist = parse_reference(versetext, self.db_cache[bible], language_selection, book_ref_id) if reflist: @@ -344,6 +365,26 @@ }) return None + def get_language_selection(self, bible): + """ + Returns the language selection of a bible. + + ``bible`` + Unicode. The Bible to get the language selection from. + """ + log.debug(u'BibleManager.get_language_selection("%s")', bible) + language_selection = self.get_meta_data(bible, u'book_name_language') + if language_selection: + try: + language_selection = int(language_selection.value) + except (ValueError, TypeError): + language_selection = LanguageSelection.Application + if language_selection is None or language_selection == -1: + language_selection = Settings().value( + self.settingsSection + u'/bookname language', + QtCore.QVariant(0)).toInt()[0] + return language_selection + def verse_search(self, bible, second_bible, text): """ Does a verse search for the given bible and text. @@ -369,17 +410,17 @@ return None # Check if the bible or second_bible is a web bible. webbible = self.db_cache[bible].get_object(BibleMeta, - u'download source') + u'download_source') second_webbible = u'' if second_bible: second_webbible = self.db_cache[second_bible].get_object(BibleMeta, - u'download source') + u'download_source') if webbible or second_webbible: Receiver.send_message(u'openlp_information_message', { u'title': translate('BiblesPlugin.BibleManager', - 'Web Bible cannot be used'), + 'Web Bible cannot be used'), u'message': translate('BiblesPlugin.BibleManager', - 'Text Search is not available with Web Bibles.') + 'Text Search is not available with Web Bibles.') }) return None if text: @@ -387,24 +428,27 @@ else: Receiver.send_message(u'openlp_information_message', { u'title': translate('BiblesPlugin.BibleManager', - 'Scripture Reference Error'), + 'Scripture Reference Error'), u'message': translate('BiblesPlugin.BibleManager', - 'You did not enter a search keyword.\n' - 'You can separate different keywords by a space to search for ' - 'all of your keywords and you can separate them by a comma to ' - 'search for one of them.') + 'You did not enter a search keyword.\n' + 'You can separate different keywords by a space to ' + 'search for all of your keywords and you can separate ' + 'them by a comma to search for one of them.') }) return None - def save_meta_data(self, bible, version, copyright, permissions): + def save_meta_data(self, bible, version, copyright, permissions, + book_name_language=None): """ Saves the bibles meta data. """ - log.debug(u'save_meta data %s,%s, %s,%s', + log.debug(u'save_meta data %s, %s, %s, %s', bible, version, copyright, permissions) - self.db_cache[bible].create_meta(u'Version', version) - self.db_cache[bible].create_meta(u'Copyright', copyright) - self.db_cache[bible].create_meta(u'Permissions', permissions) + self.db_cache[bible].save_meta(u'name', version) + self.db_cache[bible].save_meta(u'copyright', copyright) + self.db_cache[bible].save_meta(u'permissions', permissions) + self.db_cache[bible].save_meta(u'book_name_language', + book_name_language) def get_meta_data(self, bible, key): """ @@ -412,6 +456,13 @@ """ log.debug(u'get_meta %s,%s', bible, key) return self.db_cache[bible].get_object(BibleMeta, key) + + def update_book(self, bible, book): + """ + Update a book of the bible. + """ + log.debug(u'BibleManager.update_book("%s", "%s")', bible, book.name) + self.db_cache[bible].update_book(book) def exists(self, name): """ diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/mediaitem.py openlp-1.9.10/openlp/plugins/bibles/lib/mediaitem.py --- openlp-1.9.9/openlp/plugins/bibles/lib/mediaitem.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/mediaitem.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -33,12 +34,14 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ translate, create_separated_list from openlp.core.lib.searchedit import SearchEdit -from openlp.core.lib.ui import UiStrings, add_widget_completer, \ - media_item_combo_box, critical_error_message_box, \ +from openlp.core.lib.settings import Settings +from openlp.core.lib.ui import UiStrings, set_case_insensitive_completer, \ + create_horizontal_adjusting_combo_box, critical_error_message_box, \ find_and_set_in_combo_box, build_icon -from openlp.plugins.bibles.forms import BibleImportForm +from openlp.plugins.bibles.forms import BibleImportForm, EditBibleForm from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ - VerseReferenceList, get_reference_separator, LanguageSelection, BibleStrings + VerseReferenceList, get_reference_separator, LanguageSelection, \ + BibleStrings from openlp.plugins.bibles.lib.db import BiblesResourcesDB log = logging.getLogger(__name__) @@ -63,7 +66,7 @@ self.unlockIcon = build_icon(u':/bibles/bibles_search_unlock.png') MediaManagerItem.__init__(self, parent, plugin, icon) # Place to store the search results for both bibles. - self.settings = self.plugin.settings_tab + self.settings = self.plugin.settingsTab self.quickPreviewAllowed = True self.hasSearch = True self.search_results = {} @@ -109,8 +112,8 @@ MediaManagerItem.requiredIcons(self) self.hasImportIcon = True self.hasNewIcon = False - self.hasEditIcon = False - self.hasDeleteIcon = False + self.hasEditIcon = True + self.hasDeleteIcon = True self.addToServiceItem = False def addSearchTab(self, prefix, name): @@ -142,20 +145,22 @@ versionLabel = QtGui.QLabel(tab) versionLabel.setObjectName(prefix + u'VersionLabel') layout.addWidget(versionLabel, idx, 0, QtCore.Qt.AlignRight) - versionComboBox = media_item_combo_box(tab, + versionComboBox = create_horizontal_adjusting_combo_box(tab, prefix + u'VersionComboBox') versionLabel.setBuddy(versionComboBox) layout.addWidget(versionComboBox, idx, 1, 1, 2) secondLabel = QtGui.QLabel(tab) secondLabel.setObjectName(prefix + u'SecondLabel') layout.addWidget(secondLabel, idx + 1, 0, QtCore.Qt.AlignRight) - secondComboBox = media_item_combo_box(tab, prefix + u'SecondComboBox') + secondComboBox = create_horizontal_adjusting_combo_box( + tab, prefix + u'SecondComboBox') versionLabel.setBuddy(secondComboBox) layout.addWidget(secondComboBox, idx + 1, 1, 1, 2) styleLabel = QtGui.QLabel(tab) styleLabel.setObjectName(prefix + u'StyleLabel') layout.addWidget(styleLabel, idx + 2, 0, QtCore.Qt.AlignRight) - styleComboBox = media_item_combo_box(tab, prefix + u'StyleComboBox') + styleComboBox = create_horizontal_adjusting_combo_box( + tab, prefix + u'StyleComboBox') styleComboBox.addItems([u'', u'', u'']) layout.addWidget(styleComboBox, idx + 2, 1, 1, 2) searchButtonLayout = QtGui.QHBoxLayout() @@ -197,6 +202,8 @@ self.quickLayout.addWidget( self.quickSearchLabel, 0, 0, QtCore.Qt.AlignRight) self.quickSearchEdit = SearchEdit(self.quickTab) + self.quickSearchEdit.setSizePolicy( + QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Fixed) self.quickSearchEdit.setObjectName(u'quickSearchEdit') self.quickSearchLabel.setBuddy(self.quickSearchEdit) self.quickLayout.addWidget(self.quickSearchEdit, 0, 1, 1, 2) @@ -209,8 +216,8 @@ self.advancedBookLabel.setObjectName(u'advancedBookLabel') self.advancedLayout.addWidget(self.advancedBookLabel, 0, 0, QtCore.Qt.AlignRight) - self.advancedBookComboBox = media_item_combo_box(self.advancedTab, - u'advancedBookComboBox') + self.advancedBookComboBox = create_horizontal_adjusting_combo_box( + self.advancedTab, u'advancedBookComboBox') self.advancedBookLabel.setBuddy(self.advancedBookComboBox) self.advancedLayout.addWidget(self.advancedBookComboBox, 0, 1, 1, 2) self.advancedChapterLabel = QtGui.QLabel(self.advancedTab) @@ -242,9 +249,9 @@ self.addSearchFields(u'advanced', UiStrings().Advanced) # Combo Boxes QtCore.QObject.connect(self.quickVersionComboBox, - QtCore.SIGNAL(u'activated(int)'), self.onQuickVersionComboBox) + QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter) QtCore.QObject.connect(self.quickSecondComboBox, - QtCore.SIGNAL(u'activated(int)'), self.onQuickSecondComboBox) + QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter) QtCore.QObject.connect(self.advancedVersionComboBox, QtCore.SIGNAL(u'activated(int)'), self.onAdvancedVersionComboBox) QtCore.QObject.connect(self.advancedSecondComboBox, @@ -269,9 +276,9 @@ self.onAdvancedStyleComboBoxChanged) # Buttons QtCore.QObject.connect(self.advancedSearchButton, - QtCore.SIGNAL(u'pressed()'), self.onAdvancedSearchButton) + QtCore.SIGNAL(u'clicked()'), self.onAdvancedSearchButton) QtCore.QObject.connect(self.quickSearchButton, - QtCore.SIGNAL(u'pressed()'), self.onQuickSearchButton) + QtCore.SIGNAL(u'clicked()'), self.onQuickSearchButton) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.configUpdated) # Other stuff @@ -289,7 +296,7 @@ def configUpdated(self): log.debug(u'configUpdated') - if QtCore.QSettings().value(self.settingsSection + u'/second bibles', + if Settings().value(self.settingsSection + u'/second bibles', QtCore.QVariant(True)).toBool(): self.advancedSecondLabel.setVisible(True) self.advancedSecondComboBox.setVisible(True) @@ -348,17 +355,16 @@ log.debug(u'bible manager initialise') self.plugin.manager.media = self self.loadBibles() - bible = QtCore.QSettings().value( - self.settingsSection + u'/quick bible', QtCore.QVariant( - self.quickVersionComboBox.currentText())).toString() - find_and_set_in_combo_box(self.quickVersionComboBox, bible) self.quickSearchEdit.setSearchTypes([ (BibleSearch.Reference, u':/bibles/bibles_search_reference.png', - translate('BiblesPlugin.MediaItem', 'Scripture Reference')), + translate('BiblesPlugin.MediaItem', 'Scripture Reference'), + translate( + 'BiblesPlugin.MediaItem', 'Search Scripture Reference...')), (BibleSearch.Text, u':/bibles/bibles_search_text.png', - translate('BiblesPlugin.MediaItem', 'Text Search')) + translate('BiblesPlugin.MediaItem', 'Text Search'), + translate('BiblesPlugin.MediaItem', 'Search Text...')) ]) - self.quickSearchEdit.setCurrentSearchType(QtCore.QSettings().value( + self.quickSearchEdit.setCurrentSearchType(Settings().value( u'%s/last search type' % self.settingsSection, QtCore.QVariant(BibleSearch.Reference)).toInt()[0]) self.configUpdated() @@ -374,23 +380,26 @@ self.advancedSecondComboBox.addItem(u'') # Get all bibles and sort the list. bibles = self.plugin.manager.get_bibles().keys() + bibles = filter(None, bibles) bibles.sort(cmp=locale.strcoll) # Load the bibles into the combo boxes. - for bible in bibles: - if bible: - self.quickVersionComboBox.addItem(bible) - self.quickSecondComboBox.addItem(bible) - self.advancedVersionComboBox.addItem(bible) - self.advancedSecondComboBox.addItem(bible) + self.quickVersionComboBox.addItems(bibles) + self.quickSecondComboBox.addItems(bibles) + self.advancedVersionComboBox.addItems(bibles) + self.advancedSecondComboBox.addItems(bibles) # set the default value - bible = QtCore.QSettings().value( + bible = Settings().value( self.settingsSection + u'/advanced bible', QtCore.QVariant(u'')).toString() if bible in bibles: find_and_set_in_combo_box(self.advancedVersionComboBox, bible) self.initialiseAdvancedBible(unicode(bible)) - elif len(bibles): + elif bibles: self.initialiseAdvancedBible(bibles[0]) + bible = Settings().value( + self.settingsSection + u'/quick bible', QtCore.QVariant( + self.quickVersionComboBox.currentText())).toString() + find_and_set_in_combo_box(self.quickVersionComboBox, bible) def reloadBibles(self, process=False): log.debug(u'Reloading Bibles') @@ -401,7 +410,7 @@ self.plugin.appStartup() self.updateAutoCompleter() - def initialiseAdvancedBible(self, bible): + def initialiseAdvancedBible(self, bible, last_book_id=None): """ This initialises the given bible, which means that its book names and their chapter numbers is added to the combo boxes on the @@ -410,8 +419,12 @@ ``bible`` The bible to initialise (unicode). + + ``last_book_id`` + The "book reference id" of the book which is choosen at the moment. + (int) """ - log.debug(u'initialiseAdvancedBible %s', bible) + log.debug(u'initialiseAdvancedBible %s, %s', bible, last_book_id) book_data = self.plugin.manager.get_books(bible) secondbible = unicode(self.advancedSecondComboBox.currentText()) if secondbible != u'': @@ -425,10 +438,9 @@ book_data = book_data_temp self.advancedBookComboBox.clear() first = True - language_selection = QtCore.QSettings().value( - self.settingsSection + u'/bookname language', - QtCore.QVariant(0)).toInt()[0] - booknames = BibleStrings().Booknames + initialise_chapter_verse = False + language_selection = self.plugin.manager.get_language_selection(bible) + book_names = BibleStrings().BookNames for book in book_data: row = self.advancedBookComboBox.count() if language_selection == LanguageSelection.Bible: @@ -437,7 +449,7 @@ data = BiblesResourcesDB.get_book_by_id( book[u'book_reference_id']) self.advancedBookComboBox.addItem( - booknames[data[u'abbreviation']]) + book_names[data[u'abbreviation']]) elif language_selection == LanguageSelection.English: data = BiblesResourcesDB.get_book_by_id( book[u'book_reference_id']) @@ -446,8 +458,19 @@ row, QtCore.QVariant(book[u'book_reference_id'])) if first: first = False - self.initialiseChapterVerse(bible, book[u'name'], - book[u'book_reference_id']) + first_book = book + initialise_chapter_verse = True + if last_book_id and last_book_id == int(book[u'book_reference_id']): + index = self.advancedBookComboBox.findData( + QtCore.QVariant(book[u'book_reference_id'])) + if index == -1: + # Not Found. + index = 0 + self.advancedBookComboBox.setCurrentIndex(index) + initialise_chapter_verse = False + if initialise_chapter_verse: + self.initialiseChapterVerse(bible, first_book[u'name'], + first_book[u'book_reference_id']) def initialiseChapterVerse(self, bible, book, book_ref_id): log.debug(u'initialiseChapterVerse %s, %s, %s', bible, book, @@ -476,11 +499,11 @@ """ log.debug(u'updateAutoCompleter') # Save the current search type to the configuration. - QtCore.QSettings().setValue(u'%s/last search type' % + Settings().setValue(u'%s/last search type' % self.settingsSection, QtCore.QVariant(self.quickSearchEdit.currentSearchType())) # Save the current bible to the configuration. - QtCore.QSettings().setValue(self.settingsSection + u'/quick bible', + Settings().setValue(self.settingsSection + u'/quick bible', QtCore.QVariant(self.quickVersionComboBox.currentText())) books = [] # We have to do a 'Reference Search'. @@ -499,30 +522,24 @@ secondbook.book_reference_id: book_data_temp.append(book) book_data = book_data_temp - language_selection = QtCore.QSettings().value( - self.settingsSection + u'/bookname language', - QtCore.QVariant(0)).toInt()[0] + language_selection = self.plugin.manager.get_language_selection( + bible) if language_selection == LanguageSelection.Bible: books = [book.name + u' ' for book in book_data] elif language_selection == LanguageSelection.Application: - booknames = BibleStrings().Booknames + book_names = BibleStrings().BookNames for book in book_data: data = BiblesResourcesDB.get_book_by_id( book.book_reference_id) - books.append(data[u'name'] + u' ') + books.append(unicode( + book_names[data[u'abbreviation']]) + u' ') elif language_selection == LanguageSelection.English: for book in book_data: data = BiblesResourcesDB.get_book_by_id( book.book_reference_id) books.append(data[u'name'] + u' ') books.sort(cmp=locale.strcoll) - add_widget_completer(books, self.quickSearchEdit) - - def onQuickVersionComboBox(self): - self.updateAutoCompleter() - - def onQuickSecondComboBox(self): - self.updateAutoCompleter() + set_case_insensitive_completer(books, self.quickSearchEdit) def onImportClick(self): if not hasattr(self, u'import_wizard'): @@ -532,6 +549,34 @@ if self.import_wizard.exec_(): self.reloadBibles() + def onEditClick(self): + if self.quickTab.isVisible(): + bible = unicode(self.quickVersionComboBox.currentText()) + elif self.advancedTab.isVisible(): + bible = unicode(self.advancedVersionComboBox.currentText()) + if bible: + self.editBibleForm = EditBibleForm(self, self.plugin.formParent, + self.plugin.manager) + self.editBibleForm.loadBible(bible) + if self.editBibleForm.exec_(): + self.reloadBibles() + + def onDeleteClick(self): + if self.quickTab.isVisible(): + bible = unicode(self.quickVersionComboBox.currentText()) + elif self.advancedTab.isVisible(): + bible = unicode(self.advancedVersionComboBox.currentText()) + if bible: + if QtGui.QMessageBox.question(self, UiStrings().ConfirmDelete, + unicode(translate('BiblesPlugin.MediaItem', + 'Are you sure you want to delete "%s"?')) % bible, + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | + QtGui.QMessageBox.No), + QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No: + return + self.plugin.manager.delete_bible(bible) + self.reloadBibles() + def onSearchTabBarCurrentChanged(self, index): if index == 0: self.advancedTab.setVisible(False) @@ -553,7 +598,7 @@ self.advancedStyleComboBox.setCurrentIndex(self.settings.layout_style) self.settings.layoutStyleComboBox.setCurrentIndex( self.settings.layout_style) - QtCore.QSettings().setValue( + Settings().setValue( self.settingsSection + u'/verse layout style', QtCore.QVariant(self.settings.layout_style)) @@ -562,19 +607,23 @@ self.quickStyleComboBox.setCurrentIndex(self.settings.layout_style) self.settings.layoutStyleComboBox.setCurrentIndex( self.settings.layout_style) - QtCore.QSettings().setValue( + Settings().setValue( self.settingsSection + u'/verse layout style', QtCore.QVariant(self.settings.layout_style)) def onAdvancedVersionComboBox(self): - QtCore.QSettings().setValue(self.settingsSection + u'/advanced bible', + Settings().setValue(self.settingsSection + u'/advanced bible', QtCore.QVariant(self.advancedVersionComboBox.currentText())) self.initialiseAdvancedBible( - unicode(self.advancedVersionComboBox.currentText())) + unicode(self.advancedVersionComboBox.currentText()), + self.advancedBookComboBox.itemData( + int(self.advancedBookComboBox.currentIndex()))) def onAdvancedSecondComboBox(self): self.initialiseAdvancedBible( - unicode(self.advancedVersionComboBox.currentText())) + unicode(self.advancedVersionComboBox.currentText()), + self.advancedBookComboBox.itemData( + int(self.advancedBookComboBox.currentIndex()))) def onAdvancedBookComboBox(self): item = int(self.advancedBookComboBox.currentIndex()) @@ -661,7 +710,7 @@ """ Does an advanced search and saves the search results. """ - log.debug(u'Advanced Search Button pressed') + log.debug(u'Advanced Search Button clicked') self.advancedSearchButton.setEnabled(False) Receiver.send_message(u'openlp_process_events') bible = unicode(self.advancedVersionComboBox.currentText()) @@ -700,7 +749,7 @@ Does a quick search and saves the search results. Quick search can either be "Reference Search" or "Text Search". """ - log.debug(u'Quick Search Button pressed') + log.debug(u'Quick Search Button clicked') self.quickSearchButton.setEnabled(False) Receiver.send_message(u'openlp_process_events') bible = unicode(self.quickVersionComboBox.currentText()) @@ -779,24 +828,37 @@ further action is saved for/in each row. """ verse_separator = get_reference_separator(u'sep_v_display') - version = self.plugin.manager.get_meta_data(bible, u'Version').value - copyright = self.plugin.manager.get_meta_data(bible, u'Copyright').value + version = self.plugin.manager.get_meta_data(bible, u'name').value + copyright = self.plugin.manager.get_meta_data(bible, u'copyright').value permissions = \ - self.plugin.manager.get_meta_data(bible, u'Permissions').value + self.plugin.manager.get_meta_data(bible, u'permissions').value second_version = u'' second_copyright = u'' second_permissions = u'' if second_bible: second_version = self.plugin.manager.get_meta_data( - second_bible, u'Version').value + second_bible, u'name').value second_copyright = self.plugin.manager.get_meta_data( - second_bible, u'Copyright').value + second_bible, u'copyright').value second_permissions = self.plugin.manager.get_meta_data( - second_bible, u'Permissions').value + second_bible, u'permissions').value items = [] + language_selection = self.plugin.manager.get_language_selection(bible) for count, verse in enumerate(search_results): + book = None + if language_selection == LanguageSelection.Bible: + book = verse.book.name + elif language_selection == LanguageSelection.Application: + book_names = BibleStrings().BookNames + data = BiblesResourcesDB.get_book_by_id( + verse.book.book_reference_id) + book = unicode(book_names[data[u'abbreviation']]) + elif language_selection == LanguageSelection.English: + data = BiblesResourcesDB.get_book_by_id( + verse.book.book_reference_id) + book = data[u'name'] data = { - 'book': QtCore.QVariant(verse.book.name), + 'book': QtCore.QVariant(book), 'chapter': QtCore.QVariant(verse.chapter), 'verse': QtCore.QVariant(verse.verse), 'bible': QtCore.QVariant(bible), @@ -818,12 +880,11 @@ log.exception(u'The second_search_results does not have as ' 'many verses as the search_results.') break - bible_text = u'%s %d%s%d (%s, %s)' % (verse.book.name, - verse.chapter, verse_separator, verse.verse, version, - second_version) + bible_text = u'%s %d%s%d (%s, %s)' % (book, verse.chapter, + verse_separator, verse.verse, version, second_version) else: - bible_text = u'%s %d%s%d (%s)' % (verse.book.name, - verse.chapter, verse_separator, verse.verse, version) + bible_text = u'%s %d%s%d (%s)' % (book, verse.chapter, + verse_separator, verse.verse, version) bible_verse = QtGui.QListWidgetItem(bible_text) bible_verse.setData(QtCore.Qt.UserRole, QtCore.QVariant(data)) items.append(bible_verse) @@ -840,7 +901,7 @@ items = item else: items = self.listView.selectedItems() - if len(items) == 0: + if not items: return False bible_text = u'' old_item = None @@ -911,12 +972,12 @@ # Service Item: Title service_item.title = create_separated_list(raw_title) # Service Item: Theme - if len(self.settings.bible_theme) == 0: + if not self.settings.bible_theme: 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) return True def formatTitle(self, start_bitem, old_bitem): @@ -992,8 +1053,7 @@ # last verse of the chapter or the current verse is not the # first one of the chapter. return True - else: - return False + return False def formatVerse(self, old_chapter, chapter, verse): """ diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/openlp1.py openlp-1.9.10/openlp/plugins/bibles/lib/openlp1.py --- openlp-1.9.9/openlp/plugins/bibles/lib/openlp1.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/openlp1.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -87,14 +88,14 @@ testament_id = int(book[1]) name = unicode(book[2], u'cp1252') abbreviation = unicode(book[3], u'cp1252') - book_ref_id = self.get_book_ref_id_by_name(name, len(books), + book_ref_id = self.get_book_ref_id_by_name(name, len(books), language_id) if not book_ref_id: log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) - db_book = self.create_book(name, book_ref_id, + db_book = self.create_book(name, book_ref_id, book_details[u'testament_id']) # Update the progess bar. self.wizard.incrementProgressBar(WizardStrings.ImportingType % name) diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/opensong.py openlp-1.9.10/openlp/plugins/bibles/lib/opensong.py --- openlp-1.9.9/openlp/plugins/bibles/lib/opensong.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/opensong.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -46,6 +47,22 @@ BibleDB.__init__(self, parent, **kwargs) self.filename = kwargs['filename'] + def get_text(self, element): + """ + Recursively get all text in an objectify element and its child elements. + + ``element`` + An objectify element to get the text from + """ + verse_text = u'' + if element.text: + verse_text = element.text + for sub_element in element.iterchildren(): + verse_text += self.get_text(sub_element) + if element.tail: + verse_text += element.tail + return verse_text + def do_import(self, bible_name=None): """ Loads a Bible from file. @@ -77,7 +94,7 @@ 'failed' % self.filename) return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) - db_book = self.create_book(unicode(book.attrib[u'n']), + db_book = self.create_book(unicode(book.attrib[u'n']), book_ref_id, book_details[u'testament_id']) for chapter in book.c: if self.stop_import_flag: @@ -89,7 +106,7 @@ db_book.id, int(chapter.attrib[u'n'].split()[-1]), int(verse.attrib[u'n']), - unicode(verse.text)) + unicode(self.get_text(verse))) self.wizard.incrementProgressBar(unicode(translate( 'BiblesPlugin.Opensong', 'Importing %s %s...', 'Importing <book name> <chapter>...')) % diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/osis.py openlp-1.9.10/openlp/plugins/bibles/lib/osis.py --- openlp-1.9.9/openlp/plugins/bibles/lib/osis.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/osis.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -26,7 +27,6 @@ ############################################################################### import os -import os.path import logging import chardet import codecs @@ -51,8 +51,6 @@ log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) self.filename = kwargs[u'filename'] - fbibles = None - self.books = {} self.language_regex = re.compile(r'<language.*>(.*?)</language>') self.verse_regex = re.compile( r'<verse osisID="([a-zA-Z0-9 ]*).([0-9]*).([0-9]*)">(.*?)</verse>') @@ -75,16 +73,6 @@ filepath = os.path.join( AppLocation.get_directory(AppLocation.PluginsDir), u'bibles', u'resources', u'osisbooks.csv') - try: - fbibles = open(filepath, u'r') - for line in fbibles: - book = line.split(u',') - self.books[book[0]] = (book[1].strip(), book[2].strip()) - except IOError: - log.exception(u'OSIS bible import failed') - finally: - if fbibles: - fbibles.close() def do_import(self, bible_name=None): """ @@ -102,6 +90,8 @@ try: detect_file = open(self.filename, u'r') details = chardet.detect(detect_file.read(1048576)) + detect_file.seek(0) + lines_in_file = int(len(detect_file.readlines())) except IOError: log.exception(u'Failed to detect OSIS file encoding') return @@ -112,6 +102,17 @@ osis = codecs.open(self.filename, u'r', details['encoding']) repl = replacement language_id = False + # Decide if the bible propably contains only NT or AT and NT or + # AT, NT and Apocrypha + if lines_in_file < 11500: + book_count = 27 + chapter_count = 260 + elif lines_in_file < 34200: + book_count = 66 + chapter_count = 1188 + else: + book_count = 67 + chapter_count = 1336 for file_record in osis: if self.stop_import_flag: break @@ -123,7 +124,7 @@ language_match.group(1)) if language: language_id = language[u'id'] - self.create_meta(u'language_id', language_id) + self.save_meta(u'language_id', language_id) continue match = self.verse_regex.search(file_record) if match: @@ -135,36 +136,32 @@ % self.filename) return False match_count += 1 - book = match.group(1) + book = unicode(match.group(1)) chapter = int(match.group(2)) verse = int(match.group(3)) verse_text = match.group(4) - if not db_book or db_book.name != self.books[book][0]: - log.debug(u'New book: "%s"' % self.books[book][0]) - book_ref_id = self.get_book_ref_id_by_name(unicode( - self.books[book][0]), 67, language_id) - if not book_ref_id: - log.exception(u'Importing books from "%s" '\ - 'failed' % self.filename) - return False - book_details = BiblesResourcesDB.get_book_by_id( - book_ref_id) + book_ref_id = self.get_book_ref_id_by_name(book, book_count, + language_id) + if not book_ref_id: + log.exception(u'Importing books from "%s" failed' % + self.filename) + return False + book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) + if not db_book or db_book.name != book_details[u'name']: + log.debug(u'New book: "%s"' % book_details[u'name']) db_book = self.create_book( - unicode(self.books[book][0]), + book_details[u'name'], book_ref_id, book_details[u'testament_id']) if last_chapter == 0: - if book == u'Gen': - self.wizard.progressBar.setMaximum(1188) - else: - self.wizard.progressBar.setMaximum(260) + self.wizard.progressBar.setMaximum(chapter_count) if last_chapter != chapter: if last_chapter != 0: self.session.commit() self.wizard.incrementProgressBar(unicode(translate( 'BiblesPlugin.OsisImport', 'Importing %s %s...', 'Importing <book name> <chapter>...')) % - (self.books[match.group(1)][0], chapter)) + (book_details[u'name'], chapter)) last_chapter = chapter # All of this rigmarol below is because the mod2osis # tool from the Sword library embeds XML in the OSIS diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/upgrade.py openlp-1.9.10/openlp/plugins/bibles/lib/upgrade.py --- openlp-1.9.9/openlp/plugins/bibles/lib/upgrade.py 1970-01-01 00:00:00.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/upgrade.py 2012-06-23 16:35:18.000000000 +0000 @@ -0,0 +1,192 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # +############################################################################### +""" +The :mod:`upgrade` module provides a way for the database and schema that is the +backend for the Bibles plugin +""" +import logging + +from sqlalchemy import Table, func, select, insert + +__version__ = 1 +log = logging.getLogger(__name__) + +def upgrade_setup(metadata): + """ + Set up the latest revision all tables, with reflection, needed for the + upgrade process. If you want to drop a table, you need to remove it from + here, and add it to your upgrade function. + """ + # Don't define the "metadata" table, as the upgrade mechanism already + # defines it. + tables = { + u'book': Table(u'book', metadata, autoload=True), + u'verse': Table(u'verse', metadata, autoload=True) + } + return tables + + +def upgrade_1(session, metadata, tables): + """ + Version 1 upgrade. + + This upgrade renames a number of keys to a single naming convention.. + """ + metadata_table = metadata.tables[u'metadata'] + # Copy "Version" to "name" ("version" used by upgrade system) + # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) + session.execute(insert(metadata_table).values( + key=u'name', + value=select( + [metadata_table.c.value], + metadata_table.c.key == u'Version' + ).as_scalar() + )) + # Copy "Copyright" to "copyright" + # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) + session.execute(insert(metadata_table).values( + key=u'copyright', + value=select( + [metadata_table.c.value], + metadata_table.c.key == u'Copyright' + ).as_scalar() + )) + # Copy "Permissions" to "permissions" + # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) + session.execute(insert(metadata_table).values( + key=u'permissions', + value=select( + [metadata_table.c.value], + metadata_table.c.key == u'Permissions' + ).as_scalar() + )) + # Copy "Bookname language" to "book_name_language" + # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) + value_count = session.execute( + select( + [func.count(metadata_table.c.value)], + metadata_table.c.key == u'Bookname language' + ) + ).scalar() + if value_count > 0: + session.execute(insert(metadata_table).values( + key=u'book_name_language', + value=select( + [metadata_table.c.value], + metadata_table.c.key == u'Bookname language' + ).as_scalar() + )) + # Copy "download source" to "download_source" + # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) + value_count = session.execute( + select( + [func.count(metadata_table.c.value)], + metadata_table.c.key == u'download source' + ) + ).scalar() + log.debug(u'download source: %s', value_count) + if value_count > 0: + session.execute(insert(metadata_table).values( + key=u'download_source', + value=select( + [metadata_table.c.value], + metadata_table.c.key == u'download source' + ).as_scalar() + )) + # Copy "download name" to "download_name" + # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) + value_count = session.execute( + select( + [func.count(metadata_table.c.value)], + metadata_table.c.key == u'download name' + ) + ).scalar() + log.debug(u'download name: %s', value_count) + if value_count > 0: + session.execute(insert(metadata_table).values( + key=u'download_name', + value=select( + [metadata_table.c.value], + metadata_table.c.key == u'download name' + ).as_scalar() + )) + # Copy "proxy server" to "proxy_server" + # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) + value_count = session.execute( + select( + [func.count(metadata_table.c.value)], + metadata_table.c.key == u'proxy server' + ) + ).scalar() + log.debug(u'proxy server: %s', value_count) + if value_count > 0: + session.execute(insert(metadata_table).values( + key=u'proxy_server', + value=select( + [metadata_table.c.value], + metadata_table.c.key == u'proxy server' + ).as_scalar() + )) + # Copy "proxy username" to "proxy_username" + # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) + value_count = session.execute( + select( + [func.count(metadata_table.c.value)], + metadata_table.c.key == u'proxy username' + ) + ).scalar() + log.debug(u'proxy username: %s', value_count) + if value_count > 0: + session.execute(insert(metadata_table).values( + key=u'proxy_username', + value=select( + [metadata_table.c.value], + metadata_table.c.key == u'proxy username' + ).as_scalar() + )) + # Copy "proxy password" to "proxy_password" + # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) + value_count = session.execute( + select( + [func.count(metadata_table.c.value)], + metadata_table.c.key == u'proxy password' + ) + ).scalar() + log.debug(u'proxy password: %s', value_count) + if value_count > 0: + session.execute(insert(metadata_table).values( + key=u'proxy_password', + value=select( + [metadata_table.c.value], + metadata_table.c.key == u'proxy password' + ).as_scalar() + )) + # TODO: Clean up in a subsequent release of OpenLP (like 2.0 final) + #session.execute(delete(metadata_table)\ + # .where(metadata_table.c.key == u'dbversion')) + session.commit() diff -Nru openlp-1.9.9/openlp/plugins/bibles/lib/versereferencelist.py openlp-1.9.10/openlp/plugins/bibles/lib/versereferencelist.py --- openlp-1.9.9/openlp/plugins/bibles/lib/versereferencelist.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/lib/versereferencelist.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/bibles/resources/osisbooks.csv openlp-1.9.10/openlp/plugins/bibles/resources/osisbooks.csv --- openlp-1.9.9/openlp/plugins/bibles/resources/osisbooks.csv 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/bibles/resources/osisbooks.csv 1970-01-01 00:00:00.000000000 +0000 @@ -1,76 +0,0 @@ -Gen,Genesis,Gen -Exod,Exodus,Exod -Lev,Leviticus,Lev -Num,Numbers,Num -Deut,Deuteronomy,Deut -Josh,Joshua,Josh -Judg,Judges,Judg -Ruth,Ruth,Ruth -1Sam,1 Samuel,1Sam -2Sam,2 Samuel,2Sam -1Kgs,1 Kings,1Kgs -2Kgs,2 Kings,2Kgs -1Chr,1 Chronicles,1Chr -2Chr,2 Chronicles,2Chr -Ezra,Ezra,Ezra -Neh,Nehemiah,Neh -Esth,Esther,Esth -Job,Job,Job -Ps,Psalms,Ps -Prov,Proverbs,Prov -Eccl,Ecclesiastes,Eccl -Song,Song of Songs,Song -Isa,Isaiah,Isa -Jer,Jeremiah,Jer -Lam,Lamentations,Lam -Ezek,Ezekiel,Ezek -Dan,Daniel,Dan -Hos,Hosea,Hos -Joel,Joel,Joel -Amos,Amos,Amos -Obad,Obad,Obad -Jonah,Jonah,Jonah -Mic,Micah,Mic -Nah,Naham,Nah -Hab,Habakkuk,Hab -Zeph,Zephaniah,Zeph -Hag,Haggai,Hag -Zech,Zechariah,Zech -Mal,Malachi,Mal -Matt,Matthew,Matt -Mark,Mark,Mark -Luke,Luke,Luke -John,John,John -Acts,Acts,Acts -Rom,Romans,Rom -1Cor,1 Corinthians,1Cor -2Cor,2 Corinthians,2Cor -Gal,Galatians,Gal -Eph,Ephesians,Eph -Phil,Philippians,Phil -Col,Colossians,Col -1Thess,1 Thessalonians,1Thess -2Thess,2 Thessalonians,2Thess -1Tim,1 Timothy,1Tim -2Tim,2 Timothy,2Tim -Titus,Titus,Titus -Phlm,Philemon,Phlm -Heb,Hebrews,Heb -Jas,James,Jas -1Pet,1 Peter,1Pet -2Pet,2 Peter,2Pet -1John,1 John,1John -2John,2 John,2John -3John,3 John,3John -Jude,Jude,Jude -Rev,Revelation,Rev -Jdt,Judith,Jdt -Wis,Wisdom,Wis -Tob,Tobit,Tob -Sir,Sirach,Sir -Bar,Baruch,Bar -1Macc,1 Maccabees,1Macc -2Macc,2 Maccabees,2Macc -AddDan,Rest of Daniel,AddDan -AddEsth,Rest of Esther,AddEsth -PrMan,Prayer of Manasses,PrMan diff -Nru openlp-1.9.9/openlp/plugins/custom/customplugin.py openlp-1.9.10/openlp/plugins/custom/customplugin.py --- openlp-1.9.9/openlp/plugins/custom/customplugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/customplugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -50,8 +51,8 @@ CustomMediaItem, CustomTab) self.weight = -5 self.manager = Manager(u'custom', init_schema) - self.icon_path = u':/plugins/plugin_custom.png' - self.icon = build_icon(self.icon_path) + self.iconPath = u':/plugins/plugin_custom.png' + self.icon = build_icon(self.iconPath) def about(self): about_text = translate('CustomPlugin', '<strong>Custom Slide Plugin' diff -Nru openlp-1.9.9/openlp/plugins/custom/forms/editcustomdialog.py openlp-1.9.10/openlp/plugins/custom/forms/editcustomdialog.py --- openlp-1.9.9/openlp/plugins/custom/forms/editcustomdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/forms/editcustomdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,11 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import build_icon, translate -from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box, \ - create_delete_push_button, create_up_down_push_button_set +from openlp.core.lib.ui import UiStrings, create_button_box, create_button class Ui_CustomEditDialog(object): def setupUi(self, customEditDialog): @@ -67,14 +67,16 @@ self.editAllButton = QtGui.QPushButton(customEditDialog) self.editAllButton.setObjectName(u'editAllButton') self.buttonLayout.addWidget(self.editAllButton) - self.deleteButton = create_delete_push_button(customEditDialog) + self.deleteButton = create_button(customEditDialog, u'deleteButton', + role=u'delete', click=customEditDialog.onDeleteButtonClicked) self.deleteButton.setEnabled(False) self.buttonLayout.addWidget(self.deleteButton) self.buttonLayout.addStretch() - self.upButton, self.downButton = create_up_down_push_button_set( - customEditDialog) - self.upButton.setEnabled(False) - self.downButton.setEnabled(False) + self.upButton = create_button(customEditDialog, u'upButton', role=u'up', + enable=False, click=customEditDialog.onUpButtonClicked) + self.downButton = create_button(customEditDialog, u'downButton', + role=u'down', enable=False, + click=customEditDialog.onDownButtonClicked) self.buttonLayout.addWidget(self.upButton) self.buttonLayout.addWidget(self.downButton) self.centralLayout.addLayout(self.buttonLayout) @@ -95,13 +97,11 @@ self.creditLabel.setBuddy(self.creditEdit) self.bottomFormLayout.addRow(self.creditLabel, self.creditEdit) self.dialogLayout.addLayout(self.bottomFormLayout) - self.buttonBox = create_accept_reject_button_box(customEditDialog) self.previewButton = QtGui.QPushButton() - self.buttonBox.addButton( - self.previewButton, QtGui.QDialogButtonBox.ActionRole) + self.buttonBox = create_button_box(customEditDialog, u'buttonBox', + [u'cancel', u'save'], [self.previewButton]) self.dialogLayout.addWidget(self.buttonBox) self.retranslateUi(customEditDialog) - QtCore.QMetaObject.connectSlotsByName(customEditDialog) def retranslateUi(self, customEditDialog): customEditDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/plugins/custom/forms/editcustomform.py openlp-1.9.10/openlp/plugins/custom/forms/editcustomform.py --- openlp-1.9.9/openlp/plugins/custom/forms/editcustomform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/forms/editcustomform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -56,20 +57,20 @@ self.editSlideForm = EditCustomSlideForm(self) # Connecting signals and slots QtCore.QObject.connect(self.previewButton, - QtCore.SIGNAL(u'pressed()'), self.onPreviewButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onPreviewButtonClicked) QtCore.QObject.connect(self.addButton, - QtCore.SIGNAL(u'pressed()'), self.onAddButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onAddButtonClicked) QtCore.QObject.connect(self.editButton, - QtCore.SIGNAL(u'pressed()'), self.onEditButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onEditButtonClicked) QtCore.QObject.connect(self.editAllButton, - QtCore.SIGNAL(u'pressed()'), self.onEditAllButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onEditAllButtonClicked) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.loadThemes) QtCore.QObject.connect(self.slideListView, QtCore.SIGNAL(u'currentRowChanged(int)'), self.onCurrentRowChanged) QtCore.QObject.connect(self.slideListView, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), - self.onEditButtonPressed) + self.onEditButtonClicked) def loadThemes(self, themelist): self.themeComboBox.clear() @@ -127,7 +128,7 @@ sxml.new_document() sxml.add_lyrics_to_song() count = 1 - for i in range(0, self.slideListView.count()): + for i in range(self.slideListView.count()): sxml.add_verse_to_lyrics(u'custom', unicode(count), unicode(self.slideListView.item(i).text())) count += 1 @@ -154,23 +155,23 @@ self.slideListView.insertItem(selectedRow + 1, qw) self.slideListView.setCurrentRow(selectedRow + 1) - def onAddButtonPressed(self): + def onAddButtonClicked(self): self.editSlideForm.setText(u'') if self.editSlideForm.exec_(): for slide in self.editSlideForm.getText(): self.slideListView.addItem(slide) - def onEditButtonPressed(self): + def onEditButtonClicked(self): self.editSlideForm.setText(self.slideListView.currentItem().text()) if self.editSlideForm.exec_(): self.updateSlideList(self.editSlideForm.getText()) - def onEditAllButtonPressed(self): + def onEditAllButtonClicked(self): """ Edits all slides. """ slide_list = u'' - for row in range(0, self.slideListView.count()): + for row in range(self.slideListView.count()): item = self.slideListView.item(row) slide_list += item.text() if row != self.slideListView.count() - 1: @@ -179,7 +180,7 @@ if self.editSlideForm.exec_(): self.updateSlideList(self.editSlideForm.getText(), True) - def onPreviewButtonPressed(self): + def onPreviewButtonClicked(self): """ Save the custom item and preview it. """ @@ -206,7 +207,7 @@ old_row = self.slideListView.currentRow() # Create a list with all (old/unedited) slides. old_slides = [self.slideListView.item(row).text() for row in \ - range(0, self.slideListView.count())] + range(self.slideListView.count())] self.slideListView.clear() old_slides.pop(old_row) # Insert all slides to make the old_slides list complete. @@ -254,7 +255,7 @@ Checks whether a custom is valid or not. """ # We must have a title. - if len(self.titleEdit.displayText()) == 0: + if not self.titleEdit.displayText(): self.titleEdit.setFocus() critical_error_message_box( message=translate('CustomPlugin.EditCustomForm', diff -Nru openlp-1.9.9/openlp/plugins/custom/forms/editcustomslidedialog.py openlp-1.9.10/openlp/plugins/custom/forms/editcustomslidedialog.py --- openlp-1.9.9/openlp/plugins/custom/forms/editcustomslidedialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/forms/editcustomslidedialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,10 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import translate, SpellTextEdit, build_icon -from openlp.core.lib.ui import create_accept_reject_button_box, UiStrings +from openlp.core.lib.ui import UiStrings, create_button, create_button_box class Ui_CustomSlideEditDialog(object): def setupUi(self, customSlideEditDialog): @@ -38,20 +39,14 @@ self.slideTextEdit = SpellTextEdit(self) self.slideTextEdit.setObjectName(u'slideTextEdit') self.dialogLayout.addWidget(self.slideTextEdit) - self.buttonBox = create_accept_reject_button_box(customSlideEditDialog) - self.splitButton = QtGui.QPushButton(customSlideEditDialog) - self.splitButton.setIcon(build_icon(u':/general/general_add.png')) - self.splitButton.setObjectName(u'splitButton') - self.buttonBox.addButton(self.splitButton, - QtGui.QDialogButtonBox.ActionRole) - self.insertButton = QtGui.QPushButton(customSlideEditDialog) - self.insertButton.setIcon(build_icon(u':/general/general_add.png')) - self.insertButton.setObjectName(u'insertButton') - self.buttonBox.addButton(self.insertButton, - QtGui.QDialogButtonBox.ActionRole) + self.splitButton = create_button(customSlideEditDialog, u'splitButton', + icon=u':/general/general_add.png') + self.insertButton = create_button(customSlideEditDialog, + u'insertButton', icon=u':/general/general_add.png') + self.buttonBox = create_button_box(customSlideEditDialog, u'buttonBox', + [u'cancel', u'save'], [self.splitButton, self.insertButton]) self.dialogLayout.addWidget(self.buttonBox) self.retranslateUi(customSlideEditDialog) - QtCore.QMetaObject.connectSlotsByName(customSlideEditDialog) def retranslateUi(self, customSlideEditDialog): self.splitButton.setText(UiStrings().Split) diff -Nru openlp-1.9.9/openlp/plugins/custom/forms/editcustomslideform.py openlp-1.9.10/openlp/plugins/custom/forms/editcustomslideform.py --- openlp-1.9.9/openlp/plugins/custom/forms/editcustomslideform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/forms/editcustomslideform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -46,9 +47,9 @@ self.setupUi(self) # Connecting signals and slots QtCore.QObject.connect(self.insertButton, - QtCore.SIGNAL(u'clicked()'), self.onInsertButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onInsertButtonClicked) QtCore.QObject.connect(self.splitButton, - QtCore.SIGNAL(u'clicked()'), self.onSplitButtonPressed) + QtCore.SIGNAL(u'clicked()'), self.onSplitButtonClicked) def setText(self, text): """ @@ -68,20 +69,29 @@ """ return self.slideTextEdit.toPlainText().split(u'\n[===]\n') - def onInsertButtonPressed(self): + def onInsertButtonClicked(self): """ Adds a slide split at the cursor. """ - if self.slideTextEdit.textCursor().columnNumber() != 0: - self.slideTextEdit.insertPlainText(u'\n') - self.slideTextEdit.insertPlainText(u'[===]\n') + self.insertSingleLineTextAtCursor(u'[===]') self.slideTextEdit.setFocus() - def onSplitButtonPressed(self): + def onSplitButtonClicked(self): """ - Adds a virtual split at cursor. + Adds an optional split at cursor. """ - if self.slideTextEdit.textCursor().columnNumber() != 0: - self.slideTextEdit.insertPlainText(u'\n') - self.slideTextEdit.insertPlainText(u'[---]') + self.insertSingleLineTextAtCursor(u'[---]') self.slideTextEdit.setFocus() + + def insertSingleLineTextAtCursor(self, text): + """ + Adds ``text`` in a single line at the cursor position. + """ + full_text = self.slideTextEdit.toPlainText() + position = self.slideTextEdit.textCursor().position() + if position and full_text[position-1] != u'\n': + text = u'\n' + text + if position == len(full_text) or full_text[position] != u'\n': + text += u'\n' + self.slideTextEdit.insertPlainText(text) + diff -Nru openlp-1.9.9/openlp/plugins/custom/forms/__init__.py openlp-1.9.10/openlp/plugins/custom/forms/__init__.py --- openlp-1.9.9/openlp/plugins/custom/forms/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/forms/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/custom/__init__.py openlp-1.9.10/openlp/plugins/custom/__init__.py --- openlp-1.9.9/openlp/plugins/custom/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/custom/lib/customtab.py openlp-1.9.10/openlp/plugins/custom/lib/customtab.py --- openlp-1.9.9/openlp/plugins/custom/lib/customtab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/lib/customtab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,6 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, translate +from openlp.core.lib.settings import Settings class CustomTab(SettingsTab): """ @@ -66,11 +68,11 @@ self.displayFooter = True def load(self): - self.displayFooter = QtCore.QSettings().value( + self.displayFooter = Settings().value( self.settingsSection + u'/display footer', QtCore.QVariant(True)).toBool() self.displayFooterCheckBox.setChecked(self.displayFooter) def save(self): - QtCore.QSettings().setValue(self.settingsSection + u'/display footer', + Settings().setValue(self.settingsSection + u'/display footer', QtCore.QVariant(self.displayFooter)) diff -Nru openlp-1.9.9/openlp/plugins/custom/lib/customxmlhandler.py openlp-1.9.10/openlp/plugins/custom/lib/customxmlhandler.py --- openlp-1.9.9/openlp/plugins/custom/lib/customxmlhandler.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/lib/customxmlhandler.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/custom/lib/db.py openlp-1.9.10/openlp/plugins/custom/lib/db.py --- openlp-1.9.9/openlp/plugins/custom/lib/db.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/lib/db.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/custom/lib/__init__.py openlp-1.9.10/openlp/plugins/custom/lib/__init__.py --- openlp-1.9.9/openlp/plugins/custom/lib/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/lib/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/custom/lib/mediaitem.py openlp-1.9.10/openlp/plugins/custom/lib/mediaitem.py --- openlp-1.9.9/openlp/plugins/custom/lib/mediaitem.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/custom/lib/mediaitem.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -34,6 +35,7 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ check_item_selected, translate from openlp.core.lib.ui import UiStrings +from openlp.core.lib.settings import Settings from openlp.plugins.custom.forms import EditCustomForm from openlp.plugins.custom.lib import CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide @@ -57,7 +59,7 @@ def __init__(self, parent, plugin, icon): self.IconPath = u'custom/custom' MediaManagerItem.__init__(self, parent, plugin, icon) - self.edit_custom_form = EditCustomForm(self, self.plugin.formparent, + self.edit_custom_form = EditCustomForm(self, self.plugin.formParent, self.plugin.manager) self.singleServiceItem = False self.quickPreviewAllowed = True @@ -75,7 +77,7 @@ QtCore.SIGNAL(u'cleared()'), self.onClearTextButtonClick) QtCore.QObject.connect(self.searchTextEdit, QtCore.SIGNAL(u'searchTypeChanged(int)'), - self.onSearchTextButtonClick) + self.onSearchTextButtonClicked) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'custom_edit'), self.onRemoteEdit) QtCore.QObject.connect(Receiver.get_receiver(), @@ -92,13 +94,14 @@ def initialise(self): self.searchTextEdit.setSearchTypes([ (CustomSearch.Titles, u':/songs/song_search_title.png', - translate('SongsPlugin.MediaItem', 'Titles')), + translate('SongsPlugin.MediaItem', 'Titles'), + translate('SongsPlugin.MediaItem', 'Search Titles...')), (CustomSearch.Themes, u':/slides/slide_theme.png', - UiStrings().Themes) + UiStrings().Themes, UiStrings().SearchThemes) ]) self.loadList(self.manager.get_all_objects( CustomSlide, order_by_ref=CustomSlide.title)) - self.searchTextEdit.setCurrentSearchType(QtCore.QSettings().value( + self.searchTextEdit.setCurrentSearchType(Settings().value( u'%s/last search type' % self.settingsSection, QtCore.QVariant(CustomSearch.Titles)).toInt()[0]) @@ -153,7 +156,7 @@ self.edit_custom_form.loadCustom(custom_id, (remote_type == u'P')) self.edit_custom_form.exec_() self.autoSelectId = -1 - self.onSearchTextButtonClick() + self.onSearchTextButtonClicked() def onEditClick(self): """ @@ -165,7 +168,7 @@ self.edit_custom_form.loadCustom(item_id, False) self.edit_custom_form.exec_() self.autoSelectId = -1 - self.onSearchTextButtonClick() + self.onSearchTextButtonClicked() def onDeleteClick(self): """ @@ -189,16 +192,13 @@ for item in self.listView.selectedIndexes()] for id in id_list: self.plugin.manager.delete_object(CustomSlide, id) - self.onSearchTextButtonClick() + self.onSearchTextButtonClicked() def onFocus(self): self.searchTextEdit.setFocus() def generateSlideData(self, service_item, item=None, xmlVersion=False, remote=False): - raw_footer = [] - slide = None - theme = None item_id = self._getIdOfItemToGenerate(item, self.remoteCustom) service_item.add_capability(ItemCapabilities.CanEdit) service_item.add_capability(ItemCapabilities.CanPreview) @@ -211,23 +211,22 @@ theme = customSlide.theme_name if theme: service_item.theme = theme - customXML = CustomXMLParser(customSlide.text) - verseList = customXML.get_verses() - raw_slides = [verse[1] for verse in verseList] + custom_xml = CustomXMLParser(customSlide.text) + verse_list = custom_xml.get_verses() + raw_slides = [verse[1] for verse in verse_list] service_item.title = title for slide in raw_slides: - service_item.add_from_text(slide[:30], slide) - if QtCore.QSettings().value(self.settingsSection + u'/display footer', + service_item.add_from_text(slide) + if Settings().value(self.settingsSection + u'/display footer', QtCore.QVariant(True)).toBool() or credit: - raw_footer.append(title + u' ' + credit) + service_item.raw_footer.append(u' '.join([title, credit])) else: - raw_footer.append(u'') - service_item.raw_footer = raw_footer + service_item.raw_footer.append(u'') return True - def onSearchTextButtonClick(self): + def onSearchTextButtonClicked(self): # Save the current search type to the configuration. - QtCore.QSettings().setValue(u'%s/last search type' % + Settings().setValue(u'%s/last search type' % self.settingsSection, QtCore.QVariant(self.searchTextEdit.currentSearchType())) # Reload the list considering the new search type. @@ -256,8 +255,8 @@ """ search_length = 2 if len(text) > search_length: - self.onSearchTextButtonClick() - elif len(text) == 0: + self.onSearchTextButtonClicked() + elif not text: self.onClearTextButtonClick() def onClearTextButtonClick(self): @@ -265,7 +264,7 @@ Clear the search text. """ self.searchTextEdit.clear() - self.onSearchTextButtonClick() + self.onSearchTextButtonClicked() def search(self, string, showError): search_results = self.manager.get_all_objects(CustomSlide, diff -Nru openlp-1.9.9/openlp/plugins/images/imageplugin.py openlp-1.9.10/openlp/plugins/images/imageplugin.py --- openlp-1.9.9/openlp/plugins/images/imageplugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/images/imageplugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -31,6 +32,7 @@ from openlp.core.lib import Plugin, StringContent, build_icon, translate, \ Receiver +from openlp.core.lib.settings import Settings from openlp.plugins.images.lib import ImageMediaItem, ImageTab log = logging.getLogger(__name__) @@ -42,8 +44,8 @@ Plugin.__init__(self, u'images', plugin_helpers, ImageMediaItem, ImageTab) self.weight = -7 - self.icon_path = u':/plugins/plugin_images.png' - self.icon = build_icon(self.icon_path) + self.iconPath = u':/plugins/plugin_images.png' + self.icon = build_icon(self.iconPath) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'image_updated'), self.image_updated) @@ -94,6 +96,6 @@ image manager to require updates. Actual update is triggered by the last part of saving the config. """ - background = QtGui.QColor(QtCore.QSettings().value(self.settingsSection + background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color', QtCore.QVariant(u'#000000'))) - self.liveController.imageManager.update_images(u'image', background) + self.liveController.imageManager.updateImages(u'image', background) diff -Nru openlp-1.9.9/openlp/plugins/images/__init__.py openlp-1.9.10/openlp/plugins/images/__init__.py --- openlp-1.9.9/openlp/plugins/images/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/images/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/images/lib/imagetab.py openlp-1.9.10/openlp/plugins/images/lib/imagetab.py --- openlp-1.9.9/openlp/plugins/images/lib/imagetab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/images/lib/imagetab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,6 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, translate, Receiver +from openlp.core.lib.settings import Settings class ImageTab(SettingsTab): """ @@ -53,6 +55,7 @@ self.formLayout.addRow(self.colorLayout) self.informationLabel = QtGui.QLabel(self.bgColorGroupBox) self.informationLabel.setObjectName(u'InformationLabel') + self.informationLabel.setWordWrap(True) self.formLayout.addRow(self.informationLabel) self.leftLayout.addWidget(self.bgColorGroupBox) self.leftLayout.addStretch() @@ -61,7 +64,7 @@ self.rightLayout.addStretch() # Signals and slots QtCore.QObject.connect(self.backgroundColorButton, - QtCore.SIGNAL(u'pressed()'), self.onbackgroundColorButtonClicked) + QtCore.SIGNAL(u'clicked()'), self.onbackgroundColorButtonClicked) def retranslateUi(self): self.bgColorGroupBox.setTitle( @@ -69,8 +72,8 @@ self.backgroundColorLabel.setText( translate('ImagesPlugin.ImageTab', 'Default Color:')) self.informationLabel.setText( - translate('ImagesPlugin.ImageTab', 'Provides border where image ' - 'is not the correct dimensions for the screen when resized.')) + translate('ImagesPlugin.ImageTab', 'Visible background for images ' + 'with aspect ratio different to screen.')) def onbackgroundColorButtonClicked(self): new_color = QtGui.QColorDialog.getColor( @@ -81,7 +84,7 @@ u'background-color: %s' % self.bg_color) def load(self): - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) self.bg_color = unicode(settings.value( u'background color', QtCore.QVariant(u'#000000')).toString()) @@ -91,7 +94,7 @@ u'background-color: %s' % self.bg_color) def save(self): - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) settings.setValue(u'background color', QtCore.QVariant(self.bg_color)) settings.endGroup() diff -Nru openlp-1.9.9/openlp/plugins/images/lib/__init__.py openlp-1.9.10/openlp/plugins/images/lib/__init__.py --- openlp-1.9.9/openlp/plugins/images/lib/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/images/lib/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/images/lib/mediaitem.py openlp-1.9.10/openlp/plugins/images/lib/mediaitem.py --- openlp-1.9.9/openlp/plugins/images/lib/mediaitem.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/images/lib/mediaitem.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -35,6 +36,7 @@ SettingsManager, translate, check_item_selected, check_directory_exists, \ Receiver, create_thumb, validate_thumb from openlp.core.lib.ui import UiStrings, critical_error_message_box +from openlp.core.lib.settings import Settings from openlp.core.utils import AppLocation, delete_file, get_images_filter log = logging.getLogger(__name__) @@ -105,26 +107,30 @@ 'You must select an image to delete.')): row_list = [item.row() for item in self.listView.selectedIndexes()] row_list.sort(reverse=True) + Receiver.send_message(u'cursor_busy') + self.plugin.formParent.displayProgressBar(len(row_list)) for row in row_list: text = self.listView.item(row) if text: delete_file(os.path.join(self.servicePath, unicode(text.text()))) self.listView.takeItem(row) + self.plugin.formParent.incrementProgressBar() SettingsManager.set_list(self.settingsSection, u'images', self.getFileList()) + self.plugin.formParent.finishedProgressBar() + Receiver.send_message(u'cursor_normal') self.listView.blockSignals(False) def loadList(self, images, initialLoad=False): if not initialLoad: - self.plugin.formparent.displayProgressBar(len(images)) + Receiver.send_message(u'cursor_busy') + self.plugin.formParent.displayProgressBar(len(images)) # Sort the themes by its filename considering language specific # characters. lower() is needed for windows! images.sort(cmp=locale.strcoll, key=lambda filename: os.path.split(unicode(filename))[1].lower()) for imageFile in images: - if not initialLoad: - self.plugin.formparent.incrementProgressBar() filename = os.path.split(unicode(imageFile))[1] thumb = os.path.join(self.servicePath, filename) if not os.path.exists(unicode(imageFile)): @@ -139,12 +145,15 @@ item_name.setToolTip(imageFile) item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(imageFile)) self.listView.addItem(item_name) + if not initialLoad: + self.plugin.formParent.incrementProgressBar() if not initialLoad: - self.plugin.formparent.finishedProgressBar() + self.plugin.formParent.finishedProgressBar() + Receiver.send_message(u'cursor_normal') def generateSlideData(self, service_item, item=None, xmlVersion=False, remote=False): - background = QtGui.QColor(QtCore.QSettings().value(self.settingsSection + background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color', QtCore.QVariant(u'#000000'))) if item: items = [item] @@ -213,7 +222,7 @@ if check_item_selected(self.listView, translate('ImagePlugin.MediaItem', 'You must select an image to replace the background with.')): - background = QtGui.QColor(QtCore.QSettings().value( + background = QtGui.QColor(Settings().value( self.settingsSection + u'/background color', QtCore.QVariant(u'#000000'))) item = self.listView.selectedIndexes()[0] diff -Nru openlp-1.9.9/openlp/plugins/__init__.py openlp-1.9.10/openlp/plugins/__init__.py --- openlp-1.9.9/openlp/plugins/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/media/__init__.py openlp-1.9.10/openlp/plugins/media/__init__.py --- openlp-1.9.9/openlp/plugins/media/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/media/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/media/lib/__init__.py openlp-1.9.10/openlp/plugins/media/lib/__init__.py --- openlp-1.9.9/openlp/plugins/media/lib/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/media/lib/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/media/lib/mediaitem.py openlp-1.9.10/openlp/plugins/media/lib/mediaitem.py --- openlp-1.9.9/openlp/plugins/media/lib/mediaitem.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/media/lib/mediaitem.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -35,7 +36,7 @@ SettingsManager, translate, check_item_selected, Receiver, MediaType, \ ServiceItem, build_html from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ - media_item_combo_box + create_horizontal_adjusting_combo_box from openlp.core.ui import Controller, Display from openlp.core.ui.media import get_media_players, set_media_players @@ -131,7 +132,7 @@ self.displayLayout.setObjectName(u'displayLayout') self.displayTypeLabel = QtGui.QLabel(self.mediaWidget) self.displayTypeLabel.setObjectName(u'displayTypeLabel') - self.displayTypeComboBox = media_item_combo_box( + self.displayTypeComboBox = create_horizontal_adjusting_combo_box( self.mediaWidget, u'displayTypeComboBox') self.displayTypeLabel.setBuddy(self.displayTypeComboBox) self.displayLayout.addRow(self.displayTypeLabel, diff -Nru openlp-1.9.9/openlp/plugins/media/lib/mediatab.py openlp-1.9.10/openlp/plugins/media/lib/mediatab.py --- openlp-1.9.9/openlp/plugins/media/lib/mediatab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/media/lib/mediatab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,7 +29,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, translate, Receiver -from openlp.core.lib.ui import UiStrings, create_up_down_push_button_set +from openlp.core.lib.ui import UiStrings, create_button +from openlp.core.lib.settings import Settings from openlp.core.ui.media import get_media_players, set_media_players class MediaQCheckBox(QtGui.QCheckBox): """ @@ -87,8 +89,10 @@ self.orderingButtonLayout = QtGui.QVBoxLayout() self.orderingButtonLayout.setObjectName(u'orderingButtonLayout') self.orderingButtonLayout.addStretch(1) - self.orderingUpButton, self.orderingDownButton = \ - create_up_down_push_button_set(self) + self.orderingUpButton = create_button(self, u'orderingUpButton', + role=u'up', click=self.onUpButtonClicked) + self.orderingDownButton = create_button(self, u'orderingDownButton', + role=u'down', click=self.onDownButtonClicked) self.orderingButtonLayout.addWidget(self.orderingUpButton) self.orderingButtonLayout.addWidget(self.orderingDownButton) self.orderingButtonLayout.addStretch(1) @@ -184,7 +188,7 @@ else: checkbox.setChecked(False) self.updatePlayerList() - self.overridePlayerCheckBox.setChecked(QtCore.QSettings().value( + self.overridePlayerCheckBox.setChecked(Settings().value( self.settingsSection + u'/override player', QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]) @@ -198,9 +202,9 @@ player_string_changed = True override_changed = True setting_key = self.settingsSection + u'/override player' - if QtCore.QSettings().value(setting_key).toInt()[0] != \ + if Settings().value(setting_key).toInt()[0] != \ self.overridePlayerCheckBox.checkState(): - QtCore.QSettings().setValue(setting_key, + Settings().setValue(setting_key, QtCore.QVariant(self.overridePlayerCheckBox.checkState())) override_changed = True if override_changed: diff -Nru openlp-1.9.9/openlp/plugins/media/mediaplugin.py openlp-1.9.10/openlp/plugins/media/mediaplugin.py --- openlp-1.9.9/openlp/plugins/media/mediaplugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/media/mediaplugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -30,6 +31,7 @@ from PyQt4 import QtCore from openlp.core.lib import Plugin, StringContent, build_icon, translate +from openlp.core.lib.settings import Settings from openlp.plugins.media.lib import MediaMediaItem, MediaTab log = logging.getLogger(__name__) @@ -41,8 +43,8 @@ Plugin.__init__(self, u'media', plugin_helpers, MediaMediaItem) self.weight = -6 - self.icon_path = u':/plugins/plugin_media.png' - self.icon = build_icon(self.icon_path) + self.iconPath = u':/plugins/plugin_media.png' + self.icon = build_icon(self.iconPath) # passed with drag and drop messages self.dnd_id = u'Media' self.audio_extensions_list = \ @@ -59,8 +61,8 @@ Create the settings Tab """ visible_name = self.getString(StringContent.VisibleName) - self.settings_tab = MediaTab(parent, self.name, visible_name[u'title'], - self.mediaController.mediaPlayers, self.icon_path) + self.settingsTab = MediaTab(parent, self.name, visible_name[u'title'], + self.mediaController.mediaPlayers, self.iconPath) def about(self): about_text = translate('MediaPlugin', '<strong>Media Plugin</strong>' @@ -126,7 +128,7 @@ we want to check if we have the old "Use Phonon" setting, and convert it to "enable Phonon" and "make it the first one in the list". """ - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) if settings.contains(u'use phonon'): log.info(u'Found old Phonon setting') @@ -142,6 +144,6 @@ self.mediaController.mediaPlayers[u'phonon'].isActive = True settings.setValue(u'players', \ QtCore.QVariant(u','.join(new_players))) - self.settings_tab.load() + self.settingsTab.load() settings.remove(u'use phonon') settings.endGroup() diff -Nru openlp-1.9.9/openlp/plugins/presentations/__init__.py openlp-1.9.10/openlp/plugins/presentations/__init__.py --- openlp-1.9.9/openlp/plugins/presentations/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/impresscontroller.py openlp-1.9.10/openlp/plugins/presentations/lib/impresscontroller.py --- openlp-1.9.9/openlp/plugins/presentations/lib/impresscontroller.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/impresscontroller.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -42,6 +43,9 @@ if os.name == u'nt': from win32com.client import Dispatch import pywintypes + # Declare an empty exception to match the exception imported from UNO + class ErrorCodeIOException(Exception): + pass else: try: import uno @@ -339,7 +343,6 @@ Returns true if a presentation is loaded """ log.debug(u'is loaded OpenOffice') - #print "is_loaded " if self.presentation is None or self.document is None: log.debug("is_loaded: no presentation or document") return False @@ -357,14 +360,9 @@ Returns true if a presentation is active and running """ log.debug(u'is active OpenOffice') - #print "is_active " if not self.is_loaded(): - #print "False " return False - #print "self.con ", self.control - if self.control is None: - return False - return True + return self.control is not None def unblank_screen(self): """ diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/__init__.py openlp-1.9.10/openlp/plugins/presentations/lib/__init__.py --- openlp-1.9.9/openlp/plugins/presentations/lib/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/mediaitem.py openlp-1.9.10/openlp/plugins/presentations/lib/mediaitem.py --- openlp-1.9.9/openlp/plugins/presentations/lib/mediaitem.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/mediaitem.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -35,7 +36,8 @@ translate, check_item_selected, Receiver, ItemCapabilities, create_thumb, \ validate_thumb from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ - media_item_combo_box + create_horizontal_adjusting_combo_box +from openlp.core.lib.settings import Settings from openlp.plugins.presentations.lib import MessageListener log = logging.getLogger(__name__) @@ -110,7 +112,7 @@ self.displayLayout.setObjectName(u'displayLayout') self.displayTypeLabel = QtGui.QLabel(self.presentationWidget) self.displayTypeLabel.setObjectName(u'displayTypeLabel') - self.displayTypeComboBox = media_item_combo_box( + self.displayTypeComboBox = create_horizontal_adjusting_combo_box( self.presentationWidget, u'displayTypeComboBox') self.displayTypeLabel.setBuddy(self.displayTypeComboBox) self.displayLayout.addRow(self.displayTypeLabel, @@ -149,7 +151,7 @@ if self.displayTypeComboBox.count() > 1: self.displayTypeComboBox.insertItem(0, self.Automatic) self.displayTypeComboBox.setCurrentIndex(0) - if QtCore.QSettings().value(self.settingsSection + u'/override app', + if Settings().value(self.settingsSection + u'/override app', QtCore.QVariant(QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: self.presentationWidget.show() else: @@ -165,14 +167,15 @@ titles = [os.path.split(file)[1] for file in currlist] Receiver.send_message(u'cursor_busy') if not initialLoad: - self.plugin.formparent.displayProgressBar(len(files)) + Receiver.send_message(u'cursor_busy') + self.plugin.formParent.displayProgressBar(len(files)) # Sort the themes by its filename considering language specific # characters. lower() is needed for windows! files.sort(cmp=locale.strcoll, key=lambda filename: os.path.split(unicode(filename))[1].lower()) for file in files: if not initialLoad: - self.plugin.formparent.incrementProgressBar() + self.plugin.formParent.incrementProgressBar() if currlist.count(file) > 0: continue filename = os.path.split(unicode(file))[1] @@ -216,7 +219,8 @@ self.listView.addItem(item_name) Receiver.send_message(u'cursor_normal') if not initialLoad: - self.plugin.formparent.finishedProgressBar() + self.plugin.formParent.finishedProgressBar() + Receiver.send_message(u'cursor_normal') def onDeleteClick(self): """ @@ -226,6 +230,8 @@ items = self.listView.selectedIndexes() row_list = [item.row() for item in items] row_list.sort(reverse=True) + Receiver.send_message(u'cursor_busy') + self.plugin.formParent.displayProgressBar(len(row_list)) for item in items: filepath = unicode(item.data( QtCore.Qt.UserRole).toString()) @@ -233,6 +239,9 @@ doc = self.controllers[cidx].add_document(filepath) doc.presentation_deleted() doc.close_presentation() + self.plugin.formParent.incrementProgressBar() + self.plugin.formParent.finishedProgressBar() + Receiver.send_message(u'cursor_normal') for row in row_list: self.listView.takeItem(row) SettingsManager.set_list(self.settingsSection, @@ -256,50 +265,49 @@ service_item.add_capability(ItemCapabilities.ProvidesOwnDisplay) service_item.add_capability(ItemCapabilities.HasDetailedTitleDisplay) shortname = service_item.shortname - if shortname: - for bitem in items: - filename = unicode(bitem.data(QtCore.Qt.UserRole).toString()) - if os.path.exists(filename): - if shortname == self.Automatic: - service_item.shortname = \ - self.findControllerByType(filename) - if not service_item.shortname: - return False - controller = self.controllers[service_item.shortname] - (path, name) = os.path.split(filename) - doc = controller.add_document(filename) - if doc.get_thumbnail_path(1, True) is None: - doc.load_presentation() - i = 1 - img = doc.get_thumbnail_path(i, True) - if img: - while img: - service_item.add_from_command(path, name, img) - i = i + 1 - img = doc.get_thumbnail_path(i, True) - doc.close_presentation() - return True - else: - # File is no longer present - if not remote: - critical_error_message_box( - translate('PresentationPlugin.MediaItem', - 'Missing Presentation'), - unicode(translate( - 'PresentationPlugin.MediaItem', - 'The Presentation %s is incomplete,' - ' please reload.')) % filename) + if not shortname: + return False + for bitem in items: + filename = unicode(bitem.data(QtCore.Qt.UserRole).toString()) + if os.path.exists(filename): + if shortname == self.Automatic: + service_item.shortname = self.findControllerByType(filename) + if not service_item.shortname: return False + controller = self.controllers[service_item.shortname] + (path, name) = os.path.split(filename) + doc = controller.add_document(filename) + if doc.get_thumbnail_path(1, True) is None: + doc.load_presentation() + i = 1 + img = doc.get_thumbnail_path(i, True) + if img: + while img: + service_item.add_from_command(path, name, img) + i = i + 1 + img = doc.get_thumbnail_path(i, True) + doc.close_presentation() + return True else: # File is no longer present + if not remote: + critical_error_message_box( + translate('PresentationPlugin.MediaItem', + 'Missing Presentation'), + unicode(translate( + 'PresentationPlugin.MediaItem', + 'The presentation %s is incomplete,' + ' please reload.')) % filename) + return False + else: + # File is no longer present + if not remote: critical_error_message_box( translate('PresentationPlugin.MediaItem', 'Missing Presentation'), unicode(translate('PresentationPlugin.MediaItem', - 'The Presentation %s no longer exists.')) % filename) - return False - else: - return False + 'The presentation %s no longer exists.')) % filename) + return False def findControllerByType(self, filename): """ diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/messagelistener.py openlp-1.9.10/openlp/plugins/presentations/lib/messagelistener.py --- openlp-1.9.9/openlp/plugins/presentations/lib/messagelistener.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/messagelistener.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/powerpointcontroller.py openlp-1.9.10/openlp/plugins/presentations/lib/powerpointcontroller.py --- openlp-1.9.9/openlp/plugins/presentations/lib/powerpointcontroller.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/powerpointcontroller.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -152,7 +153,7 @@ log.debug(u'create_thumbnails') if self.check_thumbnails(): return - for num in range(0, self.presentation.Slides.Count): + for num in range(self.presentation.Slides.Count): self.presentation.Slides(num + 1).Export(os.path.join( self.get_thumbnail_folder(), 'slide%d.png' % (num + 1)), 'png', 320, 240) diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/pptviewcontroller.py openlp-1.9.10/openlp/plugins/presentations/lib/pptviewcontroller.py --- openlp-1.9.9/openlp/plugins/presentations/lib/pptviewcontroller.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/pptviewcontroller.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/pptviewlib/ppttest.py openlp-1.9.10/openlp/plugins/presentations/lib/pptviewlib/ppttest.py --- openlp-1.9.9/openlp/plugins/presentations/lib/pptviewlib/ppttest.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/pptviewlib/ppttest.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp openlp-1.9.10/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp --- openlp-1.9.9/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.cpp 2012-06-23 16:35:18.000000000 +0000 @@ -3,10 +3,12 @@ * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * * Copyright (c) 2008-2011 Raoul Snyman * -* Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael * -* Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, * +* Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan * +* Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, * +* Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, * * Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, * -* Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund * +* Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon * +* Tibble, Dave Warnock, 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 * diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h openlp-1.9.10/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h --- openlp-1.9.9/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/pptviewlib/pptviewlib.h 2012-06-23 16:35:18.000000000 +0000 @@ -3,10 +3,12 @@ * OpenLP - Open Source Lyrics Projection * * --------------------------------------------------------------------------- * * Copyright (c) 2008-2011 Raoul Snyman * -* Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael * -* Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, * +* Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan * +* Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, * +* Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, * * Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, * -* Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund * +* Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon * +* Tibble, Dave Warnock, 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 * diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/presentationcontroller.py openlp-1.9.10/openlp/plugins/presentations/lib/presentationcontroller.py --- openlp-1.9.9/openlp/plugins/presentations/lib/presentationcontroller.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/presentationcontroller.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -33,6 +34,7 @@ from openlp.core.lib import Receiver, check_directory_exists, create_thumb, \ validate_thumb +from openlp.core.lib.settings import Settings from openlp.core.utils import AppLocation log = logging.getLogger(__name__) @@ -392,7 +394,7 @@ """ Return whether the controller is currently enabled """ - if QtCore.QSettings().value( + if Settings().value( self.settings_section + u'/' + self.name, QtCore.QVariant(QtCore.Qt.Checked)).toInt()[0] == \ QtCore.Qt.Checked: diff -Nru openlp-1.9.9/openlp/plugins/presentations/lib/presentationtab.py openlp-1.9.10/openlp/plugins/presentations/lib/presentationtab.py --- openlp-1.9.9/openlp/plugins/presentations/lib/presentationtab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/lib/presentationtab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -29,6 +30,7 @@ from openlp.core.lib import Receiver, SettingsTab, translate from openlp.core.lib.ui import UiStrings +from openlp.core.lib.settings import Settings class PresentationTab(SettingsTab): """ @@ -102,10 +104,10 @@ for key in self.controllers: controller = self.controllers[key] checkbox = self.PresenterCheckboxes[controller.name] - checkbox.setChecked(QtCore.QSettings().value( + checkbox.setChecked(Settings().value( self.settingsSection + u'/' + controller.name, QtCore.QVariant(QtCore.Qt.Checked)).toInt()[0]) - self.OverrideAppCheckBox.setChecked(QtCore.QSettings().value( + self.OverrideAppCheckBox.setChecked(Settings().value( self.settingsSection + u'/override app', QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]) @@ -123,19 +125,19 @@ if controller.is_available(): checkbox = self.PresenterCheckboxes[controller.name] setting_key = self.settingsSection + u'/' + controller.name - if QtCore.QSettings().value(setting_key) != \ + if Settings().value(setting_key) != \ checkbox.checkState(): changed = True - QtCore.QSettings().setValue(setting_key, + Settings().setValue(setting_key, QtCore.QVariant(checkbox.checkState())) if checkbox.isChecked(): controller.start_process() else: controller.kill() setting_key = self.settingsSection + u'/override app' - if QtCore.QSettings().value(setting_key) != \ + if Settings().value(setting_key) != \ self.OverrideAppCheckBox.checkState(): - QtCore.QSettings().setValue(setting_key, + Settings().setValue(setting_key, QtCore.QVariant(self.OverrideAppCheckBox.checkState())) changed = True if changed: diff -Nru openlp-1.9.9/openlp/plugins/presentations/presentationplugin.py openlp-1.9.10/openlp/plugins/presentations/presentationplugin.py --- openlp-1.9.9/openlp/plugins/presentations/presentationplugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/presentations/presentationplugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -54,16 +55,16 @@ self.controllers = {} 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) + self.iconPath = u':/plugins/plugin_presentations.png' + self.icon = build_icon(self.iconPath) def createSettingsTab(self, parent): """ Create the settings Tab """ visible_name = self.getString(StringContent.VisibleName) - self.settings_tab = PresentationTab(parent, self.name, - visible_name[u'title'], self.controllers, self.icon_path) + self.settingsTab = PresentationTab(parent, self.name, + visible_name[u'title'], self.controllers, self.iconPath) def initialise(self): """ @@ -99,7 +100,7 @@ Create the Media Manager List """ self.mediaItem = PresentationMediaItem( - self.mediadock.media_dock, self, self.icon, self.controllers) + self.mediaDock.media_dock, self, self.icon, self.controllers) def registerControllers(self, controller): """ @@ -134,10 +135,7 @@ for controller_class in controller_classes: controller = controller_class(self) self.registerControllers(controller) - if self.controllers: - return True - else: - return False + return bool(self.controllers) def about(self): """ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/openlp/plugins/remotes/html/images/ajax-loader.gif and /tmp/Ord85b14Vk/openlp-1.9.10/openlp/plugins/remotes/html/images/ajax-loader.gif differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/openlp/plugins/remotes/html/images/ajax-loader.png and /tmp/Ord85b14Vk/openlp-1.9.10/openlp/plugins/remotes/html/images/ajax-loader.png differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/openlp/plugins/remotes/html/images/favicon.ico and /tmp/Ord85b14Vk/openlp-1.9.10/openlp/plugins/remotes/html/images/favicon.ico differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/openlp/plugins/remotes/html/images/icons-18-black.png and /tmp/Ord85b14Vk/openlp-1.9.10/openlp/plugins/remotes/html/images/icons-18-black.png differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/openlp/plugins/remotes/html/images/icons-18-white.png and /tmp/Ord85b14Vk/openlp-1.9.10/openlp/plugins/remotes/html/images/icons-18-white.png differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/openlp/plugins/remotes/html/images/icons-36-black.png and /tmp/Ord85b14Vk/openlp-1.9.10/openlp/plugins/remotes/html/images/icons-36-black.png differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/openlp/plugins/remotes/html/images/icons-36-white.png and /tmp/Ord85b14Vk/openlp-1.9.10/openlp/plugins/remotes/html/images/icons-36-white.png differ diff -Nru openlp-1.9.9/openlp/plugins/remotes/html/index.html openlp-1.9.10/openlp/plugins/remotes/html/index.html --- openlp-1.9.9/openlp/plugins/remotes/html/index.html 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/html/index.html 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -31,6 +32,7 @@ <title>${app_title} + @@ -39,7 +41,7 @@ "go_live": "${go_live}", "add_to_service": "${add_to_service}", "no_results": "${no_results}", - "back": "${back}" + "home": "${home}" } @@ -58,71 +60,79 @@
-
- ${back} +
+ ${home}

${service_manager}

${refresh} -
-
- -
-
-
- ${back} +
+ ${home}

${slide_controller}

${refresh} -
-
- -
-
- ${back} + ${home}

${alerts}

+
+ +
@@ -133,9 +143,17 @@
diff -Nru openlp-1.9.9/openlp/plugins/remotes/html/jquery.js openlp-1.9.10/openlp/plugins/remotes/html/jquery.js --- openlp-1.9.9/openlp/plugins/remotes/html/jquery.js 2012-05-05 16:04:47.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/html/jquery.js 2012-06-23 16:35:18.000000000 +0000 @@ -1,5 +1,5 @@ /*! - * jQuery JavaScript Library v1.6.4 + * jQuery JavaScript Library v1.7.2 * http://jquery.com/ * * Copyright 2011, John Resig @@ -11,906 +11,932 @@ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * - * Date: Mon Sep 12 18:54:48 2011 -0400 + * Date: Wed Mar 21 12:46:34 2012 -0700 */ (function( window, undefined ) { // Use the correct document accordingly with window argument (sandbox) var document = window.document, - navigator = window.navigator, - location = window.location; + navigator = window.navigator, + location = window.location; var jQuery = (function() { // Define a local copy of jQuery var jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - return new jQuery.fn.init( selector, context, rootjQuery ); - }, - - // Map over jQuery in case of overwrite - _jQuery = window.jQuery, - - // Map over the $ in case of overwrite - _$ = window.$, - - // A central reference to the root jQuery(document) - rootjQuery, - - // A simple way to check for HTML strings or ID strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, - - // Check if a string has a non-whitespace character in it - rnotwhite = /\S/, - - // Used for trimming whitespace - trimLeft = /^\s+/, - trimRight = /\s+$/, - - // Check for digits - rdigit = /\d/, - - // Match a standalone tag - rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, - - // JSON RegExp - rvalidchars = /^[\],:{}\s]*$/, - rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, - rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, - rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, - - // Useragent RegExp - rwebkit = /(webkit)[ \/]([\w.]+)/, - ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, - rmsie = /(msie) ([\w.]+)/, - rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, - - // Matches dashed string for camelizing - rdashAlpha = /-([a-z]|[0-9])/ig, - rmsPrefix = /^-ms-/, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return ( letter + "" ).toUpperCase(); - }, - - // Keep a UserAgent string for use with jQuery.browser - userAgent = navigator.userAgent, - - // For matching the engine and version of the browser - browserMatch, - - // The deferred used on DOM ready - readyList, - - // The ready event handler - DOMContentLoaded, - - // Save a reference to some core methods - toString = Object.prototype.toString, - hasOwn = Object.prototype.hasOwnProperty, - push = Array.prototype.push, - slice = Array.prototype.slice, - trim = String.prototype.trim, - indexOf = Array.prototype.indexOf, + // The jQuery object is actually just the init constructor 'enhanced' + return new jQuery.fn.init( selector, context, rootjQuery ); + }, + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$, + + // A central reference to the root jQuery(document) + rootjQuery, + + // A simple way to check for HTML strings or ID strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, + + // Check if a string has a non-whitespace character in it + rnotwhite = /\S/, + + // Used for trimming whitespace + trimLeft = /^\s+/, + trimRight = /\s+$/, + + // Match a standalone tag + rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, + + // JSON RegExp + rvalidchars = /^[\],:{}\s]*$/, + rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, + rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, + rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g, + + // Useragent RegExp + rwebkit = /(webkit)[ \/]([\w.]+)/, + ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/, + rmsie = /(msie) ([\w.]+)/, + rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/, + + // Matches dashed string for camelizing + rdashAlpha = /-([a-z]|[0-9])/ig, + rmsPrefix = /^-ms-/, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return ( letter + "" ).toUpperCase(); + }, + + // Keep a UserAgent string for use with jQuery.browser + userAgent = navigator.userAgent, + + // For matching the engine and version of the browser + browserMatch, + + // The deferred used on DOM ready + readyList, + + // The ready event handler + DOMContentLoaded, + + // Save a reference to some core methods + toString = Object.prototype.toString, + hasOwn = Object.prototype.hasOwnProperty, + push = Array.prototype.push, + slice = Array.prototype.slice, + trim = String.prototype.trim, + indexOf = Array.prototype.indexOf, - // [[Class]] -> type pairs - class2type = {}; + // [[Class]] -> type pairs + class2type = {}; jQuery.fn = jQuery.prototype = { - constructor: jQuery, - init: function( selector, context, rootjQuery ) { - var match, elem, ret, doc; - - // Handle $(""), $(null), or $(undefined) - if ( !selector ) { - return this; - } - - // Handle $(DOMElement) - if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - } - - // The body element only exists once, optimize finding it - if ( selector === "body" && !context && document.body ) { - this.context = document; - this[0] = document.body; - this.selector = selector; - this.length = 1; - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - // Are we dealing with HTML string or an ID? - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = quickExpr.exec( selector ); - } - - // Verify a match, and that no context was specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - doc = (context ? context.ownerDocument || context : document); - - // If a single string is passed in and it's a single tag - // just do a createElement and skip the rest - ret = rsingleTag.exec( selector ); - - if ( ret ) { - if ( jQuery.isPlainObject( context ) ) { - selector = [ document.createElement( ret[1] ) ]; - jQuery.fn.attr.call( selector, context, true ); - - } else { - selector = [ doc.createElement( ret[1] ) ]; - } - - } else { - ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); - selector = (ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment).childNodes; - } - - return jQuery.merge( this, selector ); - - // HANDLE: $("#id") - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return (context || rootjQuery).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return rootjQuery.ready( selector ); - } - - if (selector.selector !== undefined) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }, - - // Start with an empty selector - selector: "", - - // The current version of jQuery being used - jquery: "1.6.4", - - // The default length of a jQuery object is 0 - length: 0, - - // The number of elements contained in the matched element set - size: function() { - return this.length; - }, - - toArray: function() { - return slice.call( this, 0 ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num == null ? - - // Return a 'clean' array - this.toArray() : - - // Return just the object - ( num < 0 ? this[ this.length + num ] : this[ num ] ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems, name, selector ) { - // Build a new jQuery matched element set - var ret = this.constructor(); - - if ( jQuery.isArray( elems ) ) { - push.apply( ret, elems ); - - } else { - jQuery.merge( ret, elems ); - } - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - ret.context = this.context; - - if ( name === "find" ) { - ret.selector = this.selector + (this.selector ? " " : "") + selector; - } else if ( name ) { - ret.selector = this.selector + "." + name + "(" + selector + ")"; - } - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - ready: function( fn ) { - // Attach the listeners - jQuery.bindReady(); - - // Add the callback - readyList.done( fn ); - - return this; - }, - - eq: function( i ) { - return i === -1 ? - this.slice( i ) : - this.slice( i, +i + 1 ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ), - "slice", slice.call(arguments).join(",") ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: [].sort, - splice: [].splice + constructor: jQuery, + init: function( selector, context, rootjQuery ) { + var match, elem, ret, doc; + + // Handle $(""), $(null), or $(undefined) + if ( !selector ) { + return this; + } + + // Handle $(DOMElement) + if ( selector.nodeType ) { + this.context = this[0] = selector; + this.length = 1; + return this; + } + + // The body element only exists once, optimize finding it + if ( selector === "body" && !context && document.body ) { + this.context = document; + this[0] = document.body; + this.selector = selector; + this.length = 1; + return this; + } + + // Handle HTML strings + if ( typeof selector === "string" ) { + // Are we dealing with HTML string or an ID? + if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = quickExpr.exec( selector ); + } + + // Verify a match, and that no context was specified for #id + if ( match && (match[1] || !context) ) { + + // HANDLE: $(html) -> $(array) + if ( match[1] ) { + context = context instanceof jQuery ? context[0] : context; + doc = ( context ? context.ownerDocument || context : document ); + + // If a single string is passed in and it's a single tag + // just do a createElement and skip the rest + ret = rsingleTag.exec( selector ); + + if ( ret ) { + if ( jQuery.isPlainObject( context ) ) { + selector = [ document.createElement( ret[1] ) ]; + jQuery.fn.attr.call( selector, context, true ); + + } else { + selector = [ doc.createElement( ret[1] ) ]; + } + + } else { + ret = jQuery.buildFragment( [ match[1] ], [ doc ] ); + selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes; + } + + return jQuery.merge( this, selector ); + + // HANDLE: $("#id") + } else { + elem = document.getElementById( match[2] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[2] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[0] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || rootjQuery ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return rootjQuery.ready( selector ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }, + + // Start with an empty selector + selector: "", + + // The current version of jQuery being used + jquery: "1.7.2", + + // The default length of a jQuery object is 0 + length: 0, + + // The number of elements contained in the matched element set + size: function() { + return this.length; + }, + + toArray: function() { + return slice.call( this, 0 ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num == null ? + + // Return a 'clean' array + this.toArray() : + + // Return just the object + ( num < 0 ? this[ this.length + num ] : this[ num ] ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems, name, selector ) { + // Build a new jQuery matched element set + var ret = this.constructor(); + + if ( jQuery.isArray( elems ) ) { + push.apply( ret, elems ); + + } else { + jQuery.merge( ret, elems ); + } + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + ret.context = this.context; + + if ( name === "find" ) { + ret.selector = this.selector + ( this.selector ? " " : "" ) + selector; + } else if ( name ) { + ret.selector = this.selector + "." + name + "(" + selector + ")"; + } + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + ready: function( fn ) { + // Attach the listeners + jQuery.bindReady(); + + // Add the callback + readyList.add( fn ); + + return this; + }, + + eq: function( i ) { + i = +i; + return i === -1 ? + this.slice( i ) : + this.slice( i, i + 1 ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ), + "slice", slice.call(arguments).join(",") ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: [].sort, + splice: [].splice }; // Give the init function the jQuery prototype for later instantiation jQuery.fn.init.prototype = jQuery.fn; jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - target = arguments[1] || {}; - // skip the boolean and the target - i = 2; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( length === i ) { - target = this; - --i; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + target = arguments[1] || {}; + // skip the boolean and the target + i = 2; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( length === i ) { + target = this; + --i; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } - // Return the modified object - return target; + // Return the modified object + return target; }; jQuery.extend({ - noConflict: function( deep ) { - if ( window.$ === jQuery ) { - window.$ = _$; - } - - if ( deep && window.jQuery === jQuery ) { - window.jQuery = _jQuery; - } - - return jQuery; - }, - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - // Either a released hold or an DOMready/load event and not yet ready - if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready, 1 ); - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger( "ready" ).unbind( "ready" ); - } - } - }, - - bindReady: function() { - if ( readyList ) { - return; - } - - readyList = jQuery._Deferred(); - - // Catch cases where $(document).ready() is called after the - // browser event has already occurred. - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - return setTimeout( jQuery.ready, 1 ); - } - - // Mozilla, Opera and webkit nightlies currently support this event - if ( document.addEventListener ) { - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", jQuery.ready, false ); - - // If IE event model is used - } else if ( document.attachEvent ) { - // ensure firing before onload, - // maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", DOMContentLoaded ); - - // A fallback to window.onload, that will always work - window.attachEvent( "onload", jQuery.ready ); - - // If IE and not a frame - // continually check to see if the document is ready - var toplevel = false; - - try { - toplevel = window.frameElement == null; - } catch(e) {} - - if ( document.documentElement.doScroll && toplevel ) { - doScrollCheck(); - } - } - }, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, - - // A crude way of determining if an object is a window - isWindow: function( obj ) { - return obj && typeof obj === "object" && "setInterval" in obj; - }, - - isNaN: function( obj ) { - return obj == null || !rdigit.test( obj ) || isNaN( obj ); - }, - - type: function( obj ) { - return obj == null ? - String( obj ) : - class2type[ toString.call(obj) ] || "object"; - }, - - isPlainObject: function( obj ) { - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 - return false; - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - - var key; - for ( key in obj ) {} - - return key === undefined || hasOwn.call( obj, key ); - }, - - isEmptyObject: function( obj ) { - for ( var name in obj ) { - return false; - } - return true; - }, - - error: function( msg ) { - throw msg; - }, - - parseJSON: function( data ) { - if ( typeof data !== "string" || !data ) { - return null; - } - - // Make sure leading/trailing whitespace is removed (IE can't handle it) - data = jQuery.trim( data ); - - // Attempt to parse using the native JSON parser first - if ( window.JSON && window.JSON.parse ) { - return window.JSON.parse( data ); - } - - // Make sure the incoming data is actual JSON - // Logic borrowed from http://json.org/json2.js - if ( rvalidchars.test( data.replace( rvalidescape, "@" ) - .replace( rvalidtokens, "]" ) - .replace( rvalidbraces, "")) ) { - - return (new Function( "return " + data ))(); - - } - jQuery.error( "Invalid JSON: " + data ); - }, - - // Cross-browser xml parsing - parseXML: function( data ) { - var xml, tmp; - try { - if ( window.DOMParser ) { // Standard - tmp = new DOMParser(); - xml = tmp.parseFromString( data , "text/xml" ); - } else { // IE - xml = new ActiveXObject( "Microsoft.XMLDOM" ); - xml.async = "false"; - xml.loadXML( data ); - } - } catch( e ) { - xml = undefined; - } - if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; - }, - - noop: function() {}, - - // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && rnotwhite.test( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); - }, - - // args is for internal usage only - each: function( object, callback, args ) { - var name, i = 0, - length = object.length, - isObj = length === undefined || jQuery.isFunction( object ); - - if ( args ) { - if ( isObj ) { - for ( name in object ) { - if ( callback.apply( object[ name ], args ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.apply( object[ i++ ], args ) === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isObj ) { - for ( name in object ) { - if ( callback.call( object[ name ], name, object[ name ] ) === false ) { - break; - } - } - } else { - for ( ; i < length; ) { - if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { - break; - } - } - } - } - - return object; - }, - - // Use native String.trim function wherever possible - trim: trim ? - function( text ) { - return text == null ? - "" : - trim.call( text ); - } : - - // Otherwise use our own trimming functionality - function( text ) { - return text == null ? - "" : - text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); - }, - - // results is for internal usage only - makeArray: function( array, results ) { - var ret = results || []; - - if ( array != null ) { - // The window, strings (and functions) also have 'length' - // The extra typeof function check is to prevent crashes - // in Safari 2 (See: #3039) - // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 - var type = jQuery.type( array ); - - if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { - push.call( ret, array ); - } else { - jQuery.merge( ret, array ); - } - } - - return ret; - }, - - inArray: function( elem, array ) { - if ( !array ) { - return -1; - } - - if ( indexOf ) { - return indexOf.call( array, elem ); - } - - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; - } - } - - return -1; - }, - - merge: function( first, second ) { - var i = first.length, - j = 0; - - if ( typeof second.length === "number" ) { - for ( var l = second.length; j < l; j++ ) { - first[ i++ ] = second[ j ]; - } - - } else { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, inv ) { - var ret = [], retVal; - inv = !!inv; - - // Go through the array, only saving the items - // that pass the validator function - for ( var i = 0, length = elems.length; i < length; i++ ) { - retVal = !!callback( elems[ i ], i ); - if ( inv !== retVal ) { - ret.push( elems[ i ] ); - } - } - - return ret; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, key, ret = [], - i = 0, - length = elems.length, - // jquery objects are treated as arrays - isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; - - // Go through the array, translating each of the items to their - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - - // Go through every key on the object, - } else { - for ( key in elems ) { - value = callback( elems[ key ], key, arg ); - - if ( value != null ) { - ret[ ret.length ] = value; - } - } - } - - // Flatten any nested arrays - return ret.concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - if ( typeof context === "string" ) { - var tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - var args = slice.call( arguments, 2 ), - proxy = function() { - return fn.apply( context, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; - - return proxy; - }, - - // Mutifunctional method to get and set values to a collection - // The value/s can optionally be executed if it's a function - access: function( elems, key, value, exec, fn, pass ) { - var length = elems.length; - - // Setting many attributes - if ( typeof key === "object" ) { - for ( var k in key ) { - jQuery.access( elems, k, key[k], exec, fn, value ); - } - return elems; - } - - // Setting one attribute - if ( value !== undefined ) { - // Optionally, function values get executed if exec is true - exec = !pass && exec && jQuery.isFunction(value); - - for ( var i = 0; i < length; i++ ) { - fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); - } - - return elems; - } - - // Getting an attribute - return length ? fn( elems[0], key ) : undefined; - }, - - now: function() { - return (new Date()).getTime(); - }, - - // Use of jQuery.browser is frowned upon. - // More details: http://docs.jquery.com/Utilities/jQuery.browser - uaMatch: function( ua ) { - ua = ua.toLowerCase(); - - var match = rwebkit.exec( ua ) || - ropera.exec( ua ) || - rmsie.exec( ua ) || - ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || - []; - - return { browser: match[1] || "", version: match[2] || "0" }; - }, - - sub: function() { - function jQuerySub( selector, context ) { - return new jQuerySub.fn.init( selector, context ); - } - jQuery.extend( true, jQuerySub, this ); - jQuerySub.superclass = this; - jQuerySub.fn = jQuerySub.prototype = this(); - jQuerySub.fn.constructor = jQuerySub; - jQuerySub.sub = this.sub; - jQuerySub.fn.init = function init( selector, context ) { - if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { - context = jQuerySub( context ); - } - - return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); - }; - jQuerySub.fn.init.prototype = jQuerySub.fn; - var rootjQuerySub = jQuerySub(document); - return jQuerySub; - }, + noConflict: function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; + }, + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + // Either a released hold or an DOMready/load event and not yet ready + if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( !document.body ) { + return setTimeout( jQuery.ready, 1 ); + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.fireWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.trigger ) { + jQuery( document ).trigger( "ready" ).off( "ready" ); + } + } + }, + + bindReady: function() { + if ( readyList ) { + return; + } + + readyList = jQuery.Callbacks( "once memory" ); + + // Catch cases where $(document).ready() is called after the + // browser event has already occurred. + if ( document.readyState === "complete" ) { + // Handle it asynchronously to allow scripts the opportunity to delay ready + return setTimeout( jQuery.ready, 1 ); + } + + // Mozilla, Opera and webkit nightlies currently support this event + if ( document.addEventListener ) { + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", jQuery.ready, false ); + + // If IE event model is used + } else if ( document.attachEvent ) { + // ensure firing before onload, + // maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", DOMContentLoaded ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", jQuery.ready ); + + // If IE and not a frame + // continually check to see if the document is ready + var toplevel = false; + + try { + toplevel = window.frameElement == null; + } catch(e) {} + + if ( document.documentElement.doScroll && toplevel ) { + doScrollCheck(); + } + } + }, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type(obj) === "array"; + }, + + isWindow: function( obj ) { + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + return !isNaN( parseFloat(obj) ) && isFinite( obj ); + }, + + type: function( obj ) { + return obj == null ? + String( obj ) : + class2type[ toString.call(obj) ] || "object"; + }, + + isPlainObject: function( obj ) { + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call(obj, "constructor") && + !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { + return false; + } + } catch ( e ) { + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + + var key; + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + isEmptyObject: function( obj ) { + for ( var name in obj ) { + return false; + } + return true; + }, + + error: function( msg ) { + throw new Error( msg ); + }, + + parseJSON: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + + // Make sure leading/trailing whitespace is removed (IE can't handle it) + data = jQuery.trim( data ); + + // Attempt to parse using the native JSON parser first + if ( window.JSON && window.JSON.parse ) { + return window.JSON.parse( data ); + } + + // Make sure the incoming data is actual JSON + // Logic borrowed from http://json.org/json2.js + if ( rvalidchars.test( data.replace( rvalidescape, "@" ) + .replace( rvalidtokens, "]" ) + .replace( rvalidbraces, "")) ) { + + return ( new Function( "return " + data ) )(); + + } + jQuery.error( "Invalid JSON: " + data ); + }, + + // Cross-browser xml parsing + parseXML: function( data ) { + if ( typeof data !== "string" || !data ) { + return null; + } + var xml, tmp; + try { + if ( window.DOMParser ) { // Standard + tmp = new DOMParser(); + xml = tmp.parseFromString( data , "text/xml" ); + } else { // IE + xml = new ActiveXObject( "Microsoft.XMLDOM" ); + xml.async = "false"; + xml.loadXML( data ); + } + } catch( e ) { + xml = undefined; + } + if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; + }, + + noop: function() {}, + + // Evaluates a script in a global context + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && rnotwhite.test( data ) ) { + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase(); + }, + + // args is for internal usage only + each: function( object, callback, args ) { + var name, i = 0, + length = object.length, + isObj = length === undefined || jQuery.isFunction( object ); + + if ( args ) { + if ( isObj ) { + for ( name in object ) { + if ( callback.apply( object[ name ], args ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.apply( object[ i++ ], args ) === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isObj ) { + for ( name in object ) { + if ( callback.call( object[ name ], name, object[ name ] ) === false ) { + break; + } + } + } else { + for ( ; i < length; ) { + if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { + break; + } + } + } + } + + return object; + }, + + // Use native String.trim function wherever possible + trim: trim ? + function( text ) { + return text == null ? + "" : + trim.call( text ); + } : + + // Otherwise use our own trimming functionality + function( text ) { + return text == null ? + "" : + text.toString().replace( trimLeft, "" ).replace( trimRight, "" ); + }, + + // results is for internal usage only + makeArray: function( array, results ) { + var ret = results || []; + + if ( array != null ) { + // The window, strings (and functions) also have 'length' + // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930 + var type = jQuery.type( array ); + + if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) { + push.call( ret, array ); + } else { + jQuery.merge( ret, array ); + } + } + + return ret; + }, + + inArray: function( elem, array, i ) { + var len; + + if ( array ) { + if ( indexOf ) { + return indexOf.call( array, elem, i ); + } + + len = array.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + // Skip accessing in sparse arrays + if ( i in array && array[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var i = first.length, + j = 0; + + if ( typeof second.length === "number" ) { + for ( var l = second.length; j < l; j++ ) { + first[ i++ ] = second[ j ]; + } + + } else { + while ( second[j] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, inv ) { + var ret = [], retVal; + inv = !!inv; + + // Go through the array, only saving the items + // that pass the validator function + for ( var i = 0, length = elems.length; i < length; i++ ) { + retVal = !!callback( elems[ i ], i ); + if ( inv !== retVal ) { + ret.push( elems[ i ] ); + } + } + + return ret; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, key, ret = [], + i = 0, + length = elems.length, + // jquery objects are treated as arrays + isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ; + + // Go through the array, translating each of the items to their + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + + // Go through every key on the object, + } else { + for ( key in elems ) { + value = callback( elems[ key ], key, arg ); + + if ( value != null ) { + ret[ ret.length ] = value; + } + } + } + + // Flatten any nested arrays + return ret.concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + if ( typeof context === "string" ) { + var tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + var args = slice.call( arguments, 2 ), + proxy = function() { + return fn.apply( context, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++; + + return proxy; + }, + + // Mutifunctional method to get and set values to a collection + // The value/s can optionally be executed if it's a function + access: function( elems, fn, key, value, chainable, emptyGet, pass ) { + var exec, + bulk = key == null, + i = 0, + length = elems.length; + + // Sets many values + if ( key && typeof key === "object" ) { + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], 1, emptyGet, value ); + } + chainable = 1; + + // Sets one value + } else if ( value !== undefined ) { + // Optionally, function values get executed if exec is true + exec = pass === undefined && jQuery.isFunction( value ); + + if ( bulk ) { + // Bulk operations only iterate when executing function values + if ( exec ) { + exec = fn; + fn = function( elem, key, value ) { + return exec.call( jQuery( elem ), value ); + }; + + // Otherwise they run against the entire set + } else { + fn.call( elems, value ); + fn = null; + } + } + + if ( fn ) { + for (; i < length; i++ ) { + fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass ); + } + } + + chainable = 1; + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[0], key ) : emptyGet; + }, + + now: function() { + return ( new Date() ).getTime(); + }, + + // Use of jQuery.browser is frowned upon. + // More details: http://docs.jquery.com/Utilities/jQuery.browser + uaMatch: function( ua ) { + ua = ua.toLowerCase(); + + var match = rwebkit.exec( ua ) || + ropera.exec( ua ) || + rmsie.exec( ua ) || + ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) || + []; + + return { browser: match[1] || "", version: match[2] || "0" }; + }, + + sub: function() { + function jQuerySub( selector, context ) { + return new jQuerySub.fn.init( selector, context ); + } + jQuery.extend( true, jQuerySub, this ); + jQuerySub.superclass = this; + jQuerySub.fn = jQuerySub.prototype = this(); + jQuerySub.fn.constructor = jQuerySub; + jQuerySub.sub = this.sub; + jQuerySub.fn.init = function init( selector, context ) { + if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) { + context = jQuerySub( context ); + } + + return jQuery.fn.init.call( this, selector, context, rootjQuerySub ); + }; + jQuerySub.fn.init.prototype = jQuerySub.fn; + var rootjQuerySub = jQuerySub(document); + return jQuerySub; + }, - browser: {} + browser: {} }); // Populate the class2type map jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); + class2type[ "[object " + name + "]" ] = name.toLowerCase(); }); browserMatch = jQuery.uaMatch( userAgent ); if ( browserMatch.browser ) { - jQuery.browser[ browserMatch.browser ] = true; - jQuery.browser.version = browserMatch.version; + jQuery.browser[ browserMatch.browser ] = true; + jQuery.browser.version = browserMatch.version; } // Deprecated, use jQuery.browser.webkit instead if ( jQuery.browser.webkit ) { - jQuery.browser.safari = true; + jQuery.browser.safari = true; } // IE doesn't match non-breaking spaces with \s if ( rnotwhite.test( "\xA0" ) ) { - trimLeft = /^[\s\xA0]+/; - trimRight = /[\s\xA0]+$/; + trimLeft = /^[\s\xA0]+/; + trimRight = /[\s\xA0]+$/; } // All jQuery objects should point back to these @@ -918,38 +944,38 @@ // Cleanup functions for the document ready method if ( document.addEventListener ) { - DOMContentLoaded = function() { - document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); - jQuery.ready(); - }; + DOMContentLoaded = function() { + document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false ); + jQuery.ready(); + }; } else if ( document.attachEvent ) { - DOMContentLoaded = function() { - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( document.readyState === "complete" ) { - document.detachEvent( "onreadystatechange", DOMContentLoaded ); - jQuery.ready(); - } - }; + DOMContentLoaded = function() { + // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). + if ( document.readyState === "complete" ) { + document.detachEvent( "onreadystatechange", DOMContentLoaded ); + jQuery.ready(); + } + }; } // The DOM ready check for Internet Explorer function doScrollCheck() { - if ( jQuery.isReady ) { - return; - } - - try { - // If IE is used, use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - document.documentElement.doScroll("left"); - } catch(e) { - setTimeout( doScrollCheck, 1 ); - return; - } + if ( jQuery.isReady ) { + return; + } + + try { + // If IE is used, use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + document.documentElement.doScroll("left"); + } catch(e) { + setTimeout( doScrollCheck, 1 ); + return; + } - // and execute any waiting functions - jQuery.ready(); + // and execute any waiting functions + jQuery.ready(); } return jQuery; @@ -957,2812 +983,2956 @@ })(); -var // Promise methods - promiseMethods = "done fail isResolved isRejected promise then always pipe".split( " " ), - // Static reference to slice - sliceDeferred = [].slice; +// String to Object flags format cache +var flagsCache = {}; + +// Convert String-formatted flags into Object-formatted ones and store in cache +function createFlags( flags ) { + var object = flagsCache[ flags ] = {}, + i, length; + flags = flags.split( /\s+/ ); + for ( i = 0, length = flags.length; i < length; i++ ) { + object[ flags[i] ] = true; + } + return object; +} + +/* + * Create a callback list using the following parameters: + * + * flags: an optional list of space-separated flags that will change how + * the callback list behaves + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible flags: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( flags ) { + + // Convert flags from String-formatted to Object-formatted + // (we check in cache first) + flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {}; + + var // Actual callback list + list = [], + // Stack of fire calls for repeatable lists + stack = [], + // Last fire value (for non-forgettable lists) + memory, + // Flag to know if list was already fired + fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, + // End of the loop when firing + firingLength, + // Index of currently firing callback (modified by remove if needed) + firingIndex, + // Add one or several callbacks to the list + add = function( args ) { + var i, + length, + elem, + type, + actual; + for ( i = 0, length = args.length; i < length; i++ ) { + elem = args[ i ]; + type = jQuery.type( elem ); + if ( type === "array" ) { + // Inspect recursively + add( elem ); + } else if ( type === "function" ) { + // Add if not in unique mode and callback is not in + if ( !flags.unique || !self.has( elem ) ) { + list.push( elem ); + } + } + } + }, + // Fire callbacks + fire = function( context, args ) { + args = args || []; + memory = !flags.memory || [ context, args ]; + fired = true; + firing = true; + firingIndex = firingStart || 0; + firingStart = 0; + firingLength = list.length; + for ( ; list && firingIndex < firingLength; firingIndex++ ) { + if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) { + memory = true; // Mark as halted + break; + } + } + firing = false; + if ( list ) { + if ( !flags.once ) { + if ( stack && stack.length ) { + memory = stack.shift(); + self.fireWith( memory[ 0 ], memory[ 1 ] ); + } + } else if ( memory === true ) { + self.disable(); + } else { + list = []; + } + } + }, + // Actual Callbacks object + self = { + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + var length = list.length; + add( arguments ); + // Do we need to add the callbacks to the + // current firing batch? + if ( firing ) { + firingLength = list.length; + // With memory, if we're not firing then + // we should call right away, unless previous + // firing was halted (stopOnFalse) + } else if ( memory && memory !== true ) { + firingStart = length; + fire( memory[ 0 ], memory[ 1 ] ); + } + } + return this; + }, + // Remove a callback from the list + remove: function() { + if ( list ) { + var args = arguments, + argIndex = 0, + argLength = args.length; + for ( ; argIndex < argLength ; argIndex++ ) { + for ( var i = 0; i < list.length; i++ ) { + if ( args[ argIndex ] === list[ i ] ) { + // Handle firingIndex and firingLength + if ( firing ) { + if ( i <= firingLength ) { + firingLength--; + if ( i <= firingIndex ) { + firingIndex--; + } + } + } + // Remove the element + list.splice( i--, 1 ); + // If we have some unicity property then + // we only need to do this once + if ( flags.unique ) { + break; + } + } + } + } + } + return this; + }, + // Control if a given callback is in the list + has: function( fn ) { + if ( list ) { + var i = 0, + length = list.length; + for ( ; i < length; i++ ) { + if ( fn === list[ i ] ) { + return true; + } + } + } + return false; + }, + // Remove all callbacks from the list + empty: function() { + list = []; + return this; + }, + // Have the list do nothing anymore + disable: function() { + list = stack = memory = undefined; + return this; + }, + // Is it disabled? + disabled: function() { + return !list; + }, + // Lock the list in its current state + lock: function() { + stack = undefined; + if ( !memory || memory === true ) { + self.disable(); + } + return this; + }, + // Is it locked? + locked: function() { + return !stack; + }, + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( stack ) { + if ( firing ) { + if ( !flags.once ) { + stack.push( [ context, args ] ); + } + } else if ( !( flags.once && memory ) ) { + fire( context, args ); + } + } + return this; + }, + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + + + +var // Static reference to slice + sliceDeferred = [].slice; jQuery.extend({ - // Create a simple deferred (one callbacks list) - _Deferred: function() { - var // callbacks list - callbacks = [], - // stored [ context , args ] - fired, - // to avoid firing when already doing so - firing, - // flag to know if the deferred has been cancelled - cancelled, - // the deferred itself - deferred = { - - // done( f1, f2, ...) - done: function() { - if ( !cancelled ) { - var args = arguments, - i, - length, - elem, - type, - _fired; - if ( fired ) { - _fired = fired; - fired = 0; - } - for ( i = 0, length = args.length; i < length; i++ ) { - elem = args[ i ]; - type = jQuery.type( elem ); - if ( type === "array" ) { - deferred.done.apply( deferred, elem ); - } else if ( type === "function" ) { - callbacks.push( elem ); - } - } - if ( _fired ) { - deferred.resolveWith( _fired[ 0 ], _fired[ 1 ] ); - } - } - return this; - }, - - // resolve with given context and args - resolveWith: function( context, args ) { - if ( !cancelled && !fired && !firing ) { - // make sure args are available (#8421) - args = args || []; - firing = 1; - try { - while( callbacks[ 0 ] ) { - callbacks.shift().apply( context, args ); - } - } - finally { - fired = [ context, args ]; - firing = 0; - } - } - return this; - }, - - // resolve with this as context and given arguments - resolve: function() { - deferred.resolveWith( this, arguments ); - return this; - }, - - // Has this deferred been resolved? - isResolved: function() { - return !!( firing || fired ); - }, - - // Cancel - cancel: function() { - cancelled = 1; - callbacks = []; - return this; - } - }; - - return deferred; - }, - - // Full fledged deferred (two callbacks list) - Deferred: function( func ) { - var deferred = jQuery._Deferred(), - failDeferred = jQuery._Deferred(), - promise; - // Add errorDeferred methods, then and promise - jQuery.extend( deferred, { - then: function( doneCallbacks, failCallbacks ) { - deferred.done( doneCallbacks ).fail( failCallbacks ); - return this; - }, - always: function() { - return deferred.done.apply( deferred, arguments ).fail.apply( this, arguments ); - }, - fail: failDeferred.done, - rejectWith: failDeferred.resolveWith, - reject: failDeferred.resolve, - isRejected: failDeferred.isResolved, - pipe: function( fnDone, fnFail ) { - return jQuery.Deferred(function( newDefer ) { - jQuery.each( { - done: [ fnDone, "resolve" ], - fail: [ fnFail, "reject" ] - }, function( handler, data ) { - var fn = data[ 0 ], - action = data[ 1 ], - returned; - if ( jQuery.isFunction( fn ) ) { - deferred[ handler ](function() { - returned = fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise().then( newDefer.resolve, newDefer.reject ); - } else { - newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); - } - }); - } else { - deferred[ handler ]( newDefer[ action ] ); - } - }); - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - if ( obj == null ) { - if ( promise ) { - return promise; - } - promise = obj = {}; - } - var i = promiseMethods.length; - while( i-- ) { - obj[ promiseMethods[i] ] = deferred[ promiseMethods[i] ]; - } - return obj; - } - }); - // Make sure only one callback list will be used - deferred.done( failDeferred.cancel ).fail( deferred.cancel ); - // Unexpose cancel - delete deferred.cancel; - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - return deferred; - }, - - // Deferred helper - when: function( firstParam ) { - var args = arguments, - i = 0, - length = args.length, - count = length, - deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? - firstParam : - jQuery.Deferred(); - function resolveFunc( i ) { - return function( value ) { - args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; - if ( !( --count ) ) { - // Strange bug in FF4: - // Values changed onto the arguments object sometimes end up as undefined values - // outside the $.when method. Cloning the object into a fresh array solves the issue - deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) ); - } - }; - } - if ( length > 1 ) { - for( ; i < length; i++ ) { - if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) { - args[ i ].promise().then( resolveFunc(i), deferred.reject ); - } else { - --count; - } - } - if ( !count ) { - deferred.resolveWith( deferred, args ); - } - } else if ( deferred !== firstParam ) { - deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); - } - return deferred.promise(); - } + + Deferred: function( func ) { + var doneList = jQuery.Callbacks( "once memory" ), + failList = jQuery.Callbacks( "once memory" ), + progressList = jQuery.Callbacks( "memory" ), + state = "pending", + lists = { + resolve: doneList, + reject: failList, + notify: progressList + }, + promise = { + done: doneList.add, + fail: failList.add, + progress: progressList.add, + + state: function() { + return state; + }, + + // Deprecated + isResolved: doneList.fired, + isRejected: failList.fired, + + then: function( doneCallbacks, failCallbacks, progressCallbacks ) { + deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks ); + return this; + }, + always: function() { + deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments ); + return this; + }, + pipe: function( fnDone, fnFail, fnProgress ) { + return jQuery.Deferred(function( newDefer ) { + jQuery.each( { + done: [ fnDone, "resolve" ], + fail: [ fnFail, "reject" ], + progress: [ fnProgress, "notify" ] + }, function( handler, data ) { + var fn = data[ 0 ], + action = data[ 1 ], + returned; + if ( jQuery.isFunction( fn ) ) { + deferred[ handler ](function() { + returned = fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify ); + } else { + newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] ); + } + }); + } else { + deferred[ handler ]( newDefer[ action ] ); + } + }); + }).promise(); + }, + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + if ( obj == null ) { + obj = promise; + } else { + for ( var key in promise ) { + obj[ key ] = promise[ key ]; + } + } + return obj; + } + }, + deferred = promise.promise({}), + key; + + for ( key in lists ) { + deferred[ key ] = lists[ key ].fire; + deferred[ key + "With" ] = lists[ key ].fireWith; + } + + // Handle state + deferred.done( function() { + state = "resolved"; + }, failList.disable, progressList.lock ).fail( function() { + state = "rejected"; + }, doneList.disable, progressList.lock ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( firstParam ) { + var args = sliceDeferred.call( arguments, 0 ), + i = 0, + length = args.length, + pValues = new Array( length ), + count = length, + pCount = length, + deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ? + firstParam : + jQuery.Deferred(), + promise = deferred.promise(); + function resolveFunc( i ) { + return function( value ) { + args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + if ( !( --count ) ) { + deferred.resolveWith( deferred, args ); + } + }; + } + function progressFunc( i ) { + return function( value ) { + pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value; + deferred.notifyWith( promise, pValues ); + }; + } + if ( length > 1 ) { + for ( ; i < length; i++ ) { + if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) { + args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) ); + } else { + --count; + } + } + if ( !count ) { + deferred.resolveWith( deferred, args ); + } + } else if ( deferred !== firstParam ) { + deferred.resolveWith( deferred, length ? [ firstParam ] : [] ); + } + return promise; + } }); + jQuery.support = (function() { - var div = document.createElement( "div" ), - documentElement = document.documentElement, - all, - a, - select, - opt, - input, - marginDiv, - support, - fragment, - body, - testElementParent, - testElement, - testElementStyle, - tds, - events, - eventName, - i, - isSupported; - - // Preliminary tests - div.setAttribute("className", "t"); - div.innerHTML = "
a"; - - - all = div.getElementsByTagName( "*" ); - a = div.getElementsByTagName( "a" )[ 0 ]; - - // Can't get basic test support - if ( !all || !all.length || !a ) { - return {}; - } - - // First batch of supports tests - select = document.createElement( "select" ); - opt = select.appendChild( document.createElement("option") ); - input = div.getElementsByTagName( "input" )[ 0 ]; - - support = { - // IE strips leading whitespace when .innerHTML is used - leadingWhitespace: ( div.firstChild.nodeType === 3 ), - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - tbody: !div.getElementsByTagName( "tbody" ).length, - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - htmlSerialize: !!div.getElementsByTagName( "link" ).length, - - // Get the style information from getAttribute - // (IE uses .cssText instead) - style: /top/.test( a.getAttribute("style") ), - - // Make sure that URLs aren't manipulated - // (IE normalizes it by default) - hrefNormalized: ( a.getAttribute( "href" ) === "/a" ), - - // Make sure that element opacity exists - // (IE uses filter instead) - // Use a regex to work around a WebKit issue. See #5145 - opacity: /^0.55$/.test( a.style.opacity ), - - // Verify style float existence - // (IE uses styleFloat instead of cssFloat) - cssFloat: !!a.style.cssFloat, - - // Make sure that if no value is specified for a checkbox - // that it defaults to "on". - // (WebKit defaults to "" instead) - checkOn: ( input.value === "on" ), - - // Make sure that a selected-by-default option has a working selected property. - // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) - optSelected: opt.selected, - - // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) - getSetAttribute: div.className !== "t", - - // Will be defined later - submitBubbles: true, - changeBubbles: true, - focusinBubbles: false, - deleteExpando: true, - noCloneEvent: true, - inlineBlockNeedsLayout: false, - shrinkWrapBlocks: false, - reliableMarginRight: true - }; - - // Make sure checked status is properly cloned - input.checked = true; - support.noCloneChecked = input.cloneNode( true ).checked; - - // Make sure that the options inside disabled selects aren't marked as disabled - // (WebKit marks them as disabled) - select.disabled = true; - support.optDisabled = !opt.disabled; - - // Test to see if it's possible to delete an expando from an element - // Fails in Internet Explorer - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - - if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { - div.attachEvent( "onclick", function() { - // Cloning a node shouldn't copy over any - // bound event handlers (IE does this) - support.noCloneEvent = false; - }); - div.cloneNode( true ).fireEvent( "onclick" ); - } - - // Check if a radio maintains it's value - // after being appended to the DOM - input = document.createElement("input"); - input.value = "t"; - input.setAttribute("type", "radio"); - support.radioValue = input.value === "t"; - - input.setAttribute("checked", "checked"); - div.appendChild( input ); - fragment = document.createDocumentFragment(); - fragment.appendChild( div.firstChild ); - - // WebKit doesn't clone checked state correctly in fragments - support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; - - div.innerHTML = ""; - - // Figure out if the W3C box model works as expected - div.style.width = div.style.paddingLeft = "1px"; - - body = document.getElementsByTagName( "body" )[ 0 ]; - // We use our own, invisible, body unless the body is already present - // in which case we use a div (#9239) - testElement = document.createElement( body ? "div" : "body" ); - testElementStyle = { - visibility: "hidden", - width: 0, - height: 0, - border: 0, - margin: 0, - background: "none" - }; - if ( body ) { - jQuery.extend( testElementStyle, { - position: "absolute", - left: "-1000px", - top: "-1000px" - }); - } - for ( i in testElementStyle ) { - testElement.style[ i ] = testElementStyle[ i ]; - } - testElement.appendChild( div ); - testElementParent = body || documentElement; - testElementParent.insertBefore( testElement, testElementParent.firstChild ); - - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - support.appendChecked = input.checked; - - support.boxModel = div.offsetWidth === 2; - - if ( "zoom" in div.style ) { - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - // (IE < 8 does this) - div.style.display = "inline"; - div.style.zoom = 1; - support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 ); - - // Check if elements with layout shrink-wrap their children - // (IE 6 does this) - div.style.display = ""; - div.innerHTML = "
"; - support.shrinkWrapBlocks = ( div.offsetWidth !== 2 ); - } - - div.innerHTML = "
t
"; - tds = div.getElementsByTagName( "td" ); - - // Check if table cells still have offsetWidth/Height when they are set - // to display:none and there are still other visible table cells in a - // table row; if so, offsetWidth/Height are not reliable for use when - // determining if an element has been hidden directly using - // display:none (it is still safe to use offsets if a parent element is - // hidden; don safety goggles and see bug #4512 for more information). - // (only IE 8 fails this test) - isSupported = ( tds[ 0 ].offsetHeight === 0 ); - - tds[ 0 ].style.display = ""; - tds[ 1 ].style.display = "none"; - - // Check if empty table cells still have offsetWidth/Height - // (IE < 8 fail this test) - support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); - div.innerHTML = ""; - - // Check if div with explicit width and no margin-right incorrectly - // gets computed margin-right based on width of container. For more - // info see bug #3333 - // Fails in WebKit before Feb 2011 nightlies - // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right - if ( document.defaultView && document.defaultView.getComputedStyle ) { - marginDiv = document.createElement( "div" ); - marginDiv.style.width = "0"; - marginDiv.style.marginRight = "0"; - div.appendChild( marginDiv ); - support.reliableMarginRight = - ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; - } - - // Remove the body element we added - testElement.innerHTML = ""; - testElementParent.removeChild( testElement ); - - // Technique from Juriy Zaytsev - // http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/ - // We only care about the case where non-standard event systems - // are used, namely in IE. Short-circuiting here helps us to - // avoid an eval call (in setAttribute) which can cause CSP - // to go haywire. See: https://developer.mozilla.org/en/Security/CSP - if ( div.attachEvent ) { - for( i in { - submit: 1, - change: 1, - focusin: 1 - } ) { - eventName = "on" + i; - isSupported = ( eventName in div ); - if ( !isSupported ) { - div.setAttribute( eventName, "return;" ); - isSupported = ( typeof div[ eventName ] === "function" ); - } - support[ i + "Bubbles" ] = isSupported; - } - } + var support, + all, + a, + select, + opt, + input, + fragment, + tds, + events, + eventName, + i, + isSupported, + div = document.createElement( "div" ), + documentElement = document.documentElement; + + // Preliminary tests + div.setAttribute("className", "t"); + div.innerHTML = "
a"; + + all = div.getElementsByTagName( "*" ); + a = div.getElementsByTagName( "a" )[ 0 ]; + + // Can't get basic test support + if ( !all || !all.length || !a ) { + return {}; + } + + // First batch of supports tests + select = document.createElement( "select" ); + opt = select.appendChild( document.createElement("option") ); + input = div.getElementsByTagName( "input" )[ 0 ]; + + support = { + // IE strips leading whitespace when .innerHTML is used + leadingWhitespace: ( div.firstChild.nodeType === 3 ), + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + tbody: !div.getElementsByTagName("tbody").length, + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + htmlSerialize: !!div.getElementsByTagName("link").length, + + // Get the style information from getAttribute + // (IE uses .cssText instead) + style: /top/.test( a.getAttribute("style") ), + + // Make sure that URLs aren't manipulated + // (IE normalizes it by default) + hrefNormalized: ( a.getAttribute("href") === "/a" ), + + // Make sure that element opacity exists + // (IE uses filter instead) + // Use a regex to work around a WebKit issue. See #5145 + opacity: /^0.55/.test( a.style.opacity ), + + // Verify style float existence + // (IE uses styleFloat instead of cssFloat) + cssFloat: !!a.style.cssFloat, + + // Make sure that if no value is specified for a checkbox + // that it defaults to "on". + // (WebKit defaults to "" instead) + checkOn: ( input.value === "on" ), + + // Make sure that a selected-by-default option has a working selected property. + // (WebKit defaults to false instead of true, IE too, if it's in an optgroup) + optSelected: opt.selected, + + // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7) + getSetAttribute: div.className !== "t", + + // Tests for enctype support on a form(#6743) + enctype: !!document.createElement("form").enctype, + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav>", + + // Will be defined later + submitBubbles: true, + changeBubbles: true, + focusinBubbles: false, + deleteExpando: true, + noCloneEvent: true, + inlineBlockNeedsLayout: false, + shrinkWrapBlocks: false, + reliableMarginRight: true, + pixelMargin: true + }; + + // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead + jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat"); + + // Make sure checked status is properly cloned + input.checked = true; + support.noCloneChecked = input.cloneNode( true ).checked; + + // Make sure that the options inside disabled selects aren't marked as disabled + // (WebKit marks them as disabled) + select.disabled = true; + support.optDisabled = !opt.disabled; + + // Test to see if it's possible to delete an expando from an element + // Fails in Internet Explorer + try { + delete div.test; + } catch( e ) { + support.deleteExpando = false; + } + + if ( !div.addEventListener && div.attachEvent && div.fireEvent ) { + div.attachEvent( "onclick", function() { + // Cloning a node shouldn't copy over any + // bound event handlers (IE does this) + support.noCloneEvent = false; + }); + div.cloneNode( true ).fireEvent( "onclick" ); + } + + // Check if a radio maintains its value + // after being appended to the DOM + input = document.createElement("input"); + input.value = "t"; + input.setAttribute("type", "radio"); + support.radioValue = input.value === "t"; + + input.setAttribute("checked", "checked"); + + // #11217 - WebKit loses check when the name is after the checked attribute + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + fragment = document.createDocumentFragment(); + fragment.appendChild( div.lastChild ); + + // WebKit doesn't clone checked state correctly in fragments + support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + support.appendChecked = input.checked; + + fragment.removeChild( input ); + fragment.appendChild( div ); + + // Technique from Juriy Zaytsev + // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/ + // We only care about the case where non-standard event systems + // are used, namely in IE. Short-circuiting here helps us to + // avoid an eval call (in setAttribute) which can cause CSP + // to go haywire. See: https://developer.mozilla.org/en/Security/CSP + if ( div.attachEvent ) { + for ( i in { + submit: 1, + change: 1, + focusin: 1 + }) { + eventName = "on" + i; + isSupported = ( eventName in div ); + if ( !isSupported ) { + div.setAttribute( eventName, "return;" ); + isSupported = ( typeof div[ eventName ] === "function" ); + } + support[ i + "Bubbles" ] = isSupported; + } + } + + fragment.removeChild( div ); + + // Null elements to avoid leaks in IE + fragment = select = opt = div = input = null; + + // Run tests that need a body at doc ready + jQuery(function() { + var container, outer, inner, table, td, offsetSupport, + marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight, + paddingMarginBorderVisibility, paddingMarginBorder, + body = document.getElementsByTagName("body")[0]; + + if ( !body ) { + // Return for frameset docs that don't have a body + return; + } + + conMarginTop = 1; + paddingMarginBorder = "padding:0;margin:0;border:"; + positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;"; + paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;"; + style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;"; + html = "
" + + "" + + "
"; + + container = document.createElement("div"); + container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px"; + body.insertBefore( container, body.firstChild ); + + // Construct the test element + div = document.createElement("div"); + container.appendChild( div ); + + // Check if table cells still have offsetWidth/Height when they are set + // to display:none and there are still other visible table cells in a + // table row; if so, offsetWidth/Height are not reliable for use when + // determining if an element has been hidden directly using + // display:none (it is still safe to use offsets if a parent element is + // hidden; don safety goggles and see bug #4512 for more information). + // (only IE 8 fails this test) + div.innerHTML = "
t
"; + tds = div.getElementsByTagName( "td" ); + isSupported = ( tds[ 0 ].offsetHeight === 0 ); + + tds[ 0 ].style.display = ""; + tds[ 1 ].style.display = "none"; + + // Check if empty table cells still have offsetWidth/Height + // (IE <= 8 fail this test) + support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 ); + + // Check if div with explicit width and no margin-right incorrectly + // gets computed margin-right based on width of container. For more + // info see bug #3333 + // Fails in WebKit before Feb 2011 nightlies + // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right + if ( window.getComputedStyle ) { + div.innerHTML = ""; + marginDiv = document.createElement( "div" ); + marginDiv.style.width = "0"; + marginDiv.style.marginRight = "0"; + div.style.width = "2px"; + div.appendChild( marginDiv ); + support.reliableMarginRight = + ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0; + } + + if ( typeof div.style.zoom !== "undefined" ) { + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + // (IE < 8 does this) + div.innerHTML = ""; + div.style.width = div.style.padding = "1px"; + div.style.border = 0; + div.style.overflow = "hidden"; + div.style.display = "inline"; + div.style.zoom = 1; + support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 ); + + // Check if elements with layout shrink-wrap their children + // (IE 6 does this) + div.style.display = "block"; + div.style.overflow = "visible"; + div.innerHTML = "
"; + support.shrinkWrapBlocks = ( div.offsetWidth !== 3 ); + } + + div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility; + div.innerHTML = html; + + outer = div.firstChild; + inner = outer.firstChild; + td = outer.nextSibling.firstChild.firstChild; + + offsetSupport = { + doesNotAddBorder: ( inner.offsetTop !== 5 ), + doesAddBorderForTableAndCells: ( td.offsetTop === 5 ) + }; + + inner.style.position = "fixed"; + inner.style.top = "20px"; + + // safari subtracts parent border width here which is 5px + offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 ); + inner.style.position = inner.style.top = ""; + + outer.style.overflow = "hidden"; + outer.style.position = "relative"; + + offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 ); + offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop ); + + if ( window.getComputedStyle ) { + div.style.marginTop = "1%"; + support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%"; + } + + if ( typeof container.style.zoom !== "undefined" ) { + container.style.zoom = 1; + } - // Null connected elements to avoid leaks in IE - testElement = fragment = select = opt = body = marginDiv = div = input = null; + body.removeChild( container ); + marginDiv = div = container = null; - return support; -})(); + jQuery.extend( support, offsetSupport ); + }); -// Keep track of boxModel -jQuery.boxModel = jQuery.support.boxModel; + return support; +})(); var rbrace = /^(?:\{.*\}|\[.*\])$/, - rmultiDash = /([A-Z])/g; + rmultiDash = /([A-Z])/g; jQuery.extend({ - cache: {}, + cache: {}, - // Please use with caution - uuid: 0, + // Please use with caution + uuid: 0, - // Unique for each copy of jQuery on the page - // Non-digits removed to match rinlinejQuery - expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), - - // The following elements throw uncatchable exceptions if you - // attempt to add expando properties to them. - noData: { - "embed": true, - // Ban all objects except for Flash (which handle expandos) - "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", - "applet": true - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, ret, - internalKey = jQuery.expando, - getByName = typeof name === "string", - - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, - - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, - - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando; - - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || (pvt && id && (cache[ id ] && !cache[ id ][ internalKey ]))) && getByName && data === undefined ) { - return; - } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - elem[ jQuery.expando ] = id = ++jQuery.uuid; - } else { - id = jQuery.expando; - } - } - - if ( !cache[ id ] ) { - cache[ id ] = {}; - - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ][ internalKey ] = jQuery.extend(cache[ id ][ internalKey ], name); - } else { - cache[ id ] = jQuery.extend(cache[ id ], name); - } - } - - thisCache = cache[ id ]; - - // Internal jQuery data is stored in a separate object inside the object's data - // cache in order to avoid key collisions between internal data and user-defined - // data - if ( pvt ) { - if ( !thisCache[ internalKey ] ) { - thisCache[ internalKey ] = {}; - } - - thisCache = thisCache[ internalKey ]; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // TODO: This is a hack for 1.5 ONLY. It will be removed in 1.6. Users should - // not attempt to inspect the internal events object using jQuery.data, as this - // internal data object is undocumented and subject to change. - if ( name === "events" && !thisCache[name] ) { - return thisCache[ internalKey ] && thisCache[ internalKey ].events; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( getByName ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; - }, - - removeData: function( elem, name, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, - - // Reference to internal data cache key - internalKey = jQuery.expando, - - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - - // See jQuery.data for more information - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ][ internalKey ] : cache[ id ]; - - if ( thisCache ) { - - // Support interoperable removal of hyphenated or camelcased keys - if ( !thisCache[ name ] ) { - name = jQuery.camelCase( name ); - } - - delete thisCache[ name ]; - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( !isEmptyDataObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( pvt ) { - delete cache[ id ][ internalKey ]; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject(cache[ id ]) ) { - return; - } - } - - var internalCache = cache[ id ][ internalKey ]; - - // Browsers that fail expando deletion also refuse to delete expandos on - // the window, but it will allow it on all other JS objects; other browsers - // don't care - // Ensure that `cache` is not a window object #10080 - if ( jQuery.support.deleteExpando || !cache.setInterval ) { - delete cache[ id ]; - } else { - cache[ id ] = null; - } - - // We destroyed the entire user cache at once because it's faster than - // iterating through each key, but we need to continue to persist internal - // data if it existed - if ( internalCache ) { - cache[ id ] = {}; - // TODO: This is a hack for 1.5 ONLY. Avoids exposing jQuery - // metadata on plain JS objects when the object is serialized using - // JSON.stringify - if ( !isNode ) { - cache[ id ].toJSON = jQuery.noop; - } - - cache[ id ][ internalKey ] = internalCache; - - // Otherwise, we need to eliminate the expando on the node to avoid - // false lookups in the cache for entries that no longer exist - } else if ( isNode ) { - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( jQuery.support.deleteExpando ) { - delete elem[ jQuery.expando ]; - } else if ( elem.removeAttribute ) { - elem.removeAttribute( jQuery.expando ); - } else { - elem[ jQuery.expando ] = null; - } - } - }, - - // For internal use only. - _data: function( elem, name, data ) { - return jQuery.data( elem, name, data, true ); - }, - - // A method for determining if a DOM node can handle the data expando - acceptData: function( elem ) { - if ( elem.nodeName ) { - var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; - - if ( match ) { - return !(match === true || elem.getAttribute("classid") !== match); - } - } + // Unique for each copy of jQuery on the page + // Non-digits removed to match rinlinejQuery + expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ), + + // The following elements throw uncatchable exceptions if you + // attempt to add expando properties to them. + noData: { + "embed": true, + // Ban all objects except for Flash (which handle expandos) + "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", + "applet": true + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var privateCache, thisCache, ret, + internalKey = jQuery.expando, + getByName = typeof name === "string", + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey, + isEvents = name === "events"; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) { + return; + } + + if ( !id ) { + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + elem[ internalKey ] = id = ++jQuery.uuid; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + cache[ id ] = {}; + + // Avoids exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + if ( !isNode ) { + cache[ id ].toJSON = jQuery.noop; + } + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + privateCache = thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Users should not attempt to inspect the internal events object using jQuery.data, + // it is undocumented and subject to change. But does anyone listen? No. + if ( isEvents && !thisCache[ name ] ) { + return privateCache.events; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( getByName ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; + }, + + removeData: function( elem, name, pvt /* Internal Use Only */ ) { + if ( !jQuery.acceptData( elem ) ) { + return; + } + + var thisCache, i, l, + + // Reference to internal data cache key + internalKey = jQuery.expando, + + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + + // See jQuery.data for more information + id = isNode ? elem[ internalKey ] : internalKey; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } + + for ( i = 0, l = name.length; i < l; i++ ) { + delete thisCache[ name[i] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject(cache[ id ]) ) { + return; + } + } + + // Browsers that fail expando deletion also refuse to delete expandos on + // the window, but it will allow it on all other JS objects; other browsers + // don't care + // Ensure that `cache` is not a window object #10080 + if ( jQuery.support.deleteExpando || !cache.setInterval ) { + delete cache[ id ]; + } else { + cache[ id ] = null; + } + + // We destroyed the cache and need to eliminate the expando on the node to avoid + // false lookups in the cache for entries that no longer exist + if ( isNode ) { + // IE does not allow us to delete expando properties from nodes, + // nor does it have a removeAttribute function on Document nodes; + // we must handle all of these cases + if ( jQuery.support.deleteExpando ) { + delete elem[ internalKey ]; + } else if ( elem.removeAttribute ) { + elem.removeAttribute( internalKey ); + } else { + elem[ internalKey ] = null; + } + } + }, + + // For internal use only. + _data: function( elem, name, data ) { + return jQuery.data( elem, name, data, true ); + }, + + // A method for determining if a DOM node can handle the data expando + acceptData: function( elem ) { + if ( elem.nodeName ) { + var match = jQuery.noData[ elem.nodeName.toLowerCase() ]; + + if ( match ) { + return !(match === true || elem.getAttribute("classid") !== match); + } + } - return true; - } + return true; + } }); jQuery.fn.extend({ - data: function( key, value ) { - var data = null; - - if ( typeof key === "undefined" ) { - if ( this.length ) { - data = jQuery.data( this[0] ); - - if ( this[0].nodeType === 1 ) { - var attr = this[0].attributes, name; - for ( var i = 0, l = attr.length; i < l; i++ ) { - name = attr[i].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.substring(5) ); - - dataAttr( this[0], name, data[ name ] ); - } - } - } - } - - return data; - - } else if ( typeof key === "object" ) { - return this.each(function() { - jQuery.data( this, key ); - }); - } - - var parts = key.split("."); - parts[1] = parts[1] ? "." + parts[1] : ""; - - if ( value === undefined ) { - data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); - - // Try to fetch any internally stored data first - if ( data === undefined && this.length ) { - data = jQuery.data( this[0], key ); - data = dataAttr( this[0], key, data ); - } - - return data === undefined && parts[1] ? - this.data( parts[0] ) : - data; - - } else { - return this.each(function() { - var $this = jQuery( this ), - args = [ parts[0], value ]; - - $this.triggerHandler( "setData" + parts[1] + "!", args ); - jQuery.data( this, key, value ); - $this.triggerHandler( "changeData" + parts[1] + "!", args ); - }); - } - }, - - removeData: function( key ) { - return this.each(function() { - jQuery.removeData( this, key ); - }); - } + data: function( key, value ) { + var parts, part, attr, name, l, + elem = this[0], + i = 0, + data = null; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + attr = elem.attributes; + for ( l = attr.length; i < l; i++ ) { + name = attr[i].name; + + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.substring(5) ); + + dataAttr( elem, name, data[ name ] ); + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each(function() { + jQuery.data( this, key ); + }); + } + + parts = key.split( ".", 2 ); + parts[1] = parts[1] ? "." + parts[1] : ""; + part = parts[1] + "!"; + + return jQuery.access( this, function( value ) { + + if ( value === undefined ) { + data = this.triggerHandler( "getData" + part, [ parts[0] ] ); + + // Try to fetch any internally stored data first + if ( data === undefined && elem ) { + data = jQuery.data( elem, key ); + data = dataAttr( elem, key, data ); + } + + return data === undefined && parts[1] ? + this.data( parts[0] ) : + data; + } + + parts[1] = value; + this.each(function() { + var self = jQuery( this ); + + self.triggerHandler( "setData" + part, parts ); + jQuery.data( this, key, value ); + self.triggerHandler( "changeData" + part, parts ); + }); + }, null, value, arguments.length > 1, null, false ); + }, + + removeData: function( key ) { + return this.each(function() { + jQuery.removeData( this, key ); + }); + } }); function dataAttr( elem, key, data ) { - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - !jQuery.isNaN( data ) ? parseFloat( data ) : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - - } else { - data = undefined; - } - } - - return data; -} - -// TODO: This is a hack for 1.5 ONLY to allow objects with a single toJSON -// property to be considered empty objects; this property always exists in -// order to make sure JSON.stringify does not expose internal metadata + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + jQuery.isNumeric( data ) ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness function isEmptyDataObject( obj ) { - for ( var name in obj ) { - if ( name !== "toJSON" ) { - return false; - } - } + for ( var name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } - return true; + return true; } function handleQueueMarkDefer( elem, type, src ) { - var deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - defer = jQuery.data( elem, deferDataKey, undefined, true ); - if ( defer && - ( src === "queue" || !jQuery.data( elem, queueDataKey, undefined, true ) ) && - ( src === "mark" || !jQuery.data( elem, markDataKey, undefined, true ) ) ) { - // Give room for hard-coded callbacks to fire first - // and eventually mark/queue something else on the element - setTimeout( function() { - if ( !jQuery.data( elem, queueDataKey, undefined, true ) && - !jQuery.data( elem, markDataKey, undefined, true ) ) { - jQuery.removeData( elem, deferDataKey, true ); - defer.resolve(); - } - }, 0 ); - } + var deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + defer = jQuery._data( elem, deferDataKey ); + if ( defer && + ( src === "queue" || !jQuery._data(elem, queueDataKey) ) && + ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) { + // Give room for hard-coded callbacks to fire first + // and eventually mark/queue something else on the element + setTimeout( function() { + if ( !jQuery._data( elem, queueDataKey ) && + !jQuery._data( elem, markDataKey ) ) { + jQuery.removeData( elem, deferDataKey, true ); + defer.fire(); + } + }, 0 ); + } } jQuery.extend({ - _mark: function( elem, type ) { - if ( elem ) { - type = (type || "fx") + "mark"; - jQuery.data( elem, type, (jQuery.data(elem,type,undefined,true) || 0) + 1, true ); - } - }, - - _unmark: function( force, elem, type ) { - if ( force !== true ) { - type = elem; - elem = force; - force = false; - } - if ( elem ) { - type = type || "fx"; - var key = type + "mark", - count = force ? 0 : ( (jQuery.data( elem, key, undefined, true) || 1 ) - 1 ); - if ( count ) { - jQuery.data( elem, key, count, true ); - } else { - jQuery.removeData( elem, key, true ); - handleQueueMarkDefer( elem, type, "mark" ); - } - } - }, - - queue: function( elem, type, data ) { - if ( elem ) { - type = (type || "fx") + "queue"; - var q = jQuery.data( elem, type, undefined, true ); - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !q || jQuery.isArray(data) ) { - q = jQuery.data( elem, type, jQuery.makeArray(data), true ); - } else { - q.push( data ); - } - } - return q || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - fn = queue.shift(), - defer; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - } - - if ( fn ) { - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift("inprogress"); - } - - fn.call(elem, function() { - jQuery.dequeue(elem, type); - }); - } - - if ( !queue.length ) { - jQuery.removeData( elem, type + "queue", true ); - handleQueueMarkDefer( elem, type, "queue" ); - } - } + _mark: function( elem, type ) { + if ( elem ) { + type = ( type || "fx" ) + "mark"; + jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 ); + } + }, + + _unmark: function( force, elem, type ) { + if ( force !== true ) { + type = elem; + elem = force; + force = false; + } + if ( elem ) { + type = type || "fx"; + var key = type + "mark", + count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 ); + if ( count ) { + jQuery._data( elem, key, count ); + } else { + jQuery.removeData( elem, key, true ); + handleQueueMarkDefer( elem, type, "mark" ); + } + } + }, + + queue: function( elem, type, data ) { + var q; + if ( elem ) { + type = ( type || "fx" ) + "queue"; + q = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !q || jQuery.isArray(data) ) { + q = jQuery._data( elem, type, jQuery.makeArray(data) ); + } else { + q.push( data ); + } + } + return q || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + fn = queue.shift(), + hooks = {}; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + } + + if ( fn ) { + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + jQuery._data( elem, type + ".run", hooks ); + fn.call( elem, function() { + jQuery.dequeue( elem, type ); + }, hooks ); + } + + if ( !queue.length ) { + jQuery.removeData( elem, type + "queue " + type + ".run", true ); + handleQueueMarkDefer( elem, type, "queue" ); + } + } }); jQuery.fn.extend({ - queue: function( type, data ) { - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - } - - if ( data === undefined ) { - return jQuery.queue( this[0], type ); - } - return this.each(function() { - var queue = jQuery.queue( this, type, data ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - // Based off of the plugin by Clint Helfers, with permission. - // http://blindsignals.com/index.php/2009/07/jquery-delay/ - delay: function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[time] || time : time; - type = type || "fx"; - - return this.queue( type, function() { - var elem = this; - setTimeout(function() { - jQuery.dequeue( elem, type ); - }, time ); - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, object ) { - if ( typeof type !== "string" ) { - object = type; - type = undefined; - } - type = type || "fx"; - var defer = jQuery.Deferred(), - elements = this, - i = elements.length, - count = 1, - deferDataKey = type + "defer", - queueDataKey = type + "queue", - markDataKey = type + "mark", - tmp; - function resolve() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - } - while( i-- ) { - if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || - ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || - jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && - jQuery.data( elements[ i ], deferDataKey, jQuery._Deferred(), true ) )) { - count++; - tmp.done( resolve ); - } - } - resolve(); - return defer.promise(); - } + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[0], type ); + } + + return data === undefined ? + this : + this.each(function() { + var queue = jQuery.queue( this, type, data ); + + if ( type === "fx" && queue[0] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + }); + }, + dequeue: function( type ) { + return this.each(function() { + jQuery.dequeue( this, type ); + }); + }, + // Based off of the plugin by Clint Helfers, with permission. + // http://blindsignals.com/index.php/2009/07/jquery-delay/ + delay: function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = setTimeout( next, time ); + hooks.stop = function() { + clearTimeout( timeout ); + }; + }); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, object ) { + if ( typeof type !== "string" ) { + object = type; + type = undefined; + } + type = type || "fx"; + var defer = jQuery.Deferred(), + elements = this, + i = elements.length, + count = 1, + deferDataKey = type + "defer", + queueDataKey = type + "queue", + markDataKey = type + "mark", + tmp; + function resolve() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + } + while( i-- ) { + if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) || + ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) || + jQuery.data( elements[ i ], markDataKey, undefined, true ) ) && + jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) { + count++; + tmp.add( resolve ); + } + } + resolve(); + return defer.promise( object ); + } }); var rclass = /[\n\t\r]/g, - rspace = /\s+/, - rreturn = /\r/g, - rtype = /^(?:button|input)$/i, - rfocusable = /^(?:button|input|object|select|textarea)$/i, - rclickable = /^a(?:rea)?$/i, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - nodeHook, boolHook; + rspace = /\s+/, + rreturn = /\r/g, + rtype = /^(?:button|input)$/i, + rfocusable = /^(?:button|input|object|select|textarea)$/i, + rclickable = /^a(?:rea)?$/i, + rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, + getSetAttribute = jQuery.support.getSetAttribute, + nodeHook, boolHook, fixSpecified; jQuery.fn.extend({ - attr: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.attr ); - }, - - removeAttr: function( name ) { - return this.each(function() { - jQuery.removeAttr( this, name ); - }); - }, - - prop: function( name, value ) { - return jQuery.access( this, name, value, true, jQuery.prop ); - }, - - removeProp: function( name ) { - name = jQuery.propFix[ name ] || name; - return this.each(function() { - // try/catch handles cases where IE balks (such as removing a property on window) - try { - this[ name ] = undefined; - delete this[ name ]; - } catch( e ) {} - }); - }, - - addClass: function( value ) { - var classNames, i, l, elem, - setClass, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).addClass( value.call(this, j, this.className) ); - }); - } - - if ( value && typeof value === "string" ) { - classNames = value.split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 ) { - if ( !elem.className && classNames.length === 1 ) { - elem.className = value; - - } else { - setClass = " " + elem.className + " "; - - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { - setClass += classNames[ c ] + " "; - } - } - elem.className = jQuery.trim( setClass ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classNames, i, l, elem, className, c, cl; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( j ) { - jQuery( this ).removeClass( value.call(this, j, this.className) ); - }); - } - - if ( (value && typeof value === "string") || value === undefined ) { - classNames = (value || "").split( rspace ); - - for ( i = 0, l = this.length; i < l; i++ ) { - elem = this[ i ]; - - if ( elem.nodeType === 1 && elem.className ) { - if ( value ) { - className = (" " + elem.className + " ").replace( rclass, " " ); - for ( c = 0, cl = classNames.length; c < cl; c++ ) { - className = className.replace(" " + classNames[ c ] + " ", " "); - } - elem.className = jQuery.trim( className ); - - } else { - elem.className = ""; - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isBool = typeof stateVal === "boolean"; - - if ( jQuery.isFunction( value ) ) { - return this.each(function( i ) { - jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); - }); - } - - return this.each(function() { - if ( type === "string" ) { - // toggle individual class names - var className, - i = 0, - self = jQuery( this ), - state = stateVal, - classNames = value.split( rspace ); - - while ( (className = classNames[ i++ ]) ) { - // check each className given, space seperated list - state = isBool ? state : !self.hasClass( className ); - self[ state ? "addClass" : "removeClass" ]( className ); - } - - } else if ( type === "undefined" || type === "boolean" ) { - if ( this.className ) { - // store className if set - jQuery._data( this, "__className__", this.className ); - } - - // toggle whole className - this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; - } - }); - }, - - hasClass: function( selector ) { - var className = " " + selector + " "; - for ( var i = 0, l = this.length; i < l; i++ ) { - if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { - return true; - } - } - - return false; - }, - - val: function( value ) { - var hooks, ret, - elem = this[0]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ]; - - if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { - return ret; - } - - ret = elem.value; - - return typeof ret === "string" ? - // handle most common string cases - ret.replace(rreturn, "") : - // handle cases where value is null/undef or number - ret == null ? "" : ret; - } - - return undefined; - } - - var isFunction = jQuery.isFunction( value ); - - return this.each(function( i ) { - var self = jQuery(this), val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, self.val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - } else if ( typeof val === "number" ) { - val += ""; - } else if ( jQuery.isArray( val ) ) { - val = jQuery.map(val, function ( value ) { - return value == null ? "" : value + ""; - }); - } - - hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - }); - } + attr: function( name, value ) { + return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each(function() { + jQuery.removeAttr( this, name ); + }); + }, + + prop: function( name, value ) { + return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + name = jQuery.propFix[ name ] || name; + return this.each(function() { + // try/catch handles cases where IE balks (such as removing a property on window) + try { + this[ name ] = undefined; + delete this[ name ]; + } catch( e ) {} + }); + }, + + addClass: function( value ) { + var classNames, i, l, elem, + setClass, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).addClass( value.call(this, j, this.className) ); + }); + } + + if ( value && typeof value === "string" ) { + classNames = value.split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 ) { + if ( !elem.className && classNames.length === 1 ) { + elem.className = value; + + } else { + setClass = " " + elem.className + " "; + + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) { + setClass += classNames[ c ] + " "; + } + } + elem.className = jQuery.trim( setClass ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classNames, i, l, elem, className, c, cl; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( j ) { + jQuery( this ).removeClass( value.call(this, j, this.className) ); + }); + } + + if ( (value && typeof value === "string") || value === undefined ) { + classNames = ( value || "" ).split( rspace ); + + for ( i = 0, l = this.length; i < l; i++ ) { + elem = this[ i ]; + + if ( elem.nodeType === 1 && elem.className ) { + if ( value ) { + className = (" " + elem.className + " ").replace( rclass, " " ); + for ( c = 0, cl = classNames.length; c < cl; c++ ) { + className = className.replace(" " + classNames[ c ] + " ", " "); + } + elem.className = jQuery.trim( className ); + + } else { + elem.className = ""; + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value, + isBool = typeof stateVal === "boolean"; + + if ( jQuery.isFunction( value ) ) { + return this.each(function( i ) { + jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal ); + }); + } + + return this.each(function() { + if ( type === "string" ) { + // toggle individual class names + var className, + i = 0, + self = jQuery( this ), + state = stateVal, + classNames = value.split( rspace ); + + while ( (className = classNames[ i++ ]) ) { + // check each className given, space seperated list + state = isBool ? state : !self.hasClass( className ); + self[ state ? "addClass" : "removeClass" ]( className ); + } + + } else if ( type === "undefined" || type === "boolean" ) { + if ( this.className ) { + // store className if set + jQuery._data( this, "__className__", this.className ); + } + + // toggle whole className + this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || ""; + } + }); + }, + + hasClass: function( selector ) { + var className = " " + selector + " ", + i = 0, + l = this.length; + for ( ; i < l; i++ ) { + if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) { + return true; + } + } + + return false; + }, + + val: function( value ) { + var hooks, ret, isFunction, + elem = this[0]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) { + return ret; + } + + ret = elem.value; + + return typeof ret === "string" ? + // handle most common string cases + ret.replace(rreturn, "") : + // handle cases where value is null/undef or number + ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each(function( i ) { + var self = jQuery(this), val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, self.val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + } else if ( typeof val === "number" ) { + val += ""; + } else if ( jQuery.isArray( val ) ) { + val = jQuery.map(val, function ( value ) { + return value == null ? "" : value + ""; + }); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + }); + } }); jQuery.extend({ - valHooks: { - option: { - get: function( elem ) { - // attributes.value is undefined in Blackberry 4.7 but - // uses .value. See #6932 - var val = elem.attributes.value; - return !val || val.specified ? elem.value : elem.text; - } - }, - select: { - get: function( elem ) { - var value, - index = elem.selectedIndex, - values = [], - options = elem.options, - one = elem.type === "select-one"; - - // Nothing was selected - if ( index < 0 ) { - return null; - } - - // Loop through all the selected options - for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { - var option = options[ i ]; - - // Don't return options that are disabled or in a disabled optgroup - if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && - (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - // Fixes Bug #2551 -- select.val() broken in IE after form.reset() - if ( one && !values.length && options.length ) { - return jQuery( options[ index ] ).val(); - } - - return values; - }, - - set: function( elem, value ) { - var values = jQuery.makeArray( value ); - - jQuery(elem).find("option").each(function() { - this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; - }); - - if ( !values.length ) { - elem.selectedIndex = -1; - } - return values; - } - } - }, - - attrFn: { - val: true, - css: true, - html: true, - text: true, - data: true, - width: true, - height: true, - offset: true - }, - - attrFix: { - // Always normalize to ensure hook usage - tabindex: "tabIndex" - }, - - attr: function( elem, name, value, pass ) { - var nType = elem.nodeType; - - // don't get/set attributes on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return undefined; - } - - if ( pass && name in jQuery.attrFn ) { - return jQuery( elem )[ name ]( value ); - } - - // Fallback to prop when attributes are not supported - if ( !("getAttribute" in elem) ) { - return jQuery.prop( elem, name, value ); - } - - var ret, hooks, - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - // Normalize the name if needed - if ( notxml ) { - name = jQuery.attrFix[ name ] || name; - - hooks = jQuery.attrHooks[ name ]; - - if ( !hooks ) { - // Use boolHook for boolean attributes - if ( rboolean.test( name ) ) { - hooks = boolHook; - - // Use nodeHook if available( IE6/7 ) - } else if ( nodeHook ) { - hooks = nodeHook; - } - } - } - - if ( value !== undefined ) { - - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return undefined; - - } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - elem.setAttribute( name, "" + value ); - return value; - } - - } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - - ret = elem.getAttribute( name ); - - // Non-existent attributes return null, we normalize to undefined - return ret === null ? - undefined : - ret; - } - }, - - removeAttr: function( elem, name ) { - var propName; - if ( elem.nodeType === 1 ) { - name = jQuery.attrFix[ name ] || name; - - jQuery.attr( elem, name, "" ); - elem.removeAttribute( name ); - - // Set corresponding property to false for boolean attributes - if ( rboolean.test( name ) && (propName = jQuery.propFix[ name ] || name) in elem ) { - elem[ propName ] = false; - } - } - }, - - attrHooks: { - type: { - set: function( elem, value ) { - // We can't allow the type property to be changed (since it causes problems in IE) - if ( rtype.test( elem.nodeName ) && elem.parentNode ) { - jQuery.error( "type property can't be changed" ); - } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { - // Setting the type on a radio button after the value resets the value in IE6-9 - // Reset value to it's default in case type is set after value - // This is for element creation - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - }, - // Use the value property for back compat - // Use the nodeHook for button elements in IE6/7 (#1954) - value: { - get: function( elem, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.get( elem, name ); - } - return name in elem ? - elem.value : - null; - }, - set: function( elem, value, name ) { - if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { - return nodeHook.set( elem, value, name ); - } - // Does not return so that setAttribute is also used - elem.value = value; - } - } - }, - - propFix: { - tabindex: "tabIndex", - readonly: "readOnly", - "for": "htmlFor", - "class": "className", - maxlength: "maxLength", - cellspacing: "cellSpacing", - cellpadding: "cellPadding", - rowspan: "rowSpan", - colspan: "colSpan", - usemap: "useMap", - frameborder: "frameBorder", - contenteditable: "contentEditable" - }, - - prop: function( elem, name, value ) { - var nType = elem.nodeType; - - // don't get/set properties on text, comment and attribute nodes - if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { - return undefined; - } - - var ret, hooks, - notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); - - if ( notxml ) { - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { - return ret; - - } else { - return (elem[ name ] = value); - } - - } else { - if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { - return ret; - - } else { - return elem[ name ]; - } - } - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set - // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - var attributeNode = elem.getAttributeNode("tabindex"); - - return attributeNode && attributeNode.specified ? - parseInt( attributeNode.value, 10 ) : - rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? - 0 : - undefined; - } - } - } + valHooks: { + option: { + get: function( elem ) { + // attributes.value is undefined in Blackberry 4.7 but + // uses .value. See #6932 + var val = elem.attributes.value; + return !val || val.specified ? elem.value : elem.text; + } + }, + select: { + get: function( elem ) { + var value, i, max, option, + index = elem.selectedIndex, + values = [], + options = elem.options, + one = elem.type === "select-one"; + + // Nothing was selected + if ( index < 0 ) { + return null; + } + + // Loop through all the selected options + i = one ? index : 0; + max = one ? index + 1 : options.length; + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Don't return options that are disabled or in a disabled optgroup + if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) && + (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + // Fixes Bug #2551 -- select.val() broken in IE after form.reset() + if ( one && !values.length && options.length ) { + return jQuery( options[ index ] ).val(); + } + + return values; + }, + + set: function( elem, value ) { + var values = jQuery.makeArray( value ); + + jQuery(elem).find("option").each(function() { + this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0; + }); + + if ( !values.length ) { + elem.selectedIndex = -1; + } + return values; + } + } + }, + + attrFn: { + val: true, + css: true, + html: true, + text: true, + data: true, + width: true, + height: true, + offset: true + }, + + attr: function( elem, name, value, pass ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set attributes on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( pass && name in jQuery.attrFn ) { + return jQuery( elem )[ name ]( value ); + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + // All attributes are lowercase + // Grab necessary hook if one is defined + if ( notxml ) { + name = name.toLowerCase(); + hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook ); + } + + if ( value !== undefined ) { + + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + + } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + elem.setAttribute( name, "" + value ); + return value; + } + + } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + + ret = elem.getAttribute( name ); + + // Non-existent attributes return null, we normalize to undefined + return ret === null ? + undefined : + ret; + } + }, + + removeAttr: function( elem, value ) { + var propName, attrNames, name, l, isBool, + i = 0; + + if ( value && elem.nodeType === 1 ) { + attrNames = value.toLowerCase().split( rspace ); + l = attrNames.length; + + for ( ; i < l; i++ ) { + name = attrNames[ i ]; + + if ( name ) { + propName = jQuery.propFix[ name ] || name; + isBool = rboolean.test( name ); + + // See #9699 for explanation of this approach (setting first, then removal) + // Do not do this for boolean attributes (see #10870) + if ( !isBool ) { + jQuery.attr( elem, name, "" ); + } + elem.removeAttribute( getSetAttribute ? name : propName ); + + // Set corresponding property to false for boolean attributes + if ( isBool && propName in elem ) { + elem[ propName ] = false; + } + } + } + } + }, + + attrHooks: { + type: { + set: function( elem, value ) { + // We can't allow the type property to be changed (since it causes problems in IE) + if ( rtype.test( elem.nodeName ) && elem.parentNode ) { + jQuery.error( "type property can't be changed" ); + } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) { + // Setting the type on a radio button after the value resets the value in IE6-9 + // Reset value to it's default in case type is set after value + // This is for element creation + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + }, + // Use the value property for back compat + // Use the nodeHook for button elements in IE6/7 (#1954) + value: { + get: function( elem, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.get( elem, name ); + } + return name in elem ? + elem.value : + null; + }, + set: function( elem, value, name ) { + if ( nodeHook && jQuery.nodeName( elem, "button" ) ) { + return nodeHook.set( elem, value, name ); + } + // Does not return so that setAttribute is also used + elem.value = value; + } + } + }, + + propFix: { + tabindex: "tabIndex", + readonly: "readOnly", + "for": "htmlFor", + "class": "className", + maxlength: "maxLength", + cellspacing: "cellSpacing", + cellpadding: "cellPadding", + rowspan: "rowSpan", + colspan: "colSpan", + usemap: "useMap", + frameborder: "frameBorder", + contenteditable: "contentEditable" + }, + + prop: function( elem, name, value ) { + var ret, hooks, notxml, + nType = elem.nodeType; + + // don't get/set properties on text, comment and attribute nodes + if ( !elem || nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + notxml = nType !== 1 || !jQuery.isXMLDoc( elem ); + + if ( notxml ) { + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) { + return ret; + + } else { + return ( elem[ name ] = value ); + } + + } else { + if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) { + return ret; + + } else { + return elem[ name ]; + } + } + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + var attributeNode = elem.getAttributeNode("tabindex"); + + return attributeNode && attributeNode.specified ? + parseInt( attributeNode.value, 10 ) : + rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ? + 0 : + undefined; + } + } + } }); -// Add the tabindex propHook to attrHooks for back-compat -jQuery.attrHooks.tabIndex = jQuery.propHooks.tabIndex; +// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional) +jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex; // Hook for boolean attributes boolHook = { - get: function( elem, name ) { - // Align boolean attributes with corresponding properties - // Fall back to attribute presence where some booleans are not supported - var attrNode; - return jQuery.prop( elem, name ) === true || ( attrNode = elem.getAttributeNode( name ) ) && attrNode.nodeValue !== false ? - name.toLowerCase() : - undefined; - }, - set: function( elem, value, name ) { - var propName; - if ( value === false ) { - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - // value is true since we know at this point it's type boolean and not false - // Set boolean attributes to the same name and set the DOM property - propName = jQuery.propFix[ name ] || name; - if ( propName in elem ) { - // Only set the IDL specifically if it already exists on the element - elem[ propName ] = true; - } - - elem.setAttribute( name, name.toLowerCase() ); - } - return name; - } + get: function( elem, name ) { + // Align boolean attributes with corresponding properties + // Fall back to attribute presence where some booleans are not supported + var attrNode, + property = jQuery.prop( elem, name ); + return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ? + name.toLowerCase() : + undefined; + }, + set: function( elem, value, name ) { + var propName; + if ( value === false ) { + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + // value is true since we know at this point it's type boolean and not false + // Set boolean attributes to the same name and set the DOM property + propName = jQuery.propFix[ name ] || name; + if ( propName in elem ) { + // Only set the IDL specifically if it already exists on the element + elem[ propName ] = true; + } + + elem.setAttribute( name, name.toLowerCase() ); + } + return name; + } }; // IE6/7 do not support getting/setting some attributes with get/setAttribute -if ( !jQuery.support.getSetAttribute ) { +if ( !getSetAttribute ) { - // Use this for any attribute in IE6/7 - // This fixes almost every IE6/7 issue - nodeHook = jQuery.valHooks.button = { - get: function( elem, name ) { - var ret; - ret = elem.getAttributeNode( name ); - // Return undefined if nodeValue is empty string - return ret && ret.nodeValue !== "" ? - ret.nodeValue : - undefined; - }, - set: function( elem, value, name ) { - // Set the existing or create a new attribute node - var ret = elem.getAttributeNode( name ); - if ( !ret ) { - ret = document.createAttribute( name ); - elem.setAttributeNode( ret ); - } - return (ret.nodeValue = value + ""); - } - }; - - // Set width and height to auto instead of 0 on empty string( Bug #8150 ) - // This is for removals - jQuery.each([ "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - set: function( elem, value ) { - if ( value === "" ) { - elem.setAttribute( name, "auto" ); - return value; - } - } - }); - }); + fixSpecified = { + name: true, + id: true, + coords: true + }; + + // Use this for any attribute in IE6/7 + // This fixes almost every IE6/7 issue + nodeHook = jQuery.valHooks.button = { + get: function( elem, name ) { + var ret; + ret = elem.getAttributeNode( name ); + return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ? + ret.nodeValue : + undefined; + }, + set: function( elem, value, name ) { + // Set the existing or create a new attribute node + var ret = elem.getAttributeNode( name ); + if ( !ret ) { + ret = document.createAttribute( name ); + elem.setAttributeNode( ret ); + } + return ( ret.nodeValue = value + "" ); + } + }; + + // Apply the nodeHook to tabindex + jQuery.attrHooks.tabindex.set = nodeHook.set; + + // Set width and height to auto instead of 0 on empty string( Bug #8150 ) + // This is for removals + jQuery.each([ "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + set: function( elem, value ) { + if ( value === "" ) { + elem.setAttribute( name, "auto" ); + return value; + } + } + }); + }); + + // Set contenteditable to false on removals(#10429) + // Setting to empty string throws an error as an invalid value + jQuery.attrHooks.contenteditable = { + get: nodeHook.get, + set: function( elem, value, name ) { + if ( value === "" ) { + value = "false"; + } + nodeHook.set( elem, value, name ); + } + }; } // Some attributes require a special call on IE if ( !jQuery.support.hrefNormalized ) { - jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { - jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { - get: function( elem ) { - var ret = elem.getAttribute( name, 2 ); - return ret === null ? undefined : ret; - } - }); - }); + jQuery.each([ "href", "src", "width", "height" ], function( i, name ) { + jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], { + get: function( elem ) { + var ret = elem.getAttribute( name, 2 ); + return ret === null ? undefined : ret; + } + }); + }); } if ( !jQuery.support.style ) { - jQuery.attrHooks.style = { - get: function( elem ) { - // Return undefined in the case of empty string - // Normalize to lowercase since IE uppercases css property names - return elem.style.cssText.toLowerCase() || undefined; - }, - set: function( elem, value ) { - return (elem.style.cssText = "" + value); - } - }; + jQuery.attrHooks.style = { + get: function( elem ) { + // Return undefined in the case of empty string + // Normalize to lowercase since IE uppercases css property names + return elem.style.cssText.toLowerCase() || undefined; + }, + set: function( elem, value ) { + return ( elem.style.cssText = "" + value ); + } + }; } // Safari mis-reports the default selected property of an option // Accessing the parent's selectedIndex property fixes it if ( !jQuery.support.optSelected ) { - jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { - get: function( elem ) { - var parent = elem.parentNode; - - if ( parent ) { - parent.selectedIndex; - - // Make sure that it also works with optgroups, see #5701 - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - return null; - } - }); + jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, { + get: function( elem ) { + var parent = elem.parentNode; + + if ( parent ) { + parent.selectedIndex; + + // Make sure that it also works with optgroups, see #5701 + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + return null; + } + }); +} + +// IE6/7 call enctype encoding +if ( !jQuery.support.enctype ) { + jQuery.propFix.enctype = "encoding"; } // Radios and checkboxes getter/setter if ( !jQuery.support.checkOn ) { - jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - get: function( elem ) { - // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified - return elem.getAttribute("value") === null ? "on" : elem.value; - } - }; - }); + jQuery.each([ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + get: function( elem ) { + // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified + return elem.getAttribute("value") === null ? "on" : elem.value; + } + }; + }); } jQuery.each([ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { - set: function( elem, value ) { - if ( jQuery.isArray( value ) ) { - return (elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0); - } - } - }); + jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], { + set: function( elem, value ) { + if ( jQuery.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 ); + } + } + }); }); -var rnamespaces = /\.(.*)$/, - rformElems = /^(?:textarea|input|select)$/i, - rperiod = /\./g, - rspaces = / /g, - rescape = /[^\w\s.|`]/g, - fcleanup = function( nm ) { - return nm.replace(rescape, "\\$&"); - }; +var rformElems = /^(?:textarea|input|select)$/i, + rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/, + rhoverHack = /(?:^|\s)hover(\.\S+)?\b/, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|contextmenu)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/, + quickParse = function( selector ) { + var quick = rquickIs.exec( selector ); + if ( quick ) { + // 0 1 2 3 + // [ _, tag, id, class ] + quick[1] = ( quick[1] || "" ).toLowerCase(); + quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" ); + } + return quick; + }, + quickIs = function( elem, m ) { + var attrs = elem.attributes || {}; + return ( + (!m[1] || elem.nodeName.toLowerCase() === m[1]) && + (!m[2] || (attrs.id || {}).value === m[2]) && + (!m[3] || m[3].test( (attrs[ "class" ] || {}).value )) + ); + }, + hoverHack = function( events ) { + return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" ); + }; /* - * A number of helper functions used for managing events. - * Many of the ideas behind this code originated from - * Dean Edwards' addEvent library. + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. */ jQuery.event = { - // Bind an event to an element - // Original by Dean Edwards - add: function( elem, types, handler, data ) { - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } else if ( !handler ) { - // Fixes bug #7229. Fix recommended by jdalton - return; - } - - var handleObjIn, handleObj; - - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - } - - // Make sure that the function being executed has a unique ID - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure - var elemData = jQuery._data( elem ); - - // If no elemData is found then we must be trying to bind to one of the - // banned noData elements - if ( !elemData ) { - return; - } - - var events = elemData.events, - eventHandle = elemData.handle; - - if ( !events ) { - elemData.events = events = {}; - } - - if ( !eventHandle ) { - elemData.handle = eventHandle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.handle.apply( eventHandle.elem, arguments ) : - undefined; - }; - } - - // Add elem as a property of the handle function - // This is to prevent a memory leak with non-native events in IE. - eventHandle.elem = elem; - - // Handle multiple events separated by a space - // jQuery(...).bind("mouseover mouseout", fn); - types = types.split(" "); - - var type, i = 0, namespaces; - - while ( (type = types[ i++ ]) ) { - handleObj = handleObjIn ? - jQuery.extend({}, handleObjIn) : - { handler: handler, data: data }; - - // Namespaced event handlers - if ( type.indexOf(".") > -1 ) { - namespaces = type.split("."); - type = namespaces.shift(); - handleObj.namespace = namespaces.slice(0).sort().join("."); - - } else { - namespaces = []; - handleObj.namespace = ""; - } - - handleObj.type = type; - if ( !handleObj.guid ) { - handleObj.guid = handler.guid; - } - - // Get the current list of functions bound to this event - var handlers = events[ type ], - special = jQuery.event.special[ type ] || {}; - - // Init the event handler queue - if ( !handlers ) { - handlers = events[ type ] = []; - - // Check for a special event handler - // Only use addEventListener/attachEvent if the special - // events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add the function to the element's handler list - handlers.push( handleObj ); - - // Keep track of which events have been used, for event optimization - jQuery.event.global[ type ] = true; - } - - // Nullify elem to prevent memory leaks in IE - elem = null; - }, - - global: {}, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, pos ) { - // don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - if ( handler === false ) { - handler = returnFalse; - } - - var ret, type, fn, j, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ), - events = elemData && elemData.events; - - if ( !elemData || !events ) { - return; - } - - // types is actually an event object here - if ( types && types.type ) { - handler = types.handler; - types = types.type; - } - - // Unbind all events for the element - if ( !types || typeof types === "string" && types.charAt(0) === "." ) { - types = types || ""; - - for ( type in events ) { - jQuery.event.remove( elem, type + types ); - } - - return; - } - - // Handle multiple events separated by a space - // jQuery(...).unbind("mouseover mouseout", fn); - types = types.split(" "); - - while ( (type = types[ i++ ]) ) { - origType = type; - handleObj = null; - all = type.indexOf(".") < 0; - namespaces = []; - - if ( !all ) { - // Namespaced event handlers - namespaces = type.split("."); - type = namespaces.shift(); - - namespace = new RegExp("(^|\\.)" + - jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - eventType = events[ type ]; - - if ( !eventType ) { - continue; - } - - if ( !handler ) { - for ( j = 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( all || namespace.test( handleObj.namespace ) ) { - jQuery.event.remove( elem, origType, handleObj.handler, j ); - eventType.splice( j--, 1 ); - } - } - - continue; - } - - special = jQuery.event.special[ type ] || {}; - - for ( j = pos || 0; j < eventType.length; j++ ) { - handleObj = eventType[ j ]; - - if ( handler.guid === handleObj.guid ) { - // remove the given handler for the given type - if ( all || namespace.test( handleObj.namespace ) ) { - if ( pos == null ) { - eventType.splice( j--, 1 ); - } - - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - - if ( pos != null ) { - break; - } - } - } - - // remove generic event handler if no more handlers exist - if ( eventType.length === 0 || pos != null && eventType.length === 1 ) { - if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - ret = null; - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - var handle = elemData.handle; - if ( handle ) { - handle.elem = null; - } - - delete elemData.events; - delete elemData.handle; - - if ( jQuery.isEmptyObject( elemData ) ) { - jQuery.removeData( elem, undefined, true ); - } - } - }, - - // Events that are safe to short-circuit if no handlers are attached. - // Native DOM events should not be added, they may have inline handlers. - customEvent: { - "getData": true, - "setData": true, - "changeData": true - }, - - trigger: function( event, data, elem, onlyHandlers ) { - // Event object or event type - var type = event.type || event, - namespaces = [], - exclusive; - - if ( type.indexOf("!") >= 0 ) { - // Exclusive events trigger only for the exact event (no namespaces) - type = type.slice(0, -1); - exclusive = true; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - - if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { - // No jQuery handlers for this event type, and it can't have inline handlers - return; - } - - // Caller can pass in an Event, Object, or just an event type string - event = typeof event === "object" ? - // jQuery.Event object - event[ jQuery.expando ] ? event : - // Object literal - new jQuery.Event( type, event ) : - // Just the event type (string) - new jQuery.Event( type ); - - event.type = type; - event.exclusive = exclusive; - event.namespace = namespaces.join("."); - event.namespace_re = new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)"); - - // triggerHandler() and global events don't bubble or run the default action - if ( onlyHandlers || !elem ) { - event.preventDefault(); - event.stopPropagation(); - } - - // Handle a global trigger - if ( !elem ) { - // TODO: Stop taunting the data cache; remove global events and always attach to document - jQuery.each( jQuery.cache, function() { - // internalKey variable is just used to make it easier to find - // and potentially change this stuff later; currently it just - // points to jQuery.expando - var internalKey = jQuery.expando, - internalCache = this[ internalKey ]; - if ( internalCache && internalCache.events && internalCache.events[ type ] ) { - jQuery.event.trigger( event, data, internalCache.handle.elem ); - } - }); - return; - } - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // Clean up the event in case it is being reused - event.result = undefined; - event.target = elem; - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data != null ? jQuery.makeArray( data ) : []; - data.unshift( event ); - - var cur = elem, - // IE doesn't like method names with a colon (#3533, #8272) - ontype = type.indexOf(":") < 0 ? "on" + type : ""; - - // Fire event on the current element, then bubble up the DOM tree - do { - var handle = jQuery._data( cur, "handle" ); - - event.currentTarget = cur; - if ( handle ) { - handle.apply( cur, data ); - } - - // Trigger an inline bound script - if ( ontype && jQuery.acceptData( cur ) && cur[ ontype ] && cur[ ontype ].apply( cur, data ) === false ) { - event.result = false; - event.preventDefault(); - } - - // Bubble up to document, then to window - cur = cur.parentNode || cur.ownerDocument || cur === event.target.ownerDocument && window; - } while ( cur && !event.isPropagationStopped() ); - - // If nobody prevented the default action, do it now - if ( !event.isDefaultPrevented() ) { - var old, - special = jQuery.event.special[ type ] || {}; - - if ( (!special._default || special._default.call( elem.ownerDocument, event ) === false) && - !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction)() check here because IE6/7 fails that test. - // IE<9 dies on focus to hidden element (#1486), may want to revisit a try/catch. - try { - if ( ontype && elem[ type ] ) { - // Don't re-trigger an onFOO event when we call its FOO() method - old = elem[ ontype ]; - - if ( old ) { - elem[ ontype ] = null; - } - - jQuery.event.triggered = type; - elem[ type ](); - } - } catch ( ieError ) {} - - if ( old ) { - elem[ ontype ] = old; - } - - jQuery.event.triggered = undefined; - } - } - - return event.result; - }, - - handle: function( event ) { - event = jQuery.event.fix( event || window.event ); - // Snapshot the handlers list since a called handler may add/remove events. - var handlers = ((jQuery._data( this, "events" ) || {})[ event.type ] || []).slice(0), - run_all = !event.exclusive && !event.namespace, - args = Array.prototype.slice.call( arguments, 0 ); - - // Use the fix-ed Event rather than the (read-only) native event - args[0] = event; - event.currentTarget = this; - - for ( var j = 0, l = handlers.length; j < l; j++ ) { - var handleObj = handlers[ j ]; - - // Triggered event must 1) be non-exclusive and have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event. - if ( run_all || event.namespace_re.test( handleObj.namespace ) ) { - // Pass in a reference to the handler function itself - // So that we can later remove it - event.handler = handleObj.handler; - event.data = handleObj.data; - event.handleObj = handleObj; - - var ret = handleObj.handler.apply( this, args ); - - if ( ret !== undefined ) { - event.result = ret; - if ( ret === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - return event.result; - }, - - props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // store a copy of the original event object - // and "clone" to set read-only properties - var originalEvent = event; - event = jQuery.Event( originalEvent ); - - for ( var i = this.props.length, prop; i; ) { - prop = this.props[ --i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Fix target property, if necessary - if ( !event.target ) { - // Fixes #1925 where srcElement might not be defined either - event.target = event.srcElement || document; - } - - // check if target is a textnode (safari) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Add relatedTarget, if necessary - if ( !event.relatedTarget && event.fromElement ) { - event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement; - } - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && event.clientX != null ) { - var eventDocument = event.target.ownerDocument || document, - doc = eventDocument.documentElement, - body = eventDocument.body; - - event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0); - event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0); - } - - // Add which for key events - if ( event.which == null && (event.charCode != null || event.keyCode != null) ) { - event.which = event.charCode != null ? event.charCode : event.keyCode; - } - - // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) - if ( !event.metaKey && event.ctrlKey ) { - event.metaKey = event.ctrlKey; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && event.button !== undefined ) { - event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); - } - - return event; - }, - - // Deprecated, use jQuery.guid instead - guid: 1E8, - - // Deprecated, use jQuery.proxy instead - proxy: jQuery.proxy, - - special: { - ready: { - // Make sure the ready event is setup - setup: jQuery.bindReady, - teardown: jQuery.noop - }, - - live: { - add: function( handleObj ) { - jQuery.event.add( this, - liveConvert( handleObj.origType, handleObj.selector ), - jQuery.extend({}, handleObj, {handler: liveHandler, guid: handleObj.handler.guid}) ); - }, - - remove: function( handleObj ) { - jQuery.event.remove( this, liveConvert( handleObj.origType, handleObj.selector ), handleObj ); - } - }, - - beforeunload: { - setup: function( data, namespaces, eventHandle ) { - // We only want to do this special case on windows - if ( jQuery.isWindow( this ) ) { - this.onbeforeunload = eventHandle; - } - }, - - teardown: function( namespaces, eventHandle ) { - if ( this.onbeforeunload === eventHandle ) { - this.onbeforeunload = null; - } - } - } - } + add: function( elem, types, handler, data, selector ) { + + var elemData, eventHandle, events, + t, tns, type, namespaces, handleObj, + handleObjIn, quick, handlers, special; + + // Don't attach events to noData or text/comment nodes (allow plain objects tho) + if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + events = elemData.events; + if ( !events ) { + elemData.events = events = {}; + } + eventHandle = elemData.handle; + if ( !eventHandle ) { + elemData.handle = eventHandle = function( e ) { + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + // jQuery(...).bind("mouseover mouseout", fn); + types = jQuery.trim( hoverHack(types) ).split( " " ); + for ( t = 0; t < types.length; t++ ) { + + tns = rtypenamespace.exec( types[t] ) || []; + type = tns[1]; + namespaces = ( tns[2] || "" ).split( "." ).sort(); + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend({ + type: type, + origType: tns[1], + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + quick: selector && quickParse( selector ), + namespace: namespaces.join(".") + }, handleObjIn ); + + // Init the event handler queue if we're the first + handlers = events[ type ]; + if ( !handlers ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + global: {}, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var elemData = jQuery.hasData( elem ) && jQuery._data( elem ), + t, tns, type, origType, namespaces, origCount, + j, events, special, handle, eventType, handleObj; + + if ( !elemData || !(events = elemData.events) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = jQuery.trim( hoverHack( types || "" ) ).split(" "); + for ( t = 0; t < types.length; t++ ) { + tns = rtypenamespace.exec( types[t] ) || []; + type = origType = tns[1]; + namespaces = tns[2]; + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector? special.delegateType : special.bindType ) || type; + eventType = events[ type ] || []; + origCount = eventType.length; + namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + + // Remove matching events + for ( j = 0; j < eventType.length; j++ ) { + handleObj = eventType[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !namespaces || namespaces.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { + eventType.splice( j--, 1 ); + + if ( handleObj.selector ) { + eventType.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( eventType.length === 0 && origCount !== eventType.length ) { + if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) { + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + handle = elemData.handle; + if ( handle ) { + handle.elem = null; + } + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery.removeData( elem, [ "events", "handle" ], true ); + } + }, + + // Events that are safe to short-circuit if no handlers are attached. + // Native DOM events should not be added, they may have inline handlers. + customEvent: { + "getData": true, + "setData": true, + "changeData": true + }, + + trigger: function( event, data, elem, onlyHandlers ) { + // Don't do events on text and comment nodes + if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) { + return; + } + + // Event object or event type + var type = event.type || event, + namespaces = [], + cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType; + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "!" ) >= 0 ) { + // Exclusive events trigger only for the exact event (no namespaces) + type = type.slice(0, -1); + exclusive = true; + } + + if ( type.indexOf( "." ) >= 0 ) { + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split("."); + type = namespaces.shift(); + namespaces.sort(); + } + + if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) { + // No jQuery handlers for this event type, and it can't have inline handlers + return; + } + + // Caller can pass in an Event, Object, or just an event type string + event = typeof event === "object" ? + // jQuery.Event object + event[ jQuery.expando ] ? event : + // Object literal + new jQuery.Event( type, event ) : + // Just the event type (string) + new jQuery.Event( type ); + + event.type = type; + event.isTrigger = true; + event.exclusive = exclusive; + event.namespace = namespaces.join( "." ); + event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null; + ontype = type.indexOf( ":" ) < 0 ? "on" + type : ""; + + // Handle a global trigger + if ( !elem ) { + + // TODO: Stop taunting the data cache; remove global events and always attach to document + cache = jQuery.cache; + for ( i in cache ) { + if ( cache[ i ].events && cache[ i ].events[ type ] ) { + jQuery.event.trigger( event, data, cache[ i ].handle.elem, true ); + } + } + return; + } + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data != null ? jQuery.makeArray( data ) : []; + data.unshift( event ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + eventPath = [[ elem, special.bindType || type ]]; + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode; + old = null; + for ( ; cur; cur = cur.parentNode ) { + eventPath.push([ cur, bubbleType ]); + old = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( old && old === elem.ownerDocument ) { + eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]); + } + } + + // Fire handlers on the event path + for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) { + + cur = eventPath[i][0]; + event.type = eventPath[i][1]; + + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + // Note that this is a bare JS function and not a jQuery handler + handle = ontype && cur[ ontype ]; + if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) { + event.preventDefault(); + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) && + !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + // IE<9 dies on focus/blur to hidden element (#1486) + if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + old = elem[ ontype ]; + + if ( old ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( old ) { + elem[ ontype ] = old; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event || window.event ); + + var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []), + delegateCount = handlers.delegateCount, + args = [].slice.call( arguments, 0 ), + run_all = !event.exclusive && !event.namespace, + special = jQuery.event.special[ event.type ] || {}, + handlerQueue = [], + i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[0] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers that should run if there are delegated events + // Avoid non-left-click bubbling in Firefox (#3861) + if ( delegateCount && !(event.button && event.type === "click") ) { + + // Pregenerate a single jQuery object for reuse with .is() + jqcur = jQuery(this); + jqcur.context = this.ownerDocument || this; + + for ( cur = event.target; cur != this; cur = cur.parentNode || this ) { + + // Don't process events on disabled elements (#6911, #8165) + if ( cur.disabled !== true ) { + selMatch = {}; + matches = []; + jqcur[0] = cur; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + sel = handleObj.selector; + + if ( selMatch[ sel ] === undefined ) { + selMatch[ sel ] = ( + handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel ) + ); + } + if ( selMatch[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push({ elem: cur, matches: matches }); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( handlers.length > delegateCount ) { + handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) }); + } + + // Run delegates first; they may want to stop propagation beneath us + for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) { + matched = handlerQueue[ i ]; + event.currentTarget = matched.elem; + + for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) { + handleObj = matched.matches[ j ]; + + // Triggered event must either 1) be non-exclusive and have no namespace, or + // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) { + + event.data = handleObj.data; + event.handleObj = handleObj; + + ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) + .apply( matched.elem, args ); + + if ( ret !== undefined ) { + event.result = ret; + if ( ret === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 *** + props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split(" "), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + filter: function( event, original ) { + var eventDoc, doc, body, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, + originalEvent = event, + fixHook = jQuery.event.fixHooks[ event.type ] || {}, + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = jQuery.Event( originalEvent ); + + for ( i = copy.length; i; ) { + prop = copy[ --i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Target should not be a text node (#504, Safari) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8) + if ( event.metaKey === undefined ) { + event.metaKey = event.ctrlKey; + } + + return fixHook.filter? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + ready: { + // Make sure the ready event is setup + setup: jQuery.bindReady + }, + + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + + focus: { + delegateType: "focusin" + }, + blur: { + delegateType: "focusout" + }, + + beforeunload: { + setup: function( data, namespaces, eventHandle ) { + // We only want to do this special case on windows + if ( jQuery.isWindow( this ) ) { + this.onbeforeunload = eventHandle; + } + }, + + teardown: function( namespaces, eventHandle ) { + if ( this.onbeforeunload === eventHandle ) { + this.onbeforeunload = null; + } + } + } + }, + + simulate: function( type, elem, event, bubble ) { + // Piggyback on a donor event to simulate a different one. + // Fake originalEvent to avoid donor's stopPropagation, but if the + // simulated event prevents default then we do the same on the donor. + var e = jQuery.extend( + new jQuery.Event(), + event, + { type: type, + isSimulated: true, + originalEvent: {} + } + ); + if ( bubble ) { + jQuery.event.trigger( e, null, elem ); + } else { + jQuery.event.dispatch.call( elem, e ); + } + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } }; +// Some plugins are using, but it's undocumented/deprecated and will be removed. +// The 1.7 special event interface should provide all the hooks needed now. +jQuery.event.handle = jQuery.event.dispatch; + jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - if ( elem.detachEvent ) { - elem.detachEvent( "on" + type, handle ); - } - }; + function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } + } : + function( elem, type, handle ) { + if ( elem.detachEvent ) { + elem.detachEvent( "on" + type, handle ); + } + }; jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !this.preventDefault ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || - src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // timeStamp is buggy for some events on Firefox(#3843) - // So we won't rely on the native value - this.timeStamp = jQuery.now(); + // Allow instantiation without the 'new' keyword + if ( !(this instanceof jQuery.Event) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false || + src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); - // Mark it as fixed - this[ jQuery.expando ] = true; + // Mark it as fixed + this[ jQuery.expando ] = true; }; function returnFalse() { - return false; + return false; } function returnTrue() { - return true; + return true; } // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html jQuery.Event.prototype = { - preventDefault: function() { - this.isDefaultPrevented = returnTrue; + preventDefault: function() { + this.isDefaultPrevented = returnTrue; - var e = this.originalEvent; - if ( !e ) { - return; - } - - // if preventDefault exists run it on the original event - if ( e.preventDefault ) { - e.preventDefault(); - - // otherwise set the returnValue property of the original event to false (IE) - } else { - e.returnValue = false; - } - }, - stopPropagation: function() { - this.isPropagationStopped = returnTrue; - - var e = this.originalEvent; - if ( !e ) { - return; - } - // if stopPropagation exists run it on the original event - if ( e.stopPropagation ) { - e.stopPropagation(); - } - // otherwise set the cancelBubble property of the original event to true (IE) - e.cancelBubble = true; - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - }, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse + var e = this.originalEvent; + if ( !e ) { + return; + } + + // if preventDefault exists run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // otherwise set the returnValue property of the original event to false (IE) + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + this.isPropagationStopped = returnTrue; + + var e = this.originalEvent; + if ( !e ) { + return; + } + // if stopPropagation exists run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + // otherwise set the cancelBubble property of the original event to true (IE) + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + this.isImmediatePropagationStopped = returnTrue; + this.stopPropagation(); + }, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse }; -// Checks if an event happened on an element within another element -// Used in jQuery.event.special.mouseenter and mouseleave handlers -var withinElement = function( event ) { - - // Check if mouse(over|out) are still within the same parent element - var related = event.relatedTarget, - inside = false, - eventType = event.type; - - event.type = event.data; - - if ( related !== this ) { - - if ( related ) { - inside = jQuery.contains( this, related ); - } - - if ( !inside ) { - - jQuery.event.handle.apply( this, arguments ); - - event.type = eventType; - } - } -}, - -// In case of event delegation, we only need to rename the event.type, -// liveHandler will take care of the rest. -delegate = function( event ) { - event.type = event.data; - jQuery.event.handle.apply( this, arguments ); -}; - -// Create mouseenter and mouseleave events +// Create mouseenter/leave events using mouseover/out and event-time checks jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" + mouseenter: "mouseover", + mouseleave: "mouseout" }, function( orig, fix ) { - jQuery.event.special[ orig ] = { - setup: function( data ) { - jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig ); - }, - teardown: function( data ) { - jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement ); - } - }; + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var target = this, + related = event.relatedTarget, + handleObj = event.handleObj, + selector = handleObj.selector, + ret; + + // For mousenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || (related !== target && !jQuery.contains( target, related )) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; }); -// submit delegation +// IE submit delegation if ( !jQuery.support.submitBubbles ) { - jQuery.event.special.submit = { - setup: function( data, namespaces ) { - if ( !jQuery.nodeName( this, "form" ) ) { - jQuery.event.add(this, "click.specialSubmit", function( e ) { - // Avoid triggering error on non-existent type attribute in IE VML (#7071) - var elem = e.target, - type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; - - if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) { - trigger( "submit", this, arguments ); - } - }); - - jQuery.event.add(this, "keypress.specialSubmit", function( e ) { - var elem = e.target, - type = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.type : ""; - - if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) { - trigger( "submit", this, arguments ); - } - }); - - } else { - return false; - } - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialSubmit" ); - } - }; - + jQuery.event.special.submit = { + setup: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; + if ( form && !form._submit_attached ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submit_bubble = true; + }); + form._submit_attached = true; + } + }); + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + // If form was submitted by the user, bubble the event up the tree + if ( event._submit_bubble ) { + delete event._submit_bubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event, true ); + } + } + }, + + teardown: function() { + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; } -// change delegation, happens here so we have bind. +// IE change delegation and checkbox/radio fix if ( !jQuery.support.changeBubbles ) { - var changeFilters, + jQuery.event.special.change = { + + setup: function() { - getVal = function( elem ) { - var type = jQuery.nodeName( elem, "input" ) ? elem.type : "", - val = elem.value; - - if ( type === "radio" || type === "checkbox" ) { - val = elem.checked; - - } else if ( type === "select-multiple" ) { - val = elem.selectedIndex > -1 ? - jQuery.map( elem.options, function( elem ) { - return elem.selected; - }).join("-") : - ""; - - } else if ( jQuery.nodeName( elem, "select" ) ) { - val = elem.selectedIndex; - } - - return val; - }, - - testChange = function testChange( e ) { - var elem = e.target, data, val; - - if ( !rformElems.test( elem.nodeName ) || elem.readOnly ) { - return; - } - - data = jQuery._data( elem, "_change_data" ); - val = getVal(elem); - - // the current data will be also retrieved by beforeactivate - if ( e.type !== "focusout" || elem.type !== "radio" ) { - jQuery._data( elem, "_change_data", val ); - } - - if ( data === undefined || val === data ) { - return; - } - - if ( data != null || val ) { - e.type = "change"; - e.liveFired = undefined; - jQuery.event.trigger( e, arguments[1], elem ); - } - }; - - jQuery.event.special.change = { - filters: { - focusout: testChange, - - beforedeactivate: testChange, - - click: function( e ) { - var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - - if ( type === "radio" || type === "checkbox" || jQuery.nodeName( elem, "select" ) ) { - testChange.call( this, e ); - } - }, - - // Change has to be called before submit - // Keydown will be called before keypress, which is used in submit-event delegation - keydown: function( e ) { - var elem = e.target, type = jQuery.nodeName( elem, "input" ) ? elem.type : ""; - - if ( (e.keyCode === 13 && !jQuery.nodeName( elem, "textarea" ) ) || - (e.keyCode === 32 && (type === "checkbox" || type === "radio")) || - type === "select-multiple" ) { - testChange.call( this, e ); - } - }, - - // Beforeactivate happens also before the previous element is blurred - // with this event you can't trigger a change event, but you can store - // information - beforeactivate: function( e ) { - var elem = e.target; - jQuery._data( elem, "_change_data", getVal(elem) ); - } - }, - - setup: function( data, namespaces ) { - if ( this.type === "file" ) { - return false; - } - - for ( var type in changeFilters ) { - jQuery.event.add( this, type + ".specialChange", changeFilters[type] ); - } - - return rformElems.test( this.nodeName ); - }, - - teardown: function( namespaces ) { - jQuery.event.remove( this, ".specialChange" ); - - return rformElems.test( this.nodeName ); - } - }; - - changeFilters = jQuery.event.special.change.filters; - - // Handle when the input is .focus()'d - changeFilters.focus = changeFilters.beforeactivate; -} - -function trigger( type, elem, args ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - // Don't pass args or remember liveFired; they apply to the donor event. - var event = jQuery.extend( {}, args[ 0 ] ); - event.type = type; - event.originalEvent = {}; - event.liveFired = undefined; - jQuery.event.handle.call( elem, event ); - if ( event.isDefaultPrevented() ) { - args[ 0 ].preventDefault(); - } + if ( rformElems.test( this.nodeName ) ) { + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._just_changed = true; + } + }); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._just_changed && !event.isTrigger ) { + this._just_changed = false; + jQuery.event.simulate( "change", this, event, true ); + } + }); + } + return false; + } + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event, true ); + } + }); + elem._change_attached = true; + } + }); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return rformElems.test( this.nodeName ); + } + }; } // Create "bubbling" focus and blur events if ( !jQuery.support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler while someone wants focusin/focusout - var attaches = 0; + jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - jQuery.event.special[ fix ] = { - setup: function() { - if ( attaches++ === 0 ) { - document.addEventListener( orig, handler, true ); - } - }, - teardown: function() { - if ( --attaches === 0 ) { - document.removeEventListener( orig, handler, true ); - } - } - }; - - function handler( donor ) { - // Donor event is always a native one; fix it and switch its type. - // Let focusin/out handler cancel the donor focus/blur event. - var e = jQuery.event.fix( donor ); - e.type = fix; - e.originalEvent = {}; - jQuery.event.trigger( e, null, e.target ); - if ( e.isDefaultPrevented() ) { - donor.preventDefault(); - } - } - }); -} - -jQuery.each(["bind", "one"], function( i, name ) { - jQuery.fn[ name ] = function( type, data, fn ) { - var handler; - - // Handle object literals - if ( typeof type === "object" ) { - for ( var key in type ) { - this[ name ](key, data, type[key], fn); - } - return this; - } - - if ( arguments.length === 2 || data === false ) { - fn = data; - data = undefined; - } - - if ( name === "one" ) { - handler = function( event ) { - jQuery( this ).unbind( event, handler ); - return fn.apply( this, arguments ); - }; - handler.guid = fn.guid || jQuery.guid++; - } else { - handler = fn; - } - - if ( type === "unload" && name !== "one" ) { - this.one( type, data, fn ); - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.add( this[i], type, handler, data ); - } - } - - return this; - }; -}); + // Attach a single capturing handler while someone wants focusin/focusout + var attaches = 0, + handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + if ( attaches++ === 0 ) { + document.addEventListener( orig, handler, true ); + } + }, + teardown: function() { + if ( --attaches === 0 ) { + document.removeEventListener( orig, handler, true ); + } + } + }; + }); +} jQuery.fn.extend({ - unbind: function( type, fn ) { - // Handle object literals - if ( typeof type === "object" && !type.preventDefault ) { - for ( var key in type ) { - this.unbind(key, type[key]); - } - - } else { - for ( var i = 0, l = this.length; i < l; i++ ) { - jQuery.event.remove( this[i], type, fn ); - } - } - - return this; - }, - - delegate: function( selector, types, data, fn ) { - return this.live( types, data, fn, selector ); - }, - - undelegate: function( selector, types, fn ) { - if ( arguments.length === 0 ) { - return this.unbind( "live" ); - - } else { - return this.die( types, null, fn, selector ); - } - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - - triggerHandler: function( type, data ) { - if ( this[0] ) { - return jQuery.event.trigger( type, data, this[0], true ); - } - }, - - toggle: function( fn ) { - // Save reference to arguments for access in closure - var args = arguments, - guid = fn.guid || jQuery.guid++, - i = 0, - toggler = function( event ) { - // Figure out which function to execute - var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i; - jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 ); - - // Make sure that clicks stop - event.preventDefault(); - - // and execute the function - return args[ lastToggle ].apply( this, arguments ) || false; - }; - - // link all the functions, so any of them can unbind this click handler - toggler.guid = guid; - while ( i < args.length ) { - args[ i++ ].guid = guid; - } - - return this.click( toggler ); - }, - - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -}); - -var liveMap = { - focus: "focusin", - blur: "focusout", - mouseenter: "mouseover", - mouseleave: "mouseout" -}; - -jQuery.each(["live", "die"], function( i, name ) { - jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) { - var type, i = 0, match, namespaces, preType, - selector = origSelector || this.selector, - context = origSelector ? this : jQuery( this.context ); - - if ( typeof types === "object" && !types.preventDefault ) { - for ( var key in types ) { - context[ name ]( key, data, types[key], selector ); - } - return this; - } + on: function( types, selector, data, fn, /*INTERNAL*/ one ) { + var origFn, type; - if ( name === "die" && !types && - origSelector && origSelector.charAt(0) === "." ) { - - context.unbind( origSelector ); - - return this; - } - - if ( data === false || jQuery.isFunction( data ) ) { - fn = data || returnFalse; - data = undefined; - } - - types = (types || "").split(" "); - - while ( (type = types[ i++ ]) != null ) { - match = rnamespaces.exec( type ); - namespaces = ""; - - if ( match ) { - namespaces = match[0]; - type = type.replace( rnamespaces, "" ); - } - - if ( type === "hover" ) { - types.push( "mouseenter" + namespaces, "mouseleave" + namespaces ); - continue; - } - - preType = type; - - if ( liveMap[ type ] ) { - types.push( liveMap[ type ] + namespaces ); - type = type + namespaces; - - } else { - type = (liveMap[ type ] || type) + namespaces; - } - - if ( name === "live" ) { - // bind live handler - for ( var j = 0, l = context.length; j < l; j++ ) { - jQuery.event.add( context[j], "live." + liveConvert( type, selector ), - { data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } ); - } - - } else { - // unbind live handler - context.unbind( "live." + liveConvert( type, selector ), fn ); - } - } - - return this; - }; + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { // && selector != null + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + this.on( type, selector, data, types[ type ], one ); + } + return this; + } + + if ( data == null && fn == null ) { + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return this; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return this.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + }); + }, + one: function( types, selector, data, fn ) { + return this.on( types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + if ( types && types.preventDefault && types.handleObj ) { + // ( event ) dispatched jQuery.Event + var handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + // ( types-object [, selector] ) + for ( var type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each(function() { + jQuery.event.remove( this, types, fn, selector ); + }); + }, + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + live: function( types, data, fn ) { + jQuery( this.context ).on( types, this.selector, data, fn ); + return this; + }, + die: function( types, fn ) { + jQuery( this.context ).off( types, this.selector || "**", fn ); + return this; + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); + }, + + trigger: function( type, data ) { + return this.each(function() { + jQuery.event.trigger( type, data, this ); + }); + }, + triggerHandler: function( type, data ) { + if ( this[0] ) { + return jQuery.event.trigger( type, data, this[0], true ); + } + }, + + toggle: function( fn ) { + // Save reference to arguments for access in closure + var args = arguments, + guid = fn.guid || jQuery.guid++, + i = 0, + toggler = function( event ) { + // Figure out which function to execute + var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i; + jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 ); + + // Make sure that clicks stop + event.preventDefault(); + + // and execute the function + return args[ lastToggle ].apply( this, arguments ) || false; + }; + + // link all the functions, so any of them can unbind this click handler + toggler.guid = guid; + while ( i < args.length ) { + args[ i++ ].guid = guid; + } + + return this.click( toggler ); + }, + + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } }); -function liveHandler( event ) { - var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret, - elems = [], - selectors = [], - events = jQuery._data( this, "events" ); - - // Make sure we avoid non-left-click bubbling in Firefox (#3861) and disabled elements in IE (#6911) - if ( event.liveFired === this || !events || !events.live || event.target.disabled || event.button && event.type === "click" ) { - return; - } - - if ( event.namespace ) { - namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)"); - } - - event.liveFired = this; - - var live = events.live.slice(0); - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) { - selectors.push( handleObj.selector ); - - } else { - live.splice( j--, 1 ); - } - } - - match = jQuery( event.target ).closest( selectors, event.currentTarget ); - - for ( i = 0, l = match.length; i < l; i++ ) { - close = match[i]; - - for ( j = 0; j < live.length; j++ ) { - handleObj = live[j]; - - if ( close.selector === handleObj.selector && (!namespace || namespace.test( handleObj.namespace )) && !close.elem.disabled ) { - elem = close.elem; - related = null; - - // Those two events require additional checking - if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) { - event.type = handleObj.preType; - related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0]; - - // Make sure not to accidentally match a child element with the same selector - if ( related && jQuery.contains( elem, related ) ) { - related = elem; - } - } - - if ( !related || related !== elem ) { - elems.push({ elem: elem, handleObj: handleObj, level: close.level }); - } - } - } - } - - for ( i = 0, l = elems.length; i < l; i++ ) { - match = elems[i]; - - if ( maxLevel && match.level > maxLevel ) { - break; - } - - event.currentTarget = match.elem; - event.data = match.handleObj.data; - event.handleObj = match.handleObj; - - ret = match.handleObj.origHandler.apply( match.elem, arguments ); - - if ( ret === false || event.isPropagationStopped() ) { - maxLevel = match.level; - - if ( ret === false ) { - stop = false; - } - if ( event.isImmediatePropagationStopped() ) { - break; - } - } - } - - return stop; -} - -function liveConvert( type, selector ) { - return (type && type !== "*" ? type + "." : "") + selector.replace(rperiod, "`").replace(rspaces, "&"); -} - jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup error").split(" "), function( i, name ) { + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) { - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - if ( fn == null ) { - fn = data; - data = null; - } - - return arguments.length > 0 ? - this.bind( name, data, fn ) : - this.trigger( name ); - }; - - if ( jQuery.attrFn ) { - jQuery.attrFn[ name ] = true; - } + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + if ( fn == null ) { + fn = data; + data = null; + } + + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; + + if ( jQuery.attrFn ) { + jQuery.attrFn[ name ] = true; + } + + if ( rkeyEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks; + } + + if ( rmouseEvent.test( name ) ) { + jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks; + } }); @@ -3776,867 +3946,919 @@ (function(){ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, - done = 0, - toString = Object.prototype.toString, - hasDuplicate = false, - baseHasDuplicate = true, - rBackslash = /\\/g, - rNonWord = /\W/; + expando = "sizcache" + (Math.random() + '').replace('.', ''), + done = 0, + toString = Object.prototype.toString, + hasDuplicate = false, + baseHasDuplicate = true, + rBackslash = /\\/g, + rReturn = /\r\n/g, + rNonWord = /\W/; // Here we check if the JavaScript engine is using some sort of // optimization where it does not always call our comparision // function. If that is the case, discard the hasDuplicate value. // Thus far that includes Google Chrome. [0, 0].sort(function() { - baseHasDuplicate = false; - return 0; + baseHasDuplicate = false; + return 0; }); var Sizzle = function( selector, context, results, seed ) { - results = results || []; - context = context || document; + results = results || []; + context = context || document; - var origContext = context; + var origContext = context; - if ( context.nodeType !== 1 && context.nodeType !== 9 ) { - return []; - } - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - var m, set, checkSet, extra, ret, cur, pop, i, - prune = true, - contextXML = Sizzle.isXML( context ), - parts = [], - soFar = selector; - - // Reset the position of the chunker regexp (start from head) - do { - chunker.exec( "" ); - m = chunker.exec( soFar ); - - if ( m ) { - soFar = m[3]; - - parts.push( m[1] ); - - if ( m[2] ) { - extra = m[3]; - break; - } - } - } while ( m ); - - if ( parts.length > 1 && origPOS.exec( selector ) ) { - - if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { - set = posProcess( parts[0] + parts[1], context ); - - } else { - set = Expr.relative[ parts[0] ] ? - [ context ] : - Sizzle( parts.shift(), context ); - - while ( parts.length ) { - selector = parts.shift(); - - if ( Expr.relative[ selector ] ) { - selector += parts.shift(); - } - - set = posProcess( selector, set ); - } - } - - } else { - // Take a shortcut and set the context if the root selector is an ID - // (but not if it'll be faster if the inner selector is an ID) - if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && - Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { - - ret = Sizzle.find( parts.shift(), context, contextXML ); - context = ret.expr ? - Sizzle.filter( ret.expr, ret.set )[0] : - ret.set[0]; - } - - if ( context ) { - ret = seed ? - { expr: parts.pop(), set: makeArray(seed) } : - Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); - - set = ret.expr ? - Sizzle.filter( ret.expr, ret.set ) : - ret.set; - - if ( parts.length > 0 ) { - checkSet = makeArray( set ); - - } else { - prune = false; - } - - while ( parts.length ) { - cur = parts.pop(); - pop = cur; - - if ( !Expr.relative[ cur ] ) { - cur = ""; - } else { - pop = parts.pop(); - } - - if ( pop == null ) { - pop = context; - } - - Expr.relative[ cur ]( checkSet, pop, contextXML ); - } - - } else { - checkSet = parts = []; - } - } - - if ( !checkSet ) { - checkSet = set; - } - - if ( !checkSet ) { - Sizzle.error( cur || selector ); - } - - if ( toString.call(checkSet) === "[object Array]" ) { - if ( !prune ) { - results.push.apply( results, checkSet ); - - } else if ( context && context.nodeType === 1 ) { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { - results.push( set[i] ); - } - } - - } else { - for ( i = 0; checkSet[i] != null; i++ ) { - if ( checkSet[i] && checkSet[i].nodeType === 1 ) { - results.push( set[i] ); - } - } - } - - } else { - makeArray( checkSet, results ); - } - - if ( extra ) { - Sizzle( extra, origContext, results, seed ); - Sizzle.uniqueSort( results ); - } + if ( context.nodeType !== 1 && context.nodeType !== 9 ) { + return []; + } + + if ( !selector || typeof selector !== "string" ) { + return results; + } + + var m, set, checkSet, extra, ret, cur, pop, i, + prune = true, + contextXML = Sizzle.isXML( context ), + parts = [], + soFar = selector; + + // Reset the position of the chunker regexp (start from head) + do { + chunker.exec( "" ); + m = chunker.exec( soFar ); + + if ( m ) { + soFar = m[3]; + + parts.push( m[1] ); + + if ( m[2] ) { + extra = m[3]; + break; + } + } + } while ( m ); + + if ( parts.length > 1 && origPOS.exec( selector ) ) { + + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { + set = posProcess( parts[0] + parts[1], context, seed ); + + } else { + set = Expr.relative[ parts[0] ] ? + [ context ] : + Sizzle( parts.shift(), context ); + + while ( parts.length ) { + selector = parts.shift(); + + if ( Expr.relative[ selector ] ) { + selector += parts.shift(); + } + + set = posProcess( selector, set, seed ); + } + } + + } else { + // Take a shortcut and set the context if the root selector is an ID + // (but not if it'll be faster if the inner selector is an ID) + if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && + Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { + + ret = Sizzle.find( parts.shift(), context, contextXML ); + context = ret.expr ? + Sizzle.filter( ret.expr, ret.set )[0] : + ret.set[0]; + } + + if ( context ) { + ret = seed ? + { expr: parts.pop(), set: makeArray(seed) } : + Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); + + set = ret.expr ? + Sizzle.filter( ret.expr, ret.set ) : + ret.set; + + if ( parts.length > 0 ) { + checkSet = makeArray( set ); + + } else { + prune = false; + } + + while ( parts.length ) { + cur = parts.pop(); + pop = cur; + + if ( !Expr.relative[ cur ] ) { + cur = ""; + } else { + pop = parts.pop(); + } + + if ( pop == null ) { + pop = context; + } + + Expr.relative[ cur ]( checkSet, pop, contextXML ); + } + + } else { + checkSet = parts = []; + } + } + + if ( !checkSet ) { + checkSet = set; + } + + if ( !checkSet ) { + Sizzle.error( cur || selector ); + } + + if ( toString.call(checkSet) === "[object Array]" ) { + if ( !prune ) { + results.push.apply( results, checkSet ); + + } else if ( context && context.nodeType === 1 ) { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) { + results.push( set[i] ); + } + } + + } else { + for ( i = 0; checkSet[i] != null; i++ ) { + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { + results.push( set[i] ); + } + } + } + + } else { + makeArray( checkSet, results ); + } + + if ( extra ) { + Sizzle( extra, origContext, results, seed ); + Sizzle.uniqueSort( results ); + } - return results; + return results; }; Sizzle.uniqueSort = function( results ) { - if ( sortOrder ) { - hasDuplicate = baseHasDuplicate; - results.sort( sortOrder ); - - if ( hasDuplicate ) { - for ( var i = 1; i < results.length; i++ ) { - if ( results[i] === results[ i - 1 ] ) { - results.splice( i--, 1 ); - } - } - } - } + if ( sortOrder ) { + hasDuplicate = baseHasDuplicate; + results.sort( sortOrder ); + + if ( hasDuplicate ) { + for ( var i = 1; i < results.length; i++ ) { + if ( results[i] === results[ i - 1 ] ) { + results.splice( i--, 1 ); + } + } + } + } - return results; + return results; }; Sizzle.matches = function( expr, set ) { - return Sizzle( expr, null, null, set ); + return Sizzle( expr, null, null, set ); }; Sizzle.matchesSelector = function( node, expr ) { - return Sizzle( expr, null, null, [node] ).length > 0; + return Sizzle( expr, null, null, [node] ).length > 0; }; Sizzle.find = function( expr, context, isXML ) { - var set; + var set, i, len, match, type, left; - if ( !expr ) { - return []; - } - - for ( var i = 0, l = Expr.order.length; i < l; i++ ) { - var match, - type = Expr.order[i]; - - if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { - var left = match[1]; - match.splice( 1, 1 ); - - if ( left.substr( left.length - 1 ) !== "\\" ) { - match[1] = (match[1] || "").replace( rBackslash, "" ); - set = Expr.find[ type ]( match, context, isXML ); - - if ( set != null ) { - expr = expr.replace( Expr.match[ type ], "" ); - break; - } - } - } - } - - if ( !set ) { - set = typeof context.getElementsByTagName !== "undefined" ? - context.getElementsByTagName( "*" ) : - []; - } + if ( !expr ) { + return []; + } + + for ( i = 0, len = Expr.order.length; i < len; i++ ) { + type = Expr.order[i]; + + if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { + left = match[1]; + match.splice( 1, 1 ); + + if ( left.substr( left.length - 1 ) !== "\\" ) { + match[1] = (match[1] || "").replace( rBackslash, "" ); + set = Expr.find[ type ]( match, context, isXML ); + + if ( set != null ) { + expr = expr.replace( Expr.match[ type ], "" ); + break; + } + } + } + } + + if ( !set ) { + set = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( "*" ) : + []; + } - return { set: set, expr: expr }; + return { set: set, expr: expr }; }; Sizzle.filter = function( expr, set, inplace, not ) { - var match, anyFound, - old = expr, - result = [], - curLoop = set, - isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); - - while ( expr && set.length ) { - for ( var type in Expr.filter ) { - if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { - var found, item, - filter = Expr.filter[ type ], - left = match[1]; - - anyFound = false; - - match.splice(1,1); - - if ( left.substr( left.length - 1 ) === "\\" ) { - continue; - } - - if ( curLoop === result ) { - result = []; - } - - if ( Expr.preFilter[ type ] ) { - match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); - - if ( !match ) { - anyFound = found = true; - - } else if ( match === true ) { - continue; - } - } - - if ( match ) { - for ( var i = 0; (item = curLoop[i]) != null; i++ ) { - if ( item ) { - found = filter( item, match, i, curLoop ); - var pass = not ^ !!found; - - if ( inplace && found != null ) { - if ( pass ) { - anyFound = true; - - } else { - curLoop[i] = false; - } - - } else if ( pass ) { - result.push( item ); - anyFound = true; - } - } - } - } - - if ( found !== undefined ) { - if ( !inplace ) { - curLoop = result; - } - - expr = expr.replace( Expr.match[ type ], "" ); - - if ( !anyFound ) { - return []; - } - - break; - } - } - } - - // Improper expression - if ( expr === old ) { - if ( anyFound == null ) { - Sizzle.error( expr ); - - } else { - break; - } - } + var match, anyFound, + type, found, item, filter, left, + i, pass, + old = expr, + result = [], + curLoop = set, + isXMLFilter = set && set[0] && Sizzle.isXML( set[0] ); + + while ( expr && set.length ) { + for ( type in Expr.filter ) { + if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) { + filter = Expr.filter[ type ]; + left = match[1]; + + anyFound = false; + + match.splice(1,1); + + if ( left.substr( left.length - 1 ) === "\\" ) { + continue; + } + + if ( curLoop === result ) { + result = []; + } + + if ( Expr.preFilter[ type ] ) { + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + + if ( !match ) { + anyFound = found = true; + + } else if ( match === true ) { + continue; + } + } + + if ( match ) { + for ( i = 0; (item = curLoop[i]) != null; i++ ) { + if ( item ) { + found = filter( item, match, i, curLoop ); + pass = not ^ found; + + if ( inplace && found != null ) { + if ( pass ) { + anyFound = true; + + } else { + curLoop[i] = false; + } + + } else if ( pass ) { + result.push( item ); + anyFound = true; + } + } + } + } + + if ( found !== undefined ) { + if ( !inplace ) { + curLoop = result; + } + + expr = expr.replace( Expr.match[ type ], "" ); + + if ( !anyFound ) { + return []; + } + + break; + } + } + } + + // Improper expression + if ( expr === old ) { + if ( anyFound == null ) { + Sizzle.error( expr ); + + } else { + break; + } + } - old = expr; - } + old = expr; + } - return curLoop; + return curLoop; }; Sizzle.error = function( msg ) { - throw "Syntax error, unrecognized expression: " + msg; + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Utility function for retreiving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +var getText = Sizzle.getText = function( elem ) { + var i, node, + nodeType = elem.nodeType, + ret = ""; + + if ( nodeType ) { + if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent || innerText for elements + if ( typeof elem.textContent === 'string' ) { + return elem.textContent; + } else if ( typeof elem.innerText === 'string' ) { + // Replace IE's carriage returns + return elem.innerText.replace( rReturn, '' ); + } else { + // Traverse it's children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + } else { + + // If no nodeType, this is expected to be an array + for ( i = 0; (node = elem[i]); i++ ) { + // Do not traverse comment nodes + if ( node.nodeType !== 8 ) { + ret += getText( node ); + } + } + } + return ret; }; var Expr = Sizzle.selectors = { - order: [ "ID", "NAME", "TAG" ], + order: [ "ID", "NAME", "TAG" ], - match: { - ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, - NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, - ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, - TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, - CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, - POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, - PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ - }, - - leftMatch: {}, - - attrMap: { - "class": "className", - "for": "htmlFor" - }, - - attrHandle: { - href: function( elem ) { - return elem.getAttribute( "href" ); - }, - type: function( elem ) { - return elem.getAttribute( "type" ); - } - }, - - relative: { - "+": function(checkSet, part){ - var isPartStr = typeof part === "string", - isTag = isPartStr && !rNonWord.test( part ), - isPartStrNotTag = isPartStr && !isTag; - - if ( isTag ) { - part = part.toLowerCase(); - } - - for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { - if ( (elem = checkSet[i]) ) { - while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} - - checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? - elem || false : - elem === part; - } - } - - if ( isPartStrNotTag ) { - Sizzle.filter( part, checkSet, true ); - } - }, - - ">": function( checkSet, part ) { - var elem, - isPartStr = typeof part === "string", - i = 0, - l = checkSet.length; - - if ( isPartStr && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - var parent = elem.parentNode; - checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; - } - } - - } else { - for ( ; i < l; i++ ) { - elem = checkSet[i]; - - if ( elem ) { - checkSet[i] = isPartStr ? - elem.parentNode : - elem.parentNode === part; - } - } - - if ( isPartStr ) { - Sizzle.filter( part, checkSet, true ); - } - } - }, - - "": function(checkSet, part, isXML){ - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); - }, - - "~": function( checkSet, part, isXML ) { - var nodeCheck, - doneName = done++, - checkFn = dirCheck; - - if ( typeof part === "string" && !rNonWord.test( part ) ) { - part = part.toLowerCase(); - nodeCheck = part; - checkFn = dirNodeCheck; - } - - checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); - } - }, - - find: { - ID: function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }, - - NAME: function( match, context ) { - if ( typeof context.getElementsByName !== "undefined" ) { - var ret = [], - results = context.getElementsByName( match[1] ); - - for ( var i = 0, l = results.length; i < l; i++ ) { - if ( results[i].getAttribute("name") === match[1] ) { - ret.push( results[i] ); - } - } - - return ret.length === 0 ? null : ret; - } - }, - - TAG: function( match, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( match[1] ); - } - } - }, - preFilter: { - CLASS: function( match, curLoop, inplace, result, not, isXML ) { - match = " " + match[1].replace( rBackslash, "" ) + " "; - - if ( isXML ) { - return match; - } - - for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { - if ( elem ) { - if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { - if ( !inplace ) { - result.push( elem ); - } - - } else if ( inplace ) { - curLoop[i] = false; - } - } - } - - return false; - }, - - ID: function( match ) { - return match[1].replace( rBackslash, "" ); - }, - - TAG: function( match, curLoop ) { - return match[1].replace( rBackslash, "" ).toLowerCase(); - }, - - CHILD: function( match ) { - if ( match[1] === "nth" ) { - if ( !match[2] ) { - Sizzle.error( match[0] ); - } - - match[2] = match[2].replace(/^\+|\s*/g, ''); - - // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' - var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( - match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || - !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); - - // calculate the numbers (first)n+(last) including if they are negative - match[2] = (test[1] + (test[2] || 1)) - 0; - match[3] = test[3] - 0; - } - else if ( match[2] ) { - Sizzle.error( match[0] ); - } - - // TODO: Move to normal caching system - match[0] = done++; - - return match; - }, - - ATTR: function( match, curLoop, inplace, result, not, isXML ) { - var name = match[1] = match[1].replace( rBackslash, "" ); - - if ( !isXML && Expr.attrMap[name] ) { - match[1] = Expr.attrMap[name]; - } - - // Handle if an un-quoted value was used - match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); - - if ( match[2] === "~=" ) { - match[4] = " " + match[4] + " "; - } - - return match; - }, - - PSEUDO: function( match, curLoop, inplace, result, not ) { - if ( match[1] === "not" ) { - // If we're dealing with a complex expression, or a simple one - if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { - match[3] = Sizzle(match[3], null, null, curLoop); - - } else { - var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); - - if ( !inplace ) { - result.push.apply( result, ret ); - } - - return false; - } - - } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { - return true; - } - - return match; - }, - - POS: function( match ) { - match.unshift( true ); - - return match; - } - }, - - filters: { - enabled: function( elem ) { - return elem.disabled === false && elem.type !== "hidden"; - }, - - disabled: function( elem ) { - return elem.disabled === true; - }, - - checked: function( elem ) { - return elem.checked === true; - }, - - selected: function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - parent: function( elem ) { - return !!elem.firstChild; - }, - - empty: function( elem ) { - return !elem.firstChild; - }, - - has: function( elem, i, match ) { - return !!Sizzle( match[3], elem ).length; - }, - - header: function( elem ) { - return (/h\d/i).test( elem.nodeName ); - }, - - text: function( elem ) { - var attr = elem.getAttribute( "type" ), type = elem.type; - // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) - // use getAttribute instead to test this case - return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); - }, - - radio: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; - }, - - checkbox: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; - }, - - file: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; - }, - - password: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; - }, - - submit: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "submit" === elem.type; - }, - - image: function( elem ) { - return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; - }, - - reset: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && "reset" === elem.type; - }, - - button: function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && "button" === elem.type || name === "button"; - }, - - input: function( elem ) { - return (/input|select|textarea|button/i).test( elem.nodeName ); - }, - - focus: function( elem ) { - return elem === elem.ownerDocument.activeElement; - } - }, - setFilters: { - first: function( elem, i ) { - return i === 0; - }, - - last: function( elem, i, match, array ) { - return i === array.length - 1; - }, - - even: function( elem, i ) { - return i % 2 === 0; - }, - - odd: function( elem, i ) { - return i % 2 === 1; - }, - - lt: function( elem, i, match ) { - return i < match[3] - 0; - }, - - gt: function( elem, i, match ) { - return i > match[3] - 0; - }, - - nth: function( elem, i, match ) { - return match[3] - 0 === i; - }, - - eq: function( elem, i, match ) { - return match[3] - 0 === i; - } - }, - filter: { - PSEUDO: function( elem, match, i, array ) { - var name = match[1], - filter = Expr.filters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - - } else if ( name === "contains" ) { - return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0; - - } else if ( name === "not" ) { - var not = match[3]; - - for ( var j = 0, l = not.length; j < l; j++ ) { - if ( not[j] === elem ) { - return false; - } - } - - return true; - - } else { - Sizzle.error( name ); - } - }, - - CHILD: function( elem, match ) { - var type = match[1], - node = elem; - - switch ( type ) { - case "only": - case "first": - while ( (node = node.previousSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - if ( type === "first" ) { - return true; - } - - node = elem; - - case "last": - while ( (node = node.nextSibling) ) { - if ( node.nodeType === 1 ) { - return false; - } - } - - return true; - - case "nth": - var first = match[2], - last = match[3]; - - if ( first === 1 && last === 0 ) { - return true; - } - - var doneName = match[0], - parent = elem.parentNode; - - if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { - var count = 0; - - for ( node = parent.firstChild; node; node = node.nextSibling ) { - if ( node.nodeType === 1 ) { - node.nodeIndex = ++count; - } - } - - parent.sizcache = doneName; - } - - var diff = elem.nodeIndex - last; - - if ( first === 0 ) { - return diff === 0; - - } else { - return ( diff % first === 0 && diff / first >= 0 ); - } - } - }, - - ID: function( elem, match ) { - return elem.nodeType === 1 && elem.getAttribute("id") === match; - }, - - TAG: function( elem, match ) { - return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match; - }, - - CLASS: function( elem, match ) { - return (" " + (elem.className || elem.getAttribute("class")) + " ") - .indexOf( match ) > -1; - }, - - ATTR: function( elem, match ) { - var name = match[1], - result = Expr.attrHandle[ name ] ? - Expr.attrHandle[ name ]( elem ) : - elem[ name ] != null ? - elem[ name ] : - elem.getAttribute( name ), - value = result + "", - type = match[2], - check = match[4]; - - return result == null ? - type === "!=" : - type === "=" ? - value === check : - type === "*=" ? - value.indexOf(check) >= 0 : - type === "~=" ? - (" " + value + " ").indexOf(check) >= 0 : - !check ? - value && result !== false : - type === "!=" ? - value !== check : - type === "^=" ? - value.indexOf(check) === 0 : - type === "$=" ? - value.substr(value.length - check.length) === check : - type === "|=" ? - value === check || value.substr(0, check.length + 1) === check + "-" : - false; - }, - - POS: function( elem, match, i, array ) { - var name = match[2], - filter = Expr.setFilters[ name ]; - - if ( filter ) { - return filter( elem, i, match, array ); - } - } - } + match: { + ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/, + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/, + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/, + TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/, + CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/, + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/, + PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/ + }, + + leftMatch: {}, + + attrMap: { + "class": "className", + "for": "htmlFor" + }, + + attrHandle: { + href: function( elem ) { + return elem.getAttribute( "href" ); + }, + type: function( elem ) { + return elem.getAttribute( "type" ); + } + }, + + relative: { + "+": function(checkSet, part){ + var isPartStr = typeof part === "string", + isTag = isPartStr && !rNonWord.test( part ), + isPartStrNotTag = isPartStr && !isTag; + + if ( isTag ) { + part = part.toLowerCase(); + } + + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { + if ( (elem = checkSet[i]) ) { + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + + checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ? + elem || false : + elem === part; + } + } + + if ( isPartStrNotTag ) { + Sizzle.filter( part, checkSet, true ); + } + }, + + ">": function( checkSet, part ) { + var elem, + isPartStr = typeof part === "string", + i = 0, + l = checkSet.length; + + if ( isPartStr && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + var parent = elem.parentNode; + checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false; + } + } + + } else { + for ( ; i < l; i++ ) { + elem = checkSet[i]; + + if ( elem ) { + checkSet[i] = isPartStr ? + elem.parentNode : + elem.parentNode === part; + } + } + + if ( isPartStr ) { + Sizzle.filter( part, checkSet, true ); + } + } + }, + + "": function(checkSet, part, isXML){ + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML ); + }, + + "~": function( checkSet, part, isXML ) { + var nodeCheck, + doneName = done++, + checkFn = dirCheck; + + if ( typeof part === "string" && !rNonWord.test( part ) ) { + part = part.toLowerCase(); + nodeCheck = part; + checkFn = dirNodeCheck; + } + + checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML ); + } + }, + + find: { + ID: function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [m] : []; + } + }, + + NAME: function( match, context ) { + if ( typeof context.getElementsByName !== "undefined" ) { + var ret = [], + results = context.getElementsByName( match[1] ); + + for ( var i = 0, l = results.length; i < l; i++ ) { + if ( results[i].getAttribute("name") === match[1] ) { + ret.push( results[i] ); + } + } + + return ret.length === 0 ? null : ret; + } + }, + + TAG: function( match, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( match[1] ); + } + } + }, + preFilter: { + CLASS: function( match, curLoop, inplace, result, not, isXML ) { + match = " " + match[1].replace( rBackslash, "" ) + " "; + + if ( isXML ) { + return match; + } + + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { + if ( elem ) { + if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) { + if ( !inplace ) { + result.push( elem ); + } + + } else if ( inplace ) { + curLoop[i] = false; + } + } + } + + return false; + }, + + ID: function( match ) { + return match[1].replace( rBackslash, "" ); + }, + + TAG: function( match, curLoop ) { + return match[1].replace( rBackslash, "" ).toLowerCase(); + }, + + CHILD: function( match ) { + if ( match[1] === "nth" ) { + if ( !match[2] ) { + Sizzle.error( match[0] ); + } + + match[2] = match[2].replace(/^\+|\s*/g, ''); + + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' + var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec( + match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" || + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + + // calculate the numbers (first)n+(last) including if they are negative + match[2] = (test[1] + (test[2] || 1)) - 0; + match[3] = test[3] - 0; + } + else if ( match[2] ) { + Sizzle.error( match[0] ); + } + + // TODO: Move to normal caching system + match[0] = done++; + + return match; + }, + + ATTR: function( match, curLoop, inplace, result, not, isXML ) { + var name = match[1] = match[1].replace( rBackslash, "" ); + + if ( !isXML && Expr.attrMap[name] ) { + match[1] = Expr.attrMap[name]; + } + + // Handle if an un-quoted value was used + match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" ); + + if ( match[2] === "~=" ) { + match[4] = " " + match[4] + " "; + } + + return match; + }, + + PSEUDO: function( match, curLoop, inplace, result, not ) { + if ( match[1] === "not" ) { + // If we're dealing with a complex expression, or a simple one + if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { + match[3] = Sizzle(match[3], null, null, curLoop); + + } else { + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); + + if ( !inplace ) { + result.push.apply( result, ret ); + } + + return false; + } + + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { + return true; + } + + return match; + }, + + POS: function( match ) { + match.unshift( true ); + + return match; + } + }, + + filters: { + enabled: function( elem ) { + return elem.disabled === false && elem.type !== "hidden"; + }, + + disabled: function( elem ) { + return elem.disabled === true; + }, + + checked: function( elem ) { + return elem.checked === true; + }, + + selected: function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + parent: function( elem ) { + return !!elem.firstChild; + }, + + empty: function( elem ) { + return !elem.firstChild; + }, + + has: function( elem, i, match ) { + return !!Sizzle( match[3], elem ).length; + }, + + header: function( elem ) { + return (/h\d/i).test( elem.nodeName ); + }, + + text: function( elem ) { + var attr = elem.getAttribute( "type" ), type = elem.type; + // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc) + // use getAttribute instead to test this case + return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null ); + }, + + radio: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type; + }, + + checkbox: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type; + }, + + file: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "file" === elem.type; + }, + + password: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "password" === elem.type; + }, + + submit: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "submit" === elem.type; + }, + + image: function( elem ) { + return elem.nodeName.toLowerCase() === "input" && "image" === elem.type; + }, + + reset: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && "reset" === elem.type; + }, + + button: function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && "button" === elem.type || name === "button"; + }, + + input: function( elem ) { + return (/input|select|textarea|button/i).test( elem.nodeName ); + }, + + focus: function( elem ) { + return elem === elem.ownerDocument.activeElement; + } + }, + setFilters: { + first: function( elem, i ) { + return i === 0; + }, + + last: function( elem, i, match, array ) { + return i === array.length - 1; + }, + + even: function( elem, i ) { + return i % 2 === 0; + }, + + odd: function( elem, i ) { + return i % 2 === 1; + }, + + lt: function( elem, i, match ) { + return i < match[3] - 0; + }, + + gt: function( elem, i, match ) { + return i > match[3] - 0; + }, + + nth: function( elem, i, match ) { + return match[3] - 0 === i; + }, + + eq: function( elem, i, match ) { + return match[3] - 0 === i; + } + }, + filter: { + PSEUDO: function( elem, match, i, array ) { + var name = match[1], + filter = Expr.filters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + + } else if ( name === "contains" ) { + return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0; + + } else if ( name === "not" ) { + var not = match[3]; + + for ( var j = 0, l = not.length; j < l; j++ ) { + if ( not[j] === elem ) { + return false; + } + } + + return true; + + } else { + Sizzle.error( name ); + } + }, + + CHILD: function( elem, match ) { + var first, last, + doneName, parent, cache, + count, diff, + type = match[1], + node = elem; + + switch ( type ) { + case "only": + case "first": + while ( (node = node.previousSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + if ( type === "first" ) { + return true; + } + + node = elem; + + /* falls through */ + case "last": + while ( (node = node.nextSibling) ) { + if ( node.nodeType === 1 ) { + return false; + } + } + + return true; + + case "nth": + first = match[2]; + last = match[3]; + + if ( first === 1 && last === 0 ) { + return true; + } + + doneName = match[0]; + parent = elem.parentNode; + + if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) { + count = 0; + + for ( node = parent.firstChild; node; node = node.nextSibling ) { + if ( node.nodeType === 1 ) { + node.nodeIndex = ++count; + } + } + + parent[ expando ] = doneName; + } + + diff = elem.nodeIndex - last; + + if ( first === 0 ) { + return diff === 0; + + } else { + return ( diff % first === 0 && diff / first >= 0 ); + } + } + }, + + ID: function( elem, match ) { + return elem.nodeType === 1 && elem.getAttribute("id") === match; + }, + + TAG: function( elem, match ) { + return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match; + }, + + CLASS: function( elem, match ) { + return (" " + (elem.className || elem.getAttribute("class")) + " ") + .indexOf( match ) > -1; + }, + + ATTR: function( elem, match ) { + var name = match[1], + result = Sizzle.attr ? + Sizzle.attr( elem, name ) : + Expr.attrHandle[ name ] ? + Expr.attrHandle[ name ]( elem ) : + elem[ name ] != null ? + elem[ name ] : + elem.getAttribute( name ), + value = result + "", + type = match[2], + check = match[4]; + + return result == null ? + type === "!=" : + !type && Sizzle.attr ? + result != null : + type === "=" ? + value === check : + type === "*=" ? + value.indexOf(check) >= 0 : + type === "~=" ? + (" " + value + " ").indexOf(check) >= 0 : + !check ? + value && result !== false : + type === "!=" ? + value !== check : + type === "^=" ? + value.indexOf(check) === 0 : + type === "$=" ? + value.substr(value.length - check.length) === check : + type === "|=" ? + value === check || value.substr(0, check.length + 1) === check + "-" : + false; + }, + + POS: function( elem, match, i, array ) { + var name = match[2], + filter = Expr.setFilters[ name ]; + + if ( filter ) { + return filter( elem, i, match, array ); + } + } + } }; var origPOS = Expr.match.POS, - fescape = function(all, num){ - return "\\" + (num - 0 + 1); - }; + fescape = function(all, num){ + return "\\" + (num - 0 + 1); + }; for ( var type in Expr.match ) { - Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); - Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); + Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) ); + Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) ); } +// Expose origPOS +// "global" as in regardless of relation to brackets/parens +Expr.match.globalPOS = origPOS; var makeArray = function( array, results ) { - array = Array.prototype.slice.call( array, 0 ); + array = Array.prototype.slice.call( array, 0 ); - if ( results ) { - results.push.apply( results, array ); - return results; - } + if ( results ) { + results.push.apply( results, array ); + return results; + } - return array; + return array; }; // Perform a simple check to determine if the browser is capable of @@ -4644,538 +4866,521 @@ // Also verifies that the returned array holds DOM nodes // (which is not the case in the Blackberry browser) try { - Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; + Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType; // Provide a fallback method if it does not work } catch( e ) { - makeArray = function( array, results ) { - var i = 0, - ret = results || []; - - if ( toString.call(array) === "[object Array]" ) { - Array.prototype.push.apply( ret, array ); - - } else { - if ( typeof array.length === "number" ) { - for ( var l = array.length; i < l; i++ ) { - ret.push( array[i] ); - } - - } else { - for ( ; array[i]; i++ ) { - ret.push( array[i] ); - } - } - } + makeArray = function( array, results ) { + var i = 0, + ret = results || []; + + if ( toString.call(array) === "[object Array]" ) { + Array.prototype.push.apply( ret, array ); + + } else { + if ( typeof array.length === "number" ) { + for ( var l = array.length; i < l; i++ ) { + ret.push( array[i] ); + } + + } else { + for ( ; array[i]; i++ ) { + ret.push( array[i] ); + } + } + } - return ret; - }; + return ret; + }; } var sortOrder, siblingCheck; if ( document.documentElement.compareDocumentPosition ) { - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { - return a.compareDocumentPosition ? -1 : 1; - } + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { + return a.compareDocumentPosition ? -1 : 1; + } - return a.compareDocumentPosition(b) & 4 ? -1 : 1; - }; + return a.compareDocumentPosition(b) & 4 ? -1 : 1; + }; } else { - sortOrder = function( a, b ) { - // The nodes are identical, we can exit early - if ( a === b ) { - hasDuplicate = true; - return 0; - - // Fallback to using sourceIndex (in IE) if it's available on both nodes - } else if ( a.sourceIndex && b.sourceIndex ) { - return a.sourceIndex - b.sourceIndex; - } - - var al, bl, - ap = [], - bp = [], - aup = a.parentNode, - bup = b.parentNode, - cur = aup; - - // If the nodes are siblings (or identical) we can do a quick check - if ( aup === bup ) { - return siblingCheck( a, b ); - - // If no parents were found then the nodes are disconnected - } else if ( !aup ) { - return -1; - - } else if ( !bup ) { - return 1; - } - - // Otherwise they're somewhere else in the tree so we need - // to build up a full list of the parentNodes for comparison - while ( cur ) { - ap.unshift( cur ); - cur = cur.parentNode; - } - - cur = bup; - - while ( cur ) { - bp.unshift( cur ); - cur = cur.parentNode; - } - - al = ap.length; - bl = bp.length; - - // Start walking down the tree looking for a discrepancy - for ( var i = 0; i < al && i < bl; i++ ) { - if ( ap[i] !== bp[i] ) { - return siblingCheck( ap[i], bp[i] ); - } - } - - // We ended someplace up the tree so do a sibling check - return i === al ? - siblingCheck( a, bp[i], -1 ) : - siblingCheck( ap[i], b, 1 ); - }; - - siblingCheck = function( a, b, ret ) { - if ( a === b ) { - return ret; - } - - var cur = a.nextSibling; - - while ( cur ) { - if ( cur === b ) { - return -1; - } - - cur = cur.nextSibling; - } - - return 1; - }; -} - -// Utility function for retreiving the text value of an array of DOM nodes -Sizzle.getText = function( elems ) { - var ret = "", elem; - - for ( var i = 0; elems[i]; i++ ) { - elem = elems[i]; - - // Get the text from text nodes and CDATA nodes - if ( elem.nodeType === 3 || elem.nodeType === 4 ) { - ret += elem.nodeValue; - - // Traverse everything else, except comment nodes - } else if ( elem.nodeType !== 8 ) { - ret += Sizzle.getText( elem.childNodes ); - } - } + sortOrder = function( a, b ) { + // The nodes are identical, we can exit early + if ( a === b ) { + hasDuplicate = true; + return 0; + + // Fallback to using sourceIndex (in IE) if it's available on both nodes + } else if ( a.sourceIndex && b.sourceIndex ) { + return a.sourceIndex - b.sourceIndex; + } + + var al, bl, + ap = [], + bp = [], + aup = a.parentNode, + bup = b.parentNode, + cur = aup; + + // If the nodes are siblings (or identical) we can do a quick check + if ( aup === bup ) { + return siblingCheck( a, b ); + + // If no parents were found then the nodes are disconnected + } else if ( !aup ) { + return -1; + + } else if ( !bup ) { + return 1; + } + + // Otherwise they're somewhere else in the tree so we need + // to build up a full list of the parentNodes for comparison + while ( cur ) { + ap.unshift( cur ); + cur = cur.parentNode; + } + + cur = bup; + + while ( cur ) { + bp.unshift( cur ); + cur = cur.parentNode; + } + + al = ap.length; + bl = bp.length; + + // Start walking down the tree looking for a discrepancy + for ( var i = 0; i < al && i < bl; i++ ) { + if ( ap[i] !== bp[i] ) { + return siblingCheck( ap[i], bp[i] ); + } + } + + // We ended someplace up the tree so do a sibling check + return i === al ? + siblingCheck( a, bp[i], -1 ) : + siblingCheck( ap[i], b, 1 ); + }; + + siblingCheck = function( a, b, ret ) { + if ( a === b ) { + return ret; + } + + var cur = a.nextSibling; + + while ( cur ) { + if ( cur === b ) { + return -1; + } - return ret; -}; + cur = cur.nextSibling; + } + + return 1; + }; +} // Check to see if the browser returns elements by name when // querying by getElementById (and provide a workaround) (function(){ - // We're going to inject a fake input element with a specified name - var form = document.createElement("div"), - id = "script" + (new Date()).getTime(), - root = document.documentElement; - - form.innerHTML = ""; - - // Inject it into the root element, check its status, and remove it quickly - root.insertBefore( form, root.firstChild ); - - // The workaround has to do additional checks after a getElementById - // Which slows things down for other browsers (hence the branching) - if ( document.getElementById( id ) ) { - Expr.find.ID = function( match, context, isXML ) { - if ( typeof context.getElementById !== "undefined" && !isXML ) { - var m = context.getElementById(match[1]); - - return m ? - m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? - [m] : - undefined : - []; - } - }; - - Expr.filter.ID = function( elem, match ) { - var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); - - return elem.nodeType === 1 && node && node.nodeValue === match; - }; - } + // We're going to inject a fake input element with a specified name + var form = document.createElement("div"), + id = "script" + (new Date()).getTime(), + root = document.documentElement; + + form.innerHTML = ""; + + // Inject it into the root element, check its status, and remove it quickly + root.insertBefore( form, root.firstChild ); + + // The workaround has to do additional checks after a getElementById + // Which slows things down for other browsers (hence the branching) + if ( document.getElementById( id ) ) { + Expr.find.ID = function( match, context, isXML ) { + if ( typeof context.getElementById !== "undefined" && !isXML ) { + var m = context.getElementById(match[1]); + + return m ? + m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? + [m] : + undefined : + []; + } + }; + + Expr.filter.ID = function( elem, match ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + + return elem.nodeType === 1 && node && node.nodeValue === match; + }; + } - root.removeChild( form ); + root.removeChild( form ); - // release memory in IE - root = form = null; + // release memory in IE + root = form = null; })(); (function(){ - // Check to see if the browser returns only elements - // when doing getElementsByTagName("*") + // Check to see if the browser returns only elements + // when doing getElementsByTagName("*") - // Create a fake element - var div = document.createElement("div"); - div.appendChild( document.createComment("") ); - - // Make sure no comments are found - if ( div.getElementsByTagName("*").length > 0 ) { - Expr.find.TAG = function( match, context ) { - var results = context.getElementsByTagName( match[1] ); - - // Filter out possible comments - if ( match[1] === "*" ) { - var tmp = []; - - for ( var i = 0; results[i]; i++ ) { - if ( results[i].nodeType === 1 ) { - tmp.push( results[i] ); - } - } - - results = tmp; - } - - return results; - }; - } - - // Check to see if an attribute returns normalized href attributes - div.innerHTML = ""; - - if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && - div.firstChild.getAttribute("href") !== "#" ) { - - Expr.attrHandle.href = function( elem ) { - return elem.getAttribute( "href", 2 ); - }; - } + // Create a fake element + var div = document.createElement("div"); + div.appendChild( document.createComment("") ); + + // Make sure no comments are found + if ( div.getElementsByTagName("*").length > 0 ) { + Expr.find.TAG = function( match, context ) { + var results = context.getElementsByTagName( match[1] ); + + // Filter out possible comments + if ( match[1] === "*" ) { + var tmp = []; + + for ( var i = 0; results[i]; i++ ) { + if ( results[i].nodeType === 1 ) { + tmp.push( results[i] ); + } + } + + results = tmp; + } + + return results; + }; + } + + // Check to see if an attribute returns normalized href attributes + div.innerHTML = ""; + + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && + div.firstChild.getAttribute("href") !== "#" ) { + + Expr.attrHandle.href = function( elem ) { + return elem.getAttribute( "href", 2 ); + }; + } - // release memory in IE - div = null; + // release memory in IE + div = null; })(); if ( document.querySelectorAll ) { - (function(){ - var oldSizzle = Sizzle, - div = document.createElement("div"), - id = "__sizzle__"; - - div.innerHTML = "

"; - - // Safari can't handle uppercase or unicode characters when - // in quirks mode. - if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { - return; - } - - Sizzle = function( query, context, extra, seed ) { - context = context || document; - - // Only use querySelectorAll on non-XML documents - // (ID selectors don't work in non-HTML documents) - if ( !seed && !Sizzle.isXML(context) ) { - // See if we find a selector to speed up - var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); - - if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { - // Speed-up: Sizzle("TAG") - if ( match[1] ) { - return makeArray( context.getElementsByTagName( query ), extra ); - - // Speed-up: Sizzle(".CLASS") - } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { - return makeArray( context.getElementsByClassName( match[2] ), extra ); - } - } - - if ( context.nodeType === 9 ) { - // Speed-up: Sizzle("body") - // The body element only exists once, optimize finding it - if ( query === "body" && context.body ) { - return makeArray( [ context.body ], extra ); - - // Speed-up: Sizzle("#ID") - } else if ( match && match[3] ) { - var elem = context.getElementById( match[3] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id === match[3] ) { - return makeArray( [ elem ], extra ); - } - - } else { - return makeArray( [], extra ); - } - } - - try { - return makeArray( context.querySelectorAll(query), extra ); - } catch(qsaError) {} - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - var oldContext = context, - old = context.getAttribute( "id" ), - nid = old || id, - hasParent = context.parentNode, - relativeHierarchySelector = /^\s*[+~]/.test( query ); - - if ( !old ) { - context.setAttribute( "id", nid ); - } else { - nid = nid.replace( /'/g, "\\$&" ); - } - if ( relativeHierarchySelector && hasParent ) { - context = context.parentNode; - } - - try { - if ( !relativeHierarchySelector || hasParent ) { - return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); - } - - } catch(pseudoError) { - } finally { - if ( !old ) { - oldContext.removeAttribute( "id" ); - } - } - } - } - - return oldSizzle(query, context, extra, seed); - }; - - for ( var prop in oldSizzle ) { - Sizzle[ prop ] = oldSizzle[ prop ]; - } - - // release memory in IE - div = null; - })(); + (function(){ + var oldSizzle = Sizzle, + div = document.createElement("div"), + id = "__sizzle__"; + + div.innerHTML = "

"; + + // Safari can't handle uppercase or unicode characters when + // in quirks mode. + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { + return; + } + + Sizzle = function( query, context, extra, seed ) { + context = context || document; + + // Only use querySelectorAll on non-XML documents + // (ID selectors don't work in non-HTML documents) + if ( !seed && !Sizzle.isXML(context) ) { + // See if we find a selector to speed up + var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query ); + + if ( match && (context.nodeType === 1 || context.nodeType === 9) ) { + // Speed-up: Sizzle("TAG") + if ( match[1] ) { + return makeArray( context.getElementsByTagName( query ), extra ); + + // Speed-up: Sizzle(".CLASS") + } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) { + return makeArray( context.getElementsByClassName( match[2] ), extra ); + } + } + + if ( context.nodeType === 9 ) { + // Speed-up: Sizzle("body") + // The body element only exists once, optimize finding it + if ( query === "body" && context.body ) { + return makeArray( [ context.body ], extra ); + + // Speed-up: Sizzle("#ID") + } else if ( match && match[3] ) { + var elem = context.getElementById( match[3] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id === match[3] ) { + return makeArray( [ elem ], extra ); + } + + } else { + return makeArray( [], extra ); + } + } + + try { + return makeArray( context.querySelectorAll(query), extra ); + } catch(qsaError) {} + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || id, + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if ( !old ) { + context.setAttribute( "id", nid ); + } else { + nid = nid.replace( /'/g, "\\$&" ); + } + if ( relativeHierarchySelector && hasParent ) { + context = context.parentNode; + } + + try { + if ( !relativeHierarchySelector || hasParent ) { + return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra ); + } + + } catch(pseudoError) { + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } + } + } + + return oldSizzle(query, context, extra, seed); + }; + + for ( var prop in oldSizzle ) { + Sizzle[ prop ] = oldSizzle[ prop ]; + } + + // release memory in IE + div = null; + })(); } (function(){ - var html = document.documentElement, - matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; + var html = document.documentElement, + matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector; - if ( matches ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9 fails this) - var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), - pseudoWorks = false; - - try { - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( document.documentElement, "[test!='']:sizzle" ); - - } catch( pseudoError ) { - pseudoWorks = true; - } - - Sizzle.matchesSelector = function( node, expr ) { - // Make sure that attribute selectors are quoted - expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); - - if ( !Sizzle.isXML( node ) ) { - try { - if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { - var ret = matches.call( node, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || !disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9, so check for that - node.document && node.document.nodeType !== 11 ) { - return ret; - } - } - } catch(e) {} - } - - return Sizzle(expr, null, null, [node]).length > 0; - }; - } + if ( matches ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9 fails this) + var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ), + pseudoWorks = false; + + try { + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( document.documentElement, "[test!='']:sizzle" ); + + } catch( pseudoError ) { + pseudoWorks = true; + } + + Sizzle.matchesSelector = function( node, expr ) { + // Make sure that attribute selectors are quoted + expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']"); + + if ( !Sizzle.isXML( node ) ) { + try { + if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) { + var ret = matches.call( node, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || !disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9, so check for that + node.document && node.document.nodeType !== 11 ) { + return ret; + } + } + } catch(e) {} + } + + return Sizzle(expr, null, null, [node]).length > 0; + }; + } })(); (function(){ - var div = document.createElement("div"); + var div = document.createElement("div"); - div.innerHTML = "
"; + div.innerHTML = "
"; - // Opera can't find a second classname (in 9.6) - // Also, make sure that getElementsByClassName actually exists - if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { - return; - } - - // Safari caches class attributes, doesn't catch changes (in 3.2) - div.lastChild.className = "e"; - - if ( div.getElementsByClassName("e").length === 1 ) { - return; - } - - Expr.order.splice(1, 0, "CLASS"); - Expr.find.CLASS = function( match, context, isXML ) { - if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { - return context.getElementsByClassName(match[1]); - } - }; + // Opera can't find a second classname (in 9.6) + // Also, make sure that getElementsByClassName actually exists + if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) { + return; + } + + // Safari caches class attributes, doesn't catch changes (in 3.2) + div.lastChild.className = "e"; + + if ( div.getElementsByClassName("e").length === 1 ) { + return; + } + + Expr.order.splice(1, 0, "CLASS"); + Expr.find.CLASS = function( match, context, isXML ) { + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { + return context.getElementsByClassName(match[1]); + } + }; - // release memory in IE - div = null; + // release memory in IE + div = null; })(); function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; - if ( elem ) { - var match = false; + if ( elem ) { + var match = false; - elem = elem[dir]; + elem = elem[dir]; - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 && !isXML ){ - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( elem.nodeName.toLowerCase() === cur ) { - match = elem; - break; - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 && !isXML ){ + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( elem.nodeName.toLowerCase() === cur ) { + match = elem; + break; + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } } function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { - for ( var i = 0, l = checkSet.length; i < l; i++ ) { - var elem = checkSet[i]; + for ( var i = 0, l = checkSet.length; i < l; i++ ) { + var elem = checkSet[i]; - if ( elem ) { - var match = false; + if ( elem ) { + var match = false; - elem = elem[dir]; + elem = elem[dir]; - while ( elem ) { - if ( elem.sizcache === doneName ) { - match = checkSet[elem.sizset]; - break; - } - - if ( elem.nodeType === 1 ) { - if ( !isXML ) { - elem.sizcache = doneName; - elem.sizset = i; - } - - if ( typeof cur !== "string" ) { - if ( elem === cur ) { - match = true; - break; - } - - } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { - match = elem; - break; - } - } - - elem = elem[dir]; - } - - checkSet[i] = match; - } - } + while ( elem ) { + if ( elem[ expando ] === doneName ) { + match = checkSet[elem.sizset]; + break; + } + + if ( elem.nodeType === 1 ) { + if ( !isXML ) { + elem[ expando ] = doneName; + elem.sizset = i; + } + + if ( typeof cur !== "string" ) { + if ( elem === cur ) { + match = true; + break; + } + + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { + match = elem; + break; + } + } + + elem = elem[dir]; + } + + checkSet[i] = match; + } + } } if ( document.documentElement.contains ) { - Sizzle.contains = function( a, b ) { - return a !== b && (a.contains ? a.contains(b) : true); - }; + Sizzle.contains = function( a, b ) { + return a !== b && (a.contains ? a.contains(b) : true); + }; } else if ( document.documentElement.compareDocumentPosition ) { - Sizzle.contains = function( a, b ) { - return !!(a.compareDocumentPosition(b) & 16); - }; + Sizzle.contains = function( a, b ) { + return !!(a.compareDocumentPosition(b) & 16); + }; } else { - Sizzle.contains = function() { - return false; - }; + Sizzle.contains = function() { + return false; + }; } Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; + return documentElement ? documentElement.nodeName !== "HTML" : false; }; -var posProcess = function( selector, context ) { - var match, - tmpSet = [], - later = "", - root = context.nodeType ? [context] : context; - - // Position selectors must be done after the filter - // And so must :not(positional) so we move all PSEUDOs to the end - while ( (match = Expr.match.PSEUDO.exec( selector )) ) { - later += match[0]; - selector = selector.replace( Expr.match.PSEUDO, "" ); - } - - selector = Expr.relative[selector] ? selector + "*" : selector; - - for ( var i = 0, l = root.length; i < l; i++ ) { - Sizzle( selector, root[i], tmpSet ); - } +var posProcess = function( selector, context, seed ) { + var match, + tmpSet = [], + later = "", + root = context.nodeType ? [context] : context; + + // Position selectors must be done after the filter + // And so must :not(positional) so we move all PSEUDOs to the end + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { + later += match[0]; + selector = selector.replace( Expr.match.PSEUDO, "" ); + } + + selector = Expr.relative[selector] ? selector + "*" : selector; + + for ( var i = 0, l = root.length; i < l; i++ ) { + Sizzle( selector, root[i], tmpSet, seed ); + } - return Sizzle.filter( later, tmpSet ); + return Sizzle.filter( later, tmpSet ); }; // EXPOSE +// Override sizzle attribute retrieval +Sizzle.attr = jQuery.attr; +Sizzle.selectors.attrMap = {}; jQuery.find = Sizzle; jQuery.expr = Sizzle.selectors; jQuery.expr[":"] = jQuery.expr.filters; @@ -5189,365 +5394,369 @@ var runtil = /Until$/, - rparentsprev = /^(?:parents|prevUntil|prevAll)/, - // Note: This RegExp should be improved, or likely pulled from Sizzle - rmultiselector = /,/, - isSimple = /^.[^:#\[\.,]*$/, - slice = Array.prototype.slice, - POS = jQuery.expr.match.POS, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; + rparentsprev = /^(?:parents|prevUntil|prevAll)/, + // Note: This RegExp should be improved, or likely pulled from Sizzle + rmultiselector = /,/, + isSimple = /^.[^:#\[\.,]*$/, + slice = Array.prototype.slice, + POS = jQuery.expr.match.globalPOS, + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; jQuery.fn.extend({ - find: function( selector ) { - var self = this, - i, l; - - if ( typeof selector !== "string" ) { - return jQuery( selector ).filter(function() { - for ( i = 0, l = self.length; i < l; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }); - } - - var ret = this.pushStack( "", "find", selector ), - length, n, r; - - for ( i = 0, l = this.length; i < l; i++ ) { - length = ret.length; - jQuery.find( selector, this[i], ret ); - - if ( i > 0 ) { - // Make sure that the results are unique - for ( n = length; n < ret.length; n++ ) { - for ( r = 0; r < length; r++ ) { - if ( ret[r] === ret[n] ) { - ret.splice(n--, 1); - break; - } - } - } - } - } - - return ret; - }, - - has: function( target ) { - var targets = jQuery( target ); - return this.filter(function() { - for ( var i = 0, l = targets.length; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - not: function( selector ) { - return this.pushStack( winnow(this, selector, false), "not", selector); - }, - - filter: function( selector ) { - return this.pushStack( winnow(this, selector, true), "filter", selector ); - }, - - is: function( selector ) { - return !!selector && ( typeof selector === "string" ? - jQuery.filter( selector, this ).length > 0 : - this.filter( selector ).length > 0 ); - }, - - closest: function( selectors, context ) { - var ret = [], i, l, cur = this[0]; - - // Array - if ( jQuery.isArray( selectors ) ) { - var match, selector, - matches = {}, - level = 1; - - if ( cur && selectors.length ) { - for ( i = 0, l = selectors.length; i < l; i++ ) { - selector = selectors[i]; - - if ( !matches[ selector ] ) { - matches[ selector ] = POS.test( selector ) ? - jQuery( selector, context || this.context ) : - selector; - } - } - - while ( cur && cur.ownerDocument && cur !== context ) { - for ( selector in matches ) { - match = matches[ selector ]; - - if ( match.jquery ? match.index( cur ) > -1 : jQuery( cur ).is( match ) ) { - ret.push({ selector: selector, elem: cur, level: level }); - } - } - - cur = cur.parentNode; - level++; - } - } - - return ret; - } - - // String - var pos = POS.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( i = 0, l = this.length; i < l; i++ ) { - cur = this[i]; - - while ( cur ) { - if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { - ret.push( cur ); - break; - - } else { - cur = cur.parentNode; - if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { - break; - } - } - } - } - - ret = ret.length > 1 ? jQuery.unique( ret ) : ret; - - return this.pushStack( ret, "closest", selectors ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); - } - - // Locate the position of the desired element - return jQuery.inArray( - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); - }, - - add: function( selector, context ) { - var set = typeof selector === "string" ? - jQuery( selector, context ) : - jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), - all = jQuery.merge( this.get(), set ); - - return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? - all : - jQuery.unique( all ) ); - }, - - andSelf: function() { - return this.add( this.prevObject ); - } + find: function( selector ) { + var self = this, + i, l; + + if ( typeof selector !== "string" ) { + return jQuery( selector ).filter(function() { + for ( i = 0, l = self.length; i < l; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + }); + } + + var ret = this.pushStack( "", "find", selector ), + length, n, r; + + for ( i = 0, l = this.length; i < l; i++ ) { + length = ret.length; + jQuery.find( selector, this[i], ret ); + + if ( i > 0 ) { + // Make sure that the results are unique + for ( n = length; n < ret.length; n++ ) { + for ( r = 0; r < length; r++ ) { + if ( ret[r] === ret[n] ) { + ret.splice(n--, 1); + break; + } + } + } + } + } + + return ret; + }, + + has: function( target ) { + var targets = jQuery( target ); + return this.filter(function() { + for ( var i = 0, l = targets.length; i < l; i++ ) { + if ( jQuery.contains( this, targets[i] ) ) { + return true; + } + } + }); + }, + + not: function( selector ) { + return this.pushStack( winnow(this, selector, false), "not", selector); + }, + + filter: function( selector ) { + return this.pushStack( winnow(this, selector, true), "filter", selector ); + }, + + is: function( selector ) { + return !!selector && ( + typeof selector === "string" ? + // If this is a positional selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + POS.test( selector ) ? + jQuery( selector, this.context ).index( this[0] ) >= 0 : + jQuery.filter( selector, this ).length > 0 : + this.filter( selector ).length > 0 ); + }, + + closest: function( selectors, context ) { + var ret = [], i, l, cur = this[0]; + + // Array (deprecated as of jQuery 1.7) + if ( jQuery.isArray( selectors ) ) { + var level = 1; + + while ( cur && cur.ownerDocument && cur !== context ) { + for ( i = 0; i < selectors.length; i++ ) { + + if ( jQuery( cur ).is( selectors[ i ] ) ) { + ret.push({ selector: selectors[ i ], elem: cur, level: level }); + } + } + + cur = cur.parentNode; + level++; + } + + return ret; + } + + // String + var pos = POS.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( i = 0, l = this.length; i < l; i++ ) { + cur = this[i]; + + while ( cur ) { + if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) { + ret.push( cur ); + break; + + } else { + cur = cur.parentNode; + if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) { + break; + } + } + } + } + + ret = ret.length > 1 ? jQuery.unique( ret ) : ret; + + return this.pushStack( ret, "closest", selectors ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[0], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[0] : elem, this ); + }, + + add: function( selector, context ) { + var set = typeof selector === "string" ? + jQuery( selector, context ) : + jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ), + all = jQuery.merge( this.get(), set ); + + return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ? + all : + jQuery.unique( all ) ); + }, + + andSelf: function() { + return this.add( this.prevObject ); + } }); // A painfully simple check to see if an element is disconnected // from a document (should be improved, where feasible). function isDisconnected( node ) { - return !node || !node.parentNode || node.parentNode.nodeType === 11; + return !node || !node.parentNode || node.parentNode.nodeType === 11; } jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return jQuery.nth( elem, 2, "nextSibling" ); - }, - prev: function( elem ) { - return jQuery.nth( elem, 2, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( elem.parentNode.firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.makeArray( elem.childNodes ); - } + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return jQuery.dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return jQuery.dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return jQuery.nth( elem, 2, "nextSibling" ); + }, + prev: function( elem ) { + return jQuery.nth( elem, 2, "previousSibling" ); + }, + nextAll: function( elem ) { + return jQuery.dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return jQuery.dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return jQuery.dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return jQuery.dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return jQuery.sibling( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.makeArray( elem.childNodes ); + } }, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ), - // The variable 'args' was introduced in - // https://github.com/jquery/jquery/commit/52a0238 - // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed. - // http://code.google.com/p/v8/issues/detail?id=1050 - args = slice.call(arguments); - - if ( !runtil.test( name ) ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); - } - - ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - - if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { - ret = ret.reverse(); - } + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( !runtil.test( name ) ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret; - return this.pushStack( ret, name, args.join(",") ); - }; + if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + + return this.pushStack( ret, name, slice.call( arguments ).join(",") ); + }; }); jQuery.extend({ - filter: function( expr, elems, not ) { - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 ? - jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : - jQuery.find.matches(expr, elems); - }, - - dir: function( elem, dir, until ) { - var matched = [], - cur = elem[ dir ]; - - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); - } - cur = cur[dir]; - } - return matched; - }, - - nth: function( cur, result, dir, elem ) { - result = result || 1; - var num = 0; - - for ( ; cur; cur = cur[dir] ) { - if ( cur.nodeType === 1 && ++num === result ) { - break; - } - } - - return cur; - }, - - sibling: function( n, elem ) { - var r = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); - } - } + filter: function( expr, elems, not ) { + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 ? + jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] : + jQuery.find.matches(expr, elems); + }, + + dir: function( elem, dir, until ) { + var matched = [], + cur = elem[ dir ]; + + while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { + if ( cur.nodeType === 1 ) { + matched.push( cur ); + } + cur = cur[dir]; + } + return matched; + }, + + nth: function( cur, result, dir, elem ) { + result = result || 1; + var num = 0; + + for ( ; cur; cur = cur[dir] ) { + if ( cur.nodeType === 1 && ++num === result ) { + break; + } + } + + return cur; + }, + + sibling: function( n, elem ) { + var r = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + r.push( n ); + } + } - return r; - } + return r; + } }); // Implement the identical functionality for filter and not function winnow( elements, qualifier, keep ) { - // Can't pass null or undefined to indexOf in Firefox 4 - // Set to 0 to skip string check - qualifier = qualifier || 0; - - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep(elements, function( elem, i ) { - var retVal = !!qualifier.call( elem, i, elem ); - return retVal === keep; - }); - - } else if ( qualifier.nodeType ) { - return jQuery.grep(elements, function( elem, i ) { - return (elem === qualifier) === keep; - }); - - } else if ( typeof qualifier === "string" ) { - var filtered = jQuery.grep(elements, function( elem ) { - return elem.nodeType === 1; - }); - - if ( isSimple.test( qualifier ) ) { - return jQuery.filter(qualifier, filtered, !keep); - } else { - qualifier = jQuery.filter( qualifier, filtered ); - } - } - - return jQuery.grep(elements, function( elem, i ) { - return (jQuery.inArray( elem, qualifier ) >= 0) === keep; - }); + // Can't pass null or undefined to indexOf in Firefox 4 + // Set to 0 to skip string check + qualifier = qualifier || 0; + + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep(elements, function( elem, i ) { + var retVal = !!qualifier.call( elem, i, elem ); + return retVal === keep; + }); + + } else if ( qualifier.nodeType ) { + return jQuery.grep(elements, function( elem, i ) { + return ( elem === qualifier ) === keep; + }); + + } else if ( typeof qualifier === "string" ) { + var filtered = jQuery.grep(elements, function( elem ) { + return elem.nodeType === 1; + }); + + if ( isSimple.test( qualifier ) ) { + return jQuery.filter(qualifier, filtered, !keep); + } else { + qualifier = jQuery.filter( qualifier, filtered ); + } + } + + return jQuery.grep(elements, function( elem, i ) { + return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep; + }); } -var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, - rleadingWhitespace = /^\s+/, - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, - rtagName = /<([\w:]+)/, - rtbody = /", "" ], - legend: [ 1, "
", "
" ], - thead: [ 1, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - col: [ 2, "", "
" ], - area: [ 1, "", "" ], - _default: [ 0, "", "" ] - }; +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + + "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", + rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g, + rleadingWhitespace = /^\s+/, + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig, + rtagName = /<([\w:]+)/, + rtbody = /]", "i"), + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rscriptType = /\/(java|ecma)script/i, + rcleanScript = /^\s*", "" ], + legend: [ 1, "
", "
" ], + thead: [ 1, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + col: [ 2, "", "
" ], + area: [ 1, "", "" ], + _default: [ 0, "", "" ] + }, + safeFragment = createSafeFragment( document ); wrapMap.optgroup = wrapMap.option; wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; @@ -5555,1185 +5764,1267 @@ // IE can't serialize and ' ); - + iframe_doc.close(); - + // Update the Iframe's hash, for great justice. iframe.location.hash = hash; } }; - + })(); - // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^ - // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - return self; - })(); - -})(jQuery,this); -/* -* "page" plugin -*/ - -(function( $, undefined ) { - -$.widget( "mobile.page", $.mobile.widget, { - options: { - theme: "c", - domCache: false, - keepNativeDefault: ":jqmData(role='none'), :jqmData(role='nojs')" - }, - - _create: function() { - - this._trigger( "beforecreate" ); - - this.element - .attr( "tabindex", "0" ) - .addClass( "ui-page ui-body-" + this.options.theme ); - }, - - keepNativeSelector: function() { - var options = this.options, - keepNativeDefined = options.keepNative && $.trim(options.keepNative); - - if( keepNativeDefined && options.keepNative !== options.keepNativeDefault ){ - return [options.keepNative, options.keepNativeDefault].join(", "); - } - - return options.keepNativeDefault; - } -}); -})( jQuery ); -/* -* "core" - The base file for jQm -*/ - -(function( $, window, undefined ) { - - var nsNormalizeDict = {}; - - // jQuery.mobile configurable options - $.extend( $.mobile, { - - // Namespace used framework-wide for data-attrs. Default is no namespace - ns: "", - - // Define the url parameter used for referencing widget-generated sub-pages. - // Translates to to example.html&ui-page=subpageIdentifier - // hash segment before &ui-page= is used to make Ajax request - subPageUrlKey: "ui-page", - - // Class assigned to page currently in view, and during transitions - activePageClass: "ui-page-active", - - // Class used for "active" button state, from CSS framework - activeBtnClass: "ui-btn-active", - - // Automatically handle clicks and form submissions through Ajax, when same-domain - ajaxEnabled: true, - - // Automatically load and show pages based on location.hash - hashListeningEnabled: true, - - // disable to prevent jquery from bothering with links - linkBindingEnabled: true, - - // Set default page transition - 'none' for no transitions - defaultPageTransition: "slide", - - // Minimum scroll distance that will be remembered when returning to a page - minScrollBack: 250, - - // Set default dialog transition - 'none' for no transitions - defaultDialogTransition: "pop", - - // Show loading message during Ajax requests - // if false, message will not appear, but loading classes will still be toggled on html el - loadingMessage: "loading", - - // Error response message - appears when an Ajax page request fails - pageLoadErrorMessage: "Error Loading Page", - - //automatically initialize the DOM when it's ready - autoInitializePage: true, - - pushStateEnabled: true, - - // turn of binding to the native orientationchange due to android orientation behavior - orientationChangeEnabled: true, - - // Support conditions that must be met in order to proceed - // default enhanced qualifications are media query support OR IE 7+ - gradeA: function(){ - return $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7; - }, - - // TODO might be useful upstream in jquery itself ? - keyCode: { - ALT: 18, - BACKSPACE: 8, - CAPS_LOCK: 20, - COMMA: 188, - COMMAND: 91, - COMMAND_LEFT: 91, // COMMAND - COMMAND_RIGHT: 93, - CONTROL: 17, - DELETE: 46, - DOWN: 40, - END: 35, - ENTER: 13, - ESCAPE: 27, - HOME: 36, - INSERT: 45, - LEFT: 37, - MENU: 93, // COMMAND_RIGHT - NUMPAD_ADD: 107, - NUMPAD_DECIMAL: 110, - NUMPAD_DIVIDE: 111, - NUMPAD_ENTER: 108, - NUMPAD_MULTIPLY: 106, - NUMPAD_SUBTRACT: 109, - PAGE_DOWN: 34, - PAGE_UP: 33, - PERIOD: 190, - RIGHT: 39, - SHIFT: 16, - SPACE: 32, - TAB: 9, - UP: 38, - WINDOWS: 91 // COMMAND - }, - - // Scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value - silentScroll: function( ypos ) { - if ( $.type( ypos ) !== "number" ) { - ypos = $.mobile.defaultHomeScroll; - } - - // prevent scrollstart and scrollstop events - $.event.special.scrollstart.enabled = false; - - setTimeout(function() { - window.scrollTo( 0, ypos ); - $( document ).trigger( "silentscroll", { x: 0, y: ypos }); - }, 20 ); - - setTimeout(function() { - $.event.special.scrollstart.enabled = true; - }, 150 ); - }, - - // Expose our cache for testing purposes. - nsNormalizeDict: nsNormalizeDict, - - // Take a data attribute property, prepend the namespace - // and then camel case the attribute string. Add the result - // to our nsNormalizeDict so we don't have to do this again. - nsNormalize: function( prop ) { - if ( !prop ) { - return; - } - - return nsNormalizeDict[ prop ] || ( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) ); - }, - - getInheritedTheme: function( el, defaultTheme ) { - - // Find the closest parent with a theme class on it. Note that - // we are not using $.fn.closest() on purpose here because this - // method gets called quite a bit and we need it to be as fast - // as possible. - - var e = el[ 0 ], - ltr = "", - re = /ui-(bar|body)-([a-z])\b/, - c, m; - - while ( e ) { - var c = e.className || ""; - if ( ( m = re.exec( c ) ) && ( ltr = m[ 2 ] ) ) { - // We found a parent with a theme class - // on it so bail from this loop. - break; - } - e = e.parentNode; - } - - // Return the theme letter we found, if none, return the - // specified default. - - return ltr || defaultTheme || "a"; - }, - - // TODO the following $ and $.fn extensions can/probably should be moved into jquery.mobile.core.helpers - // - // Find the closest javascript page element to gather settings data jsperf test - // http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit - // possibly naive, but it shows that the parsing overhead for *just* the page selector vs - // the page and dialog selector is negligable. This could probably be speed up by - // doing a similar parent node traversal to the one found in the inherited theme code above - closestPageData: function( $target ) { - return $target - .closest(':jqmData(role="page"), :jqmData(role="dialog")') - .data("page"); - } - }); - - // Mobile version of data and removeData and hasData methods - // ensures all data is set and retrieved using jQuery Mobile's data namespace - $.fn.jqmData = function( prop, value ) { - var result; - if ( typeof prop != "undefined" ) { - result = this.data( prop ? $.mobile.nsNormalize( prop ) : prop, value ); - } - return result; - }; - - $.jqmData = function( elem, prop, value ) { - var result; - if ( typeof prop != "undefined" ) { - result = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value ); - } - return result; - }; - - $.fn.jqmRemoveData = function( prop ) { - return this.removeData( $.mobile.nsNormalize( prop ) ); - }; - - $.jqmRemoveData = function( elem, prop ) { - return $.removeData( elem, $.mobile.nsNormalize( prop ) ); - }; - - $.fn.removeWithDependents = function() { - $.removeWithDependents( this ); - }; - - $.removeWithDependents = function( elem ) { - var $elem = $( elem ); - - ( $elem.jqmData('dependents') || $() ).remove(); - $elem.remove(); - }; - - $.fn.addDependents = function( newDependents ) { - $.addDependents( $(this), newDependents ); - }; - - $.addDependents = function( elem, newDependents ) { - var dependents = $(elem).jqmData( 'dependents' ) || $(); - - $(elem).jqmData( 'dependents', $.merge(dependents, newDependents) ); - }; - - // note that this helper doesn't attempt to handle the callback - // or setting of an html elements text, its only purpose is - // to return the html encoded version of the text in all cases. (thus the name) - $.fn.getEncodedText = function() { - return $( "
" ).text( $(this).text() ).html(); - }; - - // Monkey-patching Sizzle to filter the :jqmData selector - var oldFind = $.find, - jqmDataRE = /:jqmData\(([^)]*)\)/g; - - $.find = function( selector, context, ret, extra ) { - selector = selector.replace( jqmDataRE, "[data-" + ( $.mobile.ns || "" ) + "$1]" ); - - return oldFind.call( this, selector, context, ret, extra ); - }; - - $.extend( $.find, oldFind ); - - $.find.matches = function( expr, set ) { - return $.find( expr, null, null, set ); - }; - - $.find.matchesSelector = function( node, expr ) { - return $.find( expr, null, null, [ node ] ).length > 0; - }; -})( jQuery, this ); - -/* -* core utilities for auto ajax navigation, base tag mgmt, -*/ - -( function( $, undefined ) { - - //define vars for interal use - var $window = $( window ), - $html = $( 'html' ), - $head = $( 'head' ), - - //url path helpers for use in relative url management - path = { - - // This scary looking regular expression parses an absolute URL or its relative - // variants (protocol, site, document, query, and hash), into the various - // components (protocol, host, path, query, fragment, etc that make up the - // URL as well as some other commonly used sub-parts. When used with RegExp.exec() - // or String.match, it parses the URL into a results array that looks like this: - // - // [0]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread#msg-content - // [1]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread - // [2]: http://jblas:password@mycompany.com:8080/mail/inbox - // [3]: http://jblas:password@mycompany.com:8080 - // [4]: http: - // [5]: // - // [6]: jblas:password@mycompany.com:8080 - // [7]: jblas:password - // [8]: jblas - // [9]: password - // [10]: mycompany.com:8080 - // [11]: mycompany.com - // [12]: 8080 - // [13]: /mail/inbox - // [14]: /mail/ - // [15]: inbox - // [16]: ?msg=1234&type=unread - // [17]: #msg-content - // - urlParseRE: /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/, - - //Parse a URL into a structure that allows easy access to - //all of the URL components by name. - parseUrl: function( url ) { - // If we're passed an object, we'll assume that it is - // a parsed url object and just return it back to the caller. - if ( $.type( url ) === "object" ) { - return url; - } - - var matches = path.urlParseRE.exec( url || "" ) || []; - - // Create an object that allows the caller to access the sub-matches - // by name. Note that IE returns an empty string instead of undefined, - // like all other browsers do, so we normalize everything so its consistent - // no matter what browser we're running on. - return { - href: matches[ 0 ] || "", - hrefNoHash: matches[ 1 ] || "", - hrefNoSearch: matches[ 2 ] || "", - domain: matches[ 3 ] || "", - protocol: matches[ 4 ] || "", - doubleSlash: matches[ 5 ] || "", - authority: matches[ 6 ] || "", - username: matches[ 8 ] || "", - password: matches[ 9 ] || "", - host: matches[ 10 ] || "", - hostname: matches[ 11 ] || "", - port: matches[ 12 ] || "", - pathname: matches[ 13 ] || "", - directory: matches[ 14 ] || "", - filename: matches[ 15 ] || "", - search: matches[ 16 ] || "", - hash: matches[ 17 ] || "" - }; - }, - - //Turn relPath into an asbolute path. absPath is - //an optional absolute path which describes what - //relPath is relative to. - makePathAbsolute: function( relPath, absPath ) { - if ( relPath && relPath.charAt( 0 ) === "/" ) { - return relPath; - } - - relPath = relPath || ""; - absPath = absPath ? absPath.replace( /^\/|(\/[^\/]*|[^\/]+)$/g, "" ) : ""; - - var absStack = absPath ? absPath.split( "/" ) : [], - relStack = relPath.split( "/" ); - for ( var i = 0; i < relStack.length; i++ ) { - var d = relStack[ i ]; - switch ( d ) { - case ".": - break; - case "..": - if ( absStack.length ) { - absStack.pop(); - } - break; - default: - absStack.push( d ); - break; - } - } - return "/" + absStack.join( "/" ); - }, - - //Returns true if both urls have the same domain. - isSameDomain: function( absUrl1, absUrl2 ) { - return path.parseUrl( absUrl1 ).domain === path.parseUrl( absUrl2 ).domain; - }, - - //Returns true for any relative variant. - isRelativeUrl: function( url ) { - // All relative Url variants have one thing in common, no protocol. - return path.parseUrl( url ).protocol === ""; - }, - - //Returns true for an absolute url. - isAbsoluteUrl: function( url ) { - return path.parseUrl( url ).protocol !== ""; - }, - - //Turn the specified realtive URL into an absolute one. This function - //can handle all relative variants (protocol, site, document, query, fragment). - makeUrlAbsolute: function( relUrl, absUrl ) { - if ( !path.isRelativeUrl( relUrl ) ) { - return relUrl; - } - - var relObj = path.parseUrl( relUrl ), - absObj = path.parseUrl( absUrl ), - protocol = relObj.protocol || absObj.protocol, - doubleSlash = relObj.protocol ? relObj.doubleSlash : ( relObj.doubleSlash || absObj.doubleSlash ), - authority = relObj.authority || absObj.authority, - hasPath = relObj.pathname !== "", - pathname = path.makePathAbsolute( relObj.pathname || absObj.filename, absObj.pathname ), - search = relObj.search || ( !hasPath && absObj.search ) || "", - hash = relObj.hash; - - return protocol + doubleSlash + authority + pathname + search + hash; - }, - - //Add search (aka query) params to the specified url. - addSearchParams: function( url, params ) { - var u = path.parseUrl( url ), - p = ( typeof params === "object" ) ? $.param( params ) : params, - s = u.search || "?"; - return u.hrefNoSearch + s + ( s.charAt( s.length - 1 ) !== "?" ? "&" : "" ) + p + ( u.hash || "" ); - }, - - convertUrlToDataUrl: function( absUrl ) { - var u = path.parseUrl( absUrl ); - if ( path.isEmbeddedPage( u ) ) { - // For embedded pages, remove the dialog hash key as in getFilePath(), - // otherwise the Data Url won't match the id of the embedded Page. - return u.hash.split( dialogHashKey )[0].replace( /^#/, "" ); - } else if ( path.isSameDomain( u, documentBase ) ) { - return u.hrefNoHash.replace( documentBase.domain, "" ); - } - return absUrl; - }, - - //get path from current hash, or from a file path - get: function( newPath ) { - if( newPath === undefined ) { - newPath = location.hash; - } - return path.stripHash( newPath ).replace( /[^\/]*\.[^\/*]+$/, '' ); - }, - - //return the substring of a filepath before the sub-page key, for making a server request - getFilePath: function( path ) { - var splitkey = '&' + $.mobile.subPageUrlKey; - return path && path.split( splitkey )[0].split( dialogHashKey )[0]; - }, - - //set location hash to path - set: function( path ) { - location.hash = path; - }, - - //test if a given url (string) is a path - //NOTE might be exceptionally naive - isPath: function( url ) { - return ( /\// ).test( url ); - }, - - //return a url path with the window's location protocol/hostname/pathname removed - clean: function( url ) { - return url.replace( documentBase.domain, "" ); - }, - - //just return the url without an initial # - stripHash: function( url ) { - return url.replace( /^#/, "" ); - }, - - //remove the preceding hash, any query params, and dialog notations - cleanHash: function( hash ) { - return path.stripHash( hash.replace( /\?.*$/, "" ).replace( dialogHashKey, "" ) ); - }, - - //check whether a url is referencing the same domain, or an external domain or different protocol - //could be mailto, etc - isExternal: function( url ) { - var u = path.parseUrl( url ); - return u.protocol && u.domain !== documentUrl.domain ? true : false; - }, - - hasProtocol: function( url ) { - return ( /^(:?\w+:)/ ).test( url ); - }, - - //check if the specified url refers to the first page in the main application document. - isFirstPageUrl: function( url ) { - // We only deal with absolute paths. - var u = path.parseUrl( path.makeUrlAbsolute( url, documentBase ) ), - - // Does the url have the same path as the document? - samePath = u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ), - - // Get the first page element. - fp = $.mobile.firstPage, - - // Get the id of the first page element if it has one. - fpId = fp && fp[0] ? fp[0].id : undefined; - - // The url refers to the first page if the path matches the document and - // it either has no hash value, or the hash is exactly equal to the id of the - // first page element. - return samePath && ( !u.hash || u.hash === "#" || ( fpId && u.hash.replace( /^#/, "" ) === fpId ) ); - }, - - isEmbeddedPage: function( url ) { - var u = path.parseUrl( url ); - - //if the path is absolute, then we need to compare the url against - //both the documentUrl and the documentBase. The main reason for this - //is that links embedded within external documents will refer to the - //application document, whereas links embedded within the application - //document will be resolved against the document base. - if ( u.protocol !== "" ) { - return ( u.hash && ( u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ) ) ); - } - return (/^#/).test( u.href ); - }, - - - // Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR - // requests if the document doing the request was loaded via the file:// protocol. - // This is usually to allow the application to "phone home" and fetch app specific - // data. We normally let the browser handle external/cross-domain urls, but if the - // allowCrossDomainPages option is true, we will allow cross-domain http/https - // requests to go through our page loading logic. - isPermittedCrossDomainRequest: function( docUrl, reqUrl ) { - return $.mobile.allowCrossDomainPages - && docUrl.protocol === "file:" - && reqUrl.search( /^https?:/ ) != -1; - } - }, - - //will be defined when a link is clicked and given an active class - $activeClickedLink = null, - - //urlHistory is purely here to make guesses at whether the back or forward button was clicked - //and provide an appropriate transition - urlHistory = { - // Array of pages that are visited during a single page load. - // Each has a url and optional transition, title, and pageUrl (which represents the file path, in cases where URL is obscured, such as dialogs) - stack: [], - - //maintain an index number for the active page in the stack - activeIndex: 0, - - //get active - getActive: function() { - return urlHistory.stack[ urlHistory.activeIndex ]; - }, - - getPrev: function() { - return urlHistory.stack[ urlHistory.activeIndex - 1 ]; - }, - - getNext: function() { - return urlHistory.stack[ urlHistory.activeIndex + 1 ]; - }, - - // addNew is used whenever a new page is added - addNew: function( url, transition, title, pageUrl, role ) { - //if there's forward history, wipe it - if( urlHistory.getNext() ) { - urlHistory.clearForward(); - } - - urlHistory.stack.push( {url : url, transition: transition, title: title, pageUrl: pageUrl, role: role } ); - - urlHistory.activeIndex = urlHistory.stack.length - 1; - }, - - //wipe urls ahead of active index - clearForward: function() { - urlHistory.stack = urlHistory.stack.slice( 0, urlHistory.activeIndex + 1 ); - }, - - directHashChange: function( opts ) { - var back , forward, newActiveIndex, prev = this.getActive(); - - // check if url isp in history and if it's ahead or behind current page - $.each( urlHistory.stack, function( i, historyEntry ) { - - //if the url is in the stack, it's a forward or a back - if( opts.currentUrl === historyEntry.url ) { - //define back and forward by whether url is older or newer than current page - back = i < urlHistory.activeIndex; - forward = !back; - newActiveIndex = i; - } - }); - - // save new page index, null check to prevent falsey 0 result - this.activeIndex = newActiveIndex !== undefined ? newActiveIndex : this.activeIndex; - - if( back ) { - ( opts.either || opts.isBack )( true ); - } else if( forward ) { - ( opts.either || opts.isForward )( false ); - } - }, - - //disable hashchange event listener internally to ignore one change - //toggled internally when location.hash is updated to match the url of a successful page load - ignoreNextHashChange: false - }, - - //define first selector to receive focus when a page is shown - focusable = "[tabindex],a,button:visible,select:visible,input", - - //queue to hold simultanious page transitions - pageTransitionQueue = [], - - //indicates whether or not page is in process of transitioning - isPageTransitioning = false, - - //nonsense hash change key for dialogs, so they create a history entry - dialogHashKey = "&ui-state=dialog", - - //existing base tag? - $base = $head.children( "base" ), - - //tuck away the original document URL minus any fragment. - documentUrl = path.parseUrl( location.href ), - - //if the document has an embedded base tag, documentBase is set to its - //initial value. If a base tag does not exist, then we default to the documentUrl. - documentBase = $base.length ? path.parseUrl( path.makeUrlAbsolute( $base.attr( "href" ), documentUrl.href ) ) : documentUrl, - - //cache the comparison once. - documentBaseDiffers = ( documentUrl.hrefNoHash !== documentBase.hrefNoHash ); - - //base element management, defined depending on dynamic base tag support - var base = $.support.dynamicBaseTag ? { - - //define base element, for use in routing asset urls that are referenced in Ajax-requested markup - element: ( $base.length ? $base : $( "", { href: documentBase.hrefNoHash } ).prependTo( $head ) ), - - //set the generated BASE element's href attribute to a new page's base path - set: function( href ) { - base.element.attr( "href", path.makeUrlAbsolute( href, documentBase ) ); - }, - - //set the generated BASE element's href attribute to a new page's base path - reset: function() { - base.element.attr( "href", documentBase.hrefNoHash ); - } - - } : undefined; - -/* - internal utility functions ---------------------------------------*/ - - - //direct focus to the page title, or otherwise first focusable element - function reFocus( page ) { - var pageTitle = page.find( ".ui-title:eq(0)" ); - - if( pageTitle.length ) { - pageTitle.focus(); - } - else{ - page.focus(); - } - } - - //remove active classes after page transition or error - function removeActiveLinkClass( forceRemoval ) { - if( !!$activeClickedLink && ( !$activeClickedLink.closest( '.ui-page-active' ).length || forceRemoval ) ) { - $activeClickedLink.removeClass( $.mobile.activeBtnClass ); - } - $activeClickedLink = null; - } - - function releasePageTransitionLock() { - isPageTransitioning = false; - if( pageTransitionQueue.length > 0 ) { - $.mobile.changePage.apply( null, pageTransitionQueue.pop() ); - } - } - - // Save the last scroll distance per page, before it is hidden - var setLastScrollEnabled = true, - firstScrollElem, getScrollElem, setLastScroll, delayedSetLastScroll; - - getScrollElem = function() { - var scrollElem = $window, activePage, - touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled; - - if( touchOverflow ){ - activePage = $( ".ui-page-active" ); - scrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage; - } - - return scrollElem; - }; - - setLastScroll = function( scrollElem ) { - // this barrier prevents setting the scroll value based on the browser - // scrolling the window based on a hashchange - if( !setLastScrollEnabled ) { - return; - } - - var active = $.mobile.urlHistory.getActive(); - - if( active ) { - var lastScroll = scrollElem && scrollElem.scrollTop(); - - // Set active page's lastScroll prop. - // If the location we're scrolling to is less than minScrollBack, let it go. - active.lastScroll = lastScroll < $.mobile.minScrollBack ? $.mobile.defaultHomeScroll : lastScroll; - } - }; - - // bind to scrollstop to gather scroll position. The delay allows for the hashchange - // event to fire and disable scroll recording in the case where the browser scrolls - // to the hash targets location (sometimes the top of the page). once pagechange fires - // getLastScroll is again permitted to operate - delayedSetLastScroll = function() { - setTimeout( setLastScroll, 100, $(this) ); - }; - - // disable an scroll setting when a hashchange has been fired, this only works - // because the recording of the scroll position is delayed for 100ms after - // the browser might have changed the position because of the hashchange - $window.bind( $.support.pushState ? "popstate" : "hashchange", function() { - setLastScrollEnabled = false; - }); - - // handle initial hashchange from chrome :( - $window.one( $.support.pushState ? "popstate" : "hashchange", function() { - setLastScrollEnabled = true; - }); - - // wait until the mobile page container has been determined to bind to pagechange - $window.one( "pagecontainercreate", function(){ - // once the page has changed, re-enable the scroll recording - $.mobile.pageContainer.bind( "pagechange", function() { - var scrollElem = getScrollElem(); - - setLastScrollEnabled = true; - - // remove any binding that previously existed on the get scroll - // which may or may not be different than the scroll element determined for - // this page previously - scrollElem.unbind( "scrollstop", delayedSetLastScroll ); - - // determine and bind to the current scoll element which may be the window - // or in the case of touch overflow the element with touch overflow - scrollElem.bind( "scrollstop", delayedSetLastScroll ); - }); - }); - - // bind to scrollstop for the first page as "pagechange" won't be fired in that case - getScrollElem().bind( "scrollstop", delayedSetLastScroll ); - - // Make the iOS clock quick-scroll work again if we're using native overflow scrolling - /* - if( $.support.touchOverflow ){ - if( $.mobile.touchOverflowEnabled ){ - $( window ).bind( "scrollstop", function(){ - if( $( this ).scrollTop() === 0 ){ - $.mobile.activePage.scrollTop( 0 ); - } - }); - } - } - */ - - //function for transitioning between two existing pages - function transitionPages( toPage, fromPage, transition, reverse ) { - - //get current scroll distance - var active = $.mobile.urlHistory.getActive(), - touchOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled, - toScroll = active.lastScroll || ( touchOverflow ? 0 : $.mobile.defaultHomeScroll ), - screenHeight = getScreenHeight(); - - // Scroll to top, hide addr bar - window.scrollTo( 0, $.mobile.defaultHomeScroll ); - - if( fromPage ) { - //trigger before show/hide events - fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } ); - } - - if( !touchOverflow){ - toPage.height( screenHeight + toScroll ); - } - - toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } ); - - //clear page loader - $.mobile.hidePageLoadingMsg(); - - if( touchOverflow && toScroll ){ - - toPage.addClass( "ui-mobile-pre-transition" ); - // Send focus to page as it is now display: block - reFocus( toPage ); - - //set page's scrollTop to remembered distance - if( toPage.is( ".ui-native-fixed" ) ){ - toPage.find( ".ui-content" ).scrollTop( toScroll ); - } - else{ - toPage.scrollTop( toScroll ); - } - } - - //find the transition handler for the specified transition. If there - //isn't one in our transitionHandlers dictionary, use the default one. - //call the handler immediately to kick-off the transition. - var th = $.mobile.transitionHandlers[transition || "none"] || $.mobile.defaultTransitionHandler, - promise = th( transition, reverse, toPage, fromPage ); - - promise.done(function() { - //reset toPage height back - if( !touchOverflow ){ - toPage.height( "" ); - // Send focus to the newly shown page - reFocus( toPage ); - } - - // Jump to top or prev scroll, sometimes on iOS the page has not rendered yet. - if( !touchOverflow ){ - $.mobile.silentScroll( toScroll ); - } - - //trigger show/hide events - if( fromPage ) { - if( !touchOverflow ){ - fromPage.height( "" ); - } - - fromPage.data( "page" )._trigger( "hide", null, { nextPage: toPage } ); - } - - //trigger pageshow, define prevPage as either fromPage or empty jQuery obj - toPage.data( "page" )._trigger( "show", null, { prevPage: fromPage || $( "" ) } ); - }); - - return promise; - } - - //simply set the active page's minimum height to screen height, depending on orientation - function getScreenHeight(){ - var orientation = $.event.special.orientationchange.orientation(), - port = orientation === "portrait", - winMin = port ? 480 : 320, - screenHeight = port ? screen.availHeight : screen.availWidth, - winHeight = Math.max( winMin, $( window ).height() ), - pageMin = Math.min( screenHeight, winHeight ); - - return pageMin; - } - - $.mobile.getScreenHeight = getScreenHeight; - - //simply set the active page's minimum height to screen height, depending on orientation - function resetActivePageHeight(){ - // Don't apply this height in touch overflow enabled mode - if( $.support.touchOverflow && $.mobile.touchOverflowEnabled ){ - return; - } - $( "." + $.mobile.activePageClass ).css( "min-height", getScreenHeight() ); - } - - //shared page enhancements - function enhancePage( $page, role ) { - // If a role was specified, make sure the data-role attribute - // on the page element is in sync. - if( role ) { - $page.attr( "data-" + $.mobile.ns + "role", role ); - } - - //run page plugin - $page.page(); - } - -/* exposed $.mobile methods */ - - //animation complete callback - $.fn.animationComplete = function( callback ) { - if( $.support.cssTransitions ) { - return $( this ).one( 'webkitAnimationEnd', callback ); - } - else{ - // defer execution for consistency between webkit/non webkit - setTimeout( callback, 0 ); - return $( this ); - } - }; - - //expose path object on $.mobile - $.mobile.path = path; - - //expose base object on $.mobile - $.mobile.base = base; - - //history stack - $.mobile.urlHistory = urlHistory; - - $.mobile.dialogHashKey = dialogHashKey; - - //default non-animation transition handler - $.mobile.noneTransitionHandler = function( name, reverse, $toPage, $fromPage ) { - if ( $fromPage ) { - $fromPage.removeClass( $.mobile.activePageClass ); - } - $toPage.addClass( $.mobile.activePageClass ); - - return $.Deferred().resolve( name, reverse, $toPage, $fromPage ).promise(); - }; - - //default handler for unknown transitions - $.mobile.defaultTransitionHandler = $.mobile.noneTransitionHandler; - - //transition handler dictionary for 3rd party transitions - $.mobile.transitionHandlers = { - none: $.mobile.defaultTransitionHandler - }; - - //enable cross-domain page support - $.mobile.allowCrossDomainPages = false; - - //return the original document url - $.mobile.getDocumentUrl = function(asParsedObject) { - return asParsedObject ? $.extend( {}, documentUrl ) : documentUrl.href; - }; - - //return the original document base url - $.mobile.getDocumentBase = function(asParsedObject) { - return asParsedObject ? $.extend( {}, documentBase ) : documentBase.href; - }; - - $.mobile._bindPageRemove = function() { - var page = $(this); - - // when dom caching is not enabled or the page is embedded bind to remove the page on hide - if( !page.data("page").options.domCache - && page.is(":jqmData(external-page='true')") ) { - - page.bind( 'pagehide.remove', function() { - var $this = $( this ), - prEvent = new $.Event( "pageremove" ); - - $this.trigger( prEvent ); - - if( !prEvent.isDefaultPrevented() ){ - $this.removeWithDependents(); - } - }); - } - }; - - // Load a page into the DOM. - $.mobile.loadPage = function( url, options ) { - // This function uses deferred notifications to let callers - // know when the page is done loading, or if an error has occurred. - var deferred = $.Deferred(), - - // The default loadPage options with overrides specified by - // the caller. - settings = $.extend( {}, $.mobile.loadPage.defaults, options ), - - // The DOM element for the page after it has been loaded. - page = null, - - // If the reloadPage option is true, and the page is already - // in the DOM, dupCachedPage will be set to the page element - // so that it can be removed after the new version of the - // page is loaded off the network. - dupCachedPage = null, - - // determine the current base url - findBaseWithDefault = function(){ - var closestBase = ( $.mobile.activePage && getClosestBaseUrl( $.mobile.activePage ) ); - return closestBase || documentBase.hrefNoHash; - }, - - // The absolute version of the URL passed into the function. This - // version of the URL may contain dialog/subpage params in it. - absUrl = path.makeUrlAbsolute( url, findBaseWithDefault() ); - - - // If the caller provided data, and we're using "get" request, - // append the data to the URL. - if ( settings.data && settings.type === "get" ) { - absUrl = path.addSearchParams( absUrl, settings.data ); - settings.data = undefined; - } - - // If the caller is using a "post" request, reloadPage must be true - if( settings.data && settings.type === "post" ){ - settings.reloadPage = true; - } - - // The absolute version of the URL minus any dialog/subpage params. - // In otherwords the real URL of the page to be loaded. - var fileUrl = path.getFilePath( absUrl ), - - // The version of the Url actually stored in the data-url attribute of - // the page. For embedded pages, it is just the id of the page. For pages - // within the same domain as the document base, it is the site relative - // path. For cross-domain pages (Phone Gap only) the entire absolute Url - // used to load the page. - dataUrl = path.convertUrlToDataUrl( absUrl ); - - // Make sure we have a pageContainer to work with. - settings.pageContainer = settings.pageContainer || $.mobile.pageContainer; - - // Check to see if the page already exists in the DOM. - page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" ); - - // If we failed to find the page, check to see if the url is a - // reference to an embedded page. If so, it may have been dynamically - // injected by a developer, in which case it would be lacking a data-url - // attribute and in need of enhancement. - if ( page.length === 0 && dataUrl && !path.isPath( dataUrl ) ) { - page = settings.pageContainer.children( "#" + dataUrl ) - .attr( "data-" + $.mobile.ns + "url", dataUrl ); - } - - // If we failed to find a page in the DOM, check the URL to see if it - // refers to the first page in the application. If it isn't a reference - // to the first page and refers to non-existent embedded page, error out. - if ( page.length === 0 ) { - if ( $.mobile.firstPage && path.isFirstPageUrl( fileUrl ) ) { - // Check to make sure our cached-first-page is actually - // in the DOM. Some user deployed apps are pruning the first - // page from the DOM for various reasons, we check for this - // case here because we don't want a first-page with an id - // falling through to the non-existent embedded page error - // case. If the first-page is not in the DOM, then we let - // things fall through to the ajax loading code below so - // that it gets reloaded. - if ( $.mobile.firstPage.parent().length ) { - page = $( $.mobile.firstPage ); - } - } else if ( path.isEmbeddedPage( fileUrl ) ) { - deferred.reject( absUrl, options ); - return deferred.promise(); - } - } - - // Reset base to the default document base. - if ( base ) { - base.reset(); - } - - // If the page we are interested in is already in the DOM, - // and the caller did not indicate that we should force a - // reload of the file, we are done. Otherwise, track the - // existing page as a duplicated. - if ( page.length ) { - if ( !settings.reloadPage ) { - enhancePage( page, settings.role ); - deferred.resolve( absUrl, options, page ); - return deferred.promise(); - } - dupCachedPage = page; - } - - var mpc = settings.pageContainer, - pblEvent = new $.Event( "pagebeforeload" ), - triggerData = { url: url, absUrl: absUrl, dataUrl: dataUrl, deferred: deferred, options: settings }; - - // Let listeners know we're about to load a page. - mpc.trigger( pblEvent, triggerData ); - - // If the default behavior is prevented, stop here! - if( pblEvent.isDefaultPrevented() ){ - return deferred.promise(); - } - - if ( settings.showLoadMsg ) { - - // This configurable timeout allows cached pages a brief delay to load without showing a message - var loadMsgDelay = setTimeout(function(){ - $.mobile.showPageLoadingMsg(); - }, settings.loadMsgDelay ), - - // Shared logic for clearing timeout and removing message. - hideMsg = function(){ - - // Stop message show timer - clearTimeout( loadMsgDelay ); - - // Hide loading message - $.mobile.hidePageLoadingMsg(); - }; - } - - if ( !( $.mobile.allowCrossDomainPages || path.isSameDomain( documentUrl, absUrl ) ) ) { - deferred.reject( absUrl, options ); - } else { - // Load the new page. - $.ajax({ - url: fileUrl, - type: settings.type, - data: settings.data, - dataType: "html", - success: function( html, textStatus, xhr ) { - //pre-parse html to check for a data-url, - //use it as the new fileUrl, base path, etc - var all = $( "
" ), - - //page title regexp - newPageTitle = html.match( /]*>([^<]*)/ ) && RegExp.$1, - - // TODO handle dialogs again - pageElemRegex = new RegExp( "(<[^>]+\\bdata-" + $.mobile.ns + "role=[\"']?page[\"']?[^>]*>)" ), - dataUrlRegex = new RegExp( "\\bdata-" + $.mobile.ns + "url=[\"']?([^\"'>]*)[\"']?" ); - - - // data-url must be provided for the base tag so resource requests can be directed to the - // correct url. loading into a temprorary element makes these requests immediately - if( pageElemRegex.test( html ) - && RegExp.$1 - && dataUrlRegex.test( RegExp.$1 ) - && RegExp.$1 ) { - url = fileUrl = path.getFilePath( RegExp.$1 ); - } - - if ( base ) { - base.set( fileUrl ); - } - - //workaround to allow scripts to execute when included in page divs - all.get( 0 ).innerHTML = html; - page = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first(); - - //if page elem couldn't be found, create one and insert the body element's contents - if( !page.length ){ - page = $( "
" + html.split( /<\/?body[^>]*>/gmi )[1] + "
" ); - } - - if ( newPageTitle && !page.jqmData( "title" ) ) { - if ( ~newPageTitle.indexOf( "&" ) ) { - newPageTitle = $( "
" + newPageTitle + "
" ).text(); - } - page.jqmData( "title", newPageTitle ); - } - - //rewrite src and href attrs to use a base url - if( !$.support.dynamicBaseTag ) { - var newPath = path.get( fileUrl ); - page.find( "[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]" ).each(function() { - var thisAttr = $( this ).is( '[href]' ) ? 'href' : - $(this).is('[src]') ? 'src' : 'action', - thisUrl = $( this ).attr( thisAttr ); - - // XXX_jblas: We need to fix this so that it removes the document - // base URL, and then prepends with the new page URL. - //if full path exists and is same, chop it - helps IE out - thisUrl = thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' ); - - if( !/^(\w+:|#|\/)/.test( thisUrl ) ) { - $( this ).attr( thisAttr, newPath + thisUrl ); - } - }); - } - - //append to page and enhance - // TODO taging a page with external to make sure that embedded pages aren't removed - // by the various page handling code is bad. Having page handling code in many - // places is bad. Solutions post 1.0 - page - .attr( "data-" + $.mobile.ns + "url", path.convertUrlToDataUrl( fileUrl ) ) - .attr( "data-" + $.mobile.ns + "external-page", true ) - .appendTo( settings.pageContainer ); - - // wait for page creation to leverage options defined on widget - page.one( 'pagecreate', $.mobile._bindPageRemove ); - - enhancePage( page, settings.role ); - - // Enhancing the page may result in new dialogs/sub pages being inserted - // into the DOM. If the original absUrl refers to a sub-page, that is the - // real page we are interested in. - if ( absUrl.indexOf( "&" + $.mobile.subPageUrlKey ) > -1 ) { - page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" ); - } - - //bind pageHide to removePage after it's hidden, if the page options specify to do so - - // Remove loading message. - if ( settings.showLoadMsg ) { - hideMsg(); - } - - // Add the page reference and xhr to our triggerData. - triggerData.xhr = xhr; - triggerData.textStatus = textStatus; - triggerData.page = page; - - // Let listeners know the page loaded successfully. - settings.pageContainer.trigger( "pageload", triggerData ); - - deferred.resolve( absUrl, options, page, dupCachedPage ); - }, - error: function( xhr, textStatus, errorThrown ) { - //set base back to current path - if( base ) { - base.set( path.get() ); - } - - // Add error info to our triggerData. - triggerData.xhr = xhr; - triggerData.textStatus = textStatus; - triggerData.errorThrown = errorThrown; - - var plfEvent = new $.Event( "pageloadfailed" ); - - // Let listeners know the page load failed. - settings.pageContainer.trigger( plfEvent, triggerData ); - - // If the default behavior is prevented, stop here! - // Note that it is the responsibility of the listener/handler - // that called preventDefault(), to resolve/reject the - // deferred object within the triggerData. - if( plfEvent.isDefaultPrevented() ){ - return; - } - - // Remove loading message. - if ( settings.showLoadMsg ) { - - // Remove loading message. - hideMsg(); - - //show error message - $( "

"+ $.mobile.pageLoadErrorMessage +"

" ) - .css({ "display": "block", "opacity": 0.96, "top": $window.scrollTop() + 100 }) - .appendTo( settings.pageContainer ) - .delay( 800 ) - .fadeOut( 400, function() { - $( this ).remove(); - }); - } - - deferred.reject( absUrl, options ); - } - }); - } - - return deferred.promise(); - }; - - $.mobile.loadPage.defaults = { - type: "get", - data: undefined, - reloadPage: false, - role: undefined, // By default we rely on the role defined by the @data-role attribute. - showLoadMsg: false, - pageContainer: undefined, - loadMsgDelay: 50 // This delay allows loads that pull from browser cache to occur without showing the loading message. - }; - - // Show a specific page in the page container. - $.mobile.changePage = function( toPage, options ) { - // If we are in the midst of a transition, queue the current request. - // We'll call changePage() once we're done with the current transition to - // service the request. - if( isPageTransitioning ) { - pageTransitionQueue.unshift( arguments ); - return; - } - - var settings = $.extend( {}, $.mobile.changePage.defaults, options ); - - // Make sure we have a pageContainer to work with. - settings.pageContainer = settings.pageContainer || $.mobile.pageContainer; - - // Make sure we have a fromPage. - settings.fromPage = settings.fromPage || $.mobile.activePage; - - var mpc = settings.pageContainer, - pbcEvent = new $.Event( "pagebeforechange" ), - triggerData = { toPage: toPage, options: settings }; - - // Let listeners know we're about to change the current page. - mpc.trigger( pbcEvent, triggerData ); - - // If the default behavior is prevented, stop here! - if( pbcEvent.isDefaultPrevented() ){ - return; - } - - // We allow "pagebeforechange" observers to modify the toPage in the trigger - // data to allow for redirects. Make sure our toPage is updated. - - toPage = triggerData.toPage; - - // Set the isPageTransitioning flag to prevent any requests from - // entering this method while we are in the midst of loading a page - // or transitioning. - - isPageTransitioning = true; - - // If the caller passed us a url, call loadPage() - // to make sure it is loaded into the DOM. We'll listen - // to the promise object it returns so we know when - // it is done loading or if an error ocurred. - if ( typeof toPage == "string" ) { - $.mobile.loadPage( toPage, settings ) - .done(function( url, options, newPage, dupCachedPage ) { - isPageTransitioning = false; - options.duplicateCachedPage = dupCachedPage; - $.mobile.changePage( newPage, options ); - }) - .fail(function( url, options ) { - isPageTransitioning = false; - - //clear out the active button state - removeActiveLinkClass( true ); - - //release transition lock so navigation is free again - releasePageTransitionLock(); - settings.pageContainer.trigger( "pagechangefailed", triggerData ); - }); - return; - } - - // If we are going to the first-page of the application, we need to make - // sure settings.dataUrl is set to the application document url. This allows - // us to avoid generating a document url with an id hash in the case where the - // first-page of the document has an id attribute specified. - if ( toPage[ 0 ] === $.mobile.firstPage[ 0 ] && !settings.dataUrl ) { - settings.dataUrl = documentUrl.hrefNoHash; - } - - // The caller passed us a real page DOM element. Update our - // internal state and then trigger a transition to the page. - var fromPage = settings.fromPage, - url = ( settings.dataUrl && path.convertUrlToDataUrl( settings.dataUrl ) ) || toPage.jqmData( "url" ), - // The pageUrl var is usually the same as url, except when url is obscured as a dialog url. pageUrl always contains the file path - pageUrl = url, - fileUrl = path.getFilePath( url ), - active = urlHistory.getActive(), - activeIsInitialPage = urlHistory.activeIndex === 0, - historyDir = 0, - pageTitle = document.title, - isDialog = settings.role === "dialog" || toPage.jqmData( "role" ) === "dialog"; - - // By default, we prevent changePage requests when the fromPage and toPage - // are the same element, but folks that generate content manually/dynamically - // and reuse pages want to be able to transition to the same page. To allow - // this, they will need to change the default value of allowSamePageTransition - // to true, *OR*, pass it in as an option when they manually call changePage(). - // It should be noted that our default transition animations assume that the - // formPage and toPage are different elements, so they may behave unexpectedly. - // It is up to the developer that turns on the allowSamePageTransitiona option - // to either turn off transition animations, or make sure that an appropriate - // animation transition is used. - if( fromPage && fromPage[0] === toPage[0] && !settings.allowSamePageTransition ) { - isPageTransitioning = false; - mpc.trigger( "pagechange", triggerData ); - return; - } - - // We need to make sure the page we are given has already been enhanced. - enhancePage( toPage, settings.role ); - - // If the changePage request was sent from a hashChange event, check to see if the - // page is already within the urlHistory stack. If so, we'll assume the user hit - // the forward/back button and will try to match the transition accordingly. - if( settings.fromHashChange ) { - urlHistory.directHashChange({ - currentUrl: url, - isBack: function() { historyDir = -1; }, - isForward: function() { historyDir = 1; } - }); - } - - // Kill the keyboard. - // XXX_jblas: We need to stop crawling the entire document to kill focus. Instead, - // we should be tracking focus with a delegate() handler so we already have - // the element in hand at this point. - // Wrap this in a try/catch block since IE9 throw "Unspecified error" if document.activeElement - // is undefined when we are in an IFrame. - try { - if(document.activeElement && document.activeElement.nodeName.toLowerCase() != 'body') { - $(document.activeElement).blur(); - } else { - $( "input:focus, textarea:focus, select:focus" ).blur(); - } - } catch(e) {} - - // If we're displaying the page as a dialog, we don't want the url - // for the dialog content to be used in the hash. Instead, we want - // to append the dialogHashKey to the url of the current page. - if ( isDialog && active ) { - // on the initial page load active.url is undefined and in that case should - // be an empty string. Moving the undefined -> empty string back into - // urlHistory.addNew seemed imprudent given undefined better represents - // the url state - url = ( active.url || "" ) + dialogHashKey; - } - - // Set the location hash. - if( settings.changeHash !== false && url ) { - //disable hash listening temporarily - urlHistory.ignoreNextHashChange = true; - //update hash and history - path.set( url ); - } - - // if title element wasn't found, try the page div data attr too - // If this is a deep-link or a reload ( active === undefined ) then just use pageTitle - var newPageTitle = ( !active )? pageTitle : toPage.jqmData( "title" ) || toPage.children(":jqmData(role='header')").find(".ui-title" ).getEncodedText(); - if( !!newPageTitle && pageTitle == document.title ) { - pageTitle = newPageTitle; - } - if ( !toPage.jqmData( "title" ) ) { - toPage.jqmData( "title", pageTitle ); - } - - // Make sure we have a transition defined. - settings.transition = settings.transition - || ( ( historyDir && !activeIsInitialPage ) ? active.transition : undefined ) - || ( isDialog ? $.mobile.defaultDialogTransition : $.mobile.defaultPageTransition ); - - //add page to history stack if it's not back or forward - if( !historyDir ) { - urlHistory.addNew( url, settings.transition, pageTitle, pageUrl, settings.role ); - } - - //set page title - document.title = urlHistory.getActive().title; - - //set "toPage" as activePage - $.mobile.activePage = toPage; - - // If we're navigating back in the URL history, set reverse accordingly. - settings.reverse = settings.reverse || historyDir < 0; - - transitionPages( toPage, fromPage, settings.transition, settings.reverse ) - .done(function() { - removeActiveLinkClass(); - - //if there's a duplicateCachedPage, remove it from the DOM now that it's hidden - if ( settings.duplicateCachedPage ) { - settings.duplicateCachedPage.remove(); - } - - //remove initial build class (only present on first pageshow) - $html.removeClass( "ui-mobile-rendering" ); - - releasePageTransitionLock(); - - // Let listeners know we're all done changing the current page. - mpc.trigger( "pagechange", triggerData ); - }); - }; - - $.mobile.changePage.defaults = { - transition: undefined, - reverse: false, - changeHash: true, - fromHashChange: false, - role: undefined, // By default we rely on the role defined by the @data-role attribute. - duplicateCachedPage: undefined, - pageContainer: undefined, - showLoadMsg: true, //loading message shows by default when pages are being fetched during changePage - dataUrl: undefined, - fromPage: undefined, - allowSamePageTransition: false - }; - -/* Event Bindings - hashchange, submit, and click */ - function findClosestLink( ele ) - { - while ( ele ) { - // Look for the closest element with a nodeName of "a". - // Note that we are checking if we have a valid nodeName - // before attempting to access it. This is because the - // node we get called with could have originated from within - // an embedded SVG document where some symbol instance elements - // don't have nodeName defined on them, or strings are of type - // SVGAnimatedString. - if ( ( typeof ele.nodeName === "string" ) && ele.nodeName.toLowerCase() == "a" ) { - break; - } - ele = ele.parentNode; - } - return ele; - } - - // The base URL for any given element depends on the page it resides in. - function getClosestBaseUrl( ele ) - { - // Find the closest page and extract out its url. - var url = $( ele ).closest( ".ui-page" ).jqmData( "url" ), - base = documentBase.hrefNoHash; - - if ( !url || !path.isPath( url ) ) { - url = base; - } - - return path.makeUrlAbsolute( url, base); - } - - //The following event bindings should be bound after mobileinit has been triggered - //the following function is called in the init file - $.mobile._registerInternalEvents = function(){ - - //bind to form submit events, handle with Ajax - $( document ).delegate( "form", "submit", function( event ) { - var $this = $( this ); - if( !$.mobile.ajaxEnabled || - $this.is( ":jqmData(ajax='false')" ) ) { - return; - } - - var type = $this.attr( "method" ), - target = $this.attr( "target" ), - url = $this.attr( "action" ); - - // If no action is specified, browsers default to using the - // URL of the document containing the form. Since we dynamically - // pull in pages from external documents, the form should submit - // to the URL for the source document of the page containing - // the form. - if ( !url ) { - // Get the @data-url for the page containing the form. - url = getClosestBaseUrl( $this ); - if ( url === documentBase.hrefNoHash ) { - // The url we got back matches the document base, - // which means the page must be an internal/embedded page, - // so default to using the actual document url as a browser - // would. - url = documentUrl.hrefNoSearch; - } - } - - url = path.makeUrlAbsolute( url, getClosestBaseUrl($this) ); - - if(( path.isExternal( url ) && !path.isPermittedCrossDomainRequest(documentUrl, url)) || target ) { - return; - } - - $.mobile.changePage( - url, - { - type: type && type.length && type.toLowerCase() || "get", - data: $this.serialize(), - transition: $this.jqmData( "transition" ), - direction: $this.jqmData( "direction" ), - reloadPage: true - } - ); - event.preventDefault(); - }); - - //add active state on vclick - $( document ).bind( "vclick", function( event ) { - // if this isn't a left click we don't care. Its important to note - // that when the virtual event is generated it will create - if ( event.which > 1 || !$.mobile.linkBindingEnabled ){ - return; - } - - var link = findClosestLink( event.target ); - if ( link ) { - if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) { - removeActiveLinkClass( true ); - $activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" ); - $activeClickedLink.addClass( $.mobile.activeBtnClass ); - $( "." + $.mobile.activePageClass + " .ui-btn" ).not( link ).blur(); - } - } - }); - - // click routing - direct to HTTP or Ajax, accordingly - $( document ).bind( "click", function( event ) { - if( !$.mobile.linkBindingEnabled ){ - return; - } - - var link = findClosestLink( event.target ); - - // If there is no link associated with the click or its not a left - // click we want to ignore the click - if ( !link || event.which > 1) { - return; - } - - var $link = $( link ), - //remove active link class if external (then it won't be there if you come back) - httpCleanup = function(){ - window.setTimeout( function() { removeActiveLinkClass( true ); }, 200 ); - }; - - //if there's a data-rel=back attr, go back in history - if( $link.is( ":jqmData(rel='back')" ) ) { - window.history.back(); - return false; - } - - var baseUrl = getClosestBaseUrl( $link ), - - //get href, if defined, otherwise default to empty hash - href = path.makeUrlAbsolute( $link.attr( "href" ) || "#", baseUrl ); - - //if ajax is disabled, exit early - if( !$.mobile.ajaxEnabled && !path.isEmbeddedPage( href ) ){ - httpCleanup(); - //use default click handling - return; - } - - // XXX_jblas: Ideally links to application pages should be specified as - // an url to the application document with a hash that is either - // the site relative path or id to the page. But some of the - // internal code that dynamically generates sub-pages for nested - // lists and select dialogs, just write a hash in the link they - // create. This means the actual URL path is based on whatever - // the current value of the base tag is at the time this code - // is called. For now we are just assuming that any url with a - // hash in it is an application page reference. - if ( href.search( "#" ) != -1 ) { - href = href.replace( /[^#]*#/, "" ); - if ( !href ) { - //link was an empty hash meant purely - //for interaction, so we ignore it. - event.preventDefault(); - return; - } else if ( path.isPath( href ) ) { - //we have apath so make it the href we want to load. - href = path.makeUrlAbsolute( href, baseUrl ); - } else { - //we have a simple id so use the documentUrl as its base. - href = path.makeUrlAbsolute( "#" + href, documentUrl.hrefNoHash ); - } - } - - // Should we handle this link, or let the browser deal with it? - var useDefaultUrlHandling = $link.is( "[rel='external']" ) || $link.is( ":jqmData(ajax='false')" ) || $link.is( "[target]" ), - - // Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR - // requests if the document doing the request was loaded via the file:// protocol. - // This is usually to allow the application to "phone home" and fetch app specific - // data. We normally let the browser handle external/cross-domain urls, but if the - // allowCrossDomainPages option is true, we will allow cross-domain http/https - // requests to go through our page loading logic. - - //check for protocol or rel and its not an embedded page - //TODO overlap in logic from isExternal, rel=external check should be - // moved into more comprehensive isExternalLink - isExternal = useDefaultUrlHandling || ( path.isExternal( href ) && !path.isPermittedCrossDomainRequest(documentUrl, href) ); - - if( isExternal ) { - httpCleanup(); - //use default click handling - return; - } - - //use ajax - var transition = $link.jqmData( "transition" ), - direction = $link.jqmData( "direction" ), - reverse = ( direction && direction === "reverse" ) || - // deprecated - remove by 1.0 - $link.jqmData( "back" ), - - //this may need to be more specific as we use data-rel more - role = $link.attr( "data-" + $.mobile.ns + "rel" ) || undefined; - - $.mobile.changePage( href, { transition: transition, reverse: reverse, role: role } ); - event.preventDefault(); - }); - - //prefetch pages when anchors with data-prefetch are encountered - $( document ).delegate( ".ui-page", "pageshow.prefetch", function() { - var urls = []; - $( this ).find( "a:jqmData(prefetch)" ).each(function(){ - var $link = $(this), - url = $link.attr( "href" ); - - if ( url && $.inArray( url, urls ) === -1 ) { - urls.push( url ); - - $.mobile.loadPage( url, {role: $link.attr("data-" + $.mobile.ns + "rel")} ); - } - }); - }); - - $.mobile._handleHashChange = function( hash ) { - //find first page via hash - var to = path.stripHash( hash ), - //transition is false if it's the first page, undefined otherwise (and may be overridden by default) - transition = $.mobile.urlHistory.stack.length === 0 ? "none" : undefined, - - // default options for the changPage calls made after examining the current state - // of the page and the hash - changePageOptions = { - transition: transition, - changeHash: false, - fromHashChange: true - }; - - //if listening is disabled (either globally or temporarily), or it's a dialog hash - if( !$.mobile.hashListeningEnabled || urlHistory.ignoreNextHashChange ) { - urlHistory.ignoreNextHashChange = false; - return; - } - - // special case for dialogs - if( urlHistory.stack.length > 1 && to.indexOf( dialogHashKey ) > -1 ) { - - // If current active page is not a dialog skip the dialog and continue - // in the same direction - if(!$.mobile.activePage.is( ".ui-dialog" )) { - //determine if we're heading forward or backward and continue accordingly past - //the current dialog - urlHistory.directHashChange({ - currentUrl: to, - isBack: function() { window.history.back(); }, - isForward: function() { window.history.forward(); } - }); - - // prevent changePage() - return; - } else { - // if the current active page is a dialog and we're navigating - // to a dialog use the dialog objected saved in the stack - urlHistory.directHashChange({ - currentUrl: to, - - // regardless of the direction of the history change - // do the following - either: function( isBack ) { - var active = $.mobile.urlHistory.getActive(); - - to = active.pageUrl; - - // make sure to set the role, transition and reversal - // as most of this is lost by the domCache cleaning - $.extend( changePageOptions, { - role: active.role, - transition: active.transition, - reverse: isBack - }); - } - }); - } - } - - //if to is defined, load it - if ( to ) { - // At this point, 'to' can be one of 3 things, a cached page element from - // a history stack entry, an id, or site-relative/absolute URL. If 'to' is - // an id, we need to resolve it against the documentBase, not the location.href, - // since the hashchange could've been the result of a forward/backward navigation - // that crosses from an external page/dialog to an internal page/dialog. - to = ( typeof to === "string" && !path.isPath( to ) ) ? ( path.makeUrlAbsolute( '#' + to, documentBase ) ) : to; - $.mobile.changePage( to, changePageOptions ); - } else { - //there's no hash, go to the first page in the dom - $.mobile.changePage( $.mobile.firstPage, changePageOptions ); - } - }; - - //hashchange event handler - $window.bind( "hashchange", function( e, triggered ) { - $.mobile._handleHashChange( location.hash ); - }); - - //set page min-heights to be device specific - $( document ).bind( "pageshow", resetActivePageHeight ); - $( window ).bind( "throttledresize", resetActivePageHeight ); - - };//_registerInternalEvents callback - -})( jQuery ); -/* -* history.pushState support, layered on top of hashchange -*/ - -( function( $, window ) { - // For now, let's Monkeypatch this onto the end of $.mobile._registerInternalEvents - // Scope self to pushStateHandler so we can reference it sanely within the - // methods handed off as event handlers - var pushStateHandler = {}, - self = pushStateHandler, - $win = $( window ), - url = $.mobile.path.parseUrl( location.href ); - - $.extend( pushStateHandler, { - // TODO move to a path helper, this is rather common functionality - initialFilePath: (function() { - return url.pathname + url.search; - })(), - - initialHref: url.hrefNoHash, - - // Flag for tracking if a Hashchange naturally occurs after each popstate + replace - hashchangeFired: false, - - state: function() { - return { - hash: location.hash || "#" + self.initialFilePath, - title: document.title, - - // persist across refresh - initialHref: self.initialHref - }; - }, - - resetUIKeys: function( url ) { - var dialog = $.mobile.dialogHashKey, - subkey = "&" + $.mobile.subPageUrlKey, - dialogIndex = url.indexOf( dialog ); - - if( dialogIndex > -1 ) { - url = url.slice( 0, dialogIndex ) + "#" + url.slice( dialogIndex ); - } else if( url.indexOf( subkey ) > -1 ) { - url = url.split( subkey ).join( "#" + subkey ); - } - - return url; - }, - - // TODO sort out a single barrier to hashchange functionality - nextHashChangePrevented: function( value ) { - $.mobile.urlHistory.ignoreNextHashChange = value; - self.onHashChangeDisabled = value; - }, - - // on hash change we want to clean up the url - // NOTE this takes place *after* the vanilla navigation hash change - // handling has taken place and set the state of the DOM - onHashChange: function( e ) { - // disable this hash change - if( self.onHashChangeDisabled ){ - return; - } - - var href, state, - hash = location.hash, - isPath = $.mobile.path.isPath( hash ), - resolutionUrl = isPath ? location.href : $.mobile.getDocumentUrl(); - hash = isPath ? hash.replace( "#", "" ) : hash; - - // propulate the hash when its not available - state = self.state(); - - // make the hash abolute with the current href - href = $.mobile.path.makeUrlAbsolute( hash, resolutionUrl ); - - if ( isPath ) { - href = self.resetUIKeys( href ); - } - - // replace the current url with the new href and store the state - // Note that in some cases we might be replacing an url with the - // same url. We do this anyways because we need to make sure that - // all of our history entries have a state object associated with - // them. This allows us to work around the case where window.history.back() - // is called to transition from an external page to an embedded page. - // In that particular case, a hashchange event is *NOT* generated by the browser. - // Ensuring each history entry has a state object means that onPopState() - // will always trigger our hashchange callback even when a hashchange event - // is not fired. - history.replaceState( state, document.title, href ); - }, - - // on popstate (ie back or forward) we need to replace the hash that was there previously - // cleaned up by the additional hash handling - onPopState: function( e ) { - var poppedState = e.originalEvent.state, holdnexthashchange = false; - - // if there's no state its not a popstate we care about, ie chrome's initial popstate - // or forward popstate - if( poppedState ) { - // disable any hashchange triggered by the browser - self.nextHashChangePrevented( true ); - - // defer our manual hashchange until after the browser fired - // version has come and gone - setTimeout(function() { - // make sure that the manual hash handling takes place - self.nextHashChangePrevented( false ); - - // change the page based on the hash - $.mobile._handleHashChange( poppedState.hash ); - }, 100); - } - }, - - init: function() { - $win.bind( "hashchange", self.onHashChange ); - - // Handle popstate events the occur through history changes - $win.bind( "popstate", self.onPopState ); - - // if there's no hash, we need to replacestate for returning to home - if ( location.hash === "" ) { - history.replaceState( self.state(), document.title, location.href ); - } - } - }); - - $( function() { - if( $.mobile.pushStateEnabled && $.support.pushState ){ - pushStateHandler.init(); - } - }); -})( jQuery, this ); -/* -* "transitions" plugin - Page change tranistions -*/ - -(function( $, window, undefined ) { - -function css3TransitionHandler( name, reverse, $to, $from ) { - - var deferred = new $.Deferred(), - reverseClass = reverse ? " reverse" : "", - viewportClass = "ui-mobile-viewport-transitioning viewport-" + name, - doneFunc = function() { - - $to.add( $from ).removeClass( "out in reverse " + name ); - - if ( $from && $from[ 0 ] !== $to[ 0 ] ) { - $from.removeClass( $.mobile.activePageClass ); - } - - $to.parent().removeClass( viewportClass ); - - deferred.resolve( name, reverse, $to, $from ); - }; - - $to.animationComplete( doneFunc ); - - $to.parent().addClass( viewportClass ); - - if ( $from ) { - $from.addClass( name + " out" + reverseClass ); - } - $to.addClass( $.mobile.activePageClass + " " + name + " in" + reverseClass ); - - return deferred.promise(); -} - -// Make our transition handler public. -$.mobile.css3TransitionHandler = css3TransitionHandler; - -// If the default transition handler is the 'none' handler, replace it with our handler. -if ( $.mobile.defaultTransitionHandler === $.mobile.noneTransitionHandler ) { - $.mobile.defaultTransitionHandler = css3TransitionHandler; -} - -})( jQuery, this ); -/* -* "degradeInputs" plugin - degrades inputs to another type after custom enhancements are made. -*/ - -(function( $, undefined ) { - -$.mobile.page.prototype.options.degradeInputs = { - color: false, - date: false, - datetime: false, - "datetime-local": false, - email: false, - month: false, - number: false, - range: "number", - search: "text", - tel: false, - time: false, - url: false, - week: false -}; - - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - - var page = $.mobile.closestPageData( $(e.target) ); - - if( !page ) { - return; - } - - options = page.options; - - // degrade inputs to avoid poorly implemented native functionality - $( e.target ).find( "input" ).not( page.keepNativeSelector() ).each(function() { - var $this = $( this ), - type = this.getAttribute( "type" ), - optType = options.degradeInputs[ type ] || "text"; - - if ( options.degradeInputs[ type ] ) { - var html = $( "
" ).html( $this.clone() ).html(), - // In IE browsers, the type sometimes doesn't exist in the cloned markup, so we replace the closing tag instead - hasType = html.indexOf( " type=" ) > -1, - findstr = hasType ? /\s+type=["']?\w+['"]?/ : /\/?>/, - repstr = " type=\"" + optType + "\" data-" + $.mobile.ns + "type=\"" + type + "\"" + ( hasType ? "" : ">" ); - - $this.replaceWith( html.replace( findstr, repstr ) ); - } - }); - -}); - -})( jQuery );/* -* "dialog" plugin. -*/ - -(function( $, window, undefined ) { - -$.widget( "mobile.dialog", $.mobile.widget, { - options: { - closeBtnText : "Close", - overlayTheme : "a", - initSelector : ":jqmData(role='dialog')" - }, - _create: function() { - var self = this, - $el = this.element, - headerCloseButton = $( ""+ this.options.closeBtnText + "" ); - - $el.addClass( "ui-overlay-" + this.options.overlayTheme ); - - // Class the markup for dialog styling - // Set aria role - $el.attr( "role", "dialog" ) - .addClass( "ui-dialog" ) - .find( ":jqmData(role='header')" ) - .addClass( "ui-corner-top ui-overlay-shadow" ) - .prepend( headerCloseButton ) - .end() - .find( ":jqmData(role='content'),:jqmData(role='footer')" ) - .addClass( "ui-overlay-shadow" ) - .last() - .addClass( "ui-corner-bottom" ); - - // this must be an anonymous function so that select menu dialogs can replace - // the close method. This is a change from previously just defining data-rel=back - // on the button and letting nav handle it - // - // Use click rather than vclick in order to prevent the possibility of unintentionally - // reopening the dialog if the dialog opening item was directly under the close button. - headerCloseButton.bind( "click", function() { - self.close(); - }); - - /* bind events - - clicks and submits should use the closing transition that the dialog opened with - unless a data-transition is specified on the link/form - - if the click was on the close button, or the link has a data-rel="back" it'll go back in history naturally - */ - $el.bind( "vclick submit", function( event ) { - var $target = $( event.target ).closest( event.type === "vclick" ? "a" : "form" ), - active; - - if ( $target.length && !$target.jqmData( "transition" ) ) { - - active = $.mobile.urlHistory.getActive() || {}; - - $target.attr( "data-" + $.mobile.ns + "transition", ( active.transition || $.mobile.defaultDialogTransition ) ) - .attr( "data-" + $.mobile.ns + "direction", "reverse" ); - } - }) - .bind( "pagehide", function() { - $( this ).find( "." + $.mobile.activeBtnClass ).removeClass( $.mobile.activeBtnClass ); - }); - }, - - // Close method goes back in history - close: function() { - window.history.back(); - } -}); - -//auto self-init widgets -$( document ).delegate( $.mobile.dialog.prototype.options.initSelector, "pagecreate", function(){ - $( this ).dialog(); -}); - -})( jQuery, this ); -/* -* This plugin handles theming and layout of headers, footers, and content areas -*/ - -(function( $, undefined ) { - -$.mobile.page.prototype.options.backBtnText = "Back"; -$.mobile.page.prototype.options.addBackBtn = false; -$.mobile.page.prototype.options.backBtnTheme = null; -$.mobile.page.prototype.options.headerTheme = "a"; -$.mobile.page.prototype.options.footerTheme = "a"; -$.mobile.page.prototype.options.contentTheme = null; - -$( document ).delegate( ":jqmData(role='page'), :jqmData(role='dialog')", "pagecreate", function( e ) { - - var $page = $( this ), - o = $page.data( "page" ).options, - pageRole = $page.jqmData( "role" ), - pageTheme = o.theme; - - $( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", this ).each(function() { - var $this = $( this ), - role = $this.jqmData( "role" ), - theme = $this.jqmData( "theme" ), - contentTheme = theme || o.contentTheme || ( pageRole === "dialog" && pageTheme ), - $headeranchors, - leftbtn, - rightbtn, - backBtn; - - $this.addClass( "ui-" + role ); - - //apply theming and markup modifications to page,header,content,footer - if ( role === "header" || role === "footer" ) { - - var thisTheme = theme || ( role === "header" ? o.headerTheme : o.footerTheme ) || pageTheme; - - $this - //add theme class - .addClass( "ui-bar-" + thisTheme ) - // Add ARIA role - .attr( "role", role === "header" ? "banner" : "contentinfo" ); - - // Right,left buttons - $headeranchors = $this.children( "a" ); - leftbtn = $headeranchors.hasClass( "ui-btn-left" ); - rightbtn = $headeranchors.hasClass( "ui-btn-right" ); - - leftbtn = leftbtn || $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length; - - rightbtn = rightbtn || $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length; - - // Auto-add back btn on pages beyond first view - if ( o.addBackBtn && - role === "header" && - $( ".ui-page" ).length > 1 && - $this.jqmData( "url" ) !== $.mobile.path.stripHash( location.hash ) && - !leftbtn ) { - - backBtn = $( ""+ o.backBtnText +"" ) - // If theme is provided, override default inheritance - .attr( "data-"+ $.mobile.ns +"theme", o.backBtnTheme || thisTheme ) - .prependTo( $this ); - } - - // Page title - $this.children( "h1, h2, h3, h4, h5, h6" ) - .addClass( "ui-title" ) - // Regardless of h element number in src, it becomes h1 for the enhanced page - .attr({ - "tabindex": "0", - "role": "heading", - "aria-level": "1" - }); - - } else if ( role === "content" ) { - if ( contentTheme ) { - $this.addClass( "ui-body-" + ( contentTheme ) ); - } - - // Add ARIA role - $this.attr( "role", "main" ); - } - }); -}); - -})( jQuery );/* -* "collapsible" plugin -*/ - -(function( $, undefined ) { - -$.widget( "mobile.collapsible", $.mobile.widget, { - options: { - expandCueText: " click to expand contents", - collapseCueText: " click to collapse contents", - collapsed: true, - heading: "h1,h2,h3,h4,h5,h6,legend", - theme: null, - contentTheme: null, - iconTheme: "d", - initSelector: ":jqmData(role='collapsible')" - }, - _create: function() { - - var $el = this.element, - o = this.options, - collapsible = $el.addClass( "ui-collapsible" ), - collapsibleHeading = $el.children( o.heading ).first(), - collapsibleContent = collapsible.wrapInner( "
" ).find( ".ui-collapsible-content" ), - collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" ); - - // Replace collapsibleHeading if it's a legend - if ( collapsibleHeading.is( "legend" ) ) { - collapsibleHeading = $( "
"+ collapsibleHeading.html() +"
" ).insertBefore( collapsibleHeading ); - collapsibleHeading.next().remove(); - } - - // If we are in a collapsible set - if ( collapsibleSet.length ) { - // Inherit the theme from collapsible-set - if ( !o.theme ) { - o.theme = collapsibleSet.jqmData( "theme" ); - } - // Inherit the content-theme from collapsible-set - if ( !o.contentTheme ) { - o.contentTheme = collapsibleSet.jqmData( "content-theme" ); - } - } - - collapsibleContent.addClass( ( o.contentTheme ) ? ( "ui-body-" + o.contentTheme ) : ""); - - collapsibleHeading - //drop heading in before content - .insertBefore( collapsibleContent ) - //modify markup & attributes - .addClass( "ui-collapsible-heading" ) - .append( "" ) - .wrapInner( "" ) - .find( "a" ) - .first() - .buttonMarkup({ - shadow: false, - corners: false, - iconPos: "left", - icon: "plus", - theme: o.theme - }) - .add( ".ui-btn-inner" ) - .addClass( "ui-corner-top ui-corner-bottom" ); - - //events - collapsible - .bind( "expand collapse", function( event ) { - if ( !event.isDefaultPrevented() ) { - - event.preventDefault(); - - var $this = $( this ), - isCollapse = ( event.type === "collapse" ), - contentTheme = o.contentTheme; - - collapsibleHeading - .toggleClass( "ui-collapsible-heading-collapsed", isCollapse) - .find( ".ui-collapsible-heading-status" ) - .text( isCollapse ? o.expandCueText : o.collapseCueText ) - .end() - .find( ".ui-icon" ) - .toggleClass( "ui-icon-minus", !isCollapse ) - .toggleClass( "ui-icon-plus", isCollapse ); - - $this.toggleClass( "ui-collapsible-collapsed", isCollapse ); - collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse ); - - if ( contentTheme && ( !collapsibleSet.length || collapsible.jqmData( "collapsible-last" ) ) ) { - collapsibleHeading - .find( "a" ).first().add( collapsibleHeading.find( ".ui-btn-inner" ) ) - .toggleClass( "ui-corner-bottom", isCollapse ); - collapsibleContent.toggleClass( "ui-corner-bottom", !isCollapse ); - } - collapsibleContent.trigger( "updatelayout" ); - } - }) - .trigger( o.collapsed ? "collapse" : "expand" ); - - collapsibleHeading - .bind( "click", function( event ) { - - var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ? - "expand" : "collapse"; - - collapsible.trigger( type ); - - event.preventDefault(); - }); - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $( $.mobile.collapsible.prototype.options.initSelector, e.target ).collapsible(); -}); - -})( jQuery ); -/* -* "collapsibleset" plugin -*/ - -(function( $, undefined ) { - -$.widget( "mobile.collapsibleset", $.mobile.widget, { - options: { - initSelector: ":jqmData(role='collapsible-set')" - }, - _create: function() { - var $el = this.element.addClass( "ui-collapsible-set" ), - o = this.options, - collapsiblesInSet = $el.children( ":jqmData(role='collapsible')" ); - - // Inherit the theme from collapsible-set - if ( !o.theme ) { - o.theme = $el.jqmData( "theme" ); - } - // Inherit the content-theme from collapsible-set - if ( !o.contentTheme ) { - o.contentTheme = $el.jqmData( "content-theme" ); - } - - // Initialize the collapsible set if it's not already initialized - if ( !$el.jqmData( "collapsiblebound" ) ) { - - $el - .jqmData( "collapsiblebound", true ) - .bind( "expand collapse", function( event ) { - var isCollapse = ( event.type === "collapse" ), - collapsible = $( event.target ).closest( ".ui-collapsible" ), - widget = collapsible.data( "collapsible" ), - contentTheme = widget.options.contentTheme; - if ( contentTheme && collapsible.jqmData( "collapsible-last" ) ) { - collapsible.find( widget.options.heading ).first() - .find( "a" ).first() - .add( ".ui-btn-inner" ) - .toggleClass( "ui-corner-bottom", isCollapse ); - collapsible.find( ".ui-collapsible-content" ).toggleClass( "ui-corner-bottom", !isCollapse ); - } - }) - .bind( "expand", function( event ) { - $( event.target ) - .closest( ".ui-collapsible" ) - .siblings( ".ui-collapsible" ) - .trigger( "collapse" ); - - }); - - // clean up borders - collapsiblesInSet.each( function() { - $( this ).find( $.mobile.collapsible.prototype.options.heading ) - .find( "a" ).first() - .add( ".ui-btn-inner" ) - .removeClass( "ui-corner-top ui-corner-bottom" ); - }); - - collapsiblesInSet.first() - .find( "a" ) - .first() - .addClass( "ui-corner-top" ) - .find( ".ui-btn-inner" ) - .addClass( "ui-corner-top" ); - - collapsiblesInSet.last() - .jqmData( "collapsible-last", true ) - .find( "a" ) - .first() - .addClass( "ui-corner-bottom" ) - .find( ".ui-btn-inner" ) - .addClass( "ui-corner-bottom" ); - } - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $( $.mobile.collapsibleset.prototype.options.initSelector, e.target ).collapsibleset(); -}); - -})( jQuery ); -/* -* "fieldcontain" plugin - simple class additions to make form row separators -*/ - -(function( $, undefined ) { - -$.fn.fieldcontain = function( options ) { - return this.addClass( "ui-field-contain ui-body ui-br" ); -}; - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $( ":jqmData(role='fieldcontain')", e.target ).fieldcontain(); -}); - -})( jQuery );/* -* plugin for creating CSS grids -*/ - -(function( $, undefined ) { - -$.fn.grid = function( options ) { - return this.each(function() { - - var $this = $( this ), - o = $.extend({ - grid: null - },options), - $kids = $this.children(), - gridCols = {solo:1, a:2, b:3, c:4, d:5}, - grid = o.grid, - iterator; - - if ( !grid ) { - if ( $kids.length <= 5 ) { - for ( var letter in gridCols ) { - if ( gridCols[ letter ] === $kids.length ) { - grid = letter; - } - } - } else { - grid = "a"; - } - } - iterator = gridCols[grid]; - - $this.addClass( "ui-grid-" + grid ); - - $kids.filter( ":nth-child(" + iterator + "n+1)" ).addClass( "ui-block-a" ); - - if ( iterator > 1 ) { - $kids.filter( ":nth-child(" + iterator + "n+2)" ).addClass( "ui-block-b" ); - } - if ( iterator > 2 ) { - $kids.filter( ":nth-child(3n+3)" ).addClass( "ui-block-c" ); - } - if ( iterator > 3 ) { - $kids.filter( ":nth-child(4n+4)" ).addClass( "ui-block-d" ); - } - if ( iterator > 4 ) { - $kids.filter( ":nth-child(5n+5)" ).addClass( "ui-block-e" ); - } - }); -}; -})( jQuery );/* -* "navbar" plugin -*/ - -(function( $, undefined ) { - -$.widget( "mobile.navbar", $.mobile.widget, { - options: { - iconpos: "top", - grid: null, - initSelector: ":jqmData(role='navbar')" - }, - - _create: function(){ - - var $navbar = this.element, - $navbtns = $navbar.find( "a" ), - iconpos = $navbtns.filter( ":jqmData(icon)" ).length ? - this.options.iconpos : undefined; - - $navbar.addClass( "ui-navbar" ) - .attr( "role","navigation" ) - .find( "ul" ) - .grid({ grid: this.options.grid }); - - if ( !iconpos ) { - $navbar.addClass( "ui-navbar-noicons" ); - } - - $navbtns.buttonMarkup({ - corners: false, - shadow: false, - iconpos: iconpos - }); - - $navbar.delegate( "a", "vclick", function( event ) { - if( !$(event.target).hasClass("ui-disabled") ) { - $navbtns.not( ".ui-state-persist" ).removeClass( $.mobile.activeBtnClass ); - $( this ).addClass( $.mobile.activeBtnClass ); - } - }); - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $( $.mobile.navbar.prototype.options.initSelector, e.target ).navbar(); -}); - -})( jQuery ); -/* -* "listview" plugin -*/ - -(function( $, undefined ) { - -//Keeps track of the number of lists per page UID -//This allows support for multiple nested list in the same page -//https://github.com/jquery/jquery-mobile/issues/1617 -var listCountPerPage = {}; - -$.widget( "mobile.listview", $.mobile.widget, { - options: { - theme: null, - countTheme: "c", - headerTheme: "b", - dividerTheme: "b", - splitIcon: "arrow-r", - splitTheme: "b", - inset: false, - initSelector: ":jqmData(role='listview')" - }, - - _create: function() { - var t = this; - - // create listview markup - t.element.addClass(function( i, orig ) { - return orig + " ui-listview " + ( t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : "" ); - }); - - t.refresh( true ); - }, - - _removeCorners: function( li, which ) { - var top = "ui-corner-top ui-corner-tr ui-corner-tl", - bot = "ui-corner-bottom ui-corner-br ui-corner-bl"; - - li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) ); - - if ( which === "top" ) { - li.removeClass( top ); - } else if ( which === "bottom" ) { - li.removeClass( bot ); - } else { - li.removeClass( top + " " + bot ); - } - }, - - _refreshCorners: function( create ) { - var $li, - $visibleli, - $topli, - $bottomli; - - if ( this.options.inset ) { - $li = this.element.children( "li" ); - // at create time the li are not visible yet so we need to rely on .ui-screen-hidden - $visibleli = create?$li.not( ".ui-screen-hidden" ):$li.filter( ":visible" ); - - this._removeCorners( $li ); - - // Select the first visible li element - $topli = $visibleli.first() - .addClass( "ui-corner-top" ); - - $topli.add( $topli.find( ".ui-btn-inner" ) - .not( ".ui-li-link-alt span:first-child" ) ) - .addClass( "ui-corner-top" ) - .end() - .find( ".ui-li-link-alt, .ui-li-link-alt span:first-child" ) - .addClass( "ui-corner-tr" ) - .end() - .find( ".ui-li-thumb" ) - .not(".ui-li-icon") - .addClass( "ui-corner-tl" ); - - // Select the last visible li element - $bottomli = $visibleli.last() - .addClass( "ui-corner-bottom" ); - - $bottomli.add( $bottomli.find( ".ui-btn-inner" ) ) - .find( ".ui-li-link-alt" ) - .addClass( "ui-corner-br" ) - .end() - .find( ".ui-li-thumb" ) - .not(".ui-li-icon") - .addClass( "ui-corner-bl" ); - } - if ( !create ) { - this.element.trigger( "updatelayout" ); - } - }, - - // This is a generic utility method for finding the first - // node with a given nodeName. It uses basic DOM traversal - // to be fast and is meant to be a substitute for simple - // $.fn.closest() and $.fn.children() calls on a single - // element. Note that callers must pass both the lowerCase - // and upperCase version of the nodeName they are looking for. - // The main reason for this is that this function will be - // called many times and we want to avoid having to lowercase - // the nodeName from the element every time to ensure we have - // a match. Note that this function lives here for now, but may - // be moved into $.mobile if other components need a similar method. - _findFirstElementByTagName: function( ele, nextProp, lcName, ucName ) - { - var dict = {}; - dict[ lcName ] = dict[ ucName ] = true; - while ( ele ) { - if ( dict[ ele.nodeName ] ) { - return ele; - } - ele = ele[ nextProp ]; - } - return null; - }, - _getChildrenByTagName: function( ele, lcName, ucName ) - { - var results = [], - dict = {}; - dict[ lcName ] = dict[ ucName ] = true; - ele = ele.firstChild; - while ( ele ) { - if ( dict[ ele.nodeName ] ) { - results.push( ele ); - } - ele = ele.nextSibling; - } - return $( results ); - }, - - _addThumbClasses: function( containers ) - { - var i, img, len = containers.length; - for ( i = 0; i < len; i++ ) { - img = $( this._findFirstElementByTagName( containers[ i ].firstChild, "nextSibling", "img", "IMG" ) ); - if ( img.length ) { - img.addClass( "ui-li-thumb" ); - $( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" ); - } - } - }, - - refresh: function( create ) { - this.parentPage = this.element.closest( ".ui-page" ); - this._createSubPages(); - - var o = this.options, - $list = this.element, - self = this, - dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme, - listsplittheme = $list.jqmData( "splittheme" ), - listspliticon = $list.jqmData( "spliticon" ), - li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" ), - counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1, - itemClassDict = {}, - item, itemClass, itemTheme, - a, last, splittheme, countParent, icon, imgParents, img; - - if ( counter ) { - $list.find( ".ui-li-dec" ).remove(); - } - - if ( !o.theme ) { - o.theme = $.mobile.getInheritedTheme( this.element, "c" ); - } - - for ( var pos = 0, numli = li.length; pos < numli; pos++ ) { - item = li.eq( pos ); - itemClass = "ui-li"; - - // If we're creating the element, we update it regardless - if ( create || !item.hasClass( "ui-li" ) ) { - itemTheme = item.jqmData("theme") || o.theme; - a = this._getChildrenByTagName( item[ 0 ], "a", "A" ); - - if ( a.length ) { - icon = item.jqmData("icon"); - - item.buttonMarkup({ - wrapperEls: "div", - shadow: false, - corners: false, - iconpos: "right", - icon: a.length > 1 || icon === false ? false : icon || "arrow-r", - theme: itemTheme - }); - - if ( ( icon != false ) && ( a.length == 1 ) ) { - item.addClass( "ui-li-has-arrow" ); - } - - a.first().addClass( "ui-link-inherit" ); - - if ( a.length > 1 ) { - itemClass += " ui-li-has-alt"; - - last = a.last(); - splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme; - - last.appendTo(item) - .attr( "title", last.getEncodedText() ) - .addClass( "ui-li-link-alt" ) - .empty() - .buttonMarkup({ - shadow: false, - corners: false, - theme: itemTheme, - icon: false, - iconpos: false - }) - .find( ".ui-btn-inner" ) - .append( - $( document.createElement( "span" ) ).buttonMarkup({ - shadow: true, - corners: true, - theme: splittheme, - iconpos: "notext", - icon: listspliticon || last.jqmData( "icon" ) || o.splitIcon - }) - ); - } - } else if ( item.jqmData( "role" ) === "list-divider" ) { - - itemClass += " ui-li-divider ui-btn ui-bar-" + dividertheme; - item.attr( "role", "heading" ); - - //reset counter when a divider heading is encountered - if ( counter ) { - counter = 1; - } - - } else { - itemClass += " ui-li-static ui-body-" + itemTheme; - } - } - - if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) { - countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" ); - - countParent.addClass( "ui-li-jsnumbering" ) - .prepend( "" + (counter++) + ". " ); - } - - // Instead of setting item class directly on the list item and its - // btn-inner at this point in time, push the item into a dictionary - // that tells us what class to set on it so we can do this after this - // processing loop is finished. - - if ( !itemClassDict[ itemClass ] ) { - itemClassDict[ itemClass ] = []; - } - - itemClassDict[ itemClass ].push( item[ 0 ] ); - } - - // Set the appropriate listview item classes on each list item - // and their btn-inner elements. The main reason we didn't do this - // in the for-loop above is because we can eliminate per-item function overhead - // by calling addClass() and children() once or twice afterwards. This - // can give us a significant boost on platforms like WP7.5. - - for ( itemClass in itemClassDict ) { - $( itemClassDict[ itemClass ] ).addClass( itemClass ).children( ".ui-btn-inner" ).addClass( itemClass ); - } - - $list.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ) - .end() - - .find( "p, dl" ).addClass( "ui-li-desc" ) - .end() - - .find( ".ui-li-aside" ).each(function() { - var $this = $(this); - $this.prependTo( $this.parent() ); //shift aside to front for css float - }) - .end() - - .find( ".ui-li-count" ).each( function() { - $( this ).closest( "li" ).addClass( "ui-li-has-count" ); - }).addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme) + " ui-btn-corner-all" ); - - // The idea here is to look at the first image in the list item - // itself, and any .ui-link-inherit element it may contain, so we - // can place the appropriate classes on the image and list item. - // Note that we used to use something like: - // - // li.find(">img:eq(0), .ui-link-inherit>img:eq(0)").each( ... ); - // - // But executing a find() like that on Windows Phone 7.5 took a - // really long time. Walking things manually with the code below - // allows the 400 listview item page to load in about 3 seconds as - // opposed to 30 seconds. - - this._addThumbClasses( li ); - this._addThumbClasses( $list.find( ".ui-link-inherit" ) ); - - this._refreshCorners( create ); - }, - - //create a string for ID/subpage url creation - _idStringEscape: function( str ) { - return str.replace(/[^a-zA-Z0-9]/g, '-'); - }, - - _createSubPages: function() { - var parentList = this.element, - parentPage = parentList.closest( ".ui-page" ), - parentUrl = parentPage.jqmData( "url" ), - parentId = parentUrl || parentPage[ 0 ][ $.expando ], - parentListId = parentList.attr( "id" ), - o = this.options, - dns = "data-" + $.mobile.ns, - self = this, - persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ), - hasSubPages; - - if ( typeof listCountPerPage[ parentId ] === "undefined" ) { - listCountPerPage[ parentId ] = -1; - } - - parentListId = parentListId || ++listCountPerPage[ parentId ]; - - $( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function( i ) { - var self = this, - list = $( this ), - listId = list.attr( "id" ) || parentListId + "-" + i, - parent = list.parent(), - nodeEls = $( list.prevAll().toArray().reverse() ), - nodeEls = nodeEls.length ? nodeEls : $( "" + $.trim(parent.contents()[ 0 ].nodeValue) + "" ), - title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text - id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId, - theme = list.jqmData( "theme" ) || o.theme, - countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme, - newPage, anchor; - - //define hasSubPages for use in later removal - hasSubPages = true; - - newPage = list.detach() - .wrap( "
" ) - .parent() - .before( "
" + title + "
" ) - .after( persistentFooterID ? $( "
") : "" ) - .parent() - .appendTo( $.mobile.pageContainer ); - - newPage.page(); - - anchor = parent.find('a:first'); - - if ( !anchor.length ) { - anchor = $( "" ).html( nodeEls || title ).prependTo( parent.empty() ); - } - - anchor.attr( "href", "#" + id ); - - }).listview(); - - // on pagehide, remove any nested pages along with the parent page, as long as they aren't active - // and aren't embedded - if( hasSubPages && - parentPage.is( ":jqmData(external-page='true')" ) && - parentPage.data("page").options.domCache === false ) { - - var newRemove = function( e, ui ){ - var nextPage = ui.nextPage, npURL; - - if( ui.nextPage ){ - npURL = nextPage.jqmData( "url" ); - if( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ){ - self.childPages().remove(); - parentPage.remove(); - } - } - }; - - // unbind the original page remove and replace with our specialized version - parentPage - .unbind( "pagehide.remove" ) - .bind( "pagehide.remove", newRemove); - } - }, - - // TODO sort out a better way to track sub pages of the listview this is brittle - childPages: function(){ - var parentUrl = this.parentPage.jqmData( "url" ); - - return $( ":jqmData(url^='"+ parentUrl + "&" + $.mobile.subPageUrlKey +"')"); - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $( $.mobile.listview.prototype.options.initSelector, e.target ).listview(); -}); - -})( jQuery ); -/* -* "listview" filter extension -*/ - -(function( $, undefined ) { - -$.mobile.listview.prototype.options.filter = false; -$.mobile.listview.prototype.options.filterPlaceholder = "Filter items..."; -$.mobile.listview.prototype.options.filterTheme = "c"; -$.mobile.listview.prototype.options.filterCallback = function( text, searchValue ){ - return text.toLowerCase().indexOf( searchValue ) === -1; -}; - -$( document ).delegate( ":jqmData(role='listview')", "listviewcreate", function() { - - var list = $( this ), - listview = list.data( "listview" ); - - if ( !listview.options.filter ) { - return; - } - - var wrapper = $( "
", { - "class": "ui-listview-filter ui-bar-" + listview.options.filterTheme, - "role": "search" - }), - search = $( "", { - placeholder: listview.options.filterPlaceholder - }) - .attr( "data-" + $.mobile.ns + "type", "search" ) - .jqmData( "lastval", "" ) - .bind( "keyup change", function() { - - var $this = $(this), - val = this.value.toLowerCase(), - listItems = null, - lastval = $this.jqmData( "lastval" ) + "", - childItems = false, - itemtext = "", - item; - - // Change val as lastval for next execution - $this.jqmData( "lastval" , val ); - if ( val.length < lastval.length || val.indexOf(lastval) !== 0 ) { - - // Removed chars or pasted something totally different, check all items - listItems = list.children(); - } else { - - // Only chars added, not removed, only use visible subset - listItems = list.children( ":not(.ui-screen-hidden)" ); - } - - if ( val ) { - - // This handles hiding regular rows without the text we search for - // and any list dividers without regular rows shown under it - - for ( var i = listItems.length - 1; i >= 0; i-- ) { - item = $( listItems[ i ] ); - itemtext = item.jqmData( "filtertext" ) || item.text(); - - if ( item.is( "li:jqmData(role=list-divider)" ) ) { - - item.toggleClass( "ui-filter-hidequeue" , !childItems ); - - // New bucket! - childItems = false; - - } else if ( listview.options.filterCallback( itemtext, val ) ) { - - //mark to be hidden - item.toggleClass( "ui-filter-hidequeue" , true ); - } else { - - // There's a shown item in the bucket - childItems = true; - } - } - - // Show items, not marked to be hidden - listItems - .filter( ":not(.ui-filter-hidequeue)" ) - .toggleClass( "ui-screen-hidden", false ); - - // Hide items, marked to be hidden - listItems - .filter( ".ui-filter-hidequeue" ) - .toggleClass( "ui-screen-hidden", true ) - .toggleClass( "ui-filter-hidequeue", false ); - - } else { - - //filtervalue is empty => show all - listItems.toggleClass( "ui-screen-hidden", false ); - } - listview._refreshCorners(); - }) - .appendTo( wrapper ) - .textinput(); - - if ( $( this ).jqmData( "inset" ) ) { - wrapper.addClass( "ui-listview-filter-inset" ); - } - - wrapper.bind( "submit", function() { - return false; - }) - .insertBefore( list ); -}); - -})( jQuery );/* -* "nojs" plugin - class to make elements hidden to A grade browsers -*/ - -(function( $, undefined ) { - -$( document ).bind( "pagecreate create", function( e ){ - $( ":jqmData(role='nojs')", e.target ).addClass( "ui-nojs" ); - -}); - -})( jQuery );/* -* "checkboxradio" plugin -*/ - -(function( $, undefined ) { - -$.widget( "mobile.checkboxradio", $.mobile.widget, { - options: { - theme: null, - initSelector: "input[type='checkbox'],input[type='radio']" - }, - _create: function() { - var self = this, - input = this.element, - // NOTE: Windows Phone could not find the label through a selector - // filter works though. - label = input.closest( "form,fieldset,:jqmData(role='page')" ).find( "label" ).filter( "[for='" + input[ 0 ].id + "']" ), - inputtype = input.attr( "type" ), - checkedState = inputtype + "-on", - uncheckedState = inputtype + "-off", - icon = input.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedState, - activeBtn = icon ? "" : " " + $.mobile.activeBtnClass, - checkedClass = "ui-" + checkedState + activeBtn, - uncheckedClass = "ui-" + uncheckedState, - checkedicon = "ui-icon-" + checkedState, - uncheckedicon = "ui-icon-" + uncheckedState; - - if ( inputtype !== "checkbox" && inputtype !== "radio" ) { - return; - } - - // Expose for other methods - $.extend( this, { - label: label, - inputtype: inputtype, - checkedClass: checkedClass, - uncheckedClass: uncheckedClass, - checkedicon: checkedicon, - uncheckedicon: uncheckedicon - }); - - // If there's no selected theme... - if( !this.options.theme ) { - this.options.theme = this.element.jqmData( "theme" ); - } - - label.buttonMarkup({ - theme: this.options.theme, - icon: icon, - shadow: false - }); - - // Wrap the input + label in a div - input.add( label ) - .wrapAll( "
" ); - - label.bind({ - vmouseover: function( event ) { - if ( $( this ).parent().is( ".ui-disabled" ) ) { - event.stopPropagation(); - } - }, - - vclick: function( event ) { - if ( input.is( ":disabled" ) ) { - event.preventDefault(); - return; - } - - self._cacheVals(); - - input.prop( "checked", inputtype === "radio" && true || !input.prop( "checked" ) ); - - // trigger click handler's bound directly to the input as a substitute for - // how label clicks behave normally in the browsers - // TODO: it would be nice to let the browser's handle the clicks and pass them - // through to the associate input. we can swallow that click at the parent - // wrapper element level - input.triggerHandler( 'click' ); - - // Input set for common radio buttons will contain all the radio - // buttons, but will not for checkboxes. clearing the checked status - // of other radios ensures the active button state is applied properly - self._getInputSet().not( input ).prop( "checked", false ); - - self._updateAll(); - return false; - } - - }); - - input - .bind({ - vmousedown: function() { - self._cacheVals(); - }, - - vclick: function() { - var $this = $(this); - - // Adds checked attribute to checked input when keyboard is used - if ( $this.is( ":checked" ) ) { - - $this.prop( "checked", true); - self._getInputSet().not($this).prop( "checked", false ); - } else { - - $this.prop( "checked", false ); - } - - self._updateAll(); - }, - - focus: function() { - label.addClass( "ui-focus" ); - }, - - blur: function() { - label.removeClass( "ui-focus" ); - } - }); - - this.refresh(); - }, - - _cacheVals: function() { - this._getInputSet().each(function() { - var $this = $(this); - - $this.jqmData( "cacheVal", $this.is( ":checked" ) ); - }); - }, - - //returns either a set of radios with the same name attribute, or a single checkbox - _getInputSet: function(){ - if(this.inputtype == "checkbox") { - return this.element; - } - - return this.element.closest( "form,fieldset,:jqmData(role='page')" ) - .find( "input[name='"+ this.element.attr( "name" ) +"'][type='"+ this.inputtype +"']" ); - }, - - _updateAll: function() { - var self = this; - - this._getInputSet().each(function() { - var $this = $(this); - - if ( $this.is( ":checked" ) || self.inputtype === "checkbox" ) { - $this.trigger( "change" ); - } - }) - .checkboxradio( "refresh" ); - }, - - refresh: function() { - var input = this.element, - label = this.label, - icon = label.find( ".ui-icon" ); - - // input[0].checked expando doesn't always report the proper value - // for checked='checked' - if ( $( input[ 0 ] ).prop( "checked" ) ) { - - label.addClass( this.checkedClass ).removeClass( this.uncheckedClass ); - icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon ); - - } else { - - label.removeClass( this.checkedClass ).addClass( this.uncheckedClass ); - icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon ); - } - - if ( input.is( ":disabled" ) ) { - this.disable(); - } else { - this.enable(); - } - }, - - disable: function() { - this.element.prop( "disabled", true ).parent().addClass( "ui-disabled" ); - }, - - enable: function() { - this.element.prop( "disabled", false ).parent().removeClass( "ui-disabled" ); - } -}); - -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $.mobile.checkboxradio.prototype.enhanceWithin( e.target ); -}); + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^ + // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + return self; + })(); + +})(jQuery,this); -})( jQuery ); -/* -* "button" plugin - links that proxy to native input/buttons -*/ +/*! + * jQuery UI Widget @VERSION + * + * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * http://docs.jquery.com/UI/Widget + */ (function( $, undefined ) { -$.widget( "mobile.button", $.mobile.widget, { - options: { - theme: null, - icon: null, - iconpos: null, - inline: null, - corners: true, - shadow: true, - iconshadow: true, - initSelector: "button, [type='button'], [type='submit'], [type='reset'], [type='image']" - }, - _create: function() { - var $el = this.element, - o = this.options, - type, - name, - $buttonPlaceholder; - - // if this is a link, check if it's been enhanced and, if not, use the right function - if( $el[ 0 ].tagName === "A" ) { - if ( !$el.hasClass( "ui-btn" ) ) $el.buttonMarkup(); - return; - } - - // Add ARIA role - this.button = $( "
" ) - .text( $el.text() || $el.val() ) - .insertBefore( $el ) - .buttonMarkup({ - theme: o.theme, - icon: o.icon, - iconpos: o.iconpos, - inline: o.inline, - corners: o.corners, - shadow: o.shadow, - iconshadow: o.iconshadow - }) - .append( $el.addClass( "ui-btn-hidden" ) ); +// jQuery 1.4+ +if ( $.cleanData ) { + var _cleanData = $.cleanData; + $.cleanData = function( elems ) { + for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) { + $( elem ).triggerHandler( "remove" ); + } + _cleanData( elems ); + }; +} else { + var _remove = $.fn.remove; + $.fn.remove = function( selector, keepData ) { + return this.each(function() { + if ( !keepData ) { + if ( !selector || $.filter( selector, [ this ] ).length ) { + $( "*", this ).add( [ this ] ).each(function() { + $( this ).triggerHandler( "remove" ); + }); + } + } + return _remove.call( $(this), selector, keepData ); + }); + }; +} - type = $el.attr( "type" ); - name = $el.attr( "name" ); +$.widget = function( name, base, prototype ) { + var namespace = name.split( "." )[ 0 ], + fullName; + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName ] = function( elem ) { + return !!$.data( elem, name ); + }; + + $[ namespace ] = $[ namespace ] || {}; + $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + var basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from +// $.each( basePrototype, function( key, val ) { +// if ( $.isPlainObject(val) ) { +// basePrototype[ key ] = $.extend( {}, val ); +// } +// }); + basePrototype.options = $.extend( true, {}, basePrototype.options ); + $[ namespace ][ name ].prototype = $.extend( true, basePrototype, { + namespace: namespace, + widgetName: name, + widgetEventPrefix: $[ namespace ][ name ].prototype.widgetEventPrefix || name, + widgetBaseClass: fullName + }, prototype ); - // Add hidden input during submit if input type="submit" has a name. - if ( type !== "button" && type !== "reset" && name ) { - $el.bind( "vclick", function() { - // Add hidden input if it doesn’t already exist. - if( $buttonPlaceholder === undefined ) { - $buttonPlaceholder = $( "", { - type: "hidden", - name: $el.attr( "name" ), - value: $el.attr( "value" ) - }).insertBefore( $el ); - - // Bind to doc to remove after submit handling - $( document ).one("submit", function(){ - $buttonPlaceholder.remove(); - - // reset the local var so that the hidden input - // will be re-added on subsequent clicks - $buttonPlaceholder = undefined; - }); - } - }); - } + $.widget.bridge( name, $[ namespace ][ name ] ); +}; - this.refresh(); - }, +$.widget.bridge = function( name, object ) { + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = Array.prototype.slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.extend.apply( null, [ true, options ].concat(args) ) : + options; + + // prevent calls to internal methods + if ( isMethodCall && options.charAt( 0 ) === "_" ) { + return returnValue; + } + + if ( isMethodCall ) { + this.each(function() { + var instance = $.data( this, name ); + if ( !instance ) { + throw "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'"; + } + if ( !$.isFunction( instance[options] ) ) { + throw "no such method '" + options + "' for " + name + " widget instance"; + } + var methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, name ); + if ( instance ) { + instance.option( options || {} )._init(); + } else { + $.data( this, name, new object( options, this ) ); + } + }); + } - enable: function() { - this.element.attr( "disabled", false ); - this.button.removeClass( "ui-disabled" ).attr( "aria-disabled", false ); - return this._setOption( "disabled", false ); - }, + return returnValue; + }; +}; - disable: function() { - this.element.attr( "disabled", true ); - this.button.addClass( "ui-disabled" ).attr( "aria-disabled", true ); - return this._setOption( "disabled", true ); - }, +$.Widget = function( options, element ) { + // allow instantiation without initializing for simple inheritance + if ( arguments.length ) { + this._createWidget( options, element ); + } +}; - refresh: function() { - var $el = this.element; +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + options: { + disabled: false + }, + _createWidget: function( options, element ) { + // $.widget.bridge stores the plugin instance, but we do it anyway + // so that it's stored even before the _create function runs + $.data( element, this.widgetName, this ); + this.element = $( element ); + this.options = $.extend( true, {}, + this.options, + this._getCreateOptions(), + options ); + + var self = this; + this.element.bind( "remove." + this.widgetName, function() { + self.destroy(); + }); + + this._create(); + this._trigger( "create" ); + this._init(); + }, + _getCreateOptions: function() { + var options = {}; + if ( $.metadata ) { + options = $.metadata.get( element )[ this.widgetName ]; + } + return options; + }, + _create: function() {}, + _init: function() {}, + + destroy: function() { + this.element + .unbind( "." + this.widgetName ) + .removeData( this.widgetName ); + this.widget() + .unbind( "." + this.widgetName ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetBaseClass + "-disabled " + + "ui-state-disabled" ); + }, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.extend( {}, this.options ); + } + + if (typeof key === "string" ) { + if ( value === undefined ) { + return this.options[ key ]; + } + options = {}; + options[ key ] = value; + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var self = this; + $.each( options, function( key, value ) { + self._setOption( key, value ); + }); + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + [ value ? "addClass" : "removeClass"]( + this.widgetBaseClass + "-disabled" + " " + + "ui-state-disabled" ) + .attr( "aria-disabled", value ); + } + + return this; + }, + + enable: function() { + return this._setOption( "disabled", false ); + }, + disable: function() { + return this._setOption( "disabled", true ); + }, + + _trigger: function( type, event, data ) { + var callback = this.options[ type ]; + + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + data = data || {}; + + // copy original event properties over to the new event + // this would happen if we could call $.event.fix instead of $.Event + // but we don't have a way to force an event to be fixed multiple times + if ( event.originalEvent ) { + for ( var i = $.event.props.length, prop; i; ) { + prop = $.event.props[ --i ]; + event[ prop ] = event.originalEvent[ prop ]; + } + } + + this.element.trigger( event, data ); + + return !( $.isFunction(callback) && + callback.call( this.element[0], event, data ) === false || + event.isDefaultPrevented() ); + } +}; - if ( $el.prop("disabled") ) { - this.disable(); - } else { - this.enable(); - } +})( jQuery ); - // the textWrapper is stored as a data element on the button object - // to prevent referencing by it's implementation details (eg 'class') - this.button.data( 'textWrapper' ).text( $el.text() || $el.val() ); - } -}); +(function( $, undefined ) { -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $.mobile.button.prototype.enhanceWithin( e.target ); +$.widget( "mobile.widget", { + // decorate the parent _createWidget to trigger `widgetinit` for users + // who wish to do post post `widgetcreate` alterations/additions + // + // TODO create a pull request for jquery ui to trigger this event + // in the original _createWidget + _createWidget: function() { + $.Widget.prototype._createWidget.apply( this, arguments ); + this._trigger( 'init' ); + }, + + _getCreateOptions: function() { + + var elem = this.element, + options = {}; + + $.each( this.options, function( option ) { + + var value = elem.jqmData( option.replace( /[A-Z]/g, function( c ) { + return "-" + c.toLowerCase(); + }) + ); + + if ( value !== undefined ) { + options[ option ] = value; + } + }); + + return options; + }, + + enhanceWithin: function( target, useKeepNative ) { + this.enhance( $( this.options.initSelector, $( target )), useKeepNative ); + }, + + enhance: function( targets, useKeepNative ) { + var page, keepNative, $widgetElements = $( targets ), self = this; + + // if ignoreContentEnabled is set to true the framework should + // only enhance the selected elements when they do NOT have a + // parent with the data-namespace-ignore attribute + $widgetElements = $.mobile.enhanceable( $widgetElements ); + + if ( useKeepNative && $widgetElements.length ) { + // TODO remove dependency on the page widget for the keepNative. + // Currently the keepNative value is defined on the page prototype so + // the method is as well + page = $.mobile.closestPageData( $widgetElements ); + keepNative = (page && page.keepNativeSelector()) || ""; + + $widgetElements = $widgetElements.not( keepNative ); + } + + $widgetElements[ this.widgetName ](); + }, + + raise: function( msg ) { + throw "Widget [" + this.widgetName + "]: " + msg; + } }); -})( jQuery );/* -* "slider" plugin -*/ - -( function( $, undefined ) { - -$.widget( "mobile.slider", $.mobile.widget, { - options: { - theme: null, - trackTheme: null, - disabled: false, - initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')" - }, - - _create: function() { - - // TODO: Each of these should have comments explain what they're for - var self = this, - - control = this.element, - - parentTheme = $.mobile.getInheritedTheme( control, "c" ), - - theme = this.options.theme || parentTheme, +})( jQuery ); - trackTheme = this.options.trackTheme || parentTheme, +(function( $, window, undefined ) { - cType = control[ 0 ].nodeName.toLowerCase(), + var nsNormalizeDict = {}; - selectClass = ( cType == "select" ) ? "ui-slider-switch" : "", + // jQuery.mobile configurable options + $.mobile = $.extend( {}, { - controlID = control.attr( "id" ), + // Version of the jQuery Mobile Framework + version: "1.1.0", - labelID = controlID + "-label", + // Namespace used framework-wide for data-attrs. Default is no namespace + ns: "", + + // Define the url parameter used for referencing widget-generated sub-pages. + // Translates to to example.html&ui-page=subpageIdentifier + // hash segment before &ui-page= is used to make Ajax request + subPageUrlKey: "ui-page", + + // Class assigned to page currently in view, and during transitions + activePageClass: "ui-page-active", + + // Class used for "active" button state, from CSS framework + activeBtnClass: "ui-btn-active", + + // Class used for "focus" form element state, from CSS framework + focusClass: "ui-focus", + + // Automatically handle clicks and form submissions through Ajax, when same-domain + ajaxEnabled: true, + + // Automatically load and show pages based on location.hash + hashListeningEnabled: true, + + // disable to prevent jquery from bothering with links + linkBindingEnabled: true, + + // Set default page transition - 'none' for no transitions + defaultPageTransition: "fade", + + // Set maximum window width for transitions to apply - 'false' for no limit + maxTransitionWidth: false, + + // Minimum scroll distance that will be remembered when returning to a page + minScrollBack: 250, + + // DEPRECATED: the following property is no longer in use, but defined until 2.0 to prevent conflicts + touchOverflowEnabled: false, + + // Set default dialog transition - 'none' for no transitions + defaultDialogTransition: "pop", + + // Show loading message during Ajax requests + // if false, message will not appear, but loading classes will still be toggled on html el + loadingMessage: "loading", + + // Error response message - appears when an Ajax page request fails + pageLoadErrorMessage: "Error Loading Page", + + // Should the text be visble in the loading message? + loadingMessageTextVisible: false, + + // When the text is visible, what theme does the loading box use? + loadingMessageTheme: "a", + + // For error messages, which theme does the box uses? + pageLoadErrorMessageTheme: "e", + + //automatically initialize the DOM when it's ready + autoInitializePage: true, + + pushStateEnabled: true, + + // allows users to opt in to ignoring content by marking a parent element as + // data-ignored + ignoreContentEnabled: false, + + // turn of binding to the native orientationchange due to android orientation behavior + orientationChangeEnabled: true, + + buttonMarkup: { + hoverDelay: 200 + }, + + // TODO might be useful upstream in jquery itself ? + keyCode: { + ALT: 18, + BACKSPACE: 8, + CAPS_LOCK: 20, + COMMA: 188, + COMMAND: 91, + COMMAND_LEFT: 91, // COMMAND + COMMAND_RIGHT: 93, + CONTROL: 17, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + INSERT: 45, + LEFT: 37, + MENU: 93, // COMMAND_RIGHT + NUMPAD_ADD: 107, + NUMPAD_DECIMAL: 110, + NUMPAD_DIVIDE: 111, + NUMPAD_ENTER: 108, + NUMPAD_MULTIPLY: 106, + NUMPAD_SUBTRACT: 109, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SHIFT: 16, + SPACE: 32, + TAB: 9, + UP: 38, + WINDOWS: 91 // COMMAND + }, + + // Scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value + silentScroll: function( ypos ) { + if ( $.type( ypos ) !== "number" ) { + ypos = $.mobile.defaultHomeScroll; + } + + // prevent scrollstart and scrollstop events + $.event.special.scrollstart.enabled = false; + + setTimeout(function() { + window.scrollTo( 0, ypos ); + $( document ).trigger( "silentscroll", { x: 0, y: ypos }); + }, 20 ); + + setTimeout(function() { + $.event.special.scrollstart.enabled = true; + }, 150 ); + }, + + // Expose our cache for testing purposes. + nsNormalizeDict: nsNormalizeDict, + + // Take a data attribute property, prepend the namespace + // and then camel case the attribute string. Add the result + // to our nsNormalizeDict so we don't have to do this again. + nsNormalize: function( prop ) { + if ( !prop ) { + return; + } + + return nsNormalizeDict[ prop ] || ( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) ); + }, + + getInheritedTheme: function( el, defaultTheme ) { + + // Find the closest parent with a theme class on it. Note that + // we are not using $.fn.closest() on purpose here because this + // method gets called quite a bit and we need it to be as fast + // as possible. + + var e = el[ 0 ], + ltr = "", + re = /ui-(bar|body|overlay)-([a-z])\b/, + c, m; + + while ( e ) { + var c = e.className || ""; + if ( ( m = re.exec( c ) ) && ( ltr = m[ 2 ] ) ) { + // We found a parent with a theme class + // on it so bail from this loop. + break; + } + e = e.parentNode; + } + + // Return the theme letter we found, if none, return the + // specified default. + + return ltr || defaultTheme || "a"; + }, + + // TODO the following $ and $.fn extensions can/probably should be moved into jquery.mobile.core.helpers + // + // Find the closest javascript page element to gather settings data jsperf test + // http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit + // possibly naive, but it shows that the parsing overhead for *just* the page selector vs + // the page and dialog selector is negligable. This could probably be speed up by + // doing a similar parent node traversal to the one found in the inherited theme code above + closestPageData: function( $target ) { + return $target + .closest(':jqmData(role="page"), :jqmData(role="dialog")') + .data("page"); + }, + + enhanceable: function( $set ) { + return this.haveParents( $set, "enhance" ); + }, + + hijackable: function( $set ) { + return this.haveParents( $set, "ajax" ); + }, + + haveParents: function( $set, attr ) { + if( !$.mobile.ignoreContentEnabled ){ + return $set; + } + + var count = $set.length, + $newSet = $(), + e, $element, excluded; + + for ( var i = 0; i < count; i++ ) { + $element = $set.eq( i ); + excluded = false; + e = $set[ i ]; + + while ( e ) { + var c = e.getAttribute ? e.getAttribute( "data-" + $.mobile.ns + attr ) : ""; + + if ( c === "false" ) { + excluded = true; + break; + } + + e = e.parentNode; + } + + if ( !excluded ) { + $newSet = $newSet.add( $element ); + } + } + + return $newSet; + } + }, $.mobile ); + + // Mobile version of data and removeData and hasData methods + // ensures all data is set and retrieved using jQuery Mobile's data namespace + $.fn.jqmData = function( prop, value ) { + var result; + if ( typeof prop != "undefined" ) { + if ( prop ) { + prop = $.mobile.nsNormalize( prop ); + } + result = this.data.apply( this, arguments.length < 2 ? [ prop ] : [ prop, value ] ); + } + return result; + }; + + $.jqmData = function( elem, prop, value ) { + var result; + if ( typeof prop != "undefined" ) { + result = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value ); + } + return result; + }; + + $.fn.jqmRemoveData = function( prop ) { + return this.removeData( $.mobile.nsNormalize( prop ) ); + }; + + $.jqmRemoveData = function( elem, prop ) { + return $.removeData( elem, $.mobile.nsNormalize( prop ) ); + }; + + $.fn.removeWithDependents = function() { + $.removeWithDependents( this ); + }; + + $.removeWithDependents = function( elem ) { + var $elem = $( elem ); + + ( $elem.jqmData('dependents') || $() ).remove(); + $elem.remove(); + }; + + $.fn.addDependents = function( newDependents ) { + $.addDependents( $(this), newDependents ); + }; + + $.addDependents = function( elem, newDependents ) { + var dependents = $(elem).jqmData( 'dependents' ) || $(); + + $(elem).jqmData( 'dependents', $.merge(dependents, newDependents) ); + }; + + // note that this helper doesn't attempt to handle the callback + // or setting of an html elements text, its only purpose is + // to return the html encoded version of the text in all cases. (thus the name) + $.fn.getEncodedText = function() { + return $( "
" ).text( $(this).text() ).html(); + }; + + // fluent helper function for the mobile namespaced equivalent + $.fn.jqmEnhanceable = function() { + return $.mobile.enhanceable( this ); + }; + + $.fn.jqmHijackable = function() { + return $.mobile.hijackable( this ); + }; + + // Monkey-patching Sizzle to filter the :jqmData selector + var oldFind = $.find, + jqmDataRE = /:jqmData\(([^)]*)\)/g; + + $.find = function( selector, context, ret, extra ) { + selector = selector.replace( jqmDataRE, "[data-" + ( $.mobile.ns || "" ) + "$1]" ); + + return oldFind.call( this, selector, context, ret, extra ); + }; + + $.extend( $.find, oldFind ); + + $.find.matches = function( expr, set ) { + return $.find( expr, null, null, set ); + }; + + $.find.matchesSelector = function( node, expr ) { + return $.find( expr, null, null, [ node ] ).length > 0; + }; +})( jQuery, this ); - label = $( "[for='"+ controlID +"']" ).attr( "id", labelID ), - val = function() { - return cType == "input" ? parseFloat( control.val() ) : control[0].selectedIndex; - }, +(function( $, undefined ) { - min = cType == "input" ? parseFloat( control.attr( "min" ) ) : 0, +var $window = $( window ), + $html = $( "html" ); - max = cType == "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length-1, +/* $.mobile.media method: pass a CSS media type or query and get a bool return + note: this feature relies on actual media query support for media queries, though types will work most anywhere + examples: + $.mobile.media('screen') // tests for screen media type + $.mobile.media('screen and (min-width: 480px)') // tests for screen media type with window width > 480px + $.mobile.media('@media screen and (-webkit-min-device-pixel-ratio: 2)') // tests for webkit 2x pixel ratio (iPhone 4) +*/ +$.mobile.media = (function() { + // TODO: use window.matchMedia once at least one UA implements it + var cache = {}, + testDiv = $( "
" ), + fakeBody = $( "" ).append( testDiv ); + + return function( query ) { + if ( !( query in cache ) ) { + var styleBlock = document.createElement( "style" ), + cssrule = "@media " + query + " { #jquery-mediatest { position:absolute; } }"; + + //must set type for IE! + styleBlock.type = "text/css"; + + if ( styleBlock.styleSheet ){ + styleBlock.styleSheet.cssText = cssrule; + } else { + styleBlock.appendChild( document.createTextNode(cssrule) ); + } + + $html.prepend( fakeBody ).prepend( styleBlock ); + cache[ query ] = testDiv.css( "position" ) === "absolute"; + fakeBody.add( styleBlock ).remove(); + } + return cache[ query ]; + }; +})(); - step = window.parseFloat( control.attr( "step" ) || 1 ), +})(jQuery); - slider = $( "
" ), +(function( $, undefined ) { - handle = $( "
" ) - .appendTo( slider ) - .buttonMarkup({ corners: true, theme: theme, shadow: true }) - .attr({ - "role": "slider", - "aria-valuemin": min, - "aria-valuemax": max, - "aria-valuenow": val(), - "aria-valuetext": val(), - "title": val(), - "aria-labelledby": labelID - }), - options; - - $.extend( this, { - slider: slider, - handle: handle, - dragging: false, - beforeStart: null, - userModified: false, - mouseMoved: false - }); +var fakeBody = $( "" ).prependTo( "html" ), + fbCSS = fakeBody[ 0 ].style, + vendors = [ "Webkit", "Moz", "O" ], + webos = "palmGetResource" in window, //only used to rule out scrollTop + operamini = window.operamini && ({}).toString.call( window.operamini ) === "[object OperaMini]", + bb = window.blackberry; //only used to rule out box shadow, as it's filled opaque on BB - if ( cType == "select" ) { +// thx Modernizr +function propExists( prop ) { + var uc_prop = prop.charAt( 0 ).toUpperCase() + prop.substr( 1 ), + props = ( prop + " " + vendors.join( uc_prop + " " ) + uc_prop ).split( " " ); - slider.wrapInner( "
" ); + for ( var v in props ){ + if ( fbCSS[ props[ v ] ] !== undefined ) { + return true; + } + } +} - // make the handle move with a smooth transition - handle.addClass( "ui-slider-handle-snapping" ); +function validStyle( prop, value, check_vend ) { + var div = document.createElement('div'), + uc = function( txt ) { + return txt.charAt( 0 ).toUpperCase() + txt.substr( 1 ) + }, + vend_pref = function( vend ) { + return "-" + vend.charAt( 0 ).toLowerCase() + vend.substr( 1 ) + "-"; + }, + check_style = function( vend ) { + var vend_prop = vend_pref( vend ) + prop + ": " + value + ";", + uc_vend = uc( vend ), + propStyle = uc_vend + uc( prop ); + + div.setAttribute( "style", vend_prop ); + + if( !!div.style[ propStyle ] ) { + ret = true; + } + }, + check_vends = check_vend ? [ check_vend ] : vendors, + ret; + + for( i = 0; i < check_vends.length; i++ ) { + check_style( check_vends[i] ); + } + return !!ret; +} - options = control.find( "option" ); +// Thanks to Modernizr src for this test idea. `perspective` check is limited to Moz to prevent a false positive for 3D transforms on Android. +function transform3dTest() { + var prop = "transform-3d"; + return validStyle( 'perspective', '10px', 'moz' ) || $.mobile.media( "(-" + vendors.join( "-" + prop + "),(-" ) + "-" + prop + "),(" + prop + ")" ); +} - control.find( "option" ).each(function( i ) { +// Test for dynamic-updating base tag support ( allows us to avoid href,src attr rewriting ) +function baseTagTest() { + var fauxBase = location.protocol + "//" + location.host + location.pathname + "ui-dir/", + base = $( "head base" ), + fauxEle = null, + href = "", + link, rebase; + + if ( !base.length ) { + base = fauxEle = $( "", { "href": fauxBase }).appendTo( "head" ); + } else { + href = base.attr( "href" ); + } + + link = $( "" ).prependTo( fakeBody ); + rebase = link[ 0 ].href; + base[ 0 ].href = href || location.pathname; + + if ( fauxEle ) { + fauxEle.remove(); + } + return rebase.indexOf( fauxBase ) === 0; +} - var side = !i ? "b":"a", - corners = !i ? "right" :"left", - theme = !i ? " ui-btn-down-" + trackTheme :( " " + $.mobile.activeBtnClass ); - $( "
" ) - .prependTo( slider ); +// non-UA-based IE version check by James Padolsey, modified by jdalton - from http://gist.github.com/527683 +// allows for inclusion of IE 6+, including Windows Mobile 7 +$.extend( $.mobile, { browser: {} } ); +$.mobile.browser.ie = (function() { + var v = 3, + div = document.createElement( "div" ), + a = div.all || []; + + // added {} to silence closure compiler warnings. registering my dislike of all things + // overly clever here for future reference + while ( div.innerHTML = "", a[ 0 ] ){}; - $( "" + $( this ).getEncodedText() + "" ) - .prependTo( handle ); - }); + return v > 4 ? v : !v; +})(); - } - label.addClass( "ui-slider" ); +$.extend( $.support, { + orientation: "orientation" in window && "onorientationchange" in window, + touch: "ontouchend" in document, + cssTransitions: "WebKitTransitionEvent" in window || validStyle( 'transition', 'height 100ms linear' ), + pushState: "pushState" in history && "replaceState" in history, + mediaquery: $.mobile.media( "only all" ), + cssPseudoElement: !!propExists( "content" ), + touchOverflow: !!propExists( "overflowScrolling" ), + cssTransform3d: transform3dTest(), + boxShadow: !!propExists( "boxShadow" ) && !bb, + scrollTop: ( "pageXOffset" in window || "scrollTop" in document.documentElement || "scrollTop" in fakeBody[ 0 ] ) && !webos && !operamini, + dynamicBaseTag: baseTagTest() +}); - // monitor the input for updated values - control.addClass( cType === "input" ? "ui-slider-input" : "ui-slider-switch" ) - .change( function() { - // if the user dragged the handle, the "change" event was triggered from inside refresh(); don't call refresh() again - if (!self.mouseMoved) { - self.refresh( val(), true ); - } - }) - .keyup( function() { // necessary? - self.refresh( val(), true, true ); - }) - .blur( function() { - self.refresh( val(), true ); - }); - - // prevent screen drag when slider activated - $( document ).bind( "vmousemove", function( event ) { - if ( self.dragging ) { - // self.mouseMoved must be updated before refresh() because it will be used in the control "change" event - self.mouseMoved = true; - - if ( cType === "select" ) { - // make the handle move in sync with the mouse - handle.removeClass( "ui-slider-handle-snapping" ); - } - - self.refresh( event ); - - // only after refresh() you can calculate self.userModified - self.userModified = self.beforeStart !== control[0].selectedIndex; - return false; - } - }); +fakeBody.remove(); - slider.bind( "vmousedown", function( event ) { - self.dragging = true; - self.userModified = false; - self.mouseMoved = false; - if ( cType === "select" ) { - self.beforeStart = control[0].selectedIndex; - } +// $.mobile.ajaxBlacklist is used to override ajaxEnabled on platforms that have known conflicts with hash history updates (BB5, Symbian) +// or that generally work better browsing in regular http for full page refreshes (Opera Mini) +// Note: This detection below is used as a last resort. +// We recommend only using these detection methods when all other more reliable/forward-looking approaches are not possible +var nokiaLTE7_3 = (function(){ - self.refresh( event ); - return false; - }); + var ua = window.navigator.userAgent; - slider.add( document ) - .bind( "vmouseup", function() { - if ( self.dragging ) { + //The following is an attempt to match Nokia browsers that are running Symbian/s60, with webkit, version 7.3 or older + return ua.indexOf( "Nokia" ) > -1 && + ( ua.indexOf( "Symbian/3" ) > -1 || ua.indexOf( "Series60/5" ) > -1 ) && + ua.indexOf( "AppleWebKit" ) > -1 && + ua.match( /(BrowserNG|NokiaBrowser)\/7\.[0-3]/ ); +})(); - self.dragging = false; +// Support conditions that must be met in order to proceed +// default enhanced qualifications are media query support OR IE 7+ +$.mobile.gradeA = function(){ + return $.support.mediaquery || $.mobile.browser.ie && $.mobile.browser.ie >= 7; +}; - if ( cType === "select") { +$.mobile.ajaxBlacklist = + // BlackBerry browsers, pre-webkit + window.blackberry && !window.WebKitPoint || + // Opera Mini + operamini || + // Symbian webkits pre 7.3 + nokiaLTE7_3; - // make the handle move with a smooth transition - handle.addClass( "ui-slider-handle-snapping" ); +// Lastly, this workaround is the only way we've found so far to get pre 7.3 Symbian webkit devices +// to render the stylesheets when they're referenced before this script, as we'd recommend doing. +// This simply reappends the CSS in place, which for some reason makes it apply +if ( nokiaLTE7_3 ) { + $(function() { + $( "head link[rel='stylesheet']" ).attr( "rel", "alternate stylesheet" ).attr( "rel", "stylesheet" ); + }); +} - if ( self.mouseMoved ) { +// For ruling out shadows via css +if ( !$.support.boxShadow ) { + $( "html" ).addClass( "ui-mobile-nosupport-boxshadow" ); +} - // this is a drag, change the value only if user dragged enough - if ( self.userModified ) { - self.refresh( self.beforeStart == 0 ? 1 : 0 ); - } - else { - self.refresh( self.beforeStart ); - } +})( jQuery ); - } - else { - // this is just a click, change the value - self.refresh( self.beforeStart == 0 ? 1 : 0 ); - } +(function( $, window, undefined ) { - } +// add new event shortcuts +$.each( ( "touchstart touchmove touchend orientationchange throttledresize " + + "tap taphold swipe swipeleft swiperight scrollstart scrollstop" ).split( " " ), function( i, name ) { - self.mouseMoved = false; + $.fn[ name ] = function( fn ) { + return fn ? this.bind( name, fn ) : this.trigger( name ); + }; - return false; - } - }); + $.attrFn[ name ] = true; +}); - slider.insertAfter( control ); +var supportTouch = $.support.touch, + scrollEvent = "touchmove scroll", + touchStartEvent = supportTouch ? "touchstart" : "mousedown", + touchStopEvent = supportTouch ? "touchend" : "mouseup", + touchMoveEvent = supportTouch ? "touchmove" : "mousemove"; - // NOTE force focus on handle - this.handle - .bind( "vmousedown", function() { - $( this ).focus(); - }) - .bind( "vclick", false ); +function triggerCustomEvent( obj, eventType, event ) { + var originalType = event.type; + event.type = eventType; + $.event.handle.call( obj, event ); + event.type = originalType; +} - this.handle - .bind( "keydown", function( event ) { - var index = val(); - - if ( self.options.disabled ) { - return; - } - - // In all cases prevent the default and mark the handle as active - switch ( event.keyCode ) { - case $.mobile.keyCode.HOME: - case $.mobile.keyCode.END: - case $.mobile.keyCode.PAGE_UP: - case $.mobile.keyCode.PAGE_DOWN: - case $.mobile.keyCode.UP: - case $.mobile.keyCode.RIGHT: - case $.mobile.keyCode.DOWN: - case $.mobile.keyCode.LEFT: - event.preventDefault(); - - if ( !self._keySliding ) { - self._keySliding = true; - $( this ).addClass( "ui-state-active" ); - } - break; - } - - // move the slider according to the keypress - switch ( event.keyCode ) { - case $.mobile.keyCode.HOME: - self.refresh( min ); - break; - case $.mobile.keyCode.END: - self.refresh( max ); - break; - case $.mobile.keyCode.PAGE_UP: - case $.mobile.keyCode.UP: - case $.mobile.keyCode.RIGHT: - self.refresh( index + step ); - break; - case $.mobile.keyCode.PAGE_DOWN: - case $.mobile.keyCode.DOWN: - case $.mobile.keyCode.LEFT: - self.refresh( index - step ); - break; - } - }) // remove active mark - .keyup( function( event ) { - if ( self._keySliding ) { - self._keySliding = false; - $( this ).removeClass( "ui-state-active" ); - } - }); +// also handles scrollstop +$.event.special.scrollstart = { - this.refresh(undefined, undefined, true); - }, + enabled: true, - refresh: function( val, isfromControl, preventInputUpdate ) { + setup: function() { - if ( this.options.disabled || this.element.attr('disabled')) { - this.disable(); - } + var thisObject = this, + $this = $( thisObject ), + scrolling, + timer; + + function trigger( event, state ) { + scrolling = state; + triggerCustomEvent( thisObject, scrolling ? "scrollstart" : "scrollstop", event ); + } + + // iPhone triggers scroll after a small delay; use touchmove instead + $this.bind( scrollEvent, function( event ) { + + if ( !$.event.special.scrollstart.enabled ) { + return; + } + + if ( !scrolling ) { + trigger( event, true ); + } + + clearTimeout( timer ); + timer = setTimeout(function() { + trigger( event, false ); + }, 50 ); + }); + } +}; - var control = this.element, percent, - cType = control[0].nodeName.toLowerCase(), - min = cType === "input" ? parseFloat( control.attr( "min" ) ) : 0, - max = cType === "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length - 1, - step = (cType === "input" && parseFloat( control.attr( "step" ) ) > 0) ? parseFloat(control.attr("step")) : 1; - - if ( typeof val === "object" ) { - var data = val, - // a slight tolerance helped get to the ends of the slider - tol = 8; - if ( !this.dragging || - data.pageX < this.slider.offset().left - tol || - data.pageX > this.slider.offset().left + this.slider.width() + tol ) { - return; - } - percent = Math.round( ( ( data.pageX - this.slider.offset().left ) / this.slider.width() ) * 100 ); - } else { - if ( val == null ) { - val = cType === "input" ? parseFloat( control.val() || 0 ) : control[0].selectedIndex; - } - percent = ( parseFloat( val ) - min ) / ( max - min ) * 100; - } +// also handles taphold +$.event.special.tap = { + setup: function() { + var thisObject = this, + $this = $( thisObject ); + + $this.bind( "vmousedown", function( event ) { + + if ( event.which && event.which !== 1 ) { + return false; + } + + var origTarget = event.target, + origEvent = event.originalEvent, + timer; + + function clearTapTimer() { + clearTimeout( timer ); + } + + function clearTapHandlers() { + clearTapTimer(); + + $this.unbind( "vclick", clickHandler ) + .unbind( "vmouseup", clearTapTimer ); + $( document ).unbind( "vmousecancel", clearTapHandlers ); + } + + function clickHandler(event) { + clearTapHandlers(); + + // ONLY trigger a 'tap' event if the start target is + // the same as the stop target. + if ( origTarget == event.target ) { + triggerCustomEvent( thisObject, "tap", event ); + } + } + + $this.bind( "vmouseup", clearTapTimer ) + .bind( "vclick", clickHandler ); + $( document ).bind( "vmousecancel", clearTapHandlers ); + + timer = setTimeout(function() { + triggerCustomEvent( thisObject, "taphold", $.Event( "taphold", { target: origTarget } ) ); + }, 750 ); + }); + } +}; - if ( isNaN( percent ) ) { - return; - } +// also handles swipeleft, swiperight +$.event.special.swipe = { + scrollSupressionThreshold: 10, // More than this horizontal displacement, and we will suppress scrolling. - if ( percent < 0 ) { - percent = 0; - } + durationThreshold: 1000, // More time than this, and it isn't a swipe. - if ( percent > 100 ) { - percent = 100; - } + horizontalDistanceThreshold: 30, // Swipe horizontal displacement must be more than this. - var newval = ( percent / 100 ) * ( max - min ) + min; + verticalDistanceThreshold: 75, // Swipe vertical displacement must be less than this. - //from jQuery UI slider, the following source will round to the nearest step - var valModStep = ( newval - min ) % step; - var alignValue = newval - valModStep; + setup: function() { + var thisObject = this, + $this = $( thisObject ); + + $this.bind( touchStartEvent, function( event ) { + var data = event.originalEvent.touches ? + event.originalEvent.touches[ 0 ] : event, + start = { + time: ( new Date() ).getTime(), + coords: [ data.pageX, data.pageY ], + origin: $( event.target ) + }, + stop; + + function moveHandler( event ) { + + if ( !start ) { + return; + } + + var data = event.originalEvent.touches ? + event.originalEvent.touches[ 0 ] : event; + + stop = { + time: ( new Date() ).getTime(), + coords: [ data.pageX, data.pageY ] + }; + + // prevent scrolling + if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) { + event.preventDefault(); + } + } + + $this.bind( touchMoveEvent, moveHandler ) + .one( touchStopEvent, function( event ) { + $this.unbind( touchMoveEvent, moveHandler ); + + if ( start && stop ) { + if ( stop.time - start.time < $.event.special.swipe.durationThreshold && + Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold && + Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) { + + start.origin.trigger( "swipe" ) + .trigger( start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight" ); + } + } + start = stop = undefined; + }); + }); + } +}; - if ( Math.abs( valModStep ) * 2 >= step ) { - alignValue += ( valModStep > 0 ) ? step : ( -step ); - } - // Since JavaScript has problems with large floats, round - // the final value to 5 digits after the decimal point (see jQueryUI: #4124) - newval = parseFloat( alignValue.toFixed(5) ); +(function( $, window ) { + // "Cowboy" Ben Alman - if ( newval < min ) { - newval = min; - } + var win = $( window ), + special_event, + get_orientation, + last_orientation, + initial_orientation_is_landscape, + initial_orientation_is_default, + portrait_map = { "0": true, "180": true }; + + // It seems that some device/browser vendors use window.orientation values 0 and 180 to + // denote the "default" orientation. For iOS devices, and most other smart-phones tested, + // the default orientation is always "portrait", but in some Android and RIM based tablets, + // the default orientation is "landscape". The following code attempts to use the window + // dimensions to figure out what the current orientation is, and then makes adjustments + // to the to the portrait_map if necessary, so that we can properly decode the + // window.orientation value whenever get_orientation() is called. + // + // Note that we used to use a media query to figure out what the orientation the browser + // thinks it is in: + // + // initial_orientation_is_landscape = $.mobile.media("all and (orientation: landscape)"); + // + // but there was an iPhone/iPod Touch bug beginning with iOS 4.2, up through iOS 5.1, + // where the browser *ALWAYS* applied the landscape media query. This bug does not + // happen on iPad. + + if ( $.support.orientation ) { + + // Check the window width and height to figure out what the current orientation + // of the device is at this moment. Note that we've initialized the portrait map + // values to 0 and 180, *AND* we purposely check for landscape so that if we guess + // wrong, , we default to the assumption that portrait is the default orientation. + // We use a threshold check below because on some platforms like iOS, the iPhone + // form-factor can report a larger width than height if the user turns on the + // developer console. The actual threshold value is somewhat arbitrary, we just + // need to make sure it is large enough to exclude the developer console case. + + var ww = window.innerWidth || $( window ).width(), + wh = window.innerHeight || $( window ).height(), + landscape_threshold = 50; + + initial_orientation_is_landscape = ww > wh && ( ww - wh ) > landscape_threshold; + + + // Now check to see if the current window.orientation is 0 or 180. + initial_orientation_is_default = portrait_map[ window.orientation ]; + + // If the initial orientation is landscape, but window.orientation reports 0 or 180, *OR* + // if the initial orientation is portrait, but window.orientation reports 90 or -90, we + // need to flip our portrait_map values because landscape is the default orientation for + // this device/browser. + if ( ( initial_orientation_is_landscape && initial_orientation_is_default ) || ( !initial_orientation_is_landscape && !initial_orientation_is_default ) ) { + portrait_map = { "-90": true, "90": true }; + } + } + + $.event.special.orientationchange = special_event = { + setup: function() { + // If the event is supported natively, return false so that jQuery + // will bind to the event using DOM methods. + if ( $.support.orientation && $.mobile.orientationChangeEnabled ) { + return false; + } + + // Get the current orientation to avoid initial double-triggering. + last_orientation = get_orientation(); + + // Because the orientationchange event doesn't exist, simulate the + // event by testing window dimensions on resize. + win.bind( "throttledresize", handler ); + }, + teardown: function(){ + // If the event is not supported natively, return false so that + // jQuery will unbind the event using DOM methods. + if ( $.support.orientation && $.mobile.orientationChangeEnabled ) { + return false; + } + + // Because the orientationchange event doesn't exist, unbind the + // resize event handler. + win.unbind( "throttledresize", handler ); + }, + add: function( handleObj ) { + // Save a reference to the bound event handler. + var old_handler = handleObj.handler; + + + handleObj.handler = function( event ) { + // Modify event object, adding the .orientation property. + event.orientation = get_orientation(); + + // Call the originally-bound event handler and return its result. + return old_handler.apply( this, arguments ); + }; + } + }; + + // If the event is not supported natively, this handler will be bound to + // the window resize event to simulate the orientationchange event. + function handler() { + // Get the current orientation. + var orientation = get_orientation(); + + if ( orientation !== last_orientation ) { + // The orientation has changed, so trigger the orientationchange event. + last_orientation = orientation; + win.trigger( "orientationchange" ); + } + } + + // Get the current page orientation. This method is exposed publicly, should it + // be needed, as jQuery.event.special.orientationchange.orientation() + $.event.special.orientationchange.orientation = get_orientation = function() { + var isPortrait = true, elem = document.documentElement; + + // prefer window orientation to the calculation based on screensize as + // the actual screen resize takes place before or after the orientation change event + // has been fired depending on implementation (eg android 2.3 is before, iphone after). + // More testing is required to determine if a more reliable method of determining the new screensize + // is possible when orientationchange is fired. (eg, use media queries + element + opacity) + if ( $.support.orientation ) { + // if the window orientation registers as 0 or 180 degrees report + // portrait, otherwise landscape + isPortrait = portrait_map[ window.orientation ]; + } else { + isPortrait = elem && elem.clientWidth / elem.clientHeight < 1.1; + } - if ( newval > max ) { - newval = max; - } + return isPortrait ? "portrait" : "landscape"; + }; - this.handle.css( "left", percent + "%" ); - this.handle.attr( { - "aria-valuenow": cType === "input" ? newval : control.find( "option" ).eq( newval ).attr( "value" ), - "aria-valuetext": cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText(), - title: cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText() - }); - - // add/remove classes for flip toggle switch - if ( cType === "select" ) { - if ( newval === 0 ) { - this.slider.addClass( "ui-slider-switch-a" ) - .removeClass( "ui-slider-switch-b" ); - } else { - this.slider.addClass( "ui-slider-switch-b" ) - .removeClass( "ui-slider-switch-a" ); - } - } +})( jQuery, window ); - if ( !preventInputUpdate ) { - var valueChanged = false; - // update control"s value - if ( cType === "input" ) { - valueChanged = control.val() !== newval; - control.val( newval ); - } else { - valueChanged = control[ 0 ].selectedIndex !== newval; - control[ 0 ].selectedIndex = newval; - } - if ( !isfromControl && valueChanged ) { - control.trigger( "change" ); - } - } - }, +// throttled resize event +(function() { - enable: function() { - this.element.attr( "disabled", false ); - this.slider.removeClass( "ui-disabled" ).attr( "aria-disabled", false ); - return this._setOption( "disabled", false ); - }, + $.event.special.throttledresize = { + setup: function() { + $( this ).bind( "resize", handler ); + }, + teardown: function(){ + $( this ).unbind( "resize", handler ); + } + }; + + var throttle = 250, + handler = function() { + curr = ( new Date() ).getTime(); + diff = curr - lastCall; + + if ( diff >= throttle ) { + + lastCall = curr; + $( this ).trigger( "throttledresize" ); + + } else { + + if ( heldCall ) { + clearTimeout( heldCall ); + } + + // Promise a held call will still execute + heldCall = setTimeout( handler, throttle - diff ); + } + }, + lastCall = 0, + heldCall, + curr, + diff; +})(); - disable: function() { - this.element.attr( "disabled", true ); - this.slider.addClass( "ui-disabled" ).attr( "aria-disabled", true ); - return this._setOption( "disabled", true ); - } -}); +$.each({ + scrollstop: "scrollstart", + taphold: "tap", + swipeleft: "swipe", + swiperight: "swipe" +}, function( event, sourceEvent ) { -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $.mobile.slider.prototype.enhanceWithin( e.target ); + $.event.special[ event ] = { + setup: function() { + $( this ).bind( sourceEvent, $.noop ); + } + }; }); -})( jQuery ); -/* -* "textinput" plugin for text inputs, textareas -*/ +})( jQuery, this ); (function( $, undefined ) { -$.widget( "mobile.textinput", $.mobile.widget, { - options: { - theme: null, - initSelector: "input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type])" - }, - - _create: function() { +$.widget( "mobile.page", $.mobile.widget, { + options: { + theme: "c", + domCache: false, + keepNativeDefault: ":jqmData(role='none'), :jqmData(role='nojs')" + }, + + _create: function() { + + var self = this; + + // if false is returned by the callbacks do not create the page + if( self._trigger( "beforecreate" ) === false ){ + return false; + } + + self.element + .attr( "tabindex", "0" ) + .addClass( "ui-page ui-body-" + self.options.theme ) + .bind( "pagebeforehide", function(){ + self.removeContainerBackground(); + } ) + .bind( "pagebeforeshow", function(){ + self.setContainerBackground(); + } ); + + }, + + removeContainerBackground: function(){ + $.mobile.pageContainer.removeClass( "ui-overlay-" + $.mobile.getInheritedTheme( this.element.parent() ) ); + }, + + // set the page container background to the page theme + setContainerBackground: function( theme ){ + if( this.options.theme ){ + $.mobile.pageContainer.addClass( "ui-overlay-" + ( theme || this.options.theme ) ); + } + }, + + keepNativeSelector: function() { + var options = this.options, + keepNativeDefined = options.keepNative && $.trim(options.keepNative); + + if( keepNativeDefined && options.keepNative !== options.keepNativeDefault ){ + return [options.keepNative, options.keepNativeDefault].join(", "); + } - var input = this.element, - o = this.options, - theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ), - themeclass = " ui-body-" + theme, - focusedEl, clearbtn; - - $( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" ); - - focusedEl = input.addClass("ui-input-text ui-body-"+ theme ); - - // XXX: Temporary workaround for issue 785 (Apple bug 8910589). - // Turn off autocorrect and autocomplete on non-iOS 5 devices - // since the popup they use can't be dismissed by the user. Note - // that we test for the presence of the feature by looking for - // the autocorrect property on the input element. We currently - // have no test for iOS 5 or newer so we're temporarily using - // the touchOverflow support flag for jQM 1.0. Yes, I feel dirty. - jblas - if ( typeof input[0].autocorrect !== "undefined" && !$.support.touchOverflow ) { - // Set the attribute instead of the property just in case there - // is code that attempts to make modifications via HTML. - input[0].setAttribute( "autocorrect", "off" ); - input[0].setAttribute( "autocomplete", "off" ); - } + return options.keepNativeDefault; + } +}); +})( jQuery ); - //"search" input widget - if ( input.is( "[type='search'],:jqmData(type='search')" ) ) { +(function( $, window, undefined ) { - focusedEl = input.wrap( "" ).parent(); - clearbtn = $( "
clear text" ) - .tap(function( event ) { - input.val( "" ).focus(); - input.trigger( "change" ); - clearbtn.addClass( "ui-input-clear-hidden" ); - event.preventDefault(); - }) - .appendTo( focusedEl ) - .buttonMarkup({ - icon: "delete", - iconpos: "notext", - corners: true, - shadow: true - }); - - function toggleClear() { - setTimeout(function() { - clearbtn.toggleClass( "ui-input-clear-hidden", !input.val() ); - }, 0); - } +var createHandler = function( sequential ){ + + // Default to sequential + if( sequential === undefined ){ + sequential = true; + } + + return function( name, reverse, $to, $from ) { + + var deferred = new $.Deferred(), + reverseClass = reverse ? " reverse" : "", + active = $.mobile.urlHistory.getActive(), + toScroll = active.lastScroll || $.mobile.defaultHomeScroll, + screenHeight = $.mobile.getScreenHeight(), + maxTransitionOverride = $.mobile.maxTransitionWidth !== false && $( window ).width() > $.mobile.maxTransitionWidth, + none = !$.support.cssTransitions || maxTransitionOverride || !name || name === "none", + toggleViewportClass = function(){ + $.mobile.pageContainer.toggleClass( "ui-mobile-viewport-transitioning viewport-" + name ); + }, + scrollPage = function(){ + // By using scrollTo instead of silentScroll, we can keep things better in order + // Just to be precautios, disable scrollstart listening like silentScroll would + $.event.special.scrollstart.enabled = false; + + window.scrollTo( 0, toScroll ); + + // reenable scrollstart listening like silentScroll would + setTimeout(function() { + $.event.special.scrollstart.enabled = true; + }, 150 ); + }, + cleanFrom = function(){ + $from + .removeClass( $.mobile.activePageClass + " out in reverse " + name ) + .height( "" ); + }, + startOut = function(){ + // if it's not sequential, call the doneOut transition to start the TO page animating in simultaneously + if( !sequential ){ + doneOut(); + } + else { + $from.animationComplete( doneOut ); + } + + // Set the from page's height and start it transitioning out + // Note: setting an explicit height helps eliminate tiling in the transitions + $from + .height( screenHeight + $(window ).scrollTop() ) + .addClass( name + " out" + reverseClass ); + }, + + doneOut = function() { + + if ( $from && sequential ) { + cleanFrom(); + } + + startIn(); + }, + + startIn = function(){ + + $to.addClass( $.mobile.activePageClass ); + + // Send focus to page as it is now display: block + $.mobile.focusPage( $to ); + + // Set to page height + $to.height( screenHeight + toScroll ); + + scrollPage(); + + if( !none ){ + $to.animationComplete( doneIn ); + } + + $to.addClass( name + " in" + reverseClass ); + + if( none ){ + doneIn(); + } + + }, + + doneIn = function() { + + if ( !sequential ) { + + if( $from ){ + cleanFrom(); + } + } + + $to + .removeClass( "out in reverse " + name ) + .height( "" ); + + toggleViewportClass(); + + // In some browsers (iOS5), 3D transitions block the ability to scroll to the desired location during transition + // This ensures we jump to that spot after the fact, if we aren't there already. + if( $( window ).scrollTop() !== toScroll ){ + scrollPage(); + } + + deferred.resolve( name, reverse, $to, $from, true ); + }; + + toggleViewportClass(); + + if ( $from && !none ) { + startOut(); + } + else { + doneOut(); + } - toggleClear(); + return deferred.promise(); + }; +} - input.bind('paste cut keyup focus change blur', toggleClear); +// generate the handlers from the above +var sequentialHandler = createHandler(), + simultaneousHandler = createHandler( false ); + +// Make our transition handler the public default. +$.mobile.defaultTransitionHandler = sequentialHandler; + +//transition handler dictionary for 3rd party transitions +$.mobile.transitionHandlers = { + "default": $.mobile.defaultTransitionHandler, + "sequential": sequentialHandler, + "simultaneous": simultaneousHandler +}; - } else { - input.addClass( "ui-corner-all ui-shadow-inset" + themeclass ); - } +$.mobile.transitionFallbacks = {}; - input.focus(function() { - focusedEl.addClass( "ui-focus" ); - }) - .blur(function(){ - focusedEl.removeClass( "ui-focus" ); - }); - - // Autogrow - if ( input.is( "textarea" ) ) { - var extraLineHeight = 15, - keyupTimeoutBuffer = 100, - keyup = function() { - var scrollHeight = input[ 0 ].scrollHeight, - clientHeight = input[ 0 ].clientHeight; - - if ( clientHeight < scrollHeight ) { - input.height(scrollHeight + extraLineHeight); - } - }, - keyupTimeout; - - input.keyup(function() { - clearTimeout( keyupTimeout ); - keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer ); - }); - - // binding to pagechange here ensures that for pages loaded via - // ajax the height is recalculated without user input - $( document ).one( "pagechange", keyup ); - - // Issue 509: the browser is not providing scrollHeight properly until the styles load - if ( $.trim( input.val() ) ) { - // bind to the window load to make sure the height is calculated based on BOTH - // the DOM and CSS - $( window ).load( keyup ); - } - } - }, +})( jQuery, this ); - disable: function(){ - ( this.element.attr( "disabled", true ).is( "[type='search'],:jqmData(type='search')" ) ? - this.element.parent() : this.element ).addClass( "ui-disabled" ); - }, +( function( $, undefined ) { - enable: function(){ - ( this.element.attr( "disabled", false).is( "[type='search'],:jqmData(type='search')" ) ? - this.element.parent() : this.element ).removeClass( "ui-disabled" ); - } -}); + //define vars for interal use + var $window = $( window ), + $html = $( 'html' ), + $head = $( 'head' ), + + //url path helpers for use in relative url management + path = { + + // This scary looking regular expression parses an absolute URL or its relative + // variants (protocol, site, document, query, and hash), into the various + // components (protocol, host, path, query, fragment, etc that make up the + // URL as well as some other commonly used sub-parts. When used with RegExp.exec() + // or String.match, it parses the URL into a results array that looks like this: + // + // [0]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread#msg-content + // [1]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread + // [2]: http://jblas:password@mycompany.com:8080/mail/inbox + // [3]: http://jblas:password@mycompany.com:8080 + // [4]: http: + // [5]: // + // [6]: jblas:password@mycompany.com:8080 + // [7]: jblas:password + // [8]: jblas + // [9]: password + // [10]: mycompany.com:8080 + // [11]: mycompany.com + // [12]: 8080 + // [13]: /mail/inbox + // [14]: /mail/ + // [15]: inbox + // [16]: ?msg=1234&type=unread + // [17]: #msg-content + // + urlParseRE: /^(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/, + + //Parse a URL into a structure that allows easy access to + //all of the URL components by name. + parseUrl: function( url ) { + // If we're passed an object, we'll assume that it is + // a parsed url object and just return it back to the caller. + if ( $.type( url ) === "object" ) { + return url; + } + + var matches = path.urlParseRE.exec( url || "" ) || []; + + // Create an object that allows the caller to access the sub-matches + // by name. Note that IE returns an empty string instead of undefined, + // like all other browsers do, so we normalize everything so its consistent + // no matter what browser we're running on. + return { + href: matches[ 0 ] || "", + hrefNoHash: matches[ 1 ] || "", + hrefNoSearch: matches[ 2 ] || "", + domain: matches[ 3 ] || "", + protocol: matches[ 4 ] || "", + doubleSlash: matches[ 5 ] || "", + authority: matches[ 6 ] || "", + username: matches[ 8 ] || "", + password: matches[ 9 ] || "", + host: matches[ 10 ] || "", + hostname: matches[ 11 ] || "", + port: matches[ 12 ] || "", + pathname: matches[ 13 ] || "", + directory: matches[ 14 ] || "", + filename: matches[ 15 ] || "", + search: matches[ 16 ] || "", + hash: matches[ 17 ] || "" + }; + }, + + //Turn relPath into an asbolute path. absPath is + //an optional absolute path which describes what + //relPath is relative to. + makePathAbsolute: function( relPath, absPath ) { + if ( relPath && relPath.charAt( 0 ) === "/" ) { + return relPath; + } + + relPath = relPath || ""; + absPath = absPath ? absPath.replace( /^\/|(\/[^\/]*|[^\/]+)$/g, "" ) : ""; + + var absStack = absPath ? absPath.split( "/" ) : [], + relStack = relPath.split( "/" ); + for ( var i = 0; i < relStack.length; i++ ) { + var d = relStack[ i ]; + switch ( d ) { + case ".": + break; + case "..": + if ( absStack.length ) { + absStack.pop(); + } + break; + default: + absStack.push( d ); + break; + } + } + return "/" + absStack.join( "/" ); + }, + + //Returns true if both urls have the same domain. + isSameDomain: function( absUrl1, absUrl2 ) { + return path.parseUrl( absUrl1 ).domain === path.parseUrl( absUrl2 ).domain; + }, + + //Returns true for any relative variant. + isRelativeUrl: function( url ) { + // All relative Url variants have one thing in common, no protocol. + return path.parseUrl( url ).protocol === ""; + }, + + //Returns true for an absolute url. + isAbsoluteUrl: function( url ) { + return path.parseUrl( url ).protocol !== ""; + }, + + //Turn the specified realtive URL into an absolute one. This function + //can handle all relative variants (protocol, site, document, query, fragment). + makeUrlAbsolute: function( relUrl, absUrl ) { + if ( !path.isRelativeUrl( relUrl ) ) { + return relUrl; + } + + var relObj = path.parseUrl( relUrl ), + absObj = path.parseUrl( absUrl ), + protocol = relObj.protocol || absObj.protocol, + doubleSlash = relObj.protocol ? relObj.doubleSlash : ( relObj.doubleSlash || absObj.doubleSlash ), + authority = relObj.authority || absObj.authority, + hasPath = relObj.pathname !== "", + pathname = path.makePathAbsolute( relObj.pathname || absObj.filename, absObj.pathname ), + search = relObj.search || ( !hasPath && absObj.search ) || "", + hash = relObj.hash; + + return protocol + doubleSlash + authority + pathname + search + hash; + }, + + //Add search (aka query) params to the specified url. + addSearchParams: function( url, params ) { + var u = path.parseUrl( url ), + p = ( typeof params === "object" ) ? $.param( params ) : params, + s = u.search || "?"; + return u.hrefNoSearch + s + ( s.charAt( s.length - 1 ) !== "?" ? "&" : "" ) + p + ( u.hash || "" ); + }, + + convertUrlToDataUrl: function( absUrl ) { + var u = path.parseUrl( absUrl ); + if ( path.isEmbeddedPage( u ) ) { + // For embedded pages, remove the dialog hash key as in getFilePath(), + // otherwise the Data Url won't match the id of the embedded Page. + return u.hash.split( dialogHashKey )[0].replace( /^#/, "" ); + } else if ( path.isSameDomain( u, documentBase ) ) { + return u.hrefNoHash.replace( documentBase.domain, "" ); + } + return absUrl; + }, + + //get path from current hash, or from a file path + get: function( newPath ) { + if( newPath === undefined ) { + newPath = location.hash; + } + return path.stripHash( newPath ).replace( /[^\/]*\.[^\/*]+$/, '' ); + }, + + //return the substring of a filepath before the sub-page key, for making a server request + getFilePath: function( path ) { + var splitkey = '&' + $.mobile.subPageUrlKey; + return path && path.split( splitkey )[0].split( dialogHashKey )[0]; + }, + + //set location hash to path + set: function( path ) { + location.hash = path; + }, + + //test if a given url (string) is a path + //NOTE might be exceptionally naive + isPath: function( url ) { + return ( /\// ).test( url ); + }, + + //return a url path with the window's location protocol/hostname/pathname removed + clean: function( url ) { + return url.replace( documentBase.domain, "" ); + }, + + //just return the url without an initial # + stripHash: function( url ) { + return url.replace( /^#/, "" ); + }, + + //remove the preceding hash, any query params, and dialog notations + cleanHash: function( hash ) { + return path.stripHash( hash.replace( /\?.*$/, "" ).replace( dialogHashKey, "" ) ); + }, + + //check whether a url is referencing the same domain, or an external domain or different protocol + //could be mailto, etc + isExternal: function( url ) { + var u = path.parseUrl( url ); + return u.protocol && u.domain !== documentUrl.domain ? true : false; + }, + + hasProtocol: function( url ) { + return ( /^(:?\w+:)/ ).test( url ); + }, + + //check if the specified url refers to the first page in the main application document. + isFirstPageUrl: function( url ) { + // We only deal with absolute paths. + var u = path.parseUrl( path.makeUrlAbsolute( url, documentBase ) ), + + // Does the url have the same path as the document? + samePath = u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ), + + // Get the first page element. + fp = $.mobile.firstPage, + + // Get the id of the first page element if it has one. + fpId = fp && fp[0] ? fp[0].id : undefined; + + // The url refers to the first page if the path matches the document and + // it either has no hash value, or the hash is exactly equal to the id of the + // first page element. + return samePath && ( !u.hash || u.hash === "#" || ( fpId && u.hash.replace( /^#/, "" ) === fpId ) ); + }, + + isEmbeddedPage: function( url ) { + var u = path.parseUrl( url ); + + //if the path is absolute, then we need to compare the url against + //both the documentUrl and the documentBase. The main reason for this + //is that links embedded within external documents will refer to the + //application document, whereas links embedded within the application + //document will be resolved against the document base. + if ( u.protocol !== "" ) { + return ( u.hash && ( u.hrefNoHash === documentUrl.hrefNoHash || ( documentBaseDiffers && u.hrefNoHash === documentBase.hrefNoHash ) ) ); + } + return (/^#/).test( u.href ); + } + }, + + //will be defined when a link is clicked and given an active class + $activeClickedLink = null, + + //urlHistory is purely here to make guesses at whether the back or forward button was clicked + //and provide an appropriate transition + urlHistory = { + // Array of pages that are visited during a single page load. + // Each has a url and optional transition, title, and pageUrl (which represents the file path, in cases where URL is obscured, such as dialogs) + stack: [], + + //maintain an index number for the active page in the stack + activeIndex: 0, + + //get active + getActive: function() { + return urlHistory.stack[ urlHistory.activeIndex ]; + }, + + getPrev: function() { + return urlHistory.stack[ urlHistory.activeIndex - 1 ]; + }, + + getNext: function() { + return urlHistory.stack[ urlHistory.activeIndex + 1 ]; + }, + + // addNew is used whenever a new page is added + addNew: function( url, transition, title, pageUrl, role ) { + //if there's forward history, wipe it + if( urlHistory.getNext() ) { + urlHistory.clearForward(); + } + + urlHistory.stack.push( {url : url, transition: transition, title: title, pageUrl: pageUrl, role: role } ); + + urlHistory.activeIndex = urlHistory.stack.length - 1; + }, + + //wipe urls ahead of active index + clearForward: function() { + urlHistory.stack = urlHistory.stack.slice( 0, urlHistory.activeIndex + 1 ); + }, + + directHashChange: function( opts ) { + var back , forward, newActiveIndex, prev = this.getActive(); + + // check if url isp in history and if it's ahead or behind current page + $.each( urlHistory.stack, function( i, historyEntry ) { + + //if the url is in the stack, it's a forward or a back + if( opts.currentUrl === historyEntry.url ) { + //define back and forward by whether url is older or newer than current page + back = i < urlHistory.activeIndex; + forward = !back; + newActiveIndex = i; + } + }); + + // save new page index, null check to prevent falsey 0 result + this.activeIndex = newActiveIndex !== undefined ? newActiveIndex : this.activeIndex; + + if( back ) { + ( opts.either || opts.isBack )( true ); + } else if( forward ) { + ( opts.either || opts.isForward )( false ); + } + }, + + //disable hashchange event listener internally to ignore one change + //toggled internally when location.hash is updated to match the url of a successful page load + ignoreNextHashChange: false + }, + + //define first selector to receive focus when a page is shown + focusable = "[tabindex],a,button:visible,select:visible,input", + + //queue to hold simultanious page transitions + pageTransitionQueue = [], + + //indicates whether or not page is in process of transitioning + isPageTransitioning = false, + + //nonsense hash change key for dialogs, so they create a history entry + dialogHashKey = "&ui-state=dialog", + + //existing base tag? + $base = $head.children( "base" ), + + //tuck away the original document URL minus any fragment. + documentUrl = path.parseUrl( location.href ), + + //if the document has an embedded base tag, documentBase is set to its + //initial value. If a base tag does not exist, then we default to the documentUrl. + documentBase = $base.length ? path.parseUrl( path.makeUrlAbsolute( $base.attr( "href" ), documentUrl.href ) ) : documentUrl, + + //cache the comparison once. + documentBaseDiffers = ( documentUrl.hrefNoHash !== documentBase.hrefNoHash ); + + //base element management, defined depending on dynamic base tag support + var base = $.support.dynamicBaseTag ? { + + //define base element, for use in routing asset urls that are referenced in Ajax-requested markup + element: ( $base.length ? $base : $( "", { href: documentBase.hrefNoHash } ).prependTo( $head ) ), + + //set the generated BASE element's href attribute to a new page's base path + set: function( href ) { + base.element.attr( "href", path.makeUrlAbsolute( href, documentBase ) ); + }, + + //set the generated BASE element's href attribute to a new page's base path + reset: function() { + base.element.attr( "href", documentBase.hrefNoHash ); + } -//auto self-init widgets -$( document ).bind( "pagecreate create", function( e ){ - $.mobile.textinput.prototype.enhanceWithin( e.target ); -}); + } : undefined; -})( jQuery ); /* -* custom "selectmenu" plugin -*/ - -(function( $, undefined ) { - var extendSelect = function( widget ){ + internal utility functions +--------------------------------------*/ - var select = widget.select, - selectID = widget.selectID, - label = widget.label, - thisPage = widget.select.closest( ".ui-page" ), - screen = $( "
", {"class": "ui-selectmenu-screen ui-screen-hidden"} ).appendTo( thisPage ), - selectOptions = widget._selectOptions(), - isMultiple = widget.isMultiple = widget.select[ 0 ].multiple, - buttonId = selectID + "-button", - menuId = selectID + "-menu", - menuPage = $( "
" + - "
" + - "
" + label.getEncodedText() + "
"+ - "
"+ - "
"+ - "
" ).appendTo( $.mobile.pageContainer ).page(), - - listbox = $("
", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-" + widget.options.overlayTheme + " " + $.mobile.defaultDialogTransition } ).insertAfter(screen), - - list = $( "
    ", { - "class": "ui-selectmenu-list", - "id": menuId, - "role": "listbox", - "aria-labelledby": buttonId - }).attr( "data-" + $.mobile.ns + "theme", widget.options.theme ).appendTo( listbox ), - - header = $( "
    ", { - "class": "ui-header ui-bar-" + widget.options.theme - }).prependTo( listbox ), - - headerTitle = $( "

    ", { - "class": "ui-title" - }).appendTo( header ), - - headerClose = $( "", { - "text": widget.options.closeText, - "href": "#", - "class": "ui-btn-left" - }).attr( "data-" + $.mobile.ns + "iconpos", "notext" ).attr( "data-" + $.mobile.ns + "icon", "delete" ).appendTo( header ).buttonMarkup(), - - menuPageContent = menuPage.find( ".ui-content" ), - - menuPageClose = menuPage.find( ".ui-header a" ); - - - $.extend( widget, { - select: widget.select, - selectID: selectID, - buttonId: buttonId, - menuId: menuId, - thisPage: thisPage, - menuPage: menuPage, - label: label, - screen: screen, - selectOptions: selectOptions, - isMultiple: isMultiple, - theme: widget.options.theme, - listbox: listbox, - list: list, - header: header, - headerTitle: headerTitle, - headerClose: headerClose, - menuPageContent: menuPageContent, - menuPageClose: menuPageClose, - placeholder: "", - - build: function() { - var self = this; - - // Create list from select, update state - self.refresh(); - - self.select.attr( "tabindex", "-1" ).focus(function() { - $( this ).blur(); - self.button.focus(); - }); - - // Button events - self.button.bind( "vclick keydown" , function( event ) { - if ( event.type == "vclick" || - event.keyCode && ( event.keyCode === $.mobile.keyCode.ENTER || - event.keyCode === $.mobile.keyCode.SPACE ) ) { - - self.open(); - event.preventDefault(); - } - }); - - // Events for list items - self.list.attr( "role", "listbox" ) - .delegate( ".ui-li>a", "focusin", function() { - $( this ).attr( "tabindex", "0" ); - }) - .delegate( ".ui-li>a", "focusout", function() { - $( this ).attr( "tabindex", "-1" ); - }) - .delegate( "li:not(.ui-disabled, .ui-li-divider)", "click", function( event ) { - - // index of option tag to be selected - var oldIndex = self.select[ 0 ].selectedIndex, - newIndex = self.list.find( "li:not(.ui-li-divider)" ).index( this ), - option = self._selectOptions().eq( newIndex )[ 0 ]; - - // toggle selected status on the tag for multi selects - option.selected = self.isMultiple ? !option.selected : true; - - // toggle checkbox class for multiple selects - if ( self.isMultiple ) { - $( this ).find( ".ui-icon" ) - .toggleClass( "ui-icon-checkbox-on", option.selected ) - .toggleClass( "ui-icon-checkbox-off", !option.selected ); - } - - // trigger change if value changed - if ( self.isMultiple || oldIndex !== newIndex ) { - self.select.trigger( "change" ); - } - - //hide custom select for single selects only - if ( !self.isMultiple ) { - self.close(); - } - - event.preventDefault(); - }) - .keydown(function( event ) { //keyboard events for menu items - var target = $( event.target ), - li = target.closest( "li" ), - prev, next; - - // switch logic based on which key was pressed - switch ( event.keyCode ) { - // up or left arrow keys - case 38: - prev = li.prev(); - - // if there's a previous option, focus it - if ( prev.length ) { - target - .blur() - .attr( "tabindex", "-1" ); - - prev.find( "a" ).first().focus(); - } - - return false; - break; - - // down or right arrow keys - case 40: - next = li.next(); - - // if there's a next option, focus it - if ( next.length ) { - target - .blur() - .attr( "tabindex", "-1" ); - - next.find( "a" ).first().focus(); - } - - return false; - break; - - // If enter or space is pressed, trigger click - case 13: - case 32: - target.trigger( "click" ); - - return false; - break; - } - }); - - // button refocus ensures proper height calculation - // by removing the inline style and ensuring page inclusion - self.menuPage.bind( "pagehide", function() { - self.list.appendTo( self.listbox ); - self._focusButton(); - - // TODO centralize page removal binding / handling in the page plugin. - // Suggestion from @jblas to do refcounting - // - // TODO extremely confusing dependency on the open method where the pagehide.remove - // bindings are stripped to prevent the parent page from disappearing. The way - // we're keeping pages in the DOM right now sucks - // - // rebind the page remove that was unbound in the open function - // to allow for the parent page removal from actions other than the use - // of a dialog sized custom select - // - // doing this here provides for the back button on the custom select dialog - $.mobile._bindPageRemove.call( self.thisPage ); - }); - - // Events on "screen" overlay - self.screen.bind( "vclick", function( event ) { - self.close(); - }); - - // Close button on small overlays - self.headerClose.click( function() { - if ( self.menuType == "overlay" ) { - self.close(); - return false; - } - }); - - // track this dependency so that when the parent page - // is removed on pagehide it will also remove the menupage - self.thisPage.addDependents( this.menuPage ); - }, - _isRebuildRequired: function() { - var list = this.list.find( "li" ), - options = this._selectOptions(); - - // TODO exceedingly naive method to determine difference - // ignores value changes etc in favor of a forcedRebuild - // from the user in the refresh method - return options.text() !== list.text(); - }, + //direct focus to the page title, or otherwise first focusable element + $.mobile.focusPage = function ( page ) { + var autofocus = page.find("[autofocus]"), + pageTitle = page.find( ".ui-title:eq(0)" ); + + if( autofocus.length ) { + autofocus.focus(); + return; + } + + if( pageTitle.length ) { + pageTitle.focus(); + } + else{ + page.focus(); + } + } + + //remove active classes after page transition or error + function removeActiveLinkClass( forceRemoval ) { + if( !!$activeClickedLink && ( !$activeClickedLink.closest( '.ui-page-active' ).length || forceRemoval ) ) { + $activeClickedLink.removeClass( $.mobile.activeBtnClass ); + } + $activeClickedLink = null; + } + + function releasePageTransitionLock() { + isPageTransitioning = false; + if( pageTransitionQueue.length > 0 ) { + $.mobile.changePage.apply( null, pageTransitionQueue.pop() ); + } + } + + // Save the last scroll distance per page, before it is hidden + var setLastScrollEnabled = true, + setLastScroll, delayedSetLastScroll; + + setLastScroll = function() { + // this barrier prevents setting the scroll value based on the browser + // scrolling the window based on a hashchange + if( !setLastScrollEnabled ) { + return; + } + + var active = $.mobile.urlHistory.getActive(); + + if( active ) { + var lastScroll = $window.scrollTop(); + + // Set active page's lastScroll prop. + // If the location we're scrolling to is less than minScrollBack, let it go. + active.lastScroll = lastScroll < $.mobile.minScrollBack ? $.mobile.defaultHomeScroll : lastScroll; + } + }; + + // bind to scrollstop to gather scroll position. The delay allows for the hashchange + // event to fire and disable scroll recording in the case where the browser scrolls + // to the hash targets location (sometimes the top of the page). once pagechange fires + // getLastScroll is again permitted to operate + delayedSetLastScroll = function() { + setTimeout( setLastScroll, 100 ); + }; + + // disable an scroll setting when a hashchange has been fired, this only works + // because the recording of the scroll position is delayed for 100ms after + // the browser might have changed the position because of the hashchange + $window.bind( $.support.pushState ? "popstate" : "hashchange", function() { + setLastScrollEnabled = false; + }); + + // handle initial hashchange from chrome :( + $window.one( $.support.pushState ? "popstate" : "hashchange", function() { + setLastScrollEnabled = true; + }); + + // wait until the mobile page container has been determined to bind to pagechange + $window.one( "pagecontainercreate", function(){ + // once the page has changed, re-enable the scroll recording + $.mobile.pageContainer.bind( "pagechange", function() { + + setLastScrollEnabled = true; + + // remove any binding that previously existed on the get scroll + // which may or may not be different than the scroll element determined for + // this page previously + $window.unbind( "scrollstop", delayedSetLastScroll ); + + // determine and bind to the current scoll element which may be the window + // or in the case of touch overflow the element with touch overflow + $window.bind( "scrollstop", delayedSetLastScroll ); + }); + }); + + // bind to scrollstop for the first page as "pagechange" won't be fired in that case + $window.bind( "scrollstop", delayedSetLastScroll ); + + //function for transitioning between two existing pages + function transitionPages( toPage, fromPage, transition, reverse ) { + + if( fromPage ) { + //trigger before show/hide events + fromPage.data( "page" )._trigger( "beforehide", null, { nextPage: toPage } ); + } + + toPage.data( "page" )._trigger( "beforeshow", null, { prevPage: fromPage || $( "" ) } ); + + //clear page loader + $.mobile.hidePageLoadingMsg(); + + // If transition is defined, check if css 3D transforms are supported, and if not, if a fallback is specified + if( transition && !$.support.cssTransform3d && $.mobile.transitionFallbacks[ transition ] ){ + transition = $.mobile.transitionFallbacks[ transition ]; + } + + //find the transition handler for the specified transition. If there + //isn't one in our transitionHandlers dictionary, use the default one. + //call the handler immediately to kick-off the transition. + var th = $.mobile.transitionHandlers[ transition || "default" ] || $.mobile.defaultTransitionHandler, + promise = th( transition, reverse, toPage, fromPage ); + + promise.done(function() { + + //trigger show/hide events + if( fromPage ) { + fromPage.data( "page" )._trigger( "hide", null, { nextPage: toPage } ); + } + + //trigger pageshow, define prevPage as either fromPage or empty jQuery obj + toPage.data( "page" )._trigger( "show", null, { prevPage: fromPage || $( "" ) } ); + }); + + return promise; + } + + //simply set the active page's minimum height to screen height, depending on orientation + function getScreenHeight(){ + // Native innerHeight returns more accurate value for this across platforms, + // jQuery version is here as a normalized fallback for platforms like Symbian + return window.innerHeight || $( window ).height(); + } + + $.mobile.getScreenHeight = getScreenHeight; + + //simply set the active page's minimum height to screen height, depending on orientation + function resetActivePageHeight(){ + var aPage = $( "." + $.mobile.activePageClass ), + aPagePadT = parseFloat( aPage.css( "padding-top" ) ), + aPagePadB = parseFloat( aPage.css( "padding-bottom" ) ); + + aPage.css( "min-height", getScreenHeight() - aPagePadT - aPagePadB ); + } + + //shared page enhancements + function enhancePage( $page, role ) { + // If a role was specified, make sure the data-role attribute + // on the page element is in sync. + if( role ) { + $page.attr( "data-" + $.mobile.ns + "role", role ); + } + + //run page plugin + $page.page(); + } + +/* exposed $.mobile methods */ + + //animation complete callback + $.fn.animationComplete = function( callback ) { + if( $.support.cssTransitions ) { + return $( this ).one( 'webkitAnimationEnd animationend', callback ); + } + else{ + // defer execution for consistency between webkit/non webkit + setTimeout( callback, 0 ); + return $( this ); + } + }; + + //expose path object on $.mobile + $.mobile.path = path; + + //expose base object on $.mobile + $.mobile.base = base; + + //history stack + $.mobile.urlHistory = urlHistory; + + $.mobile.dialogHashKey = dialogHashKey; + + + + //enable cross-domain page support + $.mobile.allowCrossDomainPages = false; + + //return the original document url + $.mobile.getDocumentUrl = function(asParsedObject) { + return asParsedObject ? $.extend( {}, documentUrl ) : documentUrl.href; + }; + + //return the original document base url + $.mobile.getDocumentBase = function(asParsedObject) { + return asParsedObject ? $.extend( {}, documentBase ) : documentBase.href; + }; + + $.mobile._bindPageRemove = function() { + var page = $(this); + + // when dom caching is not enabled or the page is embedded bind to remove the page on hide + if( !page.data("page").options.domCache + && page.is(":jqmData(external-page='true')") ) { + + page.bind( 'pagehide.remove', function() { + var $this = $( this ), + prEvent = new $.Event( "pageremove" ); + + $this.trigger( prEvent ); + + if( !prEvent.isDefaultPrevented() ){ + $this.removeWithDependents(); + } + }); + } + }; + + // Load a page into the DOM. + $.mobile.loadPage = function( url, options ) { + // This function uses deferred notifications to let callers + // know when the page is done loading, or if an error has occurred. + var deferred = $.Deferred(), + + // The default loadPage options with overrides specified by + // the caller. + settings = $.extend( {}, $.mobile.loadPage.defaults, options ), + + // The DOM element for the page after it has been loaded. + page = null, + + // If the reloadPage option is true, and the page is already + // in the DOM, dupCachedPage will be set to the page element + // so that it can be removed after the new version of the + // page is loaded off the network. + dupCachedPage = null, + + // determine the current base url + findBaseWithDefault = function(){ + var closestBase = ( $.mobile.activePage && getClosestBaseUrl( $.mobile.activePage ) ); + return closestBase || documentBase.hrefNoHash; + }, + + // The absolute version of the URL passed into the function. This + // version of the URL may contain dialog/subpage params in it. + absUrl = path.makeUrlAbsolute( url, findBaseWithDefault() ); + + + // If the caller provided data, and we're using "get" request, + // append the data to the URL. + if ( settings.data && settings.type === "get" ) { + absUrl = path.addSearchParams( absUrl, settings.data ); + settings.data = undefined; + } + + // If the caller is using a "post" request, reloadPage must be true + if( settings.data && settings.type === "post" ){ + settings.reloadPage = true; + } + + // The absolute version of the URL minus any dialog/subpage params. + // In otherwords the real URL of the page to be loaded. + var fileUrl = path.getFilePath( absUrl ), + + // The version of the Url actually stored in the data-url attribute of + // the page. For embedded pages, it is just the id of the page. For pages + // within the same domain as the document base, it is the site relative + // path. For cross-domain pages (Phone Gap only) the entire absolute Url + // used to load the page. + dataUrl = path.convertUrlToDataUrl( absUrl ); + + // Make sure we have a pageContainer to work with. + settings.pageContainer = settings.pageContainer || $.mobile.pageContainer; + + // Check to see if the page already exists in the DOM. + page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" ); + + // If we failed to find the page, check to see if the url is a + // reference to an embedded page. If so, it may have been dynamically + // injected by a developer, in which case it would be lacking a data-url + // attribute and in need of enhancement. + if ( page.length === 0 && dataUrl && !path.isPath( dataUrl ) ) { + page = settings.pageContainer.children( "#" + dataUrl ) + .attr( "data-" + $.mobile.ns + "url", dataUrl ); + } + + // If we failed to find a page in the DOM, check the URL to see if it + // refers to the first page in the application. If it isn't a reference + // to the first page and refers to non-existent embedded page, error out. + if ( page.length === 0 ) { + if ( $.mobile.firstPage && path.isFirstPageUrl( fileUrl ) ) { + // Check to make sure our cached-first-page is actually + // in the DOM. Some user deployed apps are pruning the first + // page from the DOM for various reasons, we check for this + // case here because we don't want a first-page with an id + // falling through to the non-existent embedded page error + // case. If the first-page is not in the DOM, then we let + // things fall through to the ajax loading code below so + // that it gets reloaded. + if ( $.mobile.firstPage.parent().length ) { + page = $( $.mobile.firstPage ); + } + } else if ( path.isEmbeddedPage( fileUrl ) ) { + deferred.reject( absUrl, options ); + return deferred.promise(); + } + } + + // Reset base to the default document base. + if ( base ) { + base.reset(); + } + + // If the page we are interested in is already in the DOM, + // and the caller did not indicate that we should force a + // reload of the file, we are done. Otherwise, track the + // existing page as a duplicated. + if ( page.length ) { + if ( !settings.reloadPage ) { + enhancePage( page, settings.role ); + deferred.resolve( absUrl, options, page ); + return deferred.promise(); + } + dupCachedPage = page; + } + + var mpc = settings.pageContainer, + pblEvent = new $.Event( "pagebeforeload" ), + triggerData = { url: url, absUrl: absUrl, dataUrl: dataUrl, deferred: deferred, options: settings }; + + // Let listeners know we're about to load a page. + mpc.trigger( pblEvent, triggerData ); + + // If the default behavior is prevented, stop here! + if( pblEvent.isDefaultPrevented() ){ + return deferred.promise(); + } + + if ( settings.showLoadMsg ) { + + // This configurable timeout allows cached pages a brief delay to load without showing a message + var loadMsgDelay = setTimeout(function(){ + $.mobile.showPageLoadingMsg(); + }, settings.loadMsgDelay ), + + // Shared logic for clearing timeout and removing message. + hideMsg = function(){ + + // Stop message show timer + clearTimeout( loadMsgDelay ); + + // Hide loading message + $.mobile.hidePageLoadingMsg(); + }; + } + + if ( !( $.mobile.allowCrossDomainPages || path.isSameDomain( documentUrl, absUrl ) ) ) { + deferred.reject( absUrl, options ); + } else { + // Load the new page. + $.ajax({ + url: fileUrl, + type: settings.type, + data: settings.data, + dataType: "html", + success: function( html, textStatus, xhr ) { + //pre-parse html to check for a data-url, + //use it as the new fileUrl, base path, etc + var all = $( "
    " ), + + //page title regexp + newPageTitle = html.match( /]*>([^<]*)/ ) && RegExp.$1, + + // TODO handle dialogs again + pageElemRegex = new RegExp( "(<[^>]+\\bdata-" + $.mobile.ns + "role=[\"']?page[\"']?[^>]*>)" ), + dataUrlRegex = new RegExp( "\\bdata-" + $.mobile.ns + "url=[\"']?([^\"'>]*)[\"']?" ); + + + // data-url must be provided for the base tag so resource requests can be directed to the + // correct url. loading into a temprorary element makes these requests immediately + if( pageElemRegex.test( html ) + && RegExp.$1 + && dataUrlRegex.test( RegExp.$1 ) + && RegExp.$1 ) { + url = fileUrl = path.getFilePath( RegExp.$1 ); + } + + if ( base ) { + base.set( fileUrl ); + } + + //workaround to allow scripts to execute when included in page divs + all.get( 0 ).innerHTML = html; + page = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first(); + + //if page elem couldn't be found, create one and insert the body element's contents + if( !page.length ){ + page = $( "
    " + html.split( /<\/?body[^>]*>/gmi )[1] + "
    " ); + } + + if ( newPageTitle && !page.jqmData( "title" ) ) { + if ( ~newPageTitle.indexOf( "&" ) ) { + newPageTitle = $( "
    " + newPageTitle + "
    " ).text(); + } + page.jqmData( "title", newPageTitle ); + } + + //rewrite src and href attrs to use a base url + if( !$.support.dynamicBaseTag ) { + var newPath = path.get( fileUrl ); + page.find( "[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]" ).each(function() { + var thisAttr = $( this ).is( '[href]' ) ? 'href' : + $(this).is('[src]') ? 'src' : 'action', + thisUrl = $( this ).attr( thisAttr ); + + // XXX_jblas: We need to fix this so that it removes the document + // base URL, and then prepends with the new page URL. + //if full path exists and is same, chop it - helps IE out + thisUrl = thisUrl.replace( location.protocol + '//' + location.host + location.pathname, '' ); + + if( !/^(\w+:|#|\/)/.test( thisUrl ) ) { + $( this ).attr( thisAttr, newPath + thisUrl ); + } + }); + } + + //append to page and enhance + // TODO taging a page with external to make sure that embedded pages aren't removed + // by the various page handling code is bad. Having page handling code in many + // places is bad. Solutions post 1.0 + page + .attr( "data-" + $.mobile.ns + "url", path.convertUrlToDataUrl( fileUrl ) ) + .attr( "data-" + $.mobile.ns + "external-page", true ) + .appendTo( settings.pageContainer ); + + // wait for page creation to leverage options defined on widget + page.one( 'pagecreate', $.mobile._bindPageRemove ); + + enhancePage( page, settings.role ); + + // Enhancing the page may result in new dialogs/sub pages being inserted + // into the DOM. If the original absUrl refers to a sub-page, that is the + // real page we are interested in. + if ( absUrl.indexOf( "&" + $.mobile.subPageUrlKey ) > -1 ) { + page = settings.pageContainer.children( ":jqmData(url='" + dataUrl + "')" ); + } + + //bind pageHide to removePage after it's hidden, if the page options specify to do so + + // Remove loading message. + if ( settings.showLoadMsg ) { + hideMsg(); + } + + // Add the page reference and xhr to our triggerData. + triggerData.xhr = xhr; + triggerData.textStatus = textStatus; + triggerData.page = page; + + // Let listeners know the page loaded successfully. + settings.pageContainer.trigger( "pageload", triggerData ); + + deferred.resolve( absUrl, options, page, dupCachedPage ); + }, + error: function( xhr, textStatus, errorThrown ) { + //set base back to current path + if( base ) { + base.set( path.get() ); + } + + // Add error info to our triggerData. + triggerData.xhr = xhr; + triggerData.textStatus = textStatus; + triggerData.errorThrown = errorThrown; + + var plfEvent = new $.Event( "pageloadfailed" ); + + // Let listeners know the page load failed. + settings.pageContainer.trigger( plfEvent, triggerData ); + + // If the default behavior is prevented, stop here! + // Note that it is the responsibility of the listener/handler + // that called preventDefault(), to resolve/reject the + // deferred object within the triggerData. + if( plfEvent.isDefaultPrevented() ){ + return; + } + + // Remove loading message. + if ( settings.showLoadMsg ) { + + // Remove loading message. + hideMsg(); + + // show error message + $.mobile.showPageLoadingMsg( $.mobile.pageLoadErrorMessageTheme, $.mobile.pageLoadErrorMessage, true ); + + // hide after delay + setTimeout( $.mobile.hidePageLoadingMsg, 1500 ); + } + + deferred.reject( absUrl, options ); + } + }); + } + + return deferred.promise(); + }; + + $.mobile.loadPage.defaults = { + type: "get", + data: undefined, + reloadPage: false, + role: undefined, // By default we rely on the role defined by the @data-role attribute. + showLoadMsg: false, + pageContainer: undefined, + loadMsgDelay: 50 // This delay allows loads that pull from browser cache to occur without showing the loading message. + }; + + // Show a specific page in the page container. + $.mobile.changePage = function( toPage, options ) { + // If we are in the midst of a transition, queue the current request. + // We'll call changePage() once we're done with the current transition to + // service the request. + if( isPageTransitioning ) { + pageTransitionQueue.unshift( arguments ); + return; + } + + var settings = $.extend( {}, $.mobile.changePage.defaults, options ); + + // Make sure we have a pageContainer to work with. + settings.pageContainer = settings.pageContainer || $.mobile.pageContainer; + + // Make sure we have a fromPage. + settings.fromPage = settings.fromPage || $.mobile.activePage; + + var mpc = settings.pageContainer, + pbcEvent = new $.Event( "pagebeforechange" ), + triggerData = { toPage: toPage, options: settings }; + + // Let listeners know we're about to change the current page. + mpc.trigger( pbcEvent, triggerData ); + + // If the default behavior is prevented, stop here! + if( pbcEvent.isDefaultPrevented() ){ + return; + } + + // We allow "pagebeforechange" observers to modify the toPage in the trigger + // data to allow for redirects. Make sure our toPage is updated. + + toPage = triggerData.toPage; + + // Set the isPageTransitioning flag to prevent any requests from + // entering this method while we are in the midst of loading a page + // or transitioning. + + isPageTransitioning = true; + + // If the caller passed us a url, call loadPage() + // to make sure it is loaded into the DOM. We'll listen + // to the promise object it returns so we know when + // it is done loading or if an error ocurred. + if ( typeof toPage == "string" ) { + $.mobile.loadPage( toPage, settings ) + .done(function( url, options, newPage, dupCachedPage ) { + isPageTransitioning = false; + options.duplicateCachedPage = dupCachedPage; + $.mobile.changePage( newPage, options ); + }) + .fail(function( url, options ) { + isPageTransitioning = false; + + //clear out the active button state + removeActiveLinkClass( true ); + + //release transition lock so navigation is free again + releasePageTransitionLock(); + settings.pageContainer.trigger( "pagechangefailed", triggerData ); + }); + return; + } + + // If we are going to the first-page of the application, we need to make + // sure settings.dataUrl is set to the application document url. This allows + // us to avoid generating a document url with an id hash in the case where the + // first-page of the document has an id attribute specified. + if ( toPage[ 0 ] === $.mobile.firstPage[ 0 ] && !settings.dataUrl ) { + settings.dataUrl = documentUrl.hrefNoHash; + } + + // The caller passed us a real page DOM element. Update our + // internal state and then trigger a transition to the page. + var fromPage = settings.fromPage, + url = ( settings.dataUrl && path.convertUrlToDataUrl( settings.dataUrl ) ) || toPage.jqmData( "url" ), + // The pageUrl var is usually the same as url, except when url is obscured as a dialog url. pageUrl always contains the file path + pageUrl = url, + fileUrl = path.getFilePath( url ), + active = urlHistory.getActive(), + activeIsInitialPage = urlHistory.activeIndex === 0, + historyDir = 0, + pageTitle = document.title, + isDialog = settings.role === "dialog" || toPage.jqmData( "role" ) === "dialog"; + + // By default, we prevent changePage requests when the fromPage and toPage + // are the same element, but folks that generate content manually/dynamically + // and reuse pages want to be able to transition to the same page. To allow + // this, they will need to change the default value of allowSamePageTransition + // to true, *OR*, pass it in as an option when they manually call changePage(). + // It should be noted that our default transition animations assume that the + // formPage and toPage are different elements, so they may behave unexpectedly. + // It is up to the developer that turns on the allowSamePageTransitiona option + // to either turn off transition animations, or make sure that an appropriate + // animation transition is used. + if( fromPage && fromPage[0] === toPage[0] && !settings.allowSamePageTransition ) { + isPageTransitioning = false; + mpc.trigger( "pagechange", triggerData ); + return; + } + + // We need to make sure the page we are given has already been enhanced. + enhancePage( toPage, settings.role ); + + // If the changePage request was sent from a hashChange event, check to see if the + // page is already within the urlHistory stack. If so, we'll assume the user hit + // the forward/back button and will try to match the transition accordingly. + if( settings.fromHashChange ) { + urlHistory.directHashChange({ + currentUrl: url, + isBack: function() { historyDir = -1; }, + isForward: function() { historyDir = 1; } + }); + } + + // Kill the keyboard. + // XXX_jblas: We need to stop crawling the entire document to kill focus. Instead, + // we should be tracking focus with a delegate() handler so we already have + // the element in hand at this point. + // Wrap this in a try/catch block since IE9 throw "Unspecified error" if document.activeElement + // is undefined when we are in an IFrame. + try { + if(document.activeElement && document.activeElement.nodeName.toLowerCase() != 'body') { + $(document.activeElement).blur(); + } else { + $( "input:focus, textarea:focus, select:focus" ).blur(); + } + } catch(e) {} + + // If we're displaying the page as a dialog, we don't want the url + // for the dialog content to be used in the hash. Instead, we want + // to append the dialogHashKey to the url of the current page. + if ( isDialog && active ) { + // on the initial page load active.url is undefined and in that case should + // be an empty string. Moving the undefined -> empty string back into + // urlHistory.addNew seemed imprudent given undefined better represents + // the url state + url = ( active.url || "" ) + dialogHashKey; + } + + // Set the location hash. + if( settings.changeHash !== false && url ) { + //disable hash listening temporarily + urlHistory.ignoreNextHashChange = true; + //update hash and history + path.set( url ); + } + + // if title element wasn't found, try the page div data attr too + // If this is a deep-link or a reload ( active === undefined ) then just use pageTitle + var newPageTitle = ( !active )? pageTitle : toPage.jqmData( "title" ) || toPage.children(":jqmData(role='header')").find(".ui-title" ).getEncodedText(); + if( !!newPageTitle && pageTitle == document.title ) { + pageTitle = newPageTitle; + } + if ( !toPage.jqmData( "title" ) ) { + toPage.jqmData( "title", pageTitle ); + } + + // Make sure we have a transition defined. + settings.transition = settings.transition + || ( ( historyDir && !activeIsInitialPage ) ? active.transition : undefined ) + || ( isDialog ? $.mobile.defaultDialogTransition : $.mobile.defaultPageTransition ); + + //add page to history stack if it's not back or forward + if( !historyDir ) { + urlHistory.addNew( url, settings.transition, pageTitle, pageUrl, settings.role ); + } + + //set page title + document.title = urlHistory.getActive().title; + + //set "toPage" as activePage + $.mobile.activePage = toPage; + + // If we're navigating back in the URL history, set reverse accordingly. + settings.reverse = settings.reverse || historyDir < 0; + + transitionPages( toPage, fromPage, settings.transition, settings.reverse ) + .done(function( name, reverse, $to, $from, alreadyFocused ) { + removeActiveLinkClass(); + + //if there's a duplicateCachedPage, remove it from the DOM now that it's hidden + if ( settings.duplicateCachedPage ) { + settings.duplicateCachedPage.remove(); + } + + // Send focus to the newly shown page. Moved from promise .done binding in transitionPages + // itself to avoid ie bug that reports offsetWidth as > 0 (core check for visibility) + // despite visibility: hidden addresses issue #2965 + // https://github.com/jquery/jquery-mobile/issues/2965 + if( !alreadyFocused ){ + $.mobile.focusPage( toPage ); + } + + releasePageTransitionLock(); + + // Let listeners know we're all done changing the current page. + mpc.trigger( "pagechange", triggerData ); + }); + }; + + $.mobile.changePage.defaults = { + transition: undefined, + reverse: false, + changeHash: true, + fromHashChange: false, + role: undefined, // By default we rely on the role defined by the @data-role attribute. + duplicateCachedPage: undefined, + pageContainer: undefined, + showLoadMsg: true, //loading message shows by default when pages are being fetched during changePage + dataUrl: undefined, + fromPage: undefined, + allowSamePageTransition: false + }; - refresh: function( forceRebuild , foo ){ - var self = this, - select = this.element, - isMultiple = this.isMultiple, - options = this._selectOptions(), - selected = this.selected(), - // return an array of all selected index's - indicies = this.selectedIndices(); - - if ( forceRebuild || this._isRebuildRequired() ) { - self._buildList(); - } - - self.setButtonText(); - self.setButtonCount(); - - self.list.find( "li:not(.ui-li-divider)" ) - .removeClass( $.mobile.activeBtnClass ) - .attr( "aria-selected", false ) - .each(function( i ) { - - if ( $.inArray( i, indicies ) > -1 ) { - var item = $( this ); - - // Aria selected attr - item.attr( "aria-selected", true ); - - // Multiple selects: add the "on" checkbox state to the icon - if ( self.isMultiple ) { - item.find( ".ui-icon" ).removeClass( "ui-icon-checkbox-off" ).addClass( "ui-icon-checkbox-on" ); - } else { - item.addClass( $.mobile.activeBtnClass ); - } - } - }); - }, +/* Event Bindings - hashchange, submit, and click */ + function findClosestLink( ele ) + { + while ( ele ) { + // Look for the closest element with a nodeName of "a". + // Note that we are checking if we have a valid nodeName + // before attempting to access it. This is because the + // node we get called with could have originated from within + // an embedded SVG document where some symbol instance elements + // don't have nodeName defined on them, or strings are of type + // SVGAnimatedString. + if ( ( typeof ele.nodeName === "string" ) && ele.nodeName.toLowerCase() == "a" ) { + break; + } + ele = ele.parentNode; + } + return ele; + } + + // The base URL for any given element depends on the page it resides in. + function getClosestBaseUrl( ele ) + { + // Find the closest page and extract out its url. + var url = $( ele ).closest( ".ui-page" ).jqmData( "url" ), + base = documentBase.hrefNoHash; + + if ( !url || !path.isPath( url ) ) { + url = base; + } + + return path.makeUrlAbsolute( url, base); + } + + + //The following event bindings should be bound after mobileinit has been triggered + //the following function is called in the init file + $.mobile._registerInternalEvents = function(){ + + //bind to form submit events, handle with Ajax + $( document ).delegate( "form", "submit", function( event ) { + var $this = $( this ); + + if( !$.mobile.ajaxEnabled || + // test that the form is, itself, ajax false + $this.is(":jqmData(ajax='false')") || + // test that $.mobile.ignoreContentEnabled is set and + // the form or one of it's parents is ajax=false + !$this.jqmHijackable().length ) { + return; + } + + var type = $this.attr( "method" ), + target = $this.attr( "target" ), + url = $this.attr( "action" ); + + // If no action is specified, browsers default to using the + // URL of the document containing the form. Since we dynamically + // pull in pages from external documents, the form should submit + // to the URL for the source document of the page containing + // the form. + if ( !url ) { + // Get the @data-url for the page containing the form. + url = getClosestBaseUrl( $this ); + if ( url === documentBase.hrefNoHash ) { + // The url we got back matches the document base, + // which means the page must be an internal/embedded page, + // so default to using the actual document url as a browser + // would. + url = documentUrl.hrefNoSearch; + } + } + + url = path.makeUrlAbsolute( url, getClosestBaseUrl($this) ); + + //external submits use regular HTTP + if( path.isExternal( url ) || target ) { + return; + } + + $.mobile.changePage( + url, + { + type: type && type.length && type.toLowerCase() || "get", + data: $this.serialize(), + transition: $this.jqmData( "transition" ), + direction: $this.jqmData( "direction" ), + reloadPage: true + } + ); + event.preventDefault(); + }); + + //add active state on vclick + $( document ).bind( "vclick", function( event ) { + // if this isn't a left click we don't care. Its important to note + // that when the virtual event is generated it will create the which attr + if ( event.which > 1 || !$.mobile.linkBindingEnabled ) { + return; + } + + var link = findClosestLink( event.target ); + + // split from the previous return logic to avoid find closest where possible + // TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping + // can be avoided + if ( !$(link).jqmHijackable().length ) { + return; + } + + if ( link ) { + if ( path.parseUrl( link.getAttribute( "href" ) || "#" ).hash !== "#" ) { + removeActiveLinkClass( true ); + $activeClickedLink = $( link ).closest( ".ui-btn" ).not( ".ui-disabled" ); + $activeClickedLink.addClass( $.mobile.activeBtnClass ); + $( "." + $.mobile.activePageClass + " .ui-btn" ).not( link ).blur(); + + // By caching the href value to data and switching the href to a #, we can avoid address bar showing in iOS. The click handler resets the href during its initial steps if this data is present + $( link ) + .jqmData( "href", $( link ).attr( "href" ) ) + .attr( "href", "#" ); + } + } + }); + + // click routing - direct to HTTP or Ajax, accordingly + $( document ).bind( "click", function( event ) { + if( !$.mobile.linkBindingEnabled ){ + return; + } + + var link = findClosestLink( event.target ), $link = $( link ), httpCleanup; + + // If there is no link associated with the click or its not a left + // click we want to ignore the click + // TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping + // can be avoided + if ( !link || event.which > 1 || !$link.jqmHijackable().length ) { + return; + } + + //remove active link class if external (then it won't be there if you come back) + httpCleanup = function(){ + window.setTimeout( function() { removeActiveLinkClass( true ); }, 200 ); + }; + + // If there's data cached for the real href value, set the link's href back to it again. This pairs with an address bar workaround from the vclick handler + if( $link.jqmData( "href" ) ){ + $link.attr( "href", $link.jqmData( "href" ) ); + } + + //if there's a data-rel=back attr, go back in history + if( $link.is( ":jqmData(rel='back')" ) ) { + window.history.back(); + return false; + } + + var baseUrl = getClosestBaseUrl( $link ), + + //get href, if defined, otherwise default to empty hash + href = path.makeUrlAbsolute( $link.attr( "href" ) || "#", baseUrl ); + + //if ajax is disabled, exit early + if( !$.mobile.ajaxEnabled && !path.isEmbeddedPage( href ) ){ + httpCleanup(); + //use default click handling + return; + } + + // XXX_jblas: Ideally links to application pages should be specified as + // an url to the application document with a hash that is either + // the site relative path or id to the page. But some of the + // internal code that dynamically generates sub-pages for nested + // lists and select dialogs, just write a hash in the link they + // create. This means the actual URL path is based on whatever + // the current value of the base tag is at the time this code + // is called. For now we are just assuming that any url with a + // hash in it is an application page reference. + if ( href.search( "#" ) != -1 ) { + href = href.replace( /[^#]*#/, "" ); + if ( !href ) { + //link was an empty hash meant purely + //for interaction, so we ignore it. + event.preventDefault(); + return; + } else if ( path.isPath( href ) ) { + //we have apath so make it the href we want to load. + href = path.makeUrlAbsolute( href, baseUrl ); + } else { + //we have a simple id so use the documentUrl as its base. + href = path.makeUrlAbsolute( "#" + href, documentUrl.hrefNoHash ); + } + } + + // Should we handle this link, or let the browser deal with it? + var useDefaultUrlHandling = $link.is( "[rel='external']" ) || $link.is( ":jqmData(ajax='false')" ) || $link.is( "[target]" ), + + // Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR + // requests if the document doing the request was loaded via the file:// protocol. + // This is usually to allow the application to "phone home" and fetch app specific + // data. We normally let the browser handle external/cross-domain urls, but if the + // allowCrossDomainPages option is true, we will allow cross-domain http/https + // requests to go through our page loading logic. + isCrossDomainPageLoad = ( $.mobile.allowCrossDomainPages && documentUrl.protocol === "file:" && href.search( /^https?:/ ) != -1 ), + + //check for protocol or rel and its not an embedded page + //TODO overlap in logic from isExternal, rel=external check should be + // moved into more comprehensive isExternalLink + isExternal = useDefaultUrlHandling || ( path.isExternal( href ) && !isCrossDomainPageLoad ); + + if( isExternal ) { + httpCleanup(); + //use default click handling + return; + } + + //use ajax + var transition = $link.jqmData( "transition" ), + direction = $link.jqmData( "direction" ), + reverse = ( direction && direction === "reverse" ) || + // deprecated - remove by 1.0 + $link.jqmData( "back" ), + + //this may need to be more specific as we use data-rel more + role = $link.attr( "data-" + $.mobile.ns + "rel" ) || undefined; + + $.mobile.changePage( href, { transition: transition, reverse: reverse, role: role } ); + event.preventDefault(); + }); + + //prefetch pages when anchors with data-prefetch are encountered + $( document ).delegate( ".ui-page", "pageshow.prefetch", function() { + var urls = []; + $( this ).find( "a:jqmData(prefetch)" ).each(function(){ + var $link = $(this), + url = $link.attr( "href" ); + + if ( url && $.inArray( url, urls ) === -1 ) { + urls.push( url ); + + $.mobile.loadPage( url, {role: $link.attr("data-" + $.mobile.ns + "rel")} ); + } + }); + }); + + $.mobile._handleHashChange = function( hash ) { + //find first page via hash + var to = path.stripHash( hash ), + //transition is false if it's the first page, undefined otherwise (and may be overridden by default) + transition = $.mobile.urlHistory.stack.length === 0 ? "none" : undefined, + + // default options for the changPage calls made after examining the current state + // of the page and the hash + changePageOptions = { + transition: transition, + changeHash: false, + fromHashChange: true + }; + + //if listening is disabled (either globally or temporarily), or it's a dialog hash + if( !$.mobile.hashListeningEnabled || urlHistory.ignoreNextHashChange ) { + urlHistory.ignoreNextHashChange = false; + return; + } + + // special case for dialogs + if( urlHistory.stack.length > 1 && to.indexOf( dialogHashKey ) > -1 ) { + + // If current active page is not a dialog skip the dialog and continue + // in the same direction + if(!$.mobile.activePage.is( ".ui-dialog" )) { + //determine if we're heading forward or backward and continue accordingly past + //the current dialog + urlHistory.directHashChange({ + currentUrl: to, + isBack: function() { window.history.back(); }, + isForward: function() { window.history.forward(); } + }); + + // prevent changePage() + return; + } else { + // if the current active page is a dialog and we're navigating + // to a dialog use the dialog objected saved in the stack + urlHistory.directHashChange({ + currentUrl: to, + + // regardless of the direction of the history change + // do the following + either: function( isBack ) { + var active = $.mobile.urlHistory.getActive(); + + to = active.pageUrl; + + // make sure to set the role, transition and reversal + // as most of this is lost by the domCache cleaning + $.extend( changePageOptions, { + role: active.role, + transition: active.transition, + reverse: isBack + }); + } + }); + } + } + + //if to is defined, load it + if ( to ) { + // At this point, 'to' can be one of 3 things, a cached page element from + // a history stack entry, an id, or site-relative/absolute URL. If 'to' is + // an id, we need to resolve it against the documentBase, not the location.href, + // since the hashchange could've been the result of a forward/backward navigation + // that crosses from an external page/dialog to an internal page/dialog. + to = ( typeof to === "string" && !path.isPath( to ) ) ? ( path.makeUrlAbsolute( '#' + to, documentBase ) ) : to; + $.mobile.changePage( to, changePageOptions ); + } else { + //there's no hash, go to the first page in the dom + $.mobile.changePage( $.mobile.firstPage, changePageOptions ); + } + }; + + //hashchange event handler + $window.bind( "hashchange", function( e, triggered ) { + $.mobile._handleHashChange( location.hash ); + }); + + //set page min-heights to be device specific + $( document ).bind( "pageshow", resetActivePageHeight ); + $( window ).bind( "throttledresize", resetActivePageHeight ); - close: function() { - if ( this.options.disabled || !this.isOpen ) { - return; - } - - var self = this; - - if ( self.menuType == "page" ) { - // doesn't solve the possible issue with calling change page - // where the objects don't define data urls which prevents dialog key - // stripping - changePage has incoming refactor - window.history.back(); - } else { - self.screen.addClass( "ui-screen-hidden" ); - self.listbox.addClass( "ui-selectmenu-hidden" ).removeAttr( "style" ).removeClass( "in" ); - self.list.appendTo( self.listbox ); - self._focusButton(); - } + };//_registerInternalEvents callback - // allow the dialog to be closed again - self.isOpen = false; - }, +})( jQuery ); - open: function() { - if ( this.options.disabled ) { - return; - } - - var self = this, - menuHeight = self.list.parent().outerHeight(), - menuWidth = self.list.parent().outerWidth(), - activePage = $( ".ui-page-active" ), - tOverflow = $.support.touchOverflow && $.mobile.touchOverflowEnabled, - tScrollElem = activePage.is( ".ui-native-fixed" ) ? activePage.find( ".ui-content" ) : activePage, - scrollTop = tOverflow ? tScrollElem.scrollTop() : $( window ).scrollTop(), - btnOffset = self.button.offset().top, - screenHeight = $(window).height(), - screenWidth = $(window).width(); - - //add active class to button - self.button.addClass( $.mobile.activeBtnClass ); - - //remove after delay - setTimeout( function() { - self.button.removeClass( $.mobile.activeBtnClass ); - }, 300); - - function focusMenuItem() { - self.list.find( $.mobile.activeBtnClass ).focus(); - } - - if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) { - // prevent the parent page from being removed from the DOM, - // otherwise the results of selecting a list item in the dialog - // fall into a black hole - self.thisPage.unbind( "pagehide.remove" ); - - //for WebOS/Opera Mini (set lastscroll using button offset) - if ( scrollTop == 0 && btnOffset > screenHeight ) { - self.thisPage.one( "pagehide", function() { - $( this ).jqmData( "lastScroll", btnOffset ); - }); - } - - self.menuPage.one( "pageshow", function() { - // silentScroll() is called whenever a page is shown to restore - // any previous scroll position the page may have had. We need to - // wait for the "silentscroll" event before setting focus to avoid - // the browser"s "feature" which offsets rendering to make sure - // whatever has focus is in view. - $( window ).one( "silentscroll", function() { - focusMenuItem(); - }); - - self.isOpen = true; - }); - - self.menuType = "page"; - self.menuPageContent.append( self.list ); - self.menuPage.find("div .ui-title").text(self.label.text()); - $.mobile.changePage( self.menuPage, { - transition: $.mobile.defaultDialogTransition - }); - } else { - self.menuType = "overlay"; - - self.screen.height( $(document).height() ) - .removeClass( "ui-screen-hidden" ); - - // Try and center the overlay over the button - var roomtop = btnOffset - scrollTop, - roombot = scrollTop + screenHeight - btnOffset, - halfheight = menuHeight / 2, - maxwidth = parseFloat( self.list.parent().css( "max-width" ) ), - newtop, newleft; - - if ( roomtop > menuHeight / 2 && roombot > menuHeight / 2 ) { - newtop = btnOffset + ( self.button.outerHeight() / 2 ) - halfheight; - } else { - // 30px tolerance off the edges - newtop = roomtop > roombot ? scrollTop + screenHeight - menuHeight - 30 : scrollTop + 30; - } - - // If the menuwidth is smaller than the screen center is - if ( menuWidth < maxwidth ) { - newleft = ( screenWidth - menuWidth ) / 2; - } else { - - //otherwise insure a >= 30px offset from the left - newleft = self.button.offset().left + self.button.outerWidth() / 2 - menuWidth / 2; - - // 30px tolerance off the edges - if ( newleft < 30 ) { - newleft = 30; - } else if ( (newleft + menuWidth) > screenWidth ) { - newleft = screenWidth - menuWidth - 30; - } - } - - self.listbox.append( self.list ) - .removeClass( "ui-selectmenu-hidden" ) - .css({ - top: newtop, - left: newleft - }) - .addClass( "in" ); - - focusMenuItem(); - - // duplicate with value set in page show for dialog sized selects - self.isOpen = true; - } - }, +( function( $, window ) { + // For now, let's Monkeypatch this onto the end of $.mobile._registerInternalEvents + // Scope self to pushStateHandler so we can reference it sanely within the + // methods handed off as event handlers + var pushStateHandler = {}, + self = pushStateHandler, + $win = $( window ), + url = $.mobile.path.parseUrl( location.href ); + + $.extend( pushStateHandler, { + // TODO move to a path helper, this is rather common functionality + initialFilePath: (function() { + return url.pathname + url.search; + })(), + + initialHref: url.hrefNoHash, + + state: function() { + return { + hash: location.hash || "#" + self.initialFilePath, + title: document.title, + + // persist across refresh + initialHref: self.initialHref + }; + }, + + resetUIKeys: function( url ) { + var dialog = $.mobile.dialogHashKey, + subkey = "&" + $.mobile.subPageUrlKey, + dialogIndex = url.indexOf( dialog ); + + if( dialogIndex > -1 ) { + url = url.slice( 0, dialogIndex ) + "#" + url.slice( dialogIndex ); + } else if( url.indexOf( subkey ) > -1 ) { + url = url.split( subkey ).join( "#" + subkey ); + } + + return url; + }, + + hashValueAfterReset: function( url ) { + var resetUrl = self.resetUIKeys( url ); + return $.mobile.path.parseUrl( resetUrl ).hash; + }, + + // TODO sort out a single barrier to hashchange functionality + nextHashChangePrevented: function( value ) { + $.mobile.urlHistory.ignoreNextHashChange = value; + self.onHashChangeDisabled = value; + }, + + // on hash change we want to clean up the url + // NOTE this takes place *after* the vanilla navigation hash change + // handling has taken place and set the state of the DOM + onHashChange: function( e ) { + // disable this hash change + if( self.onHashChangeDisabled ){ + return; + } + + var href, state, + hash = location.hash, + isPath = $.mobile.path.isPath( hash ), + resolutionUrl = isPath ? location.href : $.mobile.getDocumentUrl(); + + hash = isPath ? hash.replace( "#", "" ) : hash; + + + // propulate the hash when its not available + state = self.state(); + + // make the hash abolute with the current href + href = $.mobile.path.makeUrlAbsolute( hash, resolutionUrl ); + + if ( isPath ) { + href = self.resetUIKeys( href ); + } + + // replace the current url with the new href and store the state + // Note that in some cases we might be replacing an url with the + // same url. We do this anyways because we need to make sure that + // all of our history entries have a state object associated with + // them. This allows us to work around the case where window.history.back() + // is called to transition from an external page to an embedded page. + // In that particular case, a hashchange event is *NOT* generated by the browser. + // Ensuring each history entry has a state object means that onPopState() + // will always trigger our hashchange callback even when a hashchange event + // is not fired. + history.replaceState( state, document.title, href ); + }, + + // on popstate (ie back or forward) we need to replace the hash that was there previously + // cleaned up by the additional hash handling + onPopState: function( e ) { + var poppedState = e.originalEvent.state, + timeout, fromHash, toHash, hashChanged; + + // if there's no state its not a popstate we care about, eg chrome's initial popstate + if( poppedState ) { + // the active url in the history stack will still be from the previous state + // so we can use it to verify if a hashchange will be fired from the popstate + fromHash = self.hashValueAfterReset( $.mobile.urlHistory.getActive().url ); + + // the hash stored in the state popped off the stack will be our currenturl or + // the url to which we wish to navigate + toHash = self.hashValueAfterReset( poppedState.hash.replace("#", "") ); + + // if the hashes of the urls are different we must assume that the browser + // will fire a hashchange + hashChanged = fromHash !== toHash; + + // unlock hash handling once the hashchange caused be the popstate has fired + if( hashChanged ) { + $win.one( "hashchange.pushstate", function() { + self.nextHashChangePrevented( false ); + }); + } + + // enable hash handling for the the _handleHashChange call + self.nextHashChangePrevented( false ); + + // change the page based on the hash + $.mobile._handleHashChange( poppedState.hash ); + + // only prevent another hash change handling if a hash change will be fired + // by the browser + if( hashChanged ) { + // disable hash handling until one of the above timers fires + self.nextHashChangePrevented( true ); + } + } + }, + + init: function() { + $win.bind( "hashchange", self.onHashChange ); + + // Handle popstate events the occur through history changes + $win.bind( "popstate", self.onPopState ); + + // if there's no hash, we need to replacestate for returning to home + if ( location.hash === "" ) { + history.replaceState( self.state(), document.title, location.href ); + } + } + }); + + $( function() { + if( $.mobile.pushStateEnabled && $.support.pushState ){ + pushStateHandler.init(); + } + }); +})( jQuery, this ); - _buildList: function() { - var self = this, - o = this.options, - placeholder = this.placeholder, - optgroups = [], - lis = [], - dataIcon = self.isMultiple ? "checkbox-off" : "false"; - - self.list.empty().filter( ".ui-listview" ).listview( "destroy" ); - - // Populate menu with options from select element - self.select.find( "option" ).each( function( i ) { - var $this = $( this ), - $parent = $this.parent(), - text = $this.getEncodedText(), - anchor = "
    "+ text +"", - classes = [], - extraAttrs = []; - - // Are we inside an optgroup? - if ( $parent.is( "optgroup" ) ) { - var optLabel = $parent.attr( "label" ); - - // has this optgroup already been built yet? - if ( $.inArray( optLabel, optgroups ) === -1 ) { - lis.push( "
  • "+ optLabel +"
  • " ); - optgroups.push( optLabel ); - } - } - - // Find placeholder text - // TODO: Are you sure you want to use getAttribute? ^RW - if ( !this.getAttribute( "value" ) || text.length == 0 || $this.jqmData( "placeholder" ) ) { - if ( o.hidePlaceholderMenuItems ) { - classes.push( "ui-selectmenu-placeholder" ); - } - placeholder = self.placeholder = text; - } - - // support disabled option tags - if ( this.disabled ) { - classes.push( "ui-disabled" ); - extraAttrs.push( "aria-disabled='true'" ); - } - - lis.push( "
  • "+ anchor +"
  • " ); - }); - - self.list.html( lis.join(" ") ); - - self.list.find( "li" ) - .attr({ "role": "option", "tabindex": "-1" }) - .first().attr( "tabindex", "0" ); - - // Hide header close link for single selects - if ( !this.isMultiple ) { - this.headerClose.hide(); - } - - // Hide header if it's not a multiselect and there's no placeholder - if ( !this.isMultiple && !placeholder.length ) { - this.header.hide(); - } else { - this.headerTitle.text( this.placeholder ); - } +/* +* fallback transition for pop in non-3D supporting browsers (which tend to handle complex transitions poorly in general +*/ - // Now populated, create listview - self.list.listview(); - }, +(function( $, window, undefined ) { - _button: function(){ - return $( "", { - "href": "#", - "role": "button", - // TODO value is undefined at creation - "id": this.buttonId, - "aria-haspopup": "true", - - // TODO value is undefined at creation - "aria-owns": this.menuId - }); - } - }); - }; +$.mobile.transitionFallbacks.pop = "fade"; - $( document ).delegate( "select", "selectmenubeforecreate", function(){ - var selectmenuWidget = $( this ).data( "selectmenu" ); +})( jQuery, this ); - if( !selectmenuWidget.options.nativeMenu ){ - extendSelect( selectmenuWidget ); - } - }); -})( jQuery ); /* -* "selectmenu" plugin +* fallback transition for slide in non-3D supporting browsers (which tend to handle complex transitions poorly in general */ -(function( $, undefined ) { +(function( $, window, undefined ) { -$.widget( "mobile.selectmenu", $.mobile.widget, { - options: { - theme: null, - disabled: false, - icon: "arrow-d", - iconpos: "right", - inline: null, - corners: true, - shadow: true, - iconshadow: true, - menuPageTheme: "b", - overlayTheme: "a", - hidePlaceholderMenuItems: true, - closeText: "Close", - nativeMenu: true, - initSelector: "select:not(:jqmData(role='slider'))" - }, +// Use the simultaneous transition handler for slide transitions +$.mobile.transitionHandlers.slide = $.mobile.transitionHandlers.simultaneous; - _button: function(){ - return $( "
    " ); - }, +// Set the slide transition's fallback to "fade" +$.mobile.transitionFallbacks.slide = "fade"; - _setDisabled: function( value ) { - this.element.attr( "disabled", value ); - this.button.attr( "aria-disabled", value ); - return this._setOption( "disabled", value ); - }, +})( jQuery, this ); - _focusButton : function() { - var self = this; +/* +* fallback transition for slidedown in non-3D supporting browsers (which tend to handle complex transitions poorly in general +*/ - setTimeout( function() { - self.button.focus(); - }, 40); - }, +(function( $, window, undefined ) { - _selectOptions: function() { - return this.select.find( "option" ); - }, +$.mobile.transitionFallbacks.slidedown = "fade"; - // setup items that are generally necessary for select menu extension - _preExtension: function(){ - this.select = this.element.wrap( "
    " ); - this.selectID = this.select.attr( "id" ); - this.label = $( "label[for='"+ this.selectID +"']" ).addClass( "ui-select" ); - this.isMultiple = this.select[ 0 ].multiple; - if ( !this.options.theme ) { - this.options.theme = $.mobile.getInheritedTheme( this.select, "c" ); - } - }, +})( jQuery, this ); - _create: function() { - this._preExtension(); +/* +* fallback transition for slideup in non-3D supporting browsers (which tend to handle complex transitions poorly in general +*/ - // Allows for extension of the native select for custom selects and other plugins - // see select.custom for example extension - // TODO explore plugin registration - this._trigger( "beforeCreate" ); - - this.button = this._button(); - - var self = this, - - options = this.options, - - // IE throws an exception at options.item() function when - // there is no selected item - // select first in this case - selectedIndex = this.select[ 0 ].selectedIndex == -1 ? 0 : this.select[ 0 ].selectedIndex, - - // TODO values buttonId and menuId are undefined here - button = this.button - .text( $( this.select[ 0 ].options.item( selectedIndex ) ).text() ) - .insertBefore( this.select ) - .buttonMarkup( { - theme: options.theme, - icon: options.icon, - iconpos: options.iconpos, - inline: options.inline, - corners: options.corners, - shadow: options.shadow, - iconshadow: options.iconshadow - }); - - // Opera does not properly support opacity on select elements - // In Mini, it hides the element, but not its text - // On the desktop,it seems to do the opposite - // for these reasons, using the nativeMenu option results in a full native select in Opera - if ( options.nativeMenu && window.opera && window.opera.version ) { - this.select.addClass( "ui-select-nativeonly" ); - } +(function( $, window, undefined ) { - // Add counter for multi selects - if ( this.isMultiple ) { - this.buttonCount = $( "" ) - .addClass( "ui-li-count ui-btn-up-c ui-btn-corner-all" ) - .hide() - .appendTo( button.addClass('ui-li-has-count') ); - } +$.mobile.transitionFallbacks.slideup = "fade"; - // Disable if specified - if ( options.disabled || this.element.attr('disabled')) { - this.disable(); - } +})( jQuery, this ); - // Events on native select - this.select.change( function() { - self.refresh(); - }); +/* +* fallback transition for flip in non-3D supporting browsers (which tend to handle complex transitions poorly in general +*/ - this.build(); - }, +(function( $, window, undefined ) { - build: function() { - var self = this; +$.mobile.transitionFallbacks.flip = "fade"; - this.select - .appendTo( self.button ) - .bind( "vmousedown", function() { - // Add active class to button - self.button.addClass( $.mobile.activeBtnClass ); - }) - .bind( "focus vmouseover", function() { - self.button.trigger( "vmouseover" ); - }) - .bind( "vmousemove", function() { - // Remove active class on scroll/touchmove - self.button.removeClass( $.mobile.activeBtnClass ); - }) - .bind( "change blur vmouseout", function() { - self.button.trigger( "vmouseout" ) - .removeClass( $.mobile.activeBtnClass ); - }) - .bind( "change blur", function() { - self.button.removeClass( "ui-btn-down-" + self.options.theme ); - }); - }, +})( jQuery, this ); - selected: function() { - return this._selectOptions().filter( ":selected" ); - }, +/* +* fallback transition for flow in non-3D supporting browsers (which tend to handle complex transitions poorly in general +*/ - selectedIndices: function() { - var self = this; +(function( $, window, undefined ) { - return this.selected().map( function() { - return self._selectOptions().index( this ); - }).get(); - }, +$.mobile.transitionFallbacks.flow = "fade"; - setButtonText: function() { - var self = this, selected = this.selected(); +})( jQuery, this ); - this.button.find( ".ui-btn-text" ).text( function() { - if ( !self.isMultiple ) { - return selected.text(); - } +/* +* fallback transition for turn in non-3D supporting browsers (which tend to handle complex transitions poorly in general +*/ - return selected.length ? selected.map( function() { - return $( this ).text(); - }).get().join( ", " ) : self.placeholder; - }); - }, +(function( $, window, undefined ) { - setButtonCount: function() { - var selected = this.selected(); +$.mobile.transitionFallbacks.turn = "fade"; - // multiple count inside button - if ( this.isMultiple ) { - this.buttonCount[ selected.length > 1 ? "show" : "hide" ]().text( selected.length ); - } - }, +})( jQuery, this ); - refresh: function() { - this.setButtonText(); - this.setButtonCount(); - }, +(function( $, undefined ) { - // open and close preserved in native selects - // to simplify users code when looping over selects - open: $.noop, - close: $.noop, - - disable: function() { - this._setDisabled( true ); - this.button.addClass( "ui-disabled" ); - }, +$.mobile.page.prototype.options.degradeInputs = { + color: false, + date: false, + datetime: false, + "datetime-local": false, + email: false, + month: false, + number: false, + range: "number", + search: "text", + tel: false, + time: false, + url: false, + week: false +}; - enable: function() { - this._setDisabled( false ); - this.button.removeClass( "ui-disabled" ); - } -}); //auto self-init widgets $( document ).bind( "pagecreate create", function( e ){ - $.mobile.selectmenu.prototype.enhanceWithin( e.target ); -}); -})( jQuery ); -/* -* "buttons" plugin - for making button-like links -*/ -( function( $, undefined ) { + var page = $.mobile.closestPageData($(e.target)), options; -$.fn.buttonMarkup = function( options ) { - options = options || {}; - for ( var i = 0; i < this.length; i++ ) { - var el = this.eq( i ), - e = el[ 0 ], - o = $.extend( {}, $.fn.buttonMarkup.defaults, { - icon: options.icon !== undefined ? options.icon : el.jqmData( "icon" ), - iconpos: options.iconpos !== undefined ? options.iconpos : el.jqmData( "iconpos" ), - theme: options.theme !== undefined ? options.theme : el.jqmData( "theme" ), - inline: options.inline !== undefined ? options.inline : el.jqmData( "inline" ), - shadow: options.shadow !== undefined ? options.shadow : el.jqmData( "shadow" ), - corners: options.corners !== undefined ? options.corners : el.jqmData( "corners" ), - iconshadow: options.iconshadow !== undefined ? options.iconshadow : el.jqmData( "iconshadow" ) - }, options ), - - // Classes Defined - innerClass = "ui-btn-inner", - textClass = "ui-btn-text", - buttonClass, iconClass, - - // Button inner markup - buttonInner = document.createElement( o.wrapperEls ), - buttonText = document.createElement( o.wrapperEls ), - buttonIcon = o.icon ? document.createElement( "span" ) : null; - - // if so, prevent double enhancement, and continue with rest of the elements. - if( e.tagName === "INPUT" && el.jqmData('role') === "button" ) continue; - - // if this is a button, check if it's been enhanced and, if not, use the right function - if( e.tagName === "BUTTON" ) { - if ( !$( e.parentNode ).hasClass( "ui-btn" ) ) $( e ).button(); - continue; - } + if( !page ) { + return; + } + + options = page.options; + + // degrade inputs to avoid poorly implemented native functionality + $( e.target ).find( "input" ).not( page.keepNativeSelector() ).each(function() { + var $this = $( this ), + type = this.getAttribute( "type" ), + optType = options.degradeInputs[ type ] || "text"; + + if ( options.degradeInputs[ type ] ) { + var html = $( "
    " ).html( $this.clone() ).html(), + // In IE browsers, the type sometimes doesn't exist in the cloned markup, so we replace the closing tag instead + hasType = html.indexOf( " type=" ) > -1, + findstr = hasType ? /\s+type=["']?\w+['"]?/ : /\/?>/, + repstr = " type=\"" + optType + "\" data-" + $.mobile.ns + "type=\"" + type + "\"" + ( hasType ? "" : ">" ); + + $this.replaceWith( html.replace( findstr, repstr ) ); + } + }); - if ( attachEvents ) { - attachEvents(); - } +}); - // if not, try to find closest theme container - if ( !o.theme ) { - o.theme = $.mobile.getInheritedTheme( el, "c" ); - } +})( jQuery ); - buttonClass = "ui-btn ui-btn-up-" + o.theme; +(function( $, window, undefined ) { - if ( o.inline ) { - buttonClass += " ui-btn-inline"; - } +$.widget( "mobile.dialog", $.mobile.widget, { + options: { + closeBtnText : "Close", + overlayTheme : "a", + initSelector : ":jqmData(role='dialog')" + }, + _create: function() { + var self = this, + $el = this.element, + headerCloseButton = $( ""+ this.options.closeBtnText + "" ), + dialogWrap = $("
    ", { + "role" : "dialog", + "class" : "ui-dialog-contain ui-corner-all ui-overlay-shadow" + }); + + $el.addClass( "ui-dialog ui-overlay-" + this.options.overlayTheme ); + + // Class the markup for dialog styling + // Set aria role + $el + .wrapInner( dialogWrap ) + .children() + .find( ":jqmData(role='header')" ) + .prepend( headerCloseButton ) + .end() + .children( ':first-child') + .addClass( "ui-corner-top" ) + .end() + .children( ":last-child" ) + .addClass( "ui-corner-bottom" ); + + // this must be an anonymous function so that select menu dialogs can replace + // the close method. This is a change from previously just defining data-rel=back + // on the button and letting nav handle it + // + // Use click rather than vclick in order to prevent the possibility of unintentionally + // reopening the dialog if the dialog opening item was directly under the close button. + headerCloseButton.bind( "click", function() { + self.close(); + }); + + /* bind events + - clicks and submits should use the closing transition that the dialog opened with + unless a data-transition is specified on the link/form + - if the click was on the close button, or the link has a data-rel="back" it'll go back in history naturally + */ + $el.bind( "vclick submit", function( event ) { + var $target = $( event.target ).closest( event.type === "vclick" ? "a" : "form" ), + active; + + if ( $target.length && !$target.jqmData( "transition" ) ) { + + active = $.mobile.urlHistory.getActive() || {}; + + $target.attr( "data-" + $.mobile.ns + "transition", ( active.transition || $.mobile.defaultDialogTransition ) ) + .attr( "data-" + $.mobile.ns + "direction", "reverse" ); + } + }) + .bind( "pagehide", function( e, ui ) { + $( this ).find( "." + $.mobile.activeBtnClass ).removeClass( $.mobile.activeBtnClass ); + }) + // Override the theme set by the page plugin on pageshow + .bind( "pagebeforeshow", function(){ + if( self.options.overlayTheme ){ + self.element + .page( "removeContainerBackground" ) + .page( "setContainerBackground", self.options.overlayTheme ); + } + }); + }, + + // Close method goes back in history + close: function() { + window.history.back(); + } +}); - if ( o.icon ) { - o.icon = "ui-icon-" + o.icon; - o.iconpos = o.iconpos || "left"; +//auto self-init widgets +$( document ).delegate( $.mobile.dialog.prototype.options.initSelector, "pagecreate", function(){ + $.mobile.dialog.prototype.enhance( this ); +}); - iconClass = "ui-icon " + o.icon; +})( jQuery, this ); - if ( o.iconshadow ) { - iconClass += " ui-icon-shadow"; - } - } +(function( $, undefined ) { - if ( o.iconpos ) { - buttonClass += " ui-btn-icon-" + o.iconpos; +$.fn.fieldcontain = function( options ) { + return this.addClass( "ui-field-contain ui-body ui-br" ); +}; - if ( o.iconpos == "notext" && !el.attr( "title" ) ) { - el.attr( "title", el.getEncodedText() ); - } - } +//auto self-init widgets +$( document ).bind( "pagecreate create", function( e ){ + $( ":jqmData(role='fieldcontain')", e.target ).jqmEnhanceable().fieldcontain(); +}); - if ( o.corners ) { - buttonClass += " ui-btn-corner-all"; - innerClass += " ui-btn-corner-all"; - } +})( jQuery ); - if ( o.shadow ) { - buttonClass += " ui-shadow"; - } +(function( $, undefined ) { - e.setAttribute( "data-" + $.mobile.ns + "theme", o.theme ); - el.addClass( buttonClass ); +$.fn.grid = function( options ) { + return this.each(function() { + + var $this = $( this ), + o = $.extend({ + grid: null + },options), + $kids = $this.children(), + gridCols = {solo:1, a:2, b:3, c:4, d:5}, + grid = o.grid, + iterator; + + if ( !grid ) { + if ( $kids.length <= 5 ) { + for ( var letter in gridCols ) { + if ( gridCols[ letter ] === $kids.length ) { + grid = letter; + } + } + } else { + grid = "a"; + } + } + iterator = gridCols[grid]; + + $this.addClass( "ui-grid-" + grid ); + + $kids.filter( ":nth-child(" + iterator + "n+1)" ).addClass( "ui-block-a" ); + + if ( iterator > 1 ) { + $kids.filter( ":nth-child(" + iterator + "n+2)" ).addClass( "ui-block-b" ); + } + if ( iterator > 2 ) { + $kids.filter( ":nth-child(3n+3)" ).addClass( "ui-block-c" ); + } + if ( iterator > 3 ) { + $kids.filter( ":nth-child(4n+4)" ).addClass( "ui-block-d" ); + } + if ( iterator > 4 ) { + $kids.filter( ":nth-child(5n+5)" ).addClass( "ui-block-e" ); + } + }); +}; +})( jQuery ); - buttonInner.className = innerClass; +(function( $, undefined ) { - buttonText.className = textClass; - buttonInner.appendChild( buttonText ); +$( document ).bind( "pagecreate create", function( e ){ + $( ":jqmData(role='nojs')", e.target ).addClass( "ui-nojs" ); + +}); - if ( buttonIcon ) { - buttonIcon.className = iconClass; - buttonInner.appendChild( buttonIcon ); - } +})( jQuery ); - while ( e.firstChild ) { - buttonText.appendChild( e.firstChild ); - } +( function( $, undefined ) { - e.appendChild( buttonInner ); +$.fn.buttonMarkup = function( options ) { + var $workingSet = this; - // TODO obviously it would be nice to pull this element out instead of - // retrieving it from the DOM again, but this change is much less obtrusive - // and 1.0 draws nigh - $.data( e, 'textWrapper', $( buttonText ) ); - } + // Enforce options to be of type string + options = ( options && ( $.type( options ) == "object" ) )? options : {}; + for ( var i = 0; i < $workingSet.length; i++ ) { + var el = $workingSet.eq( i ), + e = el[ 0 ], + o = $.extend( {}, $.fn.buttonMarkup.defaults, { + icon: options.icon !== undefined ? options.icon : el.jqmData( "icon" ), + iconpos: options.iconpos !== undefined ? options.iconpos : el.jqmData( "iconpos" ), + theme: options.theme !== undefined ? options.theme : el.jqmData( "theme" ) || $.mobile.getInheritedTheme( el, "c" ), + inline: options.inline !== undefined ? options.inline : el.jqmData( "inline" ), + shadow: options.shadow !== undefined ? options.shadow : el.jqmData( "shadow" ), + corners: options.corners !== undefined ? options.corners : el.jqmData( "corners" ), + iconshadow: options.iconshadow !== undefined ? options.iconshadow : el.jqmData( "iconshadow" ), + mini: options.mini !== undefined ? options.mini : el.jqmData( "mini" ) + }, options ), + + // Classes Defined + innerClass = "ui-btn-inner", + textClass = "ui-btn-text", + buttonClass, iconClass, + // Button inner markup + buttonInner, + buttonText, + buttonIcon, + buttonElements; + + $.each(o, function(key, value) { + e.setAttribute( "data-" + $.mobile.ns + key, value ); + el.jqmData(key, value); + }); + + // Check if this element is already enhanced + buttonElements = $.data(((e.tagName === "INPUT" || e.tagName === "BUTTON") ? e.parentNode : e), "buttonElements"); + + if (buttonElements) { + e = buttonElements.outer; + el = $(e); + buttonInner = buttonElements.inner; + buttonText = buttonElements.text; + // We will recreate this icon below + $(buttonElements.icon).remove(); + buttonElements.icon = null; + } + else { + buttonInner = document.createElement( o.wrapperEls ); + buttonText = document.createElement( o.wrapperEls ); + } + buttonIcon = o.icon ? document.createElement( "span" ) : null; + + if ( attachEvents && !buttonElements) { + attachEvents(); + } + + // if not, try to find closest theme container + if ( !o.theme ) { + o.theme = $.mobile.getInheritedTheme( el, "c" ); + } + + buttonClass = "ui-btn ui-btn-up-" + o.theme; + buttonClass += o.inline ? " ui-btn-inline" : ""; + buttonClass += o.shadow ? " ui-shadow" : ""; + buttonClass += o.corners ? " ui-btn-corner-all" : ""; + + if ( o.mini !== undefined ) { + // Used to control styling in headers/footers, where buttons default to `mini` style. + buttonClass += o.mini ? " ui-mini" : " ui-fullsize"; + } + + if ( o.inline !== undefined ) { + // Used to control styling in headers/footers, where buttons default to `mini` style. + buttonClass += o.inline === false ? " ui-btn-block" : " ui-btn-inline"; + } + + + if ( o.icon ) { + o.icon = "ui-icon-" + o.icon; + o.iconpos = o.iconpos || "left"; + + iconClass = "ui-icon " + o.icon; + + if ( o.iconshadow ) { + iconClass += " ui-icon-shadow"; + } + } + + if ( o.iconpos ) { + buttonClass += " ui-btn-icon-" + o.iconpos; + + if ( o.iconpos == "notext" && !el.attr( "title" ) ) { + el.attr( "title", el.getEncodedText() ); + } + } + + innerClass += o.corners ? " ui-btn-corner-all" : ""; + + if ( o.iconpos && o.iconpos === "notext" && !el.attr( "title" ) ) { + el.attr( "title", el.getEncodedText() ); + } + + if ( buttonElements ) { + el.removeClass( buttonElements.bcls || "" ); + } + el.removeClass( "ui-link" ).addClass( buttonClass ); + + buttonInner.className = innerClass; + + buttonText.className = textClass; + if ( !buttonElements ) { + buttonInner.appendChild( buttonText ); + } + if ( buttonIcon ) { + buttonIcon.className = iconClass; + if ( !(buttonElements && buttonElements.icon) ) { + buttonIcon.appendChild( document.createTextNode("\u00a0") ); + buttonInner.appendChild( buttonIcon ); + } + } + + while ( e.firstChild && !buttonElements) { + buttonText.appendChild( e.firstChild ); + } + + if ( !buttonElements ) { + e.appendChild( buttonInner ); + } + + // Assign a structure containing the elements of this button to the elements of this button. This + // will allow us to recognize this as an already-enhanced button in future calls to buttonMarkup(). + buttonElements = { + bcls : buttonClass, + outer : e, + inner : buttonInner, + text : buttonText, + icon : buttonIcon + }; + + $.data(e, 'buttonElements', buttonElements); + $.data(buttonInner, 'buttonElements', buttonElements); + $.data(buttonText, 'buttonElements', buttonElements); + if (buttonIcon) { + $.data(buttonIcon, 'buttonElements', buttonElements); + } + } - return this; + return this; }; $.fn.buttonMarkup.defaults = { - corners: true, - shadow: true, - iconshadow: true, - inline: false, - wrapperEls: "span" + corners: true, + shadow: true, + iconshadow: true, + wrapperEls: "span" }; function closestEnabledButton( element ) { var cname; while ( element ) { - // Note that we check for typeof className below because the element we - // handed could be in an SVG DOM where className on SVG elements is defined to - // be of a different type (SVGAnimatedString). We only operate on HTML DOM - // elements, so we look for plain "string". + // Note that we check for typeof className below because the element we + // handed could be in an SVG DOM where className on SVG elements is defined to + // be of a different type (SVGAnimatedString). We only operate on HTML DOM + // elements, so we look for plain "string". cname = ( typeof element.className === 'string' ) && (element.className + ' '); if ( cname && cname.indexOf("ui-btn ") > -1 && cname.indexOf("ui-disabled ") < 0 ) { break; @@ -6357,719 +4371,3181 @@ } var attachEvents = function() { - $( document ).bind( { - "vmousedown": function( event ) { - var btn = closestEnabledButton( event.target ), - $btn, theme; - - if ( btn ) { - $btn = $( btn ); - theme = $btn.attr( "data-" + $.mobile.ns + "theme" ); - $btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme ); - } - }, - "vmousecancel vmouseup": function( event ) { - var btn = closestEnabledButton( event.target ), - $btn, theme; - - if ( btn ) { - $btn = $( btn ); - theme = $btn.attr( "data-" + $.mobile.ns + "theme" ); - $btn.removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme ); - } - }, - "vmouseover focus": function( event ) { - var btn = closestEnabledButton( event.target ), - $btn, theme; - - if ( btn ) { - $btn = $( btn ); - theme = $btn.attr( "data-" + $.mobile.ns + "theme" ); - $btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme ); - } - }, - "vmouseout blur": function( event ) { - var btn = closestEnabledButton( event.target ), - $btn, theme; - - if ( btn ) { - $btn = $( btn ); - theme = $btn.attr( "data-" + $.mobile.ns + "theme" ); - $btn.removeClass( "ui-btn-hover-" + theme + " ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme ); - } - } - }); + var hoverDelay = $.mobile.buttonMarkup.hoverDelay, hov, foc; - attachEvents = null; + $( document ).bind( { + "vmousedown vmousecancel vmouseup vmouseover vmouseout focus blur scrollstart": function( event ) { + var theme, + $btn = $( closestEnabledButton( event.target ) ), + evt = event.type; + + if ( $btn.length ) { + theme = $btn.attr( "data-" + $.mobile.ns + "theme" ); + + if ( evt === "vmousedown" ) { + if ( $.support.touch ) { + hov = setTimeout(function() { + $btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme ); + }, hoverDelay ); + } else { + $btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-down-" + theme ); + } + } else if ( evt === "vmousecancel" || evt === "vmouseup" ) { + $btn.removeClass( "ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme ); + } else if ( evt === "vmouseover" || evt === "focus" ) { + if ( $.support.touch ) { + foc = setTimeout(function() { + $btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme ); + }, hoverDelay ); + } else { + $btn.removeClass( "ui-btn-up-" + theme ).addClass( "ui-btn-hover-" + theme ); + } + } else if ( evt === "vmouseout" || evt === "blur" || evt === "scrollstart" ) { + $btn.removeClass( "ui-btn-hover-" + theme + " ui-btn-down-" + theme ).addClass( "ui-btn-up-" + theme ); + if ( hov ) { + clearTimeout( hov ); + } + if ( foc ) { + clearTimeout( foc ); + } + } + } + }, + "focusin focus": function( event ){ + $( closestEnabledButton( event.target ) ).addClass( $.mobile.focusClass ); + }, + "focusout blur": function( event ){ + $( closestEnabledButton( event.target ) ).removeClass( $.mobile.focusClass ); + } + }); + + attachEvents = null; }; //links in bars, or those with data-role become buttons //auto self-init widgets $( document ).bind( "pagecreate create", function( e ){ - $( ":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a", e.target ) - .not( ".ui-btn, :jqmData(role='none'), :jqmData(role='nojs')" ) - .buttonMarkup(); + $( ":jqmData(role='button'), .ui-bar > a, .ui-header > a, .ui-footer > a, .ui-bar > :jqmData(role='controlgroup') > a", e.target ) + .not( ".ui-btn, :jqmData(role='none'), :jqmData(role='nojs')" ) + .buttonMarkup(); }); })( jQuery ); -/* -* "controlgroup" plugin - corner-rounding for groups of buttons, checks, radios, etc -*/ -(function( $, undefined ) { -$.fn.controlgroup = function( options ) { +(function( $, undefined ) { - return this.each(function() { +$.mobile.page.prototype.options.backBtnText = "Back"; +$.mobile.page.prototype.options.addBackBtn = false; +$.mobile.page.prototype.options.backBtnTheme = null; +$.mobile.page.prototype.options.headerTheme = "a"; +$.mobile.page.prototype.options.footerTheme = "a"; +$.mobile.page.prototype.options.contentTheme = null; - var $el = $( this ), - o = $.extend({ - direction: $el.jqmData( "type" ) || "vertical", - shadow: false, - excludeInvisible: true - }, options ), - groupheading = $el.children( "legend" ), - flCorners = o.direction == "horizontal" ? [ "ui-corner-left", "ui-corner-right" ] : [ "ui-corner-top", "ui-corner-bottom" ], - type = $el.find( "input" ).first().attr( "type" ); - - // Replace legend with more stylable replacement div - if ( groupheading.length ) { - $el.wrapInner( "
    " ); - $( "
    " + groupheading.html() + "
    " ).insertBefore( $el.children(0) ); - groupheading.remove(); - } +$( document ).delegate( ":jqmData(role='page'), :jqmData(role='dialog')", "pagecreate", function( e ) { - $el.addClass( "ui-corner-all ui-controlgroup ui-controlgroup-" + o.direction ); + var $page = $( this ), + o = $page.data( "page" ).options, + pageRole = $page.jqmData( "role" ), + pageTheme = o.theme; + + $( ":jqmData(role='header'), :jqmData(role='footer'), :jqmData(role='content')", this ) + .jqmEnhanceable() + .each(function() { + + var $this = $( this ), + role = $this.jqmData( "role" ), + theme = $this.jqmData( "theme" ), + contentTheme = theme || o.contentTheme || ( pageRole === "dialog" && pageTheme ), + $headeranchors, + leftbtn, + rightbtn, + backBtn; + + $this.addClass( "ui-" + role ); + + //apply theming and markup modifications to page,header,content,footer + if ( role === "header" || role === "footer" ) { + + var thisTheme = theme || ( role === "header" ? o.headerTheme : o.footerTheme ) || pageTheme; + + $this + //add theme class + .addClass( "ui-bar-" + thisTheme ) + // Add ARIA role + .attr( "role", role === "header" ? "banner" : "contentinfo" ); + + if( role === "header") { + // Right,left buttons + $headeranchors = $this.children( "a" ); + leftbtn = $headeranchors.hasClass( "ui-btn-left" ); + rightbtn = $headeranchors.hasClass( "ui-btn-right" ); + + leftbtn = leftbtn || $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length; + + rightbtn = rightbtn || $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length; + } + + // Auto-add back btn on pages beyond first view + if ( o.addBackBtn && + role === "header" && + $( ".ui-page" ).length > 1 && + $page.jqmData( "url" ) !== $.mobile.path.stripHash( location.hash ) && + !leftbtn ) { + + backBtn = $( ""+ o.backBtnText +"" ) + // If theme is provided, override default inheritance + .attr( "data-"+ $.mobile.ns +"theme", o.backBtnTheme || thisTheme ) + .prependTo( $this ); + } + + // Page title + $this.children( "h1, h2, h3, h4, h5, h6" ) + .addClass( "ui-title" ) + // Regardless of h element number in src, it becomes h1 for the enhanced page + .attr({ + "role": "heading", + "aria-level": "1" + }); + + } else if ( role === "content" ) { + if ( contentTheme ) { + $this.addClass( "ui-body-" + ( contentTheme ) ); + } + + // Add ARIA role + $this.attr( "role", "main" ); + } + }); +}); - // TODO: This should be moved out to the closure - // otherwise it is redefined each time controlgroup() is called - function flipClasses( els ) { - els.removeClass( "ui-btn-corner-all ui-shadow" ) - .eq( 0 ).addClass( flCorners[ 0 ] ) - .end() - .last().addClass( flCorners[ 1 ] ).addClass( "ui-controlgroup-last" ); - } +})( jQuery ); - flipClasses( $el.find( ".ui-btn" + ( o.excludeInvisible ? ":visible" : "" ) ) ); - flipClasses( $el.find( ".ui-btn-inner" ) ); +(function( $, undefined ) { - if ( o.shadow ) { - $el.addClass( "ui-shadow" ); - } - }); -}; +$.widget( "mobile.collapsible", $.mobile.widget, { + options: { + expandCueText: " click to expand contents", + collapseCueText: " click to collapse contents", + collapsed: true, + heading: "h1,h2,h3,h4,h5,h6,legend", + theme: null, + contentTheme: null, + iconTheme: "d", + mini: false, + initSelector: ":jqmData(role='collapsible')" + }, + _create: function() { + + var $el = this.element, + o = this.options, + collapsible = $el.addClass( "ui-collapsible" ), + collapsibleHeading = $el.children( o.heading ).first(), + collapsibleContent = collapsible.wrapInner( "
    " ).find( ".ui-collapsible-content" ), + collapsibleSet = $el.closest( ":jqmData(role='collapsible-set')" ).addClass( "ui-collapsible-set" ); + + // Replace collapsibleHeading if it's a legend + if ( collapsibleHeading.is( "legend" ) ) { + collapsibleHeading = $( "
    "+ collapsibleHeading.html() +"
    " ).insertBefore( collapsibleHeading ); + collapsibleHeading.next().remove(); + } + + // If we are in a collapsible set + if ( collapsibleSet.length ) { + // Inherit the theme from collapsible-set + if ( !o.theme ) { + o.theme = collapsibleSet.jqmData("theme") || $.mobile.getInheritedTheme( collapsibleSet, "c" ); + } + // Inherit the content-theme from collapsible-set + if ( !o.contentTheme ) { + o.contentTheme = collapsibleSet.jqmData( "content-theme" ); + } + + // Gets the preference icon position in the set + if ( !o.iconPos ) { + o.iconPos = collapsibleSet.jqmData( "iconpos" ); + } + + if( !o.mini ) { + o.mini = collapsibleSet.jqmData( "mini" ); + } + } + collapsibleContent.addClass( ( o.contentTheme ) ? ( "ui-body-" + o.contentTheme ) : ""); + + collapsibleHeading + //drop heading in before content + .insertBefore( collapsibleContent ) + //modify markup & attributes + .addClass( "ui-collapsible-heading" ) + .append( "" ) + .wrapInner( "" ) + .find( "a" ) + .first() + .buttonMarkup({ + shadow: false, + corners: false, + iconpos: $el.jqmData( "iconpos" ) || o.iconPos || "left", + icon: "plus", + mini: o.mini, + theme: o.theme + }) + .add( ".ui-btn-inner", $el ) + .addClass( "ui-corner-top ui-corner-bottom" ); + + //events + collapsible + .bind( "expand collapse", function( event ) { + if ( !event.isDefaultPrevented() ) { + + event.preventDefault(); + + var $this = $( this ), + isCollapse = ( event.type === "collapse" ), + contentTheme = o.contentTheme; + + collapsibleHeading + .toggleClass( "ui-collapsible-heading-collapsed", isCollapse) + .find( ".ui-collapsible-heading-status" ) + .text( isCollapse ? o.expandCueText : o.collapseCueText ) + .end() + .find( ".ui-icon" ) + .toggleClass( "ui-icon-minus", !isCollapse ) + .toggleClass( "ui-icon-plus", isCollapse ); + + $this.toggleClass( "ui-collapsible-collapsed", isCollapse ); + collapsibleContent.toggleClass( "ui-collapsible-content-collapsed", isCollapse ).attr( "aria-hidden", isCollapse ); + + if ( contentTheme && ( !collapsibleSet.length || collapsible.jqmData( "collapsible-last" ) ) ) { + collapsibleHeading + .find( "a" ).first().add( collapsibleHeading.find( ".ui-btn-inner" ) ) + .toggleClass( "ui-corner-bottom", isCollapse ); + collapsibleContent.toggleClass( "ui-corner-bottom", !isCollapse ); + } + collapsibleContent.trigger( "updatelayout" ); + } + }) + .trigger( o.collapsed ? "collapse" : "expand" ); + + collapsibleHeading + .bind( "click", function( event ) { + + var type = collapsibleHeading.is( ".ui-collapsible-heading-collapsed" ) ? + "expand" : "collapse"; + + collapsible.trigger( type ); + + event.preventDefault(); + }); + } +}); //auto self-init widgets $( document ).bind( "pagecreate create", function( e ){ - $( ":jqmData(role='controlgroup')", e.target ).controlgroup({ excludeInvisible: false }); + $.mobile.collapsible.prototype.enhanceWithin( e.target ); }); -})(jQuery);/* -* "links" plugin - simple class additions for links -*/ +})( jQuery ); (function( $, undefined ) { -$( document ).bind( "pagecreate create", function( e ){ - - //links within content areas - $( e.target ) - .find( "a" ) - .not( ".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')" ) - .addClass( "ui-link" ); +$.widget( "mobile.collapsibleset", $.mobile.widget, { + options: { + initSelector: ":jqmData(role='collapsible-set')" + }, + _create: function() { + var $el = this.element.addClass( "ui-collapsible-set" ), + o = this.options; + + // Inherit the theme from collapsible-set + if ( !o.theme ) { + o.theme = $.mobile.getInheritedTheme( $el, "c" ); + } + // Inherit the content-theme from collapsible-set + if ( !o.contentTheme ) { + o.contentTheme = $el.jqmData( "content-theme" ); + } + + if ( !o.corners ) { + o.corners = $el.jqmData( "corners" ) === undefined ? true : false; + } + + // Initialize the collapsible set if it's not already initialized + if ( !$el.jqmData( "collapsiblebound" ) ) { + $el + .jqmData( "collapsiblebound", true ) + .bind( "expand collapse", function( event ) { + var isCollapse = ( event.type === "collapse" ), + collapsible = $( event.target ).closest( ".ui-collapsible" ), + widget = collapsible.data( "collapsible" ), + contentTheme = widget.options.contentTheme; + if ( contentTheme && collapsible.jqmData( "collapsible-last" ) ) { + collapsible.find( widget.options.heading ).first() + .find( "a" ).first() + .add( ".ui-btn-inner" ) + .toggleClass( "ui-corner-bottom", isCollapse ); + collapsible.find( ".ui-collapsible-content" ).toggleClass( "ui-corner-bottom", !isCollapse ); + } + }) + .bind( "expand", function( event ) { + $( event.target ) + .closest( ".ui-collapsible" ) + .siblings( ".ui-collapsible" ) + .trigger( "collapse" ); + }); + } + }, + + _init: function() { + this.refresh(); + }, + + refresh: function() { + var $el = this.element, + o = this.options, + collapsiblesInSet = $el.children( ":jqmData(role='collapsible')" ); + + $.mobile.collapsible.prototype.enhance( collapsiblesInSet.not( ".ui-collapsible" ) ); + + // clean up borders + collapsiblesInSet.each( function() { + $( this ).find( $.mobile.collapsible.prototype.options.heading ) + .find( "a" ).first() + .add( ".ui-btn-inner" ) + .removeClass( "ui-corner-top ui-corner-bottom" ); + }); + + collapsiblesInSet.first() + .find( "a" ) + .first() + .addClass( o.corners ? "ui-corner-top" : "" ) + .find( ".ui-btn-inner" ) + .addClass( "ui-corner-top" ); + + collapsiblesInSet.last() + .jqmData( "collapsible-last", true ) + .find( "a" ) + .first() + .addClass( o.corners ? "ui-corner-bottom" : "" ) + .find( ".ui-btn-inner" ) + .addClass( "ui-corner-bottom" ); + } +}); +//auto self-init widgets +$( document ).bind( "pagecreate create", function( e ){ + $.mobile.collapsibleset.prototype.enhanceWithin( e.target ); }); -})( jQuery );/* -* "fixHeaderFooter" plugin - on-demand positioning for headers,footers -*/ +})( jQuery ); (function( $, undefined ) { -var slideDownClass = "ui-header-fixed ui-fixed-inline fade", - slideUpClass = "ui-footer-fixed ui-fixed-inline fade", - - slideDownSelector = ".ui-header:jqmData(position='fixed')", - slideUpSelector = ".ui-footer:jqmData(position='fixed')"; - -$.fn.fixHeaderFooter = function( options ) { - - if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) { - return this; - } - - return this.each(function() { - var $this = $( this ); - - if ( $this.jqmData( "fullscreen" ) ) { - $this.addClass( "ui-page-fullscreen" ); - } +$.widget( "mobile.navbar", $.mobile.widget, { + options: { + iconpos: "top", + grid: null, + initSelector: ":jqmData(role='navbar')" + }, + + _create: function(){ + + var $navbar = this.element, + $navbtns = $navbar.find( "a" ), + iconpos = $navbtns.filter( ":jqmData(icon)" ).length ? + this.options.iconpos : undefined; + + $navbar.addClass( "ui-navbar" ) + .attr( "role","navigation" ) + .find( "ul" ) + .jqmEnhanceable() + .grid({ grid: this.options.grid }); + + if ( !iconpos ) { + $navbar.addClass( "ui-navbar-noicons" ); + } + + $navbtns.buttonMarkup({ + corners: false, + shadow: false, + inline: true, + iconpos: iconpos + }); + + $navbar.delegate( "a", "vclick", function( event ) { + if( !$(event.target).hasClass("ui-disabled") ) { + $navbtns.removeClass( $.mobile.activeBtnClass ); + $( this ).addClass( $.mobile.activeBtnClass ); + } + }); + + // Buttons in the navbar with ui-state-persist class should regain their active state before page show + $navbar.closest( ".ui-page" ).bind( "pagebeforeshow", function() { + $navbtns.filter( ".ui-state-persist" ).addClass( $.mobile.activeBtnClass ); + }); + } +}); - // Should be slidedown - $this.find( slideDownSelector ).addClass( slideDownClass ); +//auto self-init widgets +$( document ).bind( "pagecreate create", function( e ){ + $.mobile.navbar.prototype.enhanceWithin( e.target ); +}); - // Should be slideup - $this.find( slideUpSelector ).addClass( slideUpClass ); - }); -}; +})( jQuery ); -// single controller for all showing,hiding,toggling -$.mobile.fixedToolbars = (function() { +(function( $, undefined ) { - if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) { - return; - } +//Keeps track of the number of lists per page UID +//This allows support for multiple nested list in the same page +//https://github.com/jquery/jquery-mobile/issues/1617 +var listCountPerPage = {}; - var stickyFooter, delayTimer, - currentstate = "inline", - autoHideMode = false, - showDelay = 100, - ignoreTargets = "a,input,textarea,select,button,label,.ui-header-fixed,.ui-footer-fixed", - toolbarSelector = ".ui-header-fixed:first, .ui-footer-fixed:not(.ui-footer-duplicate):last", - // for storing quick references to duplicate footers - supportTouch = $.support.touch, - touchStartEvent = supportTouch ? "touchstart" : "mousedown", - touchStopEvent = supportTouch ? "touchend" : "mouseup", - stateBefore = null, - scrollTriggered = false, - touchToggleEnabled = true; - - function showEventCallback( event ) { - // An event that affects the dimensions of the visual viewport has - // been triggered. If the header and/or footer for the current page are in overlay - // mode, we want to hide them, and then fire off a timer to show them at a later - // point. Events like a resize can be triggered continuously during a scroll, on - // some platforms, so the timer is used to delay the actual positioning until the - // flood of events have subsided. - // - // If we are in autoHideMode, we don't do anything because we know the scroll - // callbacks for the plugin will fire off a show when the scrolling has stopped. - if ( !autoHideMode && currentstate === "overlay" ) { - if ( !delayTimer ) { - $.mobile.fixedToolbars.hide( true ); - } +$.widget( "mobile.listview", $.mobile.widget, { - $.mobile.fixedToolbars.startShowTimer(); - } - } + options: { + theme: null, + countTheme: "c", + headerTheme: "b", + dividerTheme: "b", + splitIcon: "arrow-r", + splitTheme: "b", + mini: false, + inset: false, + initSelector: ":jqmData(role='listview')" + }, + + _create: function() { + var t = this, + listviewClasses = ""; + + listviewClasses += t.options.inset ? " ui-listview-inset ui-corner-all ui-shadow " : ""; + listviewClasses += t.element.jqmData( "mini" ) || t.options.mini === true ? " ui-mini" : ""; + + // create listview markup + t.element.addClass(function( i, orig ) { + return orig + " ui-listview " + listviewClasses; + }); + + t.refresh( true ); + }, + + _removeCorners: function( li, which ) { + var top = "ui-corner-top ui-corner-tr ui-corner-tl", + bot = "ui-corner-bottom ui-corner-br ui-corner-bl"; + + li = li.add( li.find( ".ui-btn-inner, .ui-li-link-alt, .ui-li-thumb" ) ); + + if ( which === "top" ) { + li.removeClass( top ); + } else if ( which === "bottom" ) { + li.removeClass( bot ); + } else { + li.removeClass( top + " " + bot ); + } + }, + + _refreshCorners: function( create ) { + var $li, + $visibleli, + $topli, + $bottomli; + + if ( this.options.inset ) { + $li = this.element.children( "li" ); + // at create time the li are not visible yet so we need to rely on .ui-screen-hidden + $visibleli = create?$li.not( ".ui-screen-hidden" ):$li.filter( ":visible" ); + + this._removeCorners( $li ); + + // Select the first visible li element + $topli = $visibleli.first() + .addClass( "ui-corner-top" ); - $(function() { - var $document = $( document ), - $window = $( window ); - - $document - .bind( "vmousedown", function( event ) { - if ( touchToggleEnabled ) { - stateBefore = currentstate; - } - }) - .bind( "vclick", function( event ) { - if ( touchToggleEnabled ) { + $topli.add( $topli.find( ".ui-btn-inner" ) + .not( ".ui-li-link-alt span:first-child" ) ) + .addClass( "ui-corner-top" ) + .end() + .find( ".ui-li-link-alt, .ui-li-link-alt span:first-child" ) + .addClass( "ui-corner-tr" ) + .end() + .find( ".ui-li-thumb" ) + .not(".ui-li-icon") + .addClass( "ui-corner-tl" ); + + // Select the last visible li element + $bottomli = $visibleli.last() + .addClass( "ui-corner-bottom" ); + + $bottomli.add( $bottomli.find( ".ui-btn-inner" ) ) + .find( ".ui-li-link-alt" ) + .addClass( "ui-corner-br" ) + .end() + .find( ".ui-li-thumb" ) + .not(".ui-li-icon") + .addClass( "ui-corner-bl" ); + } + if ( !create ) { + this.element.trigger( "updatelayout" ); + } + }, + + // This is a generic utility method for finding the first + // node with a given nodeName. It uses basic DOM traversal + // to be fast and is meant to be a substitute for simple + // $.fn.closest() and $.fn.children() calls on a single + // element. Note that callers must pass both the lowerCase + // and upperCase version of the nodeName they are looking for. + // The main reason for this is that this function will be + // called many times and we want to avoid having to lowercase + // the nodeName from the element every time to ensure we have + // a match. Note that this function lives here for now, but may + // be moved into $.mobile if other components need a similar method. + _findFirstElementByTagName: function( ele, nextProp, lcName, ucName ) + { + var dict = {}; + dict[ lcName ] = dict[ ucName ] = true; + while ( ele ) { + if ( dict[ ele.nodeName ] ) { + return ele; + } + ele = ele[ nextProp ]; + } + return null; + }, + _getChildrenByTagName: function( ele, lcName, ucName ) + { + var results = [], + dict = {}; + dict[ lcName ] = dict[ ucName ] = true; + ele = ele.firstChild; + while ( ele ) { + if ( dict[ ele.nodeName ] ) { + results.push( ele ); + } + ele = ele.nextSibling; + } + return $( results ); + }, + + _addThumbClasses: function( containers ) + { + var i, img, len = containers.length; + for ( i = 0; i < len; i++ ) { + img = $( this._findFirstElementByTagName( containers[ i ].firstChild, "nextSibling", "img", "IMG" ) ); + if ( img.length ) { + img.addClass( "ui-li-thumb" ); + $( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.is( ".ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" ); + } + } + }, + + refresh: function( create ) { + this.parentPage = this.element.closest( ".ui-page" ); + this._createSubPages(); + + var o = this.options, + $list = this.element, + self = this, + dividertheme = $list.jqmData( "dividertheme" ) || o.dividerTheme, + listsplittheme = $list.jqmData( "splittheme" ), + listspliticon = $list.jqmData( "spliticon" ), + li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" ), + counter = $.support.cssPseudoElement || !$.nodeName( $list[ 0 ], "ol" ) ? 0 : 1, + itemClassDict = {}, + item, itemClass, itemTheme, + a, last, splittheme, countParent, icon, imgParents, img, linkIcon; + + if ( counter ) { + $list.find( ".ui-li-dec" ).remove(); + } + + if ( !o.theme ) { + o.theme = $.mobile.getInheritedTheme( this.element, "c" ); + } + + for ( var pos = 0, numli = li.length; pos < numli; pos++ ) { + item = li.eq( pos ); + itemClass = "ui-li"; + + // If we're creating the element, we update it regardless + if ( create || !item.hasClass( "ui-li" ) ) { + itemTheme = item.jqmData("theme") || o.theme; + a = this._getChildrenByTagName( item[ 0 ], "a", "A" ); + + if ( a.length ) { + icon = item.jqmData("icon"); + + item.buttonMarkup({ + wrapperEls: "div", + shadow: false, + corners: false, + iconpos: "right", + icon: a.length > 1 || icon === false ? false : icon || "arrow-r", + theme: itemTheme + }); + + if ( ( icon != false ) && ( a.length == 1 ) ) { + item.addClass( "ui-li-has-arrow" ); + } + + a.first().removeClass( "ui-link" ).addClass( "ui-link-inherit" ); + + if ( a.length > 1 ) { + itemClass += " ui-li-has-alt"; + + last = a.last(); + splittheme = listsplittheme || last.jqmData( "theme" ) || o.splitTheme; + linkIcon = last.jqmData("icon"); + + last.appendTo(item) + .attr( "title", last.getEncodedText() ) + .addClass( "ui-li-link-alt" ) + .empty() + .buttonMarkup({ + shadow: false, + corners: false, + theme: itemTheme, + icon: false, + iconpos: false + }) + .find( ".ui-btn-inner" ) + .append( + $( document.createElement( "span" ) ).buttonMarkup({ + shadow: true, + corners: true, + theme: splittheme, + iconpos: "notext", + // link icon overrides list item icon overrides ul element overrides options + icon: linkIcon || icon || listspliticon || o.splitIcon + }) + ); + } + } else if ( item.jqmData( "role" ) === "list-divider" ) { + + itemClass += " ui-li-divider ui-bar-" + dividertheme; + item.attr( "role", "heading" ); + + //reset counter when a divider heading is encountered + if ( counter ) { + counter = 1; + } + + } else { + itemClass += " ui-li-static ui-body-" + itemTheme; + } + } + + if ( counter && itemClass.indexOf( "ui-li-divider" ) < 0 ) { + countParent = item.is( ".ui-li-static:first" ) ? item : item.find( ".ui-link-inherit" ); + + countParent.addClass( "ui-li-jsnumbering" ) + .prepend( "" + (counter++) + ". " ); + } + + // Instead of setting item class directly on the list item and its + // btn-inner at this point in time, push the item into a dictionary + // that tells us what class to set on it so we can do this after this + // processing loop is finished. + + if ( !itemClassDict[ itemClass ] ) { + itemClassDict[ itemClass ] = []; + } + + itemClassDict[ itemClass ].push( item[ 0 ] ); + } + + // Set the appropriate listview item classes on each list item + // and their btn-inner elements. The main reason we didn't do this + // in the for-loop above is because we can eliminate per-item function overhead + // by calling addClass() and children() once or twice afterwards. This + // can give us a significant boost on platforms like WP7.5. + + for ( itemClass in itemClassDict ) { + $( itemClassDict[ itemClass ] ).addClass( itemClass ).children( ".ui-btn-inner" ).addClass( itemClass ); + } + + $list.find( "h1, h2, h3, h4, h5, h6" ).addClass( "ui-li-heading" ) + .end() + + .find( "p, dl" ).addClass( "ui-li-desc" ) + .end() + + .find( ".ui-li-aside" ).each(function() { + var $this = $(this); + $this.prependTo( $this.parent() ); //shift aside to front for css float + }) + .end() + + .find( ".ui-li-count" ).each( function() { + $( this ).closest( "li" ).addClass( "ui-li-has-count" ); + }).addClass( "ui-btn-up-" + ( $list.jqmData( "counttheme" ) || this.options.countTheme) + " ui-btn-corner-all" ); + + // The idea here is to look at the first image in the list item + // itself, and any .ui-link-inherit element it may contain, so we + // can place the appropriate classes on the image and list item. + // Note that we used to use something like: + // + // li.find(">img:eq(0), .ui-link-inherit>img:eq(0)").each( ... ); + // + // But executing a find() like that on Windows Phone 7.5 took a + // really long time. Walking things manually with the code below + // allows the 400 listview item page to load in about 3 seconds as + // opposed to 30 seconds. + + this._addThumbClasses( li ); + this._addThumbClasses( $list.find( ".ui-link-inherit" ) ); + + this._refreshCorners( create ); + }, + + //create a string for ID/subpage url creation + _idStringEscape: function( str ) { + return str.replace(/[^a-zA-Z0-9]/g, '-'); + }, + + _createSubPages: function() { + var parentList = this.element, + parentPage = parentList.closest( ".ui-page" ), + parentUrl = parentPage.jqmData( "url" ), + parentId = parentUrl || parentPage[ 0 ][ $.expando ], + parentListId = parentList.attr( "id" ), + o = this.options, + dns = "data-" + $.mobile.ns, + self = this, + persistentFooterID = parentPage.find( ":jqmData(role='footer')" ).jqmData( "id" ), + hasSubPages; + + if ( typeof listCountPerPage[ parentId ] === "undefined" ) { + listCountPerPage[ parentId ] = -1; + } + + parentListId = parentListId || ++listCountPerPage[ parentId ]; + + $( parentList.find( "li>ul, li>ol" ).toArray().reverse() ).each(function( i ) { + var self = this, + list = $( this ), + listId = list.attr( "id" ) || parentListId + "-" + i, + parent = list.parent(), + nodeEls = $( list.prevAll().toArray().reverse() ), + nodeEls = nodeEls.length ? nodeEls : $( "" + $.trim(parent.contents()[ 0 ].nodeValue) + "" ), + title = nodeEls.first().getEncodedText(),//url limits to first 30 chars of text + id = ( parentUrl || "" ) + "&" + $.mobile.subPageUrlKey + "=" + listId, + theme = list.jqmData( "theme" ) || o.theme, + countTheme = list.jqmData( "counttheme" ) || parentList.jqmData( "counttheme" ) || o.countTheme, + newPage, anchor; + + //define hasSubPages for use in later removal + hasSubPages = true; + + newPage = list.detach() + .wrap( "
    " ) + .parent() + .before( "
    " + title + "
    " ) + .after( persistentFooterID ? $( "
    ") : "" ) + .parent() + .appendTo( $.mobile.pageContainer ); + + newPage.page(); + + anchor = parent.find('a:first'); + + if ( !anchor.length ) { + anchor = $( "" ).html( nodeEls || title ).prependTo( parent.empty() ); + } + + anchor.attr( "href", "#" + id ); + + }).listview(); + + // on pagehide, remove any nested pages along with the parent page, as long as they aren't active + // and aren't embedded + if( hasSubPages && + parentPage.is( ":jqmData(external-page='true')" ) && + parentPage.data("page").options.domCache === false ) { + + var newRemove = function( e, ui ){ + var nextPage = ui.nextPage, npURL; + + if( ui.nextPage ){ + npURL = nextPage.jqmData( "url" ); + if( npURL.indexOf( parentUrl + "&" + $.mobile.subPageUrlKey ) !== 0 ){ + self.childPages().remove(); + parentPage.remove(); + } + } + }; + + // unbind the original page remove and replace with our specialized version + parentPage + .unbind( "pagehide.remove" ) + .bind( "pagehide.remove", newRemove); + } + }, + + // TODO sort out a better way to track sub pages of the listview this is brittle + childPages: function(){ + var parentUrl = this.parentPage.jqmData( "url" ); - if ( $(event.target).closest( ignoreTargets ).length ) { - return; - } - - if ( !scrollTriggered ) { - $.mobile.fixedToolbars.toggle( stateBefore ); - stateBefore = null; - } - } - }) - .bind( "silentscroll", showEventCallback ); + return $( ":jqmData(url^='"+ parentUrl + "&" + $.mobile.subPageUrlKey +"')"); + } +}); +//auto self-init widgets +$( document ).bind( "pagecreate create", function( e ){ + $.mobile.listview.prototype.enhanceWithin( e.target ); +}); - // The below checks first for a $(document).scrollTop() value, and if zero, binds scroll events to $(window) instead. - // If the scrollTop value is actually zero, both will return zero anyway. - // - // Works with $(document), not $(window) : Opera Mobile (WinMO phone; kinda broken anyway) - // Works with $(window), not $(document) : IE 7/8 - // Works with either $(window) or $(document) : Chrome, FF 3.6/4, Android 1.6/2.1, iOS - // Needs work either way : BB5, Opera Mobile (iOS) +})( jQuery ); - ( ( $document.scrollTop() === 0 ) ? $window : $document ) - .bind( "scrollstart", function( event ) { +/* +* "checkboxradio" plugin +*/ - scrollTriggered = true; +(function( $, undefined ) { - if ( stateBefore === null ) { - stateBefore = currentstate; - } +$.widget( "mobile.checkboxradio", $.mobile.widget, { + options: { + theme: null, + initSelector: "input[type='checkbox'],input[type='radio']" + }, + _create: function() { + var self = this, + input = this.element, + inheritAttr = function( input, dataAttr ) { + return input.jqmData( dataAttr ) || input.closest( "form,fieldset" ).jqmData( dataAttr ) + }, + // NOTE: Windows Phone could not find the label through a selector + // filter works though. + parentLabel = $( input ).closest( "label" ), + label = parentLabel.length ? parentLabel : $( input ).closest( "form,fieldset,:jqmData(role='page'),:jqmData(role='dialog')" ).find( "label" ).filter( "[for='" + input[0].id + "']" ), + inputtype = input[0].type, + mini = inheritAttr( input, "mini" ), + checkedState = inputtype + "-on", + uncheckedState = inputtype + "-off", + icon = input.parents( ":jqmData(type='horizontal')" ).length ? undefined : uncheckedState, + iconpos = inheritAttr( input, "iconpos" ), + activeBtn = icon ? "" : " " + $.mobile.activeBtnClass, + checkedClass = "ui-" + checkedState + activeBtn, + uncheckedClass = "ui-" + uncheckedState, + checkedicon = "ui-icon-" + checkedState, + uncheckedicon = "ui-icon-" + uncheckedState; + + if ( inputtype !== "checkbox" && inputtype !== "radio" ) { + return; + } + + // Expose for other methods + $.extend( this, { + label: label, + inputtype: inputtype, + checkedClass: checkedClass, + uncheckedClass: uncheckedClass, + checkedicon: checkedicon, + uncheckedicon: uncheckedicon + }); + + // If there's no selected theme check the data attr + if( !this.options.theme ) { + this.options.theme = $.mobile.getInheritedTheme( this.element, "c" ); + } + + label.buttonMarkup({ + theme: this.options.theme, + icon: icon, + shadow: false, + mini: mini, + iconpos: iconpos + }); + + // Wrap the input + label in a div + var wrapper = document.createElement('div'); + wrapper.className = 'ui-' + inputtype; + + input.add( label ).wrapAll( wrapper ); + + label.bind({ + vmouseover: function( event ) { + if ( $( this ).parent().is( ".ui-disabled" ) ) { + event.stopPropagation(); + } + }, + + vclick: function( event ) { + if ( input.is( ":disabled" ) ) { + event.preventDefault(); + return; + } + + self._cacheVals(); + + input.prop( "checked", inputtype === "radio" && true || !input.prop( "checked" ) ); + + // trigger click handler's bound directly to the input as a substitute for + // how label clicks behave normally in the browsers + // TODO: it would be nice to let the browser's handle the clicks and pass them + // through to the associate input. we can swallow that click at the parent + // wrapper element level + input.triggerHandler( 'click' ); + + // Input set for common radio buttons will contain all the radio + // buttons, but will not for checkboxes. clearing the checked status + // of other radios ensures the active button state is applied properly + self._getInputSet().not( input ).prop( "checked", false ); + + self._updateAll(); + return false; + } + }); + + input + .bind({ + vmousedown: function() { + self._cacheVals(); + }, + + vclick: function() { + var $this = $(this); + + // Adds checked attribute to checked input when keyboard is used + if ( $this.is( ":checked" ) ) { + + $this.prop( "checked", true); + self._getInputSet().not($this).prop( "checked", false ); + } else { + + $this.prop( "checked", false ); + } + + self._updateAll(); + }, + + focus: function() { + label.addClass( $.mobile.focusClass ); + }, + + blur: function() { + label.removeClass( $.mobile.focusClass ); + } + }); + + this.refresh(); + }, + + _cacheVals: function() { + this._getInputSet().each(function() { + $(this).jqmData( "cacheVal", this.checked ); + }); + }, + + //returns either a set of radios with the same name attribute, or a single checkbox + _getInputSet: function(){ + if(this.inputtype === "checkbox") { + return this.element; + } + + return this.element.closest( "form,fieldset,:jqmData(role='page')" ) + .find( "input[name='"+ this.element[0].name +"'][type='"+ this.inputtype +"']" ); + }, + + _updateAll: function() { + var self = this; + + this._getInputSet().each(function() { + var $this = $(this); + + if ( this.checked || self.inputtype === "checkbox" ) { + $this.trigger( "change" ); + } + }) + .checkboxradio( "refresh" ); + }, + + refresh: function() { + var input = this.element[0], + label = this.label, + icon = label.find( ".ui-icon" ); + + if ( input.checked ) { + label.addClass( this.checkedClass ).removeClass( this.uncheckedClass ); + icon.addClass( this.checkedicon ).removeClass( this.uncheckedicon ); + } else { + label.removeClass( this.checkedClass ).addClass( this.uncheckedClass ); + icon.removeClass( this.checkedicon ).addClass( this.uncheckedicon ); + } + + if ( input.disabled ) { + this.disable(); + } else { + this.enable(); + } + }, + + disable: function() { + this.element.prop( "disabled", true ).parent().addClass( "ui-disabled" ); + }, + + enable: function() { + this.element.prop( "disabled", false ).parent().removeClass( "ui-disabled" ); + } +}); - // We only enter autoHideMode if the headers/footers are in - // an overlay state or the show timer was started. If the - // show timer is set, clear it so the headers/footers don't - // show up until after we're done scrolling. - var isOverlayState = stateBefore == "overlay"; +//auto self-init widgets +$( document ).bind( "pagecreate create", function( e ){ + $.mobile.checkboxradio.prototype.enhanceWithin( e.target, true ); +}); - autoHideMode = isOverlayState || !!delayTimer; +})( jQuery ); - if ( autoHideMode ) { - $.mobile.fixedToolbars.clearShowTimer(); +(function( $, undefined ) { - if ( isOverlayState ) { - $.mobile.fixedToolbars.hide( true ); - } - } - }) - .bind( "scrollstop", function( event ) { +$.widget( "mobile.button", $.mobile.widget, { + options: { + theme: null, + icon: null, + iconpos: null, + inline: false, + corners: true, + shadow: true, + iconshadow: true, + initSelector: "button, [type='button'], [type='submit'], [type='reset'], [type='image']", + mini: false + }, + _create: function() { + var $el = this.element, + $button, + o = this.options, + type, + name, + classes = "", + $buttonPlaceholder; + + // if this is a link, check if it's been enhanced and, if not, use the right function + if( $el[ 0 ].tagName === "A" ) { + !$el.hasClass( "ui-btn" ) && $el.buttonMarkup(); + return; + } + + // get the inherited theme + // TODO centralize for all widgets + if ( !this.options.theme ) { + this.options.theme = $.mobile.getInheritedTheme( this.element, "c" ); + } + + // TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577 + /* if( $el[0].className.length ) { + classes = $el[0].className; + } */ + if( !!~$el[0].className.indexOf( "ui-btn-left" ) ) { + classes = "ui-btn-left"; + } + + if( !!~$el[0].className.indexOf( "ui-btn-right" ) ) { + classes = "ui-btn-right"; + } + + // Add ARIA role + this.button = $( "
    " ) + .text( $el.text() || $el.val() ) + .insertBefore( $el ) + .buttonMarkup({ + theme: o.theme, + icon: o.icon, + iconpos: o.iconpos, + inline: o.inline, + corners: o.corners, + shadow: o.shadow, + iconshadow: o.iconshadow, + mini: o.mini + }) + .addClass( classes ) + .append( $el.addClass( "ui-btn-hidden" ) ); + + $button = this.button; + type = $el.attr( "type" ); + name = $el.attr( "name" ); + + // Add hidden input during submit if input type="submit" has a name. + if ( type !== "button" && type !== "reset" && name ) { + $el.bind( "vclick", function() { + // Add hidden input if it doesn’t already exist. + if( $buttonPlaceholder === undefined ) { + $buttonPlaceholder = $( "", { + type: "hidden", + name: $el.attr( "name" ), + value: $el.attr( "value" ) + }).insertBefore( $el ); + + // Bind to doc to remove after submit handling + $( document ).one("submit", function(){ + $buttonPlaceholder.remove(); + + // reset the local var so that the hidden input + // will be re-added on subsequent clicks + $buttonPlaceholder = undefined; + }); + } + }); + } + + $el.bind({ + focus: function() { + $button.addClass( $.mobile.focusClass ); + }, - if ( $( event.target ).closest( ignoreTargets ).length ) { - return; - } - - scrollTriggered = false; - - if ( autoHideMode ) { - $.mobile.fixedToolbars.startShowTimer(); - autoHideMode = false; - } - stateBefore = null; - }); - - $window.bind( "resize updatelayout", showEventCallback ); - }); - - // 1. Before page is shown, check for duplicate footer - // 2. After page is shown, append footer to new page - $( document ).delegate( ".ui-page", "pagebeforeshow", function( event, ui ) { - var page = $( event.target ), - footer = page.find( ":jqmData(role='footer')" ), - id = footer.data( "id" ), - prevPage = ui.prevPage, - prevFooter = prevPage && prevPage.find( ":jqmData(role='footer')" ), - prevFooterMatches = prevFooter.length && prevFooter.jqmData( "id" ) === id; - - if ( id && prevFooterMatches ) { - stickyFooter = footer; - setTop( stickyFooter.removeClass( "fade in out" ).appendTo( $.mobile.pageContainer ) ); - } - }) - .delegate( ".ui-page", "pageshow", function( event, ui ) { - var $this = $( this ); - - if ( stickyFooter && stickyFooter.length ) { - setTimeout(function() { - setTop( stickyFooter.appendTo( $this ).addClass( "fade" ) ); - stickyFooter = null; - }, 500); + blur: function() { + $button.removeClass( $.mobile.focusClass ); } - - $.mobile.fixedToolbars.show( true, this ); }); - // When a collapsible is hidden or shown we need to trigger the fixed toolbar to reposition itself (#1635) - $( document ).delegate( ".ui-collapsible-contain", "collapse expand", showEventCallback ); - - // element.getBoundingClientRect() is broken in iOS 3.2.1 on the iPad. The - // coordinates inside of the rect it returns don't have the page scroll position - // factored out of it like the other platforms do. To get around this, - // we'll just calculate the top offset the old fashioned way until core has - // a chance to figure out how to handle this situation. - // - // TODO: We'll need to get rid of getOffsetTop() once a fix gets folded into core. - - function getOffsetTop( ele ) { - var top = 0, - op, body; - - if ( ele ) { - body = document.body; - op = ele.offsetParent; - top = ele.offsetTop; - - while ( ele && ele != body ) { - top += ele.scrollTop || 0; - - if ( ele == op ) { - top += op.offsetTop; - op = ele.offsetParent; - } - - ele = ele.parentNode; - } - } - return top; - } - - function setTop( el ) { - var fromTop = $(window).scrollTop(), - thisTop = getOffsetTop( el[ 0 ] ), // el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead. - thisCSStop = el.css( "top" ) == "auto" ? 0 : parseFloat(el.css( "top" )), - screenHeight = window.innerHeight, - thisHeight = el.outerHeight(), - useRelative = el.parents( ".ui-page:not(.ui-page-fullscreen)" ).length, - relval; - - if ( el.is( ".ui-header-fixed" ) ) { - - relval = fromTop - thisTop + thisCSStop; - - if ( relval < thisTop ) { - relval = 0; - } - - return el.css( "top", useRelative ? relval : fromTop ); - } else { - // relval = -1 * (thisTop - (fromTop + screenHeight) + thisCSStop + thisHeight); - // if ( relval > thisTop ) { relval = 0; } - relval = fromTop + screenHeight - thisHeight - (thisTop - thisCSStop ); - - return el.css( "top", useRelative ? relval : fromTop + screenHeight - thisHeight ); - } - } - - // Exposed methods - return { - - show: function( immediately, page ) { - - $.mobile.fixedToolbars.clearShowTimer(); + this.refresh(); + }, - currentstate = "overlay"; - - var $ap = page ? $( page ) : - ( $.mobile.activePage ? $.mobile.activePage : - $( ".ui-page-active" ) ); - - return $ap.children( toolbarSelector ).each(function() { - - var el = $( this ), - fromTop = $( window ).scrollTop(), - // el.offset().top returns the wrong value on iPad iOS 3.2.1, call our workaround instead. - thisTop = getOffsetTop( el[ 0 ] ), - screenHeight = window.innerHeight, - thisHeight = el.outerHeight(), - alreadyVisible = ( el.is( ".ui-header-fixed" ) && fromTop <= thisTop + thisHeight ) || - ( el.is( ".ui-footer-fixed" ) && thisTop <= fromTop + screenHeight ); - - // Add state class - el.addClass( "ui-fixed-overlay" ).removeClass( "ui-fixed-inline" ); - - if ( !alreadyVisible && !immediately ) { - el.animationComplete(function() { - el.removeClass( "in" ); - }).addClass( "in" ); - } - setTop(el); - }); - }, - - hide: function( immediately ) { - - currentstate = "inline"; + enable: function() { + this.element.attr( "disabled", false ); + this.button.removeClass( "ui-disabled" ).attr( "aria-disabled", false ); + return this._setOption( "disabled", false ); + }, + + disable: function() { + this.element.attr( "disabled", true ); + this.button.addClass( "ui-disabled" ).attr( "aria-disabled", true ); + return this._setOption( "disabled", true ); + }, + + refresh: function() { + var $el = this.element; + + if ( $el.prop("disabled") ) { + this.disable(); + } else { + this.enable(); + } + + // Grab the button's text element from its implementation-independent data item + $( this.button.data( 'buttonElements' ).text ).text( $el.text() || $el.val() ); + } +}); - var $ap = $.mobile.activePage ? $.mobile.activePage : - $( ".ui-page-active" ); +//auto self-init widgets +$( document ).bind( "pagecreate create", function( e ){ + $.mobile.button.prototype.enhanceWithin( e.target, true ); +}); - return $ap.children( toolbarSelector ).each(function() { +})( jQuery ); - var el = $(this), - thisCSStop = el.css( "top" ), - classes; +(function( $, undefined ) { - thisCSStop = thisCSStop == "auto" ? 0 : - parseFloat(thisCSStop); +$.fn.controlgroup = function( options ) { + function flipClasses( els, flCorners ) { + els.removeClass( "ui-btn-corner-all ui-shadow" ) + .eq( 0 ).addClass( flCorners[ 0 ] ) + .end() + .last().addClass( flCorners[ 1 ] ).addClass( "ui-controlgroup-last" ); + } + + return this.each(function() { + var $el = $( this ), + o = $.extend({ + direction: $el.jqmData( "type" ) || "vertical", + shadow: false, + excludeInvisible: true, + mini: $el.jqmData( "mini" ) + }, options ), + groupheading = $el.children( "legend" ), + flCorners = o.direction == "horizontal" ? [ "ui-corner-left", "ui-corner-right" ] : [ "ui-corner-top", "ui-corner-bottom" ], + type = $el.find( "input" ).first().attr( "type" ); + + // Replace legend with more stylable replacement div + if ( groupheading.length ) { + $el.wrapInner( "
    " ); + $( "
    " + groupheading.html() + "
    " ).insertBefore( $el.children(0) ); + groupheading.remove(); + } + + $el.addClass( "ui-corner-all ui-controlgroup ui-controlgroup-" + o.direction ); + + flipClasses( $el.find( ".ui-btn" + ( o.excludeInvisible ? ":visible" : "" ) ).not('.ui-slider-handle'), flCorners ); + flipClasses( $el.find( ".ui-btn-inner" ), flCorners ); + + if ( o.shadow ) { + $el.addClass( "ui-shadow" ); + } + + if ( o.mini ) { + $el.addClass( "ui-mini" ); + } - // Add state class - el.addClass( "ui-fixed-inline" ).removeClass( "ui-fixed-overlay" ); + }); +}; - if ( thisCSStop < 0 || ( el.is( ".ui-header-fixed" ) && thisCSStop !== 0 ) ) { +// The pagecreate handler for controlgroup is in jquery.mobile.init because of the soft-dependency on the wrapped widgets - if ( immediately ) { - el.css( "top", 0); - } else { +})(jQuery); - if ( el.css( "top" ) !== "auto" && parseFloat( el.css( "top" ) ) !== 0 ) { +(function( $, undefined ) { - classes = "out reverse"; +$( document ).bind( "pagecreate create", function( e ){ - el.animationComplete(function() { - el.removeClass( classes ).css( "top", 0 ); - }).addClass( classes ); - } - } - } - }); - }, + //links within content areas, tests included with page + $( e.target ) + .find( "a" ) + .jqmEnhanceable() + .not( ".ui-btn, .ui-link-inherit, :jqmData(role='none'), :jqmData(role='nojs')" ) + .addClass( "ui-link" ); - startShowTimer: function() { +}); - $.mobile.fixedToolbars.clearShowTimer(); +})( jQuery ); - var args = [].slice.call( arguments ); - delayTimer = setTimeout(function() { - delayTimer = undefined; - $.mobile.fixedToolbars.show.apply( null, args ); - }, showDelay); - }, +( function( $ ) { + var meta = $( "meta[name=viewport]" ), + initialContent = meta.attr( "content" ), + disabledZoom = initialContent + ",maximum-scale=1, user-scalable=no", + enabledZoom = initialContent + ",maximum-scale=10, user-scalable=yes", + disabledInitially = /(user-scalable[\s]*=[\s]*no)|(maximum-scale[\s]*=[\s]*1)[$,\s]/.test( initialContent ); + + $.mobile.zoom = $.extend( {}, { + enabled: !disabledInitially, + locked: false, + disable: function( lock ) { + if( !disabledInitially && !$.mobile.zoom.locked ){ + meta.attr( "content", disabledZoom ); + $.mobile.zoom.enabled = false; + $.mobile.zoom.locked = lock || false; + } + }, + enable: function( unlock ) { + if( !disabledInitially && ( !$.mobile.zoom.locked || unlock === true ) ){ + meta.attr( "content", enabledZoom ); + $.mobile.zoom.enabled = true; + $.mobile.zoom.locked = false; + } + }, + restore: function() { + if( !disabledInitially ){ + meta.attr( "content", initialContent ); + $.mobile.zoom.enabled = true; + } + } + }); - clearShowTimer: function() { - if ( delayTimer ) { - clearTimeout( delayTimer ); - } - delayTimer = undefined; - }, +}( jQuery )); - toggle: function( from ) { - if ( from ) { - currentstate = from; - } - return ( currentstate === "overlay" ) ? $.mobile.fixedToolbars.hide() : - $.mobile.fixedToolbars.show(); - }, +(function( $, undefined ) { - setTouchToggleEnabled: function( enabled ) { - touchToggleEnabled = enabled; - } - }; -})(); +$.widget( "mobile.textinput", $.mobile.widget, { + options: { + theme: null, + // This option defaults to true on iOS devices. + preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1, + initSelector: "input[type='text'], input[type='search'], :jqmData(type='search'), input[type='number'], :jqmData(type='number'), input[type='password'], input[type='email'], input[type='url'], input[type='tel'], textarea, input[type='time'], input[type='date'], input[type='month'], input[type='week'], input[type='datetime'], input[type='datetime-local'], input[type='color'], input:not([type])", + clearSearchButtonText: "clear text" + }, + + _create: function() { + + var input = this.element, + o = this.options, + theme = o.theme || $.mobile.getInheritedTheme( this.element, "c" ), + themeclass = " ui-body-" + theme, + mini = input.jqmData("mini") == true, + miniclass = mini ? " ui-mini" : "", + focusedEl, clearbtn; + + $( "label[for='" + input.attr( "id" ) + "']" ).addClass( "ui-input-text" ); + + focusedEl = input.addClass("ui-input-text ui-body-"+ theme ); + + // XXX: Temporary workaround for issue 785 (Apple bug 8910589). + // Turn off autocorrect and autocomplete on non-iOS 5 devices + // since the popup they use can't be dismissed by the user. Note + // that we test for the presence of the feature by looking for + // the autocorrect property on the input element. We currently + // have no test for iOS 5 or newer so we're temporarily using + // the touchOverflow support flag for jQM 1.0. Yes, I feel dirty. - jblas + if ( typeof input[0].autocorrect !== "undefined" && !$.support.touchOverflow ) { + // Set the attribute instead of the property just in case there + // is code that attempts to make modifications via HTML. + input[0].setAttribute( "autocorrect", "off" ); + input[0].setAttribute( "autocomplete", "off" ); + } + + + //"search" input widget + if ( input.is( "[type='search'],:jqmData(type='search')" ) ) { + + focusedEl = input.wrap( "" ).parent(); + clearbtn = $( "
    " + o.clearSearchButtonText + "" ) + .bind('click', function( event ) { + input + .val( "" ) + .focus() + .trigger( "change" ); + clearbtn.addClass( "ui-input-clear-hidden" ); + event.preventDefault(); + }) + .appendTo( focusedEl ) + .buttonMarkup({ + icon: "delete", + iconpos: "notext", + corners: true, + shadow: true, + mini: mini + }); + + function toggleClear() { + setTimeout(function() { + clearbtn.toggleClass( "ui-input-clear-hidden", !input.val() ); + }, 0); + } + + toggleClear(); + + input.bind('paste cut keyup focus change blur', toggleClear); + + } else { + input.addClass( "ui-corner-all ui-shadow-inset" + themeclass + miniclass ); + } + + input.focus(function() { + focusedEl.addClass( $.mobile.focusClass ); + }) + .blur(function(){ + focusedEl.removeClass( $.mobile.focusClass ); + }) + // In many situations, iOS will zoom into the select upon tap, this prevents that from happening + .bind( "focus", function() { + if( o.preventFocusZoom ){ + $.mobile.zoom.disable( true ); + } + }) + .bind( "blur", function() { + if( o.preventFocusZoom ){ + $.mobile.zoom.enable( true ); + } + }); + + // Autogrow + if ( input.is( "textarea" ) ) { + var extraLineHeight = 15, + keyupTimeoutBuffer = 100, + keyup = function() { + var scrollHeight = input[ 0 ].scrollHeight, + clientHeight = input[ 0 ].clientHeight; + + if ( clientHeight < scrollHeight ) { + input.height(scrollHeight + extraLineHeight); + } + }, + keyupTimeout; + + input.keyup(function() { + clearTimeout( keyupTimeout ); + keyupTimeout = setTimeout( keyup, keyupTimeoutBuffer ); + }); + + // binding to pagechange here ensures that for pages loaded via + // ajax the height is recalculated without user input + $( document ).one( "pagechange", keyup ); + + // Issue 509: the browser is not providing scrollHeight properly until the styles load + if ( $.trim( input.val() ) ) { + // bind to the window load to make sure the height is calculated based on BOTH + // the DOM and CSS + $( window ).load( keyup ); + } + } + }, + + disable: function(){ + ( this.element.attr( "disabled", true ).is( "[type='search'],:jqmData(type='search')" ) ? + this.element.parent() : this.element ).addClass( "ui-disabled" ); + }, + + enable: function(){ + ( this.element.attr( "disabled", false).is( "[type='search'],:jqmData(type='search')" ) ? + this.element.parent() : this.element ).removeClass( "ui-disabled" ); + } +}); //auto self-init widgets -$( document ).bind( "pagecreate create", function( event ) { - - if ( $( ":jqmData(position='fixed')", event.target ).length ) { - - $( event.target ).each(function() { - - if ( !$.support.scrollTop || ( $.support.touchOverflow && $.mobile.touchOverflowEnabled ) ) { - return this; - } - - var $this = $( this ); - - if ( $this.jqmData( "fullscreen" ) ) { - $this.addClass( "ui-page-fullscreen" ); - } - - // Should be slidedown - $this.find( slideDownSelector ).addClass( slideDownClass ); - - // Should be slideup - $this.find( slideUpSelector ).addClass( slideUpClass ); - - }) - - } +$( document ).bind( "pagecreate create", function( e ){ + $.mobile.textinput.prototype.enhanceWithin( e.target, true ); }); })( jQuery ); -/* -* "fixHeaderFooter" native plugin - Behavior for "fixed" headers,footers, and scrolling inner content -*/ (function( $, undefined ) { -// Enable touch overflow scrolling when it's natively supported -$.mobile.touchOverflowEnabled = false; +$.mobile.listview.prototype.options.filter = false; +$.mobile.listview.prototype.options.filterPlaceholder = "Filter items..."; +$.mobile.listview.prototype.options.filterTheme = "c"; +$.mobile.listview.prototype.options.filterCallback = function( text, searchValue ){ + return text.toLowerCase().indexOf( searchValue ) === -1; +}; -// Enabled zoom when touch overflow is enabled. Can cause usability issues, unfortunately -$.mobile.touchOverflowZoomEnabled = false; +$( document ).delegate( ":jqmData(role='listview')", "listviewcreate", function() { -$( document ).bind( "pagecreate", function( event ) { - if( $.support.touchOverflow && $.mobile.touchOverflowEnabled ){ + var list = $( this ), + listview = list.data( "listview" ); - var $target = $( event.target ), - scrollStartY = 0; + if ( !listview.options.filter ) { + return; + } + + var wrapper = $( "", { + "class": "ui-listview-filter ui-bar-" + listview.options.filterTheme, + "role": "search" + }), + search = $( "", { + placeholder: listview.options.filterPlaceholder + }) + .attr( "data-" + $.mobile.ns + "type", "search" ) + .jqmData( "lastval", "" ) + .bind( "keyup change", function() { + + var $this = $(this), + val = this.value.toLowerCase(), + listItems = null, + lastval = $this.jqmData( "lastval" ) + "", + childItems = false, + itemtext = "", + item; + + // Change val as lastval for next execution + $this.jqmData( "lastval" , val ); + if ( val.length < lastval.length || val.indexOf(lastval) !== 0 ) { + + // Removed chars or pasted something totally different, check all items + listItems = list.children(); + } else { + + // Only chars added, not removed, only use visible subset + listItems = list.children( ":not(.ui-screen-hidden)" ); + } + + if ( val ) { + + // This handles hiding regular rows without the text we search for + // and any list dividers without regular rows shown under it + + for ( var i = listItems.length - 1; i >= 0; i-- ) { + item = $( listItems[ i ] ); + itemtext = item.jqmData( "filtertext" ) || item.text(); + + if ( item.is( "li:jqmData(role=list-divider)" ) ) { + + item.toggleClass( "ui-filter-hidequeue" , !childItems ); + + // New bucket! + childItems = false; + + } else if ( listview.options.filterCallback( itemtext, val ) ) { + + //mark to be hidden + item.toggleClass( "ui-filter-hidequeue" , true ); + } else { + + // There's a shown item in the bucket + childItems = true; + } + } + + // Show items, not marked to be hidden + listItems + .filter( ":not(.ui-filter-hidequeue)" ) + .toggleClass( "ui-screen-hidden", false ); + + // Hide items, marked to be hidden + listItems + .filter( ".ui-filter-hidequeue" ) + .toggleClass( "ui-screen-hidden", true ) + .toggleClass( "ui-filter-hidequeue", false ); + + } else { + + //filtervalue is empty => show all + listItems.toggleClass( "ui-screen-hidden", false ); + } + listview._refreshCorners(); + }) + .appendTo( wrapper ) + .textinput(); + + if ( listview.options.inset ) { + wrapper.addClass( "ui-listview-filter-inset" ); + } + + wrapper.bind( "submit", function() { + return false; + }) + .insertBefore( list ); +}); - if( $target.is( ":jqmData(role='page')" ) ){ +})( jQuery ); - $target.each(function() { - var $page = $( this ), - $fixies = $page.find( ":jqmData(role='header'), :jqmData(role='footer')" ).filter( ":jqmData(position='fixed')" ), - fullScreen = $page.jqmData( "fullscreen" ), - $scrollElem = $fixies.length ? $page.find( ".ui-content" ) : $page; +( function( $, undefined ) { - $page.addClass( "ui-mobile-touch-overflow" ); +$.widget( "mobile.slider", $.mobile.widget, { + options: { + theme: null, + trackTheme: null, + disabled: false, + initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')", + mini: false + }, + + _create: function() { + + // TODO: Each of these should have comments explain what they're for + var self = this, + + control = this.element, + + parentTheme = $.mobile.getInheritedTheme( control, "c" ), + + theme = this.options.theme || parentTheme, + + trackTheme = this.options.trackTheme || parentTheme, + + cType = control[ 0 ].nodeName.toLowerCase(), + + selectClass = ( cType == "select" ) ? "ui-slider-switch" : "", + + controlID = control.attr( "id" ), + + labelID = controlID + "-label", + + label = $( "[for='"+ controlID +"']" ).attr( "id", labelID ), + + val = function() { + return cType == "input" ? parseFloat( control.val() ) : control[0].selectedIndex; + }, + + min = cType == "input" ? parseFloat( control.attr( "min" ) ) : 0, + + max = cType == "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length-1, + + step = window.parseFloat( control.attr( "step" ) || 1 ), + + inlineClass = ( this.options.inline || control.jqmData("inline") == true ) ? " ui-slider-inline" : "", + + miniClass = ( this.options.mini || control.jqmData("mini") ) ? " ui-slider-mini" : "", + + + domHandle = document.createElement('a'), + handle = $( domHandle ), + domSlider = document.createElement('div'), + slider = $( domSlider ), + + valuebg = control.jqmData("highlight") && cType != "select" ? (function() { + var bg = document.createElement('div'); + bg.className = 'ui-slider-bg ui-btn-active ui-btn-corner-all'; + return $( bg ).prependTo( slider ); + })() : false, + + options; + + domHandle.setAttribute( 'href', "#" ); + domSlider.setAttribute('role','application'); + domSlider.className = ['ui-slider ',selectClass," ui-btn-down-",trackTheme,' ui-btn-corner-all', inlineClass, miniClass].join(""); + domHandle.className = 'ui-slider-handle'; + domSlider.appendChild(domHandle); + + handle.buttonMarkup({ corners: true, theme: theme, shadow: true }) + .attr({ + "role": "slider", + "aria-valuemin": min, + "aria-valuemax": max, + "aria-valuenow": val(), + "aria-valuetext": val(), + "title": val(), + "aria-labelledby": labelID + }); + + $.extend( this, { + slider: slider, + handle: handle, + valuebg: valuebg, + dragging: false, + beforeStart: null, + userModified: false, + mouseMoved: false + }); + + if ( cType == "select" ) { + var wrapper = document.createElement('div'); + wrapper.className = 'ui-slider-inneroffset'; + + for(var j = 0,length = domSlider.childNodes.length;j < length;j++){ + wrapper.appendChild(domSlider.childNodes[j]); + } + + domSlider.appendChild(wrapper); + + // slider.wrapInner( "
    " ); + + // make the handle move with a smooth transition + handle.addClass( "ui-slider-handle-snapping" ); + + options = control.find( "option" ); + + for(var i = 0, optionsCount = options.length; i < optionsCount; i++){ + var side = !i ? "b":"a", + sliderTheme = !i ? " ui-btn-down-" + trackTheme :( " " + $.mobile.activeBtnClass ), + sliderLabel = document.createElement('div'), + sliderImg = document.createElement('span'); + + sliderImg.className = ['ui-slider-label ui-slider-label-',side,sliderTheme," ui-btn-corner-all"].join(""); + sliderImg.setAttribute('role','img'); + sliderImg.appendChild(document.createTextNode(options[i].innerHTML)); + $(sliderImg).prependTo( slider ); + } + + self._labels = $( ".ui-slider-label", slider ); + + } + + label.addClass( "ui-slider" ); + + // monitor the input for updated values + control.addClass( cType === "input" ? "ui-slider-input" : "ui-slider-switch" ) + .change( function() { + // if the user dragged the handle, the "change" event was triggered from inside refresh(); don't call refresh() again + if (!self.mouseMoved) { + self.refresh( val(), true ); + } + }) + .keyup( function() { // necessary? + self.refresh( val(), true, true ); + }) + .blur( function() { + self.refresh( val(), true ); + }); + + // prevent screen drag when slider activated + $( document ).bind( "vmousemove", function( event ) { + if ( self.dragging ) { + // self.mouseMoved must be updated before refresh() because it will be used in the control "change" event + self.mouseMoved = true; + + if ( cType === "select" ) { + // make the handle move in sync with the mouse + handle.removeClass( "ui-slider-handle-snapping" ); + } + + self.refresh( event ); + + // only after refresh() you can calculate self.userModified + self.userModified = self.beforeStart !== control[0].selectedIndex; + return false; + } + }); + + slider.bind( "vmousedown", function( event ) { + self.dragging = true; + self.userModified = false; + self.mouseMoved = false; + + if ( cType === "select" ) { + self.beforeStart = control[0].selectedIndex; + } + + self.refresh( event ); + return false; + }) + .bind( "vclick", false ); + + slider.add( document ) + .bind( "vmouseup", function() { + if ( self.dragging ) { + + self.dragging = false; + + if ( cType === "select") { + + // make the handle move with a smooth transition + handle.addClass( "ui-slider-handle-snapping" ); + + if ( self.mouseMoved ) { + + // this is a drag, change the value only if user dragged enough + if ( self.userModified ) { + self.refresh( self.beforeStart == 0 ? 1 : 0 ); + } + else { + self.refresh( self.beforeStart ); + } + + } + else { + // this is just a click, change the value + self.refresh( self.beforeStart == 0 ? 1 : 0 ); + } + + } + + self.mouseMoved = false; + + return false; + } + }); + + slider.insertAfter( control ); + + // Only add focus class to toggle switch, sliders get it automatically from ui-btn + if( cType == 'select' ) { + this.handle.bind({ + focus: function() { + slider.addClass( $.mobile.focusClass ); + }, + + blur: function() { + slider.removeClass( $.mobile.focusClass ); + } + }); + } + + this.handle.bind({ + // NOTE force focus on handle + vmousedown: function() { + $( this ).focus(); + }, + + vclick: false, + + keydown: function( event ) { + var index = val(); + + if ( self.options.disabled ) { + return; + } + + // In all cases prevent the default and mark the handle as active + switch ( event.keyCode ) { + case $.mobile.keyCode.HOME: + case $.mobile.keyCode.END: + case $.mobile.keyCode.PAGE_UP: + case $.mobile.keyCode.PAGE_DOWN: + case $.mobile.keyCode.UP: + case $.mobile.keyCode.RIGHT: + case $.mobile.keyCode.DOWN: + case $.mobile.keyCode.LEFT: + event.preventDefault(); + + if ( !self._keySliding ) { + self._keySliding = true; + $( this ).addClass( "ui-state-active" ); + } + break; + } + + // move the slider according to the keypress + switch ( event.keyCode ) { + case $.mobile.keyCode.HOME: + self.refresh( min ); + break; + case $.mobile.keyCode.END: + self.refresh( max ); + break; + case $.mobile.keyCode.PAGE_UP: + case $.mobile.keyCode.UP: + case $.mobile.keyCode.RIGHT: + self.refresh( index + step ); + break; + case $.mobile.keyCode.PAGE_DOWN: + case $.mobile.keyCode.DOWN: + case $.mobile.keyCode.LEFT: + self.refresh( index - step ); + break; + } + }, // remove active mark + + keyup: function( event ) { + if ( self._keySliding ) { + self._keySliding = false; + $( this ).removeClass( "ui-state-active" ); + } + } + }); + + this.refresh(undefined, undefined, true); + }, + + refresh: function( val, isfromControl, preventInputUpdate ) { + + if ( this.options.disabled || this.element.attr('disabled')) { + this.disable(); + } + + var control = this.element, percent, + cType = control[0].nodeName.toLowerCase(), + min = cType === "input" ? parseFloat( control.attr( "min" ) ) : 0, + max = cType === "input" ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length - 1, + step = (cType === "input" && parseFloat( control.attr( "step" ) ) > 0) ? parseFloat(control.attr("step")) : 1; + + if ( typeof val === "object" ) { + var data = val, + // a slight tolerance helped get to the ends of the slider + tol = 8; + if ( !this.dragging || + data.pageX < this.slider.offset().left - tol || + data.pageX > this.slider.offset().left + this.slider.width() + tol ) { + return; + } + percent = Math.round( ( ( data.pageX - this.slider.offset().left ) / this.slider.width() ) * 100 ); + } else { + if ( val == null ) { + val = cType === "input" ? parseFloat( control.val() || 0 ) : control[0].selectedIndex; + } + percent = ( parseFloat( val ) - min ) / ( max - min ) * 100; + } + + if ( isNaN( percent ) ) { + return; + } + + if ( percent < 0 ) { + percent = 0; + } + + if ( percent > 100 ) { + percent = 100; + } + + var newval = ( percent / 100 ) * ( max - min ) + min; + + //from jQuery UI slider, the following source will round to the nearest step + var valModStep = ( newval - min ) % step; + var alignValue = newval - valModStep; + + if ( Math.abs( valModStep ) * 2 >= step ) { + alignValue += ( valModStep > 0 ) ? step : ( -step ); + } + // Since JavaScript has problems with large floats, round + // the final value to 5 digits after the decimal point (see jQueryUI: #4124) + newval = parseFloat( alignValue.toFixed(5) ); + + if ( newval < min ) { + newval = min; + } + + if ( newval > max ) { + newval = max; + } + + this.handle.css( "left", percent + "%" ); + this.handle.attr( { + "aria-valuenow": cType === "input" ? newval : control.find( "option" ).eq( newval ).attr( "value" ), + "aria-valuetext": cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText(), + title: cType === "input" ? newval : control.find( "option" ).eq( newval ).getEncodedText() + }); + this.valuebg && this.valuebg.css( "width", percent + "%" ); + + // drag the label widths + if ( this._labels ) { + var handlePercent = this.handle.width() / this.slider.width() * 100, + aPercent = percent && handlePercent + ( 100 - handlePercent ) * percent / 100, + bPercent = percent === 100 ? 0 : Math.min( handlePercent + 100 - aPercent, 100 ); + + this._labels.each(function(){ + var ab = $(this).is( ".ui-slider-label-a" ); + $( this ).width( ( ab ? aPercent : bPercent ) + "%" ); + }); + } + + if ( !preventInputUpdate ) { + var valueChanged = false; + + // update control"s value + if ( cType === "input" ) { + valueChanged = control.val() !== newval; + control.val( newval ); + } else { + valueChanged = control[ 0 ].selectedIndex !== newval; + control[ 0 ].selectedIndex = newval; + } + if ( !isfromControl && valueChanged ) { + control.trigger( "change" ); + } + } + }, + + enable: function() { + this.element.attr( "disabled", false ); + this.slider.removeClass( "ui-disabled" ).attr( "aria-disabled", false ); + return this._setOption( "disabled", false ); + }, + + disable: function() { + this.element.attr( "disabled", true ); + this.slider.addClass( "ui-disabled" ).attr( "aria-disabled", true ); + return this._setOption( "disabled", true ); + } - $scrollElem.bind( "scrollstop", function(){ - if( $scrollElem.scrollTop() > 0 ){ - window.scrollTo( 0, $.mobile.defaultHomeScroll ); - } - }); +}); - if( $fixies.length ){ +//auto self-init widgets +$( document ).bind( "pagecreate create", function( e ){ + $.mobile.slider.prototype.enhanceWithin( e.target, true ); +}); - $page.addClass( "ui-native-fixed" ); +})( jQuery ); - if( fullScreen ){ +(function( $, undefined ) { - $page.addClass( "ui-native-fullscreen" ); +$.widget( "mobile.selectmenu", $.mobile.widget, { + options: { + theme: null, + disabled: false, + icon: "arrow-d", + iconpos: "right", + inline: false, + corners: true, + shadow: true, + iconshadow: true, + overlayTheme: "a", + hidePlaceholderMenuItems: true, + closeText: "Close", + nativeMenu: true, + // This option defaults to true on iOS devices. + preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1, + initSelector: "select:not(:jqmData(role='slider'))", + mini: false + }, + + _button: function(){ + return $( "
    " ); + }, + + _setDisabled: function( value ) { + this.element.attr( "disabled", value ); + this.button.attr( "aria-disabled", value ); + return this._setOption( "disabled", value ); + }, + + _focusButton : function() { + var self = this; + + setTimeout( function() { + self.button.focus(); + }, 40); + }, - $fixies.addClass( "fade in" ); + _selectOptions: function() { + return this.select.find( "option" ); + }, - $( document ).bind( "vclick", function(){ - $fixies - .removeClass( "ui-native-bars-hidden" ) - .toggleClass( "in out" ) - .animationComplete(function(){ - $(this).not( ".in" ).addClass( "ui-native-bars-hidden" ); - }); - }); - } - } - }); - } - } + // setup items that are generally necessary for select menu extension + _preExtension: function(){ + var classes = ""; + // TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577 + /* if( $el[0].className.length ) { + classes = $el[0].className; + } */ + if( !!~this.element[0].className.indexOf( "ui-btn-left" ) ) { + classes = " ui-btn-left"; + } + + if( !!~this.element[0].className.indexOf( "ui-btn-right" ) ) { + classes = " ui-btn-right"; + } + + this.select = this.element.wrap( "
    " ); + this.selectID = this.select.attr( "id" ); + this.label = $( "label[for='"+ this.selectID +"']" ).addClass( "ui-select" ); + this.isMultiple = this.select[ 0 ].multiple; + if ( !this.options.theme ) { + this.options.theme = $.mobile.getInheritedTheme( this.select, "c" ); + } + }, + + _create: function() { + this._preExtension(); + + // Allows for extension of the native select for custom selects and other plugins + // see select.custom for example extension + // TODO explore plugin registration + this._trigger( "beforeCreate" ); + + this.button = this._button(); + + var self = this, + + options = this.options, + + // IE throws an exception at options.item() function when + // there is no selected item + // select first in this case + selectedIndex = this.select[ 0 ].selectedIndex == -1 ? 0 : this.select[ 0 ].selectedIndex, + + // TODO values buttonId and menuId are undefined here + button = this.button + .text( $( this.select[ 0 ].options.item( selectedIndex ) ).text() ) + .insertBefore( this.select ) + .buttonMarkup( { + theme: options.theme, + icon: options.icon, + iconpos: options.iconpos, + inline: options.inline, + corners: options.corners, + shadow: options.shadow, + iconshadow: options.iconshadow, + mini: options.mini + }); + + // Opera does not properly support opacity on select elements + // In Mini, it hides the element, but not its text + // On the desktop,it seems to do the opposite + // for these reasons, using the nativeMenu option results in a full native select in Opera + if ( options.nativeMenu && window.opera && window.opera.version ) { + this.select.addClass( "ui-select-nativeonly" ); + } + + // Add counter for multi selects + if ( this.isMultiple ) { + this.buttonCount = $( "" ) + .addClass( "ui-li-count ui-btn-up-c ui-btn-corner-all" ) + .hide() + .appendTo( button.addClass('ui-li-has-count') ); + } + + // Disable if specified + if ( options.disabled || this.element.attr('disabled')) { + this.disable(); + } + + // Events on native select + this.select.change( function() { + self.refresh(); + }); + + this.build(); + }, + + build: function() { + var self = this; + + this.select + .appendTo( self.button ) + .bind( "vmousedown", function() { + // Add active class to button + self.button.addClass( $.mobile.activeBtnClass ); + }) + .bind( "focus", function() { + self.button.addClass( $.mobile.focusClass ); + }) + .bind( "blur", function() { + self.button.removeClass( $.mobile.focusClass ); + }) + .bind( "focus vmouseover", function() { + self.button.trigger( "vmouseover" ); + }) + .bind( "vmousemove", function() { + // Remove active class on scroll/touchmove + self.button.removeClass( $.mobile.activeBtnClass ); + }) + .bind( "change blur vmouseout", function() { + self.button.trigger( "vmouseout" ) + .removeClass( $.mobile.activeBtnClass ); + }) + .bind( "change blur", function() { + self.button.removeClass( "ui-btn-down-" + self.options.theme ); + }); + + // In many situations, iOS will zoom into the select upon tap, this prevents that from happening + self.button.bind( "vmousedown", function() { + if( self.options.preventFocusZoom ){ + $.mobile.zoom.disable( true ); + } + }) + .bind( "mouseup", function() { + if( self.options.preventFocusZoom ){ + $.mobile.zoom.enable( true ); + } + }); + }, + + selected: function() { + return this._selectOptions().filter( ":selected" ); + }, + + selectedIndices: function() { + var self = this; + + return this.selected().map( function() { + return self._selectOptions().index( this ); + }).get(); + }, + + setButtonText: function() { + var self = this, selected = this.selected(); + + this.button.find( ".ui-btn-text" ).text( function() { + if ( !self.isMultiple ) { + return selected.text(); + } + + return selected.length ? selected.map( function() { + return $( this ).text(); + }).get().join( ", " ) : self.placeholder; + }); + }, + + setButtonCount: function() { + var selected = this.selected(); + + // multiple count inside button + if ( this.isMultiple ) { + this.buttonCount[ selected.length > 1 ? "show" : "hide" ]().text( selected.length ); + } + }, + + refresh: function() { + this.setButtonText(); + this.setButtonCount(); + }, + + // open and close preserved in native selects + // to simplify users code when looping over selects + open: $.noop, + close: $.noop, + + disable: function() { + this._setDisabled( true ); + this.button.addClass( "ui-disabled" ); + }, + + enable: function() { + this._setDisabled( false ); + this.button.removeClass( "ui-disabled" ); + } }); +//auto self-init widgets +$( document ).bind( "pagecreate create", function( e ){ + $.mobile.selectmenu.prototype.enhanceWithin( e.target, true ); +}); })( jQuery ); + /* -* "init" - Initialize the framework +* custom "selectmenu" plugin */ -(function( $, window, undefined ) { - var $html = $( "html" ), - $head = $( "head" ), - $window = $( window ); - - // trigger mobileinit event - useful hook for configuring $.mobile settings before they're used - $( window.document ).trigger( "mobileinit" ); - - // support conditions - // if device support condition(s) aren't met, leave things as they are -> a basic, usable experience, - // otherwise, proceed with the enhancements - if ( !$.mobile.gradeA() ) { - return; - } - - // override ajaxEnabled on platforms that have known conflicts with hash history updates - // or generally work better browsing in regular http for full page refreshes (BB5, Opera Mini) - if ( $.mobile.ajaxBlacklist ) { - $.mobile.ajaxEnabled = false; - } - - // add mobile, initial load "rendering" classes to docEl - $html.addClass( "ui-mobile ui-mobile-rendering" ); - - // loading div which appears during Ajax requests - // will not appear if $.mobile.loadingMessage is false - var $loader = $( "

    " ); - - $.extend($.mobile, { - // turn on/off page loading message. - showPageLoadingMsg: function() { - if ( $.mobile.loadingMessage ) { - var activeBtn = $( "." + $.mobile.activeBtnClass ).first(); - - $loader - .find( "h1" ) - .text( $.mobile.loadingMessage ) - .end() - .appendTo( $.mobile.pageContainer ) - // position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top - .css({ - top: $.support.scrollTop && $window.scrollTop() + $window.height() / 2 || - activeBtn.length && activeBtn.offset().top || 100 - }); - } - - $html.addClass( "ui-loading" ); - }, - - hidePageLoadingMsg: function() { - $html.removeClass( "ui-loading" ); - }, - - // find and enhance the pages in the dom and transition to the first page. - initializePage: function() { - // find present pages - var $dialogs, $pages = $( ":jqmData(role='page')" ); - - // if no pages are found, check for dialogs or create one with body's inner html - if ( !$pages.length ) { - $dialogs = $( ":jqmData(role='dialog')" ); - - // if there are no pages but a dialog is present, load it as a page - if( $dialogs.length ) { - // alter the attribute so it will be treated as a page unpon enhancement - // TODO allow for the loading of a dialog as the first page (many considerations) - $dialogs.first().attr( "data-" + $.mobile.ns + "role", "page" ); - - // remove the first dialog from the set of dialogs since it's now a page - // add it to the empty set of pages to be loaded by the initial changepage - $pages = $pages.add( $dialogs.get().shift() ); - } else { - $pages = $( "body" ).wrapInner( "
    " ).children( 0 ); - } - } +(function( $, undefined ) { + var extendSelect = function( widget ){ + var select = widget.select, + selectID = widget.selectID, + label = widget.label, + thisPage = widget.select.closest( ".ui-page" ), + screen = $( "
    ", {"class": "ui-selectmenu-screen ui-screen-hidden"} ).appendTo( thisPage ), + selectOptions = widget._selectOptions(), + isMultiple = widget.isMultiple = widget.select[ 0 ].multiple, + buttonId = selectID + "-button", + menuId = selectID + "-menu", + menuPage = $( "
    " + + "
    " + + "
    " + label.getEncodedText() + "
    "+ + "
    "+ + "
    "+ + "
    " ), + + listbox = $("
    ", { "class": "ui-selectmenu ui-selectmenu-hidden ui-overlay-shadow ui-corner-all ui-body-" + widget.options.overlayTheme + " " + $.mobile.defaultDialogTransition } ).insertAfter(screen), + + list = $( "
      ", { + "class": "ui-selectmenu-list", + "id": menuId, + "role": "listbox", + "aria-labelledby": buttonId + }).attr( "data-" + $.mobile.ns + "theme", widget.options.theme ).appendTo( listbox ), + + header = $( "
      ", { + "class": "ui-header ui-bar-" + widget.options.theme + }).prependTo( listbox ), + + headerTitle = $( "

      ", { + "class": "ui-title" + }).appendTo( header ), + + menuPageContent, + menuPageClose, + headerClose; + + if( widget.isMultiple ) { + headerClose = $( "", { + "text": widget.options.closeText, + "href": "#", + "class": "ui-btn-left" + }).attr( "data-" + $.mobile.ns + "iconpos", "notext" ).attr( "data-" + $.mobile.ns + "icon", "delete" ).appendTo( header ).buttonMarkup(); + } + + $.extend( widget, { + select: widget.select, + selectID: selectID, + buttonId: buttonId, + menuId: menuId, + thisPage: thisPage, + menuPage: menuPage, + label: label, + screen: screen, + selectOptions: selectOptions, + isMultiple: isMultiple, + theme: widget.options.theme, + listbox: listbox, + list: list, + header: header, + headerTitle: headerTitle, + headerClose: headerClose, + menuPageContent: menuPageContent, + menuPageClose: menuPageClose, + placeholder: "", + + build: function() { + var self = this; + + // Create list from select, update state + self.refresh(); + + self.select.attr( "tabindex", "-1" ).focus(function() { + $( this ).blur(); + self.button.focus(); + }); + + // Button events + self.button.bind( "vclick keydown" , function( event ) { + if ( event.type == "vclick" || + event.keyCode && ( event.keyCode === $.mobile.keyCode.ENTER || + event.keyCode === $.mobile.keyCode.SPACE ) ) { + + self.open(); + event.preventDefault(); + } + }); + + // Events for list items + self.list.attr( "role", "listbox" ) + .bind( "focusin", function( e ){ + $( e.target ) + .attr( "tabindex", "0" ) + .trigger( "vmouseover" ); + + }) + .bind( "focusout", function( e ){ + $( e.target ) + .attr( "tabindex", "-1" ) + .trigger( "vmouseout" ); + }) + .delegate( "li:not(.ui-disabled, .ui-li-divider)", "click", function( event ) { + + // index of option tag to be selected + var oldIndex = self.select[ 0 ].selectedIndex, + newIndex = self.list.find( "li:not(.ui-li-divider)" ).index( this ), + option = self._selectOptions().eq( newIndex )[ 0 ]; + + // toggle selected status on the tag for multi selects + option.selected = self.isMultiple ? !option.selected : true; + + // toggle checkbox class for multiple selects + if ( self.isMultiple ) { + $( this ).find( ".ui-icon" ) + .toggleClass( "ui-icon-checkbox-on", option.selected ) + .toggleClass( "ui-icon-checkbox-off", !option.selected ); + } + + // trigger change if value changed + if ( self.isMultiple || oldIndex !== newIndex ) { + self.select.trigger( "change" ); + } + + //hide custom select for single selects only + if ( !self.isMultiple ) { + self.close(); + } + + event.preventDefault(); + }) + .keydown(function( event ) { //keyboard events for menu items + var target = $( event.target ), + li = target.closest( "li" ), + prev, next; + + // switch logic based on which key was pressed + switch ( event.keyCode ) { + // up or left arrow keys + case 38: + prev = li.prev().not( ".ui-selectmenu-placeholder" ); + + if( prev.is( ".ui-li-divider" ) ) { + prev = prev.prev(); + } + + // if there's a previous option, focus it + if ( prev.length ) { + target + .blur() + .attr( "tabindex", "-1" ); + + prev.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus(); + } + + return false; + break; + + // down or right arrow keys + case 40: + next = li.next(); + + if( next.is( ".ui-li-divider" ) ) { + next = next.next(); + } + + // if there's a next option, focus it + if ( next.length ) { + target + .blur() + .attr( "tabindex", "-1" ); + + next.addClass( "ui-btn-down-" + widget.options.theme ).find( "a" ).first().focus(); + } + + return false; + break; + + // If enter or space is pressed, trigger click + case 13: + case 32: + target.trigger( "click" ); + + return false; + break; + } + }); + + // button refocus ensures proper height calculation + // by removing the inline style and ensuring page inclusion + self.menuPage.bind( "pagehide", function() { + self.list.appendTo( self.listbox ); + self._focusButton(); + + // TODO centralize page removal binding / handling in the page plugin. + // Suggestion from @jblas to do refcounting + // + // TODO extremely confusing dependency on the open method where the pagehide.remove + // bindings are stripped to prevent the parent page from disappearing. The way + // we're keeping pages in the DOM right now sucks + // + // rebind the page remove that was unbound in the open function + // to allow for the parent page removal from actions other than the use + // of a dialog sized custom select + // + // doing this here provides for the back button on the custom select dialog + $.mobile._bindPageRemove.call( self.thisPage ); + }); + + // Events on "screen" overlay + self.screen.bind( "vclick", function( event ) { + self.close(); + }); + + // Close button on small overlays + if( self.isMultiple ){ + self.headerClose.click( function() { + if ( self.menuType == "overlay" ) { + self.close(); + return false; + } + }); + } + + // track this dependency so that when the parent page + // is removed on pagehide it will also remove the menupage + self.thisPage.addDependents( this.menuPage ); + }, + + _isRebuildRequired: function() { + var list = this.list.find( "li" ), + options = this._selectOptions(); + + // TODO exceedingly naive method to determine difference + // ignores value changes etc in favor of a forcedRebuild + // from the user in the refresh method + return options.text() !== list.text(); + }, + + refresh: function( forceRebuild , foo ){ + var self = this, + select = this.element, + isMultiple = this.isMultiple, + options = this._selectOptions(), + selected = this.selected(), + // return an array of all selected index's + indicies = this.selectedIndices(); + + if ( forceRebuild || this._isRebuildRequired() ) { + self._buildList(); + } + + self.setButtonText(); + self.setButtonCount(); + + self.list.find( "li:not(.ui-li-divider)" ) + .removeClass( $.mobile.activeBtnClass ) + .attr( "aria-selected", false ) + .each(function( i ) { + + if ( $.inArray( i, indicies ) > -1 ) { + var item = $( this ); + + // Aria selected attr + item.attr( "aria-selected", true ); + + // Multiple selects: add the "on" checkbox state to the icon + if ( self.isMultiple ) { + item.find( ".ui-icon" ).removeClass( "ui-icon-checkbox-off" ).addClass( "ui-icon-checkbox-on" ); + } else { + if( item.is( ".ui-selectmenu-placeholder" ) ) { + item.next().addClass( $.mobile.activeBtnClass ); + } else { + item.addClass( $.mobile.activeBtnClass ); + } + } + } + }); + }, + + close: function() { + if ( this.options.disabled || !this.isOpen ) { + return; + } + + var self = this; + + if ( self.menuType == "page" ) { + // doesn't solve the possible issue with calling change page + // where the objects don't define data urls which prevents dialog key + // stripping - changePage has incoming refactor + window.history.back(); + } else { + self.screen.addClass( "ui-screen-hidden" ); + self.listbox.addClass( "ui-selectmenu-hidden" ).removeAttr( "style" ).removeClass( "in" ); + self.list.appendTo( self.listbox ); + self._focusButton(); + } + + // allow the dialog to be closed again + self.isOpen = false; + }, + + open: function() { + if ( this.options.disabled ) { + return; + } + + var self = this, + $window = $( window ), + selfListParent = self.list.parent(), + menuHeight = selfListParent.outerHeight(), + menuWidth = selfListParent.outerWidth(), + activePage = $( ".ui-page-active" ), + tScrollElem = activePage, + scrollTop = $window.scrollTop(), + btnOffset = self.button.offset().top, + screenHeight = $window.height(), + screenWidth = $window.width(); + + //add active class to button + self.button.addClass( $.mobile.activeBtnClass ); + + //remove after delay + setTimeout( function() { + self.button.removeClass( $.mobile.activeBtnClass ); + }, 300); + + function focusMenuItem() { + self.list.find( "." + $.mobile.activeBtnClass + " a" ).focus(); + } + + if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) { + + self.menuPage.appendTo( $.mobile.pageContainer ).page(); + self.menuPageContent = menuPage.find( ".ui-content" ); + self.menuPageClose = menuPage.find( ".ui-header a" ); + + // prevent the parent page from being removed from the DOM, + // otherwise the results of selecting a list item in the dialog + // fall into a black hole + self.thisPage.unbind( "pagehide.remove" ); + + //for WebOS/Opera Mini (set lastscroll using button offset) + if ( scrollTop == 0 && btnOffset > screenHeight ) { + self.thisPage.one( "pagehide", function() { + $( this ).jqmData( "lastScroll", btnOffset ); + }); + } + + self.menuPage.one( "pageshow", function() { + focusMenuItem(); + self.isOpen = true; + }); + + self.menuType = "page"; + self.menuPageContent.append( self.list ); + self.menuPage.find("div .ui-title").text(self.label.text()); + $.mobile.changePage( self.menuPage, { + transition: $.mobile.defaultDialogTransition + }); + } else { + self.menuType = "overlay"; + + self.screen.height( $(document).height() ) + .removeClass( "ui-screen-hidden" ); + + // Try and center the overlay over the button + var roomtop = btnOffset - scrollTop, + roombot = scrollTop + screenHeight - btnOffset, + halfheight = menuHeight / 2, + maxwidth = parseFloat( self.list.parent().css( "max-width" ) ), + newtop, newleft; + + if ( roomtop > menuHeight / 2 && roombot > menuHeight / 2 ) { + newtop = btnOffset + ( self.button.outerHeight() / 2 ) - halfheight; + } else { + // 30px tolerance off the edges + newtop = roomtop > roombot ? scrollTop + screenHeight - menuHeight - 30 : scrollTop + 30; + } + + // If the menuwidth is smaller than the screen center is + if ( menuWidth < maxwidth ) { + newleft = ( screenWidth - menuWidth ) / 2; + } else { + + //otherwise insure a >= 30px offset from the left + newleft = self.button.offset().left + self.button.outerWidth() / 2 - menuWidth / 2; + + // 30px tolerance off the edges + if ( newleft < 30 ) { + newleft = 30; + } else if ( (newleft + menuWidth) > screenWidth ) { + newleft = screenWidth - menuWidth - 30; + } + } + + self.listbox.append( self.list ) + .removeClass( "ui-selectmenu-hidden" ) + .css({ + top: newtop, + left: newleft + }) + .addClass( "in" ); + + focusMenuItem(); + + // duplicate with value set in page show for dialog sized selects + self.isOpen = true; + } + }, + + _buildList: function() { + var self = this, + o = this.options, + placeholder = this.placeholder, + needPlaceholder = true, + optgroups = [], + lis = [], + dataIcon = self.isMultiple ? "checkbox-off" : "false"; + + self.list.empty().filter( ".ui-listview" ).listview( "destroy" ); + + var $options = self.select.find("option"), + numOptions = $options.length, + select = this.select[ 0 ], + dataPrefix = 'data-' + $.mobile.ns, + dataIndexAttr = dataPrefix + 'option-index', + dataIconAttr = dataPrefix + 'icon', + dataRoleAttr = dataPrefix + 'role', + fragment = document.createDocumentFragment(), + optGroup; + + for (var i = 0; i < numOptions;i++){ + var option = $options[i], + $option = $(option), + parent = option.parentNode, + text = $option.text(), + anchor = document.createElement('a'), + classes = []; + + anchor.setAttribute('href','#'); + anchor.appendChild(document.createTextNode(text)); + + // Are we inside an optgroup? + if (parent !== select && parent.nodeName.toLowerCase() === "optgroup"){ + var optLabel = parent.getAttribute('label'); + if ( optLabel != optGroup) { + var divider = document.createElement('li'); + divider.setAttribute(dataRoleAttr,'list-divider'); + divider.setAttribute('role','option'); + divider.setAttribute('tabindex','-1'); + divider.appendChild(document.createTextNode(optLabel)); + fragment.appendChild(divider); + optGroup = optLabel; + } + } + + if (needPlaceholder && (!option.getAttribute( "value" ) || text.length == 0 || $option.jqmData( "placeholder" ))) { + needPlaceholder = false; + if ( o.hidePlaceholderMenuItems ) { + classes.push( "ui-selectmenu-placeholder" ); + } + if (!placeholder) { + placeholder = self.placeholder = text; + } + } + + var item = document.createElement('li'); + if ( option.disabled ) { + classes.push( "ui-disabled" ); + item.setAttribute('aria-disabled',true); + } + item.setAttribute(dataIndexAttr,i); + item.setAttribute(dataIconAttr,dataIcon); + item.className = classes.join(" "); + item.setAttribute('role','option'); + anchor.setAttribute('tabindex','-1'); + item.appendChild(anchor); + fragment.appendChild(item); + } + + self.list[0].appendChild(fragment); + + // Hide header if it's not a multiselect and there's no placeholder + if ( !this.isMultiple && !placeholder.length ) { + this.header.hide(); + } else { + this.headerTitle.text( this.placeholder ); + } + + // Now populated, create listview + self.list.listview(); + }, + + _button: function(){ + return $( "", { + "href": "#", + "role": "button", + // TODO value is undefined at creation + "id": this.buttonId, + "aria-haspopup": "true", + + // TODO value is undefined at creation + "aria-owns": this.menuId + }); + } + }); + }; + + // issue #3894 - core doesn't triggered events on disabled delegates + $( document ).bind( "selectmenubeforecreate", function( event ){ + var selectmenuWidget = $( event.target ).data( "selectmenu" ); + + if( !selectmenuWidget.options.nativeMenu ){ + extendSelect( selectmenuWidget ); + } + }); +})( jQuery ); - // add dialogs, set data-url attrs - $pages.add( ":jqmData(role='dialog')" ).each(function() { - var $this = $(this); - - // unless the data url is already set set it to the pathname - if ( !$this.jqmData("url") ) { - $this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) || location.pathname + location.search ); - } - }); - - // define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback) - $.mobile.firstPage = $pages.first(); - - // define page container - $.mobile.pageContainer = $pages.first().parent().addClass( "ui-mobile-viewport" ); - - // alert listeners that the pagecontainer has been determined for binding - // to events triggered on it - $window.trigger( "pagecontainercreate" ); - - // cue page loading message - $.mobile.showPageLoadingMsg(); - - // if hashchange listening is disabled or there's no hash deeplink, change to the first page in the DOM - if ( !$.mobile.hashListeningEnabled || !$.mobile.path.stripHash( location.hash ) ) { - $.mobile.changePage( $.mobile.firstPage, { transition: "none", reverse: true, changeHash: false, fromHashChange: true } ); - } - // otherwise, trigger a hashchange to load a deeplink - else { - $window.trigger( "hashchange", [ true ] ); - } - } - }); +(function( $, undefined ) { - // This function injects a meta viewport tag to prevent scaling. Off by default, on by default when touchOverflow scrolling is enabled - function disableZoom() { - var cont = "user-scalable=no", - meta = $( "meta[name='viewport']" ); - if( meta.length ){ - meta.attr( "content", meta.attr( "content" ) + ", " + cont ); - } - else{ - $( "head" ).prepend( "", { "name": "viewport", "content": cont } ); - } - } + $.widget( "mobile.fixedtoolbar", $.mobile.widget, { + options: { + visibleOnPageShow: true, + disablePageZoom: true, + transition: "slide", //can be none, fade, slide (slide maps to slideup or slidedown) + fullscreen: false, + tapToggle: true, + tapToggleBlacklist: "a, input, select, textarea, .ui-header-fixed, .ui-footer-fixed", + hideDuringFocus: "input, textarea, select", + updatePagePadding: true, + trackPersistentToolbars: true, + + // Browser detection! Weeee, here we go... + // Unfortunately, position:fixed is costly, not to mention probably impossible, to feature-detect accurately. + // Some tests exist, but they currently return false results in critical devices and browsers, which could lead to a broken experience. + // Testing fixed positioning is also pretty obtrusive to page load, requiring injected elements and scrolling the window + // The following function serves to rule out some popular browsers with known fixed-positioning issues + // This is a plugin option like any other, so feel free to improve or overwrite it + supportBlacklist: function(){ + var w = window, + ua = navigator.userAgent, + platform = navigator.platform, + // Rendering engine is Webkit, and capture major version + wkmatch = ua.match( /AppleWebKit\/([0-9]+)/ ), + wkversion = !!wkmatch && wkmatch[ 1 ], + ffmatch = ua.match( /Fennec\/([0-9]+)/ ), + ffversion = !!ffmatch && ffmatch[ 1 ], + operammobilematch = ua.match( /Opera Mobi\/([0-9]+)/ ), + omversion = !!operammobilematch && operammobilematch[ 1 ]; + + if( + // iOS 4.3 and older : Platform is iPhone/Pad/Touch and Webkit version is less than 534 (ios5) + ( ( platform.indexOf( "iPhone" ) > -1 || platform.indexOf( "iPad" ) > -1 || platform.indexOf( "iPod" ) > -1 ) && wkversion && wkversion < 534 ) + || + // Opera Mini + ( w.operamini && ({}).toString.call( w.operamini ) === "[object OperaMini]" ) + || + ( operammobilematch && omversion < 7458 ) + || + //Android lte 2.1: Platform is Android and Webkit version is less than 533 (Android 2.2) + ( ua.indexOf( "Android" ) > -1 && wkversion && wkversion < 533 ) + || + // Firefox Mobile before 6.0 - + ( ffversion && ffversion < 6 ) + || + // WebOS less than 3 + ( "palmGetResource" in window && wkversion && wkversion < 534 ) + || + // MeeGo + ( ua.indexOf( "MeeGo" ) > -1 && ua.indexOf( "NokiaBrowser/8.5.0" ) > -1 ) + ){ + return true; + } + + return false; + }, + initSelector: ":jqmData(position='fixed')" + }, + + _create: function() { + + var self = this, + o = self.options, + $el = self.element, + tbtype = $el.is( ":jqmData(role='header')" ) ? "header" : "footer", + $page = $el.closest(".ui-page"); + + // Feature detecting support for + if( o.supportBlacklist() ){ + self.destroy(); + return; + } + + $el.addClass( "ui-"+ tbtype +"-fixed" ); + + // "fullscreen" overlay positioning + if( o.fullscreen ){ + $el.addClass( "ui-"+ tbtype +"-fullscreen" ); + $page.addClass( "ui-page-" + tbtype + "-fullscreen" ); + } + // If not fullscreen, add class to page to set top or bottom padding + else{ + $page.addClass( "ui-page-" + tbtype + "-fixed" ); + } + + self._addTransitionClass(); + self._bindPageEvents(); + self._bindToggleHandlers(); + }, + + _addTransitionClass: function(){ + var tclass = this.options.transition; + + if( tclass && tclass !== "none" ){ + // use appropriate slide for header or footer + if( tclass === "slide" ){ + tclass = this.element.is( ".ui-header" ) ? "slidedown" : "slideup"; + } + + this.element.addClass( tclass ); + } + }, + + _bindPageEvents: function(){ + var self = this, + o = self.options, + $el = self.element; + + //page event bindings + // Fixed toolbars require page zoom to be disabled, otherwise usability issues crop up + // This method is meant to disable zoom while a fixed-positioned toolbar page is visible + $el.closest( ".ui-page" ) + .bind( "pagebeforeshow", function(){ + if( o.disablePageZoom ){ + $.mobile.zoom.disable( true ); + } + if( !o.visibleOnPageShow ){ + self.hide( true ); + } + } ) + .bind( "webkitAnimationStart animationstart updatelayout", function(){ + if( o.updatePagePadding ){ + self.updatePagePadding(); + } + }) + .bind( "pageshow", function(){ + self.updatePagePadding(); + if( o.updatePagePadding ){ + $( window ).bind( "throttledresize." + self.widgetName, function(){ + self.updatePagePadding(); + }); + } + }) + .bind( "pagebeforehide", function( e, ui ){ + if( o.disablePageZoom ){ + $.mobile.zoom.enable( true ); + } + if( o.updatePagePadding ){ + $( window ).unbind( "throttledresize." + self.widgetName ); + } + + if( o.trackPersistentToolbars ){ + var thisFooter = $( ".ui-footer-fixed:jqmData(id)", this ), + thisHeader = $( ".ui-header-fixed:jqmData(id)", this ), + nextFooter = thisFooter.length && ui.nextPage && $( ".ui-footer-fixed:jqmData(id='" + thisFooter.jqmData( "id" ) + "')", ui.nextPage ), + nextHeader = thisHeader.length && ui.nextPage && $( ".ui-header-fixed:jqmData(id='" + thisHeader.jqmData( "id" ) + "')", ui.nextPage ); + + nextFooter = nextFooter || $(); + + if( nextFooter.length || nextHeader.length ){ + + nextFooter.add( nextHeader ).appendTo( $.mobile.pageContainer ); + + ui.nextPage.one( "pageshow", function(){ + nextFooter.add( nextHeader ).appendTo( this ); + }); + } + } + }); + }, + + _visible: true, + + // This will set the content element's top or bottom padding equal to the toolbar's height + updatePagePadding: function() { + var $el = this.element, + header = $el.is( ".ui-header" ); + + // This behavior only applies to "fixed", not "fullscreen" + if( this.options.fullscreen ){ return; } + + $el.closest( ".ui-page" ).css( "padding-" + ( header ? "top" : "bottom" ), $el.outerHeight() ); + }, + + _useTransition: function( notransition ){ + var $win = $( window ), + $el = this.element, + scroll = $win.scrollTop(), + elHeight = $el.height(), + pHeight = $el.closest( ".ui-page" ).height(), + viewportHeight = $.mobile.getScreenHeight(), + tbtype = $el.is( ":jqmData(role='header')" ) ? "header" : "footer"; + + return !notransition && + ( this.options.transition && this.options.transition !== "none" && + ( + ( tbtype === "header" && !this.options.fullscreen && scroll > elHeight ) || + ( tbtype === "footer" && !this.options.fullscreen && scroll + viewportHeight < pHeight - elHeight ) + ) || this.options.fullscreen + ); + }, + + show: function( notransition ){ + var hideClass = "ui-fixed-hidden", + $el = this.element; + + if( this._useTransition( notransition ) ){ + $el + .removeClass( "out " + hideClass ) + .addClass( "in" ); + } + else { + $el.removeClass( hideClass ); + } + this._visible = true; + }, + + hide: function( notransition ){ + var hideClass = "ui-fixed-hidden", + $el = this.element, + // if it's a slide transition, our new transitions need the reverse class as well to slide outward + outclass = "out" + ( this.options.transition === "slide" ? " reverse" : "" ); + + if( this._useTransition( notransition ) ){ + $el + .addClass( outclass ) + .removeClass( "in" ) + .animationComplete( function(){ + $el.addClass( hideClass ).removeClass( outclass ); + }); + } + else { + $el.addClass( hideClass ).removeClass( outclass ); + } + this._visible = false; + }, + + toggle: function(){ + this[ this._visible ? "hide" : "show" ](); + }, + + _bindToggleHandlers: function(){ + var self = this, + o = self.options, + $el = self.element; + + // tap toggle + $el.closest( ".ui-page" ) + .bind( "vclick", function( e ){ + if( o.tapToggle && !$( e.target ).closest( o.tapToggleBlacklist ).length ){ + self.toggle(); + } + }) + .bind( "focusin focusout", function( e ){ + if( screen.width < 500 && $( e.target ).is( o.hideDuringFocus ) && !$( e.target ).closest( ".ui-header-fixed, .ui-footer-fixed" ).length ){ + self[ ( e.type === "focusin" && self._visible ) ? "hide" : "show" ](); + } + }); + }, + + destroy: function(){ + this.element.removeClass( "ui-header-fixed ui-footer-fixed ui-header-fullscreen ui-footer-fullscreen in out fade slidedown slideup ui-fixed-hidden" ); + this.element.closest( ".ui-page" ).removeClass( "ui-page-header-fixed ui-page-footer-fixed ui-page-header-fullscreen ui-page-footer-fullscreen" ); + } + + }); + + //auto self-init widgets + $( document ) + .bind( "pagecreate create", function( e ){ + + // DEPRECATED in 1.1: support for data-fullscreen=true|false on the page element. + // This line ensures it still works, but we recommend moving the attribute to the toolbars themselves. + if( $( e.target ).jqmData( "fullscreen" ) ){ + $( $.mobile.fixedtoolbar.prototype.options.initSelector, e.target ).not( ":jqmData(fullscreen)" ).jqmData( "fullscreen", true ); + } + + $.mobile.fixedtoolbar.prototype.enhanceWithin( e.target ); + }); - // if touch-overflow is enabled, disable user scaling, as it creates usability issues - if( $.support.touchOverflow && $.mobile.touchOverflowEnabled && !$.mobile.touchOverflowZoomEnabled ){ - disableZoom(); - } +})( jQuery ); - // initialize events now, after mobileinit has occurred - $.mobile._registerInternalEvents(); +( function( $, window ) { + + // This fix addresses an iOS bug, so return early if the UA claims it's something else. + if( !(/iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1 ) ){ + return; + } + + var zoom = $.mobile.zoom, + evt, x, y, z, aig; + + function checkTilt( e ){ + evt = e.originalEvent; + aig = evt.accelerationIncludingGravity; + + x = Math.abs( aig.x ); + y = Math.abs( aig.y ); + z = Math.abs( aig.z ); + + // If portrait orientation and in one of the danger zones + if( !window.orientation && ( x > 7 || ( ( z > 6 && y < 8 || z < 8 && y > 6 ) && x > 5 ) ) ){ + if( zoom.enabled ){ + zoom.disable(); + } + } + else if( !zoom.enabled ){ + zoom.enable(); + } + } + + $( window ) + .bind( "orientationchange.iosorientationfix", zoom.enable ) + .bind( "devicemotion.iosorientationfix", checkTilt ); + +}( jQuery, this )); + +( function( $, window, undefined ) { + var $html = $( "html" ), + $head = $( "head" ), + $window = $( window ); + + // trigger mobileinit event - useful hook for configuring $.mobile settings before they're used + $( window.document ).trigger( "mobileinit" ); + + // support conditions + // if device support condition(s) aren't met, leave things as they are -> a basic, usable experience, + // otherwise, proceed with the enhancements + if ( !$.mobile.gradeA() ) { + return; + } + + // override ajaxEnabled on platforms that have known conflicts with hash history updates + // or generally work better browsing in regular http for full page refreshes (BB5, Opera Mini) + if ( $.mobile.ajaxBlacklist ) { + $.mobile.ajaxEnabled = false; + } + + // Add mobile, initial load "rendering" classes to docEl + $html.addClass( "ui-mobile ui-mobile-rendering" ); + + // This is a fallback. If anything goes wrong (JS errors, etc), or events don't fire, + // this ensures the rendering class is removed after 5 seconds, so content is visible and accessible + setTimeout( hideRenderingClass, 5000 ); + + // loading div which appears during Ajax requests + // will not appear if $.mobile.loadingMessage is false + var loaderClass = "ui-loader", + $loader = $( "

      " ); + + // For non-fixed supportin browsers. Position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top + function fakeFixLoader(){ + var activeBtn = $( "." + $.mobile.activeBtnClass ).first(); + + $loader + .css({ + top: $.support.scrollTop && $window.scrollTop() + $window.height() / 2 || + activeBtn.length && activeBtn.offset().top || 100 + }); + } + + // check position of loader to see if it appears to be "fixed" to center + // if not, use abs positioning + function checkLoaderPosition(){ + var offset = $loader.offset(), + scrollTop = $window.scrollTop(), + screenHeight = $.mobile.getScreenHeight(); + + if( offset.top < scrollTop || (offset.top - scrollTop) > screenHeight ) { + $loader.addClass( "ui-loader-fakefix" ); + fakeFixLoader(); + $window + .unbind( "scroll", checkLoaderPosition ) + .bind( "scroll", fakeFixLoader ); + } + } + + //remove initial build class (only present on first pageshow) + function hideRenderingClass(){ + $html.removeClass( "ui-mobile-rendering" ); + } + + $.extend($.mobile, { + // turn on/off page loading message. + showPageLoadingMsg: function( theme, msgText, textonly ) { + $html.addClass( "ui-loading" ); + + if ( $.mobile.loadingMessage ) { + // text visibility from argument takes priority + var textVisible = textonly || $.mobile.loadingMessageTextVisible; + + theme = theme || $.mobile.loadingMessageTheme, + + $loader + .attr( "class", loaderClass + " ui-corner-all ui-body-" + ( theme || "a" ) + " ui-loader-" + ( textVisible ? "verbose" : "default" ) + ( textonly ? " ui-loader-textonly" : "" ) ) + .find( "h1" ) + .text( msgText || $.mobile.loadingMessage ) + .end() + .appendTo( $.mobile.pageContainer ); + + checkLoaderPosition(); + $window.bind( "scroll", checkLoaderPosition ); + } + }, + + hidePageLoadingMsg: function() { + $html.removeClass( "ui-loading" ); + + if( $.mobile.loadingMessage ){ + $loader.removeClass( "ui-loader-fakefix" ); + } + + $( window ).unbind( "scroll", fakeFixLoader ); + $( window ).unbind( "scroll", checkLoaderPosition ); + }, + + // find and enhance the pages in the dom and transition to the first page. + initializePage: function() { + // find present pages + var $pages = $( ":jqmData(role='page'), :jqmData(role='dialog')" ); + + // if no pages are found, create one with body's inner html + if ( !$pages.length ) { + $pages = $( "body" ).wrapInner( "
      " ).children( 0 ); + } + + // add dialogs, set data-url attrs + $pages.each(function() { + var $this = $(this); + + // unless the data url is already set set it to the pathname + if ( !$this.jqmData("url") ) { + $this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) || location.pathname + location.search ); + } + }); + + // define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback) + $.mobile.firstPage = $pages.first(); + + // define page container + $.mobile.pageContainer = $pages.first().parent().addClass( "ui-mobile-viewport" ); + + // alert listeners that the pagecontainer has been determined for binding + // to events triggered on it + $window.trigger( "pagecontainercreate" ); + + // cue page loading message + $.mobile.showPageLoadingMsg(); + + //remove initial build class (only present on first pageshow) + hideRenderingClass(); + + // if hashchange listening is disabled or there's no hash deeplink, change to the first page in the DOM + if ( !$.mobile.hashListeningEnabled || !$.mobile.path.stripHash( location.hash ) ) { + $.mobile.changePage( $.mobile.firstPage, { transition: "none", reverse: true, changeHash: false, fromHashChange: true } ); + } + // otherwise, trigger a hashchange to load a deeplink + else { + $window.trigger( "hashchange", [ true ] ); + } + } + }); + + // initialize events now, after mobileinit has occurred + $.mobile._registerInternalEvents(); + + // check which scrollTop value should be used by scrolling to 1 immediately at domready + // then check what the scroll top is. Android will report 0... others 1 + // note that this initial scroll won't hide the address bar. It's just for the check. + $(function() { + window.scrollTo( 0, 1 ); + + // if defaultHomeScroll hasn't been set yet, see if scrollTop is 1 + // it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar) + // so if it's 1, use 0 from now on + $.mobile.defaultHomeScroll = ( !$.support.scrollTop || $(window).scrollTop() === 1 ) ? 0 : 1; + + + // TODO: Implement a proper registration mechanism with dependency handling in order to not have exceptions like the one below + //auto self-init widgets for those widgets that have a soft dependency on others + if ( $.fn.controlgroup ) { + $( document ).bind( "pagecreate create", function( e ){ + $( ":jqmData(role='controlgroup')", e.target ) + .jqmEnhanceable() + .controlgroup({ excludeInvisible: false }); + }); + } + + //dom-ready inits + if( $.mobile.autoInitializePage ){ + $.mobile.initializePage(); + } + + // window load event + // hide iOS browser chrome on load + $window.load( $.mobile.silentScroll ); + }); +}( jQuery, this )); - // check which scrollTop value should be used by scrolling to 1 immediately at domready - // then check what the scroll top is. Android will report 0... others 1 - // note that this initial scroll won't hide the address bar. It's just for the check. - $(function() { - window.scrollTo( 0, 1 ); - - // if defaultHomeScroll hasn't been set yet, see if scrollTop is 1 - // it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar) - // so if it's 1, use 0 from now on - $.mobile.defaultHomeScroll = ( !$.support.scrollTop || $(window).scrollTop() === 1 ) ? 0 : 1; - - //dom-ready inits - if( $.mobile.autoInitializePage ){ - $.mobile.initializePage(); - } - // window load event - // hide iOS browser chrome on load - $window.load( $.mobile.silentScroll ); - }); -})( jQuery, this ); +})); diff -Nru openlp-1.9.9/openlp/plugins/remotes/html/openlp.css openlp-1.9.10/openlp/plugins/remotes/html/openlp.css --- openlp-1.9.9/openlp/plugins/remotes/html/openlp.css 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/html/openlp.css 2012-06-23 16:35:18.000000000 +0000 @@ -3,10 +3,11 @@ * ------------------------------------------------------------------------- * * Copyright (c) 2008-2012 Raoul Snyman * * Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan * - * Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, * - * Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias * - * Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, * - * Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund * + * Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, * + * Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan * + * Pettit, Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip * + * Ridout, Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin * + * Thompson, Jon Tibble, Dave Warnock, 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 * diff -Nru openlp-1.9.9/openlp/plugins/remotes/html/openlp.js openlp-1.9.10/openlp/plugins/remotes/html/openlp.js --- openlp-1.9.9/openlp/plugins/remotes/html/openlp.js 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/html/openlp.js 2012-06-23 16:35:18.000000000 +0000 @@ -3,10 +3,11 @@ * ------------------------------------------------------------------------- * * Copyright (c) 2008-2012 Raoul Snyman * * Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan * - * Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, * - * Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias * - * Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, * - * Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund * + * Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, * + * Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan * + * Pettit, Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip * + * Ridout, Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin * + * Thompson, Jon Tibble, Dave Warnock, 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 * @@ -203,9 +204,17 @@ }, blankDisplay: function (event) { event.preventDefault(); - $.getJSON("/api/display/hide"); + $.getJSON("/api/display/blank"); }, - unblankDisplay: function (event) { + themeDisplay: function (event) { + event.preventDefault(); + $.getJSON("/api/display/theme"); + }, + desktopDisplay: function (event) { + event.preventDefault(); + $.getJSON("/api/display/desktop"); + }, + showDisplay: function (event) { event.preventDefault(); $.getJSON("/api/display/show"); }, @@ -237,10 +246,12 @@ } else { $.each(data.results.items, function (idx, value) { + if (typeof value[0] !== "number"){ + value[0] = OpenLP.escapeString(value[0]) + } ul.append($("
    • ").append($("").attr("href", "#options") - .attr("data-rel", "dialog").attr("data-transition", "pop") - .attr("value", value[0]).click(OpenLP.showOptions) - .text(value[1]))); + .attr("data-rel", "dialog").attr("value", value[0]) + .click(OpenLP.showOptions).text(value[1]))); }); } ul.listview("refresh"); @@ -276,30 +287,53 @@ "/api/" + $("#search-plugin").val() + "/add", {"data": text}, function () { - history.back(); + $("#options").dialog("close"); + } + ); + }, + addAndGoToService: function (event) { + event.preventDefault(); + var id = $("#selected-item").val(); + if (typeof id !== "number") { + id = "\"" + id + "\""; + } + var text = "{\"request\": {\"id\": " + id + "}}"; + $.getJSON( + "/api/" + $("#search-plugin").val() + "/add", + {"data": text}, + function () { + //$("#options").dialog("close"); + $.mobile.changePage("#service-manager"); } ); - $("#options").dialog("close"); - $.mobile.changePage("#service-manager"); }, escapeString: function (string) { return string.replace(/\\/g, "\\\\").replace(/"/g, "\\\"") } } +// Initial jQueryMobile options +$(document).bind("mobileinit", function(){ + $.mobile.defaultDialogTransition = "none"; + $.mobile.defaultPageTransition = "none"; +}); // Service Manager $("#service-manager").live("pagebeforeshow", OpenLP.loadService); $("#service-refresh").live("click", OpenLP.loadService); -$("#service-top-next, #service-btm-next").live("click", OpenLP.nextItem); -$("#service-top-previous, #service-btm-previous").live("click", OpenLP.previousItem); -$("#service-top-blank, #service-btm-blank").live("click", OpenLP.blankDisplay); -$("#service-top-unblank, #service-btm-unblank").live("click", OpenLP.unblankDisplay); +$("#service-next").live("click", OpenLP.nextItem); +$("#service-previous").live("click", OpenLP.previousItem); +$("#service-blank").live("click", OpenLP.blankDisplay); +$("#service-theme").live("click", OpenLP.themeDisplay); +$("#service-desktop").live("click", OpenLP.desktopDisplay); +$("#service-show").live("click", OpenLP.showDisplay); // Slide Controller $("#slide-controller").live("pagebeforeshow", OpenLP.loadController); $("#controller-refresh").live("click", OpenLP.loadController); -$("#controller-top-next, #controller-btm-next").live("click", OpenLP.nextSlide); -$("#controller-top-previous, #controller-btm-previous").live("click", OpenLP.previousSlide); -$("#controller-top-blank, #controller-btm-blank").live("click", OpenLP.blankDisplay); -$("#controller-top-unblank, #controller-btm-unblank").live("click", OpenLP.unblankDisplay); +$("#controller-next").live("click", OpenLP.nextSlide); +$("#controller-previous").live("click", OpenLP.previousSlide); +$("#controller-blank").live("click", OpenLP.blankDisplay); +$("#controller-theme").live("click", OpenLP.themeDisplay); +$("#controller-desktop").live("click", OpenLP.desktopDisplay); +$("#controller-show").live("click", OpenLP.showDisplay); // Alerts $("#alert-submit").live("click", OpenLP.showAlert); // Search @@ -312,6 +346,7 @@ }); $("#go-live").live("click", OpenLP.goLive); $("#add-to-service").live("click", OpenLP.addToService); +$("#add-and-go-to-service").live("click", OpenLP.addAndGoToService); // Poll the server twice a second to get any updates. $.ajaxSetup({cache: false}); $("#search").live("pageinit", function (event) { diff -Nru openlp-1.9.9/openlp/plugins/remotes/html/stage.css openlp-1.9.10/openlp/plugins/remotes/html/stage.css --- openlp-1.9.9/openlp/plugins/remotes/html/stage.css 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/html/stage.css 2012-06-23 16:35:18.000000000 +0000 @@ -3,10 +3,11 @@ * ------------------------------------------------------------------------- * * Copyright (c) 2008-2012 Raoul Snyman * * Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan * - * Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, * - * Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias * - * Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, * - * Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund * + * Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, * + * Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan * + * Pettit, Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip * + * Ridout, Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin * + * Thompson, Jon Tibble, Dave Warnock, 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 * diff -Nru openlp-1.9.9/openlp/plugins/remotes/html/stage.html openlp-1.9.10/openlp/plugins/remotes/html/stage.html --- openlp-1.9.9/openlp/plugins/remotes/html/stage.html 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/html/stage.html 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -29,6 +30,7 @@ ${stage_title} + diff -Nru openlp-1.9.9/openlp/plugins/remotes/html/stage.js openlp-1.9.10/openlp/plugins/remotes/html/stage.js --- openlp-1.9.9/openlp/plugins/remotes/html/stage.js 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/html/stage.js 2012-06-23 16:35:18.000000000 +0000 @@ -3,10 +3,11 @@ * ------------------------------------------------------------------------- * * Copyright (c) 2008-2012 Raoul Snyman * * Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan * - * Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, * - * Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias * - * Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, * - * Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund * + * Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, * + * Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan * + * Pettit, Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip * + * Ridout, Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin * + * Thompson, Jon Tibble, Dave Warnock, 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 * diff -Nru openlp-1.9.9/openlp/plugins/remotes/__init__.py openlp-1.9.10/openlp/plugins/remotes/__init__.py --- openlp-1.9.9/openlp/plugins/remotes/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/remotes/lib/httpserver.py openlp-1.9.10/openlp/plugins/remotes/lib/httpserver.py --- openlp-1.9.9/openlp/plugins/remotes/lib/httpserver.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/lib/httpserver.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -122,6 +123,7 @@ from mako.template import Template from openlp.core.lib import Receiver, PluginStatus, StringContent +from openlp.core.lib.settings import Settings from openlp.core.utils import AppLocation, translate log = logging.getLogger(__name__) @@ -169,10 +171,10 @@ clients. Listen out for socket connections. """ log.debug(u'Start TCP server') - port = QtCore.QSettings().value( + port = Settings().value( self.plugin.settingsSection + u'/port', QtCore.QVariant(4316)).toInt()[0] - address = QtCore.QSettings().value( + address = Settings().value( self.plugin.settingsSection + u'/ip address', QtCore.QVariant(u'0.0.0.0')).toString() self.server = QtNetwork.QTcpServer() @@ -290,9 +292,11 @@ 'Slide Controller'), 'alerts': translate('RemotePlugin.Mobile', 'Alerts'), 'search': translate('RemotePlugin.Mobile', 'Search'), - 'back': translate('RemotePlugin.Mobile', 'Back'), + 'home': translate('RemotePlugin.Mobile', 'Home'), 'refresh': translate('RemotePlugin.Mobile', 'Refresh'), 'blank': translate('RemotePlugin.Mobile', 'Blank'), + 'theme': translate('RemotePlugin.Mobile', 'Theme'), + 'desktop': translate('RemotePlugin.Mobile', 'Desktop'), 'show': translate('RemotePlugin.Mobile', 'Show'), 'prev': translate('RemotePlugin.Mobile', 'Prev'), 'next': translate('RemotePlugin.Mobile', 'Next'), @@ -301,6 +305,8 @@ 'go_live': translate('RemotePlugin.Mobile', 'Go Live'), 'add_to_service': translate('RemotePlugin.Mobile', 'Add to Service'), + 'add_and_go_to_service': translate('RemotePlugin.Mobile', + 'Add & Go to Service'), 'no_results': translate('RemotePlugin.Mobile', 'No Results'), 'options': translate('RemotePlugin.Mobile', 'Options') } @@ -396,10 +402,11 @@ Poll OpenLP to determine the current slide number and item name. """ result = { + u'service': self.parent.plugin.serviceManager.serviceId, u'slide': self.parent.current_slide or 0, u'item': self.parent.current_item._uuid \ if self.parent.current_item else u'', - u'twelve':QtCore.QSettings().value( + u'twelve':Settings().value( u'remotes/twelve hour', QtCore.QVariant(True)).toBool(), u'blank': self.parent.plugin.liveController.blankScreen.\ isChecked(), diff -Nru openlp-1.9.9/openlp/plugins/remotes/lib/__init__.py openlp-1.9.10/openlp/plugins/remotes/lib/__init__.py --- openlp-1.9.9/openlp/plugins/remotes/lib/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/lib/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/remotes/lib/remotetab.py openlp-1.9.10/openlp/plugins/remotes/lib/remotetab.py --- openlp-1.9.9/openlp/plugins/remotes/lib/remotetab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/lib/remotetab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,6 +29,7 @@ from PyQt4 import QtCore, QtGui, QtNetwork from openlp.core.lib import SettingsTab, translate, Receiver +from openlp.core.lib.settings import Settings ZERO_URL = u'0.0.0.0' @@ -149,12 +151,12 @@ def load(self): self.portSpinBox.setValue( - QtCore.QSettings().value(self.settingsSection + u'/port', + Settings().value(self.settingsSection + u'/port', QtCore.QVariant(4316)).toInt()[0]) self.addressEdit.setText( - QtCore.QSettings().value(self.settingsSection + u'/ip address', + Settings().value(self.settingsSection + u'/ip address', QtCore.QVariant(ZERO_URL)).toString()) - self.twelveHour = QtCore.QSettings().value( + self.twelveHour = Settings().value( self.settingsSection + u'/twelve hour', QtCore.QVariant(True)).toBool() self.twelveHourCheckBox.setChecked(self.twelveHour) @@ -162,16 +164,16 @@ def save(self): changed = False - if QtCore.QSettings().value(self.settingsSection + u'/ip address', + if Settings().value(self.settingsSection + u'/ip address', QtCore.QVariant(ZERO_URL).toString() != self.addressEdit.text() or - QtCore.QSettings().value(self.settingsSection + u'/port', + Settings().value(self.settingsSection + u'/port', QtCore.QVariant(4316).toInt()[0]) != self.portSpinBox.value()): changed = True - QtCore.QSettings().setValue(self.settingsSection + u'/port', + Settings().setValue(self.settingsSection + u'/port', QtCore.QVariant(self.portSpinBox.value())) - QtCore.QSettings().setValue(self.settingsSection + u'/ip address', + Settings().setValue(self.settingsSection + u'/ip address', QtCore.QVariant(self.addressEdit.text())) - QtCore.QSettings().setValue(self.settingsSection + u'/twelve hour', + Settings().setValue(self.settingsSection + u'/twelve hour', QtCore.QVariant(self.twelveHour)) if changed: Receiver.send_message(u'remotes_config_updated') diff -Nru openlp-1.9.9/openlp/plugins/remotes/remoteplugin.py openlp-1.9.10/openlp/plugins/remotes/remoteplugin.py --- openlp-1.9.9/openlp/plugins/remotes/remoteplugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/remotes/remoteplugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -41,8 +42,8 @@ """ Plugin.__init__(self, u'remotes', plugin_helpers, settings_tab_class=RemoteTab) - self.icon_path = u':/plugins/plugin_remote.png' - self.icon = build_icon(self.icon_path) + self.iconPath = u':/plugins/plugin_remote.png' + self.icon = build_icon(self.iconPath) self.weight = -1 self.server = None diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/authorsdialog.py openlp-1.9.10/openlp/plugins/songs/forms/authorsdialog.py --- openlp-1.9.9/openlp/plugins/songs/forms/authorsdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/authorsdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,10 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import create_accept_reject_button_box +from openlp.core.lib.ui import create_button_box class Ui_AuthorsDialog(object): def setupUi(self, authorsDialog): @@ -57,11 +58,11 @@ self.displayLabel.setBuddy(self.displayEdit) self.authorLayout.addRow(self.displayLabel, self.displayEdit) self.dialogLayout.addLayout(self.authorLayout) - self.dialogLayout.addWidget( - create_accept_reject_button_box(authorsDialog)) + self.buttonBox = create_button_box(authorsDialog, u'buttonBox', + [u'cancel', u'save']) + self.dialogLayout.addWidget(self.buttonBox) self.retranslateUi(authorsDialog) authorsDialog.setMaximumHeight(authorsDialog.sizeHint().height()) - QtCore.QMetaObject.connectSlotsByName(authorsDialog) def retranslateUi(self, authorsDialog): authorsDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/authorsform.py openlp-1.9.10/openlp/plugins/songs/forms/authorsform.py --- openlp-1.9.9/openlp/plugins/songs/forms/authorsform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/authorsform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -57,19 +58,17 @@ self.firstNameEdit.setFocus() return QtGui.QDialog.exec_(self) - def onFirstNameEditTextEdited(self, text): + def onFirstNameEditTextEdited(self, display_name): if not self._autoDisplayName: return - display_name = text - if self.lastNameEdit.text() != u'': + if not self.lastNameEdit.text(): display_name = display_name + u' ' + self.lastNameEdit.text() self.displayEdit.setText(display_name) - def onLastNameEditTextEdited(self, text): + def onLastNameEditTextEdited(self, display_name): if not self._autoDisplayName: return - display_name = text - if self.firstNameEdit.text() != u'': + if not self.firstNameEdit.text(): display_name = self.firstNameEdit.text() + u' ' + display_name self.displayEdit.setText(display_name) diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/editsongdialog.py openlp-1.9.10/openlp/plugins/songs/forms/editsongdialog.py --- openlp-1.9.9/openlp/plugins/songs/forms/editsongdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/editsongdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,8 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, translate -from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box, \ - create_up_down_push_button_set +from openlp.core.lib.ui import UiStrings, create_button_box, create_button from openlp.plugins.songs.lib.ui import SongStrings class Ui_EditSongDialog(object): @@ -69,12 +69,8 @@ self.lyricsLabel.setObjectName(u'lyricsLabel') self.lyricsTabLayout.addWidget(self.lyricsLabel, 2, 0, QtCore.Qt.AlignTop) - self.verseListWidget = QtGui.QTableWidget(self.lyricsTab) - self.verseListWidget.horizontalHeader().setVisible(False) - self.verseListWidget.horizontalHeader().setStretchLastSection(True) - self.verseListWidget.horizontalHeader().setMinimumSectionSize(16) + self.verseListWidget = SingleColumnTableWidget(self.lyricsTab) self.verseListWidget.setAlternatingRowColors(True) - self.verseListWidget.setColumnCount(1) self.verseListWidget.setSelectionBehavior( QtGui.QAbstractItemView.SelectRows) self.verseListWidget.setSelectionMode( @@ -272,8 +268,10 @@ self.audioRemoveAllButton.setObjectName(u'audioRemoveAllButton') self.audioButtonsLayout.addWidget(self.audioRemoveAllButton) self.audioButtonsLayout.addStretch(1) - self.upButton, self.downButton = \ - create_up_down_push_button_set(self) + self.upButton = create_button(self, u'upButton', role=u'up', + click=self.onUpButtonClicked) + self.downButton = create_button(self, u'downButton', role=u'down', + click=self.onDownButtonClicked) self.audioButtonsLayout.addWidget(self.upButton) self.audioButtonsLayout.addWidget(self.downButton) self.audioLayout.addLayout(self.audioButtonsLayout) @@ -286,11 +284,11 @@ self.warningLabel.setObjectName(u'warningLabel') self.warningLabel.setVisible(False) self.bottomLayout.addWidget(self.warningLabel) - self.buttonBox = create_accept_reject_button_box(editSongDialog) + self.buttonBox = create_button_box(editSongDialog, u'buttonBox', + [u'cancel', u'save']) self.bottomLayout.addWidget(self.buttonBox) self.dialogLayout.addLayout(self.bottomLayout) self.retranslateUi(editSongDialog) - QtCore.QMetaObject.connectSlotsByName(editSongDialog) def retranslateUi(self, editSongDialog): editSongDialog.setWindowTitle( @@ -373,3 +371,24 @@ comboBox.setInsertPolicy(QtGui.QComboBox.NoInsert) comboBox.setObjectName(name) return comboBox + +class SingleColumnTableWidget(QtGui.QTableWidget): + """ + Class to for a single column table widget to use for the verse table widget. + """ + def __init__(self, parent): + """ + Constructor + """ + QtGui.QTableWidget.__init__(self, parent) + self.horizontalHeader().setVisible(False) + self.setColumnCount(1) + + def resizeEvent(self, event): + """ + Resize the first column together with the widget. + """ + QtGui.QTableWidget.resizeEvent(self, event) + if self.columnCount(): + self.setColumnWidth(0, event.size().width()) + self.resizeRowsToContents() diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/editsongform.py openlp-1.9.10/openlp/plugins/songs/forms/editsongform.py --- openlp-1.9.9/openlp/plugins/songs/forms/editsongform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/editsongform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -34,7 +35,7 @@ from openlp.core.lib import PluginStatus, Receiver, MediaType, translate, \ create_separated_list -from openlp.core.lib.ui import UiStrings, add_widget_completer, \ +from openlp.core.lib.ui import UiStrings, set_case_insensitive_completer, \ critical_error_message_box, find_and_set_in_combo_box from openlp.core.utils import AppLocation from openlp.plugins.songs.forms import EditVerseForm, MediaFilesForm @@ -68,14 +69,14 @@ QtCore.SIGNAL(u'clicked()'), self.onAuthorRemoveButtonClicked) QtCore.QObject.connect(self.authorsListView, QtCore.SIGNAL(u'itemClicked(QListWidgetItem*)'), - self.onAuthorsListViewPressed) + self.onAuthorsListViewClicked) QtCore.QObject.connect(self.topicAddButton, QtCore.SIGNAL(u'clicked()'), self.onTopicAddButtonClicked) QtCore.QObject.connect(self.topicRemoveButton, QtCore.SIGNAL(u'clicked()'), self.onTopicRemoveButtonClicked) QtCore.QObject.connect(self.topicsListView, QtCore.SIGNAL(u'itemClicked(QListWidgetItem*)'), - self.onTopicListViewPressed) + self.onTopicListViewClicked) QtCore.QObject.connect(self.copyrightInsertButton, QtCore.SIGNAL(u'clicked()'), self.onCopyrightInsertButtonTriggered) QtCore.QObject.connect(self.verseAddButton, @@ -91,13 +92,13 @@ QtCore.SIGNAL(u'clicked()'), self.onVerseDeleteButtonClicked) QtCore.QObject.connect(self.verseListWidget, QtCore.SIGNAL(u'itemClicked(QTableWidgetItem*)'), - self.onVerseListViewPressed) + self.onVerseListViewClicked) QtCore.QObject.connect(self.verseOrderEdit, QtCore.SIGNAL(u'textChanged(QString)'), self.onVerseOrderTextChanged) QtCore.QObject.connect(self.themeAddButton, QtCore.SIGNAL(u'clicked()'), - self.mediaitem.plugin.renderer.themeManager.onAddTheme) + self.mediaitem.plugin.renderer.theme_manager.onAddTheme) QtCore.QObject.connect(self.maintenanceButton, QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked) QtCore.QObject.connect(self.audioAddFromFileButton, @@ -148,7 +149,7 @@ self.authorsComboBox.setItemData( row, QtCore.QVariant(author.id)) self.authors.append(author.display_name) - add_widget_completer(self.authors, self.authorsComboBox) + set_case_insensitive_completer(self.authors, self.authorsComboBox) def loadTopics(self): self.topics = [] @@ -167,22 +168,19 @@ combo.addItem(object.name) cache.append(object.name) combo.setItemData(row, QtCore.QVariant(object.id)) - add_widget_completer(cache, combo) + set_case_insensitive_completer(cache, combo) def loadThemes(self, theme_list): self.themeComboBox.clear() self.themeComboBox.addItem(u'') - self.themes = [] - for theme in theme_list: - self.themeComboBox.addItem(theme) - self.themes.append(theme) - add_widget_completer(self.themes, self.themeComboBox) + self.themes = theme_list + self.themeComboBox.addItems(theme_list) + set_case_insensitive_completer(self.themes, self.themeComboBox) def loadMediaFiles(self): self.audioAddFromMediaButton.setVisible(False) for plugin in self.parent().pluginManager.plugins: - if plugin.name == u'media' and \ - plugin.status == PluginStatus.Active: + if plugin.name == u'media' and plugin.status == PluginStatus.Active: self.audioAddFromMediaButton.setVisible(True) self.mediaForm.populateFiles( plugin.mediaItem.getList(MediaType.Audio)) @@ -193,19 +191,19 @@ self.song = None self.initialise() self.songTabWidget.setCurrentIndex(0) - self.titleEdit.setText(u'') - self.alternativeEdit.setText(u'') - self.copyrightEdit.setText(u'') - self.verseOrderEdit.setText(u'') - self.commentsEdit.setText(u'') - self.CCLNumberEdit.setText(u'') + self.titleEdit.clear() + self.alternativeEdit.clear() + self.copyrightEdit.clear() + self.verseOrderEdit.clear() + self.commentsEdit.clear() + self.CCLNumberEdit.clear() self.verseListWidget.clear() self.verseListWidget.setRowCount(0) self.authorsListView.clear() self.topicsListView.clear() self.audioListWidget.clear() self.titleEdit.setFocus(QtCore.Qt.OtherFocusReason) - self.songBookNumberEdit.setText(u'') + self.songBookNumberEdit.clear() self.loadAuthors() self.loadTopics() self.loadBooks() @@ -233,10 +231,8 @@ self.loadMediaFiles() self.song = self.manager.get_object(Song, id) self.titleEdit.setText(self.song.title) - if self.song.alternate_title: - self.alternativeEdit.setText(self.song.alternate_title) - else: - self.alternativeEdit.setText(u'') + self.alternativeEdit.setText( + self.song.alternate_title if self.song.alternate_title else u'') if self.song.song_book_id != 0: book_name = self.manager.get_object(Book, self.song.song_book_id) find_and_set_in_combo_box( @@ -244,24 +240,14 @@ if self.song.theme_name: find_and_set_in_combo_box( self.themeComboBox, unicode(self.song.theme_name)) - if self.song.copyright: - self.copyrightEdit.setText(self.song.copyright) - else: - self.copyrightEdit.setText(u'') - self.verseListWidget.clear() - self.verseListWidget.setRowCount(0) - if self.song.comments: - self.commentsEdit.setPlainText(self.song.comments) - else: - self.commentsEdit.setPlainText(u'') - if self.song.ccli_number: - self.CCLNumberEdit.setText(self.song.ccli_number) - else: - self.CCLNumberEdit.setText(u'') - if self.song.song_number: - self.songBookNumberEdit.setText(self.song.song_number) - else: - self.songBookNumberEdit.setText(u'') + self.copyrightEdit.setText( + self.song.copyright if self.song.copyright else u'') + self.commentsEdit.setPlainText( + self.song.comments if self.song.comments else u'') + self.CCLNumberEdit.setText( + self.song.ccli_number if self.song.ccli_number else u'') + self.songBookNumberEdit.setText( + self.song.song_number if self.song.song_number else u'') # lazy xml migration for now self.verseListWidget.clear() self.verseListWidget.setRowCount(0) @@ -271,8 +257,8 @@ verse_tags_translated = False if self.song.lyrics.startswith(u' 1: self.authorRemoveButton.setEnabled(True) @@ -463,7 +448,7 @@ 'type in a new topic and click the "Add Topic to Song" ' 'button to add the new topic.')) - def onTopicListViewPressed(self): + def onTopicListViewClicked(self): self.topicRemoveButton.setEnabled(True) def onTopicRemoveButtonClicked(self): @@ -472,7 +457,7 @@ row = self.topicsListView.row(item) self.topicsListView.takeItem(row) - def onVerseListViewPressed(self): + def onVerseListViewClicked(self): self.verseEditButton.setEnabled(True) self.verseDeleteButton.setEnabled(True) @@ -489,38 +474,41 @@ self.verseListWidget.setItem( self.verseListWidget.rowCount() - 1, 0, item) self.tagRows() + # Check if all verse tags are used. + self.onVerseOrderTextChanged(self.verseOrderEdit.text()) def onVerseEditButtonClicked(self): item = self.verseListWidget.currentItem() if item: - tempText = item.text() - verseId = unicode(item.data(QtCore.Qt.UserRole).toString()) - self.verseForm.setVerse(tempText, True, verseId) + temp_text = item.text() + verse_id = unicode(item.data(QtCore.Qt.UserRole).toString()) + self.verseForm.setVerse(temp_text, True, verse_id) if self.verseForm.exec_(): after_text, verse_tag, verse_num = self.verseForm.getVerse() verse_def = u'%s%s' % (verse_tag, verse_num) item.setData(QtCore.Qt.UserRole, QtCore.QVariant(verse_def)) item.setText(after_text) # number of lines has changed, repaint the list moving the data - if len(tempText.split(u'\n')) != len(after_text.split(u'\n')): - tempList = {} - tempId = {} - for row in range(0, self.verseListWidget.rowCount()): - tempList[row] = self.verseListWidget.item(row, 0)\ - .text() - tempId[row] = self.verseListWidget.item(row, 0)\ - .data(QtCore.Qt.UserRole) + if len(temp_text.split(u'\n')) != len(after_text.split(u'\n')): + temp_list = [] + temp_ids = [] + for row in range(self.verseListWidget.rowCount()): + item = self.verseListWidget.item(row, 0) + temp_list.append(item.text()) + temp_ids.append(item.data(QtCore.Qt.UserRole)) self.verseListWidget.clear() - for row in range (0, len(tempList)): - item = QtGui.QTableWidgetItem(tempList[row], 0) - item.setData(QtCore.Qt.UserRole, tempId[row]) + for row, entry in enumerate(temp_list): + item = QtGui.QTableWidgetItem(entry, 0) + item.setData(QtCore.Qt.UserRole, temp_ids[row]) self.verseListWidget.setItem(row, 0, item) self.tagRows() + # Check if all verse tags are used. + self.onVerseOrderTextChanged(self.verseOrderEdit.text()) def onVerseEditAllButtonClicked(self): verse_list = u'' if self.verseListWidget.rowCount() > 0: - for row in range(0, self.verseListWidget.rowCount()): + for row in range(self.verseListWidget.rowCount()): item = self.verseListWidget.item(row, 0) field = unicode(item.data(QtCore.Qt.UserRole).toString()) verse_tag = VerseType.translated_name(field[0]) @@ -575,6 +563,8 @@ self.tagRows() self.verseEditButton.setEnabled(False) self.verseDeleteButton.setEnabled(False) + # Check if all verse tags are used. + self.onVerseOrderTextChanged(self.verseOrderEdit.text()) def onVerseDeleteButtonClicked(self): self.verseListWidget.removeRow(self.verseListWidget.currentRow()) @@ -586,7 +576,7 @@ verses = [] verse_names = [] order = self.__extractVerseOrder(text) - for index in range(0, self.verseListWidget.rowCount()): + for index in range(self.verseListWidget.rowCount()): verse = self.verseListWidget.item(index, 0) verse = unicode(verse.data(QtCore.Qt.UserRole).toString()) if verse not in verse_names: @@ -627,7 +617,7 @@ verse_names = [] order_names = unicode(verse_order).split() order = self.__extractVerseOrder(verse_order) - for index in range(0, verse_count): + for index in range(verse_count): verse = self.verseListWidget.item(index, 0) verse = unicode(verse.data(QtCore.Qt.UserRole).toString()) if verse not in verse_names: @@ -714,7 +704,7 @@ text = unicode(self.songBookComboBox.currentText()) if item == 0 and text: temp_song_book = text - self.mediaitem.songMaintenanceForm.exec_() + self.mediaitem.songMaintenanceForm.exec_(True) self.loadAuthors() self.loadBooks() self.loadTopics() @@ -723,7 +713,7 @@ def onPreview(self, button): """ - Save and Preview button pressed. + Save and Preview button clicked. The Song is valid so as the plugin to add it to preview to see. ``button`` @@ -872,12 +862,16 @@ for row in xrange(self.authorsListView.count()): item = self.authorsListView.item(row) authorId = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.song.authors.append(self.manager.get_object(Author, authorId)) + author = self.manager.get_object(Author, authorId) + if author is not None: + self.song.authors.append(author) self.song.topics = [] for row in xrange(self.topicsListView.count()): item = self.topicsListView.item(row) topicId = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.song.topics.append(self.manager.get_object(Topic, topicId)) + topic = self.manager.get_object(Topic, topicId) + if topic is not None: + self.song.topics.append(topic) # Save the song here because we need a valid id for the audio files. clean_song(self.manager, self.song) self.manager.save_object(self.song) @@ -927,11 +921,11 @@ try: sxml = SongXML() multiple = [] - for i in range(0, self.verseListWidget.rowCount()): + for i in range(self.verseListWidget.rowCount()): item = self.verseListWidget.item(i, 0) - verseId = unicode(item.data(QtCore.Qt.UserRole).toString()) - verse_tag = verseId[0] - verse_num = verseId[1:] + verse_id = unicode(item.data(QtCore.Qt.UserRole).toString()) + verse_tag = verse_id[0] + verse_num = verse_id[1:] sxml.add_verse_to_lyrics(verse_tag, verse_num, unicode(item.text())) if verse_num > u'1' and verse_tag not in multiple: diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/editversedialog.py openlp-1.9.10/openlp/plugins/songs/forms/editversedialog.py --- openlp-1.9.9/openlp/plugins/songs/forms/editversedialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/editversedialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,10 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import build_icon, translate, SpellTextEdit -from openlp.core.lib.ui import create_accept_reject_button_box, UiStrings +from openlp.core.lib.ui import create_button_box, UiStrings from openlp.plugins.songs.lib import VerseType class Ui_EditVerseDialog(object): @@ -65,10 +66,10 @@ self.verseTypeLayout.addWidget(self.insertButton) self.verseTypeLayout.addStretch() self.dialogLayout.addLayout(self.verseTypeLayout) - self.dialogLayout.addWidget( - create_accept_reject_button_box(editVerseDialog)) + self.buttonBox = create_button_box(editVerseDialog, u'buttonBox', + [u'cancel', u'save']) + self.dialogLayout.addWidget(self.buttonBox) self.retranslateUi(editVerseDialog) - QtCore.QMetaObject.connectSlotsByName(editVerseDialog) def retranslateUi(self, editVerseDialog): editVerseDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/editverseform.py openlp-1.9.10/openlp/plugins/songs/forms/editverseform.py --- openlp-1.9.9/openlp/plugins/songs/forms/editverseform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/editverseform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -75,10 +76,14 @@ self.verseTextEdit.setFocus() def onSplitButtonClicked(self): - verse_type_index = self.verseTypeComboBox.currentIndex() - if self.verseTextEdit.textCursor().columnNumber() != 0: - self.verseTextEdit.insertPlainText(u'\n') - self.verseTextEdit.insertPlainText(u'[---]') + text = self.verseTextEdit.toPlainText() + position = self.verseTextEdit.textCursor().position() + insert_string = u'[---]' + if position and text[position-1] != u'\n': + insert_string = u'\n' + insert_string + if position == len(text) or text[position] != u'\n': + insert_string += u'\n' + self.verseTextEdit.insertPlainText(insert_string) self.verseTextEdit.setFocus() def onInsertButtonClicked(self): @@ -113,8 +118,7 @@ verse_num = int(match.group(2)) except ValueError: verse_num = 1 - verse_type_index = VerseType.from_loose_input(verse_tag, None) - if verse_type_index is not None: + if VerseType.from_loose_input(verse_tag, False): self.verseNumberBox.setValue(verse_num) def onCursorPositionChanged(self): @@ -188,13 +192,13 @@ else: log.debug(unicode(self.getVerse()[0]).split(u'\n')) value = unicode(self.getVerse()[0]).split(u'\n')[1] - if len(value) == 0: + if not value: lines = unicode(self.getVerse()[0]).split(u'\n') index = 2 - while index < len(lines) and len(value) == 0: + while index < len(lines) and not value: value = lines[index] index += 1 - if len(value) == 0: + if not value: critical_error_message_box( message=translate('SongsPlugin.EditSongForm', 'You need to type some text in to the verse.')) diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/__init__.py openlp-1.9.10/openlp/plugins/songs/forms/__init__.py --- openlp-1.9.9/openlp/plugins/songs/forms/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/mediafilesdialog.py openlp-1.9.10/openlp/plugins/songs/forms/mediafilesdialog.py --- openlp-1.9.9/openlp/plugins/songs/forms/mediafilesdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/mediafilesdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,6 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate, build_icon +from openlp.core.lib.ui import create_button_box class Ui_MediaFilesDialog(object): def setupUi(self, mediaFilesDialog): @@ -51,19 +53,11 @@ QtGui.QAbstractItemView.ExtendedSelection) self.fileListWidget.setObjectName(u'fileListWidget') self.filesVerticalLayout.addWidget(self.fileListWidget) - self.buttonBox = QtGui.QDialogButtonBox(mediaFilesDialog) - self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons( - QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName(u'buttonBox') + self.buttonBox = create_button_box(mediaFilesDialog, u'buttonBox', + [u'cancel', u'ok']) self.filesVerticalLayout.addWidget(self.buttonBox) self.retranslateUi(mediaFilesDialog) - QtCore.QObject.connect(self.buttonBox, - QtCore.SIGNAL(u'accepted()'), mediaFilesDialog.accept) - QtCore.QObject.connect(self.buttonBox, - QtCore.SIGNAL(u'rejected()'), mediaFilesDialog.reject) - QtCore.QMetaObject.connectSlotsByName(mediaFilesDialog) def retranslateUi(self, mediaFilesDialog): mediaFilesDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/mediafilesform.py openlp-1.9.10/openlp/plugins/songs/forms/mediafilesform.py --- openlp-1.9.9/openlp/plugins/songs/forms/mediafilesform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/mediafilesform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/songbookdialog.py openlp-1.9.10/openlp/plugins/songs/forms/songbookdialog.py --- openlp-1.9.9/openlp/plugins/songs/forms/songbookdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/songbookdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,10 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import create_accept_reject_button_box +from openlp.core.lib.ui import create_button_box class Ui_SongBookDialog(object): def setupUi(self, songBookDialog): @@ -51,11 +52,11 @@ self.publisherLabel.setBuddy(self.publisherEdit) self.bookLayout.addRow(self.publisherLabel, self.publisherEdit) self.dialogLayout.addLayout(self.bookLayout) - self.dialogLayout.addWidget( - create_accept_reject_button_box(songBookDialog)) + self.buttonBox = create_button_box(songBookDialog, u'buttonBox', + [u'cancel', u'save']) + self.dialogLayout.addWidget(self.buttonBox) self.retranslateUi(songBookDialog) songBookDialog.setMaximumHeight(songBookDialog.sizeHint().height()) - QtCore.QMetaObject.connectSlotsByName(songBookDialog) def retranslateUi(self, songBookDialog): songBookDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/songbookform.py openlp-1.9.10/openlp/plugins/songs/forms/songbookform.py --- openlp-1.9.9/openlp/plugins/songs/forms/songbookform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/songbookform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/songexportform.py openlp-1.9.10/openlp/plugins/songs/forms/songexportform.py --- openlp-1.9.9/openlp/plugins/songs/forms/songexportform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/songexportform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -90,7 +91,7 @@ """ QtCore.QObject.connect(self.availableListWidget, QtCore.SIGNAL(u'itemActivated(QListWidgetItem*)'), - self.onItemPressed) + self.onItemActivated) QtCore.QObject.connect(self.searchLineEdit, QtCore.SIGNAL(u'textEdited(const QString&)'), self.onSearchLineEditChanged) @@ -312,14 +313,14 @@ QtCore.QString(unicode(text)), QtCore.Qt.MatchContains) ] - def onItemPressed(self, item): + def onItemActivated(self, item): """ - Called, when an item in the *availableListWidget* has been pressed. Thes - item is check if it was not checked, whereas it is unchecked when it was - checked. + Called, when an item in the *availableListWidget* has been triggered. + The item is check if it was not checked, whereas it is unchecked when it + was checked. ``item`` - The *QListWidgetItem* which was pressed. + The *QListWidgetItem* which was triggered. """ item.setCheckState( QtCore.Qt.Unchecked if item.checkState() else QtCore.Qt.Checked) @@ -363,11 +364,5 @@ Called when the *directoryButton* was clicked. Opens a dialog and writes the path to *directoryLineEdit*. """ - path = unicode(QtGui.QFileDialog.getExistingDirectory(self, - 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) - self.directoryLineEdit.setText(path) - + self.getFolder(translate('SongsPlugin.ExportWizardForm', + 'Select Destination Folder'), self.directoryLineEdit) diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/songimportform.py openlp-1.9.10/openlp/plugins/songs/forms/songimportform.py --- openlp-1.9.9/openlp/plugins/songs/forms/songimportform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/songimportform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -35,8 +36,9 @@ from openlp.core.lib import Receiver, SettingsManager, translate from openlp.core.lib.ui import UiStrings, critical_error_message_box +from openlp.core.lib.settings import Settings from openlp.core.ui.wizard import OpenLPWizard, WizardStrings -from openlp.plugins.songs.lib.importer import SongFormat +from openlp.plugins.songs.lib.importer import SongFormat, SongFormatSelect log = logging.getLogger(__name__) @@ -57,7 +59,7 @@ ``plugin`` The songs plugin. """ - self.clipboard = plugin.formparent.clipboard + self.clipboard = plugin.formParent.clipboard OpenLPWizard.__init__(self, parent, plugin, u'songImportWizard', u':/wizards/wizard_importsong.bmp') @@ -65,113 +67,59 @@ """ Set up the song wizard UI. """ + self.formatWidgets = dict([(format, {}) for format in + SongFormat.get_format_list()]) OpenLPWizard.setupUi(self, image) - self.formatStack.setCurrentIndex(0) + self.currentFormat = SongFormat.OpenLyrics + self.formatStack.setCurrentIndex(self.currentFormat) QtCore.QObject.connect(self.formatComboBox, QtCore.SIGNAL(u'currentIndexChanged(int)'), self.onCurrentIndexChanged) def onCurrentIndexChanged(self, index): """ - Called when the format combo box's index changed. We have to check if - the import is available and accordingly to disable or enable the next - button. + Called when the format combo box's index changed. """ + self.currentFormat = index self.formatStack.setCurrentIndex(index) - next_button = self.button(QtGui.QWizard.NextButton) - next_button.setEnabled(SongFormat.get_availability(index)) + self.sourcePage.emit(QtCore.SIGNAL(u'completeChanged()')) def customInit(self): """ Song wizard specific initialisation. """ - if not SongFormat.get_availability(SongFormat.OpenLP1): - self.openLP1DisabledWidget.setVisible(True) - self.openLP1ImportWidget.setVisible(False) - if not SongFormat.get_availability(SongFormat.SongsOfFellowship): - self.songsOfFellowshipDisabledWidget.setVisible(True) - self.songsOfFellowshipImportWidget.setVisible(False) - if not SongFormat.get_availability(SongFormat.Generic): - self.genericDisabledWidget.setVisible(True) - self.genericImportWidget.setVisible(False) + for format in SongFormat.get_format_list(): + if not SongFormat.get(format, u'availability'): + self.formatWidgets[format][u'disabledWidget'].setVisible(True) + self.formatWidgets[format][u'importWidget'].setVisible(False) def customSignals(self): """ Song wizard specific signals. """ - QtCore.QObject.connect(self.openLP2BrowseButton, - QtCore.SIGNAL(u'clicked()'), - self.onOpenLP2BrowseButtonClicked) - QtCore.QObject.connect(self.openLP1BrowseButton, - QtCore.SIGNAL(u'clicked()'), - self.onOpenLP1BrowseButtonClicked) - QtCore.QObject.connect(self.openLyricsAddButton, - QtCore.SIGNAL(u'clicked()'), - self.onOpenLyricsAddButtonClicked) - QtCore.QObject.connect(self.openLyricsRemoveButton, - QtCore.SIGNAL(u'clicked()'), - self.onOpenLyricsRemoveButtonClicked) - QtCore.QObject.connect(self.openSongAddButton, - QtCore.SIGNAL(u'clicked()'), - self.onOpenSongAddButtonClicked) - QtCore.QObject.connect(self.openSongRemoveButton, - QtCore.SIGNAL(u'clicked()'), - self.onOpenSongRemoveButtonClicked) - QtCore.QObject.connect(self.wordsOfWorshipAddButton, - QtCore.SIGNAL(u'clicked()'), - self.onWordsOfWorshipAddButtonClicked) - QtCore.QObject.connect(self.wordsOfWorshipRemoveButton, - QtCore.SIGNAL(u'clicked()'), - self.onWordsOfWorshipRemoveButtonClicked) - QtCore.QObject.connect(self.ccliAddButton, - QtCore.SIGNAL(u'clicked()'), - self.onCCLIAddButtonClicked) - QtCore.QObject.connect(self.ccliRemoveButton, - QtCore.SIGNAL(u'clicked()'), - self.onCCLIRemoveButtonClicked) - QtCore.QObject.connect(self.songsOfFellowshipAddButton, - QtCore.SIGNAL(u'clicked()'), - self.onSongsOfFellowshipAddButtonClicked) - QtCore.QObject.connect(self.songsOfFellowshipRemoveButton, - QtCore.SIGNAL(u'clicked()'), - self.onSongsOfFellowshipRemoveButtonClicked) - QtCore.QObject.connect(self.genericAddButton, - QtCore.SIGNAL(u'clicked()'), - self.onGenericAddButtonClicked) - QtCore.QObject.connect(self.genericRemoveButton, - QtCore.SIGNAL(u'clicked()'), - self.onGenericRemoveButtonClicked) - QtCore.QObject.connect(self.easySlidesBrowseButton, - QtCore.SIGNAL(u'clicked()'), - self.onEasySlidesBrowseButtonClicked) - QtCore.QObject.connect(self.ewBrowseButton, - QtCore.SIGNAL(u'clicked()'), - self.onEWBrowseButtonClicked) - QtCore.QObject.connect(self.songBeamerAddButton, - QtCore.SIGNAL(u'clicked()'), - self.onSongBeamerAddButtonClicked) - QtCore.QObject.connect(self.songBeamerRemoveButton, - QtCore.SIGNAL(u'clicked()'), - self.onSongBeamerRemoveButtonClicked) - QtCore.QObject.connect(self.songShowPlusAddButton, - QtCore.SIGNAL(u'clicked()'), - self.onSongShowPlusAddButtonClicked) - QtCore.QObject.connect(self.songShowPlusRemoveButton, - QtCore.SIGNAL(u'clicked()'), - self.onSongShowPlusRemoveButtonClicked) - QtCore.QObject.connect(self.foilPresenterAddButton, - QtCore.SIGNAL(u'clicked()'), - self.onFoilPresenterAddButtonClicked) - QtCore.QObject.connect(self.foilPresenterRemoveButton, - QtCore.SIGNAL(u'clicked()'), - self.onFoilPresenterRemoveButtonClicked) + for format in SongFormat.get_format_list(): + select_mode = SongFormat.get(format, u'selectMode') + if select_mode == SongFormatSelect.MultipleFiles: + QtCore.QObject.connect(self.formatWidgets[format][u'addButton'], + QtCore.SIGNAL(u'clicked()'), self.onAddButtonClicked) + QtCore.QObject.connect( + self.formatWidgets[format][u'removeButton'], + QtCore.SIGNAL(u'clicked()'), self.onRemoveButtonClicked) + else: + QtCore.QObject.connect( + self.formatWidgets[format][u'browseButton'], + QtCore.SIGNAL(u'clicked()'), self.onBrowseButtonClicked) + QtCore.QObject.connect( + self.formatWidgets[format][u'filepathEdit'], + QtCore.SIGNAL(u'textChanged (const QString&)'), + self.onFilepathEditTextChanged) def addCustomPages(self): """ Add song wizard specific pages. """ # Source Page - self.sourcePage = QtGui.QWizardPage() + self.sourcePage = SongImportSourcePage() self.sourcePage.setObjectName(u'SourcePage') self.sourceLayout = QtGui.QVBoxLayout(self.sourcePage) self.sourceLayout.setObjectName(u'SourceLayout') @@ -187,38 +135,16 @@ self.formatLayout.setItem(1, QtGui.QFormLayout.LabelRole, self.formatSpacer) self.sourceLayout.addLayout(self.formatLayout) + self.formatHSpacing = self.formatLayout.horizontalSpacing() + self.formatVSpacing = self.formatLayout.verticalSpacing() + self.formatLayout.setVerticalSpacing(0) self.stackSpacer = QtGui.QSpacerItem(10, 0, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Expanding) self.formatStack = QtGui.QStackedLayout() self.formatStack.setObjectName(u'FormatStack') - # OpenLyrics - self.addFileSelectItem(u'openLyrics', u'OpenLyrics', True) - # OpenLP 2.0 - self.addFileSelectItem(u'openLP2', single_select=True) - # openlp.org 1.x - self.addFileSelectItem(u'openLP1', None, True, True) - # Generic Document/Presentation import - self.addFileSelectItem(u'generic', None, True) - # CCLI File import - self.addFileSelectItem(u'ccli') - # EasySlides - self.addFileSelectItem(u'easySlides', single_select=True) - # EasyWorship - self.addFileSelectItem(u'ew', single_select=True) - # Foilpresenter - self.addFileSelectItem(u'foilPresenter') - # Open Song - self.addFileSelectItem(u'openSong', u'OpenSong') - # SongBeamer - self.addFileSelectItem(u'songBeamer') - # Song Show Plus - self.addFileSelectItem(u'songShowPlus') - # Songs of Fellowship - self.addFileSelectItem(u'songsOfFellowship', None, True) - # Words of Worship - self.addFileSelectItem(u'wordsOfWorship') -# Commented out for future use. -# self.addFileSelectItem(u'csv', u'CSV', single_select=True) + self.disablableFormats = [] + for self.currentFormat in SongFormat.get_format_list(): + self.addFileSelectItem() self.sourceLayout.addLayout(self.formatStack) self.addPage(self.sourcePage) @@ -232,102 +158,38 @@ translate('OpenLP.Ui', 'Welcome to the Song Import Wizard')) self.informationLabel.setText( translate('SongsPlugin.ImportWizardForm', - '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.')) self.sourcePage.setTitle(WizardStrings.ImportSelect) self.sourcePage.setSubTitle(WizardStrings.ImportSelectLong) self.formatLabel.setText(WizardStrings.FormatLabel) - self.formatComboBox.setItemText(SongFormat.OpenLyrics, - translate('SongsPlugin.ImportWizardForm', - 'OpenLyrics or OpenLP 2.0 Exported Song')) - self.formatComboBox.setItemText(SongFormat.OpenLP2, UiStrings().OLPV2) - self.formatComboBox.setItemText(SongFormat.OpenLP1, UiStrings().OLPV1) - self.formatComboBox.setItemText(SongFormat.Generic, - translate('SongsPlugin.ImportWizardForm', - 'Generic Document/Presentation')) - self.formatComboBox.setItemText(SongFormat.CCLI, WizardStrings.CCLI) - self.formatComboBox.setItemText( - SongFormat.EasySlides, WizardStrings.ES) - self.formatComboBox.setItemText( - SongFormat.EasyWorship, WizardStrings.EW) - self.formatComboBox.setItemText( - SongFormat.FoilPresenter, WizardStrings.FP) - self.formatComboBox.setItemText(SongFormat.OpenSong, WizardStrings.OS) - self.formatComboBox.setItemText( - SongFormat.SongBeamer, WizardStrings.SB) - self.formatComboBox.setItemText( - SongFormat.SongShowPlus, WizardStrings.SSP) - self.formatComboBox.setItemText( - SongFormat.SongsOfFellowship, WizardStrings.SoF) - self.formatComboBox.setItemText( - SongFormat.WordsOfWorship, WizardStrings.WoW) -# self.formatComboBox.setItemText(SongFormat.CSV, WizardStrings.CSV) - self.openLP2FilenameLabel.setText( - translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.openLP2BrowseButton.setText(UiStrings().Browse) - self.openLP1FilenameLabel.setText( - translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.openLP1BrowseButton.setText(UiStrings().Browse) - self.openLP1DisabledLabel.setText(WizardStrings.NoSqlite) - self.openLyricsAddButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Add Files...')) - self.openLyricsRemoveButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) - self.openLyricsDisabledLabel.setText( - translate('SongsPlugin.ImportWizardForm', '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.')) - self.openSongAddButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Add Files...')) - self.openSongRemoveButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) - self.wordsOfWorshipAddButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Add Files...')) - self.wordsOfWorshipRemoveButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) - self.ccliAddButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Add Files...')) - self.ccliRemoveButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) - self.songsOfFellowshipAddButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Add Files...')) - self.songsOfFellowshipRemoveButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) - self.songsOfFellowshipDisabledLabel.setText( - translate('SongsPlugin.ImportWizardForm', 'The Songs of ' - 'Fellowship importer has been disabled because OpenLP cannot ' - 'access OpenOffice or LibreOffice.')) - self.genericAddButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Add Files...')) - self.genericRemoveButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) - self.genericDisabledLabel.setText( - translate('SongsPlugin.ImportWizardForm', 'The generic document/' - 'presentation importer has been disabled because OpenLP cannot ' - 'access OpenOffice or LibreOffice.')) - self.easySlidesFilenameLabel.setText( - translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.easySlidesBrowseButton.setText(UiStrings().Browse) - self.ewFilenameLabel.setText( - translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.ewBrowseButton.setText(UiStrings().Browse) - self.songBeamerAddButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Add Files...')) - self.songBeamerRemoveButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) - self.songShowPlusAddButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Add Files...')) - self.songShowPlusRemoveButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) - self.foilPresenterAddButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Add Files...')) - self.foilPresenterRemoveButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) -# self.csvFilenameLabel.setText( -# translate('SongsPlugin.ImportWizardForm', 'Filename:')) -# self.csvBrowseButton.setText(UiStrings().Browse) + for format in SongFormat.get_format_list(): + format_name, custom_combo_text, description_text, select_mode = \ + SongFormat.get(format, u'name', u'comboBoxText', + u'descriptionText', u'selectMode') + combo_box_text = (custom_combo_text if custom_combo_text else + format_name) + self.formatComboBox.setItemText(format, combo_box_text) + if description_text is not None: + self.formatWidgets[format][u'descriptionLabel'].setText( + description_text) + if select_mode == SongFormatSelect.MultipleFiles: + self.formatWidgets[format][u'addButton'].setText( + translate('SongsPlugin.ImportWizardForm', 'Add Files...')) + self.formatWidgets[format][u'removeButton'].setText( + translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) + else: + self.formatWidgets[format][u'browseButton'].setText( + UiStrings().Browse) + f_label = 'Filename:' + if select_mode == SongFormatSelect.SingleFolder: + f_label = 'Folder:' + self.formatWidgets[format][u'filepathLabel'].setText( + translate('SongsPlugin.ImportWizardForm', f_label)) + for format in self.disablableFormats: + self.formatWidgets[format][u'disabledLabel'].setText( + SongFormat.get(format, u'disabledLabelText')) self.progressPage.setTitle(WizardStrings.Importing) self.progressPage.setSubTitle( translate('SongsPlugin.ImportWizardForm', @@ -339,14 +201,29 @@ self.errorSaveToButton.setText(translate('SongsPlugin.ImportWizardForm', 'Save to File')) # Align all QFormLayouts towards each other. - width = max(self.formatLabel.minimumSizeHint().width(), - self.openLP2FilenameLabel.minimumSizeHint().width()) - self.formatSpacer.changeSize(width, 0, QtGui.QSizePolicy.Fixed, - QtGui.QSizePolicy.Fixed) + formats = filter(lambda f: u'filepathLabel' in self.formatWidgets[f], + SongFormat.get_format_list()) + labels = [self.formatWidgets[f][u'filepathLabel'] for f in formats] + # Get max width of all labels + max_label_width = max(self.formatLabel.minimumSizeHint().width(), + max([label.minimumSizeHint().width() for label in labels])) + self.formatSpacer.changeSize(max_label_width, 0, + QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + spacers = [self.formatWidgets[f][u'filepathSpacer'] for f in formats] + for index, spacer in enumerate(spacers): + spacer.changeSize( + max_label_width - labels[index].minimumSizeHint().width(), 0, + QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + # Align descriptionLabels with rest of layout + for format in SongFormat.get_format_list(): + if SongFormat.get(format, u'descriptionText') is not None: + self.formatWidgets[format][u'descriptionSpacer'].changeSize( + max_label_width + self.formatHSpacing, 0, + QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) def customPageChanged(self, pageId): """ - Called when changing to a page other than the progress page + Called when changing to a page other than the progress page. """ if self.page(pageId) == self.sourcePage: self.onCurrentIndexChanged(self.formatStack.currentIndex()) @@ -354,93 +231,32 @@ def validateCurrentPage(self): """ Validate the current page before moving on to the next page. + Provide each song format class with a chance to validate its input by + overriding isValidSource(). """ if self.currentPage() == self.welcomePage: return True elif self.currentPage() == self.sourcePage: - source_format = self.formatComboBox.currentIndex() - QtCore.QSettings().setValue(u'songs/last import type', - source_format) - if source_format == SongFormat.OpenLP2: - if self.openLP2FilenameEdit.text().isEmpty(): - critical_error_message_box(UiStrings().NFSs, - WizardStrings.YouSpecifyFile % UiStrings().OLPV2) - self.openLP2BrowseButton.setFocus() - return False - elif source_format == SongFormat.OpenLP1: - if self.openLP1FilenameEdit.text().isEmpty(): - critical_error_message_box(UiStrings().NFSs, - WizardStrings.YouSpecifyFile % UiStrings().OLPV1) - self.openLP1BrowseButton.setFocus() - return False - elif source_format == SongFormat.OpenLyrics: - if self.openLyricsFileListWidget.count() == 0: - critical_error_message_box(UiStrings().NFSp, - WizardStrings.YouSpecifyFile % WizardStrings.OL) - self.openLyricsAddButton.setFocus() - return False - elif source_format == SongFormat.OpenSong: - if self.openSongFileListWidget.count() == 0: - critical_error_message_box(UiStrings().NFSp, - WizardStrings.YouSpecifyFile % WizardStrings.OS) - self.openSongAddButton.setFocus() - return False - elif source_format == SongFormat.WordsOfWorship: - if self.wordsOfWorshipFileListWidget.count() == 0: - critical_error_message_box(UiStrings().NFSp, - WizardStrings.YouSpecifyFile % WizardStrings.WoW) - self.wordsOfWorshipAddButton.setFocus() - return False - elif source_format == SongFormat.CCLI: - if self.ccliFileListWidget.count() == 0: - critical_error_message_box(UiStrings().NFSp, - WizardStrings.YouSpecifyFile % WizardStrings.CCLI) - self.ccliAddButton.setFocus() - return False - elif source_format == SongFormat.SongsOfFellowship: - if self.songsOfFellowshipFileListWidget.count() == 0: - critical_error_message_box(UiStrings().NFSp, - WizardStrings.YouSpecifyFile % WizardStrings.SoF) - self.songsOfFellowshipAddButton.setFocus() - return False - elif source_format == SongFormat.Generic: - if self.genericFileListWidget.count() == 0: - critical_error_message_box(UiStrings().NFSp, - translate('SongsPlugin.ImportWizardForm', - 'You need to specify at least one document or ' - 'presentation file to import from.')) - self.genericAddButton.setFocus() - return False - elif source_format == SongFormat.EasySlides: - if self.easySlidesFilenameEdit.text().isEmpty(): - critical_error_message_box(UiStrings().NFSp, - WizardStrings.YouSpecifyFile % WizardStrings.ES) - self.easySlidesBrowseButton.setFocus() - return False - elif source_format == SongFormat.EasyWorship: - if self.ewFilenameEdit.text().isEmpty(): - critical_error_message_box(UiStrings().NFSs, - WizardStrings.YouSpecifyFile % WizardStrings.EW) - self.ewBrowseButton.setFocus() - return False - elif source_format == SongFormat.SongBeamer: - if self.songBeamerFileListWidget.count() == 0: - critical_error_message_box(UiStrings().NFSp, - WizardStrings.YouSpecifyFile % WizardStrings.SB) - self.songBeamerAddButton.setFocus() - return False - elif source_format == SongFormat.SongShowPlus: - if self.songShowPlusFileListWidget.count() == 0: - critical_error_message_box(UiStrings().NFSp, - WizardStrings.YouSpecifyFile % WizardStrings.SSP) - self.wordsOfWorshipAddButton.setFocus() - return False - elif source_format == SongFormat.FoilPresenter: - if self.foilPresenterFileListWidget.count() == 0: - critical_error_message_box(UiStrings().NFSp, - WizardStrings.YouSpecifyFile % WizardStrings.FP) - self.foilPresenterAddButton.setFocus() - return False + format = self.currentFormat + Settings().setValue(u'songs/last import type', + format) + select_mode, class_, error_msg = SongFormat.get(format, + u'selectMode', u'class', u'invalidSourceMsg') + if select_mode == SongFormatSelect.MultipleFiles: + import_source = self.getListOfFiles( + self.formatWidgets[format][u'fileListWidget']) + error_title = UiStrings().IFSp + focus_button = self.formatWidgets[format][u'addButton'] + else: + import_source = \ + self.formatWidgets[format][u'filepathEdit'].text() + error_title = (UiStrings().IFSs if select_mode == + SongFormatSelect.SingleFile else UiStrings().IFdSs) + focus_button = self.formatWidgets[format][u'browseButton'] + if not class_.isValidSource(import_source): + critical_error_message_box(error_title, error_msg) + focus_button.setFocus() + return False return True elif self.currentPage() == self.progressPage: return True @@ -486,171 +302,40 @@ item = listbox.takeItem(listbox.row(item)) del item - def onOpenLP2BrowseButtonClicked(self): - """ - Get OpenLP v2 song database file - """ - self.getFileName(WizardStrings.OpenTypeFile % UiStrings().OLPV2, - self.openLP2FilenameEdit, u'%s (*.sqlite)' - % (translate('SongsPlugin.ImportWizardForm', - 'OpenLP 2.0 Databases')) - ) - - def onOpenLP1BrowseButtonClicked(self): - """ - Get OpenLP v1 song database file - """ - self.getFileName(WizardStrings.OpenTypeFile % UiStrings().OLPV1, - self.openLP1FilenameEdit, u'%s (*.olp)' - % translate('SongsPlugin.ImportWizardForm', - 'openlp.org v1.x Databases') - ) - - def onOpenLyricsAddButtonClicked(self): - """ - Get OpenLyrics song database files - """ - self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.OL, - self.openLyricsFileListWidget, u'%s (*.xml)' % - translate('SongsPlugin.ImportWizardForm', 'OpenLyrics Files')) - - def onOpenLyricsRemoveButtonClicked(self): - """ - Remove selected OpenLyrics files from the import list - """ - self.removeSelectedItems(self.openLyricsFileListWidget) - - def onOpenSongAddButtonClicked(self): - """ - Get OpenSong song database files - """ - self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.OS, - self.openSongFileListWidget) - - def onOpenSongRemoveButtonClicked(self): - """ - Remove selected OpenSong files from the import list - """ - self.removeSelectedItems(self.openSongFileListWidget) - - def onWordsOfWorshipAddButtonClicked(self): - """ - Get Words of Worship song database files - """ - self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.WoW, - self.wordsOfWorshipFileListWidget, u'%s (*.wsg *.wow-song)' - % translate('SongsPlugin.ImportWizardForm', - 'Words Of Worship Song Files') - ) - - def onWordsOfWorshipRemoveButtonClicked(self): - """ - Remove selected Words of Worship files from the import list - """ - self.removeSelectedItems(self.wordsOfWorshipFileListWidget) - - def onCCLIAddButtonClicked(self): - """ - Get CCLI song database files - """ - self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.CCLI, - self.ccliFileListWidget) - - def onCCLIRemoveButtonClicked(self): - """ - Remove selected CCLI files from the import list - """ - self.removeSelectedItems(self.ccliFileListWidget) - - def onSongsOfFellowshipAddButtonClicked(self): - """ - Get Songs of Fellowship song database files - """ - self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.SoF, - self.songsOfFellowshipFileListWidget, u'%s (*.rtf)' - % translate('SongsPlugin.ImportWizardForm', - 'Songs Of Fellowship Song Files') - ) - - def onSongsOfFellowshipRemoveButtonClicked(self): - """ - Remove selected Songs of Fellowship files from the import list - """ - self.removeSelectedItems(self.songsOfFellowshipFileListWidget) - - def onGenericAddButtonClicked(self): - """ - Get song database files - """ - self.getFiles( - translate('SongsPlugin.ImportWizardForm', - 'Select Document/Presentation Files'), - self.genericFileListWidget - ) - - def onGenericRemoveButtonClicked(self): - """ - Remove selected files from the import list - """ - self.removeSelectedItems(self.genericFileListWidget) - - def onEasySlidesBrowseButtonClicked(self): - self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.ES, - self.easySlidesFilenameEdit) + def onBrowseButtonClicked(self): + format = self.currentFormat + select_mode, format_name, filter = SongFormat.get(format, u'selectMode', + u'name', u'filter') + filepathEdit = self.formatWidgets[format][u'filepathEdit'] + if select_mode == SongFormatSelect.SingleFile: + self.getFileName(WizardStrings.OpenTypeFile % format_name, + filepathEdit, filter) + elif select_mode == SongFormatSelect.SingleFolder: + self.getFolder(WizardStrings.OpenTypeFolder % format_name, + filepathEdit) + + def onAddButtonClicked(self): + format = self.currentFormat + select_mode, format_name, filter, custom_title = SongFormat.get(format, + u'selectMode', u'name', u'filter', + u'getFilesTitle') + title = custom_title if custom_title \ + else WizardStrings.OpenTypeFile % format_name + if select_mode == SongFormatSelect.MultipleFiles: + self.getFiles(title, self.formatWidgets[format][u'fileListWidget'], + filter) + self.sourcePage.emit(QtCore.SIGNAL(u'completeChanged()')) + + def onRemoveButtonClicked(self): + self.removeSelectedItems( + self.formatWidgets[self.currentFormat][u'fileListWidget']) + self.sourcePage.emit(QtCore.SIGNAL(u'completeChanged()')) - def onEWBrowseButtonClicked(self): + def onFilepathEditTextChanged(self): """ - Get EasyWorship song database files + Called when the content of the Filename/Folder edit box changes. """ - self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.EW, - self.ewFilenameEdit) - - def onSongBeamerAddButtonClicked(self): - """ - Get SongBeamer song database files - """ - self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.SB, - self.songBeamerFileListWidget, u'%s (*.sng)' % - translate('SongsPlugin.ImportWizardForm', 'SongBeamer Files') - ) - - def onSongBeamerRemoveButtonClicked(self): - """ - Remove selected SongBeamer files from the import list - """ - self.removeSelectedItems(self.songBeamerFileListWidget) - - def onSongShowPlusAddButtonClicked(self): - """ - Get SongShow Plus song database files - """ - self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.SSP, - self.songShowPlusFileListWidget, u'%s (*.sbsong)' - % translate('SongsPlugin.ImportWizardForm', - 'SongShow Plus Song Files') - ) - - def onSongShowPlusRemoveButtonClicked(self): - """ - Remove selected SongShow Plus files from the import list - """ - self.removeSelectedItems(self.songShowPlusFileListWidget) - - def onFoilPresenterAddButtonClicked(self): - """ - Get FoilPresenter song database files - """ - self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.FP, - self.foilPresenterFileListWidget, u'%s (*.foil)' - % translate('SongsPlugin.ImportWizardForm', - 'Foilpresenter Song Files') - ) - - def onFoilPresenterRemoveButtonClicked(self): - """ - Remove selected FoilPresenter files from the import list - """ - self.removeSelectedItems(self.foilPresenterFileListWidget) + self.sourcePage.emit(QtCore.SIGNAL(u'completeChanged()')) def setDefaults(self): """ @@ -659,26 +344,18 @@ self.restart() self.finishButton.setVisible(False) self.cancelButton.setVisible(True) - last_import_type = QtCore.QSettings().value( + last_import_type = Settings().value( u'songs/last import type').toInt()[0] if last_import_type < 0 or \ last_import_type >= self.formatComboBox.count(): last_import_type = 0 self.formatComboBox.setCurrentIndex(last_import_type) - self.openLP2FilenameEdit.setText(u'') - self.openLP1FilenameEdit.setText(u'') - self.openLyricsFileListWidget.clear() - self.openSongFileListWidget.clear() - self.wordsOfWorshipFileListWidget.clear() - self.ccliFileListWidget.clear() - self.songsOfFellowshipFileListWidget.clear() - self.genericFileListWidget.clear() - self.easySlidesFilenameEdit.setText(u'') - self.ewFilenameEdit.setText(u'') - self.songBeamerFileListWidget.clear() - self.songShowPlusFileListWidget.clear() - self.foilPresenterFileListWidget.clear() - #self.csvFilenameEdit.setText(u'') + for format in SongFormat.get_format_list(): + select_mode = SongFormat.get(format, u'selectMode') + if select_mode == SongFormatSelect.MultipleFiles: + self.formatWidgets[format][u'fileListWidget'].clear() + else: + self.formatWidgets[format][u'filepathEdit'].setText(u'') self.errorReportTextEdit.clear() self.errorReportTextEdit.setHidden(True) self.errorCopyToButton.setHidden(True) @@ -698,82 +375,20 @@ class, and then runs the ``doImport`` method of the importer to do the actual importing. """ - source_format = self.formatComboBox.currentIndex() - importer = None - if source_format == SongFormat.OpenLP2: - # Import an OpenLP 2.0 database - importer = self.plugin.importSongs(SongFormat.OpenLP2, - filename=unicode(self.openLP2FilenameEdit.text()) - ) - elif source_format == SongFormat.OpenLP1: - # Import an openlp.org database - importer = self.plugin.importSongs(SongFormat.OpenLP1, - filename=unicode(self.openLP1FilenameEdit.text()), - plugin=self.plugin - ) - elif source_format == SongFormat.OpenLyrics: - # Import OpenLyrics songs - importer = self.plugin.importSongs(SongFormat.OpenLyrics, - filenames=self.getListOfFiles(self.openLyricsFileListWidget) - ) - elif source_format == SongFormat.OpenSong: - # Import OpenSong songs - importer = self.plugin.importSongs(SongFormat.OpenSong, - filenames=self.getListOfFiles(self.openSongFileListWidget) - ) - elif source_format == SongFormat.WordsOfWorship: - # Import Words Of Worship songs - importer = self.plugin.importSongs(SongFormat.WordsOfWorship, - filenames=self.getListOfFiles( - self.wordsOfWorshipFileListWidget) - ) - elif source_format == SongFormat.CCLI: - # Import Words Of Worship songs - importer = self.plugin.importSongs(SongFormat.CCLI, - filenames=self.getListOfFiles(self.ccliFileListWidget) - ) - elif source_format == SongFormat.SongsOfFellowship: - # Import a Songs of Fellowship RTF file - importer = self.plugin.importSongs(SongFormat.SongsOfFellowship, + source_format = self.currentFormat + select_mode = SongFormat.get(source_format, u'selectMode') + if select_mode == SongFormatSelect.SingleFile: + importer = self.plugin.importSongs(source_format, filename=unicode( + self.formatWidgets[source_format][u'filepathEdit'].text())) + elif select_mode == SongFormatSelect.SingleFolder: + importer = self.plugin.importSongs(source_format, folder=unicode( + self.formatWidgets[source_format][u'filepathEdit'].text())) + else: + importer = self.plugin.importSongs(source_format, filenames=self.getListOfFiles( - self.songsOfFellowshipFileListWidget) - ) - elif source_format == SongFormat.Generic: - # Import a generic document or presentation - importer = self.plugin.importSongs(SongFormat.Generic, - filenames=self.getListOfFiles(self.genericFileListWidget) - ) - elif source_format == SongFormat.EasySlides: - # Import an EasySlides export file - importer = self.plugin.importSongs(SongFormat.EasySlides, - filename=unicode(self.easySlidesFilenameEdit.text()) - ) - elif source_format == SongFormat.EasyWorship: - # Import an EasyWorship database - importer = self.plugin.importSongs(SongFormat.EasyWorship, - filename=unicode(self.ewFilenameEdit.text()) - ) - elif source_format == SongFormat.SongBeamer: - # Import SongBeamer songs - importer = self.plugin.importSongs(SongFormat.SongBeamer, - filenames=self.getListOfFiles(self.songBeamerFileListWidget) - ) - elif source_format == SongFormat.SongShowPlus: - # Import ShongShow Plus songs - importer = self.plugin.importSongs(SongFormat.SongShowPlus, - filenames=self.getListOfFiles(self.songShowPlusFileListWidget) - ) - elif source_format == SongFormat.FoilPresenter: - # Import Foilpresenter songs - importer = self.plugin.importSongs(SongFormat.FoilPresenter, - filenames=self.getListOfFiles(self.foilPresenterFileListWidget) - ) + self.formatWidgets[source_format][u'fileListWidget'])) importer.doImport() - if importer.errorLog: - self.progressLabel.setText(translate( - 'SongsPlugin.SongImportForm', 'Your song import failed.')) - else: - self.progressLabel.setText(WizardStrings.FinishedImport) + self.progressLabel.setText(WizardStrings.FinishedImport) def onErrorCopyToButtonClicked(self): """ @@ -793,90 +408,145 @@ report_file.write(self.errorReportTextEdit.toPlainText()) report_file.close() - def addFileSelectItem(self, prefix, obj_prefix=None, can_disable=False, - single_select=False): - if not obj_prefix: - obj_prefix = prefix + def addFileSelectItem(self): + format = self.currentFormat + prefix, can_disable, description_text, select_mode = SongFormat.get( + format, u'prefix', u'canDisable', u'descriptionText', u'selectMode') page = QtGui.QWidget() - page.setObjectName(obj_prefix + u'Page') + page.setObjectName(prefix + u'Page') if can_disable: - importWidget = self.disablableWidget(page, prefix, obj_prefix) + importWidget = self.disablableWidget(page, prefix) else: importWidget = page importLayout = QtGui.QVBoxLayout(importWidget) importLayout.setMargin(0) - importLayout.setObjectName(obj_prefix + u'ImportLayout') - if single_select: - fileLayout = QtGui.QHBoxLayout() - fileLayout.setObjectName(obj_prefix + u'FileLayout') - filenameLabel = QtGui.QLabel(importWidget) - filenameLabel.setObjectName(obj_prefix + u'FilenameLabel') - fileLayout.addWidget(filenameLabel) - filenameEdit = QtGui.QLineEdit(importWidget) - filenameEdit.setObjectName(obj_prefix + u'FilenameEdit') - fileLayout.addWidget(filenameEdit) + importLayout.setObjectName(prefix + u'ImportLayout') + if description_text is not None: + descriptionLayout = QtGui.QHBoxLayout() + descriptionLayout.setObjectName(prefix + u'DescriptionLayout') + descriptionSpacer = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Fixed) + descriptionLayout.addSpacerItem(descriptionSpacer) + descriptionLabel = QtGui.QLabel(importWidget) + descriptionLabel.setWordWrap(True) + descriptionLabel.setOpenExternalLinks(True) + descriptionLabel.setObjectName(prefix + u'DescriptionLabel') + descriptionLayout.addWidget(descriptionLabel) + importLayout.addLayout(descriptionLayout) + self.formatWidgets[format][u'descriptionLabel'] = descriptionLabel + self.formatWidgets[format][u'descriptionSpacer'] = descriptionSpacer + if select_mode == SongFormatSelect.SingleFile or \ + select_mode == SongFormatSelect.SingleFolder: + filepathLayout = QtGui.QHBoxLayout() + filepathLayout.setObjectName(prefix + u'FilepathLayout') + filepathLayout.setContentsMargins(0, self.formatVSpacing, 0, 0) + filepathLabel = QtGui.QLabel(importWidget) + filepathLabel.setObjectName(prefix + u'FilepathLabel') + filepathLayout.addWidget(filepathLabel) + filepathSpacer = QtGui.QSpacerItem(0, 0, QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Fixed) + filepathLayout.addSpacerItem(filepathSpacer) + filepathEdit = QtGui.QLineEdit(importWidget) + filepathEdit.setObjectName(prefix + u'FilepathEdit') + filepathLayout.addWidget(filepathEdit) browseButton = QtGui.QToolButton(importWidget) browseButton.setIcon(self.openIcon) - browseButton.setObjectName(obj_prefix + u'BrowseButton') - fileLayout.addWidget(browseButton) - importLayout.addLayout(fileLayout) + browseButton.setObjectName(prefix + u'BrowseButton') + filepathLayout.addWidget(browseButton) + importLayout.addLayout(filepathLayout) importLayout.addSpacerItem(self.stackSpacer) - else: + self.formatWidgets[format][u'filepathLabel'] = filepathLabel + self.formatWidgets[format][u'filepathSpacer'] = filepathSpacer + self.formatWidgets[format][u'filepathLayout'] = filepathLayout + self.formatWidgets[format][u'filepathEdit'] = filepathEdit + self.formatWidgets[format][u'browseButton'] = browseButton + elif select_mode == SongFormatSelect.MultipleFiles: fileListWidget = QtGui.QListWidget(importWidget) fileListWidget.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) - fileListWidget.setObjectName(obj_prefix + u'FileListWidget') + fileListWidget.setObjectName(prefix + u'FileListWidget') importLayout.addWidget(fileListWidget) buttonLayout = QtGui.QHBoxLayout() - buttonLayout.setObjectName(obj_prefix + u'ButtonLayout') + buttonLayout.setObjectName(prefix + u'ButtonLayout') addButton = QtGui.QPushButton(importWidget) addButton.setIcon(self.openIcon) - addButton.setObjectName(obj_prefix + u'AddButton') + addButton.setObjectName(prefix + u'AddButton') buttonLayout.addWidget(addButton) buttonLayout.addStretch() removeButton = QtGui.QPushButton(importWidget) removeButton.setIcon(self.deleteIcon) - removeButton.setObjectName(obj_prefix + u'RemoveButton') + removeButton.setObjectName(prefix + u'RemoveButton') buttonLayout.addWidget(removeButton) importLayout.addLayout(buttonLayout) + self.formatWidgets[format][u'fileListWidget'] = fileListWidget + self.formatWidgets[format][u'buttonLayout'] = buttonLayout + self.formatWidgets[format][u'addButton'] = addButton + self.formatWidgets[format][u'removeButton'] = removeButton self.formatStack.addWidget(page) - setattr(self, prefix + u'Page', page) - if single_select: - setattr(self, prefix + u'FilenameLabel', filenameLabel) - setattr(self, prefix + u'FileLayout', fileLayout) - setattr(self, prefix + u'FilenameEdit', filenameEdit) - setattr(self, prefix + u'BrowseButton', browseButton) - else: - setattr(self, prefix + u'FileListWidget', fileListWidget) - setattr(self, prefix + u'ButtonLayout', buttonLayout) - setattr(self, prefix + u'AddButton', addButton) - setattr(self, prefix + u'RemoveButton', removeButton) - setattr(self, prefix + u'ImportLayout', importLayout) + self.formatWidgets[format][u'page'] = page + self.formatWidgets[format][u'importLayout'] = importLayout self.formatComboBox.addItem(u'') - def disablableWidget(self, page, prefix, obj_prefix): + def disablableWidget(self, page, prefix): + format = self.currentFormat + self.disablableFormats.append(format) layout = QtGui.QVBoxLayout(page) layout.setMargin(0) layout.setSpacing(0) - layout.setObjectName(obj_prefix + u'Layout') + layout.setObjectName(prefix + u'Layout') disabledWidget = QtGui.QWidget(page) disabledWidget.setVisible(False) - disabledWidget.setObjectName(obj_prefix + u'DisabledWidget') + disabledWidget.setObjectName(prefix + u'DisabledWidget') disabledLayout = QtGui.QVBoxLayout(disabledWidget) disabledLayout.setMargin(0) - disabledLayout.setObjectName(obj_prefix + u'DisabledLayout') + disabledLayout.setObjectName(prefix + u'DisabledLayout') disabledLabel = QtGui.QLabel(disabledWidget) disabledLabel.setWordWrap(True) - disabledLabel.setObjectName(obj_prefix + u'DisabledLabel') + disabledLabel.setObjectName(prefix + u'DisabledLabel') disabledLayout.addWidget(disabledLabel) disabledLayout.addSpacerItem(self.stackSpacer) layout.addWidget(disabledWidget) importWidget = QtGui.QWidget(page) - importWidget.setObjectName(obj_prefix + u'ImportWidget') + importWidget.setObjectName(prefix + u'ImportWidget') layout.addWidget(importWidget) - setattr(self, prefix + u'Layout', layout) - setattr(self, prefix + u'DisabledWidget', disabledWidget) - setattr(self, prefix + u'DisabledLayout', disabledLayout) - setattr(self, prefix + u'DisabledLabel', disabledLabel) - setattr(self, prefix + u'ImportWidget', importWidget) + self.formatWidgets[format][u'layout'] = layout + self.formatWidgets[format][u'disabledWidget'] = disabledWidget + self.formatWidgets[format][u'disabledLayout'] = disabledLayout + self.formatWidgets[format][u'disabledLabel'] = disabledLabel + self.formatWidgets[format][u'importWidget'] = importWidget return importWidget + + +class SongImportSourcePage(QtGui.QWizardPage): + """ + Subclass of QtGui.QWizardPage to override isComplete() for Source Page. + """ + def isComplete(self): + """ + Return True if: + + * an available format is selected, and + * if MultipleFiles mode, at least one file is selected + * or if SingleFile mode, the specified file exists + * or if SingleFolder mode, the specified folder exists + + When this method returns True, the wizard's Next button is enabled. + """ + wizard = self.wizard() + format = wizard.currentFormat + select_mode, format_available = SongFormat.get(format, u'selectMode', + u'availability') + if format_available: + if select_mode == SongFormatSelect.MultipleFiles: + if wizard.formatWidgets[format][u'fileListWidget'].count() > 0: + return True + else: + filepath = wizard.formatWidgets[format][u'filepathEdit'].text() + if not filepath.isEmpty(): + if select_mode == SongFormatSelect.SingleFile \ + and os.path.isfile(filepath): + return True + elif select_mode == SongFormatSelect.SingleFolder \ + and os.path.isdir(filepath): + return True + return False diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/songmaintenancedialog.py openlp-1.9.10/openlp/plugins/songs/forms/songmaintenancedialog.py --- openlp-1.9.9/openlp/plugins/songs/forms/songmaintenancedialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/songmaintenancedialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,7 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon -from openlp.core.lib.ui import UiStrings +from openlp.core.lib.ui import UiStrings, create_button_box from openlp.plugins.songs.lib.ui import SongStrings class Ui_SongMaintenanceDialog(object): @@ -132,18 +133,14 @@ self.stackedLayout.addWidget(self.booksPage) # self.dialogLayout.addLayout(self.stackedLayout, 0, 1) - self.buttonBox = QtGui.QDialogButtonBox(songMaintenanceDialog) - self.buttonBox.addButton(QtGui.QDialogButtonBox.Close) - self.buttonBox.setObjectName(u'buttonBox') + self.buttonBox = create_button_box(songMaintenanceDialog, u'buttonBox', + [u'close']) self.dialogLayout.addWidget(self.buttonBox, 1, 0, 1, 2) self.retranslateUi(songMaintenanceDialog) self.stackedLayout.setCurrentIndex(0) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), - songMaintenanceDialog.accept) QtCore.QObject.connect(self.typeListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.stackedLayout.setCurrentIndex) - QtCore.QMetaObject.connectSlotsByName(songMaintenanceDialog) def retranslateUi(self, songMaintenanceDialog): songMaintenanceDialog.setWindowTitle(SongStrings.SongMaintenance) diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/songmaintenanceform.py openlp-1.9.10/openlp/plugins/songs/forms/songmaintenanceform.py --- openlp-1.9.9/openlp/plugins/songs/forms/songmaintenanceform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/songmaintenanceform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -60,23 +61,23 @@ self.booksEditButton.setEnabled(False) # Signals QtCore.QObject.connect(self.authorsAddButton, - QtCore.SIGNAL(u'pressed()'), self.onAuthorAddButtonClick) + QtCore.SIGNAL(u'clicked()'), self.onAuthorAddButtonClicked) QtCore.QObject.connect(self.topicsAddButton, - QtCore.SIGNAL(u'pressed()'), self.onTopicAddButtonClick) + QtCore.SIGNAL(u'clicked()'), self.onTopicAddButtonClicked) QtCore.QObject.connect(self.booksAddButton, - QtCore.SIGNAL(u'pressed()'), self.onBookAddButtonClick) + QtCore.SIGNAL(u'clicked()'), self.onBookAddButtonClicked) QtCore.QObject.connect(self.authorsEditButton, - QtCore.SIGNAL(u'pressed()'), self.onAuthorEditButtonClick) + QtCore.SIGNAL(u'clicked()'), self.onAuthorEditButtonClicked) QtCore.QObject.connect(self.topicsEditButton, - QtCore.SIGNAL(u'pressed()'), self.onTopicEditButtonClick) + QtCore.SIGNAL(u'clicked()'), self.onTopicEditButtonClicked) QtCore.QObject.connect(self.booksEditButton, - QtCore.SIGNAL(u'pressed()'), self.onBookEditButtonClick) + QtCore.SIGNAL(u'clicked()'), self.onBookEditButtonClicked) QtCore.QObject.connect(self.authorsDeleteButton, - QtCore.SIGNAL(u'pressed()'), self.onAuthorDeleteButtonClick) + QtCore.SIGNAL(u'clicked()'), self.onAuthorDeleteButtonClicked) QtCore.QObject.connect(self.topicsDeleteButton, - QtCore.SIGNAL(u'pressed()'), self.onTopicDeleteButtonClick) + QtCore.SIGNAL(u'clicked()'), self.onTopicDeleteButtonClicked) QtCore.QObject.connect(self.booksDeleteButton, - QtCore.SIGNAL(u'pressed()'), self.onBookDeleteButtonClick) + QtCore.SIGNAL(u'clicked()'), self.onBookDeleteButtonClicked) QtCore.QObject.connect(self.authorsListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.onAuthorsListRowChanged) @@ -87,7 +88,15 @@ QtCore.SIGNAL(u'currentRowChanged(int)'), self.onBooksListRowChanged) - def exec_(self): + def exec_(self, fromSongEdit=False): + """ + Show the dialog. + + ``fromSongEdit`` + Indicates if the maintenance dialog has been opened from song edit + or from the media manager. Defaults to **False**. + """ + self.fromSongEdit = fromSongEdit self.typeListWidget.setCurrentRow(0) self.resetAuthors() self.resetTopics() @@ -103,20 +112,20 @@ else: return -1 - def _deleteItem(self, item_class, list_widget, reset_func, dlg_title, + def _deleteItem(self, itemClass, listWidget, resetFunc, dlgTitle, del_text, err_text): - item_id = self._getCurrentItemId(list_widget) + item_id = self._getCurrentItemId(listWidget) if item_id != -1: - item = self.manager.get_object(item_class, item_id) - if item and len(item.songs) == 0: - if critical_error_message_box(dlg_title, del_text, self, + item = self.manager.get_object(itemClass, item_id) + if item and not item.songs: + if critical_error_message_box(dlgTitle, del_text, self, True) == QtGui.QMessageBox.Yes: - self.manager.delete_object(item_class, item.id) - reset_func() + self.manager.delete_object(itemClass, item.id) + resetFunc() else: - critical_error_message_box(dlg_title, err_text) + critical_error_message_box(dlgTitle, err_text) else: - critical_error_message_box(dlg_title, UiStrings().NISs) + critical_error_message_box(dlgTitle, UiStrings().NISs) def resetAuthors(self): """ @@ -157,46 +166,46 @@ book_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(book.id)) self.booksListWidget.addItem(book_name) - def checkAuthor(self, new_author, edit=False): + def checkAuthor(self, newAuthor, edit=False): """ Returns *False* if the given Author already exists, otherwise *True*. """ authors = self.manager.get_all_objects(Author, - and_(Author.first_name == new_author.first_name, - Author.last_name == new_author.last_name, - Author.display_name == new_author.display_name)) - return self.__checkObject(authors, new_author, edit) + and_(Author.first_name == newAuthor.first_name, + Author.last_name == newAuthor.last_name, + Author.display_name == newAuthor.display_name)) + return self.__checkObject(authors, newAuthor, edit) - def checkTopic(self, new_topic, edit=False): + def checkTopic(self, newTopic, edit=False): """ Returns *False* if the given Topic already exists, otherwise *True*. """ topics = self.manager.get_all_objects(Topic, - Topic.name == new_topic.name) - return self.__checkObject(topics, new_topic, edit) + Topic.name == newTopic.name) + return self.__checkObject(topics, newTopic, edit) - def checkBook(self, new_book, edit=False): + def checkBook(self, newBook, edit=False): """ Returns *False* if the given Topic already exists, otherwise *True*. """ books = self.manager.get_all_objects(Book, - and_(Book.name == new_book.name, - Book.publisher == new_book.publisher)) - return self.__checkObject(books, new_book, edit) + and_(Book.name == newBook.name, + Book.publisher == newBook.publisher)) + return self.__checkObject(books, newBook, edit) - def __checkObject(self, objects, new_object, edit): + def __checkObject(self, objects, newObject, edit): """ Utility method to check for an existing object. ``edit`` If we edit an item, this should be *True*. """ - if len(objects) > 0: + if objects: # If we edit an existing object, we need to make sure that we do # not return False when nothing has changed. if edit: for object in objects: - if object.id != new_object.id: + if object.id != newObject.id: return False return True else: @@ -204,7 +213,7 @@ else: return True - def onAuthorAddButtonClick(self): + def onAuthorAddButtonClicked(self): self.authorform.setAutoDisplayName(True) if self.authorform.exec_(): author = Author.populate( @@ -223,7 +232,7 @@ message=translate('SongsPlugin.SongMaintenanceForm', 'This author already exists.')) - def onTopicAddButtonClick(self): + def onTopicAddButtonClicked(self): if self.topicform.exec_(): topic = Topic.populate(name=unicode(self.topicform.nameEdit.text())) if self.checkTopic(topic): @@ -238,7 +247,7 @@ message=translate('SongsPlugin.SongMaintenanceForm', 'This topic already exists.')) - def onBookAddButtonClick(self): + def onBookAddButtonClicked(self): if self.bookform.exec_(): book = Book.populate(name=unicode(self.bookform.nameEdit.text()), publisher=unicode(self.bookform.publisherEdit.text())) @@ -254,7 +263,7 @@ message=translate('SongsPlugin.SongMaintenanceForm', 'This book already exists.')) - def onAuthorEditButtonClick(self): + def onAuthorEditButtonClicked(self): author_id = self._getCurrentItemId(self.authorsListWidget) if author_id == -1: return @@ -275,7 +284,8 @@ if self.checkAuthor(author, True): if self.manager.save_object(author): self.resetAuthors() - Receiver.send_message(u'songs_load_list') + if not self.fromSongEdit: + Receiver.send_message(u'songs_load_list') else: critical_error_message_box( message=translate('SongsPlugin.SongMaintenanceForm', @@ -299,7 +309,7 @@ 'Could not save your modified author, because the ' 'author already exists.')) - def onTopicEditButtonClick(self): + def onTopicEditButtonClicked(self): topic_id = self._getCurrentItemId(self.topicsListWidget) if topic_id == -1: return @@ -331,7 +341,7 @@ 'Could not save your modified topic, because it ' 'already exists.')) - def onBookEditButtonClick(self): + def onBookEditButtonClicked(self): book_id = self._getCurrentItemId(self.booksListWidget) if book_id == -1: return @@ -373,77 +383,78 @@ Receiver.send_message(u'cursor_busy') merge(dbObject) reset() - Receiver.send_message(u'songs_load_list') + if not self.fromSongEdit: + Receiver.send_message(u'songs_load_list') Receiver.send_message(u'cursor_normal') - def mergeAuthors(self, old_author): + def mergeAuthors(self, oldAuthor): """ Merges two authors into one author. - ``old_author`` + ``oldAuthor`` The object, which was edited, that will be deleted """ # Find the duplicate. existing_author = self.manager.get_object_filtered(Author, - and_(Author.first_name == old_author.first_name, - Author.last_name == old_author.last_name, - Author.display_name == old_author.display_name, - Author.id != old_author.id)) - # Find the songs, which have the old_author as author. + and_(Author.first_name == oldAuthor.first_name, + Author.last_name == oldAuthor.last_name, + Author.display_name == oldAuthor.display_name, + Author.id != oldAuthor.id)) + # Find the songs, which have the oldAuthor as author. songs = self.manager.get_all_objects(Song, - Song.authors.contains(old_author)) + Song.authors.contains(oldAuthor)) for song in songs: # We check if the song has already existing_author as author. If # that is not the case we add it. if existing_author not in song.authors: song.authors.append(existing_author) - song.authors.remove(old_author) + song.authors.remove(oldAuthor) self.manager.save_object(song) - self.manager.delete_object(Author, old_author.id) + self.manager.delete_object(Author, oldAuthor.id) - def mergeTopics(self, old_topic): + def mergeTopics(self, oldTopic): """ Merges two topics into one topic. - ``old_topic`` + ``oldTopic`` The object, which was edited, that will be deleted """ # Find the duplicate. existing_topic = self.manager.get_object_filtered(Topic, - and_(Topic.name == old_topic.name, Topic.id != old_topic.id)) - # Find the songs, which have the old_topic as topic. + and_(Topic.name == oldTopic.name, Topic.id != oldTopic.id)) + # Find the songs, which have the oldTopic as topic. songs = self.manager.get_all_objects(Song, - Song.topics.contains(old_topic)) + Song.topics.contains(oldTopic)) for song in songs: # We check if the song has already existing_topic as topic. If that # is not the case we add it. if existing_topic not in song.topics: song.topics.append(existing_topic) - song.topics.remove(old_topic) + song.topics.remove(oldTopic) self.manager.save_object(song) - self.manager.delete_object(Topic, old_topic.id) + self.manager.delete_object(Topic, oldTopic.id) - def mergeBooks(self, old_book): + def mergeBooks(self, oldBook): """ Merges two books into one book. - ``old_book`` + ``oldBook`` The object, which was edited, that will be deleted """ # Find the duplicate. existing_book = self.manager.get_object_filtered(Book, - and_(Book.name == old_book.name, - Book.publisher == old_book.publisher, - Book.id != old_book.id)) - # Find the songs, which have the old_book as book. + and_(Book.name == oldBook.name, + Book.publisher == oldBook.publisher, + Book.id != oldBook.id)) + # Find the songs, which have the oldBook as book. songs = self.manager.get_all_objects(Song, - Song.song_book_id == old_book.id) + Song.song_book_id == oldBook.id) for song in songs: song.song_book_id = existing_book.id self.manager.save_object(song) - self.manager.delete_object(Book, old_book.id) + self.manager.delete_object(Book, oldBook.id) - def onAuthorDeleteButtonClick(self): + def onAuthorDeleteButtonClicked(self): """ Delete the author if the author is not attached to any songs. """ @@ -454,7 +465,7 @@ translate('SongsPlugin.SongMaintenanceForm', 'This author cannot ' 'be deleted, they are currently assigned to at least one song.')) - def onTopicDeleteButtonClick(self): + def onTopicDeleteButtonClicked(self): """ Delete the Book if the Book is not attached to any songs. """ @@ -465,7 +476,7 @@ translate('SongsPlugin.SongMaintenanceForm', 'This topic cannot ' 'be deleted, it is currently assigned to at least one song.')) - def onBookDeleteButtonClick(self): + def onBookDeleteButtonClicked(self): """ Delete the Book if the Book is not attached to any songs. """ diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/topicsdialog.py openlp-1.9.10/openlp/plugins/songs/forms/topicsdialog.py --- openlp-1.9.9/openlp/plugins/songs/forms/topicsdialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/topicsdialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,10 +26,10 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtCore, QtGui +from PyQt4 import QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import create_accept_reject_button_box +from openlp.core.lib.ui import create_button_box class Ui_TopicsDialog(object): def setupUi(self, topicsDialog): @@ -45,11 +46,11 @@ self.nameLabel.setBuddy(self.nameEdit) self.nameLayout.addRow(self.nameLabel, self.nameEdit) self.dialogLayout.addLayout(self.nameLayout) - self.dialogLayout.addWidget( - create_accept_reject_button_box(topicsDialog)) + self.buttonBox = create_button_box(topicsDialog, u'buttonBox', + [u'cancel', u'save']) + self.dialogLayout.addWidget(self.buttonBox) self.retranslateUi(topicsDialog) topicsDialog.setMaximumHeight(topicsDialog.sizeHint().height()) - QtCore.QMetaObject.connectSlotsByName(topicsDialog) def retranslateUi(self, topicsDialog): topicsDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/plugins/songs/forms/topicsform.py openlp-1.9.10/openlp/plugins/songs/forms/topicsform.py --- openlp-1.9.9/openlp/plugins/songs/forms/topicsform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/forms/topicsform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/__init__.py openlp-1.9.10/openlp/plugins/songs/__init__.py --- openlp-1.9.9/openlp/plugins/songs/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/cclifileimport.py openlp-1.9.10/openlp/plugins/songs/lib/cclifileimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/cclifileimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/cclifileimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -185,7 +186,7 @@ check_first_verse_line = False field_list = song_fields.split(u'/t') words_list = song_words.split(u'/t') - for counter in range(0, len(field_list)): + for counter in range(len(field_list)): if field_list[counter].startswith(u'Ver'): verse_type = VerseType.Tags[VerseType.Verse] elif field_list[counter].startswith(u'Ch'): @@ -211,7 +212,7 @@ elif verse_lines[0].startswith(u'('): verse_type = VerseType.Tags[VerseType.Other] verse_text = verse_lines[1] - if len(verse_text) > 0: + if verse_text: self.addVerse(verse_text, verse_type) check_first_verse_line = False # Handle multiple authors diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/db.py openlp-1.9.10/openlp/plugins/songs/lib/db.py --- openlp-1.9.9/openlp/plugins/songs/lib/db.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/db.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/dreambeamimport.py openlp-1.9.10/openlp/plugins/songs/lib/dreambeamimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/dreambeamimport.py 1970-01-01 00:00:00.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/dreambeamimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # +############################################################################### +""" +The :mod:`dreambeamimport` module provides the functionality for importing +DreamBeam songs into the OpenLP database. +""" +import os +import sys +import logging + +from lxml import etree, objectify + +from openlp.core.lib import translate +from openlp.plugins.songs.lib.songimport import SongImport +from openlp.plugins.songs.lib.ui import SongStrings + +log = logging.getLogger(__name__) + +class DreamBeamImport(SongImport): + """ + The :class:`DreamBeamImport` class provides the ability to import song files from + DreamBeam. + + An example of DreamBeam xml mark-up:: + + + + false + 0.80 + Amazing Grace + John Newton + + + + F + G + false + false + + Amazing Grace, how sweet the sound, + That saved a wretch like me. + I once was lost but now am found, + Was blind, but now, I see. + T’was Grace that taught my heart to fear. + And Grace, my fears relieved. + How precious did that Grace appear… + the hour I first believed. + + + + + + false + + + Valid extensions for a DreamBeam song file are: + + * \*.xml + """ + + def doImport(self): + """ + Receive a single file or a list of files to import. + """ + if isinstance(self.importSource, list): + self.importWizard.progressBar.setMaximum(len(self.importSource)) + for file in self.importSource: + if self.stopImportFlag: + return + self.setDefaults() + parser = etree.XMLParser(remove_blank_text=True) + try: + parsed_file = etree.parse(open(file, u'r'), parser) + except etree.XMLSyntaxError: + log.exception(u'XML syntax error in file %s' % file) + self.logError(file, SongStrings.XMLSyntaxError) + continue + xml = unicode(etree.tostring(parsed_file)) + song_xml = objectify.fromstring(xml) + if song_xml.tag != u'DreamSong': + self.logError(file, unicode( + translate('SongsPlugin.DreamBeamImport', + ('Invalid DreamBeam song file. Missing ' + 'DreamSong tag.')))) + continue + if hasattr(song_xml, u'Version'): + self.version = float(song_xml.Version.text) + else: + self.version = 0 + # Version numbers found in DreamBeam Source /FileTypes/Song.cs + if self.version >= 0.5: + if hasattr(song_xml, u'Title'): + self.title = unicode(song_xml.Title.text) + if hasattr(song_xml, u'Author'): + author_copyright = song_xml.Author.text + if hasattr(song_xml, u'SongLyrics'): + for lyrics_item in song_xml.SongLyrics.iterchildren(): + verse_type = lyrics_item.get(u'Type') + verse_number = lyrics_item.get(u'Number') + verse_text = unicode(lyrics_item.text) + self.addVerse(verse_text, + (u'%s%s' % (verse_type[:1], verse_number))) + if hasattr(song_xml, u'Collection'): + self.songBookName = unicode(song_xml.Collection.text) + if hasattr(song_xml, u'Number'): + self.songNumber = unicode(song_xml.Number.text) + if hasattr(song_xml, u'Sequence'): + for LyricsSequenceItem in ( + song_xml.Sequence.iterchildren()): + self.verseOrderList.append( + "%s%s" % (LyricsSequenceItem.get(u'Type')[:1], + LyricsSequenceItem.get(u'Number'))) + if hasattr(song_xml, u'Notes'): + self.comments = unicode(song_xml.Notes.text) + else: + if hasattr(song_xml.Text0, u'Text'): + self.title = unicode(song_xml.Text0.Text.text) + if hasattr(song_xml.Text1, u'Text'): + self.lyrics = unicode(song_xml.Text1.Text.text) + for verse in self.lyrics.split(u'\n\n\n'): + self.addVerse(verse) + if hasattr(song_xml.Text2, u'Text'): + author_copyright = song_xml.Text2.Text.text + if author_copyright: + author_copyright = unicode(author_copyright) + if author_copyright.find( + unicode(SongStrings.CopyrightSymbol)) >= 0: + self.addCopyright(author_copyright) + else: + self.parseAuthor(author_copyright) + if not self.finish(): + self.logError(file) diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/easyslidesimport.py openlp-1.9.10/openlp/plugins/songs/lib/easyslidesimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/easyslidesimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/easyslidesimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -162,15 +163,12 @@ separatorlines = 0 for line in lines: line = line.strip() - if len(line) == 0: + if not line: continue elif line[1:7] == u'region': # this is region separator, probably [region 2] region = self._extractRegion(line) - if regionlines.has_key(region): - regionlines[region] = regionlines[region] + 1 - else: - regionlines[region] = 1 + regionlines[region] = 1 + regionlines.get(region, 0) elif line[0] == u'[': separatorlines = separatorlines + 1 # if the song has separators @@ -206,7 +204,7 @@ for line in lines: line = line.strip() - if len(line) == 0: + if not line: if separators: # separators are used, so empty line means slide break # inside verse @@ -215,15 +213,11 @@ else: # separators are not used, so empty line starts a new verse vt = u'V' - if verses[reg].has_key(vt): - vn = len(verses[reg][vt].keys())+1 - else: - vn = u'1' + vn = len(verses[reg].get(vt, {})) + 1 inst = 1 elif line[0:7] == u'[region': reg = self._extractRegion(line) - if not verses.has_key(reg): - verses[reg] = {} + verses.setdefault(reg, {}) if not regionsInVerses: vt = u'V' vn = u'1' @@ -238,28 +232,19 @@ if match: marker = match.group(1).strip() vn = match.group(2) - if len(marker) == 0: - vt = u'V' - elif MarkTypes.has_key(marker): - vt = MarkTypes[marker] - else: - vt = u'O' + vt = MarkTypes.get(marker, u'O') if marker else u'V' if regionsInVerses: region = defaultregion inst = 1 if self._listHas(verses, [reg, vt, vn, inst]): - inst = len(verses[reg][vt][vn])+1 + inst = len(verses[reg][vt][vn]) + 1 else: if not [reg, vt, vn, inst] in our_verse_order: our_verse_order.append([reg, vt, vn, inst]) - if not verses[reg].has_key(vt): - verses[reg][vt] = {} - if not verses[reg][vt].has_key(vn): - verses[reg][vt][vn] = {} - if not verses[reg][vt][vn].has_key(inst): - verses[reg][vt][vn][inst] = [] - words = self.tidyText(line) - verses[reg][vt][vn][inst].append(words) + verses[reg].setdefault(vt, {}) + verses[reg][vt].setdefault(vn, {}) + verses[reg][vt][vn].setdefault(inst, []) + verses[reg][vt][vn][inst].append(self.tidyText(line)) # done parsing versetags = [] @@ -286,11 +271,11 @@ try: order = unicode(song.Sequence).strip().split(u',') for tag in order: - if len(tag) == 0: + if not tag: continue elif tag[0].isdigit(): tag = u'V' + tag - elif SeqTypes.has_key(tag.lower()): + elif tag.lower() in SeqTypes: tag = SeqTypes[tag.lower()] else: continue @@ -307,9 +292,7 @@ def _listHas(self, lst, subitems): for subitem in subitems: - if isinstance(lst, dict) and lst.has_key(subitem): - lst = lst[subitem] - elif isinstance(lst, list) and subitem in lst: + if subitem in lst: lst = lst[subitem] else: return False diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/ewimport.py openlp-1.9.10/openlp/plugins/songs/lib/ewimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/ewimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/ewimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -62,15 +63,15 @@ if control: # for delimiters, set control to False if c == '{': - if len(control_word) > 0: + if control_word: depth += 1 control = False elif c == '}': - if len(control_word) > 0: + if control_word: depth -= 1 control = False elif c == '\\': - new_control = (len(control_word) > 0) + new_control = bool(control_word) control = False elif c.isspace(): control = False @@ -79,7 +80,7 @@ if len(control_word) == 3 and control_word[0] == '\'': control = False if not control: - if len(control_word) == 0: + if not control_word: if c == '{' or c == '}' or c == '\\': clear_text.append(c) else: @@ -360,7 +361,7 @@ field_desc = self.fieldDescs[field_desc_index] # Return None in case of 'blank' entries if isinstance(field, str): - if len(field.rstrip('\0')) == 0: + if not field.rstrip('\0'): return None elif field == 0: return None diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/foilpresenterimport.py openlp-1.9.10/openlp/plugins/songs/lib/foilpresenterimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/foilpresenterimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/foilpresenterimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -413,7 +414,7 @@ temp_verse_order_backup = [] temp_sortnr_backup = 1 temp_sortnr_liste = [] - versenumber = { + verse_count = { VerseType.Tags[VerseType.Verse]: 1, VerseType.Tags[VerseType.Chorus]: 1, VerseType.Tags[VerseType.Bridge]: 1, @@ -463,8 +464,8 @@ verse_number = re.compile(u'[a-zA-Z.+-_ ]*').sub(u'', verse_name) # Foilpresenter allows e. g. "C", but we need "C1". if not verse_number: - verse_number = unicode(versenumber[verse_type]) - versenumber[verse_type] += 1 + verse_number = unicode(verse_count[verse_type]) + verse_count[verse_type] += 1 else: # test if foilpresenter have the same versenumber two times with # different parts raise the verse number @@ -508,13 +509,13 @@ song.song_number = u'' try: for bucheintrag in foilpresenterfolie.buch.bucheintrag: - bookname = self._child(bucheintrag.name) - if bookname: + book_name = self._child(bucheintrag.name) + if book_name: book = self.manager.get_object_filtered(Book, - Book.name == bookname) + Book.name == book_name) if book is None: # We need to create a book, because it does not exist. - book = Book.populate(name=bookname, publisher=u'') + book = Book.populate(name=book_name, publisher=u'') self.manager.save_object(book) song.song_book_id = book.id try: @@ -537,12 +538,12 @@ ``song`` The song object. """ - for titelstring in foilpresenterfolie.titel.titelstring: + for title_string in foilpresenterfolie.titel.titelstring: if not song.title: - song.title = self._child(titelstring) + song.title = self._child(title_string) song.alternate_title = u'' else: - song.alternate_title = self._child(titelstring) + song.alternate_title = self._child(title_string) def _process_topics(self, foilpresenterfolie, song): """ @@ -556,13 +557,13 @@ """ try: for name in foilpresenterfolie.kategorien.name: - topictext = self._child(name) - if topictext: + topic_text = self._child(name) + if topic_text: topic = self.manager.get_object_filtered(Topic, - Topic.name == topictext) + Topic.name == topic_text) if topic is None: # We need to create a topic, because it does not exist. - topic = Topic.populate(name=topictext) + topic = Topic.populate(name=topic_text) self.manager.save_object(topic) song.topics.append(topic) except AttributeError: diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/importer.py openlp-1.9.10/openlp/plugins/songs/lib/importer.py --- openlp-1.9.9/openlp/plugins/songs/lib/importer.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/importer.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -29,16 +30,22 @@ """ import logging +from openlp.core.lib import translate +from openlp.core.lib.ui import UiStrings +from openlp.core.ui.wizard import WizardStrings from opensongimport import OpenSongImport from easyslidesimport import EasySlidesImport from olpimport import OpenLPSongImport from openlyricsimport import OpenLyricsImport from wowimport import WowImport from cclifileimport import CCLIFileImport +from dreambeamimport import DreamBeamImport +from powersongimport import PowerSongImport from ewimport import EasyWorshipSongImport from songbeamerimport import SongBeamerImport from songshowplusimport import SongShowPlusImport from foilpresenterimport import FoilPresenterImport +from zionworximport import ZionWorxImport # Imports that might fail log = logging.getLogger(__name__) try: @@ -60,67 +67,243 @@ log.exception('Error importing %s', 'OooImport') HAS_OOO = False + +class SongFormatSelect(object): + """ + This is a special enumeration class listing available file selection modes. + """ + SingleFile = 0 + MultipleFiles = 1 + SingleFolder = 2 + + class SongFormat(object): """ - This is a special enumeration class that holds the various types of songs, - plus a few helper functions to facilitate generic handling of song types - for importing. + This is a special static class that holds an enumeration of the various + song formats handled by the importer, the attributes of each song format, + and a few helper functions. + + Required attributes for each song format: + + ``u'class'`` + Import class, e.g. ``OpenLyricsImport`` + + ``u'name'`` + Name of the format, e.g. ``u'OpenLyrics'`` + + ``u'prefix'`` + Prefix for Qt objects. Use mixedCase, e.g. ``u'openLyrics'`` + See ``SongImportForm.addFileSelectItem()`` + + Optional attributes for each song format: + + ``u'canDisable'`` + Whether song format importer is disablable. + + ``u'availability'`` + Whether song format importer is available. + + ``u'selectMode'`` + Whether format accepts single file, multiple files, or single folder + (as per ``SongFormatSelect`` options). + + ``u'filter'`` + File extension filter for ``QFileDialog``. + + Optional/custom text Strings for ``SongImportForm`` widgets: + + ``u'comboBoxText'`` + Combo box selector (default value is the format's ``u'name'``). + + ``u'disabledLabelText'`` + Required for disablable song formats. + + ``u'getFilesTitle'`` + Title for ``QFileDialog`` (default includes the format's ``u'name'``). + + ``u'invalidSourceMsg'`` + Message displayed if ``isValidSource()`` returns ``False``. + + ``u'descriptionText'`` + Short description (1-2 lines) about the song format. """ - _format_availability = {} + # Song formats (ordered alphabetically after Generic) + # * Numerical order of song formats is significant as it determines the + # order used by formatComboBox. Unknown = -1 OpenLyrics = 0 OpenLP2 = 1 OpenLP1 = 2 Generic = 3 CCLI = 4 - EasySlides = 5 - EasyWorship = 6 - FoilPresenter = 7 - OpenSong = 8 - SongBeamer = 9 - SongShowPlus = 10 - SongsOfFellowship = 11 - WordsOfWorship = 12 - #CSV = 13 + DreamBeam = 5 + EasySlides = 6 + EasyWorship = 7 + FoilPresenter = 8 + OpenSong = 9 + PowerSong = 10 + SongBeamer = 11 + SongShowPlus = 12 + SongsOfFellowship = 13 + WordsOfWorship = 14 + ZionWorx = 15 + #CSV = 16 - @staticmethod - def get_class(format): - """ - Return the appropriate imeplementation class. + # Set optional attribute defaults + __defaults__ = { + u'canDisable': False, + u'availability': True, + u'selectMode': SongFormatSelect.MultipleFiles, + u'filter': u'', + u'comboBoxText': None, + u'disabledLabelText': u'', + u'getFilesTitle': None, + u'invalidSourceMsg': None, + u'descriptionText': None + } - ``format`` - The song format. - """ - if format == SongFormat.OpenLP2: - return OpenLPSongImport - elif format == SongFormat.OpenLP1: - return OpenLP1SongImport - elif format == SongFormat.OpenLyrics: - return OpenLyricsImport - elif format == SongFormat.OpenSong: - return OpenSongImport - elif format == SongFormat.SongsOfFellowship: - return SofImport - elif format == SongFormat.WordsOfWorship: - return WowImport - elif format == SongFormat.Generic: - return OooImport - elif format == SongFormat.CCLI: - return CCLIFileImport - elif format == SongFormat.EasySlides: - return EasySlidesImport - elif format == SongFormat.EasyWorship: - return EasyWorshipSongImport - elif format == SongFormat.SongBeamer: - return SongBeamerImport - elif format == SongFormat.SongShowPlus: - return SongShowPlusImport - elif format == SongFormat.FoilPresenter: - return FoilPresenterImport - return None + # Set attribute values for each Song Format + __attributes__ = { + OpenLyrics: { + u'class': OpenLyricsImport, + u'name': u'OpenLyrics', + u'prefix': u'openLyrics', + u'filter': u'%s (*.xml)' % translate('SongsPlugin.ImportWizardForm', + 'OpenLyrics Files'), + u'comboBoxText': translate('SongsPlugin.ImportWizardForm', + 'OpenLyrics or OpenLP 2.0 Exported Song') + }, + OpenLP2: { + u'class': OpenLPSongImport, + u'name': UiStrings().OLPV2, + u'prefix': u'openLP2', + u'selectMode': SongFormatSelect.SingleFile, + u'filter': u'%s (*.sqlite)' % (translate( + 'SongsPlugin.ImportWizardForm', 'OpenLP 2.0 Databases')) + }, + OpenLP1: { + u'name': UiStrings().OLPV1, + u'prefix': u'openLP1', + u'canDisable': True, + u'selectMode': SongFormatSelect.SingleFile, + u'filter': u'%s (*.olp)' % translate('SongsPlugin.ImportWizardForm', + 'openlp.org v1.x Databases'), + u'disabledLabelText': WizardStrings.NoSqlite + }, + Generic: { + u'name': translate('SongsPlugin.ImportWizardForm', + 'Generic Document/Presentation'), + u'prefix': u'generic', + u'canDisable': True, + u'disabledLabelText': translate('SongsPlugin.ImportWizardForm', + 'The generic document/presentation importer has been disabled ' + 'because OpenLP cannot access OpenOffice or LibreOffice.'), + u'getFilesTitle': translate('SongsPlugin.ImportWizardForm', + 'Select Document/Presentation Files') + }, + CCLI: { + u'class': CCLIFileImport, + u'name': u'CCLI/SongSelect', + u'prefix': u'ccli', + u'filter': u'%s (*.usr *.txt)' % translate( + 'SongsPlugin.ImportWizardForm', 'CCLI SongSelect Files') + }, + DreamBeam: { + u'class': DreamBeamImport, + u'name': u'DreamBeam', + u'prefix': u'dreamBeam', + u'filter': u'%s (*.xml)' % translate('SongsPlugin.ImportWizardForm', + 'DreamBeam Song Files') + }, + EasySlides: { + u'class': EasySlidesImport, + u'name': u'EasySlides', + u'prefix': u'easySlides', + u'selectMode': SongFormatSelect.SingleFile, + u'filter': u'%s (*.xml)' % translate('SongsPlugin.ImportWizardForm', + 'EasySlides XML File') + }, + EasyWorship: { + u'class': EasyWorshipSongImport, + u'name': u'EasyWorship', + u'prefix': u'ew', + u'selectMode': SongFormatSelect.SingleFile, + u'filter': u'%s (*.db)' % translate('SongsPlugin.ImportWizardForm', + 'EasyWorship Song Database') + }, + FoilPresenter: { + u'class': FoilPresenterImport, + u'name': u'Foilpresenter', + u'prefix': u'foilPresenter', + u'filter': u'%s (*.foil)' % translate( + 'SongsPlugin.ImportWizardForm', 'Foilpresenter Song Files') + }, + OpenSong: { + u'class': OpenSongImport, + u'name': WizardStrings.OS, + u'prefix': u'openSong' + }, + PowerSong: { + u'class': PowerSongImport, + u'name': u'PowerSong 1.0', + u'prefix': u'powerSong', + u'selectMode': SongFormatSelect.SingleFolder, + u'invalidSourceMsg': translate('SongsPlugin.ImportWizardForm', + 'You need to specify a valid PowerSong 1.0 database folder.') + }, + SongBeamer: { + u'class': SongBeamerImport, + u'name': u'SongBeamer', + u'prefix': u'songBeamer', + u'filter': u'%s (*.sng)' % translate('SongsPlugin.ImportWizardForm', + 'SongBeamer Files') + }, + SongShowPlus: { + u'class': SongShowPlusImport, + u'name': u'SongShow Plus', + u'prefix': u'songShowPlus', + u'filter': u'%s (*.sbsong)' % translate( + 'SongsPlugin.ImportWizardForm', 'SongShow Plus Song Files') + }, + SongsOfFellowship: { + u'name': u'Songs of Fellowship', + u'prefix': u'songsOfFellowship', + u'canDisable': True, + u'filter': u'%s (*.rtf)' % translate('SongsPlugin.ImportWizardForm', + 'Songs Of Fellowship Song Files'), + u'disabledLabelText': translate('SongsPlugin.ImportWizardForm', + 'The Songs of Fellowship importer has been disabled because ' + 'OpenLP cannot access OpenOffice or LibreOffice.') + }, + WordsOfWorship: { + u'class': WowImport, + u'name': u'Words of Worship', + u'prefix': u'wordsOfWorship', + u'filter': u'%s (*.wsg *.wow-song)' % translate( + 'SongsPlugin.ImportWizardForm', 'Words Of Worship Song Files') + }, + ZionWorx: { + u'class': ZionWorxImport, + u'name': u'ZionWorx', + u'prefix': u'zionWorx', + u'selectMode': SongFormatSelect.SingleFile, + u'comboBoxText': translate('SongsPlugin.ImportWizardForm', + 'ZionWorx (CSV)'), + u'descriptionText': translate('SongsPlugin.ImportWizardForm', + 'First convert your ZionWorx database to a CSV text file, as ' + 'explained in the User Manual.') +# }, +# CSV: { +# u'class': CSVImport, +# u'name': WizardStrings.CSV, +# u'prefix': u'csv', +# u'selectMode': SongFormatSelect.SingleFile + } + } @staticmethod - def get_formats_list(): + def get_format_list(): """ Return a list of the supported song formats. """ @@ -130,33 +313,65 @@ SongFormat.OpenLP1, SongFormat.Generic, SongFormat.CCLI, + SongFormat.DreamBeam, SongFormat.EasySlides, - SongFormat.EasyWorship, + SongFormat.EasyWorship, SongFormat.FoilPresenter, SongFormat.OpenSong, + SongFormat.PowerSong, SongFormat.SongBeamer, SongFormat.SongShowPlus, SongFormat.SongsOfFellowship, - SongFormat.WordsOfWorship + SongFormat.WordsOfWorship, + SongFormat.ZionWorx ] @staticmethod - def set_availability(format, available): + def get(format, *attributes): """ - Set the availability for a given song format. + Return requested song format attribute(s). + + ``format`` + A song format from SongFormat. + + ``*attributes`` + Zero or more song format attributes from SongFormat. + + Return type depends on number of supplied attributes: + + :0: Return dict containing all defined attributes for the format. + :1: Return the attribute value. + :>1: Return tuple of requested attribute values. """ - SongFormat._format_availability[format] = available + if not attributes: + return SongFormat.__attributes__.get(format) + elif len(attributes) == 1: + default = SongFormat.__defaults__.get(attributes[0]) + return SongFormat.__attributes__[format].get(attributes[0], + default) + else: + values = [] + for attr in attributes: + default = SongFormat.__defaults__.get(attr) + values.append(SongFormat.__attributes__[format].get(attr, + default)) + return tuple(values) @staticmethod - def get_availability(format): + def set(format, attribute, value): """ - Return the availability of a given song format. + Set specified song format attribute to the supplied value. """ - return SongFormat._format_availability.get(format, True) - -SongFormat.set_availability(SongFormat.OpenLP1, HAS_OPENLP1) -SongFormat.set_availability(SongFormat.SongsOfFellowship, HAS_SOF) -SongFormat.set_availability(SongFormat.Generic, HAS_OOO) + SongFormat.__attributes__[format][attribute] = value -__all__ = [u'SongFormat'] +SongFormat.set(SongFormat.OpenLP1, u'availability', HAS_OPENLP1) +if HAS_OPENLP1: + SongFormat.set(SongFormat.OpenLP1, u'class', OpenLP1SongImport) +SongFormat.set(SongFormat.SongsOfFellowship, u'availability', HAS_SOF) +if HAS_SOF: + SongFormat.set(SongFormat.SongsOfFellowship, u'class', SofImport) +SongFormat.set(SongFormat.Generic, u'availability', HAS_OOO) +if HAS_OOO: + SongFormat.set(SongFormat.Generic, u'class', OooImport) +__all__ = [u'SongFormat', u'SongFormatSelect'] diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/__init__.py openlp-1.9.10/openlp/plugins/songs/lib/__init__.py --- openlp-1.9.9/openlp/plugins/songs/lib/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -193,6 +194,7 @@ return default return verse_index + def retrieve_windows_encoding(recommendation=None): """ Determines which encoding to use on an information source. The process uses @@ -252,12 +254,14 @@ return None return filter(lambda item: item[1] == choice[0], encodings)[0][0] + def clean_string(string): """ Strips punctuation from the passed string to assist searching """ return WHITESPACE.sub(u' ', APOSTROPHE.sub(u'', string)).lower() - + + def clean_title(title): """ Cleans the song title by removing Unicode control chars groups C0 & C1, @@ -265,6 +269,7 @@ """ return CONTROL_CHARS.sub(u'', title).rstrip() + def clean_song(manager, song): """ Cleans the search title, rebuilds the search lyrics, adds a default author @@ -316,7 +321,7 @@ verse_type, verse[0][u'label'], verse[1], - verse[0][u'lang'] if verse[0].has_key(u'lang') else None + verse[0].get(u'lang') ) compare_order.append((u'%s%s' % (verse_type, verse[0][u'label']) ).upper()) @@ -326,7 +331,7 @@ # Rebuild the verse order, to convert translated verse tags, which might # have been added prior to 1.9.5. if song.verse_order: - order = song.verse_order.strip().split() + order = CONTROL_CHARS.sub(u'', song.verse_order).strip().split() else: order = [] new_order = [] @@ -358,6 +363,8 @@ author = Author.populate( display_name=name, last_name=u'', first_name=u'') song.authors.append(author) + if song.copyright: + song.copyright = CONTROL_CHARS.sub(u'', song.copyright).strip() from xml import OpenLyrics, SongXML from songstab import SongsTab diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/mediaitem.py openlp-1.9.10/openlp/plugins/songs/lib/mediaitem.py --- openlp-1.9.9/openlp/plugins/songs/lib/mediaitem.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/mediaitem.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -37,6 +38,7 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ translate, check_item_selected, PluginStatus, create_separated_list from openlp.core.lib.ui import UiStrings, create_widget_action +from openlp.core.lib.settings import Settings from openlp.core.utils import AppLocation from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \ SongImportForm, SongExportForm @@ -68,7 +70,7 @@ def __init__(self, parent, plugin, icon): self.IconPath = u'songs/song' MediaManagerItem.__init__(self, parent, plugin, icon) - self.editSongForm = EditSongForm(self, self.plugin.formparent, + self.editSongForm = EditSongForm(self, self.plugin.formParent, self.plugin.manager) self.openLyrics = OpenLyrics(self.plugin.manager) self.singleServiceItem = False @@ -119,7 +121,7 @@ QtCore.SIGNAL(u'cleared()'), self.onClearTextButtonClick) QtCore.QObject.connect(self.searchTextEdit, QtCore.SIGNAL(u'searchTypeChanged(int)'), - self.onSearchTextButtonClick) + self.onSearchTextButtonClicked) def addCustomContextActions(self): create_widget_action(self.listView, separator=True) @@ -131,13 +133,13 @@ self.searchTextEdit.setFocus() def configUpdated(self): - self.searchAsYouType = QtCore.QSettings().value( + self.searchAsYouType = Settings().value( self.settingsSection + u'/search as type', QtCore.QVariant(u'False')).toBool() - self.updateServiceOnEdit = QtCore.QSettings().value( + self.updateServiceOnEdit = Settings().value( self.settingsSection + u'/update service on edit', QtCore.QVariant(u'False')).toBool() - self.addSongFromService = QtCore.QSettings().value( + self.addSongFromService = Settings().value( self.settingsSection + u'/add song from service', QtCore.QVariant(u'True')).toBool() @@ -151,25 +153,31 @@ def initialise(self): self.searchTextEdit.setSearchTypes([ (SongSearch.Entire, u':/songs/song_search_all.png', - translate('SongsPlugin.MediaItem', 'Entire Song')), + translate('SongsPlugin.MediaItem', 'Entire Song'), + translate('SongsPlugin.MediaItem', 'Search Entire Song...')), (SongSearch.Titles, u':/songs/song_search_title.png', - translate('SongsPlugin.MediaItem', 'Titles')), + translate('SongsPlugin.MediaItem', 'Titles'), + translate('SongsPlugin.MediaItem', 'Search Titles...')), (SongSearch.Lyrics, u':/songs/song_search_lyrics.png', - translate('SongsPlugin.MediaItem', 'Lyrics')), + translate('SongsPlugin.MediaItem', 'Lyrics'), + translate('SongsPlugin.MediaItem', 'Search Lyrics...')), (SongSearch.Authors, u':/songs/song_search_author.png', - SongStrings.Authors), + SongStrings.Authors, + translate('SongsPlugin.MediaItem', 'Search Authors...')), (SongSearch.Books, u':/songs/song_book_edit.png', - SongStrings.SongBooks), - (SongSearch.Themes, u':/slides/slide_theme.png', UiStrings().Themes) + SongStrings.SongBooks, + translate('SongsPlugin.MediaItem', 'Search Song Books...')), + (SongSearch.Themes, u':/slides/slide_theme.png', + UiStrings().Themes, UiStrings().SearchThemes) ]) - self.searchTextEdit.setCurrentSearchType(QtCore.QSettings().value( + self.searchTextEdit.setCurrentSearchType(Settings().value( u'%s/last search type' % self.settingsSection, QtCore.QVariant(SongSearch.Entire)).toInt()[0]) self.configUpdated() - def onSearchTextButtonClick(self): + def onSearchTextButtonClicked(self): # Save the current search type to the configuration. - QtCore.QSettings().setValue(u'%s/last search type' % + Settings().setValue(u'%s/last search type' % self.settingsSection, QtCore.QVariant(self.searchTextEdit.currentSearchType())) # Reload the list considering the new search type. @@ -245,7 +253,7 @@ item = self.buildServiceItem(self.editItem) self.plugin.serviceManager.replaceServiceItem(item) self.onRemoteEditClear() - self.onSearchTextButtonClick() + self.onSearchTextButtonClicked() log.debug(u'onSongListLoad - finished') def displayResultsSong(self, searchresults): @@ -289,9 +297,8 @@ log.debug(u'display results Book') self.listView.clear() for book in searchresults: - songs = sorted(book.songs, key=lambda song: int( - re.sub(r'[^0-9]', u' ', song.song_number).partition(' ')[0]) - if len(re.sub(r'[^\w]', ' ', song.song_number)) else 0) + songs = sorted(book.songs, key=lambda song: + int(re.match(r'[0-9]+', u'0' + song.song_number).group())) for song in songs: # Do not display temporary songs if song.temporary: @@ -309,7 +316,7 @@ Clear the search text. """ self.searchTextEdit.clear() - self.onSearchTextButtonClick() + self.onSearchTextButtonClicked() def onSearchTextEditChanged(self, text): """ @@ -324,8 +331,8 @@ elif self.searchTextEdit.currentSearchType() == SongSearch.Lyrics: search_length = 3 if len(text) > search_length: - self.onSearchTextButtonClick() - elif len(text) == 0: + self.onSearchTextButtonClicked() + elif not text: self.onClearTextButtonClick() def onImportClick(self): @@ -402,6 +409,8 @@ QtGui.QMessageBox.No), QtGui.QMessageBox.Yes) == QtGui.QMessageBox.No: return + Receiver.send_message(u'cursor_busy') + self.plugin.formParent.displayProgressBar(len(items)) for item in items: item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] media_files = self.plugin.manager.get_all_objects(MediaFile, @@ -420,7 +429,10 @@ except OSError: log.exception(u'Could not remove directory: %s', save_path) self.plugin.manager.delete_object(Song, item_id) - self.onSearchTextButtonClick() + self.plugin.formParent.incrementProgressBar() + self.plugin.formParent.finishedProgressBar() + Receiver.send_message(u'cursor_normal') + self.onSearchTextButtonClicked() def onCloneClick(self): """ @@ -454,14 +466,14 @@ service_item.theme = song.theme_name service_item.edit_id = item_id if song.lyrics.startswith(u' 0: + if song.media_files: service_item.add_capability(ItemCapabilities.HasBackgroundAudio) service_item.background_audio = \ [m.file_name for m in song.media_files] @@ -564,20 +574,20 @@ editId = song.id break # If there's any backing tracks, copy them over. - if len(item.background_audio) > 0: + if item.background_audio: self._updateBackgroundAudio(song, item) if add_song and self.addSongFromService: song = self.openLyrics.xml_to_song(item.xml_version) # If there's any backing tracks, copy them over. - if len(item.background_audio) > 0: + if item.background_audio: self._updateBackgroundAudio(song, item) editId = song.id - self.onSearchTextButtonClick() + self.onSearchTextButtonClicked() elif add_song and not self.addSongFromService: # Make sure we temporary import formatting tags. song = self.openLyrics.xml_to_song(item.xml_version, True) # If there's any backing tracks, copy them over. - if len(item.background_audio) > 0: + if item.background_audio: self._updateBackgroundAudio(song, item) editId = song.id temporary = True diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/olp1import.py openlp-1.9.10/openlp/plugins/songs/lib/olp1import.py --- openlp-1.9.9/openlp/plugins/songs/lib/olp1import.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/olp1import.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -60,7 +61,7 @@ """ SongImport.__init__(self, manager, **kwargs) self.availableThemes = \ - kwargs[u'plugin'].formparent.themeManagerContents.getThemes() + kwargs[u'plugin'].formParent.themeManagerContents.getThemes() def doImport(self): """ @@ -122,8 +123,7 @@ cursor.execute( u'SELECT settingsid FROM songs WHERE songid = %s' % song_id) theme_id = cursor.fetchone()[0] - if themes.has_key(theme_id): - self.themeName = themes[theme_id] + self.themeName = themes.get(theme_id, u'') verses = lyrics.split(u'\n\n') for verse in verses: if verse.strip(): @@ -191,7 +191,7 @@ # Detect charset by songs. cursor.execute(u'SELECT name FROM sqlite_master ' u'WHERE type = \'table\' AND name = \'tracks\'') - if len(cursor.fetchall()) > 0: + if cursor.fetchall(): cursor.execute(u'SELECT fulltrackname FROM tracks') tracks = cursor.fetchall() for track in tracks: diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/olpimport.py openlp-1.9.10/openlp/plugins/songs/lib/olpimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/olpimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/olpimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/oooimport.py openlp-1.9.10/openlp/plugins/songs/lib/oooimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/oooimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/oooimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/openlyricsexport.py openlp-1.9.10/openlp/plugins/songs/lib/openlyricsexport.py --- openlp-1.9.9/openlp/plugins/songs/lib/openlyricsexport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/openlyricsexport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/openlyricsimport.py openlp-1.9.10/openlp/plugins/songs/lib/openlyricsimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/openlyricsimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/openlyricsimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/opensongimport.py openlp-1.9.10/openlp/plugins/songs/lib/opensongimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/opensongimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/opensongimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -31,6 +32,7 @@ from lxml import objectify from lxml.etree import Error, LxmlError +from openlp.core.lib import translate from openlp.plugins.songs.lib import VerseType from openlp.plugins.songs.lib.songimport import SongImport from openlp.plugins.songs.lib.ui import SongStrings @@ -128,6 +130,12 @@ log.exception(u'Error parsing XML') return root = tree.getroot() + if root.tag != u'song': + self.logError(file.name, unicode( + translate('SongsPlugin.OpenSongImport', + ('Invalid OpenSong song file. Missing ' + 'song tag.')))) + return fields = dir(root) decode = { u'copyright': self.addCopyright, @@ -167,7 +175,7 @@ if semicolon >= 0: this_line = this_line[:semicolon] this_line = this_line.strip() - if not len(this_line): + if not this_line: continue # skip guitar chords and page and column breaks if this_line.startswith(u'.') or this_line.startswith(u'---') \ @@ -180,8 +188,9 @@ content = this_line[1:right_bracket].lower() # have we got any digits? # If so, verse number is everything from the digits - # to the end (even if there are some alpha chars on the end) - match = re.match(u'(\D*)(\d+.*)', content) + # to the end (openlp does not have concept of part verses, so + # just ignore any non integers on the end (including floats)) + match = re.match(u'(\D*)(\d+)', content) if match is not None: verse_tag = match.group(1) verse_num = match.group(2) @@ -190,15 +199,12 @@ # the verse tag verse_tag = content verse_num = u'1' - if len(verse_tag) == 0: - verse_index = 0 - else: - verse_index = VerseType.from_loose_input(verse_tag) + verse_index = VerseType.from_loose_input(verse_tag) \ + if verse_tag else 0 verse_tag = VerseType.Tags[verse_index] inst = 1 if [verse_tag, verse_num, inst] in our_verse_order \ - and verses.has_key(verse_tag) \ - and verses[verse_tag].has_key(verse_num): + and verse_num in verses.get(verse_tag, {}): inst = len(verses[verse_tag][verse_num]) + 1 continue # number at start of line.. it's verse number @@ -206,11 +212,9 @@ verse_num = this_line[0] this_line = this_line[1:].strip() our_verse_order.append([verse_tag, verse_num, inst]) - if not verses.has_key(verse_tag): - verses[verse_tag] = {} - if not verses[verse_tag].has_key(verse_num): - verses[verse_tag][verse_num] = {} - if not verses[verse_tag][verse_num].has_key(inst): + verses.setdefault(verse_tag, {}) + verses[verse_tag].setdefault(verse_num, {}) + if inst not in verses[verse_tag][verse_num]: verses[verse_tag][verse_num][inst] = [] our_verse_order.append([verse_tag, verse_num, inst]) # Tidy text and remove the ____s from extended words @@ -220,9 +224,17 @@ verses[verse_tag][verse_num][inst].append(this_line) # done parsing # add verses in original order + verse_joints = {} for (verse_tag, verse_num, inst) in our_verse_order: - verse_def = u'%s%s' % (verse_tag, verse_num) lines = u'\n'.join(verses[verse_tag][verse_num][inst]) + length = 0 + while(length < len(verse_num) and verse_num[length].isnumeric()): + length += 1 + verse_def = u'%s%s' % (verse_tag, verse_num[:length]) + verse_joints[verse_def] = \ + u'%s\n[---]\n%s' % (verse_joints[verse_def], lines) \ + if verse_def in verse_joints else lines + for verse_def, lines in verse_joints.iteritems(): self.addVerse(lines, verse_def) if not self.verses: self.addVerse('') @@ -237,15 +249,14 @@ if match is not None: verse_tag = match.group(1) verse_num = match.group(2) - if not len(verse_tag): + if not verse_tag: verse_tag = VerseType.Tags[VerseType.Verse] else: # Assume it's no.1 if there are no digits verse_tag = verse_def verse_num = u'1' verse_def = u'%s%s' % (verse_tag, verse_num) - if verses.has_key(verse_tag) and \ - verses[verse_tag].has_key(verse_num): + if verse_num in verses.get(verse_tag, {}): self.verseOrderList.append(verse_def) else: log.info(u'Got order %s but not in verse tags, dropping' diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/powersongimport.py openlp-1.9.10/openlp/plugins/songs/lib/powersongimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/powersongimport.py 1970-01-01 00:00:00.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/powersongimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -0,0 +1,223 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # +############################################################################### +""" +The :mod:`powersongimport` module provides the functionality for importing +PowerSong songs into the OpenLP database. +""" +import logging +import fnmatch +import os + +from openlp.core.lib import translate +from openlp.plugins.songs.lib.songimport import SongImport + +log = logging.getLogger(__name__) + +class PowerSongImport(SongImport): + """ + The :class:`PowerSongImport` class provides the ability to import song files + from PowerSong. + + **PowerSong 1.0 Song File Format:** + + The file has a number of label-field (think key-value) pairs. + + Label and Field strings: + + * Every label and field is a variable length string preceded by an + integer specifying it's byte length. + * Integer is 32-bit but is encoded in 7-bit format to save space. Thus + if length will fit in 7 bits (ie <= 127) it takes up only one byte. + + Metadata fields: + + * Every PowerSong file has a TITLE field. + * There is zero or more AUTHOR fields. + * There is always a COPYRIGHTLINE label, but its field may be empty. + This field may also contain a CCLI number: e.g. "CCLI 176263". + + Lyrics fields: + + * Each verse is contained in a PART field. + * Lines have Windows line endings ``CRLF`` (0x0d, 0x0a). + * There is no concept of verse types. + + Valid extensions for a PowerSong song file are: + + * .song + """ + @staticmethod + def isValidSource(import_source): + """ + Checks if source is a PowerSong 1.0 folder: + * is a directory + * contains at least one *.song file + """ + if os.path.isdir(import_source): + for file in os.listdir(import_source): + if fnmatch.fnmatch(file, u'*.song'): + return True + return False + + def doImport(self): + """ + Receive either a list of files or a folder (unicode) to import. + """ + from importer import SongFormat + PS_string = SongFormat.get(SongFormat.PowerSong, u'name') + if isinstance(self.importSource, unicode): + if os.path.isdir(self.importSource): + dir = self.importSource + self.importSource = [] + for file in os.listdir(dir): + if fnmatch.fnmatch(file, u'*.song'): + self.importSource.append(os.path.join(dir, file)) + else: + self.importSource = u'' + if not self.importSource or not isinstance(self.importSource, list): + self.logError(unicode(translate('SongsPlugin.PowerSongImport', + 'No songs to import.')), + unicode(translate('SongsPlugin.PowerSongImport', + 'No %s files found.' % PS_string))) + return + self.importWizard.progressBar.setMaximum(len(self.importSource)) + for file in self.importSource: + if self.stopImportFlag: + return + self.setDefaults() + parse_error = False + with open(file, 'rb') as song_data: + while True: + try: + label = self._readString(song_data) + if not label: + break + field = self._readString(song_data) + except ValueError: + parse_error = True + self.logError(os.path.basename(file), unicode( + translate('SongsPlugin.PowerSongImport', + 'Invalid %s file. Unexpected byte value.' + % PS_string))) + break + else: + if label == u'TITLE': + self.title = field.replace(u'\n', u' ') + elif label == u'AUTHOR': + self.parseAuthor(field) + elif label == u'COPYRIGHTLINE': + found_copyright = True + self._parseCopyrightCCLI(field) + elif label == u'PART': + self.addVerse(field) + if parse_error: + continue + # Check that file had TITLE field + if not self.title: + self.logError(os.path.basename(file), unicode( + translate('SongsPlugin.PowerSongImport', + 'Invalid %s file. Missing "TITLE" header.' % PS_string))) + continue + # Check that file had COPYRIGHTLINE label + if not found_copyright: + self.logError(self.title, unicode( + translate('SongsPlugin.PowerSongImport', + 'Invalid %s file. Missing "COPYRIGHTLINE" ' + 'header.' % PS_string))) + continue + # Check that file had at least one verse + if not self.verses: + self.logError(self.title, unicode( + translate('SongsPlugin.PowerSongImport', + 'Verses not found. Missing "PART" header.'))) + continue + if not self.finish(): + self.logError(self.title) + + def _readString(self, file_object): + """ + Reads in next variable-length string. + """ + string_len = self._read7BitEncodedInteger(file_object) + return unicode(file_object.read(string_len), u'utf-8', u'ignore') + + def _read7BitEncodedInteger(self, file_object): + """ + Reads in a 32-bit integer in compressed 7-bit format. + + Accomplished by reading the integer 7 bits at a time. The high bit + of the byte when set means to continue reading more bytes. + If the integer will fit in 7 bits (ie <= 127), it only takes up one + byte. Otherwise, it may take up to 5 bytes. + + Reference: .NET method System.IO.BinaryReader.Read7BitEncodedInt + """ + val = 0 + shift = 0 + i = 0 + while True: + # Check for corrupted stream (since max 5 bytes per 32-bit integer) + if i == 5: + raise ValueError + byte = self._readByte(file_object) + # Strip high bit and shift left + val += (byte & 0x7f) << shift + shift += 7 + high_bit_set = byte & 0x80 + if not high_bit_set: + break + i += 1 + return val + + def _readByte(self, file_object): + """ + Reads in next byte as an unsigned integer + + Note: returns 0 at end of file. + """ + byte_str = file_object.read(1) + # If read result is empty, then reached end of file + if not byte_str: + return 0 + else: + return ord(byte_str) + + def _parseCopyrightCCLI(self, field): + """ + Look for CCLI song number, and get copyright + """ + copyright, sep, ccli_no = field.rpartition(u'CCLI') + if not sep: + copyright = ccli_no + ccli_no = u'' + if copyright: + self.addCopyright(copyright.rstrip(u'\n').replace(u'\n', u' ')) + if ccli_no: + ccli_no = ccli_no.strip(u' :') + if ccli_no.isdigit(): + self.ccliNumber = ccli_no diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/sofimport.py openlp-1.9.10/openlp/plugins/songs/lib/sofimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/sofimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/sofimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -345,7 +346,7 @@ u'I\'M', u'I\'LL', u'SAVIOUR', u'O', u'YOU\'RE', u'HE', u'HIS', u'HIM', u'ZION', u'EMMANUEL', u'MAJESTY', u'JESUS\'', u'JIREH', u'JUDAH', u'LION', u'LORD\'S', u'ABRAHAM', u'GOD\'S', - u'FATHER\'S', u'ELIJAH' u'MARTHA', u'CHRISTMAS', u'ALPHA', + u'FATHER\'S', u'ELIJAH' u'MARTHA', u'CHRISTMAS', u'ALPHA', u'OMEGA'): textarr[i] = textarr[i].capitalize() else: diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/songbeamerimport.py openlp-1.9.10/openlp/plugins/songs/lib/songbeamerimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/songbeamerimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/songbeamerimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/songimport.py openlp-1.9.10/openlp/plugins/songs/lib/songimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/songimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/songimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -24,6 +25,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### + import logging import re import shutil @@ -49,6 +51,13 @@ whether the authors etc already exist and add them or refer to them as necessary """ + @staticmethod + def isValidSource(import_source): + """ + Override this method to validate the source prior to import. + """ + return True + def __init__(self, manager, **kwargs): """ Initialise and create defaults for properties @@ -60,18 +69,20 @@ """ self.manager = manager QtCore.QObject.__init__(self) - if kwargs.has_key(u'filename'): + if u'filename' in kwargs: self.importSource = kwargs[u'filename'] - elif kwargs.has_key(u'filenames'): + elif u'filenames' in kwargs: self.importSource = kwargs[u'filenames'] + elif u'folder' in kwargs: + self.importSource = kwargs[u'folder'] else: - raise KeyError(u'Keyword arguments "filename[s]" not supplied.') + raise KeyError( + u'Keyword arguments "filename[s]" or "folder" not supplied.') log.debug(self.importSource) self.importWizard = None self.song = None self.stopImportFlag = False self.setDefaults() - self.errorLog = [] QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_stop_wizard'), self.stopImport) @@ -106,11 +117,11 @@ ``filepath`` This should be the file path if ``self.importSource`` is a list - with different files. If it is not a list, but a single file (for + with different files. If it is not a list, but a single file (for instance a database), then this should be the song's title. ``reason`` - The reason, why the import failed. The string should be as + The reason why the import failed. The string should be as informative as possible. """ self.setDefaults() @@ -272,7 +283,7 @@ Author not checked here, if no author then "Author unknown" is automatically added """ - if not self.title or not len(self.verses): + if not self.title or not self.verses: return False else: return True @@ -308,18 +319,15 @@ verses_changed_to_other[verse_def] = new_verse_def other_count += 1 verse_tag = VerseType.Tags[VerseType.Other] - log.info(u'Versetype %s changing to %s' , verse_def, + log.info(u'Versetype %s changing to %s', verse_def, new_verse_def) verse_def = new_verse_def sxml.add_verse_to_lyrics(verse_tag, verse_def[1:], verse_text, lang) song.lyrics = unicode(sxml.extract_xml(), u'utf-8') - if not len(self.verseOrderList) and \ - self.verseOrderListGeneratedUseful: + if not self.verseOrderList and self.verseOrderListGeneratedUseful: self.verseOrderList = self.verseOrderListGenerated - for i, current_verse_def in enumerate(self.verseOrderList): - if verses_changed_to_other.has_key(current_verse_def): - self.verseOrderList[i] = \ - verses_changed_to_other[current_verse_def] + self.verseOrderList = map(lambda v: verses_changed_to_other.get(v, v), + self.verseOrderList) song.verse_order = u' '.join(self.verseOrderList) song.copyright = self.copyright song.comments = self.comments diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/songshowplusimport.py openlp-1.9.10/openlp/plugins/songs/lib/songshowplusimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/songshowplusimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/songshowplusimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -25,8 +26,8 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`wowimport` module provides the functionality for importing Words of -Worship songs into the OpenLP database. +The :mod:`songshowplusimport` module provides the functionality for importing +SongShow Plus songs into the OpenLP database. """ import os import logging @@ -204,7 +205,7 @@ elif verse_type == "pre-chorus": verse_tag = VerseType.Tags[VerseType.PreChorus] else: - if not self.otherList.has_key(verse_name): + if verse_name not in self.otherList: if ignore_unique: return None self.otherCount = self.otherCount + 1 diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/songstab.py openlp-1.9.10/openlp/plugins/songs/lib/songstab.py --- openlp-1.9.9/openlp/plugins/songs/lib/songstab.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/songstab.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,6 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, translate +from openlp.core.lib.settings import Settings class SongsTab(SettingsTab): """ @@ -82,9 +84,8 @@ 'Display verses on live tool bar')) self.updateOnEditCheckBox.setText( translate('SongsPlugin.SongsTab', 'Update service from song edit')) - self.addFromServiceCheckBox.setText( - translate('SongsPlugin.SongsTab', - 'Add missing songs when opening service')) + self.addFromServiceCheckBox.setText(translate('SongsPlugin.SongsTab', + 'Import missing songs from service files')) def onSearchAsTypeCheckBoxChanged(self, check_state): self.song_search = False @@ -111,7 +112,7 @@ self.update_load = True def load(self): - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) self.song_search = settings.value( u'search as type', QtCore.QVariant(False)).toBool() @@ -128,7 +129,7 @@ settings.endGroup() def save(self): - settings = QtCore.QSettings() + settings = Settings() settings.beginGroup(self.settingsSection) settings.setValue(u'search as type', QtCore.QVariant(self.song_search)) settings.setValue(u'display songbar', QtCore.QVariant(self.tool_bar)) diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/test/test_import_file.py openlp-1.9.10/openlp/plugins/songs/lib/test/test_import_file.py --- openlp-1.9.9/openlp/plugins/songs/lib/test/test_import_file.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/test/test_import_file.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,11 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # # Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode # -# Woldsund # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/test/test_importing_lots.py openlp-1.9.10/openlp/plugins/songs/lib/test/test_importing_lots.py --- openlp-1.9.9/openlp/plugins/songs/lib/test/test_importing_lots.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/test/test_importing_lots.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,11 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # # Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode # -# Woldsund # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/test/test_opensongimport.py openlp-1.9.10/openlp/plugins/songs/lib/test/test_opensongimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/test/test_opensongimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/test/test_opensongimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,11 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # # Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode # -# Woldsund # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/ui.py openlp-1.9.10/openlp/plugins/songs/lib/ui.py --- openlp-1.9.9/openlp/plugins/songs/lib/ui.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/ui.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/upgrade.py openlp-1.9.10/openlp/plugins/songs/lib/upgrade.py --- openlp-1.9.9/openlp/plugins/songs/lib/upgrade.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/upgrade.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -75,6 +76,7 @@ ForeignKeyConstraint([u'song_id'], [u'songs.id'], table=tables[u'media_files']).create() + def upgrade_2(session, metadata, tables): """ Version 2 upgrade. @@ -86,6 +88,7 @@ Column(u'last_modified', types.DateTime(), default=func.now())\ .create(table=tables[u'songs']) + def upgrade_3(session, metadata, tables): """ Version 3 upgrade. diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/wowimport.py openlp-1.9.10/openlp/plugins/songs/lib/wowimport.py --- openlp-1.9.9/openlp/plugins/songs/lib/wowimport.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/wowimport.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -53,7 +54,7 @@ * A block can be a verse, chorus or bridge. File Header: - Bytes are counted from one, i.e. the first byte is byte 1. The first 19 + Bytes are counted from one, i.e. the first byte is byte 1. The first 19 bytes should be "WoW File \\nSong Words" The bytes after this and up to the 56th byte, can change but no real meaning has been found. The 56th byte specifies how many blocks there are. The first block starts @@ -71,7 +72,7 @@ * ``SOH`` (0x01) - Chorus * ``STX`` (0x02) - Bridge - Blocks are seperated by two bytes. The first byte is 0x01, and the + Blocks are separated by two bytes. The first byte is 0x01, and the second byte is 0x80. Lines: @@ -126,7 +127,7 @@ ('Invalid Words of Worship song file. Missing ' '"CSongDoc::CBlock" string.')))) continue - # Seek to the beging of the first block + # Seek to the beginning of the first block song_data.seek(82) for block in range(no_of_blocks): self.linesToRead = ord(song_data.read(4)[:1]) @@ -140,7 +141,7 @@ block_text += self.lineText self.linesToRead -= 1 block_type = BLOCK_TYPES[ord(song_data.read(4)[:1])] - # Blocks are seperated by 2 bytes, skip them, but not if + # Blocks are separated by 2 bytes, skip them, but not if # this is the last block! if block + 1 < no_of_blocks: song_data.seek(2, os.SEEK_CUR) diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/xml.py openlp-1.9.10/openlp/plugins/songs/lib/xml.py --- openlp-1.9.9/openlp/plugins/songs/lib/xml.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/xml.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -33,7 +34,7 @@ - + @@ -135,7 +136,7 @@ The returned list has the following format:: [[{'type': 'v', 'label': '1'}, - u"virtual slide 1[---]virtual slide 2"], + u"optional slide split 1[---]optional slide split 2"], [{'lang': 'en', 'type': 'c', 'label': '1'}, u"English chorus"]] """ self.song_xml = None @@ -317,9 +318,7 @@ tags_element = None match = re.search(u'\{/?\w+\}', song.lyrics, re.UNICODE) if match: - # Reset available tags. - FormattingTags.reset_html_tags() - # Named 'formatting' - 'format' is built-in fuction in Python. + # Named 'format_' - 'format' is built-in fuction in Python. format_ = etree.SubElement(song_xml, u'format') tags_element = etree.SubElement(format_, u'tags') tags_element.set(u'application', u'OpenLP') @@ -334,18 +333,59 @@ self._add_text_to_element(u'verse', lyrics, None, verse_def) if u'lang' in verse[0]: verse_element.set(u'lang', verse[0][u'lang']) - # Create a list with all "virtual" verses. - virtual_verses = cgi.escape(verse[1]) - virtual_verses = virtual_verses.split(u'[---]') - for index, virtual_verse in enumerate(virtual_verses): + # Create a list with all "optional" verses. + optional_verses = cgi.escape(verse[1]) + optional_verses = optional_verses.split(u'\n[---]\n') + start_tags = u'' + end_tags = u'' + for index, optional_verse in enumerate(optional_verses): + # Fix up missing end and start tags such as {r} or {/r}. + optional_verse = start_tags + optional_verse + start_tags, end_tags = self._get_missing_tags(optional_verse) + optional_verse += end_tags # Add formatting tags to text lines_element = self._add_text_with_tags_to_lines(verse_element, - virtual_verse, tags_element) + optional_verse, tags_element) # Do not add the break attribute to the last lines element. - if index < len(virtual_verses) - 1: + if index < len(optional_verses) - 1: lines_element.set(u'break', u'optional') return self._extract_xml(song_xml) + def _get_missing_tags(self, text): + """ + Tests the given text for not closed formatting tags and returns a tuple + consisting of two unicode strings:: + + (u'{st}{r}', u'{/r}{/st}') + + The first unicode string are the start tags (for the next slide). The + second unicode string are the end tags. + + ``text`` + The text to test. The text must **not** contain html tags, only + OpenLP formatting tags are allowed:: + + {st}{r}Text text text + """ + tags = [] + for tag in FormattingTags.get_html_tags(): + if tag[u'start tag'] == u'{br}': + continue + if text.count(tag[u'start tag']) != text.count(tag[u'end tag']): + tags.append((text.find(tag[u'start tag']), + tag[u'start tag'], tag[u'end tag'])) + # Sort the lists, so that the tags which were opened first on the first + # slide (the text we are checking) will be opened first on the next + # slide as well. + tags.sort(key=lambda tag: tag[0]) + end_tags = [] + start_tags = [] + for tag in tags: + start_tags.append(tag[1]) + end_tags.append(tag[2]) + end_tags.reverse() + return u''.join(start_tags), u''.join(end_tags) + def xml_to_song(self, xml, parse_and_temporary_save=False): """ Create and save a song from OpenLyrics format xml to the database. Since @@ -521,9 +561,9 @@ if hasattr(properties, u'comments'): comments_list = [] for comment in properties.comments.comment: - commenttext = self._text(comment) - if commenttext: - comments_list.append(commenttext) + comment_text = self._text(comment) + if comment_text: + comments_list.append(comment_text) song.comments = u'\n'.join(comments_list) def _process_copyright(self, properties, song): @@ -572,7 +612,8 @@ for tag in FormattingTags.get_html_tags()] new_tags = [tag for tag in found_tags if tag[u'start tag'] not in existing_tag_ids] - FormattingTags.add_html_tags(new_tags, True) + FormattingTags.add_html_tags(new_tags) + FormattingTags.save_html_tags() def _process_lines_mixed_content(self, element, newlines=True): """ @@ -611,7 +652,7 @@ text += u'{%s}' % element.get(u'name') # Some formattings may have only start tag. # Handle this case if element has no children and contains no text. - if len(element) == 0 and not element.text: + if not element and not element.text: use_endtag = False # Append text from element. if element.text: @@ -697,7 +738,7 @@ # Append text from "lines" element to verse text. text += self._process_verse_lines(lines, version=song_xml.get(u'version')) - # Add a virtual split to the verse text. + # Add an optional split to the verse text. if lines.get(u'break') is not None: text += u'\n[---]' verse_def = verse.get(u'name', u' ').lower() @@ -746,13 +787,13 @@ song.song_number = u'' if hasattr(properties, u'songbooks'): for songbook in properties.songbooks.songbook: - bookname = songbook.get(u'name', u'') - if bookname: + book_name = songbook.get(u'name', u'') + if book_name: book = self.manager.get_object_filtered(Book, - Book.name == bookname) + Book.name == book_name) if book is None: # We need to create a book, because it does not exist. - book = Book.populate(name=bookname, publisher=u'') + book = Book.populate(name=book_name, publisher=u'') self.manager.save_object(book) song.song_book_id = book.id song.song_number = songbook.get(u'entry', u'') @@ -787,14 +828,14 @@ The song object. """ if hasattr(properties, u'themes'): - for topictext in properties.themes.theme: - topictext = self._text(topictext) - if topictext: + for topic_text in properties.themes.theme: + topic_text = self._text(topic_text) + if topic_text: topic = self.manager.get_object_filtered(Topic, - Topic.name == topictext) + Topic.name == topic_text) if topic is None: # We need to create a topic, because it does not exist. - topic = Topic.populate(name=topictext) + topic = Topic.populate(name=topic_text) self.manager.save_object(topic) song.topics.append(topic) @@ -813,6 +854,7 @@ VerseError = 2 def __init__(self, type, log_message, display_message): + Exception.__init__(self) self.type = type self.log_message = log_message self.display_message = display_message diff -Nru openlp-1.9.9/openlp/plugins/songs/lib/zionworximport.py openlp-1.9.10/openlp/plugins/songs/lib/zionworximport.py --- openlp-1.9.9/openlp/plugins/songs/lib/zionworximport.py 1970-01-01 00:00:00.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/lib/zionworximport.py 2012-06-23 16:35:18.000000000 +0000 @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2012 Raoul Snyman # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # +############################################################################### +""" +The :mod:`zionworximport` module provides the functionality for importing +ZionWorx songs into the OpenLP database. +""" +import csv +import logging + +from openlp.core.lib import translate +from openlp.plugins.songs.lib.songimport import SongImport + +log = logging.getLogger(__name__) + +class ZionWorxImport(SongImport): + """ + The :class:`ZionWorxImport` class provides the ability to import songs + from ZionWorx, via a dump of the ZionWorx database to a CSV file. + + ZionWorx song database fields: + + * ``SongNum`` Song ID. (Discarded by importer) + * ``Title1`` Main Title. + * ``Title2`` Alternate Title. + * ``Lyrics`` Song verses, separated by blank lines. + * ``Writer`` Song author(s). + * ``Copyright`` Copyright information + * ``Keywords`` (Discarded by importer) + * ``DefaultStyle`` (Discarded by importer) + + ZionWorx has no native export function; it uses the proprietary TurboDB + database engine. The TurboDB vendor, dataWeb, provides tools which can + export TurboDB tables to other formats, such as freeware console tool + TurboDB Data Exchange which is available for Windows and Linux. This command + exports the ZionWorx songs table to a CSV file: + + ``tdbdatax MainTable.dat songstable.csv -fsdf -s, -qd`` + + * -f Table format: ``sdf`` denotes text file. + * -s Separator character between fields. + * -q Quote character surrounding fields. ``d`` denotes double-quote. + + CSV format expected by importer: + + * Field separator character is comma ``,`` + * Fields surrounded by double-quotes ``"``. This enables fields (such as + Lyrics) to include new-lines and commas. Double-quotes within a field + are denoted by two double-quotes ``""`` + * Note: This is the default format of the Python ``csv`` module. + + """ + def doImport(self): + """ + Receive a CSV file (from a ZionWorx database dump) to import. + """ + # Used to strip control chars (10=LF, 13=CR, 127=DEL) + self.control_chars_map = dict.fromkeys( + range(10) + [11, 12] + range(14,32) + [127]) + with open(self.importSource, 'rb') as songs_file: + fieldnames = [u'SongNum', u'Title1', u'Title2', u'Lyrics', + u'Writer', u'Copyright', u'Keywords', u'DefaultStyle'] + songs_reader = csv.DictReader(songs_file, fieldnames) + try: + records = list(songs_reader) + except csv.Error, e: + self.logError(unicode(translate('SongsPlugin.ZionWorxImport', + 'Error reading CSV file.')), + unicode(translate('SongsPlugin.ZionWorxImport', + 'Line %d: %s' % (songs_reader.line_num, e)))) + return + num_records = len(records) + log.info(u'%s records found in CSV file' % num_records) + self.importWizard.progressBar.setMaximum(num_records) + for index, record in enumerate(records, 1): + if self.stopImportFlag: + return + self.setDefaults() + try: + self.title = self._decode(record[u'Title1']) + if record[u'Title2']: + self.alternateTitle = self._decode(record[u'Title2']) + self.parseAuthor(self._decode(record[u'Writer'])) + self.addCopyright(self._decode(record[u'Copyright'])) + lyrics = self._decode(record[u'Lyrics']) + except UnicodeDecodeError, e: + self.logError(unicode(translate( + 'SongsPlugin.ZionWorxImport', 'Record %d' % index)), + unicode(translate('SongsPlugin.ZionWorxImport', + 'Decoding error: %s' % e))) + continue + except TypeError, e: + self.logError(unicode(translate( + 'SongsPlugin.ZionWorxImport', 'File not valid ZionWorx ' + 'CSV format.')), u'TypeError: %s' % e) + return + verse = u'' + for line in lyrics.splitlines(): + if line and not line.isspace(): + verse += line + u'\n' + elif verse: + self.addVerse(verse) + verse = u'' + if verse: + self.addVerse(verse) + title = self.title + if not self.finish(): + self.logError(unicode(translate( + 'SongsPlugin.ZionWorxImport', 'Record %d' % index)) + + (u': "' + title + u'"' if title else u'')) + + def _decode(self, str): + """ + Decodes CSV input to unicode, stripping all control characters (except + new lines). + """ + # This encoding choice seems OK. ZionWorx has no option for setting the + # encoding for its songs, so we assume encoding is always the same. + return unicode(str, u'cp1252').translate(self.control_chars_map) diff -Nru openlp-1.9.9/openlp/plugins/songs/songsplugin.py openlp-1.9.10/openlp/plugins/songs/songsplugin.py --- openlp-1.9.9/openlp/plugins/songs/songsplugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songs/songsplugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -61,8 +62,8 @@ Plugin.__init__(self, u'songs', plugin_helpers, SongMediaItem, SongsTab) self.manager = Manager(u'songs', init_schema, upgrade_mod=upgrade) self.weight = -10 - self.icon_path = u':/plugins/plugin_songs.png' - self.icon = build_icon(self.icon_path) + self.iconPath = u':/plugins/plugin_songs.png' + self.icon = build_icon(self.iconPath) def checkPreConditions(self): return self.manager.session is not None @@ -144,14 +145,14 @@ return progressDialog = QtGui.QProgressDialog( translate('SongsPlugin', 'Reindexing songs...'), UiStrings().Cancel, - 0, maxSongs, self.formparent) + 0, maxSongs, self.formParent) progressDialog.setWindowModality(QtCore.Qt.WindowModal) songs = self.manager.get_all_objects(Song) for number, song in enumerate(songs): clean_song(self.manager, song) progressDialog.setValue(number + 1) self.manager.save_objects(songs) - self.mediaItem.onSearchTextButtonClick() + self.mediaItem.onSearchTextButtonClicked() def onSongImportItemClicked(self): if self.mediaItem: @@ -194,7 +195,8 @@ self.manager.save_object(song) def importSongs(self, format, **kwargs): - class_ = SongFormat.get_class(format) + class_ = SongFormat.get(format, u'class') + kwargs[u'plugin'] = self importer = class_(self.manager, **kwargs) importer.register(self.mediaItem.importWizard) return importer @@ -239,9 +241,9 @@ for sfile in os.listdir(db_dir): if sfile.startswith(u'songs_') and sfile.endswith(u'.sqlite'): song_dbs.append(os.path.join(db_dir, sfile)) - if len(song_dbs) == 0: + if not song_dbs: return - progress = QtGui.QProgressDialog(self.formparent) + progress = QtGui.QProgressDialog(self.formParent) progress.setWindowModality(QtCore.Qt.WindowModal) progress.setLabelText(translate('OpenLP.Ui', 'Starting import...')) progress.setCancelButton(None) @@ -254,7 +256,7 @@ importer = OpenLPSongImport(self.manager, filename=db) importer.doImport() progress.setValue(len(song_dbs)) - self.mediaItem.onSearchTextButtonClick() + self.mediaItem.onSearchTextButtonClicked() def finalise(self): """ diff -Nru openlp-1.9.9/openlp/plugins/songusage/forms/__init__.py openlp-1.9.10/openlp/plugins/songusage/forms/__init__.py --- openlp-1.9.9/openlp/plugins/songusage/forms/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songusage/forms/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songusage/forms/songusagedeletedialog.py openlp-1.9.10/openlp/plugins/songusage/forms/songusagedeletedialog.py --- openlp-1.9.9/openlp/plugins/songusage/forms/songusagedeletedialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songusage/forms/songusagedeletedialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,6 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate +from openlp.core.lib.ui import create_button_box class Ui_SongUsageDeleteDialog(object): def setupUi(self, songUsageDeleteDialog): @@ -47,10 +49,8 @@ QtGui.QCalendarWidget.NoVerticalHeader) self.deleteCalendar.setObjectName(u'deleteCalendar') self.verticalLayout.addWidget(self.deleteCalendar) - self.buttonBox = QtGui.QDialogButtonBox(songUsageDeleteDialog) - self.buttonBox.setStandardButtons( - QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Cancel) - self.buttonBox.setObjectName(u'buttonBox') + self.buttonBox = create_button_box(songUsageDeleteDialog, u'buttonBox', + [u'cancel', u'ok']) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(songUsageDeleteDialog) diff -Nru openlp-1.9.9/openlp/plugins/songusage/forms/songusagedeleteform.py openlp-1.9.10/openlp/plugins/songusage/forms/songusagedeleteform.py --- openlp-1.9.9/openlp/plugins/songusage/forms/songusagedeleteform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songusage/forms/songusagedeleteform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songusage/forms/songusagedetaildialog.py openlp-1.9.10/openlp/plugins/songusage/forms/songusagedetaildialog.py --- openlp-1.9.9/openlp/plugins/songusage/forms/songusagedetaildialog.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songusage/forms/songusagedetaildialog.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -28,7 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, translate -from openlp.core.lib.ui import create_accept_reject_button_box +from openlp.core.lib.ui import create_button_box class Ui_SongUsageDetailDialog(object): def setupUi(self, songUsageDetailDialog): @@ -74,14 +75,13 @@ self.saveFilePushButton.setObjectName(u'saveFilePushButton') self.fileHorizontalLayout.addWidget(self.saveFilePushButton) self.verticalLayout.addWidget(self.fileGroupBox) - self.buttonBox = create_accept_reject_button_box( - songUsageDetailDialog, True) + self.buttonBox = create_button_box(songUsageDetailDialog, u'buttonBox', + [u'cancel', u'ok']) self.verticalLayout.addWidget(self.buttonBox) self.retranslateUi(songUsageDetailDialog) QtCore.QObject.connect(self.saveFilePushButton, - QtCore.SIGNAL(u'pressed()'), + QtCore.SIGNAL(u'clicked()'), songUsageDetailDialog.defineOutputLocation) - QtCore.QMetaObject.connectSlotsByName(songUsageDetailDialog) def retranslateUi(self, songUsageDetailDialog): songUsageDetailDialog.setWindowTitle( diff -Nru openlp-1.9.9/openlp/plugins/songusage/forms/songusagedetailform.py openlp-1.9.10/openlp/plugins/songusage/forms/songusagedetailform.py --- openlp-1.9.9/openlp/plugins/songusage/forms/songusagedetailform.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songusage/forms/songusagedetailform.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -33,6 +34,7 @@ from openlp.core.lib import SettingsManager, translate, Receiver, \ check_directory_exists +from openlp.core.lib.settings import Settings from openlp.plugins.songusage.lib.db import SongUsageItem from songusagedetaildialog import Ui_SongUsageDetailDialog @@ -59,10 +61,10 @@ year = QtCore.QDate().currentDate().year() if QtCore.QDate().currentDate().month() < 9: year -= 1 - toDate = QtCore.QSettings().value( + toDate = Settings().value( u'songusage/to date', QtCore.QVariant(QtCore.QDate(year, 8, 31))).toDate() - fromDate = QtCore.QSettings().value( + fromDate = Settings().value( u'songusage/from date', QtCore.QVariant(QtCore.QDate(year - 1, 9, 1))).toDate() self.fromDate.setSelectedDate(fromDate) @@ -72,7 +74,7 @@ def defineOutputLocation(self): """ - Triggered when the Directory selection button is pressed + Triggered when the Directory selection button is clicked """ path = QtGui.QFileDialog.getExistingDirectory(self, translate('SongUsagePlugin.SongUsageDetailForm', @@ -85,7 +87,7 @@ def accept(self): """ - Ok was pressed so lets save the data and run the report + Ok was triggered so lets save the data and run the report """ log.debug(u'accept') path = unicode(self.fileLineEdit.text()) @@ -103,9 +105,9 @@ 'usage_detail_%s_%s.txt')) % ( self.fromDate.selectedDate().toString(u'ddMMyyyy'), self.toDate.selectedDate().toString(u'ddMMyyyy')) - QtCore.QSettings().setValue(u'songusage/from date', + Settings().setValue(u'songusage/from date', QtCore.QVariant(self.fromDate.selectedDate())) - QtCore.QSettings().setValue(u'songusage/to date', + Settings().setValue(u'songusage/to date', QtCore.QVariant(self.toDate.selectedDate())) usage = self.plugin.manager.get_all_objects( SongUsageItem, and_( @@ -118,7 +120,7 @@ fileHandle = open(outname, u'w') for instance in usage: record = u'\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",' \ - u'\"%s\",\"%s\"\n' % ( instance.usagedate, + u'\"%s\",\"%s\"\n' % (instance.usagedate, instance.usagetime, instance.title, instance.copyright, instance.ccl_number, instance.authors, instance.plugin_name, instance.source) diff -Nru openlp-1.9.9/openlp/plugins/songusage/__init__.py openlp-1.9.10/openlp/plugins/songusage/__init__.py --- openlp-1.9.9/openlp/plugins/songusage/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songusage/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songusage/lib/db.py openlp-1.9.10/openlp/plugins/songusage/lib/db.py --- openlp-1.9.9/openlp/plugins/songusage/lib/db.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songusage/lib/db.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songusage/lib/__init__.py openlp-1.9.10/openlp/plugins/songusage/lib/__init__.py --- openlp-1.9.9/openlp/plugins/songusage/lib/__init__.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songusage/lib/__init__.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songusage/lib/upgrade.py openlp-1.9.10/openlp/plugins/songusage/lib/upgrade.py --- openlp-1.9.9/openlp/plugins/songusage/lib/upgrade.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songusage/lib/upgrade.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/openlp/plugins/songusage/songusageplugin.py openlp-1.9.10/openlp/plugins/songusage/songusageplugin.py --- openlp-1.9.9/openlp/plugins/songusage/songusageplugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp/plugins/songusage/songusageplugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -34,6 +35,7 @@ translate from openlp.core.lib.db import Manager from openlp.core.lib.ui import create_action +from openlp.core.lib.settings import Settings from openlp.core.utils.actions import ActionList from openlp.plugins.songusage.forms import SongUsageDetailForm, \ SongUsageDeleteForm @@ -98,13 +100,13 @@ self.songUsageMenu.addAction(self.songUsageReport) self.songUsageMenu.addAction(self.songUsageDelete) self.songUsageActiveButton = QtGui.QToolButton( - self.formparent.statusBar) + self.formParent.statusBar) self.songUsageActiveButton.setCheckable(True) self.songUsageActiveButton.setAutoRaise(True) self.songUsageActiveButton.setStatusTip(translate('SongUsagePlugin', 'Toggle the tracking of song usage.')) self.songUsageActiveButton.setObjectName(u'songUsageActiveButton') - self.formparent.statusBar.insertPermanentWidget(1, + self.formParent.statusBar.insertPermanentWidget(1, self.songUsageActiveButton) self.songUsageActiveButton.hide() # Signals and slots @@ -125,7 +127,7 @@ QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'print_service_started'), self.printSongUsage) - self.songUsageActive = QtCore.QSettings().value( + self.songUsageActive = Settings().value( self.settingsSection + u'/active', QtCore.QVariant(False)).toBool() # Set the button and checkbox state @@ -138,8 +140,8 @@ action_list.add_action(self.songUsageReport, unicode(translate('SongUsagePlugin', 'Song Usage'))) self.songUsageDeleteForm = SongUsageDeleteForm(self.manager, - self.formparent) - self.songUsageDetailForm = SongUsageDetailForm(self, self.formparent) + self.formParent) + self.songUsageDetailForm = SongUsageDetailForm(self, self.formParent) self.songUsageMenu.menuAction().setVisible(True) self.songUsageActiveButton.show() @@ -168,7 +170,7 @@ the UI when necessary, """ self.songUsageActive = not self.songUsageActive - QtCore.QSettings().setValue(self.settingsSection + u'/active', + Settings().setValue(self.settingsSection + u'/active', QtCore.QVariant(self.songUsageActive)) self.setButtonState() diff -Nru openlp-1.9.9/openlp/.version openlp-1.9.10/openlp/.version --- openlp-1.9.9/openlp/.version 2012-05-04 16:33:17.000000000 +0000 +++ openlp-1.9.10/openlp/.version 2012-06-23 16:39:12.000000000 +0000 @@ -1 +1 @@ -1.9.9 +1.9.10 diff -Nru openlp-1.9.9/openlp.pyw openlp-1.9.10/openlp.pyw --- openlp-1.9.9/openlp.pyw 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/openlp.pyw 2012-06-23 16:35:18.000000000 +0000 @@ -7,10 +7,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -26,12 +27,6 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -# Import uuid now, to avoid the rare bug described in the support system: -# http://support.openlp.org/issues/102 -# If https://bugs.gentoo.org/show_bug.cgi?id=317557 is fixed, the import can be -# removed. -import uuid - from openlp.core import main diff -Nru openlp-1.9.9/resources/i18n/af.ts openlp-1.9.10/resources/i18n/af.ts --- openlp-1.9.9/resources/i18n/af.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/af.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert W&aarskuwing - + Show an alert message. Vertoon 'n waarskuwing boodskap. - + Alert name singular Waarskuwing - + Alerts name plural Waarskuwings - + Alerts container title Waarskuwings - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Waarskuwing Mini-program</strong><br/>Die waarskuwing mini-program beheer die vertoning van moederskamer inligting op die vertoon skerm. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Waarskuwing Boodskap - + Alert &text: Waarskuwing &teks: - + &New &Nuwe - + &Save &Stoor - + Displ&ay V&ertoon - + Display && Cl&ose Vert&oon && Maak toe @@ -79,7 +79,7 @@ Daar is geen teks vir die waarskuwing gespesifiseer nie. Tik asseblief teks in voordat 'n nuwe een bygevoeg word. - + &Parameter: &Parameter: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Skrif - + Font name: Skrif naam: - + Font color: Skrif kleur: - + Background color: Agtergrond kleur: - + Font size: Skrif grootte: - + Alert timeout: Waarskuwing verstreke-tyd: @@ -152,551 +152,599 @@ BiblesPlugin - + &Bible &Bybel - + Bible name singular Bybel - + Bibles name plural Bybels - + Bibles container title Bybels - + No Book Found Geen Boek Gevind nie - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Geen passende boek kon in hierdie Bybel gevind word nie. Gaan na dat die naam van die boek korrek gespel is. - + Import a Bible. Voer 'n Bybel in. - + Add a new Bible. Voeg 'n nuwe Bybel by. - + Edit the selected Bible. Redigeer geselekteerde Bybel. - + Delete the selected Bible. Wis die geselekteerde Bybel uit. - + Preview the selected Bible. Voorskou die geselekteerde Bybel. - + Send the selected Bible live. Stuur die geselekteerde Bybel regstreeks. - + Add the selected Bible to the service. Voeg die geselekteerde Bybel by die diens. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Bybel Mini-program</strong<br />Die Bybel mini-program verskaf die vermoë om Bybelverse vanaf verskillende bronne te vertoon tydens die diens. - + &Upgrade older Bibles &Opgradeer ouer Bybels - + Upgrade the Bible databases to the latest format. Opgradeer die Bybel databasisse na die nuutste formaat. - + Genesis Genesis - + Exodus Eksodus - + Leviticus Livitikus - + Numbers Numeri - + Deuteronomy Deuterononium - + Joshua Josua - + Judges Rigters - + Ruth Rut - + 1 Samuel 1 Samuel - + 2 Samuel 2 Samuel - + 1 Kings 1 Konings - + 2 Kings 2 Konings - + 1 Chronicles 1 Kronieke - + 2 Chronicles 2 Kronieke - + Ezra Esra - + Nehemiah Nehemia - + Esther Ester - + Job Job - + Psalms Psalms - + Proverbs Spreuke van Salomo - + Ecclesiastes Prediker - + Song of Solomon Hooglied van Salomo - + Isaiah Jesaja - + Jeremiah Jeremia - + Lamentations Klaagliedere van Jeremia - + Ezekiel Esegiël - + Daniel Daniël - + Hosea Hosea - + Joel Joël - + Amos Amos - + Obadiah Obadja - + Jonah Jona - + Micah Miga - + Nahum Nahum - + Habakkuk Habakuk - + Zephaniah Sefanja - + Haggai Haggai - + Zechariah Sagaria - + Malachi Maleagi - + Matthew Matteus - + Mark Markus - + Luke Lukas - + John Johannes - + Acts Handelinge - + Romans Romeine - + 1 Corinthians 1 Korintiërs - + 2 Corinthians 2 Korintiërs - + Galatians Galasiërs - + Ephesians Effesiërs - + Philippians Filippense - + Colossians Kolossense - + 1 Thessalonians 1 Tessalonisense - + 2 Thessalonians 2 Tessalonisense - + 1 Timothy 1 Timoteus - + 2 Timothy 2 Timoteus - + Titus Titus - + Philemon Filemon - + Hebrews Hebreërs - + James Jakobus - + 1 Peter 1 Petrus - + 2 Peter 2 Petrus - + 1 John 1 Johannes - + 2 John 2 Johannes - + 3 John 3 Johannes - + Jude Judas - + Revelation Openbaring - + Judith Judit - + Wisdom Wysheid van Salomo - + Tobit Tobit - + Sirach Sirag - + Baruch Barug - + 1 Maccabees 1 Makkabeërs - + 2 Maccabees 2 Makkabeërs - + 3 Maccabees 3 Makkabeërs - + 4 Maccabees 4 Makkabeërs - + Rest of Daniel Byvoegings tot Daniël - + Rest of Esther Byvoegings tot Ester - + Prayer of Manasses Gebed van Manasse - + Letter of Jeremiah Brief van Jeremia - + Prayer of Azariah Gebed van Asarja - + Susanna Susanna - + Bel Bel en die Draak - + 1 Esdras 1 Esdras - + 2 Esdras 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. :|v|V|verse|verses;;-|to;;,|and;;end + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Dit is nodig dat 'n weergawe naam vir die Bybel gespesifiseer word. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + 'n Kopiereg moet vir jou Bybel ingestel word. Bybels in die Publieke Domein moet sodanig gemerk word. + + + + Bible Exists + Bybel Bestaan + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Hierdie Bybel bestaan reeds. Voer asseblief 'n ander Bybel in, of wis eerstens die bestaande een uit. + + + + You need to specify a book name for "%s". + 'n Boek naam moet vir "%s" gespesifiseer word. + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + Die boek naam "%s" is nie korrek nie. +Nommers kan slegs aan die begin gebruik word +en moet gevolg word deur een of meer nie-numeriese +karrakters. + + + + Duplicate Book Name + Duplikaat Boek Naam + + + + The Book Name "%s" has been entered more than once. + Die Boek Naam "%s" is meer as een keer ingevoer. + + + BiblesPlugin.BibleManager - + Scripture Reference Error Skrif Verwysing Fout - + Web Bible cannot be used Web Bybel kan nie gebruik word nie - + Text Search is not available with Web Bibles. Teks Soektog is nie beskikbaar met Web Bybels nie. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Daar is nie 'n soek sleutelwoord ingevoer nie. Vir 'n soektog wat alle sleutelwoorde bevat, skei die woorde deur middel van 'n spasie. Vir 'n soektog wat een van die sleutelwoorde bevat, skei die woorde deur middel van 'n komma. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Huidig is daar geen Bybels geïnstalleer nie. Gebruik asseblief die Invoer Gids om een of meer Bybels te installeer. - + No Bibles Available Geeb Bybels Beskikbaar nie - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +767,79 @@ BiblesPlugin.BiblesTab - + Verse Display Vers Vertoning - + Only show new chapter numbers Vertoon net nuwe hoofstuk nommers - + Bible theme: Bybel tema: - + No Brackets Geen Hakkies - + ( And ) ( En ) - + { And } { En } - + [ And ] [ En ] - + Note: Changes do not affect verses already in the service. Nota: Veranderinge affekteer nie verse wat reeds in die diens is nie. - + Display second Bible verses Vertoon tweede Bybel se verse - + Custom Scripture References Aangepasde Skrifgedeelte Verwysing - + Verse Separator: Vers Verdeler: - + Range Separator: Reeks Verdeler: - + List Separator: Lys Verdeler: - + End Mark: End Merk: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +848,7 @@ Maak asseblief hierdie redigeer lyn skoon om die verstek waarde te gebruik. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +857,7 @@ Maak asseblief hierdie redigeer lyn skoon om die verstek waarde te gebruik. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +866,7 @@ Maak asseblief hierdie redigeer lyn skoon om die verstek waarde te gebruik. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,91 +875,80 @@ Maak asseblief hierdie redigeer lyn skoon om die verstek waarde te gebruik. - - Preferred Bookname Language - Voorkeur Boek Naam Taal - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Kies die taal waarin die boek name van die -Bybel vertoon moet word in die Bybel soektog: + + English + Engels - - Bible language - Bybel taal + + Default Bible Language + Verstek Bybel Taal - - Application language - Program taal + + Book name language in search field, +search results and on display: + Boek naam taal in soek veld, +soek resultate en op die vertoning: - - English - Engels + + Bible Language + Bybel Taal - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Veelvoudige opsies: -Bybel taal - die taal waarin die Bybel name ingevoer was -Program taal - die taal wat gekies is om te gebruik in OpenLP -Engels - gebruik altyd Engelse boek name + + Application Language + Program Taal BiblesPlugin.BookNameDialog - + Select Book Name Selekteer Boek Naam - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Die volgende boek naam kan nie intern gepas word nie. Kies asseblief die ooreenstemmende Engelse naam van die lys. - - - + Current name: Huidige naam: - + Corresponding name: Ooreenstemmende naam: - + Show Books From Wys Boeke Van - + Old Testament Ou Testament - + New Testament Nuwe Testament - + Apocrypha Apokriewe + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + Die volgende boek name kon nie intern gepas word nie. Kies asseblief die ooreenstemmende naam van die lys. + BiblesPlugin.BookNameForm - + You need to select a book. Kies asseblief 'n boek. @@ -936,40 +973,110 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Bybel Redigeerder + + + + License Details + Lisensie Besonderhede + + + + Version name: + Weergawe naam: + + + + Copyright: + Kopiereg: + + + + Permissions: + Toestemming: + + + + Default Bible Language + Verstek Bybel Taal + + + + Book name language in search field, search results and on display: + Boek naam taal in soek veld, soek resultate en op die vertoning: + + + + Global Settings + Globale Instellings + + + + Bible Language + Bybel Taal + + + + Application Language + Program Taal + + + + English + Engels + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + Hierdie is 'n Web Aflaai Bybel. +Dit is nie moontlik om die Boek Name aan te pas nie. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + Om eie boek name te gebruik, "Bybel taal" moet in die Meta Data blad gekies wees, of wanneer "Globale instellings" geselekteer is, op die Bybel bladsy OpenLP Instelling. + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registreer Bybel en laai boeke... - + Registering Language... Taal registrasie... - + Importing %s... Importing <book name>... Voer %s in... - + Download Error Aflaai Fout - + 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. Daar was 'n probleem om die vers seleksie af te laai. Gaan die Internet konneksie na en as hierdie probleem voortduur, oorweeg dit asseblief om 'n gogga te rapporteer. - + Parse Error Ontleed Fout - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Daar was 'n probleem om die vers seleksie te onttrek. As hierdie probleem voortduur, oorweeg dit asseblief om 'n gogga te rapporteer. @@ -1147,17 +1254,17 @@ BiblesPlugin.LanguageDialog - + Select Language Kies 'n Taal - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP is nie in staat om die taal van hierdie vertaling Bybel te bepaal nie. Kies asseblief die taal van die lys hieronder. - + Language: Taal: @@ -1173,85 +1280,100 @@ BiblesPlugin.MediaItem - + Quick Vinnig - + Find: Vind: - + Book: Boek: - + Chapter: Hoofstuk: - + Verse: Vers: - + From: Vanaf: - + To: Tot: - + Text Search Teks Soektog - + Second: Tweede: - + Scripture Reference Skrif Verwysing - + Toggle to keep or clear the previous results. Wissel om die vorige resultate te behou of te verwyder. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Enkel en dubbel Bybel-vers soek-resultate kan nie gekombineer word nie. Wis die resultate uit en begin 'n nuwe soektog? - + Bible not fully loaded. Die Bybel is nie ten volle gelaai nie. - + Information Informasie - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. Die tweede Bybel het nie al die verse wat in die hoof Bybel is nie. Slegs verse wat in beide Bybels voorkom, sal gewys word. %d verse is nie by die resultate ingesluit nie. + + + Search Scripture Reference... + Soek Skriflesing Verwysing... + + + + Search Text... + Soek Teks... + + + + Are you sure you want to delete "%s"? + Wis "%s" sekerlik uit? + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Invoer %s %s... @@ -1260,12 +1382,12 @@ 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... @@ -1274,122 +1396,122 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Kies 'n Rugsteun Ligging - + Bible Upgrade Wizard Bybel Opgradeer Gids - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Hierdie gids sal help om die bestaande Bybels vanaf 'n vorige weergawe van OpenLP 2.0 op te gradeer. Kliek die volgende knoppie hier-onder om die opgradeer proses te begin. - + Select Backup Directory Kies Rugsteun Ligging - + Please select a backup directory for your Bibles Kies asseblief 'n rugsteun liging vir die Bybels - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Vorige weergawes van OpenLP 2.0 is nie in staat om opgegradeerde Bybels te gebruik nie. Hierdie sal 'n rugsteun van die bestaande Bybels maak sodat indien dit nodig is om terug te gaan na 'n vorige weergawe van OpenLP, die Bybels net terug gekopiër kan word. Instruksies oor hoe om lêers te herstel kan gevind word by ons <a href="http://wiki.openlp.org/faq">Gereelde Vrae</a>. - + Please select a backup location for your Bibles. Kies asseblief 'n rugsteun ligging vir die Bybels. - + Backup Directory: Rugsteun Ligging: - + There is no need to backup my Bibles Dit is nie nodig om die Bybels op te gradeer nie - + Select Bibles Kies Bybels - + Please select the Bibles to upgrade Kies asseblief die Bybels om op te gradeer - + Upgrading Opgradeer - + Please wait while your Bibles are upgraded. Wag asseblief terwyl die Bybels opgradeer word. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. Die rugsteun was nie suksesvol nie. Om die Bybels op te gradeer word skryf-toestemming benodig vir die gegewe lêer. - + Upgrading Bible %s of %s: "%s" Failed Opgradeer Bybel %s van %s: "%s" Gevaal - + Upgrading Bible %s of %s: "%s" Upgrading ... Opgradeer Bybel %s van %s: "%s" Opgradeer ... - + Download Error Aflaai Fout - + To upgrade your Web Bibles an Internet connection is required. Om die Web Bybels op te gradeer is 'n Internet verbinding nodig. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Opgradeer Bybel %s van %s: "%s" Opgradering %s... - + Upgrading Bible %s of %s: "%s" Complete Opgradeer Bybel %s van %s: "%s" Volledig - + , %s failed , %s het gevaal - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Opgradeer Bybel(s): %s suksesvol %s @@ -1397,27 +1519,27 @@ word en dus is 'n Internet verbinding nodig. - + Upgrading Bible(s): %s successful%s Opgradeer Bybel(s): %s suksesvol %s - + Upgrade failed. Opgradeer het gevaal. - + You need to specify a backup directory for your Bibles. 'n Rugsteun Ligging moet vir die Bybels gespesifiseer word. - + Starting upgrade... Opgradering begin... - + There are no Bibles that need to be upgraded. Daar is geen Bybels wat opgradering benodig nie. @@ -1491,12 +1613,12 @@ CustomPlugin.CustomTab - + Custom Display Aangepasde Vertoning - + Display footer Vertoon voetspasie @@ -1504,42 +1626,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Redigeer Aangepaste Skyfies - + &Title: &Titel: - + Add a new slide at bottom. Voeg nuwe skyfie by aan die onderkant. - + Edit the selected slide. Redigeer die geselekteerde skyfie. - + Edit all the slides at once. Redigeer al die skyfies tegelyk. - + Split a slide into two by inserting a slide splitter. Verdeel 'n skyfie deur 'n skyfie-verdeler te gebruik. - + The&me: Te&ma: - + &Credits: &Krediete: @@ -1554,12 +1676,12 @@ Ten minste een skyfie moet bygevoeg word - + Ed&it All Red&igeer Alles - + Insert Slide Voeg 'n Skyfie in @@ -1567,7 +1689,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Wis sekerlik die %n gekose aangepasde skyfie uit? @@ -1578,60 +1700,60 @@ ImagePlugin - + <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>Beeld Mini-program</strong><br/>Die beeld mini-program verskaf vertoning van beelde.<br/>Een van die onderskeidende kenmerke van hierdie mini-program is die vermoë om beelde te groepeer in die diensbestuurder wat dit maklik maak om verskeie beelde te vertoon. Die mini-program kan ook van OpenLP se "tydgebonde herhaling"-funksie gebruik maak om 'n automatiese skyfe-vertoning te verkry. Verder kan beelde van hierdie mini-program gebruik word om die huidige tema se agtergrond te vervang hoewel 'n tema sy eie agtergrond het. - + Image name singular Beeld - + Images name plural Beelde - + Images container title Beelde - + Load a new image. Laai 'n nuwe beeld. - + Add a new image. Voeg 'n nuwe beeld by. - + Edit the selected image. Redigeer die geselekteerde beeld. - + Delete the selected image. Wis die geselekteerde beeld uit. - + Preview the selected image. Skou die geselekteerde beeld. - + Send the selected image live. Stuur die geselekteerde beeld regstreeks. - + Add the selected image to the service. Voeg die geselekteerde beeld by die diens. @@ -1639,7 +1761,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Selekteer Aanhangsel @@ -1647,44 +1769,44 @@ ImagePlugin.MediaItem - + Select Image(s) Selekteer beeld(e) - + You must select an image to delete. 'n Beeld om uit te wis moet geselekteer word. - + You must select an image to replace the background with. 'n Beeld wat die agtergrond vervang moet gekies word. - + Missing Image(s) Vermisde Beeld(e) - + The following image(s) no longer exist: %s Die volgende beeld(e) bestaan nie meer nie: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? Die volgende beeld(e) bestaan nie meer nie: %s Voeg steeds die ander beelde by? - + There was a problem replacing your background, the image file "%s" no longer exists. Daar was 'n probleem om die agtergrond te vervang. Die beeld lêer "%s" bestaan ine meer nie. - + There was no display item to amend. Daar was geen vertoon item om by te voeg nie. @@ -1692,78 +1814,78 @@ ImagesPlugin.ImageTab - + Background Color Agtergrond Kleur - + Default Color: Verstek Kleur: - - Provides border where image is not the correct dimensions for the screen when resized. - Verskaf rand waar die beeld nie die korrekte afmetings het wanneer vir die skerm verander word nie. + + Visible background for images with aspect ratio different to screen. + Visuele agtergrond vir beelde met 'n aspek verhouding wat verskil met dié van die skerm. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Media Mini-program</strong><br/>Die media mini-program verskaf speel funksies van audio en video. - + Media name singular Media - + Media name plural Media - + Media container title Media - + Load new media. Laai nuwe media. - + Add new media. Voeg nuwe media by. - + Edit the selected media. Redigeer di geselekteerde media. - + Delete the selected media. Wis die giselekteerde media uit. - + Preview the selected media. Skou die geselekteerde media. - + Send the selected media live. Stuur die geselekteerde media regstreeks. - + Add the selected media to the service. Voeg die geselekteerde media by die diens. @@ -1811,7 +1933,7 @@ Daar was geen vertoon item om by te voeg nie. - + Unsupported File Lêer nie Ondersteun nie @@ -1829,22 +1951,22 @@ MediaPlugin.MediaTab - + Available Media Players Beskikbare Media Spelers - + %s (unavailable) %s (onbeskikbaar) - + Player Order Speler Orde - + Allow media player to be overridden Laat toe dat media speler oorheers word @@ -1852,7 +1974,7 @@ OpenLP - + Image Files Beeld Lêers @@ -1872,17 +1994,17 @@ OpenLP.AboutForm - + Credits Krediete - + License Lisensie - + Contribute Dra By @@ -1892,17 +2014,17 @@ bou %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. 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 @@ -2028,7 +2150,7 @@ Hy ons vry gemaak het. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2045,7 +2167,7 @@ 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. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Kopiereg © 2004-2012 %s @@ -2055,87 +2177,87 @@ OpenLP.AdvancedTab - + UI Settings GK (UI) Verstellings - + Number of recent files to display: Hoeveelheid onlangse lêers om te vertoon: - + Remember active media manager tab on startup Onthou die laaste media bestuurder oortjie wanneer die program begin - + Double-click to send items straight to live Dubbel-kliek om die items regstreeks te stuur - + Expand new service items on creation Sit die nuwe diens items uit wanneer dit geskep word - + Enable application exit confirmation Stel die program in staat om die uitgang bevestiging te vertoon - + Mouse Cursor Muis Wyser - + Hide mouse cursor when over display window Steek die muis wyser weg wanneer dit oor die vertoon venster beweeg - + Default Image Verstek Beeld - + Background color: Agtergrond kleur: - + Image file: Beeld lêer: - + Open File Maak Lêer oop - + Advanced Gevorderd - + Preview items when clicked in Media Manager Skou items wanneer gekliek word in die Media Bestuurder - + Click to select a color. Kliek om 'n kleur te kies. - + Browse for an image file to display. Blaai vir 'n beeld lêer om te vertoon. - + Revert to the default OpenLP logo. Verander terug na die verstek OpenLP logo. @@ -2147,137 +2269,221 @@ Diens %Y-%m-%d %H-%M - + Default Service Name Verstek Diens Naam - + Enable default service name Laat verstek diens naam toe - + Date and Time: Datum en Tyd: - + Monday Maandag - + Tuesday Dinsdag - + Wednesday Woensdag - + Thurdsday Donderdag - + Friday Vrydag - + Saturday Saterdag - + Sunday Sondag - + Now Nou - + Time when usual service starts. Tyd wanneer gewone diens begin. - + Name: Naam: - + Consult the OpenLP manual for usage. Konsulteer die OpenLP handleiding vir gebruik. - + Revert to the default service name "%s". Herstel tot die verstek diens naam "%s". - + Example: Voorbeeld: - + X11 X11 - + Bypass X11 Window Manager Werk om X11 Venster Bestuurder - + Syntax error. Sintaks fout. + + + Data Location + Data Ligging + + + + Current path: + Huidige pad: + + + + Custom path: + Eie pad: + + + + Browse for new data file location. + Blaai vir nuwe data lêer ligging. + + + + Set the data location to the default. + Stel die data ligging na die verstek ligging. + + + + Cancel + Kanselleer + + + + Cancel OpenLP data directory location change. + Kanselleer OpenLP data lêer ligging verandering. + + + + Copy data to new location. + Kopiër data na nuwe ligging. + + + + Copy the OpenLP data files to the new location. + Kopiër die OpenLP data lêers na die nuwe ligging. + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + <strong>WAARSKUWING:</strong> Nuwe data lêer ligging bevat OpenLP data lêers. Hierdie lêers SAL vervang word gedurende kopiëring. + + + + Data Directory Error + Data Lêer Fout + + + + Select Data Directory Location + Selekteer Data Lêer Ligging + + + + Confirm Data Directory Change + Bevestig Data Lêer Verandering + + + + Reset Data Directory + Herstel Data Lêer + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + Verander die OpenLP data lêer sekerlik na die verstek ligging toe? + +Hierdie ligging sal gebruik word nadat OpenLP toegemaak is. + + + + Overwrite Existing Data + Oorskryf Bestaande Data + OpenLP.ExceptionDialog - + Error Occurred 'n Fout het opgeduik - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Oeps! OpenLP het 'n probleem ondervind en kon nie daarvanaf herstel nie. Die teks in die boks hieronder bevat inligting wat van hulp kan wees aan die OpenLP ontwikkelaars, so stuur dit asseblief per e-pos na bugs@openlp.org saam met 'n gedetaileerde beskrywing van wat gedoen was toe die probleem plaasgevind het. - + Send E-Mail Stuur E-pos - + Save to File Stoor na Lêer - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Voer asseblief 'n beskrywing in van waarmee jy besig was toe de probleem ontstaan het (Mimimum 20 karrakters) - + Attach File Heg 'n Lêer aan - + Description characters to enter : %s Beskrywende karakters om in te voer: %s @@ -2285,24 +2491,24 @@ OpenLP.ExceptionForm - + Platform: %s Platvorm: %s - + Save Crash Report Stoor Bots Verslag - + Text files (*.txt *.log *.text) Teks lêers (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2333,7 +2539,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2469,17 +2675,17 @@ Verstek Instellings - + Downloading %s... Aflaai %s... - + Download complete. Click the finish button to start OpenLP. Aflaai voltooi. Klik op die klaar knoppie om OpenLP te begin. - + Enabling selected plugins... Skakel geselekteerde miniprogramme aan... @@ -2549,32 +2755,32 @@ Hierdie gids sal bystand verleen in die proses om OpenLP op te stel vir eerste gebruik. Klik die volgende knoppie hieronder om die seleksie proses te begin. - + Setting Up And Downloading Opstel en Afliaai - + Please wait while OpenLP is set up and your data is downloaded. Wag asseblief terwyl OpenLP opgestel en die data afgelaai word. - + Setting Up Opstel - + Click the finish button to start OpenLP. Kliek die voltooi knoppie om OpenLP te begin. - + Download complete. Click the finish button to return to OpenLP. Aflaai voltooi. Klik op die klaar knoppie om na OpenLP terug te keer. - + Click the finish button to return to OpenLP. Kliek die voltooi knoppie om na OpenLP terug te keer. @@ -2584,78 +2790,78 @@ Aangepasde Skyfies + + Finish + Eindig + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Geen Internet verbinding was gevind nie. Die Eerste Keer Gids benodig 'n Internet verbinding sodat voorbeeld liedere, Bybels en temas afgelaai kan word. Druk die Klaar knoppie om OpenLP nou te begin met verstek instellings en geen voorbeeld data. + Geen Internet verbinding was gevind nie. Die Eerste Keer Gids benodig 'n Internet konneksie in orde om voorbeeld liedere, Bybels en temas af te laai. Kliek die Voltooi knoppie nou om OpenLP te begin met begin instellings en geen voorbeeld data nie. -Om die Eerste-gebruik Gids later te gebruik om hierde data in te trek, gaan die Internet verbinding na en begin weer hierdie gids deur die volgende te kies: "Gereedskap/Her-gebruik Eerste Keer Gids" vanaf OpenLP. +Om weer die Eerste Keer Gids te gebruik en hierdie voorbeeld data om 'n latere stadium in te voer, gaan jou Internet konneksie na en begin weer hierdie gids deur "Gereedskap/Eerste Keer Gids" vanaf OpenLP te begin. -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. -Om die Eerste Keer Gids in geheel te kanselleer (en OpenLP nie te begin nie), druk die Kanselleer knoppie nou. - - - - Finish - Eindig +Om die Eerste Keer Gids heeltemal te kanselleer (en verhoed dat OpenLP begin), klik op die Kanselleer knoppie hieronder. OpenLP.FormattingTagDialog - + Configure Formatting Tags Konfigureer Formattering Etiket - + Edit Selection Redigeer Seleksie - + Save Stoor - + Description Beskrywing - + Tag Etiket - + Start tag Begin etiket - + End tag Eind-etiket - + Tag Id Etiket Id - + Start HTML Begin HTML - + End HTML Eindig HTML @@ -2663,32 +2869,32 @@ OpenLP.FormattingTagForm - + Update Error Opdateer Fout - + Tag "n" already defined. Etiket "n" alreeds gedefinieër. - + New Tag Nuwe Etiket - + <HTML here> <HTML hier> - + </and here> </en hier> - + Tag %s already defined. Etiket %s alreeds gedefinieër. @@ -2696,82 +2902,82 @@ OpenLP.FormattingTags - + Red Rooi - + Black Swart - + Blue Blou - + Yellow Geel - + Green Groen - + Pink Pienk - + Orange Oranje - + Purple Pers - + White Wit - + Superscript Bo-skrif - + Subscript Onder-skrif - + Paragraph Paragraaf - + Bold Vetdruk - + Italics Italiaans - + Underline Onderlyn - + Break Breek @@ -2779,180 +2985,170 @@ OpenLP.GeneralTab - + General Algemeen - + Monitors Monitors - + Select monitor for output display: Selekteer monitor vir uitgaande vertoning: - + Display if a single screen Vertoon as dit 'n enkel skerm is - + Application Startup Applikasie Aanskakel - + Show blank screen warning Vertoon leë skerm waarskuwing - + Automatically open the last service Maak vanself die laaste diens oop - + Show the splash screen Wys die spatsel skerm - + Application Settings Program Verstellings - + Prompt to save before starting a new service Vra om te stoor voordat 'n nuwe diens begin word - + Automatically preview next item in service Wys voorskou van volgende item in diens automaties - + sec sek - + CCLI Details CCLI Inligting - + SongSelect username: SongSelect gebruikersnaam: - + SongSelect password: SongSelect wagwoord: - + X X - + Y Y - + Height Hoogte - + Width Wydte - + Check for updates to OpenLP Kyk vir opdaterings van OpenLP - + Unblank display when adding new live item Verwyder blanko vertoning wanneer 'n nuwe regstreekse item bygevoeg word - + Timed slide interval: Tyd-gedrewe skyfie interval: - + Background Audio Agtergrond Oudio - + Start background audio paused Begin agtergrond oudio gestop - + Service Item Slide Limits Diens Item Skyfie Limiete - - &End Slide - Laast&e Skyfie - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - Op en af pyltjie knoppies stop by die boonste en onderste skyfies van elke Diens Item. - - - - &Wrap Slide - Omvou Skyfie + + Override display position: + Oorheers vertoon ligging: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - Op en af pyltjie knoppies gaan by die bo- en onderkant van elke Diens Item aan. + + Repeat track list + Herhaal snit lys - - &Next Item - Volge&nde Item + + Behavior of next/previous on the last/first slide: + Gedrag van die vorige/volgende op die laaste/eerste skyfie: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - Op en af pyltjie knoppies gaan na die volgende of vorige Diens Item vanaf die boonste en onderste skyfie van elke Diens Item. + + &Remain on Slide + &Bly op Skyfie - - Override display position: - Oorheers vertoon ligging: + + &Wrap around + Omvou - - Repeat track list - Herhaal snit lys + + &Move to next/previous service item + Beweeg na volgende/vorige diens ite&m OpenLP.LanguageManager - + Language Taal - + Please restart OpenLP to use your new language setting. Herlaai asseblief OpenLP om die nuwe taal instelling te gebruik. @@ -2968,287 +3164,287 @@ OpenLP.MainWindow - + &File &Lêer - + &Import &Invoer - + &Export Uitvo&er - + &View &Bekyk - + M&ode M&odus - + &Tools &Gereedskap - + &Settings Ver&stellings - + &Language Taa&l - + &Help &Hulp - + Media Manager Media Bestuurder - + Service Manager Diens Bestuurder - + Theme Manager Tema Bestuurder - + &New &Nuwe - + &Open Maak &Oop - + Open an existing service. Maak 'n bestaande diens oop. - + &Save &Stoor - + Save the current service to disk. Stoor die huidige diens na skyf. - + Save &As... Stoor &As... - + Save Service As Stoor Diens As - + Save the current service under a new name. Stoor die huidige diens onder 'n nuwe naam. - + E&xit &Uitgang - + Quit OpenLP Sluit OpenLP Af - + &Theme &Tema - + &Configure OpenLP... &Konfigureer OpenLP... - + &Media Manager &Media Bestuurder - + Toggle Media Manager Wissel Media Bestuurder - + Toggle the visibility of the media manager. Wissel sigbaarheid van die media bestuurder. - + &Theme Manager &Tema Bestuurder - + Toggle Theme Manager Wissel Tema Bestuurder - + Toggle the visibility of the theme manager. Wissel sigbaarheid van die tema bestuurder. - + &Service Manager &Diens Bestuurder - + Toggle Service Manager Wissel Diens Bestuurder - + Toggle the visibility of the service manager. Wissel sigbaarheid van die diens bestuurder. - + &Preview Panel Voorskou &Paneel - + Toggle Preview Panel Wissel Voorskou Paneel - + Toggle the visibility of the preview panel. Wissel sigbaarheid van die voorskou paneel. - + &Live Panel Regstreekse Panee&l - + Toggle Live Panel Wissel Regstreekse Paneel - + Toggle the visibility of the live panel. Wissel sigbaarheid van die regstreekse paneel. - + &Plugin List Mini-&program Lys - + List the Plugins Lys die Mini-programme - + &User Guide Gebr&uikers Gids - + &About &Aangaande - + More information about OpenLP Meer inligting aangaande OpenLP - + &Online Help &Aanlyn Hulp - + &Web Site &Web Tuiste - + Use the system language, if available. Gebruik die sisteem se taal as dit beskikbaar is. - + Set the interface language to %s Verstel die koppelvlak taal na %s - + Add &Tool... Voeg Gereedskaps&tuk by... - + Add an application to the list of tools. Voeg 'n applikasie by die lys van gereedskapstukke. - + &Default &Verstek - + Set the view mode back to the default. Verstel skou modus terug na verstek modus. - + &Setup Op&stel - + Set the view mode to Setup. Verstel die skou modus na Opstel modus. - + &Live &Regstreeks - + Set the view mode to Live. 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/. @@ -3257,108 +3453,108 @@ 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 - + English Please add the name of your language here Afrikaans - + Configure &Shortcuts... Konfigureer Kor&tpaaie... - + Close OpenLP Mook OpenLP toe - + Are you sure you want to close OpenLP? Maak OpenLP sekerlik toe? - + 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. - + &Autodetect Spoor outom&aties op - + Update Theme Images Opdateer Tema Beelde - + Update the preview images for all themes. Opdateer die voorskou beelde vir alle temas. - + Print the current service. Druk die huidige diens. - + &Recent Files Onlangse Lêe&rs - + L&ock Panels Sl&uit Panele - + Prevent the panels being moved. Voorkom dat die panele rondgeskuif word. - + Re-run First Time Wizard Her-gebruik Eerste Keer Gids - + Re-run the First Time Wizard, importing songs, Bibles and themes. Her-gebruik die Eerste Keer Gids om liedere, Bybels en tema's in te voer. - + Re-run First Time Wizard? Her-gebruik Eerste Keer Gids? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3367,43 +3563,43 @@ Her-gebruik van hierdie gids mag veranderinge aan die huidige OpenLP konfigurasie aanbring en kan moontlik liedere byvoeg by die bestaande liedere lys en kan ook die verstek tema verander. - + Clear List Clear List of recent files Maak Lys Skoon - + Clear the list of recent files. Maak die lys van onlangse lêers skoon. - + Configure &Formatting Tags... Konfigureer &Formattering Etikette... - + Export OpenLP settings to a specified *.config file Voer OpenLP verstellings uit na 'n spesifieke *.config lêer - + Settings Verstellings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Voer OpenLP verstellings in vanaf 'n gespesifiseerde *.config lêer wat voorheen op hierdie of 'n ander masjien uitgevoer is - + Import settings? Voer verstellings in? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3416,45 +3612,50 @@ As verkeerde verstellings ingevoer word, mag dit onvoorspelbare optrede tot gevolg hê, of OpenLP kan abnormaal termineer. - + Open File Maak Lêer oop - + OpenLP Export Settings Files (*.conf) OpenLP Uitvoer Verstelling Lêers (*.conf) - + Import settings Voer verstellings in - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP sal nou toe maak. Ingevoerde verstellings sal toegepas word die volgende keer as OpenLP begin word. - + Export Settings File Voer Verstellings Lêer Uit - + OpenLP Export Settings File (*.conf) OpenLP Uitvoer Verstellings Lêer (*.conf) + + + New Data Directory Error + Nuwe Data Lêer Fout + OpenLP.Manager - + Database Error Databasis Fout - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3463,7 +3664,7 @@ Databasis: %s - + OpenLP cannot load your database. Database: %s @@ -3475,73 +3676,73 @@ OpenLP.MediaManagerItem - + No Items Selected Geen item geselekteer nie - + &Add to selected Service Item &Voeg by die geselekteerde Diens item - + You must select one or more items to preview. Kies een of meer items vir die voorskou. - + You must select one or more items to send live. Kies een of meer items vir regstreekse uitsending. - + You must select one or more items. Kies een of meer items. - + You must select an existing service item to add to. 'n Bestaande diens item moet geselekteer word om by by te voeg. - + Invalid Service Item Ongeldige Diens Item - + You must select a %s service item. Kies 'n %s diens item. - + You must select one or more items to add. Kies een of meer items om by te voeg. - + No Search Results Geen Soek Resultate - + Invalid File Type Ongeldige Lêer Tipe - + Invalid File %s. Suffix not supported Ongeldige Lêer %s. Agtervoegsel nie ondersteun nie - + &Clone &Kloon - + Duplicate files were found on import and were ignored. Duplikaat lêers gevind tydens invoer en is geïgnoreer. @@ -3549,12 +3750,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. <lyrics> etiket is vermis. - + <verse> tag is missing. <verse> etiket is vermis. @@ -3562,27 +3763,27 @@ OpenLP.PluginForm - + Plugin List Mini-program Lys - + Plugin Details Mini-program Besonderhede - + Status: Status: - + Active Aktief - + Inactive Onaktief @@ -3605,12 +3806,12 @@ OpenLP.PrintServiceDialog - + Fit Page Pas Blaai - + Fit Width Pas Wydte @@ -3618,7 +3819,7 @@ OpenLP.PrintServiceForm - + Options Opsies @@ -3633,47 +3834,47 @@ 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 - + Add page break before each text item Voeg 'n bladsy-breking voor elke teks item - + Service Sheet Diens Blad @@ -3683,12 +3884,12 @@ Druk - + Title: Titel: - + Custom Footer Text: Verpersoonlike Voetskrif Teks: @@ -3696,12 +3897,12 @@ OpenLP.ScreenList - + Screen Skerm - + primary primêr @@ -3709,12 +3910,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Begin</strong>: %s - + <strong>Length</strong>: %s <strong>Durasie</strong>: %s @@ -3722,7 +3923,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Hergroepeer Diens Item @@ -3730,82 +3931,82 @@ OpenLP.ServiceManager - + Move to &top Skuif boon&toe - + Move item to the top of the service. Skuif item tot heel bo in die diens. - + Move &up Sk&uif op - + Move item up one position in the service. Skuif item een posisie boontoe in die diens. - + Move &down Skuif &af - + Move item down one position in the service. Skuif item een posisie af in die diens. - + Move to &bottom Skuif &tot heel onder - + Move item to the end of the service. Skuif item tot aan die einde van die diens. - + &Delete From Service Wis uit vanaf die &Diens - + Delete the selected item from the service. Wis geselekteerde item van die diens af. - + &Add New Item &Voeg Nuwe Item By - + &Add to Selected Item &Voeg by Geselekteerde Item - + &Edit Item R&edigeer Item - + &Reorder Item Ve&rander Item orde - + &Notes &Notas - + &Change Item Theme &Verander Item Tema @@ -3827,112 +4028,107 @@ 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 Sto&rt alles ineen - + Collapse all the service items. Stort al die diens items ineen. - + Open File Maak Lêer oop - + 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. - + &Start Time &Begin Tyd - + Show &Preview Wys &Voorskou - - Show &Live - Vertoo&n Regstreeks - - - + Modified Service Redigeer Diens - + The current service has been modified. Would you like to save this service? Die huidige diens was verander. Stoor hierdie diens? - + Custom Service Notes: Aangepasde Diens Notas: - + Notes: Notas: - + Playing time: Speel tyd: - + Untitled Service Ongetitelde Diens @@ -3957,17 +4153,17 @@ Korrupte Lêer - + Load an existing service. Laai 'n bestaande diens. - + Save this service. Stoor die diens. - + Select a theme for the service. Kies 'n tema vir die diens. @@ -3977,7 +4173,7 @@ Die lêer is óf korrup óf is nie 'n OpenLP 2.0 diens lêer nie. - + Service File Missing Diens Lêer Vermis @@ -4001,11 +4197,21 @@ Service copy only Slegs diens kopie. + + + Error Saving File + Fout gedurende Lêer Stooring + + + + There was an error saving your file. + Daar was 'n probleem om die lêer te stoor. + OpenLP.ServiceNoteForm - + Service Item Notes Diens Item Notas @@ -4021,67 +4227,67 @@ OpenLP.ShortcutListDialog - + Action Aksie - + Shortcut Kortpad - + 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 - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Kies 'n aksie en kliek een van die knoppies hieronder om 'n primêre of alternatiewe kortpad vas te vang. - + Default Verstek - + Custom Aanpasing - + Capture shortcut. Vang kortpad. - + Restore the default shortcut of this action. Stel die verstek kortpad terug vir hierdie aksie. - + Restore Default Shortcuts Herstel Verstek Kortpaaie - + Do you want to restore all shortcuts to their defaults? Herstel alle kortpaaie na hul verstek waarde? - + Configure Shortcuts Konfigureer Kortpaaie @@ -4089,177 +4295,172 @@ OpenLP.SlideController - + Hide Verskuil - + Go To Gaan Na - + Blank Screen Blanko Skerm - + Blank to Theme Blanko na Tema - + Show Desktop Wys Werkskerm - + Previous Service Vorige Diens - + Next Service Volgende Diens - + Escape Item Ontsnap Item - + Move to previous. Skuif terug. - + Move to next. Skuif volgende. - + Play Slides Speel Skyfies - + Delay between slides in seconds. Vertraging tussen skyfies in sekondes. - + Move to live. Skuif na regstreeks. - + Add to Service. Voeg by Diens. - + Edit and reload song preview. Redigeer en herlaai lied voorskou. - + Start playing media. Begin media speel. - + Pause audio. Stop oudio. - + Pause playing media. Halt spelende media. - + Stop playing media. Stop spelende media. - + Video position. Video posisie. - + Audio Volume. Oudio Volume. - + Go to "Verse" Gaan na "Vers" - + Go to "Chorus" Gaan na "Koor" - + Go to "Bridge" Gaan na "Brug" - + Go to "Pre-Chorus" Gaan na "Pre-Koor" - + Go to "Intro" Gaan na "Inleiding" - + Go to "Ending" Gaan na "Einde" - + Go to "Other" Gaan na "Ander" - + Previous Slide Vorige Skyfie - + Next Slide Volgende Skyfie - + Pause Audio Hou Oudio - + Background Audio Agtergrond Oudio - - Next Track - Volgende Snit - - - + Go to next audio track. Gaan na die volgende oudio snit. - + Tracks Snitte @@ -4335,17 +4536,17 @@ Begin tyd is na die eind tyd van die media item - + Theme Layout Tema Uitleg - + The blue box shows the main area. Die blou boks wys die hoof area. - + The red box shows the footer. Die rooi boks wys die voet area. @@ -4353,32 +4554,32 @@ OpenLP.ThemeForm - + Select Image 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. - + (approximately %d lines per slide) (ongeveer %d lyne per skyfie) @@ -4386,193 +4587,193 @@ OpenLP.ThemeManager - + Create a new theme. Skep 'n nuwe tema. - + Edit Theme Redigeer Tema - + Edit a theme. Redigeer 'n tema. - + Delete Theme Wis Tema Uit - + Delete a theme. Wis 'n tema uit. - + Import Theme Voer Tema In - + Import a theme. Voer 'n tema in. - + Export Theme Voer Tema Uit - + Export a theme. Voer 'n tema uit. - + &Edit Theme R&edigeer Tema - + &Delete Theme &Wis Tema uit - + Set As &Global Default 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. - + Theme %s is used in the %s plugin. Tema %s is in gebruik deur die %s mini-program. - + 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. Lêer is nie 'n geldige tema nie. - + &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) - + Copy of %s Copy of <theme name> Duplikaat van %s - + Theme Already Exists Tema Bestaan Reeds @@ -4580,272 +4781,272 @@ OpenLP.ThemeWizard - + 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: - + Solid Color Soliede Kleur - + Gradient Gradiënt - + Color: Kleur: - + Gradient: Gradiënt: - + Horizontal Horisontaal - + Vertical Vertikaal - + Circular Sirkelvormig - + 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 - + Font: Skrif: - + Size: Grootte: - + Line Spacing: Lyn Spasiëring: - + &Outline: &Buitelyn: - + &Shadow: &Skaduwee: - + Bold Vetdruk - + 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: - + Left Links - + Right Regs - + Center Middel - + 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 - + X position: X posisie: - + px px - + Y position: Y posisie: - + Width: Wydte: - + Height: Hoogte: - + Use default location Gebruik verstek ligging - + 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: - + Edit Theme - %s Redigeer Tema - %s - + 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 - + Starting color: Begin Kleur: - + Ending color: Eind Kleur: - + Background color: Agtergrond kleur: - + Justify Uitsgespan - + Layout Preview Uitleg Voorskou - + Transparent Deurskynend @@ -4853,47 +5054,47 @@ OpenLP.ThemesTab - + Global Theme Globale Tema - + Theme Level Tema Vlak - + S&ong Level Lied Vl&ak - + 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. Gebruik die tema van elke lied in die lied-databasis. As 'n lied nie 'n geassosieërde tema het nie, gebruik die diens se tema. As die diens nie 'n tema het nie, gebruik dan die globale tema. - + &Service Level Dien&s Vlak - + 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. Gebruik die tema van die diens en verplaas enige van die individuele liedere se temas. As die diens nie 'n tema het nie, gebruik dan die globale tema. - + &Global Level &Globale Vlak - + Use the global theme, overriding any themes associated with either the service or the songs. Gebruik die globale tema om enige temas wat met die diens of liedere geassosieer is te vervang. - + Themes Temas @@ -4977,239 +5178,239 @@ pt - + Image Beeld - + Import Voer in - + Live Regstreeks - + Live Background Error Regstreekse Agtergrond Fout - + Load Laai - + Middle Middel - + New Nuwe - + New Service Nuwe Diens - + New Theme Nuwe Tema - + 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 items geselekteer nie - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Voorskou - + Replace Background Vervang Agtergrond - + Reset Background Herstel Agtergrond - + s The abbreviated unit for seconds s - + Save && Preview Stoor && Voorskou - + Search Soek - + You must select an item to delete. Kies 'n item om uit te wis. - + You must select an item to edit. Selekteer 'n item om te regideer. - + Save Service Stoor Diens - + Service Diens - + Start %s Begin %s - + Theme Singular Tema - + Themes Plural Temas - + Top Bo - + Version Weergawe - + 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. - + &Vertical Align: &Vertikale Sporing: - + Finished import. Invoer voltooi. - + Format: Formaat: - + Importing Invoer - + Importing "%s"... "%s" ingevoer... - + Select Import Source Selekteer Invoer Bron - + Select the import format and the location to import from. Selekteer die invoer vormaat en die ligging vanwaar invoer geskied. - + 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. Die openlp.org 1.x invoerder is onaktief gestel weens 'n vermisde Python module. Om van hierdie invoerder gebruik te maak moet die "python-sqlite" module installeer word. - + Open %s File Maak %s Lêer Oop - + %p% %p% - + Ready. Gereed. - + Starting import... Invoer begin... - + 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. @@ -5225,7 +5426,7 @@ Welkom by die Lied Uitvoer Gids - + Welcome to the Song Import Wizard Welkom by die Lied Invoer Gids @@ -5313,53 +5514,53 @@ h - + Layout style: Uitleg styl: - + Live Toolbar Regstreekse Gereedskapsbalk - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP is reeds ana die gang. Gaan voort? - + Settings Verstellings - + Tools Gereedskap - + Unsupported File Lêer nie Ondersteun nie - + Verse Per Slide Vers Per Skyfie - + Verse Per Line Vers Per Lyn - + View Vertoon @@ -5374,42 +5575,37 @@ XML sintaks fout - + View Mode Vertoon Modus - + Open service. Maak 'n diens oop. - + Print Service Druk Diens uit - + Replace live background. Vervang regstreekse agtergrond. - + Reset live background. Herstel regstreekse agtergrond. - - &Split - &Verdeel - - - + Split a slide into two only if it does not fit on the screen as one slide. Verdeel 'n skyfie slegs in twee wanneer dit nie op die skerm as 'n enkele skyfie sal pas nie. - + Welcome to the Bible Upgrade Wizard Welkom by die Bybel Opgradeer Gids @@ -5419,53 +5615,105 @@ Bevesting Uitwissing - + Play Slides in Loop Speel Skyfies in Herhaling - + Play Slides to End Speel Skyfies tot Einde - + Stop Play Slides in Loop Staak Skyfies in Herhaling - + Stop Play Slides to End Staak Skyfies tot Einde - + Next Track Volgende Snit + + + Search Themes... + Search bar place holder text + Soek Temas... + + + + Optional &Split + Op&sionele Verdeling + + + + Invalid Folder Selected + Singular + Ongeldige Gids Geselekteer + + + + Invalid File Selected + Singular + Ongeldige Lêer Geselekteer + + + + Invalid Files Selected + Plural + Ongeldige Lêer Geselekteer + + + + No Folder Selected + Singular + Geen Gids Geselekteer nie + + + + Open %s Folder + Maak %s Gids Oop + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + Een %s lêer moet gespesifiseer word om vanaf in te voer. + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + Een %s gids moet gespesifiseer word om vanaf in te voer. + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 en %2 - + %1, and %2 Locale list separator: end %1, en %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5474,50 +5722,50 @@ PresentationPlugin - + <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>Aanbieding Mini-program</strong><br/>Die aanbieding mini-program bied die vermoë om aanbiedings van verskillende programme te vertoon. Die keuse van beskikbare aanbieding-programme word aan die gebruiker vertoon deur 'n hangkieslys. - + Presentation name singular Aanbieding - + Presentations name plural Aanbiedinge - + Presentations container title Aanbiedinge - + Load a new presentation. Laai 'n nuwe aanbieding. - + Delete the selected presentation. Wis die geselekteerde aanbieding uit. - + Preview the selected presentation. Skou die geselekteerde aanbieding. - + Send the selected presentation live. Stuur die geselekteerde aanbieding regstreeks. - + Add the selected presentation to the service. Voeg die geselekteerde aanabieding by die diens. @@ -5525,70 +5773,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Selekteer Aanbieding(e) - + Automatic Outomaties - + Present using: Bied aan met: - + File Exists Lêer Bestaan Reeds - + A presentation with that filename already exists. 'n Aanbieding met daardie lêernaam bestaan reeds. - + This type of presentation is not supported. Hierdie tipe aanbieding word nie ondersteun 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. - - The Presentation %s is incomplete, please reload. - Die Aanbieding %s is onvolledig, herlaai asseblief. + + The presentation %s no longer exists. + Die aanbieding %s bestaan nie meer nie. PresentationPlugin.PresentationTab - + Available Controllers Beskikbare Beheerders - + %s (unavailable) %s (nie beskikbaar nie) - + Allow presentation application to be overridden Laat toe dat die program oorheers word @@ -5622,135 +5870,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 Afgelië - + OpenLP 2.0 Stage View OpenLP 2.0 Verhoog Aansig - + Service Manager Diens Bestuurder - + Slide Controller Skyfie Beheerder - + Alerts Waarskuwings - + Search Soek - - Back - Terug - - - + Refresh Verfris - + Blank Blanko - + Show Wys - + Prev Vorige - + Next Volgende - + Text Teks - + Show Alert Wys Waarskuwing - + Go Live Gaan Regstreeks - + No Results Geen Resultate - + Options Opsies - + Add to Service Voeg By Diens + + + Home + Tuis + + + + Theme + Tema + + + + Desktop + Werkskerm + + + + Add &amp; Go to Service + Voeg by &amp; Gaan na Diens + RemotePlugin.RemoteTab - + Serve on IP address: Bedien op hierdie IP adres: - + Port number: Poort nommer: - + Server Settings Bediener Verstellings - + Remote URL: Afgeleë URL: - + Stage view URL: Verhoog vertoning URL: - + Display stage time in 12h format Vertoon verhoog tyd in 12 uur formaat - + Android App Android Program - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Skandeer die QR kode of kliek <a href="https://market.android.com/details?id=org.openlp.android">aflaai</a> om die Android program vanaf die Mark af te laai. @@ -5758,85 +6021,85 @@ SongUsagePlugin - + &Song Usage Tracking &Volg Lied Gebruik - + &Delete Tracking Data Wis Volg &Data Uit - + Delete song usage data up to a specified date. Wis lied volg data uit tot en met 'n spesifieke datum. - + &Extract Tracking Data Onttr&ek Volg Data - + Generate a report on song usage. Genereer 'n verslag oor lied-gebruik. - + Toggle Tracking Wissel Volging - + Toggle the tracking of song usage. Wissel lied-gebruik volging. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>LiedGebruik Mini-program</strong><br/>Die mini-program volg die gebruik van liedere in dienste. - + SongUsage name singular Lied Gebruik - + SongUsage name plural Lied Gebruik - + SongUsage container title Lied Gebruik - + Song Usage Lied Gebruik - + Song usage tracking is active. Lied gebruik volging is aktief. - + Song usage tracking is inactive. Lied gebruik volging is onaktief. - + display vertoon - + printed gedruk @@ -5844,7 +6107,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Wis Lied Gebruik Data Uit @@ -5869,7 +6132,7 @@ Al die gevraagde data is suksesvol uitgewis. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Selekteer die datum tot waarop die liedere gebruik uitgewis moet word. Alle opgeneemde data voor hierdie datum sal permanent verwyder word. @@ -5877,42 +6140,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Diens Gebruik Ontrekking - + Select Date Range Selekteer Datum Grense - + to tot - + Report Location Rapporteer Ligging - + Output File Location Uitvoer Lêer Ligging - + usage_detail_%s_%s.txt usage_detail_%s_%s.txt - + Report Creation Verslag Skepping - + Report %s has been successfully created. @@ -5921,12 +6184,12 @@ was suksesvol geskep. - + Output Path Not Selected Skryf Ligging Nie Gekies Nie - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. Daar is nie 'n geldige skryf ligging gespesifiseer vir die lied-gebruik verslag nie. Kies asseblief 'n bestaande pad op die rekenaar. @@ -5964,82 +6227,82 @@ Besig om liedere indek te herskep... - + 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. @@ -6049,26 +6312,26 @@ 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. - + Song name singular Lied - + Songs name plural Liedere - + Songs container title Liedere @@ -6079,32 +6342,32 @@ Voer liedere uit deur gebruik te maak van die uitvoer gids. - + 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. @@ -6132,17 +6395,17 @@ Van: - + You need to type in the first name of the author. U moet die naam van die skrywer invul. - + You need to type in the last name of the author. U moet ten minste die skrywer se naam invoer. - + You have not set a display name for the author, combine the first and last names? 'n Vertoon naam vir die skrywer is nie opgestel nie. Kan die naam en van gekombineer word? @@ -6173,209 +6436,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Meta Data + + + + Custom Book Names + Eie Boek Name + + + SongsPlugin.EditSongForm - + Song Editor Lied Redigeerder - + &Title: &Titel: - + Alt&ernate title: Alt&ernatiewe titel: - + &Lyrics: &Lirieke: - + &Verse order: &Vers orde: - + Ed&it All Red&igeer Alles - + Title && Lyrics Titel && Lirieke - + &Add to Song &Voeg by Lied - + &Remove Ve&rwyder - + &Manage Authors, Topics, Song Books &Bestuur Skrywers, Onderwerpe en Lied Boeke - + A&dd to Song Voeg by Lie&d - + R&emove V&erwyder - + Book: Boek: - + Number: Nommer: - + Authors, Topics && Song Book Skrywers, Onderwerpe && Lied Boek - + New &Theme Nuwe &Tema - + Copyright Information Kopiereg Informasie - + Comments Kommentaar - + Theme, Copyright Info && Comments Tema, Kopiereg Informasie && Kommentaar - + Add Author Voeg Skrywer By - + This author does not exist, do you want to add them? Hierdie skrywer bestaan nie, moet die skrywer bygevoeg word? - + This author is already in the list. Hierdie skrywer is alreeds in die lys. - + 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. Die geselekteerde skrywer is ongeldig. Kies 'n skrywer vanaf die lys of voer 'n nuwe skrywer in en kliek op die "Voeg Skrywer by Lied" knoppie om die skrywer by te voeg. - + Add Topic Voeg Onderwerp by - + This topic does not exist, do you want to add it? Die onderwerp bestaan nie. Voeg dit by? - + This topic is already in the list. Die onderwerp is reeds in die lys. - + 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. Geselekteerde onderwerp is ongeldig. Kies 'n onderwerp vanaf die lys of voer 'n nuwe onderwerp in en kliek die "Voeg Onderwerp by Lied" knoppie om die onderwerp by te voeg. - + You need to type in a song title. Tik 'n lied titel in. - + You need to type in at least one verse. Ten minste een vers moet ingevoer word. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. Die vers orde is ongeldig. Daar is geen vers wat ooreenstem met %s nie. Geldige opsies is %s. - + Add Book Voeg Boek by - + This song book does not exist, do you want to add it? Die lied boek bestaan nie. Voeg dit by? - + 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. - + Linked Audio Geskakelde Oudio - + Add &File(s) &Voeg Leêr(s) By - + Add &Media Voeg &Media By - + Remove &All Verwyder &Alles - + Open File(s) Maak Lêer(s) Oop - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Waarskuwing:</strong> Nie al die verse is in gebruik nie. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. Die vers orde is ongeldig. Daar is geen verse wat ooreenstem met %s nie. Geldige inskrywings is %s. @@ -6489,130 +6765,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Selekteer Dokument/Aanbieding Lêers - + Song Import Wizard Lied Invoer Gids - + 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. Hierdie gids help met die invoer van liedere in verskillende formate. Kliek die volgende knoppie hieronder om die proses te begin deur 'n formaat te kies wat gebruik moet word vir invoer. - + Generic Document/Presentation Generiese Dokumentasie/Aanbieding - - Filename: - Lêernaam: - - - - 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. - Die OpenLyrics invoerder is nog nie ontwikkel nie, maar soos gesien kan word is ons van mening om dit te doen. Hopelik sal dit in die volgende vrystelling wees. - - - + Add Files... Voeg Lêers by... - + Remove File(s) Verwyder Lêer(s) - + Please wait while your songs are imported. Wag asseblief terwyl die liedere ingevoer word. - + 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 - - 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. - - - + 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 - + Foilpresenter Song Files Foilpresenter Lied Lêers - + Copy Kopieër - + Save to File Stoor na Lêer - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Die Liedere van Volgelinge invoerder is onaktief gestel omdat OpenLP nie toegang tot OpenOffice of LibreOffice het nie. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Die generiese dokument/aanbieding invoerder is onaktief gestel omdat OpenLP nie toegang tot OpenOffice of LibreOffice het nie. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics of OpenLP 2.0 Uitgevoerde Lied - + OpenLyrics Files OpenLyrics Lêers + + + CCLI SongSelect Files + CCLI SongSelect Lêers + + + + EasySlides XML File + EeasySlides XML Lêer + + + + EasyWorship Song Database + EasyWorship Lied Databasis + + + + DreamBeam Song Files + DreamBeam Lied Lêers + + + + You need to specify a valid PowerSong 1.0 database folder. + 'n Geldige PowerSong 1.0 databasis gids moet gespesifiseer word. + + + + ZionWorx (CSV) + ZionWorx (CSV) + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + Verwerk eers jou ZionWorx databasis na 'n CSV teks lêer, soos verduidelik word in die <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">Gebruikers Handleiding</a>. + SongsPlugin.MediaFilesForm - + Select Media File(s) Selekteer Media Lêer(s) - + Select one or more audio files from the list below, and click OK to import them into this song. Selekteer een of meer oudio lêers van die lys hieronder, en kliek OK om hulle na hierdie lied in te voer. @@ -6620,27 +6916,27 @@ SongsPlugin.MediaItem - + Titles Titels - + Lyrics Lirieke - + 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 uit? @@ -6648,16 +6944,41 @@ - + Maintain the lists of authors, topics and books. Onderhou die lys van skrywers, onderwerpe en boeke. - + copy For song cloning kopieër + + + Search Titles... + Soek Titels... + + + + Search Entire Song... + Soek deur hele Lied... + + + + Search Lyrics... + Soek Lirieke... + + + + Search Authors... + Soek Outeure... + + + + Search Song Books... + Soek Lied Boeke... + SongsPlugin.OpenLP1SongImport @@ -6684,6 +7005,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + Geen liedere om in te voer nie. + + + + Verses not found. Missing "PART" header. + Verse nie gevind nie. Vermis "PART" opskrif. + + + SongsPlugin.SongBookForm @@ -6722,12 +7056,12 @@ SongsPlugin.SongImport - + copyright kopiereg - + The following songs could not be imported: Die volgende liedere kon nie ingevoer word nie: @@ -6748,117 +7082,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Lied invoer het misluk. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Skrywer kon nie bygevoeg word nie. - + This author already exists. Die skrywer bestaan reeds. - + Could not add your topic. Onderwerp kon nie bygevoeg word nie. - + This topic already exists. Hierdie onderwerp bestaan reeds. - + Could not add your book. Boek kon nie bygevoeg word nie. - + This book already exists. Hierdie boek bestaan reeds. - + Could not save your changes. Veranderinge kon nie gestoor word nie. - + Could not save your modified author, because the author already exists. Geredigeerde skrywer kon nie gestoor word nie, omdat die skrywer reeds bestaan. - + Could not save your modified topic, because it already exists. Geredigeerde onderwerp kon nie gestoor word nie, want dit bestaan alreeds. - + Delete Author Wis Skrywer Uit - + Are you sure you want to delete the selected author? Wis die geselekteerde skrywer uit? - + This author cannot be deleted, they are currently assigned to at least one song. Die skrywer kan nie uitgewis word nie, omdat die skrywer aan ten minste een lied toegeken is. - + Delete Topic Wis Onderwerp Uit - + Are you sure you want to delete the selected topic? Wis die geselekteerde onderwerp uit? - + This topic cannot be deleted, it is currently assigned to at least one song. Die onderwerp kan nie uitgewis word nie, omdat dit aan ten minste een lied toegeken is. - + Delete Book Wis Boek Uit - + Are you sure you want to delete the selected book? Wis die geselekteerde boek uit? - + This book cannot be deleted, it is currently assigned to at least one song. Die boek kan nie uitgewis word nie, omdat dit aan ten minste een lied toegeken is. - + 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? @@ -6866,29 +7192,29 @@ SongsPlugin.SongsTab - + Songs Mode Liedere Modus - + Enable search as you type Bekragtig soek soos getik word - + Display verses on live tool bar Vertoon verse op regstreekse gereedskap staaf - + 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 + + Import missing songs from service files + Voer vermisde liedere in vanaf diens lêers @@ -6947,4 +7273,17 @@ Ander + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Probleem om CSV lêer te lees. + + + + File not valid ZionWorx CSV format. + Lêer nie geldige ZionWorx CSV formaat nie. + + diff -Nru openlp-1.9.9/resources/i18n/cs.ts openlp-1.9.10/resources/i18n/cs.ts --- openlp-1.9.9/resources/i18n/cs.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/cs.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Upozornění - + Show an alert message. Zobrazit vzkaz upozornění. - + Alert name singular Upozornění - + Alerts name plural Upozornění - + Alerts container title Upozornění - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Modul upozornění</strong><br />Modul upozornění umožňuje zobrazovat různé hlášky a upozornění na zobrazovací obrazovce. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Vzkaz upozornění - + Alert &text: &Text upozornění: - + &New &Nový - + &Save &Uložit - + Displ&ay &Zobrazit - + Display && Cl&ose Zobrazit a za&vřít @@ -79,7 +79,7 @@ Nebyl zadán žádný text upozornění. Před klepnutím na Nový prosím zadejte nějaký text. - + &Parameter: &Parametr: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Písmo - + Font name: Název písma: - + Font color: Barva písma: - + Background color: Barva pozadí: - + Font size: Velikost písma: - + Alert timeout: Čas vypršení upozornění: @@ -152,551 +152,598 @@ BiblesPlugin - + &Bible &Bible - + Bible name singular Bible - + Bibles name plural Více Biblí - + Bibles container title Bible - + No Book Found Kniha nenalezena - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. V Bibli nebyla nalezena odpovídající kniha. Prověřte, že název knihy byl zadán správně. - + Import a Bible. Import Bible. - + Add a new Bible. Přidat novou Bibli. - + Edit the selected Bible. Upravit vybranou Bibli. - + Delete the selected Bible. Smazat vybranou Bibli. - + Preview the selected Bible. Náhled vybrané Bible. - + Send the selected Bible live. Zobrazit vybranou Bibli naživo. - + Add the selected Bible to the service. Přidat vybranou Bibli ke službě. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Modul Bible</strong><br />Modul Bible umožňuje během služby zobrazovat verše z různých zdrojů. - + &Upgrade older Bibles &Aktualizovat starší Bibles - + Upgrade the Bible databases to the latest format. Povýšit databáze Bible na nejnovější formát. - + Genesis 1. Mojžíšova - + Exodus 2. Mojžíšova - + Leviticus 3. Mojžíšova - + Numbers 4. Mojžíšova - + Deuteronomy 5. Mojžíšova - + Joshua Jozue - + Judges Soudců - + Ruth Rút - + 1 Samuel 1. Samuelova - + 2 Samuel 2. Samuelova - + 1 Kings 1. Královská - + 2 Kings 2. Královská - + 1 Chronicles 1. Paralipomenon - + 2 Chronicles 2. Paralipomenon - + Ezra Ezdráš - + Nehemiah Nehemjáš - + Esther Ester - + Job Jób - + Psalms Žalmy - + Proverbs Přísloví - + Ecclesiastes Kazatel - + Song of Solomon Píseň písní - + Isaiah Izajáš - + Jeremiah Jeremjáš - + Lamentations Pláč - + Ezekiel Ezechiel - + Daniel Daniel - + Hosea Ozeáš - + Joel Jóel - + Amos Ámos - + Obadiah Abdijáš - + Jonah Jonáš - + Micah Micheáš - + Nahum Nahum - + Habakkuk Abakuk - + Zephaniah Sofonjáš - + Haggai Ageus - + Zechariah Zacharjáš - + Malachi Malachiáš - + Matthew Matouš - + Mark Marek - + Luke Lukáš - + John Jan - + Acts Skutky apoštolské - + Romans Římanům - + 1 Corinthians 1. Korintským - + 2 Corinthians 2. Korintským - + Galatians Galatským - + Ephesians Efezským - + Philippians Filipským - + Colossians Koloským - + 1 Thessalonians 1. Tesalonickým - + 2 Thessalonians 2. Tesalonickým - + 1 Timothy 1. Timoteovi - + 2 Timothy 2. Timoteovi - + Titus Titovi - + Philemon Filemonovi - + Hebrews Židům - + James List Jakubův - + 1 Peter 1. list Petrův - + 2 Peter 2. list Petrův - + 1 John 1. list Janův - + 2 John 2. list Janův - + 3 John 3. list Janův - + Jude List Judův - + Revelation Zjevení Janovo - + Judith Júdit - + Wisdom Kniha moudrosti - + Tobit Tobijáš - + Sirach Sírachovec - + Baruch Báruk - + 1 Maccabees 1. Makabejská - + 2 Maccabees 2. Makabejská - + 3 Maccabees 3. Makabejská - + 4 Maccabees 4. Makabejská - + Rest of Daniel Zbytek Daniele - + Rest of Esther Zbytek Ester - + Prayer of Manasses Modlitba Manasese - + Letter of Jeremiah Jeremiášův Dopis - + Prayer of Azariah Modlitba Azarjáše - + Susanna Zuzana - + Bel - + Bel - + 1 Esdras 1. Ezdrášova - + 2 Esdras 2. Ezdrášova - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. - + :|v|V|verse|verses;;-|to;;,|and;;end + + + + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Je nutno uvést název verze Bible. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + K Bibli je potřeba nastavit autorská práva. Bible, které jsou volná díla (Public Domain), je nutno takto označit. + + + + Bible Exists + Bible existuje + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Tato Bible už existuje. Importujte prosím jinou Bibli nebo nejdříve smažte tu existující. + + + + You need to specify a book name for "%s". + Je nutno uvést název knihy pro "%s". + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + "%s" není správný název knihy. +Čísla mohou být použita jen na začátku a pak musí +následovat jeden nebo více nečíslných znaků. + + + + Duplicate Book Name + Duplicitní název knihy + + + + The Book Name "%s" has been entered more than once. + "%s" jako název knihy byl zadán více než jednou. BiblesPlugin.BibleManager - + Scripture Reference Error Chyba v odkazu do Bible - + Web Bible cannot be used Bibli z www nelze použít - + Text Search is not available with Web Bibles. Hledání textu není dostupné v Bibli z www. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Nebylo zadáno slovo pro hledání. K hledání textu obsahující všechna slova je nutno tato slova oddělit mezerou. Oddělením slov čárkou se bude hledat text obsahující alespoň jedno ze zadaných slov. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Žádné Bible nejsou nainstalovány. K p?idání jedné nebo více Biblí prosím použijte Pr?vodce importem. - + No Bibles Available Žádné Bible k dispozici - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +766,79 @@ BiblesPlugin.BiblesTab - + Verse Display Zobrazit verš - + Only show new chapter numbers Zobrazit jen číslo nové kapitoly - + Bible theme: Motiv Bible: - + No Brackets Žádné závorky - + ( And ) ( A ) - + { And } { A } - + [ And ] [ A ] - + Note: Changes do not affect verses already in the service. Poznámka: Verše, které jsou už ve službě, nejsou změnami ovlivněny. - + Display second Bible verses Zobrazit druhé verše z Bible - + Custom Scripture References Uživatelské odkazy z Bible - + Verse Separator: Oddělovač veršů: - + Range Separator: Oddělovač rozsahů: - + List Separator: Oddělovač seznamů: - + End Mark: Ukončovací značka: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +847,7 @@ Pro použití výchozí hodnoty smažte tento řádek. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +856,7 @@ Pro použití výchozí hodnoty smažte tento řádek. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +865,7 @@ Pro použití výchozí hodnoty smažte tento řádek. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,91 +874,80 @@ Pro použití výchozí hodnoty smažte tento řádek. - - Preferred Bookname Language - Upřednostňovaný jazyk názvů knih - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Vybrat jazyk, ve kterém se mají zobrazovat -názvy knih Bible ve Hledat v Bibli: + + English + Čeština - - Bible language - Jazyk Bible + + Default Bible Language + Výchozí jazyk Bible - - Application language - Jazyk aplikace + + Book name language in search field, +search results and on display: + Jazyk názvů knih ve vyhledávacím poli, +výsledcích vyhledávání a při zobrazení: - - English - Angličtina + + Bible Language + Jazyk Bible - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Více voleb: - Jazyk Bible - jazyk, ve kterém byly importovány názvy knih Bible - Jazyk aplikace - jazyk, který byl vybrán pro aplikaci OpenLP - Angličtina - vždy použít anglické názvy knih + + Application Language + Jazyk aplikace BiblesPlugin.BookNameDialog - + Select Book Name Vybrat název knihy - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Pro následující název knihy nebyl nalezen interní název. Vyberte prosím ze seznamu odpovídající anglický název. - - - + Current name: Současný název: - + Corresponding name: Odpovídající název: - + Show Books From Zobrazit knihy od - + Old Testament Starý zákon - + New Testament Nový zákon - + Apocrypha Apokryfy + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + Pro následující název knihy není odpovídající vnitřní název. Vyberte prosím odpovídající název ze seznamu. + BiblesPlugin.BookNameForm - + You need to select a book. Je potřeba vybrat knihu. @@ -936,40 +972,110 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Editor Bible + + + + License Details + Podrobnosti k licenci + + + + Version name: + Název verze: + + + + Copyright: + Autorská práva: + + + + Permissions: + Povolení: + + + + Default Bible Language + Výchozí jazyk Bible + + + + Book name language in search field, search results and on display: + Jazyk názvů knih ve vyhledávacím poli, výsledcích vyhledávání a při zobrazení: + + + + Global Settings + Globální nastavení + + + + Bible Language + Jazyk Bible + + + + Application Language + Jazyk aplikace + + + + English + Angličtina + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + Toto je Bible stahovaná z Internetu. +Není možné přizpůsobit si názvy knih. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + Pro přizpůsobení názvů knih musí být vybrán "Jazyk Bible" v kartě Meta Data nebo na stránce Bible v Nastavení OpenLP, pokud je vybráno "Globální nastavení". + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registruji Bibli a stahuji knihy... - + Registering Language... Registruji jazyk... - + Importing %s... Importing <book name>... Importuji %s... - + Download Error Chyba stahování - + 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. Při stahování výběru veršů se vyskytl problém. Prosím prověřte své internetové připojení. Pokud se tato chyba stále objevuje, zvašte prosím nahlášení chyby. - + Parse Error Chyba zpracování - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Při rozbalování výběru veršů se vyskytl problém. Pokud se tato chyba stále objevuje, zvašte prosím nahlášení chyby. @@ -1146,17 +1252,17 @@ BiblesPlugin.LanguageDialog - + Select Language Vybrat jazyk - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP není schopen určit jazyk tohoto překladu Bible. Vyberte prosím jazyk ze seznamu níže. - + Language: Jazyk: @@ -1172,85 +1278,100 @@ BiblesPlugin.MediaItem - + Quick Rychlý - + Find: Hledat: - + Book: Kniha: - + Chapter: Kapitola: - + Verse: Verš: - + From: Od: - + To: Do: - + Text Search Hledání textu - + Second: Druhý: - + Scripture Reference Odkaz do Bible - + Toggle to keep or clear the previous results. Přepnout ponechání nebo smazání předchozích výsledků. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Nelze kombinovat jednoduché a dvojité výsledky hledání veršů v Bibli. Přejete si smazat výsledky hledání a začít s novým vyhledáváním? - + Bible not fully loaded. Bible není načtena celá. - + Information Informace - - The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. - Druhá Bible neobsahuje všechny verše jako jsou v hlavní Bibli. Budou zobrazeny jen verše nalezené v obou Biblích. %d veršů nebylo zahrnuto ve výsledcích. + + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + Druhá Bible neobsahuje všechny verše jako jsou v hlavní Bibli. Budou zobrazeny jen verše nalezené v obou Biblích. %d veršů nebylo zahrnuto ve výsledcích. + + + + Search Scripture Reference... + Hledat odkaz do Bible... + + + + Search Text... + Hledat text... + + + + Are you sure you want to delete "%s"? + Jste si jisti, že chcete smazat "%s"? BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importuji %s %s... @@ -1259,12 +1380,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Zjištuji kódování (může trvat několik minut)... - + Importing %s %s... Importing <book name> <chapter>... Importuji %s %s... @@ -1273,148 +1394,148 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory - Vybrat adresář pro zálohu + Vybrat složku pro zálohu - + Bible Upgrade Wizard Průvodce aktualizací Bible - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Tento průvodce pomáhá s aktualizací existujcích Biblí z předchozí verze OpenLP 2. Pro spuštění aktualizace klepně níže na tlačítko Další. - + Select Backup Directory - Vybrat adresář pro zálohu + Vybrat složku pro zálohu - + Please select a backup directory for your Bibles - Vyberte prosím adresář pro zálohu Biblí + Vyberte prosím složku pro zálohu Biblí - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - Předchozí vydání OpenLP 2.0 nejsou schopny aktualizovat Bible. Bude vytvořena záloha současných Biblí, aby bylo možné v případě potřeby jednoduše nakopírovat soubory zpět do datového adresáře aplikace OpenLP. Instrukce, jak obnovit soubory, lze nalézt v <a href="http://wiki.openlp.org/faq">často kladené otázky</a>. + Předchozí vydání OpenLP 2.0 nejsou schopny aktualizovat Bible. Bude vytvořena záloha současných Biblí, aby bylo možné v případě potřeby jednoduše nakopírovat soubory zpět do datové složky aplikace OpenLP. Instrukce, jak obnovit soubory, lze nalézt v <a href="http://wiki.openlp.org/faq">často kladené otázky</a>. - + Please select a backup location for your Bibles. Vyberte prosím umístění pro zálohu Biblí. - + Backup Directory: - Adresář pro zálohu: + Složka pro zálohu: - + There is no need to backup my Bibles Není potřeba zálohovat Bible - + Select Bibles Vybrat Bible - + Please select the Bibles to upgrade Vyberte prosím Bible k aktualizaci - + Upgrading Aktualizuji - + Please wait while your Bibles are upgraded. Čekejte prosím, než budou Bible aktualizovány. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. Záloha nebyla úspěšná. Pro zálohu Biblí je nutno oprávnění k zápisu do zadané složky. - + Upgrading Bible %s of %s: "%s" Failed Aktualizuji Bibli %s z %s: "%s" Selhalo - + Upgrading Bible %s of %s: "%s" Upgrading ... Aktualizuji Bibli %s z %s: "%s" Aktualizuji ... - + Download Error Chyba stahování - + To upgrade your Web Bibles an Internet connection is required. Pro aktualizaci Biblí z www je vyžadováno internetové připojení. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Aktualizuji Bibli %s z %s: "%s" Aktualizuji %s ... - + Upgrading Bible %s of %s: "%s" Complete Aktualizuji Bibli %s z %s: "%s" Dokončeno - + , %s failed , %s selhalo - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Aktualizace Biblí: %s úspěšné%s Upozornění: Verše z www Bible budou stáhnuty na vyžádání a proto je vyžadováno internetové připojení. - + Upgrading Bible(s): %s successful%s Aktualizace Biblí: %s úspěšné%s - + Upgrade failed. Aktualizace selhala. - + You need to specify a backup directory for your Bibles. Je potřeba upřesnit složku pro zálohu Biblí. - + Starting upgrade... Spouštím aktualizaci... - + There are no Bibles that need to be upgraded. Žádné Bible nepotřebují aktualizovat. @@ -1488,12 +1609,12 @@ CustomPlugin.CustomTab - + Custom Display Uživatelské zobrazení - + Display footer Patička zobrazení @@ -1501,42 +1622,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Upravit vlastní snímky - + &Title: &Název: - + Add a new slide at bottom. Přidat nový snímek na konec. - + Edit the selected slide. Upravit vybraný snímek. - + Edit all the slides at once. Upravit všechny snímky najednou. - + Split a slide into two by inserting a slide splitter. Vložením oddělovače se snímek rozdělí na dva. - + The&me: &Motiv: - + &Credits: &Zásluhy: @@ -1551,12 +1672,12 @@ Je nutno přidat alespoň jeden snímek - + Ed&it All Upra&it vše - + Insert Slide Vložit snímek @@ -1564,7 +1685,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Jste si jisti, že chcete smazat %n vybraný uživatelský snímek? @@ -1576,60 +1697,60 @@ ImagePlugin - + <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>Modul obrázek</strong><br />Modul obrázek se stará o zobrazování obrázků.<br />Jedna z charakteristických funkcí tohoto modulu je schopnost ve správci služby seskupit několik obrázků dohromady. Tato vlastnost zjednodušuje zobrazení více obrázků. Tento modul také využívá vlastnosti "časová smyčka" aplikace OpenLP a je tudíž možno vytvořit prezentaci obrázků, která poběží samostatně. Nadto lze využitím obrázků z modulu překrýt pozadí současného motivu. - + Image name singular Obrázek - + Images name plural Obrázky - + Images container title Obrázky - + Load a new image. Načíst nový obrázek. - + Add a new image. Přidat nový obrázek. - + Edit the selected image. Upravit vybraný obrázek. - + Delete the selected image. Smazat vybraný obrázek. - + Preview the selected image. Náhled vybraného obrázku. - + Send the selected image live. Zobrazit vybraný obrázek naživo. - + Add the selected image to the service. Přidat vybraný obrázek ke službě. @@ -1637,7 +1758,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Vybrat přílohu @@ -1645,44 +1766,44 @@ ImagePlugin.MediaItem - + Select Image(s) Vybrat obrázky - + You must select an image to delete. Pro smazání musíte nejdříve vybrat obrázek. - + You must select an image to replace the background with. K nahrazení pozadí musíte nejdříve vybrat obrázek. - + Missing Image(s) Chybějící obrázky - + The following image(s) no longer exist: %s Následující obrázky už neexistují: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? Následující obrázky už neexistují: % Chcete přidat ostatní obrázky? - + There was a problem replacing your background, the image file "%s" no longer exists. Problém s nahrazením pozadí. Obrázek "%s" už neexistuje. - + There was no display item to amend. Žádná položka k zobrazení nebyla pozměněna. @@ -1690,78 +1811,78 @@ ImagesPlugin.ImageTab - + Background Color Barva pozadí - + Default Color: Výchozí barva: - - Provides border where image is not the correct dimensions for the screen when resized. - Při změně velikosti zajišťuje okraje obrázku, pokud nemá správné rozměry pro obrazovku. + + Visible background for images with aspect ratio different to screen. + Viditelné pozadí pro obrázky s jiným poměrem stran než má obrazovka. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Modul média</strong><br />Modul média umožňuje přehrávat audio a video. - + Media name singular Médium - + Media name plural Média - + Media container title Média - + Load new media. Načíst nové médium. - + Add new media. Přidat nové médium. - + Edit the selected media. Upravit vybrané médium. - + Delete the selected media. Smazat vybrané médium. - + Preview the selected media. Náhled vybraného média. - + Send the selected media live. Zobrazit vybrané médium naživo. - + Add the selected media to the service. Přidat vybrané médium ke službě. @@ -1806,10 +1927,10 @@ There was no display item to amend. - Žádná položka k zobrazení nebyla pozměněna. + Žádná položka k zobrazení nebyla pozměněna. - + Unsupported File Nepodporovaný soubor @@ -1827,22 +1948,22 @@ MediaPlugin.MediaTab - + Available Media Players Dostupné přehrávače médií - + %s (unavailable) %s (nedostupný) - + Player Order Pořadí přehrávače - + Allow media player to be overridden Povolit překrytí přehrávače médií @@ -1850,7 +1971,7 @@ OpenLP - + Image Files Soubory s obrázky @@ -1872,17 +1993,17 @@ OpenLP.AboutForm - + Credits Zásluhy - + License Licence - + Contribute Přispět @@ -1892,17 +2013,17 @@ sestavení %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. Tato aplikace je svobodný software. Lze ji libovolně šířit a upravovat v souladu s GNU General Public licencí, vydané Free Software Foundation; a to v souladu s verzí 2 této licence. - + 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. Tato aplikace je šířena v naději, že bude užitečná, avšak BEZ JAKÉKOLI ZÁRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo VHODNOSTI PRO URČITÝ ÚČEL. Další podrobnosti viz níže. - + Project Lead %s @@ -2027,7 +2148,7 @@ On nás učinil svobodnými. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2044,7 +2165,7 @@ OpenLP vytváří a udržují dobrovolníci. Pokud má existovat více volně dostupného křesťanského software, zvažte prosím přispění tlačítkem níže. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Autorská práva © 2004-2012 %s @@ -2054,87 +2175,87 @@ OpenLP.AdvancedTab - + UI Settings Nastavení rozhraní - + Number of recent files to display: Počet zobrazených nedávných souborů: - + Remember active media manager tab on startup Pamatovat si při spuštění aktivní kartu správce médií - + Double-click to send items straight to live Dvojklik zobrazí položku přímo naživo - + Expand new service items on creation Při vytvoření rozbalit nové položky služby - + Enable application exit confirmation Zapnout potvrzování ukončení aplikace - + Mouse Cursor Kurzor myši - + Hide mouse cursor when over display window Skrýt kurzor myši v okně zobrazení - + Default Image Výchozí obrázek - + Background color: Barva pozadí: - + Image file: Soubor s obrázkem: - + Open File Otevřít soubor - + Advanced Pokročilé - + Preview items when clicked in Media Manager Náhled položek při klepnutí ve správci médií - + Click to select a color. Klepnout pro výběr barvy. - + Browse for an image file to display. Procházet pro obrázek k zobrazení. - + Revert to the default OpenLP logo. Vrátit na výchozí OpenLP logo. @@ -2146,137 +2267,221 @@ Služba %Y-%m-%d %H-%M - + Default Service Name Výchozí název služby - + Enable default service name Zapnout výchozí název služby - + Date and Time: Datum a čas: - + Monday Pondělí - + Tuesday Úterý - + Wednesday Středa - + Thurdsday Čtvrtek - + Friday Pátek - + Saturday Sobota - + Sunday Neděle - + Now Teď - + Time when usual service starts. Čas, kdy obvykle začíná bohoslužba. - + Name: Název: - + Consult the OpenLP manual for usage. Pro použití se podívejte do dokumentace. - + Revert to the default service name "%s". Vrátit na výchozí název služby "%s". - + Example: Příklad: - + X11 X11 - + Bypass X11 Window Manager Obejít správce oken X11 - + Syntax error. Chyba syntaxe. + + + Data Location + Umístění dat + + + + Current path: + Současná cesta: + + + + Custom path: + Uživatelská cesta: + + + + Browse for new data file location. + Procházet pro nové umístění datových souborů. + + + + Set the data location to the default. + Nastavit umístění dat na výchozí. + + + + Cancel + Zrušit + + + + Cancel OpenLP data directory location change. + Zrušit změnu umístění datové složky OpenLP. + + + + Copy data to new location. + Kopírovat data do nového umístění. + + + + Copy the OpenLP data files to the new location. + Kopírovat datové soubory OpenLP do nového umístění. + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + <strong>VAROVÁNÍ:</strong> Nové umístnění datové složky už obsahuje datové soubory OpenLP. Tyto soubory BUDOU nahrazeny během kopírování. + + + + Data Directory Error + Chyba datové složky + + + + Select Data Directory Location + Vybrat umístění datové složky + + + + Confirm Data Directory Change + Potvrdit změnu datové složky + + + + Reset Data Directory + Obnovit datovou složku + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + Jste si jisti, že chcede změnit umístění datové složky OpenLP na výchozí umístění? + +Toto umístění se použije po zavření aplikace OpenLP. + + + + Overwrite Existing Data + Přepsat existující data + OpenLP.ExceptionDialog - + Error Occurred Vznikla chyba - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Jejda! V aplikaci OpenLP vznikl problém, ze kterého není možné se zotavit. Text v polícku níže obsahuje informace, které mohou být užitečné pro vývojáře aplikace OpenLP. Zašlete je prosím spolu s podrobným popisem toho, co jste dělal, když problém vzniknul, na adresu bugs@openlp.org. - + Send E-Mail Poslat e-mail - + Save to File Uložit do souboru - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Zadejte prosím popis toho, co jste prováděl, když vznikla tato chyba (Minimálně 20 znaků) - + Attach File Přiložit soubor - + Description characters to enter : %s Znaky popisu pro vložení : %s @@ -2284,24 +2489,24 @@ OpenLP.ExceptionForm - + Platform: %s Platforma: %s - + Save Crash Report Uložit hlášení o pádu - + Text files (*.txt *.log *.text) Textové soubory (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2332,7 +2537,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2468,17 +2673,17 @@ Výchozí nastavení - + Downloading %s... Stahuji %s... - + Download complete. Click the finish button to start OpenLP. Stahování dokončeno. Klepnutím na tlačítko konec se spustí aplikace OpenLP. - + Enabling selected plugins... Zapínám vybrané moduly... @@ -2548,32 +2753,32 @@ Tento průvodce pomáhá nastavit OpenLP pro první použití. Pro start klepněte níže na tlačítko další. - + Setting Up And Downloading Nastavuji a stahuji - + Please wait while OpenLP is set up and your data is downloaded. Čekejte prosím, než bude aplikace OpenLP nastavena a data stáhnuta. - + Setting Up Nastavuji - + Click the finish button to start OpenLP. Klepnutím na tlačítko konec se spustí aplikace OpenLP. - + Download complete. Click the finish button to return to OpenLP. Stahování dokončeno. Klepnutím na tlačítko konec dojde k návratu do aplikace OpenLP. - + Click the finish button to return to OpenLP. Klepnutím na tlačítko konec dojde k návratu do aplikace OpenLP. @@ -2583,78 +2788,74 @@ Uživatelské snímky + + Finish + Konec + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Není dostupné internetové připojení. Průvodce prvním spuštění potřebuje internetové připojení ke stažení ukázek písní, Biblí a motivů. Pro spuštění aplikace OpenLP ve výchozím nastavení a bez ukázkových dat klepněte na tlačítko Konec. - -Průvodce prvním spuštění a import ukázkových dat lze znovu spustit později. Prověřte internetové připojení a v aplikaci OpenLP znovu spusťte průvode vybráním "Nástroje/Znovu spustit průvode prvním spuštění". + Internetové připojení není dostupné. Průvodce prvním spuštění potřebuje internetové připojení pro stažení ukázek písní, Biblí a motivů. Klepněte na tlačiko Konec pro spuštění aplikace OpenLP ve výchozím nastavení a bez ukázkových dat. -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - -Zrušit Průvodce prvním spuštění úplně (OpenLP nebude spuštěno), klepněte teď na tlačítko zrušit. - - - - Finish - Konec +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. + Průvodce prvním spuštění lze úplně zrušit (a nespustit OpenLP) klepnutím na tlačítko Zrušit. OpenLP.FormattingTagDialog - + Configure Formatting Tags Nastavit formátovací značky - + Edit Selection Upravit výběr - + Save Uložit - + Description Popis - + Tag Značka - + Start tag Začátek značky - + End tag Konec značky - + Tag Id Id značky - + Start HTML Začátek HTML - + End HTML Konec HTML @@ -2662,32 +2863,32 @@ OpenLP.FormattingTagForm - + Update Error Chyba aktualizace - + Tag "n" already defined. Značka "n" je už definovaná. - + New Tag Nová značka - + <HTML here> <HTML zde> - + </and here> </and zde> - + Tag %s already defined. Značka %s je už definovaná. @@ -2695,82 +2896,82 @@ OpenLP.FormattingTags - + Red Červená - + Black Černá - + Blue Modrá - + Yellow Žlutá - + Green Zelená - + Pink Růžová - + Orange Oranžová - + Purple Fialová - + White Bílá - + Superscript Horní index - + Subscript Dolní index - + Paragraph Odstavec - + Bold Tučné - + Italics Kurzíva - + Underline Podtržené - + Break Zalomení @@ -2778,180 +2979,170 @@ OpenLP.GeneralTab - + General Obecné - + Monitors Monitory - + Select monitor for output display: Vybrat monitor pro výstupní zobrazení: - + Display if a single screen Zobrazení při jedné obrazovce - + Application Startup Spuštění aplikace - + Show blank screen warning Zobrazit varování při prázdné obrazovce - + Automatically open the last service Automaticky otevřít poslední službu - + Show the splash screen Zobrazit úvodní obrazovku - + Application Settings Nastavení aplikace - + Prompt to save before starting a new service Před spuštěním nové služby se ptát na uložení - + Automatically preview next item in service Automatický náhled další položky ve službě - + sec sek - + CCLI Details CCLI podrobnosti - + SongSelect username: SongSelect uživatelské jméno: - + SongSelect password: SongSelect heslo: - + X X - + Y Y - + Height Výška - + Width Šířka - + Check for updates to OpenLP Kontrola aktualizací aplikace OpenLP - + Unblank display when adding new live item Odkrýt zobrazení při přidání nové položky naživo - + Timed slide interval: Časový interval mezi snímky: - + Background Audio Zvuk na pozadí - + Start background audio paused Spustit audio na pozadí pozastavené - + Service Item Slide Limits Omezení snímku položky služby - - &End Slide - &Poslední snímek - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - Klávesy nahoru a dolu se zastaví na prvním a posledním snímku každé položky služby. - - - - &Wrap Slide - &Pokračovat prvním + + Override display position: + Překrýt pozici zobrazení: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - Klávesy nahoru a dolu přechází dokola z posledního na první snímek každé položky služby. + + Repeat track list + Opakovat seznam stop - - &Next Item - &Další položka + + Behavior of next/previous on the last/first slide: + Chování další/předchozí na posledním/prvním snímku: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - Klávesy nahoru a dolu přecházejí na další nebo předchozí položku služby od prvního k poslednímu snímku každé položky služby. + + &Remain on Slide + &Zůstat na snímku - - Override display position: - Překrýt pozici zobrazení: + + &Wrap around + &Skočit na první/poslední snímek - - Repeat track list - Opakovat seznam stop + + &Move to next/previous service item + &Přesun na další/předchozí položku ve službě OpenLP.LanguageManager - + Language Jazyk - + Please restart OpenLP to use your new language setting. Změny nastavení jazyka se projeví restartováním aplikace OpenLP. @@ -2967,287 +3158,287 @@ OpenLP.MainWindow - + &File &Soubor - + &Import &Import - + &Export &Export - + &View &Zobrazit - + M&ode &Režim - + &Tools &Nástroje - + &Settings &Nastavení - + &Language &Jazyk - + &Help &Nápověda - + Media Manager Správce médií - + Service Manager Správce služby - + Theme Manager Správce motivů - + &New &Nový - + &Open &Otevřít - + Open an existing service. Otevřít existující službu. - + &Save &Uložit - + Save the current service to disk. Uložit současnou službu na disk. - + Save &As... Uložit &jako... - + Save Service As Uložit službu jako - + Save the current service under a new name. Uložit současnou službu s novým názvem. - + E&xit U&končit - + Quit OpenLP Ukončit OpenLP - + &Theme &Motiv - + &Configure OpenLP... &Nastavit OpenLP... - + &Media Manager Správce &médií - + Toggle Media Manager Přepnout správce médií - + Toggle the visibility of the media manager. Přepnout viditelnost správce médií. - + &Theme Manager Správce &motivů - + Toggle Theme Manager Přepnout správce motivů - + Toggle the visibility of the theme manager. Přepnout viditelnost správce motivů. - + &Service Manager Správce &služby - + Toggle Service Manager Přepnout správce služby - + Toggle the visibility of the service manager. Přepnout viditelnost správce služby. - + &Preview Panel Panel &náhledu - + Toggle Preview Panel Přepnout panel náhledu - + Toggle the visibility of the preview panel. Přepnout viditelnost panelu náhled. - + &Live Panel Panel na&živo - + Toggle Live Panel Přepnout panel naživo - + Toggle the visibility of the live panel. Přepnout viditelnost panelu naživo. - + &Plugin List Seznam &modulů - + List the Plugins Vypsat moduly - + &User Guide &Uživatelská příručka - + &About &O aplikaci - + More information about OpenLP Více informací o aplikaci OpenLP - + &Online Help &Online nápověda - + &Web Site &Webová stránka - + Use the system language, if available. Použít jazyk systému, pokud je dostupný. - + Set the interface language to %s Jazyk rozhraní nastaven na %s - + Add &Tool... Přidat &nástroj... - + Add an application to the list of tools. Přidat aplikaci do seznamu nástrojů. - + &Default &Výchozí - + Set the view mode back to the default. Nastavit režim zobrazení zpět na výchozí. - + &Setup &Nastavení - + Set the view mode to Setup. Nastavit režim zobrazení na Nastavení. - + &Live &Naživo - + Set the view mode to Live. Nastavit režim zobrazení na Naživo. - + 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/. @@ -3256,108 +3447,108 @@ Nejnovější verzi lze stáhnout z http://openlp.org/. - + OpenLP Version Updated Verze OpenLP aktualizována - + OpenLP Main Display Blanked Hlavní zobrazení OpenLP je prázdné - + The Main Display has been blanked out Hlavní zobrazení nastaveno na prázdný snímek - + Default Theme: %s Výchozí motiv: %s - + English Please add the name of your language here - Angličtina + Čeština - + Configure &Shortcuts... Nastavuji &zkratky... - + Close OpenLP Zavřít OpenLP - + Are you sure you want to close OpenLP? Chcete opravdu zavřít aplikaci OpenLP? - + Open &Data Folder... Otevřít složku s &daty... - + Open the folder where songs, bibles and other data resides. Otevřít složku, kde se nachází písně, Bible a ostatní data. - + &Autodetect &Automaticky detekovat - + Update Theme Images Aktualizovat obrázky motivu - + Update the preview images for all themes. Aktualizovat náhledy obrázků všech motivů. - + Print the current service. Tisk současné služby. - + &Recent Files &Nedávné soubory - + L&ock Panels &Uzamknout panely - + Prevent the panels being moved. Zabrání přesunu panelů. - + Re-run First Time Wizard Znovu spustit Průvodce prvním spuštění - + Re-run the First Time Wizard, importing songs, Bibles and themes. Znovu spustit Průvodce prvním spuštění, importovat písně, Bible a motivy. - + Re-run First Time Wizard? Znovu spustit Průvodce prvním spuštění? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3366,43 +3557,43 @@ Znovu spuštěním tohoto průvodce může dojít ke změně současného nastavení aplikace OpenLP a pravděpodobně budou přidány písně k existujícímu seznamu a změněn výchozí motiv. - + Clear List Clear List of recent files Vyprázdnit seznam - + Clear the list of recent files. Vyprázdnit seznam nedávných souborů. - + Configure &Formatting Tags... Nastavit &formátovací značky... - + Export OpenLP settings to a specified *.config file Export nastavení OpenLP do určitého *.config souboru - + Settings Nastavení - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Import nastavení OpenLP ze určitého *.config souboru dříve exportovaného na tomto nebo jiném stroji - + Import settings? Importovat nastavení? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3415,45 +3606,50 @@ Importování nesprávných nastavení může zapříčinit náladové chování nebo nenormální ukončení aplikace OpenLP. - + Open File Otevřít soubor - + OpenLP Export Settings Files (*.conf) Soubory exportovaného nastavení OpenLP (*.conf) - + Import settings Import nastavení - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. Aplikace OpenLP se nyní zavře. Importovaná nastavení se použijí při příštim spuštění. - + Export Settings File Soubor exportovaného nastavení - + OpenLP Export Settings File (*.conf) Soubor exportovaného nastavení OpenLP (*.conf) + + + New Data Directory Error + Chyba nové datové složky + OpenLP.Manager - + Database Error Chyba databáze - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3462,7 +3658,7 @@ Databáze: %s - + OpenLP cannot load your database. Database: %s @@ -3474,74 +3670,74 @@ OpenLP.MediaManagerItem - + No Items Selected Nevybraná zádná položka - + &Add to selected Service Item &Přidat k vybrané Položce Služby - + You must select one or more items to preview. Pro náhled je třeba vybrat jednu nebo více položek. - + You must select one or more items to send live. Pro zobrazení naživo je potřeba vybrat jednu nebo více položek. - + You must select one or more items. Je třeba vybrat jednu nebo více položek. - + You must select an existing service item to add to. K přidání Je třeba vybrat existující položku služby. - + Invalid Service Item Neplatná Položka služby - + You must select a %s service item. Je třeba vybrat %s položku služby. - + You must select one or more items to add. Pro přidání Je třeba vybrat jednu nebo více položek. - + No Search Results Žádné výsledky hledání - + Invalid File Type Neplatný typ souboru - + Invalid File %s. Suffix not supported Neplatný soubor %s. Přípona není podporována - + &Clone &Klonovat - + Duplicate files were found on import and were ignored. Při importu byly nalezeny duplicitní soubory a byly ignorovány. @@ -3549,12 +3745,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. Chybějící značka <lyrics>. - + <verse> tag is missing. Chybějící značka <verse>. @@ -3562,27 +3758,27 @@ OpenLP.PluginForm - + Plugin List Seznam modulů - + Plugin Details Podrobnosti k modulu - + Status: Stav: - + Active Aktivní - + Inactive Neaktivní @@ -3605,12 +3801,12 @@ OpenLP.PrintServiceDialog - + Fit Page Přizpůsobit stránce - + Fit Width Přizpůsobit šířce @@ -3618,7 +3814,7 @@ OpenLP.PrintServiceForm - + Options Možnosti @@ -3633,47 +3829,47 @@ Kopírovat jako HTML - + Zoom In Zvětšit - + Zoom Out Zmenšit - + Zoom Original Původní velikost - + Other Options Ostatní možnosti - + Include slide text if available Zahrnout text snímku, pokud je k dispozici - + Include service item notes Zahrnout poznámky položky služby - + Include play length of media items Zahrnout délku přehrávání mediálních položek - + Add page break before each text item Přidat zalomení stránky před každou textovou položku - + Service Sheet List služby @@ -3683,12 +3879,12 @@ Tisk - + Title: Nadpis: - + Custom Footer Text: Uživatelský text zápatí: @@ -3696,12 +3892,12 @@ OpenLP.ScreenList - + Screen Obrazovka - + primary Primární @@ -3709,12 +3905,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Začátek</strong>: %s - + <strong>Length</strong>: %s <strong>Délka</strong>: %s @@ -3722,7 +3918,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Změnit pořadí Položky služby @@ -3730,82 +3926,82 @@ OpenLP.ServiceManager - + Move to &top Přesun &nahoru - + Move item to the top of the service. Přesun položky ve službě úplně nahoru. - + Move &up Přesun &výše - + Move item up one position in the service. Přesun položky ve službě o jednu pozici výše. - + Move &down P?esun &níže - + Move item down one position in the service. P?esun položky ve služb? o jednu pozici níže. - + Move to &bottom Přesun &dolu - + Move item to the end of the service. Přesun položky ve službě úplně dolů. - + &Delete From Service &Smazat ze služby - + Delete the selected item from the service. Smazat vybranou položku ze služby. - + &Add New Item &Přidat novou položku - + &Add to Selected Item &Přidat k vybrané položce - + &Edit Item &Upravit položku - + &Reorder Item &Změnit pořadí položky - + &Notes &Poznámky - + &Change Item Theme &Změnit motiv položky @@ -3827,112 +4023,107 @@ Soubor není platná služba. - + Missing Display Handler Chybějící obsluha zobrazení - + Your item cannot be displayed as there is no handler to display it Položku není možno zobrazit, protože chybí obsluha pro její zobrazení - + Your item cannot be displayed as the plugin required to display it is missing or inactive Položku není možno zobrazit, protože modul potřebný pro zobrazení položky chybí nebo je neaktivní - + &Expand all &Rozvinou vše - + Expand all the service items. Rozvinout všechny položky služby. - + &Collapse all &Svinout vše - + Collapse all the service items. Svinout všechny položky služby. - + Open File Otevřít soubor - + Moves the selection down the window. Přesune výběr v rámci okna dolu. - + Move up Přesun nahoru - + Moves the selection up the window. Přesune výběr v rámci okna nahoru. - + Go Live Zobrazit naživo - + Send the selected item to Live. Zobrazí vybranou položku naživo. - + &Start Time &Spustit čas - + Show &Preview Zobrazit &náhled - - Show &Live - Zobrazit n&aživo - - - + Modified Service Změněná služba - + The current service has been modified. Would you like to save this service? Současná služba byla změněna. Přejete si službu uložit? - + Custom Service Notes: Poznámky Uživatelský služby: - + Notes: Poznámky: - + Playing time: Čas přehrávání: - + Untitled Service Prázdná služba @@ -3957,17 +4148,17 @@ Poškozený soubor - + Load an existing service. Načíst existující službu. - + Save this service. Uložit tuto službu. - + Select a theme for the service. Vybrat motiv pro službu. @@ -3977,7 +4168,7 @@ Soubor je buďto poškozen nebo se nejedná o soubor se službou z aplikace OpenLP 2.0. - + Service File Missing Chybějící soubor se službou @@ -4001,11 +4192,21 @@ Service copy only Kopírovat jen službu + + + Error Saving File + Chyba při ukládání souboru + + + + There was an error saving your file. + Vznikla chyba při ukládání souboru. + OpenLP.ServiceNoteForm - + Service Item Notes Poznámky položky služby @@ -4021,67 +4222,67 @@ OpenLP.ShortcutListDialog - + Action Činnost - + Shortcut Zkratka - + Duplicate Shortcut - Duplikovat zkratku + Duplicitní zkratka - + The shortcut "%s" is already assigned to another action, please use a different shortcut. Zkratka "%s" je už přiřazena jiné činnosti. Použijte prosím jinou zkratku. - + Alternate Alternativa - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Zadání nové hlavní nebo alternativní zkratky se spustí vybráním činnosti a klepnutím na jedno z tlačítek níže. - + Default Výchozí - + Custom Uživatelský - + Capture shortcut. Zachytit zkratku. - + Restore the default shortcut of this action. Obnovit výchozí zkratku činnosti. - + Restore Default Shortcuts Obnovit výchozí zkratku - + Do you want to restore all shortcuts to their defaults? Chcete obnovit všechny zkratky na jejich výchozí hodnoty? - + Configure Shortcuts Nastavit zkratky @@ -4089,177 +4290,172 @@ OpenLP.SlideController - + Hide Skrýt - + Go To Přejít na - + Blank Screen Prázdná obrazovka - + Blank to Theme Prázdný motiv - + Show Desktop Zobrazit plochu - + Previous Service Předchozí služba - + Next Service Další služba - + Escape Item Zrušit položku - + Move to previous. Přesun na předchozí. - + Move to next. Přeson na další. - + Play Slides Přehrát snímky - + Delay between slides in seconds. Zpoždění mezi s nímky v sekundách. - + Move to live. Přesun naživo. - + Add to Service. Přidat ke službě. - + Edit and reload song preview. Upravit a znovu načíst náhled písně. - + Start playing media. Spustit přehrávání média. - + Pause audio. Pozastavit zvuk. - + Pause playing media. Pozastavit přehrávání média. - + Stop playing media. Zastavit přehrávání média. - + Video position. Umístění videa. - + Audio Volume. Hlasitost zvuku. - + Go to "Verse" Přejít na "Sloka" - + Go to "Chorus" Přejít na "Refrén" - + Go to "Bridge" Přejít na "Přechod" - + Go to "Pre-Chorus" Přejít na "Předrefrén" - + Go to "Intro" Přejít na "Úvod" - + Go to "Ending" Přejít na "Zakončení" - + Go to "Other" Přejít na "Ostatní" - + Previous Slide Předchozí snímek - + Next Slide Další snímek - + Pause Audio Pozastavit zvuk - + Background Audio Zvuk na pozadí - - Next Track - Další stopa - - - + Go to next audio track. Přejít na další zvukovou stopu. - + Tracks Stopy @@ -4335,17 +4531,17 @@ Čas začátku je nastaven po času konce mediální položky - + Theme Layout Rozvržení motivu - + The blue box shows the main area. Modré políčko ukazuje hlavní oblast. - + The red box shows the footer. Červené políčko ukazuje zápatí. @@ -4353,32 +4549,32 @@ OpenLP.ThemeForm - + Select Image Vybrat obrázek - + Theme Name Missing Chybí název motivu - + There is no name for this theme. Please enter one. Není vyplněn název motivu. Prosím zadejte ho. - + Theme Name Invalid Neplatný název motivu - + Invalid theme name. Please enter one. Neplatný název motivu. Prosím zadejte nový. - + (approximately %d lines per slide) (přibližně %d řádek na snímek) @@ -4386,193 +4582,193 @@ OpenLP.ThemeManager - + Create a new theme. Vytvoří nový motiv. - + Edit Theme Upravit motiv - + Edit a theme. Upraví motiv. - + Delete Theme Smazat motiv - + Delete a theme. Smaže motiv. - + Import Theme Import motivu - + Import a theme. Importuje motiv. - + Export Theme Export motivu - + Export a theme. Exportuje motiv. - + &Edit Theme &Upravit motiv - + &Delete Theme &Smazat motiv - + Set As &Global Default Nastavit jako &Globální výchozí - + %s (default) %s (výchozí) - + You must select a theme to edit. Pro úpravy je třeba vybrat motiv. - + You are unable to delete the default theme. Není možno smazat výchozí motiv. - + Theme %s is used in the %s plugin. Motiv %s je používán v modulu %s. - + You have not selected a theme. Není vybrán žádný motiv. - + Save Theme - (%s) Uložit motiv - (%s) - + Theme Exported Motiv exportován - + Your theme has been successfully exported. Motiv byl úspěšně exportován. - + Theme Export Failed Export motivu selhal - + Your theme could not be exported due to an error. Kvůli chybě nebylo možno motiv exportovat. - + Select Theme Import File Vybrat soubor k importu motivu - + File is not a valid theme. Soubor není platný motiv. - + &Copy Theme &Kopírovat motiv - + &Rename Theme &Přejmenovat motiv - + &Export Theme &Export motivu - + You must select a theme to rename. K přejmenování je třeba vybrat motiv. - + Rename Confirmation Potvrzení přejmenování - + Rename %s theme? Přejmenovat motiv %s? - + You must select a theme to delete. Pro smazání je třeba vybrat motiv. - + Delete Confirmation Potvrzení smazání - + Delete %s theme? Smazat motiv %s? - + Validation Error Chyba ověřování - + A theme with this name already exists. Motiv s tímto názvem již existuje. - + OpenLP Themes (*.theme *.otz) OpenLP motivy (*.theme *.otz) - + Copy of %s Copy of <theme name> Kopie %s - + Theme Already Exists Motiv již existuje @@ -4580,272 +4776,272 @@ OpenLP.ThemeWizard - + Theme Wizard Průvodce motivem - + Welcome to the Theme Wizard Vítejte v průvodci motivem - + Set Up Background Nastavení pozadí - + Set up your theme's background according to the parameters below. Podle parametrů níže nastavte pozadí motivu. - + Background type: Typ pozadí: - + Solid Color Plná barva - + Gradient Přechod - + Color: Barva: - + Gradient: Přechod: - + Horizontal Vodorovný - + Vertical Svislý - + Circular Kruhový - + Top Left - Bottom Right Vlevo nahoře - vpravo dole - + Bottom Left - Top Right Vlevo dole - vpravo nahoře - + Main Area Font Details Podrobnosti písma hlavní oblasti - + Define the font and display characteristics for the Display text Definovat písmo a charakteristiku zobrazení pro zobrazený text - + Font: Písmo: - + Size: Velikost: - + Line Spacing: Řádkování: - + &Outline: &Obrys: - + &Shadow: &Stín: - + Bold Tučné - + Italic Kurzíva - + Footer Area Font Details Podrobnosti písma oblasti zápatí - + Define the font and display characteristics for the Footer text Definovat písmo a charakteristiku zobrazení pro text zápatí - + Text Formatting Details Podrobnosti formátování textu - + Allows additional display formatting information to be defined Dovoluje definovat další formátovací informace zobrazení - + Horizontal Align: Vodorovné zarovnání: - + Left Vlevo - + Right Vpravo - + Center Na střed - + Output Area Locations Umístění výstupní oblasti - + Allows you to change and move the main and footer areas. Dovoluje změnit a přesunout hlavní oblast a oblast zápatí. - + &Main Area &Hlavní oblast - + &Use default location &Použít výchozí umístění - + X position: Pozice X: - + px px - + Y position: Pozice Y: - + Width: Šířka: - + Height: Výška: - + Use default location Použít výchozí umístění - + Save and Preview Uložit a náhled - + View the theme and save it replacing the current one or change the name to create a new theme Zobrazit motiv a uložit ho, dojde k přepsání současného nebo změňte název, aby se vytvořil nový motiv - + Theme name: Název motivu: - + Edit Theme - %s Upravit motiv - %s - + 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. Tento průvodce pomáhá s vytvořením a úpravou vašich motivu. Klepněte níže na tlačítko další pro spuštění procesu nastavení vašeho pozadí. - + Transitions: Přechody: - + &Footer Area Oblast &zápatí - + Starting color: Barva začátku: - + Ending color: Barva konce: - + Background color: Barva pozadí: - + Justify Do bloku - + Layout Preview Náhled rozvržení - + Transparent Průhledný @@ -4853,47 +5049,47 @@ OpenLP.ThemesTab - + Global Theme Globální motiv - + Theme Level Úroveň motivu - + S&ong Level Úroveň &písně - + 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. Použít motiv z každé písně z databáze. Pokud píseň nemá přiřazen motiv, potom se použije motiv služby. Pokud služba nemá motiv, pak se použije globální motiv. - + &Service Level Úroveň &služby - + 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. Použitím motivu ze služby se překryje motiv jednotlivých písní. Pokud služba nemá motiv, tak se použije globální motiv. - + &Global Level &Globální úroveň - + Use the global theme, overriding any themes associated with either the service or the songs. Použitím globálního motivu se překryjí motivy, které jsou přiřazeny službám nebo písním. - + Themes Motivy @@ -4977,239 +5173,239 @@ pt - + Image Obrázek - + Import Import - + Live Naživo - + Live Background Error Chyba v pozadí naživo - + Load Načíst - + Middle Uprostřed - + New Nový - + New Service Nová služba - + New Theme Nový motiv - + No File Selected Singular Nevybrán žádný soubor - + No Files Selected Plural Nevybrány žádné soubory - + No Item Selected Singular Nevybrána žádná položka - + No Items Selected Plural Nevybrány žádné položky - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Náhled - + Replace Background Nahradit pozadí - + Reset Background Obnovit pozadí - + s The abbreviated unit for seconds s - + Save && Preview Uložit a náhled - + Search Hledat - + You must select an item to delete. Je třeba vybrat nějakou položku ke smazání. - + You must select an item to edit. Je třeba vybrat nějakou položku k úpravám. - + Save Service Uložit službu - + Service Služba - + Start %s Spustit %s - + Theme Singular Motiv - + Themes Plural Motivy - + Top Nahoře - + Version Verze - + Delete the selected item. Smazat vybranou položku. - + Move selection up one position. Přesun výběru o jednu pozici výše. - + Move selection down one position. Přesun výběru o jednu pozici níže. - + &Vertical Align: &Svislé zarovnání: - + Finished import. Import dokončen. - + Format: Formát: - + Importing Importuji - + Importing "%s"... Importuji "%s"... - + Select Import Source Vybrat zdroj importu - + Select the import format and the location to import from. Vyberte formát importu a umístění, ze kterého se má importovat. - + 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. Import dat z openlp.org 1.x je vypnuté kvůli chybějícímu Python modulu. Pokud chcete využít tohoto importu dat, je třeba nainstallovat modul "python-sqlite". - + Open %s File Otevřít soubor %s - + %p% %p% - + Ready. Připraven. - + Starting import... Spouštím import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong Je třeba specifikovat alespoň jeden %s soubor, ze kterého se bude importovat. @@ -5225,7 +5421,7 @@ Vítejte v průvodci exportu písní - + Welcome to the Song Import Wizard Vítejte v průvodci importu písní @@ -5294,7 +5490,7 @@ Duplicate Error - Duplikovat chybu + Duplicitní chyba @@ -5313,53 +5509,53 @@ hod - + Layout style: Styl rozvržení: - + Live Toolbar Nástrojová lišta naživo - + m The abbreviated unit for minutes min - + OpenLP is already running. Do you wish to continue? Aplikace OpenLP je už spuštěna. Přejete si pokračovat? - + Settings Nastavení - + Tools Nástroje - + Unsupported File Nepodporovaný soubor - + Verse Per Slide Verš na snímek - + Verse Per Line Verš na jeden řádek - + View Zobrazit @@ -5374,42 +5570,37 @@ Chyba v syntaxi XML - + View Mode Režim zobrazení - + Open service. Otevřít službu. - + Print Service Tisk služby - + Replace live background. Nahradit pozadí naživo. - + Reset live background. Obnovit pozadí naživo. - - &Split - &Rozdělit - - - + Split a slide into two only if it does not fit on the screen as one slide. Rozdělit snímek na dva jen v případě, že se nevejde na obrazovku jako jeden snímek. - + Welcome to the Bible Upgrade Wizard Vítejte v průvodci aktualizací Biblí @@ -5419,53 +5610,105 @@ Potvrdit smazání - + Play Slides in Loop Přehrát snímky ve smyčce - + Play Slides to End Přehrát snímky ke konci - + Stop Play Slides in Loop Zastavit přehrávání snímků ve smyčce - + Stop Play Slides to End Zastavit přehrávání snímků ke konci - + Next Track Další stopa + + + Search Themes... + Search bar place holder text + Hledat motiv... + + + + Optional &Split + Volitelné &rozdělení + + + + Invalid Folder Selected + Singular + Vybraná neplatná složka + + + + Invalid File Selected + Singular + Vybraný neplatný soubor + + + + Invalid Files Selected + Plural + Vybrané neplatné soubory + + + + No Folder Selected + Singular + Nevybraná žádná složka + + + + Open %s Folder + Otevřít složku %s + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + Je potřeba upřesnit jeden %s soubor, ze kterého se bude importovat. + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + Je potřeba upřesnit jednu %s složku, ze které se bude importovat. + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 a %2 - + %1, and %2 Locale list separator: end %1 and %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5474,50 +5717,50 @@ PresentationPlugin - + <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>Modul prezentace</strong><br />Modul prezentace dovoluje zobrazovat prezentace z několika různých programů. Výběr dostupných prezentačních programů je uživateli přístupný v rozbalovacím menu. - + Presentation name singular Prezentace - + Presentations name plural Prezentace - + Presentations container title Prezentace - + Load a new presentation. Načíst novou prezentaci. - + Delete the selected presentation. Smazat vybranou prezentaci. - + Preview the selected presentation. Náhled vybrané prezentace. - + Send the selected presentation live. Zobrazit vybranou prezentaci naživo. - + Add the selected presentation to the service. Přidat vybranou prezentaci ke službě. @@ -5525,70 +5768,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Vybrat prezentace - + Automatic Automaticky - + Present using: Nyní používající: - + File Exists Soubor existuje - + A presentation with that filename already exists. Prezentace s tímto názvem souboru už existuje. - + This type of presentation is not supported. Tento typ prezentace není podporován. - + Presentations (%s) Prezentace (%s) - + Missing Presentation Chybějící prezentace - - The Presentation %s no longer exists. - Prezentace %s už neexistuje. + + The presentation %s is incomplete, please reload. + Prezentace %s není kompletní. Načtěte ji znovu. - - The Presentation %s is incomplete, please reload. - Prezentace %s není kompletní, prosím načtěte ji znovu. + + The presentation %s no longer exists. + Prezentace %s už neexistuje. PresentationPlugin.PresentationTab - + Available Controllers Dostupné ovládání - + %s (unavailable) %s (nedostupný) - + Allow presentation application to be overridden Povolit překrytí prezentační aplikace @@ -5622,221 +5865,236 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 Dálkové ovládání - + OpenLP 2.0 Stage View OpenLP 2.0 Zobrazení na pódiu - + Service Manager Správce služby - + Slide Controller Ovládání snímku - + Alerts Upozornění - + Search Hledat - - Back - Zpět - - - + Refresh Obnovit - + Blank Prázdný - + Show Zobrazit - + Prev Předchozí - + Next Další - + Text Text - + Show Alert Zobrazit upozornění - + Go Live Zobrazit naživo - + No Results Žádné hledání - + Options Možnosti - + Add to Service Přidat ke službě + + + Home + Domů + + + + Theme + Motiv + + + + Desktop + Plocha + + + + Add &amp; Go to Service + Přidat &amp; Přejít ke službě + RemotePlugin.RemoteTab - + Serve on IP address: Poslouchat na IP adresse: - + Port number: Číslo portu: - + Server Settings Nastavení serveru - + Remote URL: URL dálkového ovládání: - + Stage view URL: URL zobrazení na jevišti: - + Display stage time in 12h format Zobrazit čas na pódiu ve 12hodinovém formátu - + Android App Android aplikace - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. - Naskenujte QR kód nebo pro instalaci android aplikace z marketu klepněte na <a href="https://market.android.com/details?id=org.openlp.android">stáhnout</a> + Naskenujte QR kód nebo pro instalaci Android aplikace z marketu klepněte na <a href="https://market.android.com/details?id=org.openlp.android">stáhnout</a>. SongUsagePlugin - + &Song Usage Tracking Sledování použití &písní - + &Delete Tracking Data &Smazat data sledování - + Delete song usage data up to a specified date. Smazat data použití písní až ke konkrétnímu kalendářnímu datu. - + &Extract Tracking Data &Rozbalit data sledování - + Generate a report on song usage. Vytvořit hlášení z používání písní. - + Toggle Tracking Přepnout sledování - + Toggle the tracking of song usage. Přepnout sledování použití písní. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Modul používání písní</strong><br />Tento modul sleduje používání písní ve službách. - + SongUsage name singular Používání písně - + SongUsage name plural Používání písní - + SongUsage container title Používání písní - + Song Usage Používání písní - + Song usage tracking is active. Sledování použití písní je zapnuto. - + Song usage tracking is inactive. Sledování použití písní je vypnuto. - + display zobrazení - + printed vytisknutý @@ -5844,7 +6102,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Smazat data používání písní @@ -5869,7 +6127,7 @@ Všechny požadovaná data byla úspěšně smazána. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Vyberte datum, ke kterému se smažou data o používání písní. Všechna data, zaznamenaná před tímto datumem budou natrvalo smazána. @@ -5877,42 +6135,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Rozbalení používání písní - + Select Date Range Vybrat rozsah datumu - + to do - + Report Location Umístění hlášení - + Output File Location Umístění výstupního souboru - + usage_detail_%s_%s.txt usage_detail_%s_%s.txt - + Report Creation Vytvoření hlášení - + Report %s has been successfully created. @@ -5921,12 +6179,12 @@ bylo úspěšně vytvořeno. - + Output Path Not Selected Nevybrána výstupní cesta - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. Platné výstupní umístění pro hlášení používání písní není nastaveno. Prosím vyberte existující cestu ve vašem počítači. @@ -5964,82 +6222,82 @@ Přeindexovávám písně... - + Arabic (CP-1256) Arabština (CP-1256) - + Baltic (CP-1257) Baltské jazyky (CP-1257) - + Central European (CP-1250) Středoevropské jazyky (CP-1250) - + Cyrillic (CP-1251) Cyrilice (CP-1251) - + Greek (CP-1253) Řečtina (CP-1253) - + Hebrew (CP-1255) Hebrejština (CP-1255) - + Japanese (CP-932) Japonština (CP-932) - + Korean (CP-949) Korejština (CP-949) - + Simplified Chinese (CP-936) Zjednodušená čínština (CP-936) - + Thai (CP-874) Thajština (CP-874) - + Traditional Chinese (CP-950) Tradiční čínština (CP-950) - + Turkish (CP-1254) Turečtina (CP-1254) - + Vietnam (CP-1258) Vietnamština (CP-1258) - + Western European (CP-1252) Západoevropské jazyky (CP-1252) - + Character Encoding Kódování znaků - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6048,26 +6306,26 @@ Předvybraná volba by obvykle měla být správná. - + Please choose the character encoding. The encoding is responsible for the correct character representation. Vyberte prosím kódování znaků. Kódování zodpovídá za správnou reprezentaci znaků. - + Song name singular Píseň - + Songs name plural Písně - + Songs container title Písně @@ -6078,32 +6336,32 @@ Exportuje písně průvodcem exportu. - + Add a new song. Přidat novou píseň. - + Edit the selected song. Upravit vybranou píseň. - + Delete the selected song. Smazat vybranou píseň. - + Preview the selected song. Náhled vybrané písně. - + Send the selected song live. Zobrazit vybranou píseň naživo. - + Add the selected song to the service. Přidat vybranou píseň ke službě. @@ -6131,17 +6389,17 @@ Příjmení: - + You need to type in the first name of the author. Je potřeba zadat křestní jméno autora. - + You need to type in the last name of the author. Je potřeba zadat příjmení autora. - + You have not set a display name for the author, combine the first and last names? Zobrazené jméno autora není zadáno. Má se zkombinovat křestní jméno a příjmení? @@ -6172,209 +6430,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Meta data + + + + Custom Book Names + Uživatelské názvy knih + + + SongsPlugin.EditSongForm - + Song Editor Editor písně - + &Title: &Název: - + Alt&ernate title: &Jiný název: - + &Lyrics: &Text písně: - + &Verse order: &Pořadí veršů: - + Ed&it All &Upravit vše - + Title && Lyrics Název a text písně - + &Add to Song &Přidat k písni - + &Remove &Odstranit - + &Manage Authors, Topics, Song Books &Správa autorů, témat a zpěvníků - + A&dd to Song &Přidat k písni - + R&emove &Odstranit - + Book: Zpěvník: - + Number: Číslo: - + Authors, Topics && Song Book Autoři, témata a zpěvníky - + New &Theme Nový &motiv - + Copyright Information Informace o autorském právu - + Comments Komentáře - + Theme, Copyright Info && Comments Motiv, autorská práva a komentáře - + Add Author Přidat autora - + This author does not exist, do you want to add them? Tento autor neexistuje. Chcete ho přidat? - + This author is already in the list. Tento autor je už v seznamu. - + 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. Není vybrán platný autor. Buďto vyberte autora ze seznamu nebo zadejte nového autora a pro přidání nového autora klepněte na tlačítko "Přidat autora k písni". - + Add Topic Přidat téma - + This topic does not exist, do you want to add it? Toto téma neexistuje. Chcete ho přidat? - + This topic is already in the list. Toto téma je už v seznamu. - + 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. Není vybráno platné téma. Buďto vyberte téma ze seznamu nebo zadejte nové téma a pro přidání nového tématu klepněte na tlačítko "Přidat téma k písni". - + You need to type in a song title. Je potřeba zadat název písne. - + You need to type in at least one verse. Je potřeba zadat alespoň jednu sloku. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. Pořadí částí písně není platné. Část odpovídající %s neexistuje. Platné položky jsou %s. - + Add Book Přidat zpěvník - + This song book does not exist, do you want to add it? Tento zpěvník neexistuje. Chcete ho přidat? - + You need to have an author for this song. Pro tuto píseň je potřeba zadat autora. - + You need to type some text in to the verse. Ke sloce je potřeba zadat nějaký text. - + Linked Audio Připojený zvuk - + Add &File(s) Přidat &soubor(y) - + Add &Media Přidat &Médium - + Remove &All Odstranit &Vše - + Open File(s) Otevřít soubor(y) - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Varování:</strong> Nejsou použity všechny sloky. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. Pořadí částí písně není platné. Část odpovídající %s neexistuje. Platné položky jsou %s. @@ -6432,12 +6703,12 @@ Select Directory - Vybrat adresář + Vybrat složku Directory: - Adresář: + Složka: @@ -6467,7 +6738,7 @@ You need to specify a directory. - Je potřeba zadat adresář. + Je potřeba zadat složku. @@ -6488,130 +6759,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Vybrat dokumentové/prezentační soubory - + Song Import Wizard Průvodce importem písní - + 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. Tento průvodce pomáhá importovat písně z různých formátů. Importování se spustí klepnutím níže na tlačítko další a výběrem formátu, ze kterého se bude importovat. - + Generic Document/Presentation Obecný dokument/prezentace - - Filename: - Název souboru: - - - - 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. - Import pro formát OpenLyrics ještě nebyl vyvinut, ale jak můžete vidět, stále to zamýšlíme udělat. Doufáme, že to bude přítomno v další verzi aplikace. - - - + Add Files... Přidat soubory... - + Remove File(s) Odstranit soubory - + Please wait while your songs are imported. Čekejte prosím, než písně budou importovány. - + OpenLP 2.0 Databases Databáze OpenLP 2.0 - + openlp.org v1.x Databases Databáze openlp.org v1.x - + Words Of Worship Song Files Soubory s písněmi Words of Worship - - You need to specify at least one document or presentation file to import from. - Je potřeba zadat alespoň jeden dokument nebo jednu prezentaci, ze které importovat. - - - + Songs Of Fellowship Song Files Soubory s písněmi Songs Of Fellowship - + SongBeamer Files - SongBeamer soubory + Soubory SongBeamer - + SongShow Plus Song Files Soubory s písněmi SongShow Plus - + Foilpresenter Song Files Soubory s písněmi Foilpresenter - + Copy Kopírovat - + Save to File Uložit do souboru - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Import ze Songs of Fellowship byl zakázán, protože aplikace OpenLP nemůže přistupovat k aplikacím OpenOffice nebo LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Import obecných dokumentů/prezentaci byl zakázán, protože aplikace OpenLP nemůže přistupovat k aplikacím OpenOffice nebo LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics nebo písně exportované z OpenLP 2.0 - + OpenLyrics Files Soubory OpenLyrics + + + CCLI SongSelect Files + Soubory CCLI SongSelect + + + + EasySlides XML File + XML soubory EasySlides + + + + EasyWorship Song Database + Databáze písní EasyWorship + + + + DreamBeam Song Files + Soubory s písněmi DreamBeam + + + + You need to specify a valid PowerSong 1.0 database folder. + Je potřeba upřesnit platnou složku s databází PowerSong 1.0. + + + + ZionWorx (CSV) + ZionWorx (CSV) + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + Nejprve je nutno převést databázi ZionWorx do textového CSV souboru, jak je vysvětleno v <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">uživatelské dokumentaci</a>. + SongsPlugin.MediaFilesForm - + Select Media File(s) Vybrat mediální soubor(y) - + Select one or more audio files from the list below, and click OK to import them into this song. Vyberte jeden nebo více zvukových souborů ze seznamu níže a importovat je k písni lze klepnutím na tlačítko OK. @@ -6619,27 +6910,27 @@ SongsPlugin.MediaItem - + Titles Názvy - + Lyrics Text písně - + CCLI License: CCLI Licence: - + Entire Song Celá píseň - + Are you sure you want to delete the %n selected song(s)? Jste si jisti, že chcete smazat %n vybranou píseň? @@ -6648,16 +6939,41 @@ - + Maintain the lists of authors, topics and books. Spravovat seznamy autorů, témat a zpěvníků. - + copy For song cloning kopírovat + + + Search Titles... + Hledat název... + + + + Search Entire Song... + Hledat celou píseň... + + + + Search Lyrics... + Hledat text písně... + + + + Search Authors... + Hledat autory... + + + + Search Song Books... + Hledat zpěvníky... + SongsPlugin.OpenLP1SongImport @@ -6684,6 +7000,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + Žádné písně k importu. + + + + Verses not found. Missing "PART" header. + Sloky nenalezeny. Chybějící hlavička "PART". + + + SongsPlugin.SongBookForm @@ -6722,12 +7051,12 @@ SongsPlugin.SongImport - + copyright autorská práva - + The following songs could not be imported: Následující písně nemohly být importovány: @@ -6748,117 +7077,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Import písně selhal. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Nemohu přidat autora. - + This author already exists. Tento autor již existuje. - + Could not add your topic. Nemohu přidat téma. - + This topic already exists. Toto téma již existuje. - + Could not add your book. Nemohu přidat zpěvník. - + This book already exists. Tento zpěvník již existuje. - + Could not save your changes. Nemohu uložit změny. - + Could not save your modified author, because the author already exists. Nemohu uložit upraveného autora, protože tento autor již existuje. - + Could not save your modified topic, because it already exists. Nemohu uložit upravené téma, protože již existuje. - + Delete Author Smazat autora - + Are you sure you want to delete the selected author? Jste si jisti, že chcete smazat vybraného autora? - + This author cannot be deleted, they are currently assigned to at least one song. Nemohu smazat autora, protože je v současné době přiřazen alespoň k jedné písni. - + Delete Topic Smazat téma - + Are you sure you want to delete the selected topic? Jste si jisti, že opravdu chcete smazat vybrané téma? - + This topic cannot be deleted, it is currently assigned to at least one song. Nemohu smazat toto téma, protože je v současné době přiřazeno alespoň k jedné písni. - + Delete Book Smazat zpěvník - + Are you sure you want to delete the selected book? Jste si jisti, že chcete smazat vybraný zpěvník? - + This book cannot be deleted, it is currently assigned to at least one song. Nemohu smazat tento zpěvník, protože je v současné době přiřazen alespoň k jedné písni. - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? Autor %s již existuje. Přejete si vytvořit písně s autorem %s a použít již existujícího autora %s? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? Téma %s již existuje. Přejete si vytvořit písně s tématem %s a použít již existující téma %s? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? Zpěvník %s již existuje. Přejete si vytvořít písně se zpěvníkem %s a použít již existující zpěvník %s? @@ -6866,29 +7187,29 @@ SongsPlugin.SongsTab - + Songs Mode Režim písně - + Enable search as you type Zapnout hledat během psaní - + Display verses on live tool bar Zobrazit sloky v nástrojové liště naživo - + Update service from song edit Aktualizovat službu při úpravě písně - - Add missing songs when opening service - Přidat chybějící písně při otevření služby + + Import missing songs from service files + Import chybějících písní ze souborů služby @@ -6947,4 +7268,17 @@ Ostatní + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Chyba při čtení CSV souboru. + + + + File not valid ZionWorx CSV format. + Soubor není platný ZionWorx CSV formát. + + diff -Nru openlp-1.9.9/resources/i18n/da.ts openlp-1.9.10/resources/i18n/da.ts --- openlp-1.9.9/resources/i18n/da.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/da.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Meddelelse - + Show an alert message. Vis en meddelelse. - + Alert name singular Meddelelse - + Alerts name plural Meddelelser - + Alerts container title Meddelelser - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Meddelelsesudvidelse</strong><br />Meddelelsesudvidelsen kontrollerer visningen af beskeder fra søndagsskolen på skærmen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Meddelelse - + Alert &text: Te&kst: - + &New &Ny - + &Save &Gem - + Displ&ay V&is - + Display && Cl&ose Vis && l&uk @@ -79,7 +79,7 @@ Du har ikke angivet nogen tekst til din meddelelse. Skriv noget tekst og tryk så på Ny. - + &Parameter: &Parameter: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Skrifttype - + Font name: Skriftnavn: - + Font color: Skriftfarve: - + Background color: Baggrundsfarve: - + Font size: Skriftstørrelse: - + Alert timeout: Varighed af meddelse: @@ -152,551 +152,596 @@ BiblesPlugin - + &Bible &Bibel - + Bible name singular Bibel - + Bibles name plural Bibler - + Bibles container title Bibler - + No Book Found Ingen bog fundet - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Ingen matchende bog kunne findes i denne bibel. Check om du har stavet bogens navn rigtigt. - + Import a Bible. Importér en bibel. - + Add a new Bible. Tilføj en ny bibel. - + Edit the selected Bible. Redigér den valgte bibel. - + Delete the selected Bible. Slet den valgte bibel. - + Preview the selected Bible. Forhåndsvis den valgte bibel. - + Send the selected Bible live. Send den valgte bibel live. - + Add the selected Bible to the service. Tilføj den valgte bibel til programmet. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Bibeludvidelse</strong><br />Bibeludvidelsen gør det muligt at vise bibelvers fra forskellige kilder i løbet af gudstjenesten. - + &Upgrade older Bibles &Opgradér ældre bibler - + Upgrade the Bible databases to the latest format. Opgradér bibel-databaserne til det nyeste format. - + Genesis - + Exodus - + Leviticus - + Numbers - + Deuteronomy - + Joshua - + Judges - + Ruth - + 1 Samuel - + 2 Samuel - + 1 Kings - + 2 Kings - + 1 Chronicles - + 2 Chronicles - + Ezra - + Nehemiah - + Esther - + Job - + Psalms - + Proverbs - + Ecclesiastes - + Song of Solomon - + Isaiah - + Jeremiah - + Lamentations - + Ezekiel - + Daniel - + Hosea - + Joel - + Amos - + Obadiah - + Jonah - + Micah - + Nahum - + Habakkuk - + Zephaniah - + Haggai - + Zechariah - + Malachi - + Matthew - + Mark - + Luke - + John - + Acts - + Romans - + 1 Corinthians - + 2 Corinthians - + Galatians - + Ephesians - + Philippians - + Colossians - + 1 Thessalonians - + 2 Thessalonians - + 1 Timothy - + 2 Timothy - + Titus - + Philemon - + Hebrews - + James - + 1 Peter - + 2 Peter - + 1 John - + 2 John - + 3 John - + Jude - + Revelation - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Vælg et udgavenavn til din bibel. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Angiv din bibels ophavsret. Bibler i Public Domain skal markeres som værende sådan. + + + + Bible Exists + Bibel eksisterer + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Denne bibel eksisterer allerede. Importér en anden bibel, eller slet først den eksisterende bibel. + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error Fejl med skriftsted - + Web Bible cannot be used Netbibelen kan ikke bruges - + Text Search is not available with Web Bibles. Tekstsøgning virker ikke med netbibler. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Du indtastede ikke et søgeord. Du kan opdele forskellige søgeord med mellemrum for at søge efter alle søgeordene, og du kan opdele dem med et komma for at søge efter ét af dem. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Der er ikke installeret nogle bibler på nuværende tidspunkt. Benyt import-guiden til at installere én eller flere bibler. - + No Bibles Available Ingen bibler tilgængelige - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -712,187 +757,179 @@ BiblesPlugin.BiblesTab - + Verse Display Visning af vers - + Only show new chapter numbers Vis kun nye kapitelnumre - + Bible theme: Bibeltema: - + No Brackets Ingen paranteser - + ( And ) ( og ) - + { And } { og } - + [ And ] [ og ] - + Note: Changes do not affect verses already in the service. Bemærk: Ændringer påvirker ikke vers der allerede er tilføjet til programmet. - + Display second Bible verses Vis sekundære bibelvers - + Custom Scripture References - + Verse Separator: - + Range Separator: - + List Separator: - + End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - + + English + Dansk - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + Default Bible Language - - Bible language + + Book name language in search field, +search results and on display: - - Application language + + Bible Language - - English - Dansk - - - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language BiblesPlugin.BookNameDialog - + Select Book Name Vælg bogens navn - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Det følgende bognavn kan stemmer ikke overens. Vælg det tilsvarende engelske navn fra listen. - - - + Current name: Nuværende navn: - + Corresponding name: Tilsvarende navn: - + Show Books From Vis bøger fra - + Old Testament Gamle Testamente - + New Testament Nye Testamente - + Apocrypha Apokryfe skrifter + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. Du er nødt til først at vælge en bog. @@ -917,40 +954,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + Licens detaljer + + + + Version name: + Navn på udgave: + + + + Copyright: + Ophavsret: + + + + Permissions: + Tilladelser: + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + Dansk + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registrerer bibelen og indlæser bøger... - + Registering Language... Registrerer sprog... - + Importing %s... Importing <book name>... Importerer %s... - + Download Error Hentningsfejl - + 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. Der opstod en fejl ved hentningen af dit valg af vers. Efterse din internetforbindelse, og hvis fejlen fortsat opstår så overvej at rapportere fejlen. - + Parse Error Fortolkningfejl - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Der opstod et problem med at udpakke dit valg af vers. Hvis denne fejl fortsætter med at opstå, så overvej at rapportere fejlen. @@ -1128,17 +1234,17 @@ BiblesPlugin.LanguageDialog - + Select Language Vælg sprog - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP er ikke i stand til at bestemme bibeloversættelsens sprog. Vælg sproget fra listen herunder. - + Language: Sprog: @@ -1154,85 +1260,100 @@ BiblesPlugin.MediaItem - + Quick Hurtig - + Find: Find: - + Book: Bog: - + Chapter: Kapitel: - + Verse: Vers: - + From: Fra: - + To: Til: - + Text Search Tekstsøgning - + Second: Anden: - + Scripture Reference Skriftsted - + Toggle to keep or clear the previous results. Vælg om du vil beholde eller fjerne de forrige resultater. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Du kan ikke kombinere søgeresultater med enkelte og dobbelte bibelvers. Vil du slette dine søgeresultater og starte en ny søgning? - + Bible not fully loaded. Bibel ikke færdigindlæst. - + Information Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. Den sekundære bibel indeholder ikke alle versene der er i den primære bibel. Kun de vers der kan findes i begge bibler vil blive vist. %d vers er ikke blevet inkluderet blandt resultaterne. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importerer %s %s... @@ -1241,12 +1362,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Bestemmer indkodning (dette kan tage et par minutter)... - + Importing %s %s... Importing <book name> <chapter>... Importerer %s %s... @@ -1255,148 +1376,148 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Vælg en mappe til sikkerhedskopiering - + Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory Vælg mappe til sikkerhedskopiering - + Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. - + Backup Directory: Mappe til sikkerhedskopiering: - + There is no need to backup my Bibles Der er ikke brug for at lave backup af mine bibler - + Select Bibles Vælg bibler - + Please select the Bibles to upgrade Vælg de bibler der skal opgraderes - + Upgrading Opgraderer - + Please wait while your Bibles are upgraded. Vent imens dine bibler bliver opgraderet. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. Sikkerhedskopieringen lykkedes ikke. For at sikkerhedskopiere dine bibler skal du have tilladelse til at skrive til den givne mappe. - + Upgrading Bible %s of %s: "%s" Failed Opgradering af bibel %s af %s: "%s" Fejlede - + Upgrading Bible %s of %s: "%s" Upgrading ... Opgraderer bibel %s af %s: "%s" Opgraderer ... - + Download Error Hentningsfejl - + To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Opgraderer bibel %s af %s: "%s" Opgraderer %s ... - + Upgrading Bible %s of %s: "%s" Complete Opgraderer bibel %s af %s: "%s" Færdig - + , %s failed , %s slog fejl - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s - + Upgrade failed. Opgradering slog fejl. - + You need to specify a backup directory for your Bibles. Du er nødt til at vælge en sikkerhedskopi-mappe til dine bibler. - + Starting upgrade... Starter opgradering... - + There are no Bibles that need to be upgraded. Der er ingen bibler der har brug for at blive opdateret. @@ -1470,12 +1591,12 @@ CustomPlugin.CustomTab - + Custom Display Brugerdefineret visning - + Display footer Vis sidefod @@ -1483,42 +1604,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Redigér brugerdefinerede dias - + &Title: &Titel: - + Add a new slide at bottom. Tilføj et nyt dias i bunden. - + Edit the selected slide. Redigér det valgte dias. - + Edit all the slides at once. Redigér alle dias på samme tid. - + Split a slide into two by inserting a slide splitter. Del et dias op i to ved at indsætte en diasopdeler. - + The&me: T&ema: - + &Credits: &Bidragsydere: @@ -1533,12 +1654,12 @@ Du skal tilføje mindst ét dias - + Ed&it All Re&digér alle - + Insert Slide Indsæt dias @@ -1546,7 +1667,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1557,60 +1678,60 @@ ImagePlugin - + <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. - + Image name singular Billede - + Images name plural Billeder - + Images container title Billeder - + Load a new image. Indlæs et nyt billede. - + Add a new image. Tilføj et nyt billede. - + Edit the selected image. Redigér det valgte billede. - + Delete the selected image. Slet det valgte billede. - + Preview the selected image. Forhåndsvis det valgte billede. - + Send the selected image live. Send det valgte billede live. - + Add the selected image to the service. Tilføj det valgte billede til programmet. @@ -1618,7 +1739,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Vælg bilag @@ -1626,44 +1747,44 @@ ImagePlugin.MediaItem - + Select Image(s) Vælg billede(r) - + You must select an image to delete. Du skal vælge et billede som skal slettes. - + You must select an image to replace the background with. - + Missing Image(s) Manglende billede(r) - + The following image(s) no longer exist: %s De følgende billeder eksisterer ikke længere: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? De følgende billeder eksisterer ikke længere: %s Vil du tilføje de andre billede alligevel? - + There was a problem replacing your background, the image file "%s" no longer exists. - + There was no display item to amend. @@ -1671,78 +1792,78 @@ ImagesPlugin.ImageTab - + Background Color Baggrundsfarve - + Default Color: Standardfarve: - - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Medieudvidelse</strong><br />Medieudvidelsen gør det muligt at afspille lyd og video. - + Media name singular Medie - + Media name plural Medier - + Media container title Medie - + Load new media. Indlæs nye medier. - + Add new media. Tilføj nye medier. - + Edit the selected media. Redigér de valgte medier. - + Delete the selected media. Slet de valgte medier. - + Preview the selected media. Forhåndsvis de valgte medier. - + Send the selected media live. - + Add the selected media to the service. Tilføj de valgte medier til programmet. @@ -1790,7 +1911,7 @@ - + Unsupported File Ikke-understøttet fil @@ -1808,22 +1929,22 @@ MediaPlugin.MediaTab - + Available Media Players Tilgængelige medieafspillere - + %s (unavailable) %s (utilgængelig) - + Player Order Afspilningsrækkefølge - + Allow media player to be overridden @@ -1831,7 +1952,7 @@ OpenLP - + Image Files Billedfiler @@ -1853,17 +1974,17 @@ OpenLP.AboutForm - + Credits Bidragsydere - + License Licens - + Contribute Hjælp os @@ -1873,17 +1994,17 @@ build %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. Dette program er fri software; du kan redistribuere det og/eller redigere det under betingelserne i GNU General Public License, som udgivet af Free Software Foundation; version 2 af licensen. - + 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. Dette program udgives i håbet om at det vil være brugbart, men UDEN NOGEN GARANTI; endda uden den forudsatte garanti om SALGSEGNETHED eller EGNETHED TIL ET BESTEMT FORMÅL. Se herunder for flere detaljer. - + Project Lead %s @@ -2008,7 +2129,7 @@ han har gjort os fri. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2019,7 +2140,7 @@ - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s @@ -2028,229 +2149,311 @@ OpenLP.AdvancedTab - + UI Settings Brugerfladeindstillinger - + Number of recent files to display: - + Remember active media manager tab on startup - + Double-click to send items straight to live - + Expand new service items on creation - + Enable application exit confirmation - + Mouse Cursor Musemarkør - + Hide mouse cursor when over display window Gem musemarkøren når den er over visningsvinduet - + Default Image Standardbillede - + Background color: Baggrundsfarve: - + Image file: Billedfil: - + Open File Åben fil - - Advanced - Avanceret + + Advanced + Avanceret + + + + Preview items when clicked in Media Manager + + + + + Click to select a color. + Klik for at vælge en farve. + + + + Browse for an image file to display. + Find en billedfil som skal vises. + + + + Revert to the default OpenLP logo. + Vend tilbage til standard OpenLP logoet. + + + + Service %Y-%m-%d %H-%M + This may not contain any of the following characters: /\?*|<>[]":+ +See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + + + + Default Service Name + + + + + Enable default service name + + + + + Date and Time: + + + + + Monday + + + + + Tuesday + + + + + Wednesday + + + + + Thurdsday + + + + + Friday + + + + + Saturday + + + + + Sunday + + + + + Now + - - Preview items when clicked in Media Manager + + Time when usual service starts. - - Click to select a color. - Klik for at vælge en farve. + + Name: + - - Browse for an image file to display. - Find en billedfil som skal vises. + + Consult the OpenLP manual for usage. + - - Revert to the default OpenLP logo. - Vend tilbage til standard OpenLP logoet. + + Revert to the default service name "%s". + - - Service %Y-%m-%d %H-%M - This may not contain any of the following characters: /\?*|<>[]":+ -See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + Example: - - Default Service Name + + X11 - - Enable default service name + + Bypass X11 Window Manager - - Date and Time: + + Syntax error. - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday - + + Cancel + Annullér - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred Fejl opstod - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Ups! OpenLP stødte ind i et problem, og kunne ikke gendanne. Teksten i kassen herunder indeholder information som kan være nyttig for OpenLP-udviklerne, så send venligst en e-mail til bugs@openlp.org sammen med en detaljeret beskrivelse af, hvad du foretog dig da problemet opstod. - + Send E-Mail Send e-mail - + Save to File Gem til fil - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Indtast venligst en beskrivelse af det du foretog dig der fik denne fejl til at opstå (Mindst 20 tegn) - + Attach File Vedhæft fil - + Description characters to enter : %s Antal tegn i beskrivelsen der skal indtastes : %s @@ -2258,24 +2461,24 @@ OpenLP.ExceptionForm - + Platform: %s Platform: %s - + Save Crash Report Gem fejlrapport - + Text files (*.txt *.log *.text) Tekst filer (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2293,7 +2496,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2416,17 +2619,17 @@ Standardindstillinger - + Downloading %s... Henter %s... - + Download complete. Click the finish button to start OpenLP. Hentning færdig. Klik på færdig-knappen for at starte OpenLP. - + Enabling selected plugins... Aktiverer valgte udvidelser... @@ -2496,32 +2699,32 @@ - + Setting Up And Downloading Sætter op og henter - + Please wait while OpenLP is set up and your data is downloaded. - + Setting Up Sætter op - + Click the finish button to start OpenLP. Klik på færdig-knappen for at starte OpenLP. - + Download complete. Click the finish button to return to OpenLP. Hentning færdig. Klik på færdig-knappen for at vende tilbage til OpenLP. - + Click the finish button to return to OpenLP. Klik på færdig-knappen for at vende tilbage til OpenLP. @@ -2531,8 +2734,13 @@ Brugerdefinerede dias + + Finish + Færdig + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2541,64 +2749,59 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. - - - Finish - Færdig - OpenLP.FormattingTagDialog - + Configure Formatting Tags Konfigurér formatteringsmærker - + Edit Selection Redigér markering - + Save Gem - + Description Beskrivelse - + Tag Mærke - + Start tag Start mærke - + End tag Afslut mærke - + Tag Id Mærke id - + Start HTML Start HTML - + End HTML Afslut HTML @@ -2606,32 +2809,32 @@ OpenLP.FormattingTagForm - + Update Error Opdateringsfejl - + Tag "n" already defined. Mærke "n" er allerede defineret. - + New Tag Nyt mærke - + <HTML here> <HTML her> - + </and here> </and her> - + Tag %s already defined. Mærke %s er allerede defineret. @@ -2639,82 +2842,82 @@ OpenLP.FormattingTags - + Red Rød - + Black Sort - + Blue Blå - + Yellow Gul - + Green Grøn - + Pink Lyserød - + Orange Orange - + Purple Lilla - + White Hvid - + Superscript Hævet skrift - + Subscript Sænket skrift - + Paragraph Afsnit - + Bold Fed - + Italics Kursiv - + Underline Understreget - + Break Linjeskift @@ -2722,180 +2925,170 @@ OpenLP.GeneralTab - + General Generelt - + Monitors Skærme - + Select monitor for output display: - + Display if a single screen - + Application Startup Programopstart - + Show blank screen warning - + Automatically open the last service - + Show the splash screen - + Application Settings Programindstillinger - + Prompt to save before starting a new service - + Automatically preview next item in service - + sec sek - + CCLI Details CCLI detaljer - + SongSelect username: SongSelect brugernavn: - + SongSelect password: SongSelect adgangskode: - + X X - + Y Y - + Height Højde - + Width Bredde - + Check for updates to OpenLP Søg efter opdateringer til OpenLP - + Unblank display when adding new live item - + Timed slide interval: - + Background Audio Baggrundslyd - + Start background audio paused Start baggrundslyd på pause - + Service Item Slide Limits - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide + + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item + + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide - - Override display position: + + &Wrap around - - Repeat track list + + &Move to next/previous service item OpenLP.LanguageManager - + Language Sprog - + Please restart OpenLP to use your new language setting. Genstart OpenLP for at benytte dine nye sprogindstillinger. @@ -2911,438 +3104,438 @@ OpenLP.MainWindow - + &File &Fil - + &Import &Importér - + &Export &Eksportér - + &View &Vis - + M&ode O&psætning - + &Tools &Værktøjer - + &Settings &Indstillinger - + &Language &Sprog - + &Help &Hjælp - + Media Manager Mediehåndtering - + Service Manager - + Theme Manager Temahåndtering - + &New &Ny - + &Open &Åben - + Open an existing service. - + &Save &Gem - + Save the current service to disk. - + Save &As... Gem &som... - + Save Service As Gem program som - + Save the current service under a new name. Gem det nuværende program under et nyt navn. - + E&xit A&fslut - + Quit OpenLP Luk OpenLP - + &Theme &Tema - + &Configure OpenLP... &Indstil OpenLP... - + &Media Manager &Mediehåndtering - + Toggle Media Manager - + Toggle the visibility of the media manager. Skift synligheden af mediehåndteringen. - + &Theme Manager &Temahåndtering - + Toggle Theme Manager - + Toggle the visibility of the theme manager. Skift synligheden af temahåndteringen. - + &Service Manager - + Toggle Service Manager - + Toggle the visibility of the service manager. - + &Preview Panel &Forhåndsvisningspanelet - + Toggle Preview Panel - + Toggle the visibility of the preview panel. Skift synligheden af forhåndsvisningspanelet. - + &Live Panel &Livepanel - + Toggle Live Panel - + Toggle the visibility of the live panel. Skift synligheden af livepanelet. - + &Plugin List - + List the Plugins - + &User Guide - + &About &Om - + More information about OpenLP Mere information om OpenLP - + &Online Help &Online hjælp - + &Web Site &Hjemmeside - + Use the system language, if available. Benyt systemsproget, hvis det er muligt. - + Set the interface language to %s - + Add &Tool... Tilføj &Værktøj... - + Add an application to the list of tools. Tilføj et program til listen over værktøjer. - + &Default &Standard - + Set the view mode back to the default. Sæt visningsopsætningen tilbage til stadard. - + &Setup &Opsætning - + Set the view mode to Setup. Sæt visningsopsætningen til Opsætning. - + &Live &Live - + Set the view mode to Live. Sæt visningsopsætningen til 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/. - + OpenLP Version Updated OpenLP version opdateret - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s Standard tema: %s - + English Please add the name of your language here Dansk - + Configure &Shortcuts... Konfigurér g&enveje... - + Close OpenLP Luk OpenLP - + Are you sure you want to close OpenLP? Er du sikker på at du vil lukke OpenLP? - + Open &Data Folder... - + Open the folder where songs, bibles and other data resides. - + &Autodetect &Autodetektér - + Update Theme Images Opdatér temabilleder - + Update the preview images for all themes. - + Print the current service. Udskriv det nuværende program. - + &Recent Files - + L&ock Panels L&ås paneler - + Prevent the panels being moved. - + Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files Ryd liste - + Clear the list of recent files. - + Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file - + Settings Indstillinger - + Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? Importér indstillinger? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3351,52 +3544,57 @@ - + Open File Åben fil - + OpenLP Export Settings Files (*.conf) - + Import settings Importér indstillinger - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File - + OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error Databasefejl - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s - + OpenLP cannot load your database. Database: %s @@ -3408,74 +3606,74 @@ OpenLP.MediaManagerItem - + No Items Selected Ingen elementer valgt - + &Add to selected Service Item - + You must select one or more items to preview. - + You must select one or more items to send live. - + You must select one or more items. - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. - + You must select one or more items to add. - + No Search Results Ingen søgeresultater - + Invalid File Type Ugyldig filtype - + Invalid File %s. Suffix not supported Ugyldig fil %s. Endelsen er ikke understøttet - + &Clone - + Duplicate files were found on import and were ignored. @@ -3483,12 +3681,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <verse> tag is missing. @@ -3496,27 +3694,27 @@ OpenLP.PluginForm - + Plugin List Liste over udvidelser - + Plugin Details Detaljer om udvidelser - + Status: Status: - + Active Aktiv - + Inactive Inaktiv @@ -3539,12 +3737,12 @@ OpenLP.PrintServiceDialog - + Fit Page Tilpas til siden - + Fit Width Tilpas til bredden @@ -3552,7 +3750,7 @@ OpenLP.PrintServiceForm - + Options Indstillinger @@ -3567,47 +3765,47 @@ Kopiér som HTML - + Zoom In Zoom ind - + Zoom Out Zoom ud - + Zoom Original Zoom Original - + Other Options Andre indstillinger - + Include slide text if available - + Include service item notes - + Include play length of media items - + Add page break before each text item - + Service Sheet @@ -3617,12 +3815,12 @@ Udskriv - + Title: Titel: - + Custom Footer Text: Brugerdefineret sidefod: @@ -3630,12 +3828,12 @@ OpenLP.ScreenList - + Screen Skærm - + primary primær @@ -3643,12 +3841,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Start</strong>: %s - + <strong>Length</strong>: %s <strong>Varighed</strong>: %s @@ -3656,7 +3854,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item @@ -3664,82 +3862,82 @@ OpenLP.ServiceManager - + Move to &top Flyt til &top - + Move item to the top of the service. Flyt element til toppen af programmet. - + Move &up Flyt &op - + Move item up one position in the service. Flyt element en placering op i programmet. - + Move &down Flyt &ned - + Move item down one position in the service. Flyt element en placering ned i programmet. - + Move to &bottom Flyt til &bunden - + Move item to the end of the service. Flyt element til slutningen af programmet. - + &Delete From Service &Slet fra programmet - + Delete the selected item from the service. Slet det valgte element fra programmet. - + &Add New Item &Tilføj nyt emne - + &Add to Selected Item &Tilføj til det valgte emne - + &Edit Item &Redigér emne - + &Reorder Item &Omrokér element - + &Notes &Noter - + &Change Item Theme @@ -3761,112 +3959,107 @@ Fil er ikke et gyldigt program. - + 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 - + &Expand all &Udvid alle - + Expand all the service items. Udvid alle program-elementerne. - + &Collapse all &Sammenfold alle - + Collapse all the service items. Sammenfold alle program-elementerne. - + Open File Åben fil - + Moves the selection down the window. - + Move up Flyt op - + Moves the selection up the window. - + Go Live - + Send the selected item to Live. - + &Start Time &Start tid - + Show &Preview Vis &forhåndsvisning - - Show &Live - Vis &live - - - + Modified Service Modificeret program - + The current service has been modified. Would you like to save this service? Det nuværende program er blevet ændret. Vil du gemme dette program? - + Custom Service Notes: Brugerdefinerede program-noter: - + Notes: Noter: - + Playing time: Afspilningstid: - + Untitled Service Unavngivet program @@ -3891,17 +4084,17 @@ Korrupt fil - + Load an existing service. Indlæs et eksisterende program. - + Save this service. Gem dette program. - + Select a theme for the service. Vælg et tema for dette program. @@ -3911,7 +4104,7 @@ - + Service File Missing @@ -3935,11 +4128,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes @@ -3955,67 +4158,67 @@ OpenLP.ShortcutListDialog - + Action Handling - + Shortcut Genvej - + Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. Genvejen "%s" er allerede tilknyttet til en anden handling, brug en anden genvej. - + Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default Standard - + Custom Brugerdefineret - + Capture shortcut. Indfang genvej. - + Restore the default shortcut of this action. Gendan denne handlings standardgenvej. - + Restore Default Shortcuts Gendan standardgenveje - + Do you want to restore all shortcuts to their defaults? Vil du gendanne alle genveje til deres standardværdier? - + Configure Shortcuts Konfigurér genveje @@ -4023,177 +4226,172 @@ OpenLP.SlideController - + Hide Gem - + Go To Gå til - + Blank Screen Blank skærm - + Blank to Theme Vis temabaggrund - + Show Desktop Vis skrivebord - + Previous Service - + Next Service - + Escape Item Forlad emne - + Move to previous. Gå til forrige. - + Move to next. Gå til næste. - + Play Slides Afspil dias - + Delay between slides in seconds. Forsinkelse mellem dias i sekunder. - + Move to live. Flyt til live. - + Add to Service. - + Edit and reload song preview. - + Start playing media. Start afspilning af medie. - + Pause audio. Sæt lyd på pause. - + Pause playing media. Sæt afspilning af medie på pause. - + Stop playing media. Stop afspilning af medie. - + Video position. Video position. - + Audio Volume. Lydstyrke. - + Go to "Verse" Gå til "Vers" - + Go to "Chorus" Gå til "Omkvæd" - + Go to "Bridge" Gå til "bro" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" Gå til "anden" - + Previous Slide - + Next Slide - + Pause Audio - + Background Audio Baggrundslyd - - Next Track - - - - + Go to next audio track. - + Tracks @@ -4269,17 +4467,17 @@ - + Theme Layout Tema layout - + The blue box shows the main area. Den blå kasse viser hovedområdet. - + The red box shows the footer. Den røde kasse viser sidefoden. @@ -4287,32 +4485,32 @@ OpenLP.ThemeForm - + Select Image Vælg billede - + Theme Name Missing Temanavn mangler - + There is no name for this theme. Please enter one. Dette tema har ikke noget navn. Indtast venligst ét. - + Theme Name Invalid Temanavn ugyldigt - + Invalid theme name. Please enter one. Ugyldigt temanavn. Indtast venligst et nyt. - + (approximately %d lines per slide) (cirka %d linjer per dias) @@ -4320,193 +4518,193 @@ OpenLP.ThemeManager - + Create a new theme. Opret et nyt tema. - + Edit Theme Redigér tema - + Edit a theme. Redigér et tema. - + Delete Theme Slet tema - + Delete a theme. Slet et tema. - + Import Theme Importér tema - + Import a theme. Importér et tema. - + Export Theme Eksportér tema - + Export a theme. Eksportér et tema. - + &Edit Theme &Redigér tema - + &Delete Theme &Slet tema - + Set As &Global Default Indstil som &global standard - + %s (default) %s (standard) - + You must select a theme to edit. Vælg det tema det skal redigeres. - + You are unable to delete the default theme. Du kan ikke slette standardtemaet. - + Theme %s is used in the %s plugin. Temaet %s bruges i tilføjelsen %s. - + You have not selected a theme. Du har ikke valgt et tema. - + Save Theme - (%s) Gem tema - (%s) - + Theme Exported Tema eksporteret - + Your theme has been successfully exported. Dit tema er nu blevet eksporteret. - + Theme Export Failed Eksport af tema slog fejl - + Your theme could not be exported due to an error. Dit tema kunne ikke eksporteres på grund af en fejl. - + Select Theme Import File Vælg tema-importfil - + File is not a valid theme. Filen er ikke et gyldigt tema. - + &Copy Theme &Kopiér tema - + &Rename Theme &Omdøb tema - + &Export Theme &Eksportér tema - + You must select a theme to rename. Vælg det tema der skal omdøbes. - + Rename Confirmation Bekræt omdøbning - + Rename %s theme? Omdøb temaet %s? - + You must select a theme to delete. Vælg det tema der skal slettes. - + Delete Confirmation Bekræft sletning - + Delete %s theme? Slet temaet %s? - + Validation Error Fejl - + A theme with this name already exists. Et tema med dette navn eksisterer allerede. - + OpenLP Themes (*.theme *.otz) OpenLP temaer (*.theme *.otz) - + Copy of %s Copy of <theme name> Kopi af %s - + Theme Already Exists @@ -4514,272 +4712,272 @@ OpenLP.ThemeWizard - + Theme Wizard Temaguide - + Welcome to the Theme Wizard Velkommen til temaguiden - + Set Up Background Indstil baggrund - + Set up your theme's background according to the parameters below. Indstil dit temas baggrund i henhold til parametrene herunder. - + Background type: Baggrundstype: - + Solid Color Ensfarvet - + Gradient Overgang - + Color: Farve: - + Gradient: Overgang: - + Horizontal Vandret - + Vertical Højret - + Circular Cirkulær - + Top Left - Bottom Right Øverst til venstre - nederst til højre - + Bottom Left - Top Right Nederst til venstre - øverst til højre - + Main Area Font Details Skriftdetaljer for hovedområdet - + Define the font and display characteristics for the Display text Definér skrifttypen og visningskarakteristik for visningsteksten - + Font: Skrifttype: - + Size: Størrelse: - + Line Spacing: Linjeafstand: - + &Outline: &Disposition: - + &Shadow: &Skygge: - + Bold Fed - + Italic Kursiv - + Footer Area Font Details Skriftdetaljer for sidefoden - + Define the font and display characteristics for the Footer text Definér skrifttypen og visningskarakteristik for teksten i sidefoden - + Text Formatting Details Detaljeret tekstformattering - + Allows additional display formatting information to be defined - + Horizontal Align: Justér horisontalt: - + Left Venstre - + Right Højre - + Center Centrér - + Output Area Locations Placeringer for output-området - + Allows you to change and move the main and footer areas. - + &Main Area &Hovedområde - + &Use default location &Benyt standardplacering - + X position: X position: - + px px - + Y position: Y position: - + Width: Bredde: - + Height: Højde: - + Use default location Benyt standardplacering - + Save and Preview Gem og forhåndsvis - + View the theme and save it replacing the current one or change the name to create a new theme Vis temaet og gem det ved at erstatte det nuværende, eller ved at skifte navnet for at oprette et nyt tema - + Theme name: Temanavn: - + Edit Theme - %s Redigér tema - %s - + 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. Denne guide vil hjælp dig med at oprette og redigere dine temaer. Klik på næste-knappen for at begynde processen ved at indstille din baggrund. - + Transitions: Overgange: - + &Footer Area &Sidefodsområde - + Starting color: Startfarve: - + Ending color: Slutfarve: - + Background color: Baggrundsfarve: - + Justify Lige margener - + Layout Preview Layout forhåndsvisning - + Transparent @@ -4787,47 +4985,47 @@ OpenLP.ThemesTab - + Global Theme Globalt tema - + Theme Level Tema niveau - + S&ong Level S&ang niveau - + 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 - + 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. - + &Global Level &Globalt niveau - + Use the global theme, overriding any themes associated with either the service or the songs. - + Themes Temaer @@ -4911,239 +5109,239 @@ pkt - + Image Billede - + Import Importér - + Live Live - + Live Background Error - + Load Indlæs - + Middle Midt - + New Ny - + New Service Nyt program - + New Theme Nyt tema - + No File Selected Singular Ingen fil valgt - + No Files Selected Plural Ingen filer valgt - + No Item Selected Singular Intet element valgt - + No Items Selected Plural Ingen elementer valgt - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Forhåndsvisning - + Replace Background Erstat baggrund - + Reset Background Nulstil baggrund - + s The abbreviated unit for seconds s - + Save && Preview Gem && forhåndsvis - + Search Søg - + You must select an item to delete. Vælg et element der skal slettes. - + You must select an item to edit. Vælg et element der skal redigeres. - + Save Service Gem program - + Service Program - + Start %s Start %s - + Theme Singular Tema - + Themes Plural Temaer - + Top Top - + Version Udgave - + Delete the selected item. Slet det valgte element. - + Move selection up one position. - + Move selection down one position. - + &Vertical Align: &Justér lodret: - + Finished import. Færdiggjorde import. - + Format: Format: - + Importing Importerer - + Importing "%s"... Importerer "%s"... - + Select Import Source Vælg importkilde - + Select the import format and the location to import from. Vælg importkilden og placeringen der skal importeres fra. - + 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. - + Open %s File Åben filen %s - + %p% %p% - + Ready. Klar. - + Starting import... Starter import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong @@ -5159,7 +5357,7 @@ - + Welcome to the Song Import Wizard @@ -5247,53 +5445,53 @@ t - + Layout style: Layoutstil: - + Live Toolbar - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP kører allerede. Vil du fortsætte? - + Settings Indstillinger - + Tools Værktøjer - + Unsupported File Ikke understøttet fil - + Verse Per Slide Vers per dias - + Verse Per Line Vers per linje - + View Vis @@ -5308,42 +5506,37 @@ XML syntaksfejl - + View Mode Visningstilstand - + Open service. Åben program. - + Print Service Udskriv program - + Replace live background. Erstat live-baggrund. - + Reset live background. Nulstil live-baggrund. - - &Split - - - - + Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard @@ -5353,53 +5546,105 @@ Bekræft sletning - + Play Slides in Loop Afspil dias i løkke - + Play Slides to End Afspil dias til slut - + Stop Play Slides in Loop Stop afspilning af dias i løkke - + Stop Play Slides to End Stop afspilning af dias til slut - + Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1, and %2 Locale list separator: end - + %1, %2 Locale list separator: middle - + %1, %2 Locale list separator: start @@ -5408,50 +5653,50 @@ PresentationPlugin - + <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. - + Presentation name singular Præsentation - + Presentations name plural Præsentationer - + Presentations container title Præsentationer - + Load a new presentation. Indlæs en ny præsentation. - + Delete the selected presentation. Slet den valgte præsentation. - + Preview the selected presentation. Forhåndsvis den valgte præsentation. - + Send the selected presentation live. - + Add the selected presentation to the service. @@ -5459,70 +5704,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Vælg præsentation(er) - + Automatic Automatisk - + Present using: Præsentér med: - + File Exists Fil eksisterer - + A presentation with that filename already exists. En præsentation med dette filnavn eksisterer allereder. - + This type of presentation is not supported. Denne type præsentation er ikke understøttet. - + Presentations (%s) Præsentationer (%s) - + Missing Presentation Manglende præsentation - - The Presentation %s no longer exists. - Præsentationen %s eksisterer ikke længere. + + The presentation %s is incomplete, please reload. + - - The Presentation %s is incomplete, please reload. - Præsentationen %s er ufuldstændig, prøv at genindlæse. + + The presentation %s no longer exists. + PresentationPlugin.PresentationTab - + Available Controllers - + %s (unavailable) %s (ikke tilgængelig) - + Allow presentation application to be overridden @@ -5556,135 +5801,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 fjernbetjening - + OpenLP 2.0 Stage View - + Service Manager - + Slide Controller - + Alerts Meddelelser - + Search Søg - - Back - Tilbage - - - + Refresh Opdatér - + Blank Gør blank - + Show Vis - + Prev Forrige - + Next Næste - + Text Tekst - + Show Alert Vis meddelelse - + Go Live - + No Results Ingen resultater - + Options Indstillinger - + Add to Service Tilføj til program + + + Home + + + + + Theme + Tema + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: - + Port number: Port nummer: - + Server Settings Serverindstillinger - + Remote URL: Fjern URL: - + Stage view URL: - + Display stage time in 12h format Vis scenetiden i 12-timer format - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5692,85 +5952,85 @@ SongUsagePlugin - + &Song Usage Tracking &Sporing af sangforbrug - + &Delete Tracking Data &Slet sporingsdata - + Delete song usage data up to a specified date. Slet sangforbrugsdata op til en angivet dato. - + &Extract Tracking Data &Udtræk sporingsdata - + Generate a report on song usage. Opret en rapport over sangforbruget. - + Toggle Tracking Slå sporing til/fra - + Toggle the tracking of song usage. Slå sporing af sangforbrug til/fra. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Sangforbrug-udvidelse</strong><br />Denne udvidelse sporer forbruget af sange i programmer. - + SongUsage name singular Sangforbrug - + SongUsage name plural Sangforbrug - + SongUsage container title Sangforbrug - + Song Usage Sangforbrug - + Song usage tracking is active. Sporing af sangforbrug er slået til. - + Song usage tracking is inactive. Sporing af sangforbrug er ikke slået til. - + display vis - + printed udskrevet @@ -5778,7 +6038,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Slet sangforbrugsdata @@ -5803,7 +6063,7 @@ - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5811,42 +6071,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction - + Select Date Range Vælg dataomfang - + to til - + Report Location Rapportér lokation - + Output File Location Placering af output-fil - + usage_detail_%s_%s.txt forbrugsdetaljer_%s_%s.txt - + Report Creation Oprettelse af rapport - + Report %s has been successfully created. @@ -5855,12 +6115,12 @@ er blevet oprettet. - + Output Path Not Selected Output-sti er ikke valgt - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5898,107 +6158,107 @@ Genindekserer sange... - + Arabic (CP-1256) Arabisk (CP-1256) - + Baltic (CP-1257) Baltisk (CP-1257) - + Central European (CP-1250) Centraleuropæisk (CP-1250) - + Cyrillic (CP-1251) Kyrillisk (CP-1251) - + Greek (CP-1253) Græsk (CP-1253) - + Hebrew (CP-1255) Hebraisk (CP-1255) - + Japanese (CP-932) Japansk (CP-932) - + Korean (CP-949) Koreansk (CP-949) - + Simplified Chinese (CP-936) Simplificeret kinesisk (CP-936) - + Thai (CP-874) Thailandsk (CP-874) - + Traditional Chinese (CP-950) Traditionelt kinesisk (CP-950) - + Turkish (CP-1254) Tyrkisk (CP-1254) - + Vietnam (CP-1258) Vietnamesisk (CP-1258) - + Western European (CP-1252) Vesteuropæisk (CP-1252) - + Character Encoding Tegnkodning - + 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. - + Song name singular Sang - + Songs name plural Sange - + Songs container title Sange @@ -6009,32 +6269,32 @@ Eksportér sange med eksportguiden. - + Add a new song. Tilføj en ny sang. - + Edit the selected song. Redigér den valgte sang. - + Delete the selected song. Slet den valgte sang. - + Preview the selected song. Forhåndsvis den valgte sang. - + Send the selected song live. - + Add the selected song to the service. Tilføj de valgte sange til programmet. @@ -6062,17 +6322,17 @@ Efternavn: - + You need to type in the first name of the author. Skriv forfatterens fornavn. - + You need to type in the last name of the author. Skriv forfatterens efternavn. - + You have not set a display name for the author, combine the first and last names? Du har ikke valgt et visningsnavn til forfatteren. Kombinér for- og efternavn? @@ -6101,209 +6361,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor - + &Title: &Titel: - + Alt&ernate title: Alt&ernativ titel: - + &Lyrics: &Sangtekst: - + &Verse order: &Rækkefølge af vers: - + Ed&it All Re&digér alle - + Title && Lyrics Titel && sangtekst - + &Add to Song &Tilføj til sang - + &Remove &Fjern - + &Manage Authors, Topics, Song Books &Administrér forfattere, emner, sangbøger - + A&dd to Song T&ilføj til sang - + R&emove F&jern - + Book: Bog: - + Number: Nummer: - + Authors, Topics && Song Book Forfattere, emner && sangbøger - + New &Theme Nyt &tema - + Copyright Information Information om ophavsret - + Comments Kommentarer - + Theme, Copyright Info && Comments Tema, ophavsret && kommentarer - + Add Author Tilføj forfatter - + This author does not exist, do you want to add them? Denne forfatter eksisterer ikke. Vil du tilføje dem? - + This author is already in the list. Denne forfatter er allerede på listen. - + 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. Du har ikke valgt en gyldig forfatter. Vælg enten en forfatter fra liste, eller indtast en ny forfatter og klik på "Tilføj forfatter til sang"-knappen for at tilføje den nye forfatter. - + Add Topic Tilføj emne - + This topic does not exist, do you want to add it? Dette emne eksisterer ikke. Vil du tilføje det? - + This topic is already in the list. Dette emne er allerede på listen. - + 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. Du har ikke valgt et gyldigt emne. Vælg enten et emne fra listen, eller indtast et nyt emne og klik på "Tilføj emne til sang"-knappen for at tilføje det nye emne. - + You need to type in a song title. Vælg først en sangtitel. - + You need to type in at least one verse. Skriv mindst ét vers. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. Rækkefølgen af vers er ikke gyldig. Der ikke noget vers som svarer til %s. Gyldige elementer er %s. - + Add Book Tilføj bog - + This song book does not exist, do you want to add it? Denne sangbog eksisterer ikke. Ønsker du at tilføje den? - + You need to have an author for this song. Du mangler en forfatter til denne sang. - + You need to type some text in to the verse. Du mangler at skrive noget tekst ind til verset. - + Linked Audio Sammenkædet lydspor - + Add &File(s) Tilføj &fil(er) - + Add &Media Tilføj &medier - + Remove &All Fjern &alt - + Open File(s) Åben fil(er) - + <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6417,130 +6690,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Vælg dokument-/præsentationfiler - + Song Import Wizard Sangimport guide - + 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. Denne guide vil hjælpe dig med at importere sange fra forskellige formater. Klik på næste-knappen herunder for at starte processen ved at vælge et format du vil importere fra. - + Generic Document/Presentation - - Filename: - Filnavn: - - - - 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. - OpenLyrics-importeringen er ikke blevet udviklet endnu, men som du kan se, har vi stadig planer om at gøre det. Forhåbentligt vil den være klar i næste udgivelse. - - - + Add Files... Tilføj filer... - + Remove File(s) Fjern fil(er) - + Please wait while your songs are imported. Vent imens dine sange bliver importeret. - + OpenLP 2.0 Databases OpenLP 2.0 databaser - + openlp.org v1.x Databases openlp.org v1.x databaser - + Words Of Worship Song Files Words Of Worship sangfiler - - You need to specify at least one document or presentation file to import from. - Du er nødt til at angive mindst en dokument- eller præsentationsfil som du vil importere fra. - - - + Songs Of Fellowship Song Files Songs Of Fellowship sangfiler - + SongBeamer Files SongBeamer filer - + SongShow Plus Song Files SongShow Plus sangfiler - + Foilpresenter Song Files Foilpresenter sangfiler - + Copy Kopiér - + Save to File Gem til fil - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Songs of Fellowship-importeringen er blevet deaktiveret på grund af at OpenLP ikke kan oprette forbindelse til OpenOffice, eller LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics eller OpenLP 2.0 eksporteret sang - + OpenLyrics Files OpenLyrics filer + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) Vælg mediefil(er) - + Select one or more audio files from the list below, and click OK to import them into this song. Vælg én eller flere lydfiler fra listen herunder, og klik OK for at importere dem ind i denne sang. @@ -6548,27 +6841,27 @@ SongsPlugin.MediaItem - + Titles Titler - + Lyrics Sangtekst - + CCLI License: CCLI Licens: - + Entire Song - + Are you sure you want to delete the %n selected song(s)? Er du sikker på at du vil slette de %n valgte sange? @@ -6576,16 +6869,41 @@ - + Maintain the lists of authors, topics and books. Vedligehold listen over forfattere, emner og bøger. - + copy For song cloning + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6612,6 +6930,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6650,12 +6981,12 @@ SongsPlugin.SongImport - + copyright ophavsret - + The following songs could not be imported: De følgende sange kunne ikke importeres: @@ -6676,117 +7007,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Din sangimport slog fejl. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Kunne ikke tilføje din forfatter. - + This author already exists. Denne forfatter eksisterer allerede. - + Could not add your topic. Kunne ikke tilføje dit emne. - + This topic already exists. Dette emne eksisterer allerede. - + Could not add your book. Kunne ikke tilføje din bog. - + This book already exists. Denne bog eksisterer allerede. - + Could not save your changes. Kunne ikke gemme dine ændringer. - + Could not save your modified author, because the author already exists. Kunne ikke gemme din ændrede forfatter, da denne forfatter allerede eksisterer. - + Could not save your modified topic, because it already exists. Kunne ikke gemme dit ændrede emne, da det allerede eksisterer. - + Delete Author Slet forfatter - + Are you sure you want to delete the selected author? Er du sikker på at du vil slette den valgte forfatter? - + This author cannot be deleted, they are currently assigned to at least one song. Denne forfatter kan ikke slettes, da den er tilkyttet til mindst én sang. - + Delete Topic Slet emne - + Are you sure you want to delete the selected topic? Er du sikker på at du vil slette det valgte emne? - + This topic cannot be deleted, it is currently assigned to at least one song. Dette emne kan ikke slettes, da den er tilkyttet til mindst én sang. - + Delete Book Slet bog - + Are you sure you want to delete the selected book? Er du sikker på at du vil slette den valgte bog? - + This book cannot be deleted, it is currently assigned to at least one song. Denne bog kan ikke slettes, da den er tilkyttet til mindst én sang. - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? Forfatteren %s eksisterer allerede. Vil du få sangene med forfatter %s til at benytte den eksisterende forfatter %s? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? Emnet %s eksisterer allerede. Vil du få sangene med emne %s til at benytte det eksisterende emne %s? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? Bogen %s eksisterer allerede. Vil du få sangene med bog %s til at benytte den eksisterende bog %s? @@ -6794,29 +7117,29 @@ SongsPlugin.SongsTab - + Songs Mode Sangtilstand - + Enable search as you type Slå søg-mens-du-skriver til - + Display verses on live tool bar Vis vers på live-værktøjslinjen - + Update service from song edit - - Add missing songs when opening service - Tilføj manglende sange når programmet åbnes + + Import missing songs from service files + @@ -6875,4 +7198,17 @@ Anden + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/de.ts openlp-1.9.10/resources/i18n/de.ts --- openlp-1.9.9/resources/i18n/de.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/de.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Hinweis - + Show an alert message. Hinweis anzeigen. - + Alert name singular Hinweis - + Alerts name plural Hinweise - + Alerts container title Hinweise - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Hinweis Erweiterung</strong><br />Die Erweiterung Hinweis ermöglicht es, Texte auf der Anzeige einzublenden. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message - Hinweis + Hinweistext - + Alert &text: Hinweis&text: - + &New &Neu - + &Save &Speichern - + Displ&ay &Anzeigen - + Display && Cl&ose An&zeigen && Schließen @@ -79,7 +79,7 @@ Der Hinweis enthält noch keinen Text. Bitte geben Sie einen Text an, bevor Sie auf »Neu« klicken. - + &Parameter: &Parameter: @@ -93,7 +93,7 @@ You have not entered a parameter to be replaced. Do you want to continue anyway? Sie haben keinen Parameter angegeben, der ersetzt werden könnte. -Möchten Sie trotzdem fortfahren? +Möchten Sie dennoch fortfahren? @@ -104,8 +104,8 @@ The alert text does not contain '<>'. Do you want to continue anyway? - Der Hinweistext enthält nicht <>. -Möchten Sie trotzdem fortfahren? + Der Hinweistext enthält nicht '<>'. +Möchten Sie dennoch fortfahren? @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Schrift - + Font name: Schriftart: - + Font color: Schriftfarbe: - + Background color: Hintergrundfarbe: - + Font size: Schriftgröße: - + Alert timeout: Anzeigedauer: @@ -152,551 +152,598 @@ BiblesPlugin - + &Bible &Bibel - + Bible name singular Bibeltext - + Bibles name plural Bibeln - + Bibles container title Bibeln - + No Book Found Kein Buch gefunden - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Es konnte kein passendes Buch gefunden werden. Überprüfen Sie bitte die Schreibweise. - + Import a Bible. Neue Bibel importieren. - + Add a new Bible. Füge eine neue Bibel hinzu. - + Edit the selected Bible. Bearbeite die ausgewählte Bibel. - + Delete the selected Bible. Lösche die ausgewählte Bibel. - + Preview the selected Bible. Zeige die ausgewählte Bibelverse in der Vorschau. - + Send the selected Bible live. - Zeige die ausgewählte Bibelverse Live. + Zeige die ausgewählte Bibelverse Live an. - + Add the selected Bible to the service. Füge die ausgewählten Bibelverse zum Ablauf hinzu. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Bibel Erweiterung</strong><br />Die Bibel Erweiterung ermöglicht es Bibelverse aus verschiedenen Quellen anzuzeigen. - + &Upgrade older Bibles &Upgrade alte Bibeln - + Upgrade the Bible databases to the latest format. Stelle die Bibeln auf das aktuelle Datenbankformat um. - + Genesis 1. Mose - + Exodus 2. Mose - + Leviticus 3. Mose - + Numbers 4. Mose - + Deuteronomy 5. Mose - + Joshua Josua - + Judges Richter - + Ruth Rut - + 1 Samuel 1. Samuel - + 2 Samuel 2. Samuel - + 1 Kings 1. Könige - + 2 Kings 2. Könige - + 1 Chronicles 1. Chronik - + 2 Chronicles 2. Chronik - + Ezra Esra - + Nehemiah Nehemia - + Esther Ester - + Job Hiob - + Psalms Psalm - + Proverbs Sprüche - + Ecclesiastes Prediger - + Song of Solomon Hohelied - + Isaiah Jesaja - + Jeremiah Jeremia - + Lamentations Klagelieder - + Ezekiel Hesekiel - + Daniel Daniel - + Hosea Hosea - + Joel Joel - + Amos Amos - + Obadiah Obadja - + Jonah Jona - + Micah Micha - + Nahum Nahum - + Habakkuk Habakuk - + Zephaniah Zefania - + Haggai Haggai - + Zechariah Sacharja - + Malachi Maleachi - + Matthew Matthäus - + Mark Markus - + Luke Lukas - + John Johannes - + Acts Apostelgeschichte - + Romans Römer - + 1 Corinthians 1. Korinther - + 2 Corinthians 2. Korinther - + Galatians Galater - + Ephesians Epheser - + Philippians Philipper - + Colossians Kolosser - + 1 Thessalonians 1. Thessalonicher - + 2 Thessalonians 2. Thessalonicher - + 1 Timothy 1. Timotheus - + 2 Timothy 2. Timotheus - + Titus Titus - + Philemon Philemon - + Hebrews Hebräer - + James Jakobus - + 1 Peter 1. Petrus - + 2 Peter 2. Petrus - + 1 John 1. Johannes - + 2 John 2. Johannes - + 3 John 3. Johannes - + Jude Judas - + Revelation Offenbarung - + Judith Judit - + Wisdom Weisheit - + Tobit Tobit - + Sirach Jesus Sirach - + Baruch Baruch - + 1 Maccabees 1. Makkabäer - + 2 Maccabees 2. Makkabäer - + 3 Maccabees 3. Makkabäer - + 4 Maccabees 4. Makkabäer - + Rest of Daniel Daniel (Spätschrift) - + Rest of Esther Ester (Spätschrift) - + Prayer of Manasses Gebet des Manasse - + Letter of Jeremiah Brief des Jeremia - + Prayer of Azariah Daniel (Asarjas Gebet) - + Susanna Daniel (Susannas Rettung) - + Bel Daniel (Bel) - + 1 Esdras 1. Buch Esdras - + 2 Esdras 2. Buch Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. ,|v|V|Vers|Verse|:;;-|bis;;.|;|+|und;;Ende + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Bitte geben Sie den Namen der Bibelübersetzung ein. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Das Copyright muss angegeben werden. Gemeinfreie Bibeln ohne Copyright sind als solche zu kennzeichnen. + + + + Bible Exists + Bibel existiert bereits + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Diese Bibel existiert bereit. Bitte geben Sie einen anderen Übersetzungsnamen an oder löschen Sie zuerst die Existierende. + + + + You need to specify a book name for "%s". + Sie müssen ein Buchnamen für »%s« angeben. + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + Der Buchname "%s" ist nicht korrekt. +Nummern können nur am Anfang benutzt werden +und ein nichtnumerisches Zeichen muss folgen. + + + + Duplicate Book Name + Doppelter Buchname + + + + The Book Name "%s" has been entered more than once. + Der Buchnamen »%s« wurde mehrmals angegeben. + + + BiblesPlugin.BibleManager - + Scripture Reference Error Fehler im Textverweis - + Web Bible cannot be used Für Onlinebibeln nicht verfügbar - + Text Search is not available with Web Bibles. In Onlinebibeln ist Textsuche nicht möglich. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Es wurde kein Suchbegriff eingegeben. Um nach mehreren Begriffen gleichzeitig zu suchen, müssen die Begriffe durch ein Leerzeichen getrennt sein. Alternative Suchbegriffe müssen per Komma getrennt sein. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Zurzeit sind keine Bibelübersetzungen installiert. Zur Suche muss eine solche mit dem Importassistent importiert werden. - + No Bibles Available Keine Bibeln verfügbar - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -720,187 +767,188 @@ BiblesPlugin.BiblesTab - + Verse Display Bibelstellenanzeige - + Only show new chapter numbers Nur neue Kapitelnummern anzeigen - + Bible theme: Bibel-Design: - + No Brackets Keine Klammern - + ( And ) ( und ) - + { And } { und } - + [ And ] [ und ] - + Note: Changes do not affect verses already in the service. Hinweis: -Änderungen beeinflussen keine Verse, welche bereits im Ablauf vorhanden sind. +Änderungen beeinflussen keine Bibelverse, welche bereits im Ablauf vorhanden sind. - + Display second Bible verses Vergleichsbibel anzeigen - + Custom Scripture References Benutzerdefiniertes Bibelstellenformat - + Verse Separator: Verstrenner: - + Range Separator: Bereichstrenner: - + List Separator: Aufzählungstrenner: - + End Mark: Endmarkierung: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - Alternative Verstrenner können durch senkrechte Striche »|« getrennt angegeben werden. Der erste Trenner wird zur Darstellung in OpenLP genutzt. + Alternative Verstrenner können durch senkrechte +Striche »|« getrennt angegeben werden. Der erste +Trenner wird zur Darstellung in OpenLP genutzt. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - Alternative Bereichstrenner können durch senkrechte Striche »|« getrennt angegeben werden. Der erste Trenner wird zur Darstellung in OpenLP genutzt. + Alternative Bereichstrenner können durch senkrechte +Striche »|« getrennt angegeben werden. Der erste +Trenner wird zur Darstellung in OpenLP genutzt. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - Alternative Aufzählungstrenner können durch senkrechte Striche »|« getrennt angegeben werden. Der erste Trenner wird zur Darstellung in OpenLP genutzt. + Alternative Aufzählungstrenner können durch senkrechte +Striche »|« getrennt angegeben werden. Der erste +Trenner wird zur Darstellung in OpenLP genutzt. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - Alternative Endmarkierungen können durch senkrechte Striche »|« getrennt angegeben werden. + Alternative Endmarkierungen können durch senkrechte +Striche »|« getrennt angegeben werden. Der erste +Trenner wird zur Darstellung in OpenLP genutzt. - - Preferred Bookname Language - Bevorzugte Sprache der Buchnamen + + English + Englisch - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Sprache der Buchnamen im Suchfeld: + + Default Bible Language + Standard Bibelsprache - - Bible language - Sprache der Bibel + + Book name language in search field, +search results and on display: + Sprache des Buchnames im Suchfeld, +Suchergebnis und Projektionsbildschirm: - - Application language - Sprache der Benutzeroberfläche + + Bible Language + Bibelsprache - - English - Englisch - - - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - + + Application Language + Anwendungssprache BiblesPlugin.BookNameDialog - + Select Book Name Buchnamen wählen - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Das folgende Buch konnte intern nicht zugeordnet werden. Bitte wählen Sie den entsprechenden englischen Namen. - - - + Current name: Aktueller Name: - + Corresponding name: Entsprechender Name: - + Show Books From Zeige Bücher aus dem: - + Old Testament Altes Testament - + New Testament Neues Testament - + Apocrypha Apokryphen + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + Der folgende Buchname konnte nicht gefunden werden. Bitte den entsprechenden Namen in der Liste wählen. + BiblesPlugin.BookNameForm - + You need to select a book. Sie müssen ein Buch wählen. @@ -925,42 +973,112 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Bibeleditor + + + + License Details + Lizenzdetails + + + + Version name: + Bibelausgabe: + + + + Copyright: + Copyright: + + + + Permissions: + Genehmigung: + + + + Default Bible Language + Standard Bibelsprache + + + + Book name language in search field, search results and on display: + Sprache des Buchnames im Suchfeld, Suchergebnis und Projektionsbildschirm: + + + + Global Settings + Globale Einstellung + + + + Bible Language + Bibelsprache + + + + Application Language + Anwendungssprache + + + + English + Englisch + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + Dies ist eine Webbibel. +Es ist nicht möglich die Büchernamen anzupassen. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + Um die benutzerdefinierten Büchernamen zu nutzen muss im Metadaten Tab "Bibelsprache" ausgewählt werden oder wenn "Globale Einstellung" ausgewählt ist, dann muss in den Bibel-Einstellungen "Bibelsprache" ausgewählt werden. + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registriere Bibel und lade Bücher... - + Registering Language... Registriere Sprache... - + Importing %s... Importing <book name>... Importiere »%s«... - + Download Error Download Fehler - + 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. - Beim Herunterladen des Bibeltextes ist ein Fehler aufgetreten. Bitte überprüfen Sie Ihre Internetverbindung. Sollte dieser Fehler dennoch auftreten, so wenden Sie sich bitte an den OpenLP Support. + Beim Herunterladen des Bibeltextes ist ein Fehler aufgetreten. Bitte überprüfen Sie Ihre Internetverbindung. Wenden Sie sich bitte an den OpenLP Support, sollte dieser Fehler weiterhin auftreten. - + Parse Error Formatfehler - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. - Beim Auslesen des Bibeltextes ist ein Fehler aufgetreten. Sollte dieser Fehler wiederholt auftreten, so wenden Sie sich bitte an den OpenLP Support. + Beim Auslesen des Bibeltextes ist ein Fehler aufgetreten. Wenden Sie sich bitte an den OpenLP Support, sollte dieser Fehler wiederholt auftritt. @@ -1063,17 +1181,18 @@ You need to specify a version name for your Bible. - Bitte geben Sie den Namen der Bibelübersetzung ein. + Es wurde kein Suchbegriff eingegeben. +Um nach mehreren Begriffen gleichzeitig zu suchen, müssen die Begriffe durch ein Leerzeichen getrennt sein. Alternative Suchbegriffe müssen per Komma getrennt sein. You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. - Das Copyright muss angegeben werden. Gemeinfreie Bibeln ohne Copyright sind als solche zu kennzeichnen. + Copyright muss angegeben werden. Gemeinfreie Bibeln ohne Copyright sind als solche zu kennzeichnen. Bible Exists - Übersetzung bereits vorhanden + Bibelübersetzung bereits vorhanden @@ -1083,7 +1202,7 @@ Your Bible import failed. - Der Bibelimport ist fehlgeschlagen. + Das importieren der Bibel ist fehlgeschlagen. @@ -1137,17 +1256,17 @@ BiblesPlugin.LanguageDialog - + Select Language Sprache auswählen - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - OpenLP kann die Sprache dieser Bibeln nicht ermitteln. Bitte wählen Sie die Sprache dieser Bibel aus der Liste aus. + OpenLP kann die Sprache dieser Bibelnübersezung nicht ermitteln. Bitte wählen Sie die Sprache dieser Bibel aus der Liste aus. - + Language: Sprache: @@ -1163,85 +1282,100 @@ BiblesPlugin.MediaItem - + Quick Schnellsuche - + Find: Suchen: - + Book: Buch: - + Chapter: Kapitel: - + Verse: Vers: - + From: Von: - + To: Bis: - + Text Search Textsuche - + Second: Vergleichstext: - + Scripture Reference Bibelstelle - + Toggle to keep or clear the previous results. Vorheriges Suchergebnis behalten oder verwerfen. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Es ist nicht möglich Einzel- und Zweifach Bibelvers Suchergebnisse zu kombinieren. Sollen die Suchergebnisse gelöscht und eine neue Suche gestartet werden? - + Bible not fully loaded. Bibel wurde nicht vollständig geladen. - + Information Hinweis - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. Die Vergleichsbibel enthält nicht alle Verse, die in der Hauptbibel vorhanden sind. Nur die Verse, die in beiden Bibeln vorhanden sind, werden angezeigt. %d Verse sind nicht enthalten. + + + Search Scripture Reference... + Suche Bibelstelle... + + + + Search Text... + Suche Text... + + + + Are you sure you want to delete "%s"? + Sind Sie sicher, dass Sie "%s" löschen möchten? + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... %s %s wird importiert... @@ -1250,12 +1384,12 @@ 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... @@ -1264,149 +1398,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Ein Backup-Verzeichnis wählen - + Bible Upgrade Wizard Bibelupgradeassistent - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Dieser Assistent hilft Ihnen Ihre Bibeln auf das aktuelle Format umzustellen. Klicken Sie »Weiter« um den Prozess zu starten. - + Select Backup Directory Backup-Verzeichnis wählen - + Please select a backup directory for your Bibles Bitte wählen Sie ein Backup-Verzeichnis für Ihre Bibeln - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Vorherige Versionen von OpenLP 2.0 können nicht mit den aktualisierten Bibeln umgehen. Sie können eine Backup von ihren Bibeln erstellen. Wie Sie ein Backup wiedereinspielen können Sie in den <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a> lesen. - + Please select a backup location for your Bibles. Bitte wählen Sie ein Backup-Verzeichnis für Ihre Bibeln. - + Backup Directory: Backup-Verzeichnis: - + There is no need to backup my Bibles Es soll kein Backup gemacht werden - + Select Bibles Bibeln wählen - + Please select the Bibles to upgrade Bitte wählen Sie die Bibeln welche aktualisiert werden sollen - + Upgrading Aktualisiere... - + Please wait while your Bibles are upgraded. Bitte warten Sie bis Ihre Bibeln aktualisiert sind. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. Das Backup war nicht erfolgreich. Damit das Backup erstellt werden kann brauchen Sie Schreibrechte in dem Verzeichnis. - + Upgrading Bible %s of %s: "%s" Failed Aktualisiere Bibel %s von %s: »%s« Fehlgeschlagen... - + Upgrading Bible %s of %s: "%s" Upgrading ... Aktualisiere Bibel %s von %s: »%s« Aktualisiere... - + Download Error Download Fehler - + To upgrade your Web Bibles an Internet connection is required. Um Onlinebibeln zu aktualisieren ist eine Internetverbindung notwendig. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Aktualisiere Bibel %s von %s: »%s« Aktualisiere »%s«... - + Upgrading Bible %s of %s: "%s" Complete Aktualisiere Bibel %s von %s: »%s« Fertig - + , %s failed , %s fehlgeschlagen - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Aktualisiere Bibeln: %s erfolgreich%s Bitte beachten Sie, dass Bibeltexte von Onlinebibeln bei Bedarf heruntergeladen werden. Daher ist eine Internetverbindung erforderlich. - + Upgrading Bible(s): %s successful%s Aktualisiere Bibeln: %s erfolgreich%s - + Upgrade failed. Aktualisierung schlug fehl. - + You need to specify a backup directory for your Bibles. Sie müssen ein Backup-Verzeichnis für Ihre Bibeln angeben. - + Starting upgrade... Beginne mit der Aktualisierung... - + There are no Bibles that need to be upgraded. Es sind keine Bibel für eine Aktualisierung vorhanden. @@ -1480,12 +1614,12 @@ CustomPlugin.CustomTab - + Custom Display Sonderfolie Anzeige - + Display footer Fußzeile anzeigen @@ -1493,42 +1627,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Sonderfolien bearbeiten - + &Title: &Titel: - + Add a new slide at bottom. Füge eine neue Folie am Ende ein. - + Edit the selected slide. Bearbeite ausgewählte Folie. - + Edit all the slides at once. Bearbeite alle Folien. - + Split a slide into two by inserting a slide splitter. Füge einen Folienumbruch ein. - + The&me: Desig&n: - + &Credits: A&utoren: @@ -1543,12 +1677,12 @@ Es muss mindestens eine Folie erstellt werden. - + Ed&it All &Alle bearbeiten - + Insert Slide Folie einfügen @@ -1556,7 +1690,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Soll die markierte Sonderfolie wirklich gelöscht werden? @@ -1567,60 +1701,60 @@ ImagePlugin - + <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>Bilder Erweiterung</strong><br />Die Bilder Erweiterung ermöglicht die Anzeige von Bildern.<br />Eine der besonderen Eigenschaften dieser Erweiterung ist die Möglichkeit, in der Ablaufverwaltung, mehrere Bilder zu einer Gruppe zusammen zu fassen. Dies vereinfacht die die Anzeige mehrerer Bilder. Ebenso kann mit Hilfe der Zeitschleife, sehr einfach eine Diaschau erzeugt werden, welche dann automatisch abläuft. Des weiteren können mit dieser Erweiterung Bilder benutzt werden, um das Hintergrundbild des aktuellen Design zu ersetzen. - + Image name singular Bild - + Images name plural Bilder - + Images container title Bilder - + Load a new image. Lade ein neues Bild. - + Add a new image. Füge eine neues Bild hinzu. - + Edit the selected image. Bearbeite das ausgewählte Bild. - + Delete the selected image. Lösche das ausgewählte Bild. - + Preview the selected image. Zeige das ausgewählte Bild in der Vorschau. - + Send the selected image live. Zeige die ausgewählte Bild Live. - + Add the selected image to the service. Füge das ausgewählte Bild zum Ablauf hinzu. @@ -1628,7 +1762,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Anhang auswählen @@ -1636,44 +1770,44 @@ ImagePlugin.MediaItem - + Select Image(s) Bilder auswählen - + You must select an image to delete. Das Bild, das entfernt werden soll, muss ausgewählt sein. - + You must select an image to replace the background with. Das Bild, das Sie als Hintergrund setzen möchten, muss ausgewählt sein. - + Missing Image(s) Fehlende Bilder - + The following image(s) no longer exist: %s Auf die folgenden Bilder kann nicht mehr zugegriffen werden: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? Auf die folgenden Bilder kann nicht mehr zugegriffen werden: %s Wollen Sie die anderen Bilder trotzdem hinzufügen? - + There was a problem replacing your background, the image file "%s" no longer exists. Da auf das Bild »%s« nicht mehr zugegriffen werden kann, konnte es nicht als Hintergrund gesetzt werden. - + There was no display item to amend. Es waren keine Änderungen nötig. @@ -1681,78 +1815,78 @@ ImagesPlugin.ImageTab - + Background Color Hintergrundfarbe - + Default Color: Standardfarbe: - - Provides border where image is not the correct dimensions for the screen when resized. - Wenn Bilder ein anderes Seitenverhältniss als der Projektionsbildschirm haben, dann wird ein fabiger Rand hinzufgefügt. + + Visible background for images with aspect ratio different to screen. + Sichtbarer Hintergrund für Bilder mit einem anderem Seitenverhältnis als der Projektionsbildschirm. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Erweiterung Medien</strong><br />Die Erweiterung Medien ermöglicht es Audio- und Videodateien abzuspielen. - + Media name singular Medien - + Media name plural Medien - + Media container title Medien - + Load new media. Lade eine neue Audio-/Videodatei. - + Add new media. Füge eine neue Audio-/Videodatei hinzu. - + Edit the selected media. Bearbeite die ausgewählte Audio-/Videodatei. - + Delete the selected media. Lösche die ausgewählte Audio-/Videodatei. - + Preview the selected media. Zeige die ausgewählte Audio-/Videodatei in der Vorschau. - + Send the selected media live. Zeige die ausgewählte Audio-/Videodatei Live. - + Add the selected media to the service. Füge die ausgewählte Audio-/Videodatei zum Ablauf hinzu. @@ -1800,7 +1934,7 @@ Es waren keine Änderungen nötig. - + Unsupported File Nicht unterstütztes Dateiformat @@ -1818,22 +1952,22 @@ MediaPlugin.MediaTab - + Available Media Players Verfügbare Medien Player - + %s (unavailable) %s (nicht verfügbar) - + Player Order Player Reihenfolge - + Allow media player to be overridden Überschreiben des Multimediabackends zulassen @@ -1841,7 +1975,7 @@ OpenLP - + Image Files Bilddateien @@ -1863,17 +1997,17 @@ OpenLP.AboutForm - + Credits Danksagungen - + License Lizenz - + Contribute Mitmachen @@ -1883,17 +2017,17 @@ build %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. 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 @@ -2021,7 +2155,7 @@ Halleluja! - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2038,7 +2172,7 @@ OpenLP wird von freiwilligen 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. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Copyright © 2004-2012 %s @@ -2048,88 +2182,88 @@ OpenLP.AdvancedTab - + UI Settings Benutzeroberfläche - + Number of recent files to display: Anzahl zuletzt geöffneter Abläufe: - + Remember active media manager tab on startup Erinnere aktiven Reiter der Medienverwaltung - + Double-click to send items straight to live Objekte bei Doppelklick live anzeigen - + Expand new service items on creation Neue Ablaufelemente bei ausklappen - + Enable application exit confirmation Aktiviere Bestätigung beim Schließen - + Mouse Cursor Mauszeiger - + Hide mouse cursor when over display window Verstecke den Mauszeiger auf dem Bildschrim - + Default Image Standardbild - + Background color: Hintergrundfarbe: - + Image file: Bild-Datei: - + Open File Datei öffnen - + Advanced Erweitert - + Preview items when clicked in Media Manager Elemente in der Vorschau zeigen, wenn sie in der Medienverwaltung angklickt werden - + Click to select a color. Klicken Sie, um eine Farbe aus zu wählen. - + Browse for an image file to display. Wählen Sie die Bild-Datei aus, die angezeigt werden soll. - + Revert to the default OpenLP logo. Standard-Logo wiederherstellen. @@ -2141,138 +2275,222 @@ Ablauf %Y-%m-%d %H-%M - + Default Service Name Voreingestellter Ablaufname - + Enable default service name Ablaufnamen vorschlagen - + Date and Time: Zeitpunkt: - + Monday Montag - + Tuesday Dienstag - + Wednesday Mittwoch - + Thurdsday Donnerstag - + Friday Freitag - + Saturday Samstag - + Sunday Sonntag - + Now Jetzt - + Time when usual service starts. Übliche Uhrzeit. - + Name: Name: - + Consult the OpenLP manual for usage. Verwendungsdetails sind im Handbuch zu finden. - + Revert to the default service name "%s". Auf den vorgegebenen Ablaufnahmen »%s« zurücksetzen. - + Example: Beispiel: - + X11 X11 - + Bypass X11 Window Manager Fenstermanager X11 umgehen - + Syntax error. Syntaxfehler. + + + Data Location + Pfad für Datenablage: + + + + Current path: + Aktueller Pfad: + + + + Custom path: + Benutzerdefinierter Pfad: + + + + Browse for new data file location. + Pfad für Datenablage wählen. + + + + Set the data location to the default. + Pfad für Datenablage zurücksetzen. + + + + Cancel + Abbruch + + + + Cancel OpenLP data directory location change. + Aktuelle Änderungen verwerfen. + + + + Copy data to new location. + Existierende Daten kopieren. + + + + Copy the OpenLP data files to the new location. + Existierende Daten kopieren. + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + <strong>Warnung:</strong>Der neue Datenpfad enthält bereits Daten. Diese Daten werden während des Kopiervorganges ersetzt. + + + + Data Directory Error + Fehler im Daten Ordner + + + + Select Data Directory Location + Bitte wählen Sie Pfad des Daten Ordners + + + + Confirm Data Directory Change + Bitte bestätigen Sie die Änderung des Daten Ordners + + + + Reset Data Directory + Daten Ordner zurücksetzen + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + Wollen Sie wirklich den Daten Ordner wieder auf den Auslieferungszustand zurücksetzen? + +Dieser Ort wird beim nächsten Start benutzt. + + + + Overwrite Existing Data + Existierende Daten überschreiben + OpenLP.ExceptionDialog - + Error Occurred Fehler aufgetreten - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Ups! OpenLP hat ein Problem und kann es nicht beheben. Der Text im unteren Fenster enthält Informationen, welche möglicherweise hilfreich für die OpenLP Entwickler sind. Bitte senden Sie eine E-Mail an: bugs@openlp.org mit einer ausführlichen Beschreibung was Sie taten als das Problem auftrat. - + Send E-Mail E-Mail senden - + Save to File In Datei speichern - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Bitte geben Sie ein Beschreibung ein, was Sie gemacht haben, als dieser Fehler auftrat. Bitte verwenden Sie (wenn möglich) Englisch. - + Attach File Datei einhängen - + Description characters to enter : %s Mindestens noch %s Zeichen eingeben @@ -2280,24 +2498,24 @@ OpenLP.ExceptionForm - + Platform: %s Plattform: %s - + Save Crash Report Fehlerprotokoll speichern - + Text files (*.txt *.log *.text) Textdateien (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2328,7 +2546,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2464,17 +2682,17 @@ Standardeinstellungen - + Downloading %s... %s wird heruntergeladen... - + Download complete. Click the finish button to start OpenLP. Download vollständig. Klicken Sie »Abschließen« um OpenLP zu starten. - + Enabling selected plugins... Aktiviere ausgewählte Erweiterungen... @@ -2544,32 +2762,32 @@ Dieser Assistent wird Ihnen helfen OpenLP für die erste Benutzung zu konfigurieren. Klicken sie »Weiter« um den Assistenten zu starten. - + Setting Up And Downloading Konfiguriere und Herunterladen - + Please wait while OpenLP is set up and your data is downloaded. Bitte warten Sie, während OpenLP eingerichtet wird und die Daten heruntergeladen werden. - + Setting Up Konfiguriere - + Click the finish button to start OpenLP. Klicken Sie »Abschließen« um OpenLP zu starten. - + Download complete. Click the finish button to return to OpenLP. Download vollständig. Klicken Sie »Abschließen« um zurück zu OpenLP zu gelangen. - + Click the finish button to return to OpenLP. Klicken Sie »Abschließen« um zu OpenLP zurück zu gelangen. @@ -2579,78 +2797,78 @@ Sonderfolien + + Finish + Ende + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Es wurde keine Internetverbindung erkannt. Um während des erstmaligen Startes von OpenLP Beispiel Lieder, Bibeln und Designs zu installieren ist eine Internetverbindung nötig. Klicken Sie >>Abschließen<<, um OpenLP nun mit Grundeinstellungen und ohne Beispiel Daten zu starten. - + Es wurde keine Internetverbindung erkannt. Um während des erstmaligen Startes von OpenLP Beispiel Lieder, Bibeln und Designs zu installieren ist eine Internetverbindung nötig. Klicken Sie »Abschließen«, um OpenLP nun mit Grundeinstellungen und ohne Beispiel Daten zu starten. + Um diesen Einrichtungsassistenten erneut zu starten und die Beispiel Daten zu importieren, prüfen Sie Ihre Internetverbindung und starten den Assistenten im Menü "Extras/Einrichtungsassistenten starten". -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. -Um den Einrichtungsassistenten zu unterbrechen (und OpenLP nicht zu starten), bitte >>Abbrechen<< klicken. - - - - Finish - Ende +Um den Einrichtungsassistenten zu unterbrechen (und OpenLP nicht zu starten), bitte »Abbrechen« klicken. OpenLP.FormattingTagDialog - + Configure Formatting Tags Konfiguriere Formatforlagen - + Edit Selection Auswahl bearbeiten - + Save Speichern - + Description Beschreibung - + Tag Tag - + Start tag Anfangs Tag - + End tag End Tag - + Tag Id Tag Nr. - + Start HTML Anfangs HTML - + End HTML End HTML @@ -2658,32 +2876,32 @@ OpenLP.FormattingTagForm - + Update Error Aktualisierungsfehler - + Tag "n" already defined. Tag »n« bereits definiert. - + New Tag Neuer Tag - + <HTML here> <HTML hier> - + </and here> </und hier> - + Tag %s already defined. Tag »%s« bereits definiert. @@ -2691,82 +2909,82 @@ OpenLP.FormattingTags - + Red rot - + Black schwarz - + Blue blau - + Yellow gelb - + Green grün - + Pink rosa - + Orange orange - + Purple lila - + White weiß - + Superscript hochgestellt - + Subscript tiefgestellt - + Paragraph Textabsatz - + Bold fett - + Italics kursiv - + Underline unterstrichen - + Break Textumbruch @@ -2774,180 +2992,170 @@ OpenLP.GeneralTab - + General Allgemein - + Monitors Bildschirme - + Select monitor for output display: Projektionsbildschirm: - + Display if a single screen Anzeige bei nur einem Bildschirm - + Application Startup Programmstart - + Show blank screen warning Warnung wenn Projektion deaktiviert wurde - + Automatically open the last service Zuletzt benutzten Ablauf beim Start laden - + Show the splash screen Zeige den Startbildschirm - + Application Settings Anwendungseinstellungen - + Prompt to save before starting a new service Geänderte Abläufe nicht ungefragt ersetzen - + Automatically preview next item in service Vorschau des nächsten Ablaufelements - + sec sek - + CCLI Details CCLI-Details - + SongSelect username: SongSelect-Benutzername: - + SongSelect password: SongSelect-Passwort: - + X X - + Y Y - + Height Höhe - + Width Breite - + Check for updates to OpenLP Prüfe nach Aktualisierungen - + Unblank display when adding new live item Neues Element hellt Anzeige automatisch auf - + Timed slide interval: Automatischer Folienwechsel: - + Background Audio Hintergrundmusik - + Start background audio paused Starte Hintergrundmusik pausiert - + Service Item Slide Limits Navigation in Folienkontrollfeld - - &End Slide - &Halten - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - Bei Erreichen der ersten bzw. letzten Folie anhalten. - - - - &Wrap Slide - &Umlauf + + Override display position: + Anzeigeposition überschreiben: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - Bei Erreichen der ersten bzw. letzten Folie am anderen Ende fortfahren. + + Repeat track list + Abspielliste wiederholen - - &Next Item - &Weiter + + Behavior of next/previous on the last/first slide: + Verhalten von "Vorherige/Nächste Folie" bei letzter Folie: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - Bei Erreichen der ersten bzw. letzten Folie mit dem entsprechend nächsten Ablaufelement fortfahren. + + &Remain on Slide + &Halte - - Override display position: - Anzeigeposition überschreiben: + + &Wrap around + &Umlauf - - Repeat track list - Abspielliste wiederholen + + &Move to next/previous service item + &Nächstes/vorheriges Ablaufelement OpenLP.LanguageManager - + Language Sprache - + Please restart OpenLP to use your new language setting. Bitte starten Sie OpenLP neu, um die neue Spracheinstellung zu verwenden. @@ -2963,287 +3171,287 @@ OpenLP.MainWindow - + &File &Datei - + &Import &Importieren - + &Export &Exportieren - + &View &Ansicht - + M&ode An&sichtsmodus - + &Tools E&xtras - + &Settings &Einstellungen - + &Language &Sprache - + &Help &Hilfe - + Media Manager Medienverwaltung - + Service Manager Ablaufverwaltung - + Theme Manager Designverwaltung - + &New &Neu - + &Open Ö&ffnen - + Open an existing service. Einen vorhandenen Ablauf öffnen. - + &Save &Speichern - + Save the current service to disk. Den aktuellen Ablauf speichern. - + Save &As... Speichern &unter... - + Save Service As Den aktuellen Ablauf unter einem neuen Namen speichern - + Save the current service under a new name. Den aktuellen Ablauf unter einem neuen Namen speichern. - + E&xit &Beenden - + Quit OpenLP OpenLP beenden - + &Theme &Design - + &Configure OpenLP... &Einstellungen... - + &Media Manager &Medienverwaltung - + Toggle Media Manager Die Medienverwaltung ein- bzw. ausblenden - + Toggle the visibility of the media manager. Die Medienverwaltung ein- bzw. ausblenden. - + &Theme Manager &Designverwaltung - + Toggle Theme Manager Die Designverwaltung ein- bzw. ausblenden - + Toggle the visibility of the theme manager. Die Designverwaltung ein- bzw. ausblenden. - + &Service Manager &Ablaufverwaltung - + Toggle Service Manager Die Ablaufverwaltung ein- bzw. ausblenden - + Toggle the visibility of the service manager. Die Ablaufverwaltung ein- bzw. ausblenden. - + &Preview Panel &Vorschau-Ansicht - + Toggle Preview Panel Die Vorschau ein- bzw. ausblenden - + Toggle the visibility of the preview panel. Die Vorschau ein- bzw. ausschalten. - + &Live Panel &Live-Ansicht - + Toggle Live Panel Die Live Ansicht ein- bzw. ausschalten - + Toggle the visibility of the live panel. Die Live Ansicht ein- bzw. ausschalten. - + &Plugin List Er&weiterungen... - + List the Plugins Erweiterungen verwalten - + &User Guide Benutzer&handbuch - + &About &Info über OpenLP - + More information about OpenLP Mehr Informationen über OpenLP - + &Online Help &Online Hilfe - + &Web Site &Webseite - + Use the system language, if available. Die Systemsprache, sofern diese verfügbar ist, verwenden. - + Set the interface language to %s Die Sprache von OpenLP auf %s stellen - + Add &Tool... Hilfsprogramm hin&zufügen... - + Add an application to the list of tools. Eine Anwendung zur Liste der Hilfsprogramme hinzufügen. - + &Default &Standard - + Set the view mode back to the default. Den Ansichtsmodus auf Standardeinstellung setzen. - + &Setup &Einrichten - + Set the view mode to Setup. Die Ansicht für die Ablauferstellung optimieren. - + &Live &Live - + Set the view mode to Live. Die Ansicht für den Live-Betrieb optimieren. - + 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/. @@ -3252,108 +3460,108 @@ Sie können die letzte Version auf http://openlp.org abrufen. - + 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 - + English Please add the name of your language here Deutsch - + Configure &Shortcuts... Konfiguriere &Tastenkürzel... - + Close OpenLP OpenLP beenden - + Are you sure you want to close OpenLP? Soll OpenLP wirklich beendet werden? - + Open &Data Folder... Öffne &Datenverzeichnis... - + Open the folder where songs, bibles and other data resides. Öffne das Verzeichnis, wo Lieder, Bibeln und andere Daten gespeichert sind. - + &Autodetect &Automatisch - + Update Theme Images Aktualisiere Design Bilder - + Update the preview images for all themes. Aktualisiert die Vorschaubilder aller Designs. - + Print the current service. Drucke den aktuellen Ablauf. - + &Recent Files &Zuletzte geöffnete Abläufe - + L&ock Panels &Sperre Leisten - + Prevent the panels being moved. Unterbindet das Bewegen der Leisten. - + Re-run First Time Wizard Einrichtungsassistent starten - + Re-run the First Time Wizard, importing songs, Bibles and themes. Einrichtungsassistent erneut starten um Beispiel-Lieder, Bibeln und Designs zu importieren. - + Re-run First Time Wizard? Einrichtungsassistent starten? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3362,43 +3570,43 @@ Der Einrichtungsassistent kann einige Einstellungen verändern und ggf. neue Lieder, Bibeln und Designs zu den bereits vorhandenen hinzufügen. - + Clear List Clear List of recent files Leeren - + Clear the list of recent files. Leert die Liste der zuletzte geöffnete Abläufe. - + Configure &Formatting Tags... Konfiguriere &Formatvorlagen... - + Export OpenLP settings to a specified *.config file Exportiere OpenLPs Einstellungen in ein *.config-Datei. - + Settings Einstellungen - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Importiere OpenLPs Einstellungen aus ein *.config-Datei, die vorher an diesem oder einem anderen Computer exportiert wurde. - + Import settings? Importiere Einstellungen? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3411,45 +3619,50 @@ Falsche Einstellungen können fehlerhaftes Verhalten von OpenLP verursachen. - + Open File Öffne Datei - + OpenLP Export Settings Files (*.conf) OpenLP Einstellungsdatei (*.conf) - + Import settings Importiere Einstellungen - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP wird nun geschlossen. Importierte Einstellungen werden bei dem nächsten Start übernommen. - + Export Settings File Exportiere Einstellungsdatei - + OpenLP Export Settings File (*.conf) OpenLP Einstellungsdatei (*.conf) + + + New Data Directory Error + Fehler im neuen Daten Ordner + OpenLP.Manager - + Database Error Datenbankfehler - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3458,7 +3671,7 @@ Datenbank: %s - + OpenLP cannot load your database. Database: %s @@ -3470,74 +3683,74 @@ OpenLP.MediaManagerItem - + No Items Selected Keine Elemente ausgewählt. - + &Add to selected Service Item Zum &gewählten Ablaufelement hinzufügen - + You must select one or more items to preview. Zur Vorschau muss mindestens ein Elemente auswählt sein. - + You must select one or more items to send live. Zur Live Anzeige muss mindestens ein Element ausgewählt sein. - + You must select one or more items. Es muss mindestens ein Element ausgewählt sein. - + You must select an existing service item to add to. Sie müssen ein vorhandenes Ablaufelement auswählen. - + Invalid Service Item Ungültiges Ablaufelement - + You must select a %s service item. Sie müssen ein %s-Element im Ablaufs wählen. - + You must select one or more items to add. Sie müssen ein oder mehrer Element auswählen. - + No Search Results Kein Suchergebnis - + Invalid File Type Ungültige Dateiendung - + Invalid File %s. Suffix not supported Ungültige Datei %s. Dateiendung nicht unterstützt. - + &Clone &Klonen - + Duplicate files were found on import and were ignored. Duplikate wurden beim Importieren gefunden und wurden ignoriert. @@ -3545,12 +3758,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. Ein <lyrics>-Tag fehlt. - + <verse> tag is missing. Ein <verse>-Tag fehlt. @@ -3558,27 +3771,27 @@ OpenLP.PluginForm - + Plugin List Erweiterungen - + Plugin Details Erweiterungsdetails - + Status: Status: - + Active aktiv - + Inactive inaktiv @@ -3601,12 +3814,12 @@ OpenLP.PrintServiceDialog - + Fit Page Auf Seite einpassen - + Fit Width An Breite anpassen @@ -3614,7 +3827,7 @@ OpenLP.PrintServiceForm - + Options Optionen @@ -3629,47 +3842,47 @@ Als HTML kopieren - + Zoom In Heranzoomen - + Zoom Out Wegzoomen - + Zoom Original Original Zoom - + Other Options Andere Optionen - + Include slide text if available Drucke Folientext wenn verfügbar - + Include service item notes Drucke Element-Notizen - + Include play length of media items Drucke Spiellänge von Medien Elementen - + Add page break before each text item Einen Seitenumbruch nach jedem Text-Element einfügen - + Service Sheet Ablauf @@ -3679,12 +3892,12 @@ Drucken - + Title: Titel: - + Custom Footer Text: Ablaufnotizen: @@ -3692,12 +3905,12 @@ OpenLP.ScreenList - + Screen Bildschirm - + primary Primär @@ -3705,12 +3918,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Anfang</strong>: %s - + <strong>Length</strong>: %s <strong>Spiellänge</strong>: %s @@ -3718,7 +3931,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Reihenfolge der Bilder ändern @@ -3726,82 +3939,82 @@ OpenLP.ServiceManager - + Move to &top Zum &Anfang schieben - + Move item to the top of the service. Das ausgewählte Element an den Anfang des Ablaufs verschieben. - + Move &up Nach &oben schieben - + Move item up one position in the service. Das ausgewählte Element um eine Position im Ablauf nach oben verschieben. - + Move &down Nach &unten schieben - + Move item down one position in the service. Das ausgewählte Element um eine Position im Ablauf nach unten verschieben. - + Move to &bottom Zum &Ende schieben - + Move item to the end of the service. Das ausgewählte Element an das Ende des Ablaufs verschieben. - + &Delete From Service Vom Ablauf &löschen - + Delete the selected item from the service. Das ausgewählte Element aus dem Ablaufs entfernen. - + &Add New Item &Neues Element hinzufügen - + &Add to Selected Item &Zum gewählten Element hinzufügen - + &Edit Item Element &bearbeiten - + &Reorder Item &Aufnahmeelement - + &Notes &Notizen - + &Change Item Theme &Design des Elements ändern @@ -3823,112 +4036,107 @@ 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. - + &Expand all Alle au&sklappen - + Expand all the service items. Alle Ablaufelemente ausklappen. - + &Collapse all Alle ei&nklappen - + Collapse all the service items. Alle Ablaufelemente einklappen. - + Open File Ablauf öffnen - + Moves the selection down the window. Ausgewähltes nach unten schieben - + Move up Nach oben - + Moves the selection up the window. Ausgewähltes nach oben schieben - + Go Live Live - + Send the selected item to Live. Zeige das ausgewählte Element Live. - + &Start Time &Startzeit - + Show &Preview &Vorschau - - Show &Live - &Live - - - + Modified Service Modifizierter Ablauf - + The current service has been modified. Would you like to save this service? Der momentane Ablauf wurde modifiziert. Möchten Sie ihn speichern? - + Custom Service Notes: Notizen zum Ablauf: - + Notes: Notizen: - + Playing time: Spiellänge: - + Untitled Service Unbenannt @@ -3953,17 +4161,17 @@ Dehlerhaft Datei - + Load an existing service. Einen bestehenden Ablauf öffnen. - + Save this service. Den aktuellen Ablauf speichern. - + Select a theme for the service. Design für den Ablauf auswählen. @@ -3973,7 +4181,7 @@ Entweder ist die Datei fehlerhaft oder sie ist keine OpenLP 2.0 Ablauf-Datei. - + Service File Missing Ablaufdatei fehlt @@ -3997,11 +4205,21 @@ Service copy only Ablaufkopie (nicht in der Datenbank) + + + Error Saving File + Fehler beim Speichern der Datei + + + + There was an error saving your file. + Beim Speichern der Datei ist ein Fehler aufgetreten. + OpenLP.ServiceNoteForm - + Service Item Notes Elementnotiz @@ -4017,67 +4235,67 @@ OpenLP.ShortcutListDialog - + Action Aktion - + Shortcut Tastenkürzel - + Duplicate Shortcut Belegtes Tastenkürzel - + The shortcut "%s" is already assigned to another action, please use a different shortcut. Das Tastenkürzel »%s« ist bereits einer anderen Aktion zugeordnet. Bitte wählen Sie ein anderes Tastenkürzel. - + Alternate Alternative - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Wählen Sie ein Aktion aus und klicken Sie eine der unteren Buttons um einen primären bzw. alternativen Tastenkürzel auf zuzeichnen. - + Default Standard - + Custom Sonderfolien - + Capture shortcut. Tastenkürzel aufzeichen. - + Restore the default shortcut of this action. Standard Tastenkürzel dieser Aktion wiederherstellen. - + Restore Default Shortcuts Standard Tastenkürzel wiederherstellen - + Do you want to restore all shortcuts to their defaults? Möchten Sie alle standard Tastenkürzel wiederherstellen? - + Configure Shortcuts Konfiguriere Tastaturkürzel... @@ -4085,177 +4303,172 @@ OpenLP.SlideController - + Hide Verbergen - + Go To Gehe zu - + Blank Screen Anzeige abdunkeln - + Blank to Theme Design leeren - + Show Desktop Desktop anzeigen - + Previous Service Vorheriges Element - + Next Service Nächstes Element - + Escape Item Folie schließen - + Move to previous. Vorherige Folie anzeigen. - + Move to next. Vorherige Folie anzeigen. - + Play Slides Schleife - + Delay between slides in seconds. Pause zwischen den Folien in Sekunden. - + Move to live. Zur Live Ansicht verschieben. - + Add to Service. Füge zum Ablauf hinzu. - + Edit and reload song preview. Bearbeiten und Vorschau aktualisieren. - + Start playing media. Beginne Wiedergabe. - + Pause audio. Pausiere Musik. - + Pause playing media. Pausiere Wiedergabe. - + Stop playing media. Beende Wiedergabe. - + Video position. Videoposition - + Audio Volume. Lautstärke - + Go to "Verse" Gehe zu »Strophe« - + Go to "Chorus" Gehe zu »Refrain« - + Go to "Bridge" Gehe zu »Bridge« - + Go to "Pre-Chorus" Gehe zu »Überleitung« - + Go to "Intro" Gehe zu »Intro« - + Go to "Ending" Gehe zu »Ende« - + Go to "Other" Gehe zu »Anderes« - + Previous Slide Vorherige Folie - + Next Slide Nächste Folie - + Pause Audio Tonausgabe anhalten - + Background Audio Hintergrundton - - Next Track - Nächstes Stück - - - + Go to next audio track. Zum nächsten Stück gehen. - + Tracks Stücke @@ -4331,17 +4544,17 @@ Die Startzeit ist nach der Endzeit gesetzt - + Theme Layout Design-Layout - + The blue box shows the main area. Der blaue Rahmen zeigt die Hauptanzeigefläche. - + The red box shows the footer. Der rote Rahmen zeigt die Fußzeile. @@ -4349,32 +4562,32 @@ OpenLP.ThemeForm - + Select Image Bild auswählen - + Theme Name Missing Designname fehlt - + There is no name for this theme. Please enter one. Es wurde kein Designname angegeben. Bitte benennen Sie das Design. - + Theme Name Invalid Designname ungültig - + Invalid theme name. Please enter one. Der Designname ist ungültig. Bitte ändern Sie diesen. - + (approximately %d lines per slide) (ungefähr %d Zeilen pro Folie) @@ -4382,193 +4595,193 @@ OpenLP.ThemeManager - + Create a new theme. Erstelle ein neues Design. - + Edit Theme Bearbeite Design - + Edit a theme. Ein bestehendes Design bearbeiten. - + Delete Theme Lösche Design - + Delete a theme. Ein Design löschen. - + Import Theme Importiere Design - + Import a theme. Ein Design aus einer Datei importieren. - + Export Theme Exportiere Design - + Export a theme. Ein Design in eine Datei exportieren. - + &Edit Theme Design &bearbeiten - + &Delete Theme Design &löschen - + Set As &Global Default 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. - + Theme %s is used in the %s plugin. Das Design »%s« wird in der »%s« Erweiterung benutzt. - + 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. Diese Datei ist keine gültige OpenLP Designdatei. - + &Copy Theme Design &kopieren - + &Rename Theme Design &umbenennen - + &Export Theme 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? Soll das Design »%s« wirklich gelöscht werden? - + Validation Error Validierungsfehler - + A theme with this name already exists. Ein Design mit diesem Namen existiert bereits. - + OpenLP Themes (*.theme *.otz) OpenLP Designs (*.theme *.otz) - + Copy of %s Copy of <theme name> Kopie von %s - + Theme Already Exists Design bereits vorhanden @@ -4576,272 +4789,272 @@ OpenLP.ThemeWizard - + Theme Wizard Designassistent - + Welcome to the Theme Wizard Willkommen beim Designassistenten - + Set Up Background Hintergrund einrichten - + Set up your theme's background according to the parameters below. Der Designhintergrund wird anhand der Parameter unten eingerichtet. - + Background type: Hintergrundart: - + Solid Color Füllfarbe - + Gradient Farbverlauf - + Color: Farbe: - + Gradient: Verlauf: - + Horizontal horizontal - + Vertical vertikal - + Circular radial - + Top Left - Bottom Right diagonal abwärts - + Bottom Left - Top Right diagonal aufwärts - + Main Area Font Details Schriftschnitt und -farbe - + Define the font and display characteristics for the Display text Die Schrift und die Anzeigeeigenschaften für die Hauptanzeigefläche einrichten - + Font: Schriftart: - + Size: Schriftgröße: - + Line Spacing: Zeilenabstand: - + &Outline: &Umrandung: - + &Shadow: S&chatten: - + Bold Fett - + Italic Kursiv - + Footer Area Font Details Fußzeile einrichten - + Define the font and display characteristics for the Footer text Die Schrift und die Anzeigeeigenschaften für die Fußzeile einrichten - + Text Formatting Details Weitere Formatierung - + Allows additional display formatting information to be defined Hier können zusätzliche Anzeigeeigenschaften eingerichtet werden. - + Horizontal Align: Horizontale Ausrichtung: - + Left links - + Right rechts - + Center zentriert - + Output Area Locations Anzeigeflächen - + Allows you to change and move the main and footer areas. Hier ist es möglich Hauptanzeigefläche und die Fußzeile zu verschieben. - + &Main Area &Hauptanzeigefläche - + &Use default location &Automatisch positionieren - + X position: Von links: - + px px - + Y position: Von oben: - + Width: Breite: - + Height: Höhe: - + Use default location Automatisch positionieren - + Save and Preview Vorschau und Speichern - + View the theme and save it replacing the current one or change the name to create a new theme Eine Vorschau anzeigen und das Design abspeichern - + Theme name: Designname: - + Edit Theme - %s Bearbeite Design - %s - + 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. Dieser Assistent hilft Ihnen Designs zu erstellen oder zu bearbeiten. Klicken Sie auf »Weiter« um den Hintergrund einzurichten. - + Transitions: Übergänge: - + &Footer Area &Fußzeile - + Starting color: Startfarbe: - + Ending color: Endfarbe - + Background color: Hintergrundfarbe: - + Justify bündig - + Layout Preview Layout-Vorschau - + Transparent transparent @@ -4849,47 +5062,47 @@ OpenLP.ThemesTab - + Global Theme Globales Standarddesign - + Theme Level Designstufe - + S&ong Level &Liedstufe - + 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. Das im jeweiligen Lied eingestellte Design wird verwendet. Wenn für ein Lied kein Design festgelegt ist, wird das Ablaufdesign verwendet. Wenn dort auch kein Design festgelegt wurde, wird das Standarddesign benutzt. - + &Service Level &Ablaufstufe - + 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. Das dem Ablauf zugewiesene Design wird genutzt. Das im Lied eingestellte Design wird ignoriert. Wenn dem Ablauf kein Design zugeordnet ist, dann wird das Standarddesign verwendet. - + &Global Level &Globale Stufe - + Use the global theme, overriding any themes associated with either the service or the songs. Das Standarddesign immer verwenden, unabhängig vom Lieddesign oder Ablaufdesign. - + Themes Designs @@ -4973,239 +5186,239 @@ pt - + Image Bild - + Import Import - + Live Live - + Live Background Error Live-Hintergrund Fehler - + Load Öffnen - + Middle mittig - + New Neu - + New Service Neuer Ablauf - + New Theme Neues Design - + No File Selected Singular Keine Datei ausgewählt - + No Files Selected Plural Keine Dateien ausgewählt - + No Item Selected Singular Kein Element ausgewählt - + No Items Selected Plural Keine Elemente ausgewählt - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Vorschau - + Replace Background Live-Hintergrund ersetzen - + Reset Background Hintergrund zurücksetzen - + s The abbreviated unit for seconds s - + Save && Preview Speichern && Vorschau - + Search Suchen - + You must select an item to delete. Sie müssen ein Element zum Löschen auswählen. - + You must select an item to edit. Sie müssen ein Element zum Bearbeiten auswählen. - + Save Service Speicher Ablauf - + Service Ablauf - + Start %s Start %s - + Theme Singular Design - + Themes Plural Designs - + Top oben - + Version Version - + Delete the selected item. Lösche den ausgewählten Eintrag. - + Move selection up one position. Ausgewählten Eintrag nach oben schieben. - + Move selection down one position. Ausgewählten Eintrag nach unten schieben. - + &Vertical Align: &Vertikale Ausrichtung: - + Finished import. Importvorgang abgeschlossen. - + Format: Format: - + Importing Importieren - + Importing "%s"... »%s« wird importiert... - + Select Import Source Importquelle auswählen - + Select the import format and the location to import from. Wählen Sie das Importformat und das Quellverzeichnis aus. - + 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. Der openlp.ort 1.x Importassistent wurde, wegen einem fehlenden Python Modul deaktiviert. Wenn Sie diesen Importassistenten nutzen wollen, dann müssen Sie das »python-sqlite« Modul installieren. - + Open %s File Öffne %s Datei - + %p% %p% - + Ready. Fertig. - + Starting import... Beginne Import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong Sie müssen wenigstens eine %s-Datei zum Importieren auswählen. @@ -5221,7 +5434,7 @@ Willkommen beim Lied Exportassistenten - + Welcome to the Song Import Wizard Willkommen beim Lied Importassistenten @@ -5309,53 +5522,53 @@ h - + Layout style: Folienformat: - + Live Toolbar Live-Ansicht - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP läuft bereits. Möchten Sie trotzdem fortfahren? - + Settings Einstellungen - + Tools Extras - + Unsupported File Nicht unterstütztes Dateiformat - + Verse Per Slide Verse pro Folie - + Verse Per Line Verse pro Zeile - + View Ansicht @@ -5370,42 +5583,37 @@ XML Syntax Fehler - + View Mode Ansichtsmodus - + Open service. Öffne einen Ablauf. - + Print Service Ablauf drucken - + Replace live background. Ersetzen den Live-Hintergrund. - + Reset live background. Setze den Live-Hintergrund zurück. - - &Split - &Teilen - - - + Split a slide into two only if it does not fit on the screen as one slide. Teile ein Folie dann, wenn sie als Ganzes nicht auf den Bildschirm passt. - + Welcome to the Bible Upgrade Wizard Willkommen zum Aktualisierungsssistent @@ -5415,53 +5623,105 @@ Löschbestätigung - + Play Slides in Loop Endlosschleife - + Play Slides to End Schleife bis zum Ende - + Stop Play Slides in Loop Halte Endlosschleife an - + Stop Play Slides to End Halte Schleife an - + Next Track Nächstes Stück + + + Search Themes... + Search bar place holder text + Suche Designs... + + + + Optional &Split + Optionale &Teilung + + + + Invalid Folder Selected + Singular + Ungültiger Ordner gewählt + + + + Invalid File Selected + Singular + Ungültige Datei ausgewählt + + + + Invalid Files Selected + Plural + Ungültige Dateien gewählt + + + + No Folder Selected + Singular + Kein Ordner ausgewählt + + + + Open %s Folder + Öffne %s Ordner + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + Bitte wählen Sie eine %s Datei, welche importiert werden soll. + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + Bitte wählen Sie wenigstens einen %s Ordner der importiert werden soll. + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 und %2 - + %1, and %2 Locale list separator: end %1, und %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1,%2 @@ -5470,50 +5730,50 @@ PresentationPlugin - + <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>Erweiterung Präsentationen</strong><br />Die Erweiterung Präsentationen ermöglicht die Darstellung von Präsentationen, unter Verwendung verschiedener Programme. In einer Auswahlbox kann eines der verfügbaren Programme gewählt werden. - + Presentation name singular Präsentation - + Presentations name plural Präsentationen - + Presentations container title Präsentationen - + Load a new presentation. Lade eine neue Präsentation. - + Delete the selected presentation. Lösche die ausgewählte Präsentation. - + Preview the selected presentation. Zeige die ausgewählte Präsentation in der Vorschau. - + Send the selected presentation live. Zeige die ausgewählte Präsentation Live. - + Add the selected presentation to the service. Füge die ausgewählte Präsentation zum Ablauf hinzu. @@ -5521,70 +5781,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Präsentationen auswählen - + Automatic automatisch - + Present using: Anzeigen mit: - + File Exists Datei existiert - + A presentation with that filename already exists. Eine Präsentation mit diesem Dateinamen existiert bereits. - + This type of presentation is not supported. Präsentationsdateien dieses Dateiformats werden nicht unterstützt. - + Presentations (%s) Präsentationen (%s) - + Missing Presentation Fehlende Präsentation - - The Presentation %s no longer exists. - Die Präsentation »%s« existiert nicht mehr. + + The presentation %s is incomplete, please reload. + Die Präsentation %s ist unvollständig, bitte erneut laden. - - The Presentation %s is incomplete, please reload. - Die Präsentation »%s« ist nicht vollständig, bitte neu laden. + + The presentation %s no longer exists. + Die Präsentation %s existiert nicht mehr. PresentationPlugin.PresentationTab - + Available Controllers Verwendete Präsentationsprogramme - + %s (unavailable) %s (nicht verfügbar) - + Allow presentation application to be overridden Überschreiben der Präsentationssoftware zulassen @@ -5618,135 +5878,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 Fernsteuerung - + OpenLP 2.0 Stage View OpenLP 2.0 Bühnenmonitor - + Service Manager Ablaufverwaltung - + Slide Controller Live-Ansicht - + Alerts Hinweise - + Search Suchen - - Back - Zurück - - - + Refresh Aktualisieren - + Blank Schwarz - + Show Zeigen - + Prev Vorh. - + Next Nächste - + Text Text - + Show Alert Hinweis zeigen - + Go Live Live - + No Results Kein Suchergebnis - + Options Optionen - + Add to Service Zum Ablauf hinzufügen + + + Home + Start + + + + Theme + Design + + + + Desktop + Desktop + + + + Add &amp; Go to Service + Hinzufügen & zum Ablauf gehen + RemotePlugin.RemoteTab - + Serve on IP address: Verfügbar über IP-Adresse: - + Port number: Port-Nummer: - + Server Settings Server-Einstellungen - + Remote URL: Fernsteuerung: - + Stage view URL: Bühnenmonitor: - + Display stage time in 12h format Nutze 12h Format für den Bühnenmonitor - + Android App Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Zur Installation der Android app bitte den QR code einlesen oder auf <a href="https://market.android.com/details?id=org.openlp.android">download</a> klicken. @@ -5754,85 +6029,85 @@ SongUsagePlugin - + &Song Usage Tracking &Protokollierung - + &Delete Tracking Data &Protokoll löschen - + Delete song usage data up to a specified date. Das Protokoll ab einem bestimmten Datum löschen. - + &Extract Tracking Data &Protokoll extrahieren - + Generate a report on song usage. Einen Protokoll-Bericht erstellen. - + Toggle Tracking Aktiviere Protokollierung - + Toggle the tracking of song usage. Setzt die Protokollierung aus. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Erweiterung Liedprotokollierung</strong><br />Diese Erweiterung zählt die Verwendung von Liedern in Veranstaltungen. - + SongUsage name singular Liedprotokollierung - + SongUsage name plural Liedprotokollierung - + SongUsage container title Liedprotokollierung - + Song Usage Liedprotokollierung - + Song usage tracking is active. Liedprotokollierung ist aktiv. - + Song usage tracking is inactive. Liedprotokollierung ist nicht aktiv. - + display Bildschirm - + printed gedruckt @@ -5840,7 +6115,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Protokolldaten löschen @@ -5865,7 +6140,7 @@ Die Protokolldaten wurden erfolgreich gelöscht. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Bitte wählen Sie das Datum bis zu dem die Protokollierungsdaten gelöscht werden sollen. Alle gespeicherten Daten, welche älter sind, werden dauerhaft gelöscht. @@ -5873,42 +6148,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Protokoll extrahieren - + Select Date Range Zeitspanne - + to bis - + Report Location Zielverzeichnis für die Statistiken - + Output File Location Zielverzeichnis - + usage_detail_%s_%s.txt Aufrufprotokoll_%s_%s.txt - + Report Creation Statistik Erstellung - + Report %s has been successfully created. @@ -5917,12 +6192,12 @@ wurde erfolgreich erstellt. - + Output Path Not Selected Kein Zielverzeichnis angegeben - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. Sie haben kein gültiges Zielverzeichnis für die Statistiken angegeben. Bitte geben Sie ein existierendes Verzeichnis an. @@ -5960,82 +6235,82 @@ Reindiziere die Liederdatenbank... - + Arabic (CP-1256) Arabisch (CP-1256) - + Baltic (CP-1257) Baltisch (CP-1257) - + Central European (CP-1250) Zentraleuropäisch (CP-1250) - + Cyrillic (CP-1251) Kyrillisch (CP-1251) - + Greek (CP-1253) Griechisch (CP-1253) - + Hebrew (CP-1255) Hebräisch (CP-1255) - + Japanese (CP-932) Japanisch (CP-932) - + Korean (CP-949) Koreanisch (CP-949) - + Simplified Chinese (CP-936) Chinesisch, vereinfacht (CP-936) - + Thai (CP-874) Thailändisch (CP-874) - + Traditional Chinese (CP-950) Chinesisch, traditionell (CP-950) - + Turkish (CP-1254) Türkisch (CP-1254) - + Vietnam (CP-1258) Vietnamesisch (CP-1258) - + Western European (CP-1252) Westeuropäisch (CP-1252) - + Character Encoding Zeichenkodierung - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6045,26 +6320,26 @@ Einstellung korrekt. - + Please choose the character encoding. The encoding is responsible for the correct character representation. Bitte wählen sie die Zeichenkodierung. Diese ist für die korrekte Darstellung der Sonderzeichen verantwortlich. - + Song name singular Lied - + Songs name plural Lieder - + Songs container title Lieder @@ -6075,32 +6350,32 @@ Exportiert Lieder mit dem Exportassistenten. - + Add a new song. Erstelle eine neues Lied. - + Edit the selected song. Bearbeite das ausgewählte Lied. - + Delete the selected song. Lösche das ausgewählte Lied. - + Preview the selected song. Zeige das ausgewählte Lied in der Vorschau. - + Send the selected song live. Zeige das ausgewählte Lied Live. - + Add the selected song to the service. Füge das ausgewählte Lied zum Ablauf hinzu. @@ -6128,17 +6403,17 @@ Nachname: - + You need to type in the first name of the author. Der Vornamen des Autors muss angegeben werden. - + You need to type in the last name of the author. Der Nachname des Autors muss angegeben werden. - + You have not set a display name for the author, combine the first and last names? Es wurde kein Anzeigename für den Autor angegeben. Soll der Vor- und Nachname kombiniert werden? @@ -6169,209 +6444,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Metadaten + + + + Custom Book Names + Benutzerdefinierte Büchernamen + + + SongsPlugin.EditSongForm - + Song Editor Lied bearbeiten - + &Title: &Titel: - + Alt&ernate title: &Zusatztitel: - + &Lyrics: Lied&text: - + &Verse order: &Versfolge: - + Ed&it All &Alle Bearbeiten - + Title && Lyrics Titel && Liedtext - + &Add to Song &Hinzufügen - + &Remove &Entfernen - + &Manage Authors, Topics, Song Books &Datenbankeinträge verwalten - + A&dd to Song H&inzufügen - + R&emove &Entfernen - + Book: Liederbuch: - + Number: Nummer: - + Authors, Topics && Song Book Autoren, Themen && Liederbücher - + New &Theme Neues &Design - + Copyright Information Copyright - + Comments Kommentare - + Theme, Copyright Info && Comments Design, Copyright && Kommentare - + Add Author Autor hinzufügen - + This author does not exist, do you want to add them? Dieser Autor existiert nicht. Soll er zur Datenbank hinzugefügt werden? - + This author is already in the list. Dieser Autor ist bereits vorhanden. - + 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. Es wurde kein gültiger Autor ausgewählt. Bitte wählen Sie einen Autor aus der Liste oder geben Sie einen neuen Autor ein und drücken die Schaltfläche »Autor hinzufügen«. - + Add Topic Thema hinzufügen - + This topic does not exist, do you want to add it? Dieses Thema existiert nicht. Soll es zur Datenbank hinzugefügt werden? - + This topic is already in the list. Dieses Thema ist bereits vorhanden. - + 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. Es wurde kein gültiges Thema ausgewählt. Bitte wählen Sie ein Thema aus der Liste oder geben Sie ein neues Thema ein und drücken die Schaltfläche »Thema hinzufügen«. - + You need to type in a song title. Ein Liedtitel muss angegeben sein. - + You need to type in at least one verse. Mindestens ein Vers muss angegeben sein. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. Die Versfolge ist ungültig. Es gibt keinen Vers mit der Kennung »%s«. Gültige Werte sind »%s«. - + Add Book Liederbuch hinzufügen - + This song book does not exist, do you want to add it? Dieses Liederbuch existiert nicht. Soll es zur Datenbank hinzugefügt werden? - + You need to have an author for this song. Das Lied benötigt mindestens einen Autor. - + You need to type some text in to the verse. Die Strophe benötigt etwas Text. - + Linked Audio Hintergrundmusik - + Add &File(s) &Datei(en) hinzufügen - + Add &Media &Medien hinzufügen - + Remove &All &Alle Entfernen - + Open File(s) Datei(en) öffnen - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Achtung:</strong> Es werden nicht alle Verse verwendet. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. Ungültige Versfolge. Es gibt keine passenden Verse für %s. Gültige Einträge sind %s. @@ -6485,130 +6773,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Präsentationen/Textdokumente auswählen - + Song Import Wizard Lied Importassistent - + 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. Dieser Assistent hilft Ihnen Liedtexte aus verschiedenen Formaten zu importieren. Klicken Sie auf »Weiter« um das Quellformat auszuwählen, aus dem Sie importieren möchten. - + Generic Document/Presentation Präsentation/Textdokument - - Filename: - Dateiname: - - - - 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. - Leider können noch keine OpenLyric Lieder importiert werden, aber vielleicht klappts ja in der nächsten Version. - - - + Add Files... Hinzufügen... - + Remove File(s) Entfernen - + Please wait while your songs are imported. Die Liedtexte werden importiert. Bitte warten. - + OpenLP 2.0 Databases »OpenLP 2.0« Lieddatenbanken - + openlp.org v1.x Databases »openlp.org 1.x« Lieddatenbanken - + Words Of Worship Song Files »Words of Worship« Lieddateien - - You need to specify at least one document or presentation file to import from. - Sie müssen wenigstens ein Dokument oder Präsentationsdatei auswählen, die importiert werden soll. - - - + Songs Of Fellowship Song Files Songs Of Fellowship Song Dateien - + SongBeamer Files SongBeamer Dateien - + SongShow Plus Song Files SongShow Plus Song Dateien - + Foilpresenter Song Files Foilpresenter Lied-Dateien - + Copy Kopieren - + Save to File In Datei speichern - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Der Songs of Fellowship importer wurde deaktiviert, weil OpenLP nicht OpenOffice oder LibreOffice öffnen konnte. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Der Präsentation/Textdokument importer wurde deaktiviert, weil OpenLP nicht OpenOffice oder LibreOffice öffnen konnte. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics oder OpenLP 2.0 exportiere Lieder - + OpenLyrics Files »OpenLyrics« Datei + + + CCLI SongSelect Files + CLI SongSelect Dateien + + + + EasySlides XML File + EasySlides XML Datei + + + + EasyWorship Song Database + EasyWorship Lieddatenbank + + + + DreamBeam Song Files + DreamBeam Lied Dateien + + + + You need to specify a valid PowerSong 1.0 database folder. + Bitte wählen sie einen gültigen PowerSong 1.0 Datenbank Ordner. + + + + ZionWorx (CSV) + ZionWorx(CSV) + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + Bitte konvertieren Sie zuerst die ZionWorx Datenbank in eine CSV Text Datei, wie beschrieben im <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + SongsPlugin.MediaFilesForm - + Select Media File(s) Wähle Audio-/Videodatei(en) - + Select one or more audio files from the list below, and click OK to import them into this song. Wähle eine oder mehrere Audio Dateien von der folgenden Liste und klicke >>OK<<, um sie in dieses Lied zu importieren. @@ -6616,27 +6924,27 @@ SongsPlugin.MediaItem - + Titles Titel - + Lyrics Liedtext - + CCLI License: CCLI-Lizenz: - + Entire Song Ganzes Lied - + Are you sure you want to delete the %n selected song(s)? Soll das markierte Lied wirklich gelöscht werden? @@ -6644,16 +6952,41 @@ - + Maintain the lists of authors, topics and books. Autoren, Themen und Bücher verwalten. - + copy For song cloning Kopie + + + Search Titles... + Suche Titel... + + + + Search Entire Song... + Suche im ganzem Lied... + + + + Search Lyrics... + Suche Liedtext... + + + + Search Authors... + Suche Autoren... + + + + Search Song Books... + Suche Liederbücher... + SongsPlugin.OpenLP1SongImport @@ -6680,6 +7013,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + Keine Lieder zu importieren. + + + + Verses not found. Missing "PART" header. + Es wurden keine Verse gefunden. "PART" Kopfzeile fehlt. + + + SongsPlugin.SongBookForm @@ -6718,12 +7064,12 @@ SongsPlugin.SongImport - + copyright copyright - + The following songs could not be imported: Die folgenden Lieder konnten nicht importiert werden: @@ -6744,117 +7090,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Importvorgang fehlgeschlagen. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Der Autor konnte nicht hinzugefügt werden. - + This author already exists. Der Autor existiert bereits in der Datenbank. - + Could not add your topic. Das Thema konnte nicht hinzugefügt werden. - + This topic already exists. Das Thema existiert bereits in der Datenbank. - + Could not add your book. Das Liederbuch konnte nicht hinzugefügt werden. - + This book already exists. Das Liederbuch existiert bereits in der Datenbank. - + Could not save your changes. Die Änderungen konnten nicht gespeichert werden. - + Could not save your modified author, because the author already exists. Der geänderte Autor konnte nicht gespeichert werden, da es bereits in der Datenbank existiert. - + Could not save your modified topic, because it already exists. Das geänderte Thema konnte nicht gespeichert werden, da es bereits in der Datenbank existiert. - + Delete Author Autor löschen - + Are you sure you want to delete the selected author? Soll der ausgewählte Autor wirklich gelöscht werden? - + This author cannot be deleted, they are currently assigned to at least one song. Der Autor konnte nicht gelöscht werden, da er mindestens einem Lied zugeordnet ist. - + Delete Topic Thema löschen - + Are you sure you want to delete the selected topic? Soll das ausgewählte Thema wirklich gelöscht werden? - + This topic cannot be deleted, it is currently assigned to at least one song. Das Thema konnte nicht gelöscht werden, da es mindestens einem Lied zugeordnet ist. - + Delete Book Liederbuch löschen - + Are you sure you want to delete the selected book? Soll das ausgewählte Liederbuch wirklich gelöscht werden? - + This book cannot be deleted, it is currently assigned to at least one song. Das Liederbuch konnte nicht gelöscht werden, da es mindestens einem Lied zugeordnet ist. - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? Der Autor »%s« existiert bereits. Sollen Lieder von »%s« »%s« als Autor setzen? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? Das Thema »%s« existiert bereits. Sollen Lieder zum Thema »%s« das Thema »%s« verwenden? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? Das Liederbuch »%s« existiert bereits. Sollen Lieder aus »%s« dem Buch »%s« zugeordnet werden? @@ -6862,29 +7200,29 @@ SongsPlugin.SongsTab - + Songs Mode Lieder-Einstellungen - + Enable search as you type Aktiviere Vorschlagssuche (search as you type) - + Display verses on live tool bar Versauswahl in der Live-Symbolleiste zeigen - + Update service from song edit Lieder im Ablauf nach Bearbeitung aktualisieren - - Add missing songs when opening service - Lieder aus Abläufen zur Datenbank hinzufügen + + Import missing songs from service files + Lieder aus Abläufen in die Datenbank importieren @@ -6943,4 +7281,17 @@ Anderes + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Fehler beim Lesen der CSV Datei. + + + + File not valid ZionWorx CSV format. + Die Datei hat kein gültiges ZionWorx CSV Format. + + diff -Nru openlp-1.9.9/resources/i18n/el.ts openlp-1.9.10/resources/i18n/el.ts --- openlp-1.9.9/resources/i18n/el.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/el.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Ειδοποίηση - + Show an alert message. Εμφάνιση ενός μηνύματος ειδοποίησης. - + Alert name singular Ειδοποίηση - + Alerts name plural Ειδοποιήσεις - + Alerts container title Ειδοποιήσεις - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Πρόσθετο Ειδοποιήσεων</strong><br />Το πρόσθετο ειδοποιήσεων ελέγχει την εμφάνιση βοηθητικών μηνυμάτων στην οθόνη προβολής. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Μήνυμα Ειδοποίησης - + Alert &text: &Κείμενο Ειδοποίησης: - + &New &Νέο - + &Save &Αποθήκευση - + Displ&ay Παρουσί&αση - + Display && Cl&ose Παρουσίαση && Κλ&είσιμο @@ -79,7 +79,7 @@ Δεν έχετε προσδιορίσει κάποιο κείμενο για την ειδοποίησή σας. Παρακαλούμε πληκτρολογείστε ένα κείμενο πριν κάνετε κλικ στο Νέο. - + &Parameter: &Παράμετρος: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Γραμματοσειρά - + Font name: Ονομασία γραμματοσειράς: - + Font color: Χρώμα γραμματοσειράς: - + Background color: Χρώμα φόντου: - + Font size: Μέγεθος γραμματοσειράς: - + Alert timeout: Χρόνος αναμονής: @@ -152,551 +152,598 @@ BiblesPlugin - + &Bible &Βίβλος - + Bible name singular Βίβλος - + Bibles name plural Βίβλοι - + Bibles container title Βίβλοι - + No Book Found Δεν βρέθηκε κανένα βιβλίο - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Δεν βρέθηκε βιβλίο που να ταιριάζει στην Βίβλο αυτή. Ελέγξτε την ορθογραφία του βιβλίου. - + Import a Bible. Εισαγωγή μιας Βίβλου. - + Add a new Bible. Προσθήκη νέας Βίβλου. - + Edit the selected Bible. Επεξεργασία επιλεγμένης Βίβλου. - + Delete the selected Bible. Διαγραφή της επιλεγμένης Βίβλου. - + Preview the selected Bible. Προεπισκόπηση επιλεγμένης Βίβλου. - + Send the selected Bible live. Προβολή της επιλεγμένης Βίβλου. - + Add the selected Bible to the service. Προσθήκη της επιλεγμένης Βίβλου προς χρήση. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Πρόσθετο Βίβλων</strong><br />Το πρόσθετο Βίβλων παρέχει την δυνατότητα να εμφανίζονται εδάφια Βίβλων από διαφορετικές πηγές κατά την λειτουργία. - + &Upgrade older Bibles &Αναβάθμιση παλαιότερων Βίβλων - + Upgrade the Bible databases to the latest format. Αναβάθμιση της βάσης δεδομένων Βίβλων στην τελευταία μορφή. - + Genesis Γένεση - + Exodus Έξοδος - + Leviticus Λευιτικό - + Numbers Αριθμοί - + Deuteronomy Δευτερονόμιο - + Joshua Ιησούς του Ναυή - + Judges Κριτές - + Ruth Ρουθ - + 1 Samuel 1 Σαμουήλ - + 2 Samuel 2 Σαμουήλ - + 1 Kings 1 Βασιλέων - + 2 Kings 2 Βασιλέων - + 1 Chronicles 1 Χρονικών - + 2 Chronicles 2 Χρονικών - + Ezra Έσδρας - + Nehemiah Νεεμίας - + Esther Εσθήρ - + Job Ιώβ - + Psalms Ψαλμοί - + Proverbs Παροιμίες - + Ecclesiastes Εκκλησιαστής - + Song of Solomon Άσμα Ασμάτων - + Isaiah Ησαΐας - + Jeremiah Ιερεμίας - + Lamentations Θρήνοι - + Ezekiel Ιεζεκιήλ - + Daniel Δανιήλ - + Hosea Ωσηέ - + Joel Ιωήλ - + Amos Αμώς - + Obadiah Αβδιού - + Jonah Ιωνάς - + Micah Μιχαίας - + Nahum Ναούμ - + Habakkuk Αββακούμ - + Zephaniah Σοφονίας - + Haggai Αγγαίος - + Zechariah Ζαχαρίας - + Malachi Μαλαχίας - + Matthew Ματθαίος - + Mark Μάρκος - + Luke Λουκάς - + John Ιωάννης - + Acts Πράξεις - + Romans Ρωμαίους - + 1 Corinthians 1 Κορινθίους - + 2 Corinthians 2 Κορινθίους - + Galatians Γαλάτες - + Ephesians Εφεσίους - + Philippians Φιλιππησίους - + Colossians Κολοσσαείς - + 1 Thessalonians 1 Θεσσαλονικείς - + 2 Thessalonians 2 Θεσσαλονικείς - + 1 Timothy 1 Τιμόθεο - + 2 Timothy 2 Τιμόθεο - + Titus Τίτο - + Philemon Φιλήμονα - + Hebrews Εβραίους - + James Ιακώβου - + 1 Peter 1 Πέτρου - + 2 Peter 2 Πέτρου - + 1 John 1 Ιωάννου - + 2 John 2 Ιωάννου - + 3 John 3 Ιωάννου - + Jude Ιούδα - + Revelation Αποκάλυψη - + Judith Ιουδίθ - + Wisdom Σοφία Σολομώντος - + Tobit Τωβίτ - + Sirach Σοφία Σειράχ - + Baruch Βαρούχ - + 1 Maccabees 1 Μακκαβαίων - + 2 Maccabees 2 Μακκαβαίων - + 3 Maccabees 3 Μακκαβαίων - + 4 Maccabees 4 Μακκαβαίων - + Rest of Daniel Υπόλοιπο Δανιήλ - + Rest of Esther Υπόλοιπο Εσθήρ - + Prayer of Manasses Προσευχή του Μανασσή - + Letter of Jeremiah Επιστολή του Ιερεμία - + Prayer of Azariah Προσευχή Αζαρίου - + Susanna Σουσάννα - + Bel Βηλ - + 1 Esdras 1 Έσδρας - + 2 Esdras 2 Έσδρας - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. :|v|V|verse|verses;;-|to;;,|and;;end + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Πρέπει να καθορίσετε όνομα έκδοσης για την Βίβλο σας. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Πρέπει να θέσετε πνευματικά δικαιώματα για την Βίβλο σας. Οι Βίβλοι στο Δημόσιο Domain πρέπει να σημειώνονται ως δημόσιες. + + + + Bible Exists + Υπάρχουσα Βίβλος + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Αυτή η Βίβλος υπάρχει ήδη. Παρακαλούμε εισάγετε μια διαφορετική Βίβλο ή πρώτα διαγράψτε την ήδη υπάρχουσα. + + + + You need to specify a book name for "%s". + Πρέπει να ορίσετε όνομα βιβλίου για το "%s". + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + Το όνομα βιβλίου "%s" δεν είναι σωστό. +Οι αριθμοί μπορούν να χρησιμοποιηθούν μόνο στην αρχή και πρέπει να +ακολουθούνται από έναν ή παραπάνω μη αριθμητικούς χαρακτήρες. + + + + Duplicate Book Name + Αντίγραφο Ονομασίας Βιβλίου + + + + The Book Name "%s" has been entered more than once. + Η Ονομασία Βιβλίου "%s" έχει εισαχθεί πάνω από μία φορές. + + + BiblesPlugin.BibleManager - + Scripture Reference Error Σφάλμα Αναφοράς Βίβλου - + Web Bible cannot be used Η Βίβλος Web δεν μπορεί να χρησιμοποιηθεί - + Text Search is not available with Web Bibles. Η Αναζήτηση Κειμένου δεν είναι διαθέσιμη με Βίβλους Web. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Δεν δώσατε λέξη προς αναζήτηση. Μπορείτε να διαχωρίσετε διαφορετικές λέξεις με κενό για να αναζητήσετε για όλες τις λέξεις και μπορείτε να τις διαχωρίσετε με κόμμα για να αναζητήσετε για μια από αυτές. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Δεν υπάρχουν εγκατεστημένες Βίβλοι. Χρησιμοποιήστε τον Οδηγό Εισαγωγής για να εγκαταστήσετε μία η περισσότερες Βίβλους. - + No Bibles Available Βίβλοι Μη Διαθέσιμοι - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +766,79 @@ BiblesPlugin.BiblesTab - + Verse Display Εμφάνιση Εδαφίου - + Only show new chapter numbers Εμφάνιση μόνο των αριθμών νέων κεφαλαίων - + Bible theme: Θέμα Βίβλου: - + No Brackets Απουσία Παρενθέσεων - + ( And ) ( Και ) - + { And } { Και } - + [ And ] [ Και ] - + Note: Changes do not affect verses already in the service. Σημείωση: Οι αλλαγές δεν επηρεάζουν τα εδάφια που χρησιμοποιούνται. - + Display second Bible verses Εμφάνιση εδαφίων δεύτερης Βίβλου - + Custom Scripture References Εξατομικευμένες Βιβλικές Παραπομπές - + Verse Separator: Διαχωριστής Εδαφίων: - + Range Separator: Διαχωριστής Εύρους: - + List Separator: Διαχωριστής Λίστας: - + End Mark: Σήμανση Τέλους - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +847,7 @@ Παρακαλώ σβήστε αυτή την γραμμή για χρήση της προκαθορισμένης τιμής. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +856,7 @@ Παρακαλώ σβήστε αυτή την γραμμή για χρήση της προκαθορισμένης τιμής. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +865,7 @@ Παρακαλώ σβήστε αυτή την γραμμή για χρήση της προκαθορισμένης τιμής. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,91 +874,80 @@ Παρακαλώ σβήστε αυτή την γραμμή για χρήση της προκαθορισμένης τιμής. - - Preferred Bookname Language - Προτιμητέα Γλώσσα Ονομασίας Βιβλίων + + English + Αγγλικά - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Επιλέξτε την γλώσσα στην οποία θα απεικονίζονται τα ονόματα -των βιβλίων της Βίβλου κατά την αναζήτηση: + + Default Bible Language + Προεπιλεγμένη Γλώσσα Βίβλου - - Bible language - Γλώσσα Βίβλου + + Book name language in search field, +search results and on display: + Γλώσσα ονομασίας βιβλίου στο πεδίο αναζήτησης, +στα αποτελέσματα αναζήτησης και στην εμφάνιση: - - Application language - Γλώσσα Εφαρμογής - - - - English - Αγγλικά + + Bible Language + Γλώσσα Βίβλου - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Πολλαπλές επιλογές: -Γλώσσα βίβλου - η γλώσσα με την οποία εισήχθησαν τα ονόματα των βιβλίων της Βίβλου -Γλώσσα εφαρμογής - η γλώσσα που επιλέξατε για το OpenLP -Αγγλικά - χρησιμοποιήστε πάντα Αγγλικά ονόματα βιβλίων + + Application Language + Γλώσσα Εφαρμογής BiblesPlugin.BookNameDialog - + Select Book Name Επιλέξτε Όνομα Βιβλίου - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Το ακόλουθο όνομα βιβλίου δεν βρέθηκε εσωτερικά. Παρακαλούμε επιλέξτε το αντίστοιχο αγγλικό όνομα από την λίστα. - - - + Current name: Τρέχον όνομα: - + Corresponding name: Αντίστοιχο όνομα: - + Show Books From Εμφάνιση Βιβλίων Από - + Old Testament Παλαιά Διαθήκη - + New Testament Καινή Διαθήκη - + Apocrypha Απόκρυφα + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + Το ακόλουθο όνομα βιβλίου δεν βρέθηκε εσωτερικά. Παρακαλούμε επιλέξτε το αντίστοιχο αγγλικό όνομα από την λίστα. + BiblesPlugin.BookNameForm - + You need to select a book. Πρέπει να επιλέξετε ένα βιβλίο. @@ -936,40 +972,110 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Συντάκτης Βίβλου + + + + License Details + Λεπτομέρειες Άδειας + + + + Version name: + Όνομα έκδοσης: + + + + Copyright: + Πνευματικά Δικαιώματα: + + + + Permissions: + Άδειες: + + + + Default Bible Language + Προεπιλεγμένη Γλώσσα Βίβλου + + + + Book name language in search field, search results and on display: + Γλώσσα ονομασίας βιβλίου στο πεδίο αναζήτησης, στα αποτελέσματα αναζήτησης και στην εμφάνιση: + + + + Global Settings + Καθολικές Ρυθμίσεις + + + + Bible Language + Γλώσσα Βίβλου + + + + Application Language + Γλώσσα Εφαρμογής + + + + English + Αγγλικά + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + Αυτή είναι μία Βίβλος Κατεβασμένη από το Internet. +Δεν είναι δυνατή η τροποποίηση των ονομάτων των Βιβλίων. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + Για χρήση των παραμετροποιημένων ονομάτων βιβλίων, η "Γλώσσα Βίβλου" πρέπει να έχει επιλεχθεί στην καρτέλα Meta Data, ή αν έχει επιλεχθεί το "Καθολικές Ρυθμίσεις", στην σελίδα Βίβλων του μενού Ρύθμιση του OpenLP. + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Εγγραφή Βίβλου και φόρτωμα βιβλίων... - + Registering Language... Εγγραφή Γλώσσας... - + Importing %s... Importing <book name>... Εισαγωγή %s... - + Download Error Σφάλμα Λήψης - + 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. Υπήρξε ένα πρόβλημα κατά την λήψη των επιλεγμένων εδαφίων. Παρακαλούμε ελέγξτε την σύνδεση στο Internet και αν αυτό το σφάλμα επανεμφανιστεί παρακαλούμε σκεφτείτε να κάνετε αναφορά σφάλματος. - + Parse Error Σφάλμα Ανάλυσης - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Υπήρξε πρόβλημα κατά την εξαγωγή των επιλεγμένων εδαφίων σας. Αν αυτό το σφάλμα επανεμφανιστεί σκεφτείτε να κάνετε μια αναφορά σφάλματος. @@ -1147,17 +1253,17 @@ BiblesPlugin.LanguageDialog - + Select Language Επιλογή Γλώσσας - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. Το OpenLP δεν μπορεί να αναγνωρίσει την γλώσσα αυτής της μετάφρασης της Βίβλου. Παρακαλούμε επιλέξτε την γλώσσα από την παρακάτω λίστα. - + Language: Γλώσσα: @@ -1173,85 +1279,100 @@ BiblesPlugin.MediaItem - + Quick Γρήγορο - + Find: Εύρεση: - + Book: Βιβλίο: - + Chapter: Κεφάλαιο: - + Verse: Εδάφιο: - + From: Από: - + To: Έως: - + Text Search Αναζήτηση Κειμένου - + Second: Δεύτερο: - + Scripture Reference Αναφορά Γραφής - + Toggle to keep or clear the previous results. Εναλλαγή διατήρησης ή καθαρισμού των προηγούμενων αποτελεσμάτων. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Δεν μπορείτε να συνδυάσετε αποτελέσματα αναζητήσεων μονών και διπλών εδαφίων Βίβλου. Θέλετε να διαγράψετε τα αποτελέσματα αναζήτησης και να ξεκινήσετε νέα αναζήτηση; - + Bible not fully loaded. Βίβλος ατελώς φορτωμένη. - + Information Πληροφορίες - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. Η δεύτερη Βίβλος δεν περιέχει όλα τα εδάφια που υπάρχουν στην κύρια Βίβλο. Θα εμφανιστούν μόνο τα εδάφια που βρίσκονται και στις δύο Βίβλους. %d εδάφια δεν έχουν συμπεριληφθεί στα αποτελέσματα. + + + Search Scripture Reference... + Αναζήτηση Αναφοράς Βίβλου... + + + + Search Text... + Αναζήτηση Κειμένου... + + + + Are you sure you want to delete "%s"? + Είστε σίγουροι ότι θέλετε να διαγράψετε το "%s" ; + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Εισαγωγή %s %s... @@ -1260,12 +1381,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Ανίχνευση κωδικοποίησης (μπορεί να χρειαστεί μερικά λεπτά)... - + Importing %s %s... Importing <book name> <chapter>... Εισαγωγή %s %s... @@ -1274,149 +1395,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Επιλέξτε έναν Κατάλογο Αντιγράφων Ασφαλείας - + Bible Upgrade Wizard Οδηγός Αναβάθμισης Βίβλου - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Ο οδηγός αυτός θα σας βοηθήσει να αναβαθμίσετε τις υπάρχουσες Βίβλους σας από μία προηγούμενη έκδοση του OpenLP 2. Κάντε κλικ στο πλήκτρο επόμενο παρακάτω για να ξεκινήσετε την διαδικασία αναβάθμισης. - + Select Backup Directory Επιλέξτε Φάκελο Αντιγράφων Ασφαλείας - + Please select a backup directory for your Bibles Παρακαλούμε επιλέξτε έναν φάκελο αντιγράφων ασφαλείας για τις Βίβλους σας - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Οι προηγούμενες εκδόσεις του OpenLP 2.0 δεν μπορούν να χρησιμοποιήσουν αναβαθμισμένες Βίβλους. Ετούτο το εργαλείο θα δημιουργήσει αντίγραφο ασφαλείας των τρεχόντων Βίβλων σας ώστε να αντιγράψετε απλά τα αρχεία πίσω στον φάκελο του OpenLP αν χρειαστείτε να γυρίσετε σε μια προηγούμενη έκδοση του OpenLP. Οδηγίες για το πως θα επαναφέρετε τα αρχεία μπορείτε να βρείτε στις <a href="http://wiki.openlp.org/faq"> Συχνές Ερωτήσεις</a>. - + Please select a backup location for your Bibles. Παρακαλούμε επιλέξτε μία τοποθεσία για αντίγραφα ασφαλείας για τις Βίβλους σας. - + Backup Directory: Φάκελος Αντιγράφων Ασφαλείας: - + There is no need to backup my Bibles Δεν είναι απαραίτητο να κάνω αντίγραφα ασφαλείας των Βίβλων μου - + Select Bibles Επιλογή Βίβλων - + Please select the Bibles to upgrade Παρακαλούμε επιλέξτε τις Βίβλους προς αναβάθμιση - + Upgrading Αναβάθμιση - + Please wait while your Bibles are upgraded. Παρακαλούμε περιμένετε όσο αναβαθμίζονται οι Βίβλοι σας. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. Η δημιουργία αντιγράφων ασφαλείας δεν ήταν επιτυχής. Για αντίγραφα ασφαλείας των Βίβλων σας χρειάζεστε δικαιώματα εγγραφής στον δηλωμένο φάκελο. - + Upgrading Bible %s of %s: "%s" Failed Αναβάθμιση Βίβλου %s από %s: "%s" Απέτυχε - + Upgrading Bible %s of %s: "%s" Upgrading ... Αναβάθμιση Βίβλου %s από %s: "%s" Αναβάθμιση ... - + Download Error Σφάλμα Λήψης - + To upgrade your Web Bibles an Internet connection is required. Για αναβάθμιση των Βίβλων Web χρειάζεστε σύνδεση στο Internet. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Αναβάθμιση Βίβλου %s από %s: "%s" Αναβάθμιση %s ... - + Upgrading Bible %s of %s: "%s" Complete Αναβάθμιση Βίβλου %s από %s: "%s" Ολοκληρώθηκε - + , %s failed , %s απέτυχε - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Αναβάθμιση Βίβλου(-ων): %s επιτυχής%s Παρακαλούμε έχετε υπόψη ότι εδάφια από τις Βίβλους Web θα κατέβουν κατά απαίτηση και έτσι μια σύνδεση στο Internet είναι απαραίτητη. - + Upgrading Bible(s): %s successful%s Αναβάθμιση Βίβλου(-ων): %s επιτυχής%s - + Upgrade failed. Η Αναβάθμιση απέτυχε. - + You need to specify a backup directory for your Bibles. Πρέπει να καθορίσετε έναν φάκελο αντιγράφων ασφαλείας για τις Βίβλους σας. - + Starting upgrade... Έναρξη αναβάθμισης... - + There are no Bibles that need to be upgraded. Δεν υπάρχουν Βίβλοι που χρειάζονται αναβάθμιση. @@ -1490,12 +1611,12 @@ CustomPlugin.CustomTab - + Custom Display Εξατομικευμένη Προβολή - + Display footer Προβολή υποσέλιδου @@ -1503,42 +1624,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Επεξεργασία Εξατομικευμένων Διαφανειών - + &Title: &Τίτλος: - + Add a new slide at bottom. Προσθήκη νέας διαφάνειας κάτω. - + Edit the selected slide. Επεξεργασία επιλεγμένης διαφάνειας. - + Edit all the slides at once. Επεξεργασία όλων των διαφανειών ταυτόχρονα. - + Split a slide into two by inserting a slide splitter. Χωρίστε μια διαφάνεια σε δύο με εισαγωγή ενός διαχωριστή διαφανειών. - + The&me: Θέ&μα: - + &Credits: &Πιστώσεις: @@ -1553,12 +1674,12 @@ Πρέπει να προσθέσετε τουλάχιστον μία διαφάνεια - + Ed&it All &Επεξεργασία Όλων - + Insert Slide Εισαγωγή Διαφάνειας @@ -1566,7 +1687,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Είστε σίγουροι ότι θέλετε να διαγράψετε την %n επιλεγμένη εξατομικευμένη διαφάνεια; @@ -1577,60 +1698,60 @@ ImagePlugin - + <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 />Ένα από τα εξέχοντα χαρακτηριστικά αυτού του πρόσθετου είναι η δυνατότητα να ομαδοποιήσετε πολλές εικόνες μαζί στον διαχειριστή λειτουργίας, κάνοντας την εμφάνιση πολλών εικόνων ευκολότερη. Επίσης μπορεί να κάνει χρήση του χαρακτηριστικού "προγραμματισμένη επανάληψη" για την δημιουργία παρουσίασης διαφανειών που τρέχει αυτόματα. Επιπρόσθετα εικόνες του πρόσθετου μπορούν να χρησιμοποιηθούν για παράκαμψη του φόντου του τρέχοντος θέματος, το οποίο αποδίδει αντικείμενα κειμένου όπως τα τραγούδια με την επιλεγμένη εικόνα ως φόντο αντί του φόντου που παρέχεται από το θέμα. - + Image name singular Εικόνα - + Images name plural Εικόνες - + Images container title Εικόνες - + Load a new image. Φόρτωση νέας εικόνας. - + Add a new image. Προσθήκη νέας εικόνας. - + Edit the selected image. Επεξεργασία επιλεγμένης εικόνας. - + Delete the selected image. Διαγραφή επιλεγμένης εικόνας. - + Preview the selected image. Προεπισκόπηση επιλεγμένης εικόνας. - + Send the selected image live. Προβολή της επιλεγμένης εικόνας. - + Add the selected image to the service. Προβολή της επιλεγμένης εικόνας σε λειτουργία. @@ -1638,7 +1759,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Επιλογή Επισυναπτόμενου @@ -1646,44 +1767,44 @@ ImagePlugin.MediaItem - + Select Image(s) Επιλογή Εικόνας(-ων) - + You must select an image to delete. Πρέπει να επιλέξετε μια εικόνα προς διαγραφή. - + You must select an image to replace the background with. Πρέπει να επιλέξετε μια εικόνα με την οποία θα αντικαταστήσετε το φόντο. - + Missing Image(s) Απούσες Εικόνες - + The following image(s) no longer exist: %s Οι ακόλουθες εικόνες δεν υπάρχουν πια: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? Οι ακόλουθες εικόνες δεν υπάρχουν πια: %s Θέλετε να προσθέσετε τις άλλες εικόνες οπωσδήποτε; - + There was a problem replacing your background, the image file "%s" no longer exists. Υπήρξε πρόβλημα κατά την αντικατάσταση του φόντου, το αρχείο εικόνας "%s" δεν υπάρχει πια. - + There was no display item to amend. Δεν υπήρξε κανένα αντικείμενο προς απεικόνιση για διόρθωση. @@ -1691,78 +1812,78 @@ ImagesPlugin.ImageTab - + Background Color Χρώμα Φόντου - + Default Color: Προκαθορισμένο Χρώμα: - - Provides border where image is not the correct dimensions for the screen when resized. - Παρέχει το πλαίσιο όπου η εικόνα δεν είναι σωστής διάστασης για την οθόνη όταν αλλάξει διαστάσεις. + + Visible background for images with aspect ratio different to screen. + Ορατό φόντο για εικόνες με διαφορετικές αναλογίες από την οθόνη. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Πρόσθετο Πολυμέσων</strong><br />Το πρόσθετο πολυμέσων παρέχει την αναπαραγωγή ήχου και βίντεο. - + Media name singular Πολυμέσο - + Media name plural Πολυμέσα - + Media container title Πολυμέσα - + Load new media. Φόρτωση νέων πολυμέσων. - + Add new media. Προσθήκη νέων πολυμέσων. - + Edit the selected media. Επεξεργασία επιλεγμένων πολυμέσων. - + Delete the selected media. Διαγραφή επιλεγμένων πολυμέσων. - + Preview the selected media. Προεπισκόπηση επιλεγμένων πολυμέσων. - + Send the selected media live. Προβολή επιλεγμένων πολυμέσων. - + Add the selected media to the service. Προσθήκη επιλεγμένων πολυμέσων σε λειτουργία. @@ -1810,7 +1931,7 @@ Δεν υπήρξε αντικείμενο προς προβολή για διόρθωση. - + Unsupported File Μη υποστηριζόμενο Αρχείο @@ -1828,22 +1949,22 @@ MediaPlugin.MediaTab - + Available Media Players Διαθέσιμα Προγράμματα Αναπαραγωγής - + %s (unavailable) %s (μη διαθέσιμο) - + Player Order Σειρά Αναπαραγωγής - + Allow media player to be overridden Επιτρέψτε την παράκαμψη του προγράμματος αναπαραγωγής πολυμέσων @@ -1851,7 +1972,7 @@ OpenLP - + Image Files Αρχεία Εικόνων @@ -1873,17 +1994,17 @@ OpenLP.AboutForm - + Credits Πιστώσεις - + License Άδεια - + Contribute Συνεισφέρετε @@ -1893,17 +2014,17 @@ έκδοση %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. Αυτό το πρόγραμμα είναι ανοιχτό λογισμικό, μπορείτε να το διανείμετε και/ή να το τροποποιήσετε υπό τους όρους της άδειας 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 @@ -2028,7 +2149,7 @@ Αυτός μας ελευθέρωσε. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2045,7 +2166,7 @@ Το OpenLP έχει γραφτεί και συντηρείται από εθελοντές. Αν θα θέλατε να δείτε περισσότερα δωρεάν Χριστιανικά προγράμματα να υλοποιούνται, παρακαλούμε σκεφτείτε να συνεισφέρετε χρησιμοποιώντας το παρακάτω πλήκτρο. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Πνευματικά Δικαιώματα © 2004-2012 %s @@ -2055,87 +2176,87 @@ OpenLP.AdvancedTab - + UI Settings Επιλογές Διεπαφής - + Number of recent files to display: Αριθμός πρόσφατων αρχείων προς απεικόνιση: - + Remember active media manager tab on startup Θυμήσου την καρτέλα του ενεργού διαχειριστή πολυμέσων κατά την εκκίνηση - + Double-click to send items straight to live Προβολή αντικειμένου άμεσα με διπλό κλικ - + Expand new service items on creation Ανάπτυξη νέων αντικειμένων λειτουργίας κατά την δημιουργία - + Enable application exit confirmation Ενεργοποίηση επιβεβαίωσης κατά την έξοδο - + Mouse Cursor Δείκτης Ποντικιού - + Hide mouse cursor when over display window Απόκρυψη δείκτη ποντικιού από το παράθυρο προβολής - + Default Image Προκαθορισμένη Εικόνα - + Background color: Χρώμα φόντου: - + Image file: Αρχείο εικόνας: - + Open File Άνοιγμα Αρχείου - + Advanced Για προχωρημένους - + Preview items when clicked in Media Manager Προεπισκόπηση αντικειμένων κατά το κλικ στον Διαχειριστή Πολυμέσων - + Click to select a color. Κάντε κλικ για επιλογή χρώματος. - + Browse for an image file to display. Αναζήτηση για αρχείο εικόνας προς προβολή. - + Revert to the default OpenLP logo. Επαναφορά στο προκαθορισμένο λογότυπο του OpenLP. @@ -2147,137 +2268,221 @@ Λειτουργία %Y-%m-%d %H-%M - + Default Service Name Προκαθορισμένη Ονομασία Λειτουργίας - + Enable default service name Ενεργοποίηση Προκαθορισμένης Ονομασίας Λειτουργίας - + Date and Time: Ημερομηνία και Ώρα: - + Monday Δευτέρα - + Tuesday Τρίτη - + Wednesday Τετάρτη - + Thurdsday Πέμπτη - + Friday Παρασκευή - + Saturday Σάββατο - + Sunday Κυριακή - + Now Τώρα - + Time when usual service starts. Συνήθης ώρα έναρξης λειτουργίας. - + Name: Όνομα: - + Consult the OpenLP manual for usage. Συμβουλευτείτε το εγχειρίδιο του OpenLP για την χρήση. - + Revert to the default service name "%s". Επαναφορά στο προκαθορισμένο όνομα λειτουργίας "%s" - + Example: Παράδειγμα: - + X11 X11 - + Bypass X11 Window Manager Παράκαμψη Διαχειριστή Παραθύρων X11 - + Syntax error. Σφάλμα Σύνταξης. + + + Data Location + Τοποθεσία Δεδομένων + + + + Current path: + Τρέχουσα τοποθεσία: + + + + Custom path: + Παραμετροποιημένη τοποθεσία: + + + + Browse for new data file location. + Άνοιγμα περιηγητή για νέα τοποθεσία αρχείων δεδομένων. + + + + Set the data location to the default. + Ορίστε την τοποθεσία δεδομένων στην προκαθορισμένη τοποθεσία. + + + + Cancel + Ακύρωση + + + + Cancel OpenLP data directory location change. + Ακυρώστε την αλλαγή τοποθεσίας του φακέλου δεδομένων του OpenLP. + + + + Copy data to new location. + Αντιγραφή δεδομένων σε νέα τοποθεσία. + + + + Copy the OpenLP data files to the new location. + Αντιγραφή των αρχείων δεδομένων του OpenLP στην νέα τοποθεσία. + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + <strong>ΠΡΟΣΟΧΗ:</strong> Η τοποθεσία του νέου φακέλου δεδομένων περιέχει τα αρχεία δεδομένων του OpenLP. Τα αρχεία αυτά θα αντικατασταθούν κατά την αντιγραφή. + + + + Data Directory Error + Σφάλμα Φακέλου Δεδομένων + + + + Select Data Directory Location + Επιλογή Τοποθεσίας Φακέλου Δεδομένων + + + + Confirm Data Directory Change + Επιβεβαίωση Αλλαγής Φακέλου Δεδομένων + + + + Reset Data Directory + Επαναφορά Φακέλου Δεδομένων + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + Είστε σίγουροι ότι θέλετε να αλλάξετε την τοποθεσία του φακέλου δεδομένων του OpenLP στην προκαθορισμένη τοποθεσία; + +Η τοποθεσία αυτή θα χρησιμοποιηθεί αφού κλείσετε το OpenLP. + + + + Overwrite Existing Data + Αντικατάσταση Υπάρχοντων Δεδομένων + OpenLP.ExceptionDialog - + Error Occurred Παρουσιάστηκε Σφάλμα - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Ωχ! Το OpenLP αντιμετώπισε πρόβλημα και δεν επανήλθε. Το κείμενο στο παρακάτω πλαίσιο περιέχει πληροφορίες που μπορεί να είναι χρήσιμες στους προγραμματιστές του OpenLP, οπότε παρακαλούμε να το στείλετε με e-mail στην διεύθυνση bugs@openlp.org, μαζί με μία λεπτομερή αναφορά του τι κάνατε όταν παρουσιάστηκε το πρόβλημα. - + Send E-Mail Αποστολή E-Mail - + Save to File Αποθήκευση σε Αρχείο - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Παρακαλούμε να περιγράψετε τι κάνατε που προκάλεσε αυτό το πρόβλημα (20 χαρακτήρες τουλάχιστον) - + Attach File Επισύναψη Αρχείου - + Description characters to enter : %s Χαρακτήρες περιγραφής προς εισαγωγή: %s @@ -2285,24 +2490,24 @@ OpenLP.ExceptionForm - + Platform: %s Πλατφόρμα: %s - + Save Crash Report Αποθήκευση Αναφοράς Σφάλματος - + Text files (*.txt *.log *.text) Αρχεία κειμένου (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2333,7 +2538,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2470,17 +2675,17 @@ Προκαθορισμένες Ρυθμίσεις - + Downloading %s... Λήψη %s... - + Download complete. Click the finish button to start OpenLP. Η λήψη ολοκληρώθηκε. Κάντε κλικ στο κουμπί τερματισμού για να ξεκινήσετε το OpenLP. - + Enabling selected plugins... Ενεργοποίηση των επιλεγμένων Πρόσθετων... @@ -2550,32 +2755,32 @@ Αυτός ο οδηγός θα σας βοηθήσει να διαμορφώσετε το OpenLP για αρχική χρήση. Κάντε κλικ στο πλήκτρο Επόμενο παρακάτω για να ξεκινήσετε. - + Setting Up And Downloading Διαμόρφωση Και Λήψη - + Please wait while OpenLP is set up and your data is downloaded. Περιμένετε όσο το OpenLP διαμορφώνεται και γίνεται λήψη των δεδομένων σας. - + Setting Up Διαμόρφωση - + Click the finish button to start OpenLP. Κάντε κλικ στο πλήκτρο τερματισμού για να ξεκινήσετε το OpenLP. - + Download complete. Click the finish button to return to OpenLP. Λήψη ολοκληρώθηκε. Κάντε κλικ στο πλήκτρο τερματισμού για να γυρίσετε στο OpenLP. - + Click the finish button to return to OpenLP. Κάντε κλικ στο πλήκτρο τερματισμού για να γυρίσετε στο OpenLP. @@ -2585,11 +2790,16 @@ Εξατομικευμένες Διαφάνειες + + Finish + Τέλος + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Δεν βρέθηκε σύνδεση στο διαδίκτυο. Ο Οδηγός Πρώτης Εκτέλεσης χρειάζεται σύνδεση στο διαδίκτυο ώστε να κάνει λήψη δειγμάτων τραγουδιών, Βίβλων και θεμάτων. Πιέστε το πλήκτρο τερματισμού τώρα για να ξεκινήσετε το OpenLP με τις αρχικές ρυθμίσεις και χωρίς δείγματα δεδομένων. + Δεν βρέθηκε σύνδεση στο διαδίκτυο. Ο Οδηγός Πρώτης Εκτέλεσης χρειάζεται σύνδεση στο διαδίκτυο ώστε να κάνει λήψη δειγμάτων ύμνων, Βίβλων και θεμάτων. Πιέστε το πλήκτρο τερματισμού τώρα για να ξεκινήσετε το OpenLP με τις αρχικές ρυθμίσεις και χωρίς δείγματα δεδομένων. Για επανεκτέλεση του Οδηγού Πρώτης Εκτέλεσης και εισαγωγή των δειγμάτων δεδομένων σε ύστερη στιγμή, ελέγξτε την σύνδεσή σας στο διαδίκτυο και ξανατρέξτε αυτόν τον οδηγό επιλέγοντας "Εργαλεία/ Επανεκτέλεση Οδηγού Πρώτης Εκτέλεσης" από το OpenLP. @@ -2597,66 +2807,61 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. Για πλήρη ακύρωση του Οδηγού Πρώτης Χρήσης (και μη εκκίνηση του OpenLP), πιέστε το πλήκτρο Άκυρο τώρα. - - - Finish - Τέλος - OpenLP.FormattingTagDialog - + Configure Formatting Tags Ρύθμιση Ετικετών Μορφοποίησης - + Edit Selection Επεξεργασία Επιλογής - + Save Αποθήκευση - + Description Περιγραφή - + Tag Ετικέτα - + Start tag Ετικέτα έναρξης - + End tag Ετικέτα λήξης - + Tag Id ID ετικέτας - + Start HTML Έναρξη HTML - + End HTML Τέλος HTML @@ -2664,32 +2869,32 @@ OpenLP.FormattingTagForm - + Update Error Σφάλμα Ενημέρωσης - + Tag "n" already defined. Η ετικέτα "n" έχει ήδη οριστεί. - + New Tag Νέα Ετικέτα - + <HTML here> <HTML εδώ> - + </and here> </και εδώ> - + Tag %s already defined. Η ετικέτα %s έχει ήδη οριστεί. @@ -2697,82 +2902,82 @@ OpenLP.FormattingTags - + Red Κόκκινο - + Black Μαύρο - + Blue Μπλε - + Yellow Κίτρινο - + Green Πράσινο - + Pink Ροζ - + Orange Πορτοκαλί - + Purple Μωβ - + White Άσπρο - + Superscript Εκθέτης - + Subscript Δείκτης - + Paragraph Παράγραφος - + Bold Έντονη γραφή - + Italics Πλάγια γραφή - + Underline Υπογράμμιση - + Break Διακοπή @@ -2780,180 +2985,170 @@ OpenLP.GeneralTab - + General Γενικά - + Monitors Οθόνες - + Select monitor for output display: Επιλογή οθόνης για προβολή: - + Display if a single screen Εμφάνιση αν υπάρχει μόνο μια οθόνη - + Application Startup Έναρξη Εφαρμογής - + Show blank screen warning Εμφάνιση ειδοποίησης κενής οθόνης - + Automatically open the last service Αυτόματο άνοιγμα της τελευταίας λειτουργίας - + Show the splash screen Εμφάνιση της οθόνης καλωσορίσματος - + Application Settings Ρυθμίσεις Εφαρμογής - + Prompt to save before starting a new service Ερώτηση για αποθήκευση πριν την έναρξη νέας λειτουργίας - + Automatically preview next item in service Αυτόματη προεπισκόπηση του επόμενου αντικειμένου στην λειτουργία - + sec δευτ - + CCLI Details Πληροφορίες CCLI - + SongSelect username: Όνομα χρήστη SongSelect: - + SongSelect password: Κωδικός SongSelect: - + X X - + Y Y - + Height Ύψος - + Width Πλάτος - + Check for updates to OpenLP Έλεγχος για ενημερώσεις του OpenLP - + Unblank display when adding new live item Απευθείας προβολή όταν προστίθεται νέο αντικείμενο - + Timed slide interval: Χρονικό διάστημα διαφάνειας: - + Background Audio Ήχος Υπόβαθρου - + Start background audio paused Εκκίνηση του ήχου υπόβαθρου σε παύση - + Service Item Slide Limits Όρια Διαφάνειας Αντικειμένου Λειτουργίας - - &End Slide - &Τέλος Διαφάνειας - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - Τα βέλη προς τα πάνω και προς τα κάτω σταματούν στην πάνω και κάτω διαφάνεια κάθε Αντικειμένου Λειτουργίας. - - - - &Wrap Slide - &Περιτύλιξη Διαφάνειας + + Override display position: + Αγνόηση θέσης εμφάνισης: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - Τα βέλη προς τα πάνω και προς τα κάτω περιτυλίγουν την πάνω και κάτω διαφάνεια κάθε Αντικειμένου Λειτουργίας. + + Repeat track list + Επανάληψη λίστας κομματιών - - &Next Item - &Επόμενο Τεμάχιο + + Behavior of next/previous on the last/first slide: + Συμπεριφορά επόμενης/προηγούμενης κατά την τελευταία/πρώτη διαφάνεια: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - Τα βέλη επάνω και κάτω προχωρούν στο επόμενο ή προηγούμενο Τεμάχιο Λειτουργίας από τις πάνω και κάτω διαφάνειες κάθε Τεμαχίου Λειτουργίας. + + &Remain on Slide + &Παραμονή στην Διαφάνεια - - Override display position: - Αγνόηση θέσης εμφάνισης: + + &Wrap around + &Περιτύλιξη - - Repeat track list - Επανάληψη λίστας κομματιών + + &Move to next/previous service item + &Μετακίνηση στην επόμενο/προηγούμενο στοιχείο λειτουργίας OpenLP.LanguageManager - + Language Γλώσσα - + Please restart OpenLP to use your new language setting. Παρακαλούμε επανεκκινήστε το OpenLP για να ενεργοποιηθεί η νέα γλώσσα. @@ -2969,287 +3164,287 @@ OpenLP.MainWindow - + &File &Αρχείο - + &Import &Εισαγωγή - + &Export Εξα&γωγή - + &View &Προβολή - + M&ode Λ&ειτουργία - + &Tools &Εργαλεία - + &Settings &Ρυθμίσεις - + &Language &Γλώσσα - + &Help &Βοήθεια - + Media Manager Διαχειριστής Πολυμέσων - + Service Manager Διαχειριστής Λειτουργίας - + Theme Manager Διαχειριστής Θεμάτων - + &New &Νέο - + &Open &Άνοιγμα - + Open an existing service. Άνοιγμα υπάρχουσας λειτουργίας. - + &Save &Αποθήκευση - + Save the current service to disk. Αποθήκευση τρέχουσας λειτουργίας στον δίσκο. - + Save &As... Αποθήκευση &Ως... - + Save Service As Αποθήκευση Λειτουργίας Ως - + Save the current service under a new name. Αποθήκευση τρέχουσας λειτουργίας υπό νέο όνομα. - + E&xit Έ&ξοδος - + Quit OpenLP Έξοδος από το OpenLP - + &Theme &Θέμα - + &Configure OpenLP... &Ρύθμιση του OpenLP... - + &Media Manager &Διαχειριστής Πολυμέσων - + Toggle Media Manager Εναλλαγή Διαχειριστή Πολυμέσων - + Toggle the visibility of the media manager. Εναλλαγή εμφάνισης του διαχειριστή πολυμέσων. - + &Theme Manager Διαχειριστής &Θεμάτων - + Toggle Theme Manager Εναλλαγή Διαχειριστή Θεμάτων - + Toggle the visibility of the theme manager. Εναλλαγή εμφάνισης του διαχειριστή θεμάτων. - + &Service Manager Διαχειριστής &Λειτουργίας - + Toggle Service Manager Εναλλαγή Διαχειριστή Λειτουργίας - + Toggle the visibility of the service manager. Εναλλαγή εμφάνισης του διαχειριστή λειτουργίας. - + &Preview Panel &Οθόνη Προεπισκόπησης - + Toggle Preview Panel Εναλλαγή Οθόνης Προεπισκόπησης - + Toggle the visibility of the preview panel. Εναλλαγή εμφάνισης της οθόνης προεπισκόπησης. - + &Live Panel Οθόνη Π&ροβολής - + Toggle Live Panel Εναλλαγή Οθόνης Προβολής - + Toggle the visibility of the live panel. Εναλλαγή εμφάνισης της οθόνης προβολής. - + &Plugin List &Λίστα Πρόσθετων - + List the Plugins Λίστα των Πρόσθετων - + &User Guide &Οδηγίες Χρήστη - + &About &Σχετικά - + More information about OpenLP Περισσότερες πληροφορίες για το OpenLP - + &Online Help &Online Βοήθεια - + &Web Site &Ιστοσελίδα - + Use the system language, if available. Χρήση της γλώσσας συστήματος, αν διατίθεται. - + Set the interface language to %s Θέστε την γλώσσα σε %s - + Add &Tool... Εργαλείο &Προσθήκης... - + Add an application to the list of tools. Προσθήκη εφαρμογής στην λίστα των εργαλείων. - + &Default &Προκαθορισμένο - + Set the view mode back to the default. Θέστε την προβολή στην προκαθορισμένη. - + &Setup &Εγκατάσταση - + Set the view mode to Setup. Θέστε την προβολή στην Εγκατάσταση. - + &Live &Ζωντανά - + 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/. @@ -3258,108 +3453,108 @@ Μπορείτε να κατεβάσετε την τελευταία έκδοση από το http://openlp.org/. - + OpenLP Version Updated Η έκδοση του OpenLP αναβαθμίστηκε - + OpenLP Main Display Blanked Κύρια Οθόνη του OpenLP Κενή - + The Main Display has been blanked out Η Κύρια Οθόνη εκκενώθηκε - + Default Theme: %s Προκαθορισμένο Θέμα: %s - + English Please add the name of your language here Αγγλικά - + Configure &Shortcuts... Ρύθμιση &Συντομεύσεων... - + Close OpenLP Κλείσιμο του OpenLP - + Are you sure you want to close OpenLP? Είστε σίγουροι ότι θέλετε να κλείσετε το OpenLP; - + Open &Data Folder... Άνοιγμα Φακέλου &Δεδομένων... - + Open the folder where songs, bibles and other data resides. Άνοιγμα του φακέλου που περιέχει τους ύμνους, τις βίβλους και άλλα δεδομένα. - + &Autodetect &Αυτόματη Ανίχνευση - + Update Theme Images Ενημέρωση Εικόνων Θέματος - + Update the preview images for all themes. Ενημέρωση των εικόνων προεπισκόπησης όλων των θεμάτων. - + Print the current service. Εκτύπωση της τρέχουσας λειτουργίας. - + &Recent Files &Πρόσφατα Αρχεία - + L&ock Panels &Κλείδωμα των Πάνελ - + Prevent the panels being moved. Αποτροπή της μετακίνησης των πάνελ. - + Re-run First Time Wizard Επανεκτέλεση Οδηγού Πρώτης Εκτέλεσης - + Re-run the First Time Wizard, importing songs, Bibles and themes. Επανεκτέλεση του Οδηγού Πρώτης Εκτέλεσης, για την εισαγωγή ύμνων, Βίβλων και θεμάτων. - + Re-run First Time Wizard? Επανεκτέλεση Οδηγού Πρώτης Εκτέλεσης; - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3368,43 +3563,43 @@ Η επαντεκτέλεσή του μπορεί να επιφέρει αλλαγές στις τρέχουσες ρυθμίσεις του OpenLP και πιθανότατα να προσθέσει ύμνους στην υπάρχουσα λίστα ύμνων σας και να αλλάξει το προκαθορισμένο θέμα σας. - + Clear List Clear List of recent files Εκκαθάριση Λίστας - + Clear the list of recent files. Εκκαθάριση της λίστας πρόσφατων αρχείων. - + Configure &Formatting Tags... Ρύθμιση Ετικετών &Μορφοποίησης... - + Export OpenLP settings to a specified *.config file Εξαγωγή των ρυθμίσεων το OpenLP σε καθορισμένο αρχείο *.config - + Settings Ρυθμίσεις - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Εισαγωγή ρυθμίσεων του OpenLP από καθορισμένο αρχείο *.config που έχει εξαχθεί προηγουμένως από αυτόν ή άλλον υπολογιστή - + Import settings? Εισαγωγή Ρυθμίσεων; - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3417,45 +3612,50 @@ Η εισαγωγή λανθασμένων ρυθμίσεων μπορεί να προκαλέσει εσφαλμένη συμπεριφορά ή ανώμαλο τερματισμό του OpenLP. - + Open File Άνοιγμα Αρχείου - + OpenLP Export Settings Files (*.conf) Εξαγωγή Αρχείων Ρυθμίσεων του OpenLP (*.conf) - + Import settings Ρυθμίσεις εισαγωγής - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. Το OpenLP θα τερματιστεί. Οι εισηγμένες ρυθμίσεις θα εφαρμοστούν την επόμενη φορά που θα ξεκινήσετε το OpenLP. - + Export Settings File Εξαγωγή Αρχείου Ρυθμίσεων - + OpenLP Export Settings File (*.conf) Εξαγωγή Αρχείων Ρυθμίσεων του OpenLP (*.conf) + + + New Data Directory Error + Σφάλμα Νέου Φακέλου Δεδομένων + OpenLP.Manager - + Database Error Σφάλμα Βάσης Δεδομένων - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3464,7 +3664,7 @@ Βάση Δεδομένων: %s - + OpenLP cannot load your database. Database: %s @@ -3476,74 +3676,74 @@ OpenLP.MediaManagerItem - + No Items Selected Δεν Επιλέχθηκαν Αντικείμενα - + &Add to selected Service Item &Προσθήκη στο επιλεγμένο Αντικείμενο Λειτουργίας - + You must select one or more items to preview. Πρέπει να επιλέξετε ένα ή περισσότερα αντικείμενα για προεπισκόπηση. - + You must select one or more items to send live. Πρέπει να επιλέξετε ένα ή περισσότερα αντικείμενα για προβολή. - + You must select one or more items. Πρέπει να επιλέξετε ένα ή περισσότερα αντικείμενα. - + You must select an existing service item to add to. Πρέπει να επιλέξετε ένα υπάρχον αντικείμενο λειτουργίας στο οποίο να προσθέσετε. - + Invalid Service Item Ακατάλληλο Αντικείμενο Λειτουργίας - + You must select a %s service item. Πρέπει να επιλέξετε ένα %s αντικείμενο λειτουργίας. - + You must select one or more items to add. Πρέπει να επιλέξετε ένα ή περισσότερα αντικείμενα για προσθήκη. - + No Search Results Κανένα Αποτέλεσμα Αναζήτησης - + Invalid File Type Ακατάλληλος Τύπος Αρχείου - + Invalid File %s. Suffix not supported Ακατάλληλο Αρχείο %s. Μη υποστηριζόμενη κατάληξη - + &Clone &Αντιγραφή - + Duplicate files were found on import and were ignored. Κατά την εισαγωγή των αρχείων βρέθηκαν διπλά αρχεία που αγνοήθηκαν. @@ -3551,12 +3751,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. Η ετικέτα <lyrics> απουσιάζει. - + <verse> tag is missing. Η ετικέτα <verse> απουσιάζει. @@ -3564,27 +3764,27 @@ OpenLP.PluginForm - + Plugin List Λίστα Πρόσθετων - + Plugin Details Λεπτομέρειες Πρόσθετου - + Status: Κατάσταση: - + Active Ενεργό - + Inactive Ανενεργό @@ -3607,12 +3807,12 @@ OpenLP.PrintServiceDialog - + Fit Page Πλάτος Σελίδας - + Fit Width Πλάτος Κειμένου @@ -3620,7 +3820,7 @@ OpenLP.PrintServiceForm - + Options Επιλογές @@ -3635,47 +3835,47 @@ Αντιγραφή ως HTML - + Zoom In Μεγέθυνση - + Zoom Out Σμίκρυνση - + Zoom Original Αρχικό Ζουμ - + Other Options Άλλες Επιλογές - + Include slide text if available Συμπερίληψη κειμένου διαφάνειας αν διατίθεται - + Include service item notes Συμπερίληψη σημειώσεων αντικειμένου λειτουργίας - + Include play length of media items Συμπερίληψη διάρκειας των αντικειμένων πολυμέσων - + Add page break before each text item Προσθήκη αλλαγής σελίδας πριν από κάθε αντικείμενο κειμένου - + Service Sheet Σελίδα Λειτουργίας @@ -3685,12 +3885,12 @@ Εκτύπωση - + Title: Τίτλος: - + Custom Footer Text: Εξατομικευμένο Κείμενο Υποσέλιδου: @@ -3698,12 +3898,12 @@ OpenLP.ScreenList - + Screen Οθόνη - + primary Πρωτεύων @@ -3711,12 +3911,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Έναρξη</strong>: %s - + <strong>Length</strong>: %s <strong>Διάρκεια</strong>: %s @@ -3724,7 +3924,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Ανακατανομή Αντικειμένων Λειτουργίας @@ -3732,82 +3932,82 @@ OpenLP.ServiceManager - + Move to &top Μετακίνηση στην &κορυφή - + Move item to the top of the service. Μετακίνηση αντικειμένου στην κορυφή της λειτουργίας. - + Move &up Μετακίνηση &επάνω - + Move item up one position in the service. Μετακίνηση μία θέση επάνω στην λειτουργία. - + Move &down Μετακίνηση κά&τω - + Move item down one position in the service. Μετακίνηση μία θέση κάτω στην λειτουργία. - + Move to &bottom Μετακίνηση στο &τέλος - + Move item to the end of the service. Μετακίνηση στο τέλος της λειτουργίας. - + &Delete From Service &Διαγραφή Από την Λειτουργία - + Delete the selected item from the service. Διαγραφή του επιλεγμένου αντικειμένου από την λειτουργία. - + &Add New Item &Προσθήκη Νέου Αντικειμένου - + &Add to Selected Item &Προσθήκη στο Επιλεγμένο Αντικείμενο - + &Edit Item &Επεξεργασία Αντικειμένου - + &Reorder Item &Ανακατανομή Αντικειμένου - + &Notes &Σημειώσεις - + &Change Item Theme &Αλλαγή Θέματος Αντικειμένου @@ -3829,112 +4029,107 @@ Το αρχείο δεν είναι αρχείο κατάλληλης λειτουργίας. - + 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 Το αντικείμενό σας δεν μπορεί να προβληθεί αφού το πρόσθετο που απαιτείται για την προβολή απουσιάζει ή είναι ανενεργό - + &Expand all &Ανάπτυξη όλων - + Expand all the service items. Ανάπτυξη όλων των αντικειμένων λειτουργίας. - + &Collapse all &Σύμπτυξη όλων - + Collapse all the service items. Σύμπτυξη όλων των αντικειμένων λειτουργίας. - + Open File Άνοιγμα Αρχείου - + Moves the selection down the window. Μετακίνηση της επιλογής κάτω στο παράθυρο. - + Move up Μετακίνηση επάνω - + Moves the selection up the window. Μετακίνηση της επιλογής προς τα πάνω στο παράθυρο. - + Go Live Προβολή - + Send the selected item to Live. Προβολή του επιλεγμένου αντικειμένου. - + &Start Time Ώρα &Έναρξης - + Show &Preview Προβολή &Προεπισκόπησης - - Show &Live - &Προβολή - - - + Modified Service Τροποποιημένη Λειτουργία - + The current service has been modified. Would you like to save this service? Η τρέχουσα λειτουργία έχει τροποποιηθεί. Θέλετε να αποθηκεύσετε ετούτη την λειτουργία; - + Custom Service Notes: Εξατομικευμένες Σημειώσεις Λειτουργίας: - + Notes: Σημειώσεις: - + Playing time: Χρόνος Αναπαραγωγής: - + Untitled Service Ανώνυμη Λειτουργία @@ -3959,17 +4154,17 @@ Φθαρμένο Αρχείο - + Load an existing service. Άνοιγμα υπάρχουσας λειτουργίας. - + Save this service. Αποθήκευση ετούτης της λειτουργίας. - + Select a theme for the service. Επιλέξτε ένα θέμα για την λειτουργία. @@ -3979,7 +4174,7 @@ Αυτό το αρχείο είναι είτε φθαρμένο είτε δεν είναι αρχείο λειτουργίας του OpenLP 2.0. - + Service File Missing Απουσία Αρχείου Λειτουργίας @@ -4003,11 +4198,21 @@ Service copy only Επεξεργασία αντιγράφου μόνο + + + Error Saving File + Σφάλμα Αποθήκευσης Αρχείου + + + + There was an error saving your file. + Υπήρξε σφάλμα κατά την αποθήκευση του αρχείου σας. + OpenLP.ServiceNoteForm - + Service Item Notes Σημειώσεις Αντικειμένου Λειτουργίας @@ -4023,67 +4228,67 @@ OpenLP.ShortcutListDialog - + Action Ενέργεια - + Shortcut Συντόμευση - + Duplicate Shortcut Αντίγραφο Συντόμευσης - + The shortcut "%s" is already assigned to another action, please use a different shortcut. Η συντόμευση "%s" έχει ήδη ανατεθεί σε άλλη ενέργεια, παρακαλούμε χρησιμοποιήστε διαφορετική συντόμευση. - + Alternate Εναλλακτική - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Επιλέξτε μια ενέργεια και πιέστε ένα από τα παρακάτω πλήκτρα για να ξεκινήσετε την καταγραφή μιας κύριας ή εναλλακτικής συντόμευσης, αντίστοιχα. - + Default Προκαθορισμένο - + Custom Εξατομικευμένο - + Capture shortcut. Καταγραφή συντόμευσης. - + Restore the default shortcut of this action. Αποκατάσταση της προκαθορισμένης συντόμευσης αυτής της ενέργειας. - + Restore Default Shortcuts Αποκατάσταση Προκαθορισμένων Συντομεύσεων - + Do you want to restore all shortcuts to their defaults? Θέλετε να αποκαταστήσετε όλες τις συντομεύσεις στις προκαθορισμένες; - + Configure Shortcuts Ρύθμιση Συντομεύσεων @@ -4091,177 +4296,172 @@ OpenLP.SlideController - + Hide Απόκρυψη - + Go To Μετάβαση - + Blank Screen Κενή Οθόνη - + Blank to Theme Προβολή Θέματος - + Show Desktop Εμφάνιση Επιφάνειας Εργασίας - + Previous Service Προηγούμενη Λειτουργία - + Next Service Επόμενη Λειτουργία - + Escape Item Αποφυγή Αντικειμένου - + Move to previous. Μετακίνηση στο προηγούμενο. - + Move to next. Μετακίνηση στο επόμενο. - + Play Slides Αναπαραγωγή Διαφανειών - + Delay between slides in seconds. Καθυστέρηση μεταξύ διαφανειών σε δευτερόλεπτα. - + Move to live. Μεταφορά σε προβολή. - + Add to Service. Προσθήκη στην Λειτουργία. - + Edit and reload song preview. Επεξεργασία και επαναφόρτωση προεπισκόπισης ύμνου. - + Start playing media. Έναρξη αναπαραγωγής πολυμέσων. - + Pause audio. Παύση ήχου. - + Pause playing media. Παύση αναπαραγωγής πολυμέσων. - + Stop playing media. Σταμάτημα αναπαργωγής πολυμέσων. - + Video position. Θέση Video. - + Audio Volume. Ένταση Ήχου. - + Go to "Verse" Πήγαινε στην "Στροφή" - + Go to "Chorus" Πήγαινε στην "Επωδό" - + Go to "Bridge" Πήγαινε στην "Γέφυρα" - + Go to "Pre-Chorus" Πήγαινε στην "Προ-Επωδό" - + Go to "Intro" Πήγαινε στην "Εισαγωγή" - + Go to "Ending" Πήγαινε στο"Τέλος" - + Go to "Other" Πήγαινε στο "Άλλο" - + Previous Slide Προηγούμενη Διαφάνεια - + Next Slide Επόμενη Διαφάνεια - + Pause Audio Κομμάτι σε Αναμονή - + Background Audio Κομμάτι Φόντου - - Next Track - Επόμενο Κομμάτι - - - + Go to next audio track. Μετάβαση στο επόμενο κομμάτι. - + Tracks Κομμάτια @@ -4337,17 +4537,17 @@ Ο χρόνος έναρξης έχει τεθεί μετά το πέρας του αντικειμένου πολυμέσων - + Theme Layout Σχέδιο Θέματος - + The blue box shows the main area. Το μπλε κουτί δείχνει την κύρια περιοχή. - + The red box shows the footer. Το κόκκινο κουτί δείχνει το υποσέλιδο. @@ -4355,32 +4555,32 @@ OpenLP.ThemeForm - + Select Image Επιλογή Εικόνας - + Theme Name Missing Ονομασία Θέματος Απουσιάζει - + There is no name for this theme. Please enter one. Δεν υπάρχει ονομασία για αυτό το θέμα. Εισάγετε ένα όνομα. - + Theme Name Invalid Ακατάλληλο Όνομα Θέματος - + Invalid theme name. Please enter one. Ακατάλληλο όνομα θέματος. Εισάγετε ένα όνομα. - + (approximately %d lines per slide) (περίπου %d γραμμές ανά διαφάνεια) @@ -4388,193 +4588,193 @@ OpenLP.ThemeManager - + Create a new theme. Δημιουργία νέου θέματος. - + Edit Theme Επεξεργασία Θέματος - + Edit a theme. Επεξεργασία ενός θέματος. - + Delete Theme Διαγραφή Θέματος - + Delete a theme. Διαγραφή ενός θέματος. - + Import Theme Εισαγωγή Θέματος - + Import a theme. Εισαγωγή ενός θέματος. - + Export Theme Εξαγωγή Θέματος - + Export a theme. Εξαγωγή ενός θέματος. - + &Edit Theme &Επεξεργασία Θέματος - + &Delete Theme &Διαγραφή Θέματος - + Set As &Global Default Ορισμός Ως &Γενικής Προεπιλογής - + %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 χρησιμοποιείται στο πρόσθετο %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. Το αρχείο δεν αποτελεί έγκυρο θέμα. - + &Copy Theme &Αντιγραφή Θέματος - + &Rename Theme &Μετονομασία Θέματος - + &Export Theme &Εξαγωγή Θέματος - + 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) - + Copy of %s Copy of <theme name> Αντιγραφή του %s - + Theme Already Exists Ήδη Υπαρκτό Θέμα @@ -4582,272 +4782,272 @@ OpenLP.ThemeWizard - + Theme Wizard Οδηγός Θεμάτων - + Welcome to the Theme Wizard Καλωσορίσατε στον Οδηγό Θεμάτων - + Set Up Background Καθορισμός Φόντου - + Set up your theme's background according to the parameters below. Καθορίστε το φόντο του θέματός σας σύμφωνα με τις παρακάτω παραμέτρους. - + Background type: Τύπος φόντου: - + Solid Color Συμπαγές Χρώμα - + Gradient Διαβάθμιση - + Color: Χρώμα: - + Gradient: Διαβάθμιση: - + Horizontal Οριζόντια - + Vertical Κάθετα - + Circular Κυκλικά - + Top Left - Bottom Right Πάνω Αριστερά - Κάτω Δεξιά - + Bottom Left - Top Right Κάτω Αριστερά - Πάνω Δεξιά - + Main Area Font Details Λεπτομέρειες Γραμματοσειράς Κύριας Περιοχής - + Define the font and display characteristics for the Display text Καθορίστε την γραμματοσειρά και τα χαρακτηριστικά προβολής του κειμένου Προβολής - + Font: Γραμματοσειρά: - + Size: Μέγεθος: - + Line Spacing: Διάκενο: - + &Outline: &Περίγραμμα: - + &Shadow: &Σκίαση: - + Bold Έντονη γραφή - + Italic Πλάγια Γραφή - + Footer Area Font Details Λεπτομέρειες Γραμματοσειράς Υποσέλιδου - + Define the font and display characteristics for the Footer text Καθορίστε την γραμματοσειρά και τα χαρακτηριστικά προβολής για το κείμενο Υποσέλιδου - + Text Formatting Details Λεπτομέρειες Μορφοποίησης Κειμένου - + Allows additional display formatting information to be defined Επιτρέπει να καθοριστούν πρόσθετες λεπτομέρειες μορφοποίησης προβολής - + Horizontal Align: Οριζόντια Ευθυγράμμιση: - + Left Αριστερά - + Right Δεξιά - + Center Κέντρο - + Output Area Locations Τοποθεσία Περιοχών Προβολής - + Allows you to change and move the main and footer areas. Επιτρέπει την αλλαγή και μετακίνηση της κύριας περιοχής και του υποσέλιδου. - + &Main Area &Κύρια Περιοχή - + &Use default location &Χρήση Προκαθορισμένης Θέσης - + X position: Θέση X: - + px px - + Y position: Θέση Y: - + Width: Πλάτος: - + Height: Ύψος: - + Use default location Χρήση προκαθορισμένης θέσης - + Save and Preview Αποθήκευση και Προεπισκόπηση - + View the theme and save it replacing the current one or change the name to create a new theme Δείτε το θέμα και αποθηκεύστε το αντικαθιστώντας το τρέχων θέμα ή αλλάξτε το όνομά του δημιουργώντας νέο θέμα - + Theme name: Όνομα θέματος: - + Edit Theme - %s Επεξεργασία Θέματος - %s - + 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: Μεταβάσεις: - + &Footer Area Περιοχή &Υποσέλιδου - + Starting color: Χρώμα έναρξης: - + Ending color: Χρώμα τερματισμού: - + Background color: Χρώμα φόντου: - + Justify Ευθυγράμμιση - + Layout Preview Προεπισκόπηση Σχεδίου - + Transparent Διαφανές @@ -4855,47 +5055,47 @@ OpenLP.ThemesTab - + Global Theme Καθολικό Θέμα - + Theme Level Επίπεδο Θέματος - + S&ong Level Επίπεδο &Ύμνου - + 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 Επίπεδο &Λειτουργίας - + 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. Χρήση του θέματος της λειτουργίας, παρακάμπτοντας τα θέματα των ύμνων. Αν η λειτουργία δεν έχει θέμα, θα χρησιμοποιηθεί το καθολικό θέμα. - + &Global Level &Καθολικό Επίπεδο - + Use the global theme, overriding any themes associated with either the service or the songs. Χρήση του καθολικού θέματος, παρακάμπτοντας όλα τα υπόλοιπα θέματα λειτουργίας ή ύμνων. - + Themes Θέματα @@ -4979,239 +5179,239 @@ pt - + Image Εικόνα - + Import Εισαγωγή - + Live Ζωντανά - + Live Background Error Σφάλμα Φόντου Προβολής - + 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.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Προεπισκόπηση - + Replace Background Αντικατάσταση Φόντου - + Reset 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 Έκδοση - + Delete the selected item. Διαγραφή επιλεγμένου αντικειμένου. - + Move selection up one position. Μεταφορά επιλογής μία θέση επάνω. - + Move selection down one position. Μεταφορά επιλογής μία θέση κάτω. - + &Vertical Align: &Κάθετη Ευθυγράμμιση: - + Finished import. Τέλος εισαγωγής. - + Format: Μορφή: - + Importing Εισαγωγή - + Importing "%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. Ο εισαγωγέας του openlp.org 1.x έχει απενεργοποιηθεί εξαιτίας απόντος module του python. Αν θέλετε να χρησιμοποιήσετε αυτόν τον εισαγωγέα, θα χρειαστεί να εγκαταστήσετε το module "python-sqllite". - + Open %s File Άνοιγμα %s Αρχείου - + %p% %p% - + Ready. Έτοιμο. - + Starting import... Έναρξη εισαγωγής... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong Πρέπει να καθορίσετε τουλάχιστον ένα %s αρχείο από το οποίο να γίνει εισαγωγή. @@ -5227,7 +5427,7 @@ Καλωσορίσατε στον Οδηγό Εξαγωγής Ύμνου - + Welcome to the Song Import Wizard Καλωσορίσατε στον Οδηγό Εισαγωγής Ύμνου @@ -5315,53 +5515,53 @@ ω - + Layout style: Στυλ σχεδίου: - + Live Toolbar Εργαλειοθήκη Προβολής - + m The abbreviated unit for minutes λ - + OpenLP is already running. Do you wish to continue? Το OpenLP ήδη εκτελείται. Θέλετε να συνεχίσετε; - + Settings Ρυθμίσεις - + Tools Εργαλεία - + Unsupported File Μη Υποστηριζόμενο Αρχείο - + Verse Per Slide Εδάφιο Ανά Διαφάνεια - + Verse Per Line Εδάφιο Ανά Γραμμή - + View Προβολή @@ -5376,42 +5576,37 @@ Συντακτικό λάθος XML - + View Mode Λειτουργία Προβολής - + Open service. Άνοιγμα λειτουργίας. - + Print Service Εκτύπωση Λειτουργίας - + Replace live background. Αντικατάσταση του προβαλλόμενου φόντου. - + Reset live background. Επαναφορά προβαλλόμενου φόντου. - - &Split - &Διαίρεση - - - + Split a slide into two only if it does not fit on the screen as one slide. Διαίρεση μιας διαφάνειας σε δύο μόνο αν δεν χωρά στην οθόνη ως μια διαφάνεια. - + Welcome to the Bible Upgrade Wizard Καλωσορίσατε στον Οδηγό Αναβάθμισης Βίβλου @@ -5421,53 +5616,105 @@ Επιβεβαίωση Διαγραφής - + Play Slides in Loop Αναπαραγωγή Διαφανειών Κυκλικά - + Play Slides to End Αναπαραγωγή Διαφανειών έως Τέλους - + Stop Play Slides in Loop Τερματισμός Κυκλικής Αναπαραγωγής Διαφανειών - + Stop Play Slides to End Τερματισμός Αναπαραγωγής Διαφανειών έως Τέλους - + Next Track Επόμενο Κομμάτι + + + Search Themes... + Search bar place holder text + Αναζήτηση Θεμάτων... + + + + Optional &Split + Προαιρετικός &Διαχωρισμός + + + + Invalid Folder Selected + Singular + Επιλέχθηκε Ακατάλληλος Φάκελος + + + + Invalid File Selected + Singular + Επιλέχθηκε Ακατάλληλο Αρχείο + + + + Invalid Files Selected + Plural + Επιλέχθηκαν Ακατάλληλα Αρχεία + + + + No Folder Selected + Singular + Δεν Επιλέχτηκε Φάκελος + + + + Open %s Folder + Άνοιγμα %s Φακέλου + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + Πρέπει να καθορίσετε ένα %s αρχείο από το οποίο να γίνει εισαγωγή. + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + Πρέπει να καθορίσετε έναν %s φάκελο από τον οποίο θα γίνει εισαγωγή. + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 και %2 - + %1, and %2 Locale list separator: end %1, και %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5476,50 +5723,50 @@ PresentationPlugin - + <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>Πρόσθετο Παρουσιάσεων</strong><br />Το πρόσθετο παρουσιάσεων παρέχει την δυνατότητα να εμφανίζονται παρουσιάσεις με χρήση μιας σειράς διαφορετικών προγραμμάτων. Η επιλογή από τα διαθέσιμα προγράμματα είναι δυνατή στον χρήστη μέσω σχετικής λίστας. - + Presentation name singular Παρουσίαση - + Presentations name plural Παρουσιάσεις - + Presentations container title Παρουσιάσεις - + Load a new presentation. Φόρτωση νέας παρουσίασης. - + Delete the selected presentation. Διαγραφή επιλεγμένης παρουσίασης. - + Preview the selected presentation. Προεπισκόπηση επιλεγμένης παρουσίασης. - + Send the selected presentation live. Προβολή της επιλεγμένης παρουσίασης. - + Add the selected presentation to the service. Πρόσθεση της επιλεγμένης παρουσίασης στην λειτουργία. @@ -5527,70 +5774,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Επιλογή Παρουσίασης (-εων) - + Automatic Αυτόματο - + Present using: Παρουσίαση με χρήση: - + File Exists Ήδη Υπάρχον Αρχείο - + A presentation with that filename already exists. Ήδη υπάρχει παρουσίαση με αυτό το όνομα. - + This type of presentation is not supported. Αυτός ο τύπος παρουσίασης δεν υποστηρίζεται. - + Presentations (%s) Παρουσιάσεις (%s) - + Missing Presentation Απούσα Παρουσίαση - - The Presentation %s no longer exists. - Η Παρουσίαση %s δεν υπάρχει πλέον. + + The presentation %s is incomplete, please reload. + Η παρουσίαση %s είναι ατελής, παρακαλούμε φορτώστε την ξανά. - - The Presentation %s is incomplete, please reload. - Η Παρουσίαση %s είναι ημιτελής, παρακαλούμε επαναφορτώστε. + + The presentation %s no longer exists. + Η παρουσίαση %s δεν υπάρχει πλέον. PresentationPlugin.PresentationTab - + Available Controllers Διαθέσιμοι Ελεγκτές - + %s (unavailable) %s (μη διαθέσιμο) - + Allow presentation application to be overridden Επιτρέψτε την παράκαμψη του προγράμματος παρουσίασης @@ -5624,135 +5871,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote Τηλεχειρισμός OpenLP 2.0 - + OpenLP 2.0 Stage View Προβολή Πίστας OpenLP 2.0 - + Service Manager Διαχειριστής Λειτουργίας - + Slide Controller Ελεγκτής Διαφανειών - + Alerts Ειδοποιήσεις - + Search Αναζήτηση - - Back - Πίσω - - - + Refresh Ανανέωση - + Blank Κενή - + Show Προβολή - + Prev Προήγ - + Next Επόμ - + Text Κείμενο - + Show Alert Εμφάνιση Ειδοποίησης - + Go Live Μετάβαση σε Προβολή - + No Results Κανένα Αποτέλεσμα - + Options Επιλογές - + Add to Service Προσθήκη στην Λειτουργία + + + Home + Αρχική Σελίδα + + + + Theme + Θέμα + + + + Desktop + Επιφάνεια Εργασίας + + + + Add &amp; Go to Service + Προσθήκη &amp; Μετάβαση στην Λειτουργία + RemotePlugin.RemoteTab - + Serve on IP address: Εξυπηρέτηση στην διεύθυνση IP: - + Port number: Αριθμός θύρας: - + Server Settings Επιλογές Εξυπηρετητή - + Remote URL: Απομακρυσμένη URL: - + Stage view URL: URL Προβολής πίστας: - + Display stage time in 12h format Εμφάνιση χρόνου πίστας σε 12ωρη μορφή - + Android App Εφαρμογή Android - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Σκανάρετε τον κώδικα QR ή κάντε κλικ στο <a href="https://market.android.com/details?id=org.openlp.android">download</a> για να εγκαταστήσετε την εφαρμογή για Android από το Κατάστημα. @@ -5760,85 +6022,85 @@ SongUsagePlugin - + &Song Usage Tracking &Παρακολούθηση Χρήσης Ύμνων - + &Delete Tracking Data &Διαγραφή Δεδομένων Παρακολούθησης - + Delete song usage data up to a specified date. Διαγραφή των δεδομένων χρήσης έως μια καθορισμένη ημερομηνία. - + &Extract Tracking Data &Εξαγωγή Δεδομένων Παρακολούθησης - + Generate a report on song usage. Παραγωγή αναφοράς για την χρήση ύμνων. - + Toggle Tracking Εναλλαγή Παρακολούθησης - + Toggle the tracking of song usage. Εναλλαγή της παρακολούθησης της χρήσης ύμνων. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Πρόσθετο Παρακολούθησης Ύμνων</strong><br />Αυτό το πρόσθετο παρακολουθε'ι την χρήση των ύμνων στις λειτουργίες. - + SongUsage name singular Χρήση Ύμνου - + SongUsage name plural Χρήση Ύμνων - + SongUsage container title Χρήση Ύμνων - + Song Usage Χρήση Ύμνων - + Song usage tracking is active. Η παρακολούθηση της χρήσης Ύμνων είναι ενεργή. - + Song usage tracking is inactive. Η παρακολούθηση της χρήσης Ύμνων είναι ανενεργή. - + display εμφάνιση - + printed εκτυπώθηκε @@ -5846,7 +6108,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Διαγραφή Δεδομένων Χρήσης Ύμνων @@ -5871,7 +6133,7 @@ Όλα τα απαιτούμενα δεδομένα έχουν διαγραφεί επιτυχώς. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Επιλέξτε την ημερομηνία έως την οποία τα δεδομένα χρησης ύμνων θα πρέπει να διαγραφούν. Όλα τα δεδομένα πριν από αυτήν την ημερομηνία θα διαγραφούν οριστικά. @@ -5879,42 +6141,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Εξαγωγή Χρήσης Ύμνων - + Select Date Range Επιλέξτε Χρονική Περίοδο - + to έως - + Report Location Αναφέρατε Τοποθεσία - + Output File Location Τοποθεσία Εξαγωγής Αρχείου - + usage_detail_%s_%s.txt usage_detail_%s_%s.txt - + Report Creation Δημιουργία Αναφοράς - + Report %s has been successfully created. @@ -5923,12 +6185,12 @@ έχει δημιουργηθεί επιτυχώς. - + Output Path Not Selected Δεν Επιλέχθηκε Τοποθεσία Εξαγωγής - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. Δεν θέσατε έγκυρη τοποθεσία για την εξαγωγή της αναφοράς χρήσης ύμνων. Παρακαλούμε επιλέξτε μια υπάρχουσα τοποθεσία στον υπολογιστή σας. @@ -5966,82 +6228,82 @@ Ανακατομή Ύμνων... - + Arabic (CP-1256) Αραβικά (CP-1256) - + Baltic (CP-1257) Βαλτική (CP-1257) - + Central European (CP-1250) Κεντρικής Ευρώπης (CP-1250) - + Cyrillic (CP-1251) Κυριλλικά (CP-1251) - + Greek (CP-1253) Ελληνικά (CP-1253) - + Hebrew (CP-1255) Εβραϊκά (CP-1255) - + Japanese (CP-932) Ιαπωνέζικα (CP-932) - + Korean (CP-949) Κορεάτικα (CP-949) - + Simplified Chinese (CP-936) Απλοποιημένα Κινέζικα (CP-936) - + Thai (CP-874) Τάυ (CP-874) - + Traditional Chinese (CP-950) Παραδοσιακά Κινέζικα (CP-950) - + Turkish (CP-1254) Τούρκικα (CP-1254) - + Vietnam (CP-1258) Βιετναμέζικα (CP-1258) - + Western European (CP-1252) Δυτικής Ευρώπης (CP-1252) - + Character Encoding Κωδικοποίηση Χαρακτήρων - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6050,26 +6312,26 @@ Συνήθως είστε εντάξει με την προεπιλεγμένη κωδικοσελίδα. - + Please choose the character encoding. The encoding is responsible for the correct character representation. Παρακαλούμε επιλέξτε την κωδικοποίηση των χαρακτήρων. Η κωδικοποιήση ειναι υπεύθυνη για την ορθή εμφάνιση των χαρακτήρων. - + Song name singular Ύμνος - + Songs name plural Ύμνοι - + Songs container title Ύμνοι @@ -6080,32 +6342,32 @@ Εξαγωγή ύμνων με χρήση του οδηγού εξαγωγής. - + 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. Προσθήκη του επιλεγμένου ύμνου στην λειτουργία. @@ -6133,17 +6395,17 @@ Επίθετο: - + You need to type in the first name of the author. Πρέπει να εισάγετε το όνομα του συγγραφέα. - + You need to type in the last name of the author. Πρέπει να εισάγετε το επίθετο του συγγραφέα. - + You have not set a display name for the author, combine the first and last names? Δεν δηλώσατε εμφανιζομενο όνομα συγγραφέα, να συνδυαστούν όνομα και επίθετο; @@ -6174,209 +6436,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Meta Data + + + + Custom Book Names + Παραμετροποιημένα Ονόματα Βιβλίων + + + SongsPlugin.EditSongForm - + Song Editor Επεξεργασία Ύμνων - + &Title: &Τίτλος: - + Alt&ernate title: &Εναλλαγή τίτλου: - + &Lyrics: &Στίχοι: - + &Verse order: Σειρά &Στροφών: - + Ed&it All Ε&πεξεργασία Όλων - + Title && Lyrics Τίτλος && Στίχοι - + &Add to Song &Προσθήκη στον Ύμνο - + &Remove &Αφαίρεση - + &Manage Authors, Topics, Song Books &Διαχείριση Συγγραφέων, Θεμάτων, Βιβλίων Ύμνων - + A&dd to Song Προ&σθήκη στον Ύμνο - + R&emove Αφαίρεσ&η - + Book: Βιβλίο: - + Number: Αριθμός: - + Authors, Topics && Song Book Συγγραφεις, Θέματα && Βιβλία Ύμνων - + New &Theme Νέο &Θέμα - + Copyright Information Πληροφορίες Πνευματικών Δικαιωμάτων - + Comments Σχόλια - + Theme, Copyright Info && Comments Θέμα, Πληροφορίες Πνευματικών Δικαιωμάτων && Σχόλια - + Add Author Προσθήκη Συγγραφέα - + This author does not exist, do you want to add them? Αυτός ο συγγραφέας δεν υπάρχει, θέλετε να τον προσθέσετε; - + This author is already in the list. Αυτός ο συγγραφέας είναι ήδη στην λίστα. - + 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. Δεν επιλέξατε έγκυρο συγγραφέα. Είτε επιλέξτε έναν συγγραφέα από την λίστα, είτε πληκτρολογείστε έναν νέο συγγραφέα και πιέστε "Προσθήκη Συγγραφέα στον Ύμνο" για να προσθέσετε τον νέο συγγραφέα. - + Add Topic Προσθήκη Κατηγορίας - + This topic does not exist, do you want to add it? Η κατηγορία δεν υπάρχει, θέλετε να την προσθέσετε; - + This topic is already in the list. Η κατηγορία υπάρχει ήδη στην λίστα. - + 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. Πρέπει να δώσετε έναν τίτλο στον ύμνο. - + You need to type in at least one verse. Πρέπει να πληκτρολογήσετε τουλάχιστον ένα εδάφιο. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. Η σειρά των εδαφίων δεν είναι έγκυρη. Δεν υπάρχει εδάφιο αντίστοιχο στο %s. Έγκυρες καταχωρήσεις είναι οι %s. - + Add Book Προσθήκη Βιβλίου - + This song book does not exist, do you want to add it? Αυτό το βιβλίο ύμνων δεν υπάρχει, θέλετε να το προσθέσετε; - + You need to have an author for this song. Πρέπει να έχετε έναν συγγραφέα για αυτόν τον ύμνο. - + You need to type some text in to the verse. Πρέπει να πληκτρολογήσετε λίγο κείμενο στο εδάφιο. - + Linked Audio Συνδεδεμένος Ήχος - + Add &File(s) Προσθήκη &Αρχείου(-ων) - + Add &Media Προσθήκη &Πολυμέσων - + Remove &All &Αφαίρεση Όλων - + Open File(s) Άνοιγμα Αρχείου(-ων) - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Προειδοποίηση:</strong> Δεν χρησιμοποιούνται όλα τα εδάφια. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. Η σειρά εδαφίων είναι ακατάλληλη. Δεν υπάρχουν εδάφια που να αντιστοιχούν στο %s. Κατάλληλες καταχωρήσεις είναι %s. @@ -6490,130 +6765,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Επιλέξτε Αρχεία Εγγράφων/Παρουσιάσεων - + 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. Ο οδηγός αυτος θα σας βοηθήσει να εισάγετε ύμνους διαφόρων μορφών. Κάντε κλικ στο κουμπί "επόμενο" παρακάτω για να ξεκινήσετε την διαδικασία επιλέγοντας την μορφή από την οποία θέλετε να εισάγετε. - + Generic Document/Presentation Γενικό Έγγραφο/Παρουσίαση - - Filename: - Όνομα Αρχείου: - - - - 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. - Το OpenLyrics δεν έχει ακόμη αναπτυχθεί, αλλά όπως βλέπετε, επιδιώκουμε να το πραγματοποιήσουμε. Ελπίζουμε να είναι διαθέσιμο στην επόμενη έκδοση. - - - + Add Files... Προσθήκη Αρχειων... - + Remove File(s) Αφαιρεση Αρχείων - + Please wait while your songs are imported. Παρακαλούμε περιμένετε όσο οι ύμνοι σας εισάγονται. - + OpenLP 2.0 Databases Βάσεις Δεδομένων OpenLP 2.0 - + openlp.org v1.x Databases Βάσεις Δεδομένων openlp.org v 1.x - + Words Of Worship Song Files Αρχεία Ύμνων Words Of Worship - - You need to specify at least one document or presentation file to import from. - Πρέπει να ορισετε τουλάχιστον ένα έγγραφο ή παρουσίαση από το οποίο να γίνει εισαγωγή. - - - + Songs Of Fellowship Song Files Αρχεία Ύμνων Songs Of Fellowship - + SongBeamer Files Αρχεία SongBeamer - + SongShow Plus Song Files Αρχεία Ύμνων SongShow Plus - + Foilpresenter Song Files Αρχεία Ύμνων Foilpresenter - + Copy Αντιγραφή - + Save to File Αποθήκευση στο Αρχείο - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Η εισαγωγή αρχείων τύπου Songs of Fellowship έχει απενεργοποιηθεί επειδή το OpenLP δεν έχει προσβαση στο OpenOffice ή το Libreoffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Η εισαγωγή αρχείων γενικού τύπου έχει απενεργοποιηθεί επειδή το OpenLP δεν έχει προσβαση στο OpenOffice ή το Libreoffice. - + OpenLyrics or OpenLP 2.0 Exported Song Ύμνος εξηγμένος από το OpenLyrics ή το OpenLP 2.0 - + OpenLyrics Files Αρχεία OpenLyrics + + + CCLI SongSelect Files + Αρχεία CCLI SongSelect + + + + EasySlides XML File + Αρχείο EasySlides XML + + + + EasyWorship Song Database + Βάση Δεδομένων Ύμνων EasyWorship + + + + DreamBeam Song Files + Αρχεία Ύμνων DreamBeam + + + + You need to specify a valid PowerSong 1.0 database folder. + Πρέπει να καθορίσετε έναν έγκυρο φάκελο βάσης δεδομένων του PowerSong 1.0. + + + + ZionWorx (CSV) + ZionWorx (CSV) + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + Πρώτα μετατρέψτε την βάση δεδομένων του ZionWorx σε αρχείο κειμένου CSV, όπως περιγράφεται στο <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + SongsPlugin.MediaFilesForm - + Select Media File(s) Επιλογή Αρχείων Πολυμέσων - + Select one or more audio files from the list below, and click OK to import them into this song. Επιλέξτε ένα ή περισσοτερα αρχεία ήχου από την παρακάτω λίστα και κάντε κλικ στο OK για να τα εισάγετε σε αυτόν τον ύμνο. @@ -6621,27 +6916,27 @@ SongsPlugin.MediaItem - + Titles Τίτλοι - + Lyrics Στίχοι - + CCLI License: Άδεια CCLI: - + Entire Song Ολόκληρος Ύμνος - + Are you sure you want to delete the %n selected song(s)? Είστε σίγουροι ότι θέλετε να διαγράψετε τον %n επιλεγμένο ύμνο; @@ -6649,16 +6944,41 @@ - + Maintain the lists of authors, topics and books. Διατήρηση της λίστας συγγραφέων, θεμάτων και βιβλίων. - + copy For song cloning αντιγραφή + + + Search Titles... + Αναζήτηση Τίτλων... + + + + Search Entire Song... + Αναζήτηση Ολόκληρου Ύμνου... + + + + Search Lyrics... + Αναζήτηση Στίχων... + + + + Search Authors... + Αναζήτηση Συγγραφέων... + + + + Search Song Books... + Αναζήτηση Βιβλίων Ύμνων... + SongsPlugin.OpenLP1SongImport @@ -6685,6 +7005,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + Κανένας ύμνος προς εισαγωγή. + + + + Verses not found. Missing "PART" header. + Δεν βρέθηκαν εδάφια. Απουσιάζει η κεφαλίδα "PART". + + + SongsPlugin.SongBookForm @@ -6723,12 +7056,12 @@ SongsPlugin.SongImport - + copyright πνευματικά δικαιώματα - + The following songs could not be imported: Τα ακόλουθα τραγούδια δεν εισήχθηκαν: @@ -6749,117 +7082,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Η εισαγωγή του ύμνου σας απέτυχε. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Ο συγγραφέας σας δεν προστέθηκε. - + This author already exists. Ο συγγραφέας ήδη υπάρχει. - + Could not add your topic. Δεν προστέθηκε η κατηγορία σας. - + This topic already exists. Η κατηγορία υπάρχει ήδη. - + Could not add your book. Το βιβλίο σας δεν προστέθηκε. - + This book already exists. Αυτό το βιβλίο ήδη υπάρχει. - + Could not save your changes. Οι αλλαγές σαν δεν αποθηκεύτηκαν. - + Could not save your modified author, because the author already exists. Ο συγγραφέας σας δεν αποθηκεύτηκε, επειδή υπάρχει ήδη. - + Could not save your modified topic, because it already exists. Η τροποποιημένη κατηγορία σας δεν αποθηκεύτηκε, επειδή υπάρχει ήδη. - + Delete Author Διαγραφή Συγγραφέα - + Are you sure you want to delete the selected author? Σίγουρα θέλετε να διαγράψετε τον επιλεγμένο συγγραφέα; - + This author cannot be deleted, they are currently assigned to at least one song. Αυτός ο συγγραφέας δεν μπορεί να διαγραφεί, είναι συνδεδεμένος με τουλάχιστον έναν ύμνο. - + Delete Topic Διαγραφή Κατηγορίας - + Are you sure you want to delete the selected topic? Σίγουρα θέλετε να διαγράψετε την επιλεγμένη κατηγορία; - + This topic cannot be deleted, it is currently assigned to at least one song. Η κατηγορία δεν μπορεί να διαγραφεί, είναι συνδεδεμένη με τουλάχιστον έναν ύμνο. - + Delete Book Διαγραφή Βιβλίου - + Are you sure you want to delete the selected book? Σίγουρα θέλετε να διαγράψετε το επιλεγμένο βιβλίο; - + 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; - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %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; @@ -6867,29 +7192,29 @@ SongsPlugin.SongsTab - + Songs Mode Λειτουργία Ύμνων - + Enable search as you type Ενεργοποίηση αναζήτησης κατά την πληκτρολόγηση - + Display verses on live tool bar Προβολή των εδαφίων στην εργαλειοθήκη προβολής - + Update service from song edit Ενημέρωση λειτουργίας από την επεξεργασία ύμνων - - Add missing songs when opening service - Προσθήκη απόντων ύμνων κατά το άνοιγμα τις λειτουργίας + + Import missing songs from service files + Εισαγωγή απόντων ύμνων από αρχεία λειτουργίας @@ -6948,4 +7273,17 @@ Άλλο + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Σφάλμα κατά την ανάγνωση του αρχείου CSV. + + + + File not valid ZionWorx CSV format. + Το αρχείο δεν έχει την κατάλληλη μορφή του ZionWorx CSV. + + diff -Nru openlp-1.9.9/resources/i18n/en_GB.ts openlp-1.9.10/resources/i18n/en_GB.ts --- openlp-1.9.9/resources/i18n/en_GB.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/en_GB.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Alert - + Show an alert message. Show an alert message. - + Alert name singular Alert - + Alerts name plural Alerts - + Alerts container title Alerts - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Alert Message - + Alert &text: Alert &text: - + &New &New - + &Save &Save - + Displ&ay Displ&ay - + Display && Cl&ose Display && Cl&ose @@ -79,7 +79,7 @@ You haven't specified any text for your alert. Please type in some text before clicking New. - + &Parameter: &Parameter: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Font - + Font name: Font name: - + Font color: Font colour: - + Background color: Background colour: - + Font size: Font size: - + Alert timeout: Alert timeout: @@ -152,551 +152,598 @@ BiblesPlugin - + &Bible &Bible - + Bible name singular Bible - + Bibles name plural Bibles - + Bibles container title Bibles - + No Book Found No Book Found - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. - + Import a Bible. Import a Bible. - + Add a new Bible. Add a new Bible. - + Edit the selected Bible. Edit the selected Bible. - + Delete the selected Bible. Delete the selected Bible. - + Preview the selected Bible. Preview the selected Bible. - + Send the selected Bible live. Send the selected Bible live. - + Add the selected Bible to the service. Add the selected Bible to the service. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. - + &Upgrade older Bibles &Upgrade older Bibles - + Upgrade the Bible databases to the latest format. Upgrade the Bible databases to the latest format. - + Genesis Genesis - + Exodus Exodus - + Leviticus Leviticus - + Numbers Numbers - + Deuteronomy Deuteronomy - + Joshua Joshua - + Judges Judges - + Ruth Ruth - + 1 Samuel 1 Samuel - + 2 Samuel 2 Samuel - + 1 Kings 1 Kings - + 2 Kings 2 Kings - + 1 Chronicles 1 Chronicles - + 2 Chronicles 2 Chronicles - + Ezra Ezra - + Nehemiah Nehemiah - + Esther Esther - + Job Job - + Psalms Psalms - + Proverbs Proverbs - + Ecclesiastes Ecclesiastes - + Song of Solomon Song of Solomon - + Isaiah Isaiah - + Jeremiah Jeremiah - + Lamentations Lamentations - + Ezekiel Ezekiel - + Daniel Daniel - + Hosea Hosea - + Joel Joel - + Amos Amos - + Obadiah Obadiah - + Jonah Jonah - + Micah Micah - + Nahum Nahum - + Habakkuk Habakkuk - + Zephaniah Zephaniah - + Haggai Haggai - + Zechariah Zechariah - + Malachi Malachi - + Matthew Matthew - + Mark Mark - + Luke Luke - + John John - + Acts Acts - + Romans Romans - + 1 Corinthians 1 Corinthians - + 2 Corinthians 2 Corinthians - + Galatians Galatians - + Ephesians Ephesians - + Philippians Philippians - + Colossians Colossians - + 1 Thessalonians 1 Thessalonians - + 2 Thessalonians 2 Thessalonians - + 1 Timothy 1 Timothy - + 2 Timothy 2 Timothy - + Titus Titus - + Philemon Philemon - + Hebrews Hebrews - + James James - + 1 Peter 1 Peter - + 2 Peter 2 Peter - + 1 John 1 John - + 2 John 2 John - + 3 John 3 John - + Jude Jude - + Revelation Revelation - + Judith Judith - + Wisdom Wisdom - + Tobit Tobit - + Sirach Sirach - + Baruch Baruch - + 1 Maccabees 1 Maccabees - + 2 Maccabees 2 Maccabees - + 3 Maccabees 3 Maccabees - + 4 Maccabees 4 Maccabees - + Rest of Daniel Rest of Daniel - + Rest of Esther Rest of Esther - + Prayer of Manasses Prayer of Manasses - + Letter of Jeremiah Letter of Jeremiah - + Prayer of Azariah Prayer of Azariah - + Susanna Susanna - + Bel Bel - + 1 Esdras 1 Esdras - + 2 Esdras 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. :|v|V|verse|verses;;-|to;;,|and;;end + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + You need to specify a version name for your Bible. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + + + + Bible Exists + Bible Exists + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + This Bible already exists. Please import a different Bible or first delete the existing one. + + + + You need to specify a book name for "%s". + You need to specify a book name for "%s". + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + Duplicate Book Name + Duplicate Book Name + + + + The Book Name "%s" has been entered more than once. + The Book Name "%s" has been entered more than once. + + + BiblesPlugin.BibleManager - + Scripture Reference Error Scripture Reference Error - + Web Bible cannot be used Web Bible cannot be used - + Text Search is not available with Web Bibles. Text Search is not available with Web Bibles. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. - + No Bibles Available No Bibles Available - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +766,79 @@ BiblesPlugin.BiblesTab - + Verse Display Verse Display - + Only show new chapter numbers Only show new chapter numbers - + Bible theme: Bible theme: - + No Brackets No Brackets - + ( And ) ( And ) - + { And } { And } - + [ And ] [ And ] - + Note: Changes do not affect verses already in the service. Note: Changes do not affect verses already in the service. - + Display second Bible verses Display second Bible verses - + Custom Scripture References Custom Scripture References - + Verse Separator: Verse Separator: - + Range Separator: Range Separator: - + List Separator: List Separator: - + End Mark: End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +847,7 @@ Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +856,7 @@ Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +865,7 @@ Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,91 +874,80 @@ Please clear this edit line to use the default value. - - Preferred Bookname Language - Preferred Bookname Language - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + English + English - - Bible language - Bible language + + Default Bible Language + Default Bible Language - - Application language - Application language + + Book name language in search field, +search results and on display: + Book name language in search field, +search results and on display: - - English - English + + Bible Language + Bible Language - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language + Application Language BiblesPlugin.BookNameDialog - + Select Book Name Select Book Name - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - - - + Current name: Current name: - + Corresponding name: Corresponding name: - + Show Books From Show Books From - + Old Testament Old Testament - + New Testament New Testament - + Apocrypha Apocrypha + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + The following book name cannot be matched up internally. Please select the corresponding name from the list. + BiblesPlugin.BookNameForm - + You need to select a book. You need to select a book. @@ -936,40 +972,110 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Bible Editor + + + + License Details + License Details + + + + Version name: + Version name: + + + + Copyright: + Copyright: + + + + Permissions: + Permissions: + + + + Default Bible Language + Default Bible Language + + + + Book name language in search field, search results and on display: + Book name language in search field, search results and on display: + + + + Global Settings + Global Settings + + + + Bible Language + Bible Language + + + + Application Language + Application Language + + + + English + English + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registering Bible and loading books... - + Registering Language... Registering Language... - + Importing %s... Importing <book name>... Importing %s... - + Download Error Download Error - + 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. 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. - + Parse Error Parse Error - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. @@ -1147,17 +1253,17 @@ BiblesPlugin.LanguageDialog - + Select Language Select Language - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - + Language: Language: @@ -1173,85 +1279,100 @@ BiblesPlugin.MediaItem - + Quick Quick - + Find: Find: - + Book: Book: - + Chapter: Chapter: - + Verse: Verse: - + From: From: - + To: To: - + Text Search Text Search - + Second: Second: - + Scripture Reference Scripture Reference - + Toggle to keep or clear the previous results. Toggle to keep or clear the previous results. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. Bible not fully loaded. - + Information Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + + + Search Scripture Reference... + Search Scripture Reference... + + + + Search Text... + Search Text... + + + + Are you sure you want to delete "%s"? + Are you sure you want to delete "%s"? + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importing %s %s... @@ -1260,12 +1381,12 @@ 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... @@ -1274,149 +1395,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Select a Backup Directory - + Bible Upgrade Wizard Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory Select Backup Directory - + Please select a backup directory for your Bibles Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. Please select a backup location for your Bibles. - + Backup Directory: Backup Directory: - + There is no need to backup my Bibles There is no need to backup my Bibles - + Select Bibles Select Bibles - + Please select the Bibles to upgrade Please select the Bibles to upgrade - + Upgrading Upgrading - + Please wait while your Bibles are upgraded. Please wait while your Bibles are upgraded. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. The backup was not successful. To backup your Bibles you need permission to write to the given directory. - + Upgrading Bible %s of %s: "%s" Failed Upgrading Bible %s of %s: "%s" Failed - + Upgrading Bible %s of %s: "%s" Upgrading ... Upgrading Bible %s of %s: "%s" Upgrading ... - + Download Error Download Error - + To upgrade your Web Bibles an Internet connection is required. To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Upgrading Bible %s of %s: "%s" Upgrading %s ... - + Upgrading Bible %s of %s: "%s" Complete Upgrading Bible %s of %s: "%s" Complete - + , %s failed , %s failed - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s Upgrading Bible(s): %s successful%s - + Upgrade failed. Upgrade failed. - + You need to specify a backup directory for your Bibles. You need to specify a backup directory for your Bibles. - + Starting upgrade... Starting upgrade... - + There are no Bibles that need to be upgraded. There are no Bibles that need to be upgraded. @@ -1490,12 +1611,12 @@ CustomPlugin.CustomTab - + Custom Display Custom Display - + Display footer Display footer @@ -1503,42 +1624,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Edit Custom Slides - + &Title: &Title: - + Add a new slide at bottom. Add a new slide at bottom. - + Edit the selected slide. Edit the selected slide. - + Edit all the slides at once. Edit all the slides at once. - + Split a slide into two by inserting a slide splitter. Split a slide into two by inserting a slide splitter. - + The&me: The&me: - + &Credits: &Credits: @@ -1553,12 +1674,12 @@ You need to add at least one slide - + Ed&it All Ed&it All - + Insert Slide Insert Slide @@ -1566,7 +1687,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Are you sure you want to delete the %n selected custom slide(s)? @@ -1577,60 +1698,60 @@ ImagePlugin - + <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>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. - + Image name singular Image - + Images name plural Images - + Images container title Images - + Load a new image. Load a new image. - + Add a new image. Add a new image. - + Edit the selected image. Edit the selected image. - + Delete the selected image. Delete the selected image. - + Preview the selected image. Preview the selected image. - + Send the selected image live. Send the selected image live. - + Add the selected image to the service. Add the selected image to the service. @@ -1638,7 +1759,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Select Attachment @@ -1646,44 +1767,44 @@ ImagePlugin.MediaItem - + Select Image(s) Select Image(s) - + You must select an image to delete. You must select an image to delete. - + You must select an image to replace the background with. You must select an image to replace the background with. - + 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. - + There was no display item to amend. There was no display item to amend. @@ -1691,78 +1812,78 @@ ImagesPlugin.ImageTab - + Background Color Background Color - + Default Color: Default Color: - - Provides border where image is not the correct dimensions for the screen when resized. - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - + Media name singular Media - + Media name plural Media - + Media container title Media - + Load new media. Load new media. - + Add new media. Add new media. - + Edit the selected media. Edit the selected media. - + Delete the selected media. Delete the selected media. - + Preview the selected media. Preview the selected media. - + Send the selected media live. Send the selected media live. - + Add the selected media to the service. Add the selected media to the service. @@ -1810,7 +1931,7 @@ There was no display item to amend. - + Unsupported File Unsupported File @@ -1828,22 +1949,22 @@ MediaPlugin.MediaTab - + Available Media Players Available Media Players - + %s (unavailable) %s (unavailable) - + Player Order Player Order - + Allow media player to be overridden Allow media player to be overridden @@ -1851,7 +1972,7 @@ OpenLP - + Image Files Image Files @@ -1873,17 +1994,17 @@ OpenLP.AboutForm - + Credits Credits - + License Licence - + Contribute Contribute @@ -1893,17 +2014,17 @@ build %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. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public Licence as published by the Free Software Foundation; version 2 of the Licence. - + 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 @@ -2028,7 +2149,7 @@ He has set us free. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2045,7 +2166,7 @@ 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. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Copyright © 2004-2012 %s @@ -2055,87 +2176,87 @@ OpenLP.AdvancedTab - + UI Settings UI Settings - + Number of recent files to display: Number of recent files to display: - + Remember active media manager tab on startup Remember active media manager tab on startup - + Double-click to send items straight to live Double-click to send items straight to live - + Expand new service items on creation Expand new service items on creation - + 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 colour: - + Image file: Image file: - + Open File Open File - + Advanced Advanced - + Preview items when clicked in Media Manager Preview items when clicked in Media Manager - + Click to select a color. Click to select a colour. - + Browse for an image file to display. Browse for an image file to display. - + Revert to the default OpenLP logo. Revert to the default OpenLP logo. @@ -2147,137 +2268,221 @@ Service %Y-%m-%d %H-%M - + Default Service Name Default Service Name - + Enable default service name Enable default service name - + Date and Time: Date and Time: - + Monday Monday - + Tuesday Tuesday - + Wednesday Wednesday - + Thurdsday Thurdsday - + Friday Friday - + Saturday Saturday - + Sunday Sunday - + Now Now - + Time when usual service starts. Time when usual service starts. - + Name: Name: - + Consult the OpenLP manual for usage. Consult the OpenLP manual for usage. - + Revert to the default service name "%s". Revert to the default service name "%s". - + Example: Example: - + X11 X11 - + Bypass X11 Window Manager Bypass X11 Window Manager - + Syntax error. Syntax error. + + + Data Location + Data Location + + + + Current path: + Current path: + + + + Custom path: + Custom path: + + + + Browse for new data file location. + Browse for new data file location. + + + + Set the data location to the default. + Set the data location to the default. + + + + Cancel + Cancel + + + + Cancel OpenLP data directory location change. + Cancel OpenLP data directory location change. + + + + Copy data to new location. + Copy data to new location. + + + + Copy the OpenLP data files to the new location. + Copy the OpenLP data files to the new location. + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + + + + Data Directory Error + Data Directory Error + + + + Select Data Directory Location + Select Data Directory Location + + + + Confirm Data Directory Change + Confirm Data Directory Change + + + + Reset Data Directory + Reset Data Directory + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + + + + Overwrite Existing Data + Overwrite Existing Data + OpenLP.ExceptionDialog - + Error Occurred Error Occurred - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. - + 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 @@ -2285,24 +2490,24 @@ OpenLP.ExceptionForm - + Platform: %s Platform: %s - + Save Crash Report Save Crash Report - + Text files (*.txt *.log *.text) Text files (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2333,7 +2538,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2469,17 +2674,17 @@ Default Settings - + Downloading %s... Downloading %s... - + Download complete. Click the finish button to start OpenLP. Download complete. Click the finish button to start OpenLP. - + Enabling selected plugins... Enabling selected plugins... @@ -2549,32 +2754,32 @@ This wizard will help you to configure OpenLP for initial use. Click the next button below to start. - + Setting Up And Downloading Setting Up And Downloading - + Please wait while OpenLP is set up and your data is downloaded. Please wait while OpenLP is set up and your data is downloaded. - + Setting Up Setting Up - + Click the finish button to start OpenLP. Click the finish button to start OpenLP. - + Download complete. Click the finish button to return to OpenLP. Download complete. Click the finish button to return to OpenLP. - + Click the finish button to return to OpenLP. Click the finish button to return to OpenLP. @@ -2584,11 +2789,16 @@ Custom Slides + + Finish + Finish + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2596,66 +2806,61 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - - - Finish - Finish +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. OpenLP.FormattingTagDialog - + Configure Formatting Tags Configure Formatting Tags - + Edit Selection Edit Selection - + Save Save - + Description Description - + Tag Tag - + Start tag Start tag - + End tag End tag - + Tag Id Tag Id - + Start HTML Start HTML - + End HTML End HTML @@ -2663,32 +2868,32 @@ OpenLP.FormattingTagForm - + Update Error Update Error - + Tag "n" already defined. Tag "n" already defined. - + New Tag New Tag - + <HTML here> <HTML here> - + </and here> </and here> - + Tag %s already defined. Tag %s already defined. @@ -2696,82 +2901,82 @@ OpenLP.FormattingTags - + Red Red - + Black Black - + Blue Blue - + Yellow Yellow - + Green Green - + Pink Pink - + Orange Orange - + Purple Purple - + White White - + Superscript Superscript - + Subscript Subscript - + Paragraph Paragraph - + Bold Bold - + Italics Italics - + Underline Underline - + Break Break @@ -2779,180 +2984,170 @@ OpenLP.GeneralTab - + General General - + Monitors Monitors - + Select monitor for output display: Select monitor for output display: - + Display if a single screen Display if a single screen - + Application Startup Application Startup - + Show blank screen warning Show blank screen warning - + Automatically open the last service Automatically open the last service - + Show the splash screen Show the splash screen - + Application Settings Application Settings - + Prompt to save before starting a new service Prompt to save before starting a new service - + Automatically preview next item in service Automatically preview next item in service - + sec sec - + CCLI Details CCLI Details - + SongSelect username: SongSelect username: - + SongSelect password: SongSelect password: - + X X - + Y Y - + Height Height - + Width Width - + Check for updates to OpenLP Check for updates to OpenLP - + Unblank display when adding new live item Unblank display when adding new live item - + Timed slide interval: Timed slide interval: - + Background Audio Background Audio - + Start background audio paused Start background audio paused - + Service Item Slide Limits Service Item Slide Limits - - &End Slide - &End Slide - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - &Wrap Slide - &Wrap Slide + + Override display position: + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list + Repeat track list - - &Next Item - &Next Item + + Behavior of next/previous on the last/first slide: + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide + &Remain on Slide - - Override display position: - Override display position: + + &Wrap around + &Wrap around - - Repeat track list - Repeat track list + + &Move to next/previous service item + &Move to next/previous service item OpenLP.LanguageManager - + Language Language - + Please restart OpenLP to use your new language setting. Please restart OpenLP to use your new language setting. @@ -2968,287 +3163,287 @@ OpenLP.MainWindow - + &File &File - + &Import &Import - + &Export &Export - + &View &View - + M&ode M&ode - + &Tools &Tools - + &Settings &Settings - + &Language &Language - + &Help &Help - + Media Manager Media Manager - + Service Manager Service Manager - + Theme Manager Theme Manager - + &New &New - + &Open &Open - + Open an existing service. Open an existing service. - + &Save &Save - + Save the current service to disk. Save the current service to disk. - + Save &As... Save &As... - + Save Service As Save Service As - + Save the current service under a new name. Save the current service under a new name. - + E&xit E&xit - + Quit OpenLP Quit OpenLP - + &Theme &Theme - + &Configure OpenLP... &Configure OpenLP... - + &Media Manager &Media Manager - + Toggle Media Manager Toggle Media Manager - + Toggle the visibility of the media manager. Toggle the visibility of the media manager. - + &Theme Manager &Theme Manager - + Toggle Theme Manager Toggle Theme Manager - + Toggle the visibility of the theme manager. Toggle the visibility of the theme manager. - + &Service Manager &Service Manager - + Toggle Service Manager Toggle Service Manager - + Toggle the visibility of the service manager. Toggle the visibility of the service manager. - + &Preview Panel &Preview Panel - + Toggle Preview Panel Toggle Preview Panel - + Toggle the visibility of the preview panel. Toggle the visibility of the preview panel. - + &Live Panel &Live Panel - + Toggle Live Panel Toggle Live Panel - + Toggle the visibility of the live panel. Toggle the visibility of the live panel. - + &Plugin List &Plugin List - + List the Plugins List the Plugins - + &User Guide &User Guide - + &About &About - + More information about OpenLP More information about OpenLP - + &Online Help &Online Help - + &Web Site &Web Site - + Use the system language, if available. Use the system language, if available. - + Set the interface language to %s Set the interface language to %s - + Add &Tool... Add &Tool... - + Add an application to the list of tools. Add an application to the list of tools. - + &Default &Default - + Set the view mode back to the default. Set the view mode back to the default. - + &Setup &Setup - + Set the view mode to Setup. Set the view mode to Setup. - + &Live &Live - + Set the view mode to Live. 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/. @@ -3256,108 +3451,108 @@ 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 - + English Please add the name of your language here English (United Kingdom) - + Configure &Shortcuts... Configure &Shortcuts... - + Close OpenLP Close OpenLP - + Are you sure you want to close OpenLP? Are you sure you want to close OpenLP? - + 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. - + &Autodetect &Autodetect - + Update Theme Images Update Theme Images - + Update the preview images for all themes. Update the preview images for all themes. - + Print the current service. Print the current service. - + &Recent Files &Recent Files - + L&ock Panels L&ock Panels - + Prevent the panels being moved. Prevent the panels being moved. - + Re-run First Time Wizard Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3366,43 +3561,43 @@ Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files Clear List - + Clear the list of recent files. Clear the list of recent files. - + Configure &Formatting Tags... Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file Export OpenLP settings to a specified *.config file - + Settings Settings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3415,45 +3610,50 @@ Importing incorrect settings may cause erratic behaviour or OpenLP to terminate abnormally. - + Open File Open File - + OpenLP Export Settings Files (*.conf) OpenLP Export Settings Files (*.conf) - + Import settings Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File Export Settings File - + OpenLP Export Settings File (*.conf) OpenLP Export Settings File (*.conf) + + + New Data Directory Error + New Data Directory Error + OpenLP.Manager - + Database Error Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3462,7 +3662,7 @@ Database: %s - + OpenLP cannot load your database. Database: %s @@ -3474,74 +3674,74 @@ OpenLP.MediaManagerItem - + No Items Selected No Items Selected - + &Add to selected Service Item &Add to selected Service Item - + You must select one or more items to preview. You must select one or more items to preview. - + You must select one or more items to send live. You must select one or more items to send live. - + You must select one or more items. You must select one or more items. - + You must select an existing service item to add to. You must select an existing service item to add to. - + Invalid Service Item Invalid Service Item - + You must select a %s service item. You must select a %s service item. - + You must select one or more items to add. You must select one or more items to add. - + No Search Results No Search Results - + Invalid File Type Invalid File Type - + Invalid File %s. Suffix not supported Invalid File %s. Suffix not supported - + &Clone &Clone - + Duplicate files were found on import and were ignored. Duplicate files were found on import and were ignored. @@ -3549,12 +3749,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. <lyrics> tag is missing. - + <verse> tag is missing. <verse> tag is missing. @@ -3562,27 +3762,27 @@ OpenLP.PluginForm - + Plugin List Plugin List - + Plugin Details Plugin Details - + Status: Status: - + Active Active - + Inactive Inactive @@ -3605,12 +3805,12 @@ OpenLP.PrintServiceDialog - + Fit Page Fit Page - + Fit Width Fit Width @@ -3618,7 +3818,7 @@ OpenLP.PrintServiceForm - + Options Options @@ -3633,47 +3833,47 @@ 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 - + Add page break before each text item Add page break before each text item - + Service Sheet Service Sheet @@ -3683,12 +3883,12 @@ Print - + Title: Title: - + Custom Footer Text: Custom Footer Text: @@ -3696,12 +3896,12 @@ OpenLP.ScreenList - + Screen Screen - + primary primary @@ -3709,12 +3909,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Start</strong>: %s - + <strong>Length</strong>: %s <strong>Length</strong>: %s @@ -3722,7 +3922,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Reorder Service Item @@ -3730,82 +3930,82 @@ OpenLP.ServiceManager - + Move to &top Move to &top - + Move item to the top of the service. Move item to the top of the service. - + Move &up Move &up - + Move item up one position in the service. Move item up one position in the service. - + Move &down Move &down - + Move item down one position in the service. Move item down one position in the service. - + Move to &bottom Move to &bottom - + Move item to the end of the service. Move item to the end of the service. - + &Delete From Service &Delete From Service - + Delete the selected item from the service. Delete the selected item from the service. - + &Add New Item &Add New Item - + &Add to Selected Item &Add to Selected Item - + &Edit Item &Edit Item - + &Reorder Item &Reorder Item - + &Notes &Notes - + &Change Item Theme &Change Item Theme @@ -3827,112 +4027,107 @@ 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 - + &Expand all &Expand all - + Expand all the service items. Expand all the service items. - + &Collapse all &Collapse all - + Collapse all the service items. Collapse all the service items. - + Open File Open File - + 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. - + &Start Time &Start Time - + Show &Preview Show &Preview - - Show &Live - Show &Live - - - + Modified Service Modified Service - + 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? - + Custom Service Notes: Custom Service Notes: - + Notes: Notes: - + Playing time: Playing time: - + Untitled Service Untitled Service @@ -3957,17 +4152,17 @@ Corrupt File - + Load an existing service. Load an existing service. - + Save this service. Save this service. - + Select a theme for the service. Select a theme for the service. @@ -3977,7 +4172,7 @@ This file is either corrupt or it is not an OpenLP 2.0 service file. - + Service File Missing Service File Missing @@ -4001,11 +4196,21 @@ Service copy only Service copy only + + + Error Saving File + Error Saving File + + + + There was an error saving your file. + There was an error saving your file. + OpenLP.ServiceNoteForm - + Service Item Notes Service Item Notes @@ -4021,67 +4226,67 @@ OpenLP.ShortcutListDialog - + Action Action - + Shortcut Shortcut - + Duplicate Shortcut Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default Default - + Custom Custom - + Capture shortcut. Capture shortcut. - + Restore the default shortcut of this action. Restore the default shortcut of this action. - + Restore Default Shortcuts Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts Configure Shortcuts @@ -4089,177 +4294,172 @@ OpenLP.SlideController - + Hide Hide - + Go To Go To - + Blank Screen Blank Screen - + Blank to Theme Blank to Theme - + Show Desktop Show Desktop - + Previous Service Previous Service - + Next Service Next Service - + Escape Item Escape Item - + Move to previous. Move to previous. - + Move to next. Move to next. - + Play Slides Play Slides - + Delay between slides in seconds. Delay between slides in seconds. - + Move to live. Move to live. - + Add to Service. Add to Service. - + Edit and reload song preview. Edit and reload song preview. - + Start playing media. Start playing media. - + Pause audio. Pause audio. - + Pause playing media. Pause playing media. - + Stop playing media. Stop playing media. - + Video position. Video position. - + Audio Volume. Audio Volume. - + Go to "Verse" Go to "Verse" - + Go to "Chorus" Go to "Chorus" - + Go to "Bridge" Go to "Bridge" - + Go to "Pre-Chorus" Go to "Pre-Chorus" - + Go to "Intro" Go to "Intro" - + Go to "Ending" Go to "Ending" - + Go to "Other" Go to "Other" - + Previous Slide Previous Slide - + Next Slide Next Slide - + Pause Audio Pause Audio - + Background Audio Background Audio - - Next Track - Next Track - - - + Go to next audio track. Go to next audio track. - + Tracks Tracks @@ -4335,17 +4535,17 @@ Start time is after the finish time of the media item - + Theme Layout Theme Layout - + The blue box shows the main area. The blue box shows the main area. - + The red box shows the footer. The red box shows the footer. @@ -4353,32 +4553,32 @@ OpenLP.ThemeForm - + Select Image Select Image - + Theme Name Missing Theme Name Missing - + There is no name for this theme. Please enter one. There is no name for this theme. Please enter one. - + Theme Name Invalid Theme Name Invalid - + Invalid theme name. Please enter one. Invalid theme name. Please enter one. - + (approximately %d lines per slide) (approximately %d lines per slide) @@ -4386,193 +4586,193 @@ OpenLP.ThemeManager - + Create a new theme. Create a new theme. - + Edit Theme Edit Theme - + Edit a theme. Edit a theme. - + Delete Theme Delete Theme - + Delete a theme. Delete a theme. - + Import Theme Import Theme - + Import a theme. Import a theme. - + Export Theme Export Theme - + Export a theme. Export a theme. - + &Edit Theme &Edit Theme - + &Delete Theme &Delete Theme - + Set As &Global Default 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. - + Theme %s is used in the %s plugin. Theme %s is used in the %s plugin. - + 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. File is not a valid theme. - + &Copy Theme &Copy Theme - + &Rename Theme &Rename Theme - + &Export Theme &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) - + Copy of %s Copy of <theme name> Copy of %s - + Theme Already Exists Theme Already Exists @@ -4580,272 +4780,272 @@ OpenLP.ThemeWizard - + Theme Wizard Theme Wizard - + Welcome to the Theme Wizard Welcome to the Theme Wizard - + Set Up Background Set Up Background - + Set up your theme's background according to the parameters below. Set up your theme's background according to the parameters below. - + Background type: Background type: - + Solid Color Solid Colour - + Gradient Gradient - + Color: Colour: - + Gradient: Gradient: - + Horizontal Horizontal - + Vertical Vertical - + Circular Circular - + Top Left - Bottom Right Top Left - Bottom Right - + Bottom Left - Top Right Bottom Left - Top Right - + Main Area Font Details Main Area Font Details - + Define the font and display characteristics for the Display text Define the font and display characteristics for the Display text - + Font: Font: - + Size: Size: - + Line Spacing: Line Spacing: - + &Outline: &Outline: - + &Shadow: &Shadow: - + Bold Bold - + Italic Italic - + Footer Area Font Details Footer Area Font Details - + Define the font and display characteristics for the Footer text Define the font and display characteristics for the Footer text - + Text Formatting Details Text Formatting Details - + Allows additional display formatting information to be defined Allows additional display formatting information to be defined - + Horizontal Align: Horizontal Align: - + Left Left - + Right Right - + Center Centre - + 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 - + X position: X position: - + px px - + Y position: Y position: - + Width: Width: - + Height: Height: - + Use default location Use default location - + 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: - + Edit Theme - %s Edit Theme - %s - + 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 - + Starting color: Starting color: - + Ending color: Ending color: - + Background color: Background color: - + Justify Justify - + Layout Preview Layout Preview - + Transparent Transparent @@ -4853,47 +5053,47 @@ OpenLP.ThemesTab - + Global Theme Global Theme - + Theme Level Theme Level - + S&ong Level S&ong Level - + 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 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 &Service Level - + 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. 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. - + &Global Level &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. Use the global theme, overriding any themes associated with either the service or the songs. - + Themes Themes @@ -4977,239 +5177,239 @@ pt - + Image Image - + Import Import - + Live Live - + Live Background Error Live Background Error - + Load Load - + Middle Middle - + New New - + New Service New Service - + New Theme New Theme - + No File Selected Singular No File Selected - + No Files Selected Plural No Files Selected - + No Item Selected Singular No Item Selected - + No Items Selected Plural No Items Selected - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Preview - + Replace Background Replace Background - + Reset Background Reset Background - + s The abbreviated unit for seconds s - + Save && Preview Save && Preview - + Search Search - + You must select an item to delete. You must select an item to delete. - + You must select an item to edit. You must select an item to edit. - + Save Service Save Service - + Service Service - + Start %s Start %s - + Theme Singular Theme - + Themes Plural Themes - + Top Top - + Version Version - + 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. - + &Vertical Align: &Vertical Align: - + Finished import. Finished import. - + Format: Format: - + Importing Importing - + Importing "%s"... Importing "%s"... - + Select Import Source Select Import Source - + Select the import format and the location to import from. 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 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. - + Open %s File Open %s File - + %p% %p% - + Ready. Ready. - + Starting import... Starting import... - + 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. @@ -5225,7 +5425,7 @@ Welcome to the Song Export Wizard - + Welcome to the Song Import Wizard Welcome to the Song Import Wizard @@ -5313,53 +5513,53 @@ h - + Layout style: Layout style: - + Live Toolbar Live Toolbar - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP is already running. Do you wish to continue? - + Settings Settings - + Tools Tools - + Unsupported File Unsupported File - + Verse Per Slide Verse Per Slide - + Verse Per Line Verse Per Line - + View View @@ -5374,42 +5574,37 @@ XML syntax error - + View Mode View Mode - + Open service. Open service. - + Print Service Print Service - + Replace live background. Replace live background. - + Reset live background. Reset live background. - - &Split - &Split - - - + Split a slide into two only if it does not fit on the screen as one slide. Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard Welcome to the Bible Upgrade Wizard @@ -5419,53 +5614,105 @@ Confirm Delete - + Play Slides in Loop Play Slides in Loop - + Play Slides to End Play Slides to End - + Stop Play Slides in Loop Stop Play Slides in Loop - + Stop Play Slides to End Stop Play Slides to End - + Next Track Next Track + + + Search Themes... + Search bar place holder text + Search Themes... + + + + Optional &Split + Optional &Split + + + + Invalid Folder Selected + Singular + Invalid Folder Selected + + + + Invalid File Selected + Singular + Invalid File Selected + + + + Invalid Files Selected + Plural + Invalid Files Selected + + + + No Folder Selected + Singular + No Folder Selected + + + + Open %s Folder + Open %s Folder + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + You need to specify one %s file to import from. + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + You need to specify one %s folder to import from. + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 and %2 - + %1, and %2 Locale list separator: end %1, and %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5474,50 +5721,50 @@ PresentationPlugin - + <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>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. - + Presentation name singular Presentation - + Presentations name plural Presentations - + Presentations container title Presentations - + 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. @@ -5525,70 +5772,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Select Presentation(s) - + Automatic Automatic - + Present using: Present using: - + File Exists File Exists - + A presentation with that filename already exists. A presentation with that filename already exists. - + This type of presentation is not supported. This type of presentation is not supported. - + 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. - - The Presentation %s is incomplete, please reload. - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers Available Controllers - + %s (unavailable) %s (unavailable) - + Allow presentation application to be overridden Allow presentation application to be overridden @@ -5622,135 +5869,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 Remote - + OpenLP 2.0 Stage View OpenLP 2.0 Stage View - + Service Manager Service Manager - + Slide Controller Slide Controller - + Alerts Alerts - + Search Search - - Back - Back - - - + Refresh Refresh - + Blank Blank - + Show Show - + Prev Prev - + Next Next - + Text Text - + Show Alert Show Alert - + Go Live Go Live - + No Results No Results - + Options Options - + Add to Service Add to Service + + + Home + Home + + + + Theme + Theme + + + + Desktop + Desktop + + + + Add &amp; Go to Service + Add &amp; Go to Service + RemotePlugin.RemoteTab - + Serve on IP address: Serve on IP address: - + Port number: Port number: - + Server Settings Server Settings - + Remote URL: Remote URL: - + Stage view URL: Stage view URL: - + Display stage time in 12h format Display stage time in 12h format - + Android App Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5758,85 +6020,85 @@ SongUsagePlugin - + &Song Usage Tracking &Song Usage Tracking - + &Delete Tracking Data &Delete Tracking Data - + Delete song usage data up to a specified date. Delete song usage data up to a specified date. - + &Extract Tracking Data &Extract Tracking Data - + Generate a report on song usage. Generate a report on song usage. - + Toggle Tracking Toggle Tracking - + Toggle the tracking of song usage. 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 />This plugin tracks the usage of songs in services. - + SongUsage name singular SongUsage - + SongUsage name plural SongUsage - + SongUsage container title SongUsage - + Song Usage Song Usage - + Song usage tracking is active. Song usage tracking is active. - + Song usage tracking is inactive. Song usage tracking is inactive. - + display display - + printed printed @@ -5844,7 +6106,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Delete Song Usage Data @@ -5869,7 +6131,7 @@ All requested data has been deleted successfully. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5877,42 +6139,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Song Usage Extraction - + Select Date Range Select Date Range - + to to - + Report Location Report Location - + Output File Location Output File Location - + usage_detail_%s_%s.txt usage_detail_%s_%s.txt - + Report Creation Report Creation - + Report %s has been successfully created. @@ -5921,12 +6183,12 @@ has been successfully created. - + Output Path Not Selected Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5964,82 +6226,82 @@ Reindexing songs... - + 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. @@ -6048,26 +6310,26 @@ 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. - + Song name singular Song - + Songs name plural Songs - + Songs container title Songs @@ -6078,32 +6340,32 @@ Exports songs using the export wizard. - + 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. @@ -6131,17 +6393,17 @@ Last name: - + You need to type in the first name of the author. You need to type in the first name of the author. - + You need to type in the last name of the author. You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? You have not set a display name for the author, combine the first and last names? @@ -6172,209 +6434,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Meta Data + + + + Custom Book Names + Custom Book Names + + + SongsPlugin.EditSongForm - + Song Editor Song Editor - + &Title: &Title: - + Alt&ernate title: Alt&ernate title: - + &Lyrics: &Lyrics: - + &Verse order: &Verse order: - + Ed&it All Ed&it All - + Title && Lyrics Title && Lyrics - + &Add to Song &Add to Song - + &Remove &Remove - + &Manage Authors, Topics, Song Books &Manage Authors, Topics, Song Books - + A&dd to Song A&dd to Song - + R&emove R&emove - + Book: Book: - + Number: Number: - + Authors, Topics && Song Book Authors, Topics && Song Book - + New &Theme New &Theme - + Copyright Information Copyright Information - + Comments Comments - + Theme, Copyright Info && Comments Theme, Copyright Info && Comments - + Add Author Add Author - + This author does not exist, do you want to add them? This author does not exist, do you want to add them? - + This author is already in the list. This author is already in the list. - + 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. 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. - + Add Topic Add Topic - + This topic does not exist, do you want to add it? This topic does not exist, do you want to add it? - + This topic is already in the list. This topic is already in the list. - + 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 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. You need to type in a song title. - + You need to type in at least one verse. You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book Add Book - + This song book does not exist, do you want to add it? This song book does not exist, do you want to add it? - + 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. - + Linked Audio Linked Audio - + Add &File(s) Add &File(s) - + Add &Media Add &Media - + Remove &All Remove &All - + Open File(s) Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6488,130 +6763,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Select Document/Presentation Files - + Song Import Wizard 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. 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. - + Generic Document/Presentation Generic Document/Presentation - - Filename: - Filename: - - - - 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. - 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. - - - + Add Files... Add Files... - + Remove File(s) Remove File(s) - + Please wait while your songs are imported. Please wait while your songs are imported. - + 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 - - 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. - - - + Songs Of Fellowship Song Files Songs Of Fellowship Song Files - + SongBeamer Files SongBeamer Files - + SongShow Plus Song Files SongShow Plus Song Files - + Foilpresenter Song Files Foilpresenter Song Files - + Copy Copy - + Save to File Save to File - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files OpenLyrics Files + + + CCLI SongSelect Files + CCLI SongSelect Files + + + + EasySlides XML File + EasySlides XML File + + + + EasyWorship Song Database + EasyWorship Song Database + + + + DreamBeam Song Files + DreamBeam Song Files + + + + You need to specify a valid PowerSong 1.0 database folder. + You need to specify a valid PowerSong 1.0 database folder. + + + + ZionWorx (CSV) + ZionWorx (CSV) + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + SongsPlugin.MediaFilesForm - + Select Media File(s) Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. Select one or more audio files from the list below, and click OK to import them into this song. @@ -6619,27 +6914,27 @@ SongsPlugin.MediaItem - + Titles Titles - + Lyrics Lyrics - + 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? @@ -6647,16 +6942,41 @@ - + Maintain the lists of authors, topics and books. Maintain the lists of authors, topics and books. - + copy For song cloning copy + + + Search Titles... + Search Titles... + + + + Search Entire Song... + Search Entire Song... + + + + Search Lyrics... + Search Lyrics... + + + + Search Authors... + Search Authors... + + + + Search Song Books... + Search Song Books... + SongsPlugin.OpenLP1SongImport @@ -6683,6 +7003,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + No songs to import. + + + + Verses not found. Missing "PART" header. + Verses not found. Missing "PART" header. + + + SongsPlugin.SongBookForm @@ -6721,12 +7054,12 @@ SongsPlugin.SongImport - + copyright copyright - + The following songs could not be imported: The following songs could not be imported: @@ -6747,117 +7080,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Your song import failed. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Could not add your author. - + This author already exists. This author already exists. - + Could not add your topic. Could not add your topic. - + This topic already exists. This topic already exists. - + Could not add your book. Could not add your book. - + This book already exists. This book already exists. - + Could not save your changes. Could not save your changes. - + Could not save your modified author, because the author already exists. Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. Could not save your modified topic, because it already exists. - + Delete Author Delete Author - + Are you sure you want to delete the selected author? Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic Delete Topic - + Are you sure you want to delete the selected topic? Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book Delete Book - + Are you sure you want to delete the selected book? Are you sure you want to delete the selected book? - + This book cannot be deleted, it is currently assigned to at least one song. 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? 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? @@ -6865,29 +7190,29 @@ SongsPlugin.SongsTab - + Songs Mode Songs Mode - + Enable search as you type Enable search as you type - + Display verses on live tool bar Display verses on live tool bar - + Update service from song edit Update service from song edit - - Add missing songs when opening service - Add missing songs when opening service + + Import missing songs from service files + Import missing songs from service files @@ -6946,4 +7271,17 @@ Other + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Error reading CSV file. + + + + File not valid ZionWorx CSV format. + File not valid ZionWorx CSV format. + + diff -Nru openlp-1.9.9/resources/i18n/en.ts openlp-1.9.10/resources/i18n/en.ts --- openlp-1.9.9/resources/i18n/en.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/en.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Alert - + Show an alert message. Show an alert message. - + Alert name singular Alert - + Alerts name plural Alerts - + Alerts container title Alerts - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Alert Message - + Alert &text: Alert &text: - + &New &New - + &Save &Save - + Displ&ay Displ&ay - + Display && Cl&ose Display && Cl&ose @@ -79,7 +79,7 @@ You haven't specified any text for your alert. Please type in some text before clicking New. - + &Parameter: &Parameter: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Font - + Font name: Font name: - + Font color: Font color: - + Background color: Background color: - + Font size: Font size: - + Alert timeout: Alert timeout: @@ -152,551 +152,598 @@ BiblesPlugin - + &Bible &Bible - + Bible name singular Bible - + Bibles name plural Bibles - + Bibles container title Bibles - + No Book Found No Book Found - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. - + Import a Bible. Import a Bible. - + Add a new Bible. Add a new Bible. - + Edit the selected Bible. Edit the selected Bible. - + Delete the selected Bible. Delete the selected Bible. - + Preview the selected Bible. Preview the selected Bible. - + Send the selected Bible live. Send the selected Bible live. - + Add the selected Bible to the service. Add the selected Bible to the service. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. - + &Upgrade older Bibles &Upgrade older Bibles - + Upgrade the Bible databases to the latest format. Upgrade the Bible databases to the latest format. - + Genesis Genesis - + Exodus Exodus - + Leviticus Leviticus - + Numbers Numbers - + Deuteronomy Deuteronomy - + Joshua Joshua - + Judges Judges - + Ruth Ruth - + 1 Samuel 1 Samuel - + 2 Samuel 2 Samuel - + 1 Kings 1 Kings - + 2 Kings 2 Kings - + 1 Chronicles 1 Chronicles - + 2 Chronicles 2 Chronicles - + Ezra Ezra - + Nehemiah Nehemiah - + Esther Esther - + Job Job - + Psalms Psalms - + Proverbs Proverbs - + Ecclesiastes Ecclesiastes - + Song of Solomon Song of Solomon - + Isaiah Isaiah - + Jeremiah Jeremiah - + Lamentations Lamentations - + Ezekiel Ezekiel - + Daniel Daniel - + Hosea Hosea - + Joel Joel - + Amos Amos - + Obadiah Obadiah - + Jonah Jonah - + Micah Micah - + Nahum Nahum - + Habakkuk Habakkuk - + Zephaniah Zephaniah - + Haggai Haggai - + Zechariah Zechariah - + Malachi Malachi - + Matthew Matthew - + Mark Mark - + Luke Luke - + John John - + Acts Acts - + Romans Romans - + 1 Corinthians 1 Corinthians - + 2 Corinthians 2 Corinthians - + Galatians Galatians - + Ephesians Ephesians - + Philippians Philippians - + Colossians Colossians - + 1 Thessalonians 1 Thessalonians - + 2 Thessalonians 2 Thessalonians - + 1 Timothy 1 Timothy - + 2 Timothy 2 Timothy - + Titus Titus - + Philemon Philemon - + Hebrews Hebrews - + James James - + 1 Peter 1 Peter - + 2 Peter 2 Peter - + 1 John 1 John - + 2 John 2 John - + 3 John 3 John - + Jude Jude - + Revelation Revelation - + Judith Judith - + Wisdom Wisdom - + Tobit Tobit - + Sirach Sirach - + Baruch Baruch - + 1 Maccabees 1 Maccabees - + 2 Maccabees 2 Maccabees - + 3 Maccabees 3 Maccabees - + 4 Maccabees 4 Maccabees - + Rest of Daniel Rest of Daniel - + Rest of Esther Rest of Esther - + Prayer of Manasses Prayer of Manasses - + Letter of Jeremiah Letter of Jeremiah - + Prayer of Azariah Prayer of Azariah - + Susanna Susanna - + Bel Bel - + 1 Esdras 1 Esdras - + 2 Esdras 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. :|v|V|verse|verses;;-|to;;,|and;;end + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + You need to specify a version name for your Bible. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + + + + Bible Exists + Bible Exists + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + This Bible already exists. Please import a different Bible or first delete the existing one. + + + + You need to specify a book name for "%s". + You need to specify a book name for "%s". + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + Duplicate Book Name + Duplicate Book Name + + + + The Book Name "%s" has been entered more than once. + The Book Name "%s" has been entered more than once. + + + BiblesPlugin.BibleManager - + Scripture Reference Error Scripture Reference Error - + Web Bible cannot be used Web Bible cannot be used - + Text Search is not available with Web Bibles. Text Search is not available with Web Bibles. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. - + No Bibles Available No Bibles Available - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +766,79 @@ BiblesPlugin.BiblesTab - + Verse Display Verse Display - + Only show new chapter numbers Only show new chapter numbers - + Bible theme: Bible theme: - + No Brackets No Brackets - + ( And ) ( And ) - + { And } { And } - + [ And ] [ And ] - + Note: Changes do not affect verses already in the service. Note: Changes do not affect verses already in the service. - + Display second Bible verses Display second Bible verses - + Custom Scripture References Custom Scripture References - + Verse Separator: Verse Separator: - + Range Separator: Range Separator: - + List Separator: List Separator: - + End Mark: End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +847,7 @@ Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +856,7 @@ Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +865,7 @@ Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,91 +874,80 @@ Please clear this edit line to use the default value. - - Preferred Bookname Language - Preferred Bookname Language - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + English + English - - Bible language - Bible language + + Default Bible Language + Default Bible Language - - Application language - Application language + + Book name language in search field, +search results and on display: + Book name language in search field, +search results and on display: - - English - English + + Bible Language + Bible Language - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language + Application Language BiblesPlugin.BookNameDialog - + Select Book Name Select Book Name - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - - - + Current name: Current name: - + Corresponding name: Corresponding name: - + Show Books From Show Books From - + Old Testament Old Testament - + New Testament New Testament - + Apocrypha Apocrypha + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + The following book name cannot be matched up internally. Please select the corresponding name from the list. + BiblesPlugin.BookNameForm - + You need to select a book. You need to select a book. @@ -936,40 +972,110 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Bible Editor + + + + License Details + License Details + + + + Version name: + Version name: + + + + Copyright: + Copyright: + + + + Permissions: + Permissions: + + + + Default Bible Language + Default Bible Language + + + + Book name language in search field, search results and on display: + Book name language in search field, search results and on display: + + + + Global Settings + Global Settings + + + + Bible Language + Bible Language + + + + Application Language + Application Language + + + + English + English + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registering Bible and loading books... - + Registering Language... Registering Language... - + Importing %s... Importing <book name>... Importing %s... - + Download Error Download Error - + 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. 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. - + Parse Error Parse Error - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. @@ -1147,17 +1253,17 @@ BiblesPlugin.LanguageDialog - + Select Language Select Language - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - + Language: Language: @@ -1173,85 +1279,100 @@ BiblesPlugin.MediaItem - + Quick Quick - + Find: Find: - + Book: Book: - + Chapter: Chapter: - + Verse: Verse: - + From: From: - + To: To: - + Text Search Text Search - + Second: Second: - + Scripture Reference Scripture Reference - + Toggle to keep or clear the previous results. Toggle to keep or clear the previous results. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. Bible not fully loaded. - + Information Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + + + Search Scripture Reference... + Search Scripture Reference... + + + + Search Text... + Search Text... + + + + Are you sure you want to delete "%s"? + Are you sure you want to delete "%s"? + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importing %s %s... @@ -1260,12 +1381,12 @@ 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... @@ -1274,149 +1395,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Select a Backup Directory - + Bible Upgrade Wizard Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory Select Backup Directory - + Please select a backup directory for your Bibles Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. Please select a backup location for your Bibles. - + Backup Directory: Backup Directory: - + There is no need to backup my Bibles There is no need to backup my Bibles - + Select Bibles Select Bibles - + Please select the Bibles to upgrade Please select the Bibles to upgrade - + Upgrading Upgrading - + Please wait while your Bibles are upgraded. Please wait while your Bibles are upgraded. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. The backup was not successful. To backup your Bibles you need permission to write to the given directory. - + Upgrading Bible %s of %s: "%s" Failed Upgrading Bible %s of %s: "%s" Failed - + Upgrading Bible %s of %s: "%s" Upgrading ... Upgrading Bible %s of %s: "%s" Upgrading ... - + Download Error Download Error - + To upgrade your Web Bibles an Internet connection is required. To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Upgrading Bible %s of %s: "%s" Upgrading %s ... - + Upgrading Bible %s of %s: "%s" Complete Upgrading Bible %s of %s: "%s" Complete - + , %s failed , %s failed - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s Upgrading Bible(s): %s successful%s - + Upgrade failed. Upgrade failed. - + You need to specify a backup directory for your Bibles. You need to specify a backup directory for your Bibles. - + Starting upgrade... Starting upgrade... - + There are no Bibles that need to be upgraded. There are no Bibles that need to be upgraded. @@ -1490,12 +1611,12 @@ CustomPlugin.CustomTab - + Custom Display Custom Display - + Display footer Display footer @@ -1503,42 +1624,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Edit Custom Slides - + &Title: &Title: - + Add a new slide at bottom. Add a new slide at bottom. - + Edit the selected slide. Edit the selected slide. - + Edit all the slides at once. Edit all the slides at once. - + Split a slide into two by inserting a slide splitter. Split a slide into two by inserting a slide splitter. - + The&me: The&me: - + &Credits: &Credits: @@ -1553,12 +1674,12 @@ You need to add at least one slide - + Ed&it All Ed&it All - + Insert Slide Insert Slide @@ -1566,7 +1687,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Are you sure you want to delete the %n selected custom slide(s)? @@ -1577,60 +1698,60 @@ ImagePlugin - + <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>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. - + Image name singular Image - + Images name plural Images - + Images container title Images - + Load a new image. Load a new image. - + Add a new image. Add a new image. - + Edit the selected image. Edit the selected image. - + Delete the selected image. Delete the selected image. - + Preview the selected image. Preview the selected image. - + Send the selected image live. Send the selected image live. - + Add the selected image to the service. Add the selected image to the service. @@ -1638,7 +1759,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Select Attachment @@ -1646,44 +1767,44 @@ ImagePlugin.MediaItem - + Select Image(s) Select Image(s) - + You must select an image to delete. You must select an image to delete. - + You must select an image to replace the background with. You must select an image to replace the background with. - + 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. - + There was no display item to amend. There was no display item to amend. @@ -1691,78 +1812,78 @@ ImagesPlugin.ImageTab - + Background Color Background Color - + Default Color: Default Color: - - Provides border where image is not the correct dimensions for the screen when resized. - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - + Media name singular Media - + Media name plural Media - + Media container title Media - + Load new media. Load new media. - + Add new media. Add new media. - + Edit the selected media. Edit the selected media. - + Delete the selected media. Delete the selected media. - + Preview the selected media. Preview the selected media. - + Send the selected media live. Send the selected media live. - + Add the selected media to the service. Add the selected media to the service. @@ -1810,7 +1931,7 @@ There was no display item to amend. - + Unsupported File Unsupported File @@ -1828,22 +1949,22 @@ MediaPlugin.MediaTab - + Available Media Players Available Media Players - + %s (unavailable) %s (unavailable) - + Player Order Player Order - + Allow media player to be overridden Allow media player to be overridden @@ -1851,7 +1972,7 @@ OpenLP - + Image Files Image Files @@ -1873,17 +1994,17 @@ OpenLP.AboutForm - + Credits Credits - + License License - + Contribute Contribute @@ -1893,17 +2014,17 @@ build %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. 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 @@ -2028,7 +2149,7 @@ He has set us free. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2045,7 +2166,7 @@ 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. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Copyright © 2004-2012 %s @@ -2055,87 +2176,87 @@ OpenLP.AdvancedTab - + UI Settings UI Settings - + Number of recent files to display: Number of recent files to display: - + Remember active media manager tab on startup Remember active media manager tab on startup - + Double-click to send items straight to live Double-click to send items straight to live - + Expand new service items on creation Expand new service items on creation - + 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: - + Image file: Image file: - + Open File Open File - + Advanced Advanced - + Preview items when clicked in Media Manager Preview items when clicked in Media Manager - + Click to select a color. Click to select a color. - + Browse for an image file to display. Browse for an image file to display. - + Revert to the default OpenLP logo. Revert to the default OpenLP logo. @@ -2147,137 +2268,221 @@ Service %Y-%m-%d %H-%M - + Default Service Name Default Service Name - + Enable default service name Enable default service name - + Date and Time: Date and Time: - + Monday Monday - + Tuesday Tuesday - + Wednesday Wednesday - + Thurdsday Thurdsday - + Friday Friday - + Saturday Saturday - + Sunday Sunday - + Now Now - + Time when usual service starts. Time when usual service starts. - + Name: Name: - + Consult the OpenLP manual for usage. Consult the OpenLP manual for usage. - + Revert to the default service name "%s". Revert to the default service name "%s". - + Example: Example: - + X11 X11 - + Bypass X11 Window Manager Bypass X11 Window Manager - + Syntax error. Syntax error. + + + Data Location + Data Location + + + + Current path: + Current path: + + + + Custom path: + Custom path: + + + + Browse for new data file location. + Browse for new data file location. + + + + Set the data location to the default. + Set the data location to the default. + + + + Cancel + Cancel + + + + Cancel OpenLP data directory location change. + Cancel OpenLP data directory location change. + + + + Copy data to new location. + Copy data to new location. + + + + Copy the OpenLP data files to the new location. + Copy the OpenLP data files to the new location. + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + + + + Data Directory Error + Data Directory Error + + + + Select Data Directory Location + Select Data Directory Location + + + + Confirm Data Directory Change + Confirm Data Directory Change + + + + Reset Data Directory + Reset Data Directory + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + + + + Overwrite Existing Data + Overwrite Existing Data + OpenLP.ExceptionDialog - + Error Occurred Error Occurred - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. - + 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 @@ -2285,24 +2490,24 @@ OpenLP.ExceptionForm - + Platform: %s Platform: %s - + Save Crash Report Save Crash Report - + Text files (*.txt *.log *.text) Text files (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2333,7 +2538,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2469,17 +2674,17 @@ Default Settings - + Downloading %s... Downloading %s... - + Download complete. Click the finish button to start OpenLP. Download complete. Click the finish button to start OpenLP. - + Enabling selected plugins... Enabling selected plugins... @@ -2549,32 +2754,32 @@ This wizard will help you to configure OpenLP for initial use. Click the next button below to start. - + Setting Up And Downloading Setting Up And Downloading - + Please wait while OpenLP is set up and your data is downloaded. Please wait while OpenLP is set up and your data is downloaded. - + Setting Up Setting Up - + Click the finish button to start OpenLP. Click the finish button to start OpenLP. - + Download complete. Click the finish button to return to OpenLP. Download complete. Click the finish button to return to OpenLP. - + Click the finish button to return to OpenLP. Click the finish button to return to OpenLP. @@ -2584,11 +2789,16 @@ Custom Slides + + Finish + Finish + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2596,66 +2806,61 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - - - Finish - Finish +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. OpenLP.FormattingTagDialog - + Configure Formatting Tags Configure Formatting Tags - + Edit Selection Edit Selection - + Save Save - + Description Description - + Tag Tag - + Start tag Start tag - + End tag End tag - + Tag Id Tag Id - + Start HTML Start HTML - + End HTML End HTML @@ -2663,32 +2868,32 @@ OpenLP.FormattingTagForm - + Update Error Update Error - + Tag "n" already defined. Tag "n" already defined. - + New Tag New Tag - + <HTML here> <HTML here> - + </and here> </and here> - + Tag %s already defined. Tag %s already defined. @@ -2696,82 +2901,82 @@ OpenLP.FormattingTags - + Red Red - + Black Black - + Blue Blue - + Yellow Yellow - + Green Green - + Pink Pink - + Orange Orange - + Purple Purple - + White White - + Superscript Superscript - + Subscript Subscript - + Paragraph Paragraph - + Bold Bold - + Italics Italics - + Underline Underline - + Break Break @@ -2779,180 +2984,170 @@ OpenLP.GeneralTab - + General General - + Monitors Monitors - + Select monitor for output display: Select monitor for output display: - + Display if a single screen Display if a single screen - + Application Startup Application Startup - + Show blank screen warning Show blank screen warning - + Automatically open the last service Automatically open the last service - + Show the splash screen Show the splash screen - + Application Settings Application Settings - + Prompt to save before starting a new service Prompt to save before starting a new service - + Automatically preview next item in service Automatically preview next item in service - + sec sec - + CCLI Details CCLI Details - + SongSelect username: SongSelect username: - + SongSelect password: SongSelect password: - + X X - + Y Y - + Height Height - + Width Width - + Check for updates to OpenLP Check for updates to OpenLP - + Unblank display when adding new live item Unblank display when adding new live item - + Timed slide interval: Timed slide interval: - + Background Audio Background Audio - + Start background audio paused Start background audio paused - + Service Item Slide Limits Service Item Slide Limits - - &End Slide - &End Slide - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - &Wrap Slide - &Wrap Slide + + Override display position: + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list + Repeat track list - - &Next Item - &Next Item + + Behavior of next/previous on the last/first slide: + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide + &Remain on Slide - - Override display position: - Override display position: + + &Wrap around + &Wrap around - - Repeat track list - Repeat track list + + &Move to next/previous service item + &Move to next/previous service item OpenLP.LanguageManager - + Language Language - + Please restart OpenLP to use your new language setting. Please restart OpenLP to use your new language setting. @@ -2968,287 +3163,287 @@ OpenLP.MainWindow - + &File &File - + &Import &Import - + &Export &Export - + &View &View - + M&ode M&ode - + &Tools &Tools - + &Settings &Settings - + &Language &Language - + &Help &Help - + Media Manager Media Manager - + Service Manager Service Manager - + Theme Manager Theme Manager - + &New &New - + &Open &Open - + Open an existing service. Open an existing service. - + &Save &Save - + Save the current service to disk. Save the current service to disk. - + Save &As... Save &As... - + Save Service As Save Service As - + Save the current service under a new name. Save the current service under a new name. - + E&xit E&xit - + Quit OpenLP Quit OpenLP - + &Theme &Theme - + &Configure OpenLP... &Configure OpenLP... - + &Media Manager &Media Manager - + Toggle Media Manager Toggle Media Manager - + Toggle the visibility of the media manager. Toggle the visibility of the media manager. - + &Theme Manager &Theme Manager - + Toggle Theme Manager Toggle Theme Manager - + Toggle the visibility of the theme manager. Toggle the visibility of the theme manager. - + &Service Manager &Service Manager - + Toggle Service Manager Toggle Service Manager - + Toggle the visibility of the service manager. Toggle the visibility of the service manager. - + &Preview Panel &Preview Panel - + Toggle Preview Panel Toggle Preview Panel - + Toggle the visibility of the preview panel. Toggle the visibility of the preview panel. - + &Live Panel &Live Panel - + Toggle Live Panel Toggle Live Panel - + Toggle the visibility of the live panel. Toggle the visibility of the live panel. - + &Plugin List &Plugin List - + List the Plugins List the Plugins - + &User Guide &User Guide - + &About &About - + More information about OpenLP More information about OpenLP - + &Online Help &Online Help - + &Web Site &Web Site - + Use the system language, if available. Use the system language, if available. - + Set the interface language to %s Set the interface language to %s - + Add &Tool... Add &Tool... - + Add an application to the list of tools. Add an application to the list of tools. - + &Default &Default - + Set the view mode back to the default. Set the view mode back to the default. - + &Setup &Setup - + Set the view mode to Setup. Set the view mode to Setup. - + &Live &Live - + Set the view mode to Live. 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/. @@ -3257,108 +3452,108 @@ 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 - + English Please add the name of your language here English - + Configure &Shortcuts... Configure &Shortcuts... - + Close OpenLP Close OpenLP - + Are you sure you want to close OpenLP? Are you sure you want to close OpenLP? - + 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. - + &Autodetect &Autodetect - + Update Theme Images Update Theme Images - + Update the preview images for all themes. Update the preview images for all themes. - + Print the current service. Print the current service. - + &Recent Files &Recent Files - + L&ock Panels L&ock Panels - + Prevent the panels being moved. Prevent the panels being moved. - + Re-run First Time Wizard Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3367,43 +3562,43 @@ Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files Clear List - + Clear the list of recent files. Clear the list of recent files. - + Configure &Formatting Tags... Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file Export OpenLP settings to a specified *.config file - + Settings Settings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3416,45 +3611,50 @@ Importing incorrect settings may cause erratic behaviour or OpenLP to terminate abnormally. - + Open File Open File - + OpenLP Export Settings Files (*.conf) OpenLP Export Settings Files (*.conf) - + Import settings Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File Export Settings File - + OpenLP Export Settings File (*.conf) OpenLP Export Settings File (*.conf) + + + New Data Directory Error + New Data Directory Error + OpenLP.Manager - + Database Error Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3463,7 +3663,7 @@ Database: %s - + OpenLP cannot load your database. Database: %s @@ -3475,74 +3675,74 @@ OpenLP.MediaManagerItem - + No Items Selected No Items Selected - + &Add to selected Service Item &Add to selected Service Item - + You must select one or more items to preview. You must select one or more items to preview. - + You must select one or more items to send live. You must select one or more items to send live. - + You must select one or more items. You must select one or more items. - + You must select an existing service item to add to. You must select an existing service item to add to. - + Invalid Service Item Invalid Service Item - + You must select a %s service item. You must select a %s service item. - + You must select one or more items to add. You must select one or more items to add. - + No Search Results No Search Results - + Invalid File Type Invalid File Type - + Invalid File %s. Suffix not supported Invalid File %s. Suffix not supported - + &Clone &Clone - + Duplicate files were found on import and were ignored. Duplicate files were found on import and were ignored. @@ -3550,12 +3750,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. <lyrics> tag is missing. - + <verse> tag is missing. <verse> tag is missing. @@ -3563,27 +3763,27 @@ OpenLP.PluginForm - + Plugin List Plugin List - + Plugin Details Plugin Details - + Status: Status: - + Active Active - + Inactive Inactive @@ -3606,12 +3806,12 @@ OpenLP.PrintServiceDialog - + Fit Page Fit Page - + Fit Width Fit Width @@ -3619,7 +3819,7 @@ OpenLP.PrintServiceForm - + Options Options @@ -3634,47 +3834,47 @@ 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 - + Add page break before each text item Add page break before each text item - + Service Sheet Service Sheet @@ -3684,12 +3884,12 @@ Print - + Title: Title: - + Custom Footer Text: Custom Footer Text: @@ -3697,12 +3897,12 @@ OpenLP.ScreenList - + Screen Screen - + primary primary @@ -3710,12 +3910,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Start</strong>: %s - + <strong>Length</strong>: %s <strong>Length</strong>: %s @@ -3723,7 +3923,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Reorder Service Item @@ -3731,82 +3931,82 @@ OpenLP.ServiceManager - + Move to &top Move to &top - + Move item to the top of the service. Move item to the top of the service. - + Move &up Move &up - + Move item up one position in the service. Move item up one position in the service. - + Move &down Move &down - + Move item down one position in the service. Move item down one position in the service. - + Move to &bottom Move to &bottom - + Move item to the end of the service. Move item to the end of the service. - + &Delete From Service &Delete From Service - + Delete the selected item from the service. Delete the selected item from the service. - + &Add New Item &Add New Item - + &Add to Selected Item &Add to Selected Item - + &Edit Item &Edit Item - + &Reorder Item &Reorder Item - + &Notes &Notes - + &Change Item Theme &Change Item Theme @@ -3828,112 +4028,107 @@ 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 - + &Expand all &Expand all - + Expand all the service items. Expand all the service items. - + &Collapse all &Collapse all - + Collapse all the service items. Collapse all the service items. - + Open File Open File - + 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. - + &Start Time &Start Time - + Show &Preview Show &Preview - - Show &Live - Show &Live - - - + Modified Service Modified Service - + 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? - + Custom Service Notes: Custom Service Notes: - + Notes: Notes: - + Playing time: Playing time: - + Untitled Service Untitled Service @@ -3958,17 +4153,17 @@ Corrupt File - + Load an existing service. Load an existing service. - + Save this service. Save this service. - + Select a theme for the service. Select a theme for the service. @@ -3978,7 +4173,7 @@ This file is either corrupt or it is not an OpenLP 2.0 service file. - + Service File Missing Service File Missing @@ -4002,11 +4197,21 @@ Service copy only Service copy only + + + Error Saving File + Error Saving File + + + + There was an error saving your file. + There was an error saving your file. + OpenLP.ServiceNoteForm - + Service Item Notes Service Item Notes @@ -4022,67 +4227,67 @@ OpenLP.ShortcutListDialog - + Action Action - + Shortcut Shortcut - + Duplicate Shortcut Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default Default - + Custom Custom - + Capture shortcut. Capture shortcut. - + Restore the default shortcut of this action. Restore the default shortcut of this action. - + Restore Default Shortcuts Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts Configure Shortcuts @@ -4090,177 +4295,172 @@ OpenLP.SlideController - + Hide Hide - + Go To Go To - + Blank Screen Blank Screen - + Blank to Theme Blank to Theme - + Show Desktop Show Desktop - + Previous Service Previous Service - + Next Service Next Service - + Escape Item Escape Item - + Move to previous. Move to previous. - + Move to next. Move to next. - + Play Slides Play Slides - + Delay between slides in seconds. Delay between slides in seconds. - + Move to live. Move to live. - + Add to Service. Add to Service. - + Edit and reload song preview. Edit and reload song preview. - + Start playing media. Start playing media. - + Pause audio. Pause audio. - + Pause playing media. Pause playing media. - + Stop playing media. Stop playing media. - + Video position. Video position. - + Audio Volume. Audio Volume. - + Go to "Verse" Go to "Verse" - + Go to "Chorus" Go to "Chorus" - + Go to "Bridge" Go to "Bridge" - + Go to "Pre-Chorus" Go to "Pre-Chorus" - + Go to "Intro" Go to "Intro" - + Go to "Ending" Go to "Ending" - + Go to "Other" Go to "Other" - + Previous Slide Previous Slide - + Next Slide Next Slide - + Pause Audio Pause Audio - + Background Audio Background Audio - - Next Track - Next Track - - - + Go to next audio track. Go to next audio track. - + Tracks Tracks @@ -4336,17 +4536,17 @@ Start time is after the finish time of the media item - + Theme Layout Theme Layout - + The blue box shows the main area. The blue box shows the main area. - + The red box shows the footer. The red box shows the footer. @@ -4354,32 +4554,32 @@ OpenLP.ThemeForm - + Select Image Select Image - + Theme Name Missing Theme Name Missing - + There is no name for this theme. Please enter one. There is no name for this theme. Please enter one. - + Theme Name Invalid Theme Name Invalid - + Invalid theme name. Please enter one. Invalid theme name. Please enter one. - + (approximately %d lines per slide) (approximately %d lines per slide) @@ -4387,193 +4587,193 @@ OpenLP.ThemeManager - + Create a new theme. Create a new theme. - + Edit Theme Edit Theme - + Edit a theme. Edit a theme. - + Delete Theme Delete Theme - + Delete a theme. Delete a theme. - + Import Theme Import Theme - + Import a theme. Import a theme. - + Export Theme Export Theme - + Export a theme. Export a theme. - + &Edit Theme &Edit Theme - + &Delete Theme &Delete Theme - + Set As &Global Default 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. - + Theme %s is used in the %s plugin. Theme %s is used in the %s plugin. - + 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. File is not a valid theme. - + &Copy Theme &Copy Theme - + &Rename Theme &Rename Theme - + &Export Theme &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) - + Copy of %s Copy of <theme name> Copy of %s - + Theme Already Exists Theme Already Exists @@ -4581,272 +4781,272 @@ OpenLP.ThemeWizard - + Theme Wizard Theme Wizard - + Welcome to the Theme Wizard Welcome to the Theme Wizard - + Set Up Background Set Up Background - + Set up your theme's background according to the parameters below. Set up your theme's background according to the parameters below. - + Background type: Background type: - + Solid Color Solid Color - + Gradient Gradient - + Color: Color: - + Gradient: Gradient: - + Horizontal Horizontal - + Vertical Vertical - + Circular Circular - + Top Left - Bottom Right Top Left - Bottom Right - + Bottom Left - Top Right Bottom Left - Top Right - + Main Area Font Details Main Area Font Details - + Define the font and display characteristics for the Display text Define the font and display characteristics for the Display text - + Font: Font: - + Size: Size: - + Line Spacing: Line Spacing: - + &Outline: &Outline: - + &Shadow: &Shadow: - + Bold Bold - + Italic Italic - + Footer Area Font Details Footer Area Font Details - + Define the font and display characteristics for the Footer text Define the font and display characteristics for the Footer text - + Text Formatting Details Text Formatting Details - + Allows additional display formatting information to be defined Allows additional display formatting information to be defined - + Horizontal Align: Horizontal Align: - + Left Left - + Right Right - + Center Center - + 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 - + X position: X position: - + px px - + Y position: Y position: - + Width: Width: - + Height: Height: - + Use default location Use default location - + 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: - + Edit Theme - %s Edit Theme - %s - + 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 - + Starting color: Starting color: - + Ending color: Ending color: - + Background color: Background color: - + Justify Justify - + Layout Preview Layout Preview - + Transparent Transparent @@ -4854,47 +5054,47 @@ OpenLP.ThemesTab - + Global Theme Global Theme - + Theme Level Theme Level - + S&ong Level S&ong Level - + 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 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 &Service Level - + 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. 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. - + &Global Level &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. Use the global theme, overriding any themes associated with either the service or the songs. - + Themes Themes @@ -4978,239 +5178,239 @@ pt - + Image Image - + Import Import - + Live Live - + Live Background Error Live Background Error - + Load Load - + Middle Middle - + New New - + New Service New Service - + New Theme New Theme - + No File Selected Singular No File Selected - + No Files Selected Plural No Files Selected - + No Item Selected Singular No Item Selected - + No Items Selected Plural No Items Selected - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Preview - + Replace Background Replace Background - + Reset Background Reset Background - + s The abbreviated unit for seconds s - + Save && Preview Save && Preview - + Search Search - + You must select an item to delete. You must select an item to delete. - + You must select an item to edit. You must select an item to edit. - + Save Service Save Service - + Service Service - + Start %s Start %s - + Theme Singular Theme - + Themes Plural Themes - + Top Top - + Version Version - + 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. - + &Vertical Align: &Vertical Align: - + Finished import. Finished import. - + Format: Format: - + Importing Importing - + Importing "%s"... Importing "%s"... - + Select Import Source Select Import Source - + Select the import format and the location to import from. 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 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. - + Open %s File Open %s File - + %p% %p% - + Ready. Ready. - + Starting import... Starting import... - + 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. @@ -5226,7 +5426,7 @@ Welcome to the Song Export Wizard - + Welcome to the Song Import Wizard Welcome to the Song Import Wizard @@ -5314,53 +5514,53 @@ h - + Layout style: Layout style: - + Live Toolbar Live Toolbar - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP is already running. Do you wish to continue? - + Settings Settings - + Tools Tools - + Unsupported File Unsupported File - + Verse Per Slide Verse Per Slide - + Verse Per Line Verse Per Line - + View View @@ -5375,42 +5575,37 @@ XML syntax error - + View Mode View Mode - + Open service. Open service. - + Print Service Print Service - + Replace live background. Replace live background. - + Reset live background. Reset live background. - - &Split - &Split - - - + Split a slide into two only if it does not fit on the screen as one slide. Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard Welcome to the Bible Upgrade Wizard @@ -5420,53 +5615,105 @@ Confirm Delete - + Play Slides in Loop Play Slides in Loop - + Play Slides to End Play Slides to End - + Stop Play Slides in Loop Stop Play Slides in Loop - + Stop Play Slides to End Stop Play Slides to End - + Next Track Next Track + + + Search Themes... + Search bar place holder text + Search Themes... + + + + Optional &Split + Optional &Split + + + + Invalid Folder Selected + Singular + Invalid Folder Selected + + + + Invalid File Selected + Singular + Invalid File Selected + + + + Invalid Files Selected + Plural + Invalid Files Selected + + + + No Folder Selected + Singular + No Folder Selected + + + + Open %s Folder + Open %s Folder + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + You need to specify one %s file to import from. + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + You need to specify one %s folder to import from. + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 and %2 - + %1, and %2 Locale list separator: end %1, and %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5475,50 +5722,50 @@ PresentationPlugin - + <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>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. - + Presentation name singular Presentation - + Presentations name plural Presentations - + Presentations container title Presentations - + 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. @@ -5526,70 +5773,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Select Presentation(s) - + Automatic Automatic - + Present using: Present using: - + File Exists File Exists - + A presentation with that filename already exists. A presentation with that filename already exists. - + This type of presentation is not supported. This type of presentation is not supported. - + 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. - - The Presentation %s is incomplete, please reload. - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers Available Controllers - + %s (unavailable) %s (unavailable) - + Allow presentation application to be overridden Allow presentation application to be overridden @@ -5623,135 +5870,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 Remote - + OpenLP 2.0 Stage View OpenLP 2.0 Stage View - + Service Manager Service Manager - + Slide Controller Slide Controller - + Alerts Alerts - + Search Search - - Back - Back - - - + Refresh Refresh - + Blank Blank - + Show Show - + Prev Prev - + Next Next - + Text Text - + Show Alert Show Alert - + Go Live Go Live - + No Results No Results - + Options Options - + Add to Service Add to Service + + + Home + Home + + + + Theme + Theme + + + + Desktop + Desktop + + + + Add &amp; Go to Service + Add &amp; Go to Service + RemotePlugin.RemoteTab - + Serve on IP address: Serve on IP address: - + Port number: Port number: - + Server Settings Server Settings - + Remote URL: Remote URL: - + Stage view URL: Stage view URL: - + Display stage time in 12h format Display stage time in 12h format - + Android App Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5759,85 +6021,85 @@ SongUsagePlugin - + &Song Usage Tracking &Song Usage Tracking - + &Delete Tracking Data &Delete Tracking Data - + Delete song usage data up to a specified date. Delete song usage data up to a specified date. - + &Extract Tracking Data &Extract Tracking Data - + Generate a report on song usage. Generate a report on song usage. - + Toggle Tracking Toggle Tracking - + Toggle the tracking of song usage. 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 />This plugin tracks the usage of songs in services. - + SongUsage name singular SongUsage - + SongUsage name plural SongUsage - + SongUsage container title SongUsage - + Song Usage Song Usage - + Song usage tracking is active. Song usage tracking is active. - + Song usage tracking is inactive. Song usage tracking is inactive. - + display display - + printed printed @@ -5845,7 +6107,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Delete Song Usage Data @@ -5870,7 +6132,7 @@ All requested data has been deleted successfully. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5878,42 +6140,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Song Usage Extraction - + Select Date Range Select Date Range - + to to - + Report Location Report Location - + Output File Location Output File Location - + usage_detail_%s_%s.txt usage_detail_%s_%s.txt - + Report Creation Report Creation - + Report %s has been successfully created. @@ -5922,12 +6184,12 @@ has been successfully created. - + Output Path Not Selected Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5965,82 +6227,82 @@ Reindexing songs... - + 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. @@ -6049,26 +6311,26 @@ 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. - + Song name singular Song - + Songs name plural Songs - + Songs container title Songs @@ -6079,32 +6341,32 @@ Exports songs using the export wizard. - + 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. @@ -6132,17 +6394,17 @@ Last name: - + You need to type in the first name of the author. You need to type in the first name of the author. - + You need to type in the last name of the author. You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? You have not set a display name for the author, combine the first and last names? @@ -6173,209 +6435,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Meta Data + + + + Custom Book Names + Custom Book Names + + + SongsPlugin.EditSongForm - + Song Editor Song Editor - + &Title: &Title: - + Alt&ernate title: Alt&ernate title: - + &Lyrics: &Lyrics: - + &Verse order: &Verse order: - + Ed&it All Ed&it All - + Title && Lyrics Title && Lyrics - + &Add to Song &Add to Song - + &Remove &Remove - + &Manage Authors, Topics, Song Books &Manage Authors, Topics, Song Books - + A&dd to Song A&dd to Song - + R&emove R&emove - + Book: Book: - + Number: Number: - + Authors, Topics && Song Book Authors, Topics && Song Book - + New &Theme New &Theme - + Copyright Information Copyright Information - + Comments Comments - + Theme, Copyright Info && Comments Theme, Copyright Info && Comments - + Add Author Add Author - + This author does not exist, do you want to add them? This author does not exist, do you want to add them? - + This author is already in the list. This author is already in the list. - + 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. 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. - + Add Topic Add Topic - + This topic does not exist, do you want to add it? This topic does not exist, do you want to add it? - + This topic is already in the list. This topic is already in the list. - + 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 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. You need to type in a song title. - + You need to type in at least one verse. You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book Add Book - + This song book does not exist, do you want to add it? This song book does not exist, do you want to add it? - + 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. - + Linked Audio Linked Audio - + Add &File(s) Add &File(s) - + Add &Media Add &Media - + Remove &All Remove &All - + Open File(s) Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6489,130 +6764,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Select Document/Presentation Files - + Song Import Wizard 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. 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. - + Generic Document/Presentation Generic Document/Presentation - - Filename: - Filename: - - - - 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. - 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. - - - + Add Files... Add Files... - + Remove File(s) Remove File(s) - + Please wait while your songs are imported. Please wait while your songs are imported. - + 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 - - 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. - - - + Songs Of Fellowship Song Files Songs Of Fellowship Song Files - + SongBeamer Files SongBeamer Files - + SongShow Plus Song Files SongShow Plus Song Files - + Foilpresenter Song Files Foilpresenter Song Files - + Copy Copy - + Save to File Save to File - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files OpenLyrics Files + + + CCLI SongSelect Files + CCLI SongSelect Files + + + + EasySlides XML File + EasySlides XML File + + + + EasyWorship Song Database + EasyWorship Song Database + + + + DreamBeam Song Files + DreamBeam Song Files + + + + You need to specify a valid PowerSong 1.0 database folder. + You need to specify a valid PowerSong 1.0 database folder. + + + + ZionWorx (CSV) + ZionWorx (CSV) + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + SongsPlugin.MediaFilesForm - + Select Media File(s) Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. Select one or more audio files from the list below, and click OK to import them into this song. @@ -6620,27 +6915,27 @@ SongsPlugin.MediaItem - + Titles Titles - + Lyrics Lyrics - + 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)? @@ -6648,16 +6943,41 @@ - + Maintain the lists of authors, topics and books. Maintain the lists of authors, topics and books. - + copy For song cloning copy + + + Search Titles... + Search Titles... + + + + Search Entire Song... + Search Entire Song... + + + + Search Lyrics... + Search Lyrics... + + + + Search Authors... + Search Authors... + + + + Search Song Books... + Search Song Books... + SongsPlugin.OpenLP1SongImport @@ -6684,6 +7004,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + No songs to import. + + + + Verses not found. Missing "PART" header. + Verses not found. Missing "PART" header. + + + SongsPlugin.SongBookForm @@ -6722,12 +7055,12 @@ SongsPlugin.SongImport - + copyright copyright - + The following songs could not be imported: The following songs could not be imported: @@ -6748,117 +7081,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Your song import failed. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Could not add your author. - + This author already exists. This author already exists. - + Could not add your topic. Could not add your topic. - + This topic already exists. This topic already exists. - + Could not add your book. Could not add your book. - + This book already exists. This book already exists. - + Could not save your changes. Could not save your changes. - + Could not save your modified author, because the author already exists. Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. Could not save your modified topic, because it already exists. - + Delete Author Delete Author - + Are you sure you want to delete the selected author? Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic Delete Topic - + Are you sure you want to delete the selected topic? Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book Delete Book - + Are you sure you want to delete the selected book? Are you sure you want to delete the selected book? - + This book cannot be deleted, it is currently assigned to at least one song. 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? 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? @@ -6866,29 +7191,29 @@ SongsPlugin.SongsTab - + Songs Mode Songs Mode - + Enable search as you type Enable search as you type - + Display verses on live tool bar Display verses on live tool bar - + Update service from song edit Update service from song edit - - Add missing songs when opening service - Add missing songs when opening service + + Import missing songs from service files + Import missing songs from service files @@ -6947,4 +7272,17 @@ Other + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Error reading CSV file. + + + + File not valid ZionWorx CSV format. + File not valid ZionWorx CSV format. + + diff -Nru openlp-1.9.9/resources/i18n/en_ZA.ts openlp-1.9.10/resources/i18n/en_ZA.ts --- openlp-1.9.9/resources/i18n/en_ZA.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/en_ZA.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Alert - + Show an alert message. Show an alert message. - + Alert name singular Alert - + Alerts name plural Alerts - + Alerts container title Alerts - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Alert Message - + Alert &text: Alert &text: - + &New &New - + &Save &Save - + Displ&ay Displ&ay - + Display && Cl&ose Display && Cl&ose @@ -79,7 +79,7 @@ You haven't specified any text for your alert. Please type in some text before clicking New. - + &Parameter: &Parameter: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Font - + Font name: Font name: - + Font color: Font color: - + Background color: Background color: - + Font size: Font size: - + Alert timeout: Alert timeout: @@ -152,551 +152,596 @@ BiblesPlugin - + &Bible &Bible - + Bible name singular Bible - + Bibles name plural Bibles - + Bibles container title Bibles - + No Book Found No Book Found - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. - + Import a Bible. Import a Bible. - + Add a new Bible. Add a new Bible. - + Edit the selected Bible. Edit the selected Bible. - + Delete the selected Bible. Delete the selected Bible. - + Preview the selected Bible. Preview the selected Bible. - + Send the selected Bible live. Send the selected Bible live. - + Add the selected Bible to the service. Add the selected Bible to the service. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. - + &Upgrade older Bibles &Upgrade older Bibles - + Upgrade the Bible databases to the latest format. Upgrade the Bible databases to the latest format. - + Genesis Genesis - + Exodus Exodus - + Leviticus Leviticus - + Numbers Numbers - + Deuteronomy Deuteronomy - + Joshua Joshua - + Judges Judges - + Ruth Ruth - + 1 Samuel 1 Samuel - + 2 Samuel 2 Samuel - + 1 Kings 1 Kings - + 2 Kings 2 Kings - + 1 Chronicles 1 Chronicles - + 2 Chronicles 2 Chronicles - + Ezra Ezra - + Nehemiah Nehemiah - + Esther Esther - + Job Job - + Psalms Psalms - + Proverbs Proverbs - + Ecclesiastes Ecclesiastes - + Song of Solomon Song of Solomon - + Isaiah Isaiah - + Jeremiah Jeremiah - + Lamentations Lamentations - + Ezekiel Ezekiel - + Daniel Daniel - + Hosea Hosea - + Joel Joel - + Amos Amos - + Obadiah Obadiah - + Jonah Jonah - + Micah Micah - + Nahum Nahum - + Habakkuk Habakkuk - + Zephaniah Zephaniah - + Haggai Haggai - + Zechariah Zechariah - + Malachi Malachi - + Matthew Matthew - + Mark Mark - + Luke Luke - + John John - + Acts Acts - + Romans Romans - + 1 Corinthians 1 Corinthians - + 2 Corinthians 2 Corinthians - + Galatians Galatians - + Ephesians Ephesians - + Philippians Philippians - + Colossians Colossians - + 1 Thessalonians 1 Thessalonians - + 2 Thessalonians 2 Thessalonians - + 1 Timothy 1 Timothy - + 2 Timothy 2 Timothy - + Titus Titus - + Philemon Philemon - + Hebrews Hebrews - + James James - + 1 Peter 1 Peter - + 2 Peter 2 Peter - + 1 John 1 John - + 2 John 2 John - + 3 John 3 John - + Jude Jude - + Revelation Revelation - + Judith Judith - + Wisdom Wisdom - + Tobit Tobit - + Sirach Sirach - + Baruch Baruch - + 1 Maccabees 1 Maccabees - + 2 Maccabees 2 Maccabees - + 3 Maccabees 3 Maccabees - + 4 Maccabees 4 Maccabees - + Rest of Daniel Rest of Daniel - + Rest of Esther Rest of Esther - + Prayer of Manasses Prayer of Manasses - + Letter of Jeremiah Letter of Jeremiah - + Prayer of Azariah Prayer of Azariah - + Susanna Susanna - + Bel Bel - + 1 Esdras 1 Esdras - + 2 Esdras 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. :|v|V|verse|verses;;-|to;;,|and;;end + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + You need to specify a version name for your Bible. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + + + + Bible Exists + Bible Exists + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + This Bible already exists. Please import a different Bible or first delete the existing one. + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error Scripture Reference Error - + Web Bible cannot be used Web Bible cannot be used - + Text Search is not available with Web Bibles. Text Search is not available with Web Bibles. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. - + No Bibles Available No Bibles Available - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +764,79 @@ BiblesPlugin.BiblesTab - + Verse Display Verse Display - + Only show new chapter numbers Only show new chapter numbers - + Bible theme: Bible theme: - + No Brackets No Brackets - + ( And ) ( And ) - + { And } { And } - + [ And ] [ And ] - + Note: Changes do not affect verses already in the service. Note: Changes do not affect verses already in the service. - + Display second Bible verses Display second Bible verses - + Custom Scripture References Custom Scripture References - + Verse Separator: Verse Separator: - + Range Separator: Range Separator: - + List Separator: List Separator: - + End Mark: End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +845,7 @@ Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +854,7 @@ Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +863,7 @@ Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,91 +872,79 @@ Please clear this edit line to use the default value. - - Preferred Bookname Language - Preferred Bookname Language - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + English + English - - Bible language - Bible language + + Default Bible Language + - - Application language - Application language + + Book name language in search field, +search results and on display: + - - English - English + + Bible Language + - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language + BiblesPlugin.BookNameDialog - + Select Book Name Select Book Name - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - - - + Current name: Current name: - + Corresponding name: Corresponding name: - + Show Books From Show Books From - + Old Testament Old Testament - + New Testament New Testament - + Apocrypha Apocrypha + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. You need to select a book. @@ -936,40 +969,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + License Details + + + + Version name: + Version name: + + + + Copyright: + Copyright: + + + + Permissions: + Permissions: + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registering Bible and loading books... - + Registering Language... Registering Language... - + Importing %s... Importing <book name>... Importing %s... - + Download Error Download Error - + 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. 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. - + Parse Error Parse Error - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. @@ -1147,17 +1249,17 @@ BiblesPlugin.LanguageDialog - + Select Language Select Language - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - + Language: Language: @@ -1173,85 +1275,100 @@ BiblesPlugin.MediaItem - + Quick Quick - + Find: Find: - + Book: Book: - + Chapter: Chapter: - + Verse: Verse: - + From: From: - + To: To: - + Text Search Text Search - + Second: Second: - + Scripture Reference Scripture Reference - + Toggle to keep or clear the previous results. Toggle to keep or clear the previous results. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. Bible not fully loaded. - + Information Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importing %s %s... @@ -1260,12 +1377,12 @@ 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... @@ -1274,149 +1391,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Select a Backup Directory - + Bible Upgrade Wizard Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory Select Backup Directory - + Please select a backup directory for your Bibles Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. Please select a backup location for your Bibles. - + Backup Directory: Backup Directory: - + There is no need to backup my Bibles There is no need to backup my Bibles - + Select Bibles Select Bibles - + Please select the Bibles to upgrade Please select the Bibles to upgrade - + Upgrading Upgrading - + Please wait while your Bibles are upgraded. Please wait while your Bibles are upgraded. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. The backup was not successful. To backup your Bibles you need permission to write to the given directory. - + Upgrading Bible %s of %s: "%s" Failed Upgrading Bible %s of %s: "%s" Failed - + Upgrading Bible %s of %s: "%s" Upgrading ... Upgrading Bible %s of %s: "%s" Upgrading ... - + Download Error Download Error - + To upgrade your Web Bibles an Internet connection is required. To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Upgrading Bible %s of %s: "%s" Upgrading %s ... - + Upgrading Bible %s of %s: "%s" Complete Upgrading Bible %s of %s: "%s" Complete - + , %s failed , %s failed - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s Upgrading Bible(s): %s successful%s - + Upgrade failed. Upgrade failed. - + You need to specify a backup directory for your Bibles. You need to specify a backup directory for your Bibles. - + Starting upgrade... Starting upgrade... - + There are no Bibles that need to be upgraded. There are no Bibles that need to be upgraded. @@ -1490,12 +1607,12 @@ CustomPlugin.CustomTab - + Custom Display Custom Display - + Display footer Display footer @@ -1503,42 +1620,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Edit Custom Slides - + &Title: &Title: - + Add a new slide at bottom. Add a new slide at bottom. - + Edit the selected slide. Edit the selected slide. - + Edit all the slides at once. Edit all the slides at once. - + Split a slide into two by inserting a slide splitter. Split a slide into two by inserting a slide splitter. - + The&me: The&me: - + &Credits: &Credits: @@ -1553,12 +1670,12 @@ You need to add at least one slide - + Ed&it All Ed&it All - + Insert Slide Insert Slide @@ -1566,7 +1683,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Are you sure you want to delete the selected custom slide? @@ -1577,60 +1694,60 @@ ImagePlugin - + <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>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. - + Image name singular Image - + Images name plural Images - + Images container title Images - + Load a new image. Load a new image. - + Add a new image. Add a new image. - + Edit the selected image. Edit the selected image. - + Delete the selected image. Delete the selected image. - + Preview the selected image. Preview the selected image. - + Send the selected image live. Send the selected image live. - + Add the selected image to the service. Add the selected image to the service. @@ -1638,7 +1755,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Select Attachment @@ -1646,44 +1763,44 @@ ImagePlugin.MediaItem - + Select Image(s) Select Image(s) - + You must select an image to delete. You must select an image to delete. - + You must select an image to replace the background with. You must select an image to replace the background with. - + 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. - + There was no display item to amend. There was no display item to amend. @@ -1691,78 +1808,78 @@ ImagesPlugin.ImageTab - + Background Color Background Colour - + Default Color: Default Colour: - - Provides border where image is not the correct dimensions for the screen when resized. - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. + MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - + Media name singular Media - + Media name plural Media - + Media container title Media - + Load new media. Load new media. - + Add new media. Add new media. - + Edit the selected media. Edit the selected media. - + Delete the selected media. Delete the selected media. - + Preview the selected media. Preview the selected media. - + Send the selected media live. Send the selected media live. - + Add the selected media to the service. Add the selected media to the service. @@ -1810,7 +1927,7 @@ There was no display item to amend. - + Unsupported File Unsupported File @@ -1828,22 +1945,22 @@ MediaPlugin.MediaTab - + Available Media Players Available Media Players - + %s (unavailable) %s (unavailable) - + Player Order Player Order - + Allow media player to be overridden Allow media player to be overridden @@ -1851,7 +1968,7 @@ OpenLP - + Image Files Image Files @@ -1873,17 +1990,17 @@ OpenLP.AboutForm - + Credits Credits - + License License - + Contribute Contribute @@ -1893,17 +2010,17 @@ build %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. 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 @@ -2028,7 +2145,7 @@ He has set us free. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2045,7 +2162,7 @@ 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. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Copyright © 2004-2012 %s @@ -2055,87 +2172,87 @@ OpenLP.AdvancedTab - + UI Settings UI Settings - + Number of recent files to display: Number of recent files to display: - + Remember active media manager tab on startup Remember active media manager tab on startup - + Double-click to send items straight to live Double-click to send items straight to live - + Expand new service items on creation Expand new service items on creation - + 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 colour: - + Image file: Image file: - + Open File Open File - + Advanced Advanced - + Preview items when clicked in Media Manager Preview items when clicked in Media Manager - + Click to select a color. Click to select a colour. - + Browse for an image file to display. Browse for an image file to display. - + Revert to the default OpenLP logo. Revert to the default OpenLP logo. @@ -2147,137 +2264,219 @@ Service %Y-%m-%d %H-%M - + Default Service Name Default Service Name - + Enable default service name Enable default service name - + Date and Time: Date and Time: - + Monday Monday - + Tuesday Tuesday - + Wednesday Wednesday - + Thurdsday Thurdsday - + Friday Friday - + Saturday Saturday - + Sunday Sunday - + Now Now - + Time when usual service starts. Time when usual service starts. - + Name: Name: - + Consult the OpenLP manual for usage. Consult the OpenLP manual for usage. - + Revert to the default service name "%s". Revert to the default service name "%s". - + Example: Example: - + X11 X11 - + Bypass X11 Window Manager Bypass X11 Window Manager - + Syntax error. Syntax error. + + + Data Location + + + + + Current path: + + + + + Custom path: + + + + + Browse for new data file location. + + + + + Set the data location to the default. + + + + + Cancel + Cancel + + + + Cancel OpenLP data directory location change. + + + + + Copy data to new location. + + + + + Copy the OpenLP data files to the new location. + + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + + + + + Data Directory Error + + + + + Select Data Directory Location + + + + + Confirm Data Directory Change + + + + + Reset Data Directory + + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + + + + + Overwrite Existing Data + + OpenLP.ExceptionDialog - + Error Occurred Error Occurred - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. - + 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 @@ -2285,24 +2484,24 @@ OpenLP.ExceptionForm - + Platform: %s Platform: %s - + Save Crash Report Save Crash Report - + Text files (*.txt *.log *.text) Text files (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2333,7 +2532,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2469,17 +2668,17 @@ Default Settings - + Downloading %s... Downloading %s... - + Download complete. Click the finish button to start OpenLP. Download complete. Click the finish button to start OpenLP. - + Enabling selected plugins... Enabling selected plugins... @@ -2549,32 +2748,32 @@ This wizard will help you to configure OpenLP for initial use. Click the next button below to start. - + Setting Up And Downloading Setting Up And Downloading - + Please wait while OpenLP is set up and your data is downloaded. Please wait while OpenLP is set up and your data is downloaded. - + Setting Up Setting Up - + Click the finish button to start OpenLP. Click the finish button to start OpenLP. - + Download complete. Click the finish button to return to OpenLP. Download complete. Click the finish button to return to OpenLP. - + Click the finish button to return to OpenLP. Click the finish button to return to OpenLP. @@ -2584,78 +2783,74 @@ Custom Slides + + Finish + Finish + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Click the finish button to return to OpenLP.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. Press the Finish button now to start OpenLP with initial settings and no sample data. - -To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. + -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - - - Finish - Finish +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. + OpenLP.FormattingTagDialog - + Configure Formatting Tags Configure Formatting Tags - + Edit Selection Edit Selection - + Save Save - + Description Description - + Tag Tag - + Start tag Start tag - + End tag End tag - + Tag Id Tag Id - + Start HTML Start HTML - + End HTML End HTML @@ -2663,32 +2858,32 @@ OpenLP.FormattingTagForm - + Update Error Update Error - + Tag "n" already defined. Tag "n" already defined. - + New Tag New Tag - + <HTML here> <HTML here> - + </and here> </and here> - + Tag %s already defined. Tag %s already defined. @@ -2696,82 +2891,82 @@ OpenLP.FormattingTags - + Red Red - + Black Black - + Blue Blue - + Yellow Yellow - + Green Green - + Pink Pink - + Orange Orange - + Purple Purple - + White White - + Superscript Superscript - + Subscript Subscript - + Paragraph Paragraph - + Bold Bold - + Italics Italics - + Underline Underline - + Break Break @@ -2779,180 +2974,170 @@ OpenLP.GeneralTab - + General General - + Monitors Monitors - + Select monitor for output display: Select monitor for output display: - + Display if a single screen Display if a single screen - + Application Startup Application Startup - + Show blank screen warning Show blank screen warning - + Automatically open the last service Automatically open the last service - + Show the splash screen Show the splash screen - + Application Settings Application Settings - + Prompt to save before starting a new service Prompt to save before starting a new service - + Automatically preview next item in service Automatically preview next item in service - + sec sec - + CCLI Details CCLI Details - + SongSelect username: SongSelect username: - + SongSelect password: SongSelect password: - + X X - + Y Y - + Height Height - + Width Width - + Check for updates to OpenLP Check for updates to OpenLP - + Unblank display when adding new live item Unblank display when adding new live item - + Timed slide interval: Timed slide interval: - + Background Audio Background Audio - + Start background audio paused Start background audio paused - + Service Item Slide Limits Service Item Slide Limits - - &End Slide - &End Slide - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - &Wrap Slide - &Wrap Slide + + Override display position: + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list + Repeat track list - - &Next Item - &Next Item + + Behavior of next/previous on the last/first slide: + - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide + - - Override display position: - Override display position: + + &Wrap around + - - Repeat track list - Repeat track list + + &Move to next/previous service item + OpenLP.LanguageManager - + Language Language - + Please restart OpenLP to use your new language setting. Please restart OpenLP to use your new language setting. @@ -2968,287 +3153,287 @@ OpenLP.MainWindow - + &File &File - + &Import &Import - + &Export &Export - + &View &View - + M&ode M&ode - + &Tools &Tools - + &Settings &Settings - + &Language &Language - + &Help &Help - + Media Manager Media Manager - + Service Manager Service Manager - + Theme Manager Theme Manager - + &New &New - + &Open &Open - + Open an existing service. Open an existing service. - + &Save &Save - + Save the current service to disk. Save the current service to disk. - + Save &As... Save &As... - + Save Service As Save Service As - + Save the current service under a new name. Save the current service under a new name. - + E&xit E&xit - + Quit OpenLP Quit OpenLP - + &Theme &Theme - + &Configure OpenLP... &Configure OpenLP... - + &Media Manager &Media Manager - + Toggle Media Manager Toggle Media Manager - + Toggle the visibility of the media manager. Toggle the visibility of the media manager. - + &Theme Manager &Theme Manager - + Toggle Theme Manager Toggle Theme Manager - + Toggle the visibility of the theme manager. Toggle the visibility of the theme manager. - + &Service Manager &Service Manager - + Toggle Service Manager Toggle Service Manager - + Toggle the visibility of the service manager. Toggle the visibility of the service manager. - + &Preview Panel &Preview Panel - + Toggle Preview Panel Toggle Preview Panel - + Toggle the visibility of the preview panel. Toggle the visibility of the preview panel. - + &Live Panel &Live Panel - + Toggle Live Panel Toggle Live Panel - + Toggle the visibility of the live panel. Toggle the visibility of the live panel. - + &Plugin List &Plugin List - + List the Plugins List the Plugins - + &User Guide &User Guide - + &About &About - + More information about OpenLP More information about OpenLP - + &Online Help &Online Help - + &Web Site &Web Site - + Use the system language, if available. Use the system language, if available. - + Set the interface language to %s Set the interface language to %s - + Add &Tool... Add &Tool... - + Add an application to the list of tools. Add an application to the list of tools. - + &Default &Default - + Set the view mode back to the default. Set the view mode back to the default. - + &Setup &Setup - + Set the view mode to Setup. Set the view mode to Setup. - + &Live &Live - + Set the view mode to Live. 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/. @@ -3257,108 +3442,108 @@ 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 - + English Please add the name of your language here English (South Africa) - + Configure &Shortcuts... Configure &Shortcuts... - + Close OpenLP Close OpenLP - + Are you sure you want to close OpenLP? Are you sure you want to close OpenLP? - + 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. - + &Autodetect &Autodetect - + Update Theme Images Update Theme Images - + Update the preview images for all themes. Update the preview images for all themes. - + Print the current service. Print the current service. - + &Recent Files &Recent Files - + L&ock Panels L&ock Panels - + Prevent the panels being moved. Prevent the panels being moved. - + Re-run First Time Wizard Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3367,43 +3552,43 @@ Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files Clear List - + Clear the list of recent files. Clear the list of recent files. - + Configure &Formatting Tags... Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file Export OpenLP settings to a specified *.config file - + Settings Settings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3416,45 +3601,50 @@ Importing incorrect settings may cause erratic behaviour or OpenLP to terminate abnormally. - + Open File Open File - + OpenLP Export Settings Files (*.conf) OpenLP Export Settings Files (*.conf) - + Import settings Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File Export Settings File - + OpenLP Export Settings File (*.conf) OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3463,7 +3653,7 @@ Database: %s - + OpenLP cannot load your database. Database: %s @@ -3475,74 +3665,74 @@ OpenLP.MediaManagerItem - + No Items Selected No Items Selected - + &Add to selected Service Item &Add to selected Service Item - + You must select one or more items to preview. You must select one or more items to preview. - + You must select one or more items to send live. You must select one or more items to send live. - + You must select one or more items. You must select one or more items. - + You must select an existing service item to add to. You must select an existing service item to add to. - + Invalid Service Item Invalid Service Item - + You must select a %s service item. You must select a %s service item. - + You must select one or more items to add. You must select one or more items to add. - + No Search Results No Search Results - + Invalid File Type Invalid File Type - + Invalid File %s. Suffix not supported Invalid File %s. Suffix not supported - + &Clone &Clone - + Duplicate files were found on import and were ignored. Duplicate files were found on import and were ignored. @@ -3550,12 +3740,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. <lyrics> tag is missing. - + <verse> tag is missing. <verse> tag is missing. @@ -3563,27 +3753,27 @@ OpenLP.PluginForm - + Plugin List Plugin List - + Plugin Details Plugin Details - + Status: Status: - + Active Active - + Inactive Inactive @@ -3606,12 +3796,12 @@ OpenLP.PrintServiceDialog - + Fit Page Fit Page - + Fit Width Fit Width @@ -3619,7 +3809,7 @@ OpenLP.PrintServiceForm - + Options Options @@ -3634,47 +3824,47 @@ 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 - + Add page break before each text item Add page break before each text item - + Service Sheet Service Sheet @@ -3684,12 +3874,12 @@ Print - + Title: Title: - + Custom Footer Text: Custom Footer Text: @@ -3697,12 +3887,12 @@ OpenLP.ScreenList - + Screen Screen - + primary primary @@ -3710,12 +3900,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Start</strong>: %s - + <strong>Length</strong>: %s <strong>Length</strong>: %s @@ -3723,7 +3913,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Reorder Service Item @@ -3731,82 +3921,82 @@ OpenLP.ServiceManager - + Move to &top Move to &top - + Move item to the top of the service. Move item to the top of the service. - + Move &up Move &up - + Move item up one position in the service. Move item up one position in the service. - + Move &down Move &down - + Move item down one position in the service. Move item down one position in the service. - + Move to &bottom Move to &bottom - + Move item to the end of the service. Move item to the end of the service. - + &Delete From Service &Delete From Service - + Delete the selected item from the service. Delete the selected item from the service. - + &Add New Item &Add New Item - + &Add to Selected Item &Add to Selected Item - + &Edit Item &Edit Item - + &Reorder Item &Reorder Item - + &Notes &Notes - + &Change Item Theme &Change Item Theme @@ -3828,112 +4018,107 @@ 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 - + &Expand all &Expand all - + Expand all the service items. Expand all the service items. - + &Collapse all &Collapse all - + Collapse all the service items. Collapse all the service items. - + Open File Open File - + 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. - + &Start Time &Start Time - + Show &Preview Show &Preview - - Show &Live - Show &Live - - - + Modified Service Modified Service - + 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? - + Custom Service Notes: Custom Service Notes: - + Notes: Notes: - + Playing time: Playing time: - + Untitled Service Untitled Service @@ -3958,17 +4143,17 @@ Corrupt File - + Load an existing service. Load an existing service. - + Save this service. Save this service. - + Select a theme for the service. Select a theme for the service. @@ -3978,7 +4163,7 @@ This file is either corrupt or it is not an OpenLP 2.0 service file. - + Service File Missing Service File Missing @@ -4002,11 +4187,21 @@ Service copy only Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes Service Item Notes @@ -4022,67 +4217,67 @@ OpenLP.ShortcutListDialog - + Action Action - + Shortcut Shortcut - + Duplicate Shortcut Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default Default - + Custom Custom - + Capture shortcut. Capture shortcut. - + Restore the default shortcut of this action. Restore the default shortcut of this action. - + Restore Default Shortcuts Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts Configure Shortcuts @@ -4090,177 +4285,172 @@ OpenLP.SlideController - + Hide Hide - + Go To Go To - + Blank Screen Blank Screen - + Blank to Theme Blank to Theme - + Show Desktop Show Desktop - + Previous Service Previous Service - + Next Service Next Service - + Escape Item Escape Item - + Move to previous. Move to previous. - + Move to next. Move to next. - + Play Slides Play Slides - + Delay between slides in seconds. Delay between slides in seconds. - + Move to live. Move to live. - + Add to Service. Add to Service. - + Edit and reload song preview. Edit and reload song preview. - + Start playing media. Start playing media. - + Pause audio. Pause audio. - + Pause playing media. Pause playing media. - + Stop playing media. Stop playing media. - + Video position. Video position. - + Audio Volume. Audio Volume. - + Go to "Verse" Go to "Verse" - + Go to "Chorus" Go to "Chorus" - + Go to "Bridge" Go to "Bridge" - + Go to "Pre-Chorus" Go to "Pre-Chorus" - + Go to "Intro" Go to "Intro" - + Go to "Ending" Go to "Ending" - + Go to "Other" Go to "Other" - + Previous Slide Previous Slide - + Next Slide Next Slide - + Pause Audio Pause Audio - + Background Audio Background Audio - - Next Track - Next Track - - - + Go to next audio track. Go to next audio track. - + Tracks Tracks @@ -4336,17 +4526,17 @@ Start time is after the finish time of the media item - + Theme Layout Theme Layout - + The blue box shows the main area. The blue box shows the main area. - + The red box shows the footer. The red box shows the footer. @@ -4354,32 +4544,32 @@ OpenLP.ThemeForm - + Select Image Select Image - + Theme Name Missing Theme Name Missing - + There is no name for this theme. Please enter one. There is no name for this theme. Please enter one. - + Theme Name Invalid Theme Name Invalid - + Invalid theme name. Please enter one. Invalid theme name. Please enter one. - + (approximately %d lines per slide) (approximately %d lines per slide) @@ -4387,193 +4577,193 @@ OpenLP.ThemeManager - + Create a new theme. Create a new theme. - + Edit Theme Edit Theme - + Edit a theme. Edit a theme. - + Delete Theme Delete Theme - + Delete a theme. Delete a theme. - + Import Theme Import Theme - + Import a theme. Import a theme. - + Export Theme Export Theme - + Export a theme. Export a theme. - + &Edit Theme &Edit Theme - + &Delete Theme &Delete Theme - + Set As &Global Default 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. - + Theme %s is used in the %s plugin. Theme %s is used in the %s plugin. - + 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. File is not a valid theme. - + &Copy Theme &Copy Theme - + &Rename Theme &Rename Theme - + &Export Theme &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) - + Copy of %s Copy of <theme name> Copy of %s - + Theme Already Exists Theme Already Exists @@ -4581,272 +4771,272 @@ OpenLP.ThemeWizard - + Theme Wizard Theme Wizard - + Welcome to the Theme Wizard Welcome to the Theme Wizard - + Set Up Background Set Up Background - + Set up your theme's background according to the parameters below. Set up your theme's background according to the parameters below. - + Background type: Background type: - + Solid Color Solid Colour - + Gradient Gradient - + Color: Colour: - + Gradient: Gradient: - + Horizontal Horizontal - + Vertical Vertical - + Circular Circular - + Top Left - Bottom Right Top Left - Bottom Right - + Bottom Left - Top Right Bottom Left - Top Right - + Main Area Font Details Main Area Font Details - + Define the font and display characteristics for the Display text Define the font and display characteristics for the Display text - + Font: Font: - + Size: Size: - + Line Spacing: Line Spacing: - + &Outline: &Outline: - + &Shadow: &Shadow: - + Bold Bold - + Italic Italic - + Footer Area Font Details Footer Area Font Details - + Define the font and display characteristics for the Footer text Define the font and display characteristics for the Footer text - + Text Formatting Details Text Formatting Details - + Allows additional display formatting information to be defined Allows additional display formatting information to be defined - + Horizontal Align: Horizontal Align: - + Left Left - + Right Right - + Center Centre - + 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 - + X position: X position: - + px px - + Y position: Y position: - + Width: Width: - + Height: Height: - + Use default location Use default location - + 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: - + Edit Theme - %s Edit Theme - %s - + 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 - + Starting color: Starting color: - + Ending color: Ending color: - + Background color: Background color: - + Justify Justify - + Layout Preview Layout Preview - + Transparent Transparent @@ -4854,47 +5044,47 @@ OpenLP.ThemesTab - + Global Theme Global Theme - + Theme Level Theme Level - + S&ong Level S&ong Level - + 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 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 &Service Level - + 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. 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. - + &Global Level &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. Use the global theme, overriding any themes associated with either the service or the songs. - + Themes Themes @@ -4978,239 +5168,239 @@ pt - + Image Image - + Import Import - + Live Live - + Live Background Error Live Background Error - + Load Load - + Middle Middle - + New New - + New Service New Service - + New Theme New Theme - + No File Selected Singular No File Selected - + No Files Selected Plural No Files Selected - + No Item Selected Singular No Item Selected - + No Items Selected Plural No Items Selected - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Preview - + Replace Background Replace Background - + Reset Background Reset Background - + s The abbreviated unit for seconds s - + Save && Preview Save && Preview - + Search Search - + You must select an item to delete. You must select an item to delete. - + You must select an item to edit. You must select an item to edit. - + Save Service Save Service - + Service Service - + Start %s Start %s - + Theme Singular Theme - + Themes Plural Themes - + Top Top - + Version Version - + 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. - + &Vertical Align: &Vertical Align: - + Finished import. Finished import. - + Format: Format: - + Importing Importing - + Importing "%s"... Importing "%s"... - + Select Import Source Select Import Source - + Select the import format and the location to import from. 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 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. - + Open %s File Open %s File - + %p% %p% - + Ready. Ready. - + Starting import... Starting import... - + 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. @@ -5226,7 +5416,7 @@ Welcome to the Song Export Wizard - + Welcome to the Song Import Wizard Welcome to the Song Import Wizard @@ -5314,53 +5504,53 @@ h - + Layout style: Layout style: - + Live Toolbar Live Toolbar - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP is already running. Do you wish to continue? - + Settings Settings - + Tools Tools - + Unsupported File Unsupported File - + Verse Per Slide Verse Per Slide - + Verse Per Line Verse Per Line - + View View @@ -5375,42 +5565,37 @@ XML syntax error - + View Mode View Mode - + Open service. Open service. - + Print Service Print Service - + Replace live background. Replace live background. - + Reset live background. Reset live background. - - &Split - &Split - - - + Split a slide into two only if it does not fit on the screen as one slide. Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard Welcome to the Bible Upgrade Wizard @@ -5420,53 +5605,105 @@ Confirm Delete - + Play Slides in Loop Play Slides in Loop - + Play Slides to End Play Slides to End - + Stop Play Slides in Loop Stop Play Slides in Loop - + Stop Play Slides to End Stop Play Slides to End - + Next Track Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 and %2 - + %1, and %2 Locale list separator: end %1, and %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5475,50 +5712,50 @@ PresentationPlugin - + <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>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. - + Presentation name singular Presentation - + Presentations name plural Presentations - + Presentations container title Presentations - + 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. @@ -5526,70 +5763,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Select Presentation(s) - + Automatic Automatic - + Present using: Present using: - + File Exists File Exists - + A presentation with that filename already exists. A presentation with that filename already exists. - + This type of presentation is not supported. This type of presentation is not supported. - + 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. - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. + PresentationPlugin.PresentationTab - + Available Controllers Available Controllers - + %s (unavailable) %s (unavailable) - + Allow presentation application to be overridden Allow presentation application to be overridden @@ -5623,135 +5860,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 Remote - + OpenLP 2.0 Stage View OpenLP 2.0 Stage View - + Service Manager Service Manager - + Slide Controller Slide Controller - + Alerts Alerts - + Search Search - - Back - Back - - - + Refresh Refresh - + Blank Blank - + Show Show - + Prev Prev - + Next Next - + Text Text - + Show Alert Show Alert - + Go Live Go Live - + No Results No Results - + Options Options - + Add to Service Add to Service + + + Home + + + + + Theme + Theme + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: Serve on IP address: - + Port number: Port number: - + Server Settings Server Settings - + Remote URL: Remote URL: - + Stage view URL: Stage view URL: - + Display stage time in 12h format Display stage time in 12h format - + Android App Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5759,85 +6011,85 @@ SongUsagePlugin - + &Song Usage Tracking &Song Usage Tracking - + &Delete Tracking Data &Delete Tracking Data - + Delete song usage data up to a specified date. Delete song usage data up to a specified date. - + &Extract Tracking Data &Extract Tracking Data - + Generate a report on song usage. Generate a report on song usage. - + Toggle Tracking Toggle Tracking - + Toggle the tracking of song usage. 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 />This plugin tracks the usage of songs in services. - + SongUsage name singular SongUsage - + SongUsage name plural SongUsage - + SongUsage container title SongUsage - + Song Usage Song Usage - + Song usage tracking is active. Song usage tracking is active. - + Song usage tracking is inactive. Song usage tracking is inactive. - + display display - + printed printed @@ -5845,7 +6097,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Delete Song Usage Data @@ -5870,7 +6122,7 @@ All requested data has been deleted successfully. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5878,42 +6130,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Song Usage Extraction - + Select Date Range Select Date Range - + to to - + Report Location Report Location - + Output File Location Output File Location - + usage_detail_%s_%s.txt usage_detail_%s_%s.txt - + Report Creation Report Creation - + Report %s has been successfully created. @@ -5922,12 +6174,12 @@ has been successfully created. - + Output Path Not Selected Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5965,82 +6217,82 @@ Reindexing songs... - + 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. @@ -6049,26 +6301,26 @@ 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. - + Song name singular Song - + Songs name plural Songs - + Songs container title Songs @@ -6079,32 +6331,32 @@ Exports songs using the export wizard. - + 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. @@ -6132,17 +6384,17 @@ Last name: - + You need to type in the first name of the author. You need to type in the first name of the author. - + You need to type in the last name of the author. You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? You have not set a display name for the author, combine the first and last names? @@ -6173,209 +6425,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor Song Editor - + &Title: &Title: - + Alt&ernate title: Alt&ernate title: - + &Lyrics: &Lyrics: - + &Verse order: &Verse order: - + Ed&it All Ed&it All - + Title && Lyrics Title && Lyrics - + &Add to Song &Add to Song - + &Remove &Remove - + &Manage Authors, Topics, Song Books &Manage Authors, Topics, Song Books - + A&dd to Song A&dd to Song - + R&emove R&emove - + Book: Book: - + Number: Number: - + Authors, Topics && Song Book Authors, Topics && Song Book - + New &Theme New &Theme - + Copyright Information Copyright Information - + Comments Comments - + Theme, Copyright Info && Comments Theme, Copyright Info && Comments - + Add Author Add Author - + This author does not exist, do you want to add them? This author does not exist, do you want to add them? - + This author is already in the list. This author is already in the list. - + 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. 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. - + Add Topic Add Topic - + This topic does not exist, do you want to add it? This topic does not exist, do you want to add it? - + This topic is already in the list. This topic is already in the list. - + 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 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. You need to type in a song title. - + You need to type in at least one verse. You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book Add Book - + This song book does not exist, do you want to add it? This song book does not exist, do you want to add it? - + 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. - + Linked Audio Linked Audio - + Add &File(s) Add &File(s) - + Add &Media Add &Media - + Remove &All Remove &All - + Open File(s) Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6489,130 +6754,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Select Document/Presentation Files - + Song Import Wizard 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. 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. - + Generic Document/Presentation Generic Document/Presentation - - Filename: - Filename: - - - - 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. - 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. - - - + Add Files... Add Files... - + Remove File(s) Remove File(s) - + Please wait while your songs are imported. Please wait while your songs are imported. - + 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 - - 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. - - - + Songs Of Fellowship Song Files Songs Of Fellowship Song Files - + SongBeamer Files SongBeamer Files - + SongShow Plus Song Files SongShow Plus Song Files - + Foilpresenter Song Files Foilpresenter Song Files - + Copy Copy - + Save to File Save to File - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files OpenLyrics Files + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. Select one or more audio files from the list below, and click OK to import them into this song. @@ -6620,27 +6905,27 @@ SongsPlugin.MediaItem - + Titles Titles - + Lyrics Lyrics - + 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)? @@ -6648,16 +6933,41 @@ - + Maintain the lists of authors, topics and books. Maintain the lists of authors, topics and books. - + copy For song cloning copy + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6684,6 +6994,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6722,12 +7045,12 @@ SongsPlugin.SongImport - + copyright copyright - + The following songs could not be imported: The following songs could not be imported: @@ -6748,117 +7071,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Your song import failed. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Could not add your author. - + This author already exists. This author already exists. - + Could not add your topic. Could not add your topic. - + This topic already exists. This topic already exists. - + Could not add your book. Could not add your book. - + This book already exists. This book already exists. - + Could not save your changes. Could not save your changes. - + Could not save your modified author, because the author already exists. Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. Could not save your modified topic, because it already exists. - + Delete Author Delete Author - + Are you sure you want to delete the selected author? Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic Delete Topic - + Are you sure you want to delete the selected topic? Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book Delete Book - + Are you sure you want to delete the selected book? Are you sure you want to delete the selected book? - + This book cannot be deleted, it is currently assigned to at least one song. 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? 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? @@ -6866,29 +7181,29 @@ SongsPlugin.SongsTab - + Songs Mode Songs Mode - + Enable search as you type Enable search as you type - + Display verses on live tool bar Display verses on live tool bar - + Update service from song edit Update service from song edit - - Add missing songs when opening service - Add missing songs when opening service + + Import missing songs from service files + @@ -6947,4 +7262,17 @@ Other + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/es.ts openlp-1.9.10/resources/i18n/es.ts --- openlp-1.9.9/resources/i18n/es.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/es.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Alerta - + Show an alert message. Mostrar mensaje de alerta. - + Alert name singular Alerta - + Alerts name plural Alertas - + Alerts container title Alertas - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Complemento de Alertas</strong><br />El complemento de alertas controla la visualización de mensajes de guardería. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Mensaje de Alerta - + Alert &text: &Texto de alerta: - + &New &Nuevo - + &Save &Guardar - + Displ&ay Mostr&ar - + Display && Cl&ose M&ostrar && Cerrar @@ -79,7 +79,7 @@ No ha especificado ningún texto de alerta. Por favor, escriba algún texto antes de hacer clic en Nueva. - + &Parameter: &Parámetro: @@ -98,7 +98,7 @@ No Placeholder Found - Marcador No Encontrado + Marcador no encontrado @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Fuente - + Font name: Nombre: - + Font color: Color: - + Background color: Color de fondo: - + Font size: Tamaño: - + Alert timeout: Tiempo de espera: @@ -152,551 +152,598 @@ BiblesPlugin - + &Bible &Biblia - + Bible name singular Biblia - + Bibles name plural Biblias - + Bibles container title Biblias - + No Book Found - No se encontró el libro + Libro no encontrado - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. - No se hayó el nombre en esta Biblia. Revise que el nombre del libro esté deletreado correctamente. + No se encontró el libro en esta Biblia. Revise que el nombre del libro esté escrito correctamente. - + Import a Bible. Importar una Biblia. - + Add a new Bible. Agregar una Biblia nueva. - + Edit the selected Bible. Editar la Biblia seleccionada. - + Delete the selected Bible. Eliminar la Biblia seleccionada. - + Preview the selected Bible. - Previsualizar la Biblia seleccionada. + Vista Previa de la Biblia seleccionada. - + Send the selected Bible live. Proyectar la Biblia seleccionada. - + Add the selected Bible to the service. Agregar esta Biblia al servicio. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Complemento de Biblias</strong><br />El complemento de Biblias proporciona la capacidad de mostrar versículos de diversas fuentes, durante el servicio. - + &Upgrade older Bibles &Actualizar Biblias antiguas - + Upgrade the Bible databases to the latest format. - Actualizar las Biblias al formato más nuevo. + Actualizar las Biblias al formato más reciente. - + Genesis Génesis - + Exodus Éxodo - + Leviticus Levítico - + Numbers Números - + Deuteronomy Deuteronomio - + Joshua Josué - + Judges Jueces - + Ruth Rut - + 1 Samuel 1 Samuel - + 2 Samuel 2 Samuel - + 1 Kings 1 Reyes - + 2 Kings 2 Reyes - + 1 Chronicles 1 Crónicas - + 2 Chronicles 2 Crónicas - + Ezra Esdras - + Nehemiah Nehemías - + Esther Ester - + Job Job - + Psalms Salmos - + Proverbs Proverbios - + Ecclesiastes Eclesiastés - + Song of Solomon Cantares - + Isaiah Isaías - + Jeremiah Jeremías - + Lamentations Lamentaciones - + Ezekiel Ezequiel - + Daniel Daniel - + Hosea Oseas - + Joel Joel - + Amos Amós - + Obadiah Abdías - + Jonah Jonás - + Micah Miqueas - + Nahum Nahúm - + Habakkuk Habacuc - + Zephaniah Sofonías - + Haggai Hageo - + Zechariah Zacarías - + Malachi Malaquías - + Matthew Mateo - + Mark Marcos - + Luke Lucas - + John Juan - + Acts Hechos - + Romans Romanos - + 1 Corinthians 1 Corintios - + 2 Corinthians 2 Corintios - + Galatians Gálatas - + Ephesians Efesios - + Philippians Filipenses - + Colossians Colosenses - + 1 Thessalonians 1 Tesalonicenses - + 2 Thessalonians 2 Tesalonicenses - + 1 Timothy 1 Timoteo - + 2 Timothy 2 Timoteo - + Titus Tito - + Philemon Filemón - + Hebrews Hebreos - + James Santiago - + 1 Peter 1 Pedro - + 2 Peter 2 Pedro - + 1 John 1 Juan - + 2 John 2 Juan - + 3 John 3 Juan - + Jude Judas - + Revelation Apocalipsis - + Judith Judit - + Wisdom Sabiduría - + Tobit Tobit - + Sirach Sirácida - + Baruch Baruc - + 1 Maccabees 1 Macabeos - + 2 Maccabees 2 Macabeos - + 3 Maccabees 3 Macabeos - + 4 Maccabees 4 Macabeos - + Rest of Daniel - + Resto de Daniel - + Rest of Esther - + Resto de Ester - + Prayer of Manasses - + Oración de Manasés - + Letter of Jeremiah - + Epístola de Jeremías - + Prayer of Azariah - + Oración de Azarías - + Susanna Susana - + Bel Bel - + 1 Esdras 1 Esdras - + 2 Esdras 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. - + :|v|V|versículo|versículos;;-|hasta;;,|y;;fin + + + + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Debe especificar un nombre para la versión de su Biblia. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Debe ingresar la información copyright para su Biblia. Las Biblias de Dominio Público se deben marca como tal. + + + + Bible Exists + Ya existe la Biblia + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Ya existe esta Biblia. Por favor importe una diferente o borre la anterior antes de continuar. + + + + You need to specify a book name for "%s". + Debe especificar un nombre de libro para "%s" + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + El nombre de libro "%s" no es correcto. +Solo se pueden utilizar números al principio +y seguido de caracteres no numéricos. + + + + Duplicate Book Name + Nombre de Libro Duplicado + + + + The Book Name "%s" has been entered more than once. + El Nombre de Libro "%s" se ha ingresado más de una vez. BiblesPlugin.BibleManager - + Scripture Reference Error Error de Referencia Bíblica - + Web Bible cannot be used No se puede usar la Biblia Web - + Text Search is not available with Web Bibles. La búsqueda no esta disponible para Biblias Web. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. No ingreso una palabra clave a buscar. Puede separar palabras clave por un espacio para buscar todas las palabras clave y puede separar conr una coma para buscar una de ellas. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. No existen Bilbias instaladas. Puede usar el Asistente de Importación para instalar una o varias más. - + No Bibles Available Biblias no Disponibles - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -706,193 +753,200 @@ Book Chapter%(verse)sVerse%(range)sVerse%(list)sChapter%(verse)sVerse%(range)sVerse Book Chapter%(verse)sVerse%(range)sChapter%(verse)sVerse Please pay attention to the appended "s" of the wildcards and refrain from translating the words inside the names in the brackets. - + OpenLP no admite esta referencia bíblica o es inválida. Por favor consulte el manual o asegúrese que tenga una estructura similar a alguno de los siguientes patrones: + +Libro Capítulo +Libro Capítulo%(range)sCapítulo +Libro Capítulo%(verse)sVersículo%(range)sVersículo +Libro Capítulo%(verse)sVersículo%(range)sVersículo%(list)sVersículo%(range)sVersículo +Libro Capítulo%(verse)sVersículo%(range)sVersículo%(list)sCapítulo%(verse)sVersículo%(range)sVersículo +Libro Capítulo%(verse)sVersículo%(range)sCapítulo%(verse)sVersículo BiblesPlugin.BiblesTab - + Verse Display Visualización de versículos - + Only show new chapter numbers Solo mostrar números para capítulos nuevos - + Bible theme: Tema: - + No Brackets Sin paréntesis - + ( And ) ( Y ) - + { And } { Y } - + [ And ] [ Y ] - + Note: Changes do not affect verses already in the service. Nota: -Los cambios no se aplican a ítems en el servcio. +Los cambios no se aplican a elementos en el servcio. - + Display second Bible verses Mostrar versículos secundarios - + Custom Scripture References - + Referencias Bíblicas Personalizadas - + Verse Separator: - + Separador de Versículos: - + Range Separator: - + Separador de Rango: - + List Separator: - + Separador de Lista: - + End Mark: - + Marca de Final: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Se pueden definir separadores de versículos adicionales. +Tienen que estar separados por un marcador vertical " | ". +Borre el contenido del campo para usar el valor predeterminado. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Se pueden definir separadores de rango adicionales. +Tienen que estar separados por un marcador vertical " | ". +Borre el contenido del campo para usar el valor predeterminado. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Se pueden definir separadores de lista adicionales. +Tienen que estar separados por un marcador vertical " | ". +Borre el contenido del campo para usar el valor predeterminado. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - - - - Preferred Bookname Language - + Se pueden definir marcas de final adicionales. +Tienen que estar separados por un marcador vertical " | ". +Borre el contenido del campo para usar el valor predeterminado. - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - + + English + Inglés - - Bible language - + + Default Bible Language + Idioma de Biblia Predeterminado - - Application language - + + Book name language in search field, +search results and on display: + Idioma de lo Libros en búsqueda, resultados y pantalla: - - English - Español + + Bible Language + Idioma de la Biblia - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - + + Application Language + Idioma de la aplicación BiblesPlugin.BookNameDialog - + Select Book Name Seleccione Nombre de Libro - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - El siguiente nombre no se encontró internamente. Por favor seleccione de la lista el correspondiente nombre en inglés. - - - + Current name: Nombre actual: - + Corresponding name: Nombre correspondiente: - + Show Books From Mostrar Libros Desde - + Old Testament Antiguo Testamento - + New Testament Nuevo Testamento - + Apocrypha Apócrifos + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + El siguiente nombre no se encontró internamente. Por favor seleccione de la lista el correspondiente nombre en inglés. + BiblesPlugin.BookNameForm - + You need to select a book. Debe seleccionar un libro. @@ -917,40 +971,110 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Editor de Biblias + + + + License Details + Detalles de Licencia + + + + Version name: + Nombre de versión: + + + + Copyright: + Copyright: + + + + Permissions: + Permisos: + + + + Default Bible Language + Idioma Predeterminado + + + + Book name language in search field, search results and on display: + Idioma de Libros en la busqueda, resultados y pantalla. + + + + Global Settings + Preferencia Globales + + + + Bible Language + Idioma de la Biblia + + + + Application Language + Idioma de la aplicación + + + + English + Inglés + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + Esta es una Biblia de Descarga Web. +No es posible personalizar los Nombres de Libros. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + Para utilizar nombres de libro personalizados, debe seleccionar el "Idioma de la Biblia" en la pestaña de Meta Datos o, en la página Biblias en Configurar OpenLP si se utilizó "Preferencias Globales". + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registrando Biblia y cargando libros... - + Registering Language... Registrando Idioma... - + Importing %s... Importing <book name>... Importando %s... - + Download Error Error de Descarga - + 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. Hubo un problema al descargar los versículos seleccionados. Por favor revise la conexión a internet y si el error persiste considere reportar esta falla. - + Parse Error Error de Análisis - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Hubo un problema al extraer los versículos seleccionados. Si el error persiste considere reportar esta falla. @@ -1128,17 +1252,17 @@ BiblesPlugin.LanguageDialog - + Select Language Seleccionar Idioma - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP no puede determinar el idioma de esta versión de la Biblia. Por favor, seleccione uno de la siguiente lista. - + Language: Idioma: @@ -1154,85 +1278,100 @@ BiblesPlugin.MediaItem - + Quick Rápida - + Find: - Encontrar: + Buscar: - + Book: Libro: - + Chapter: Capítulo: - + Verse: Versículo: - + From: Desde: - + To: Hasta: - + Text Search Buscar texto - + Second: Paralela: - + Scripture Reference Referencia Bíblica - + Toggle to keep or clear the previous results. - Alterna entre mantener o limpiar resultados previos. + Alterna entre conservar o borrar los resultados previos. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? No puede mezclar busquedas individuales y dobles. ¿Desea borrar los resultados y abrir una busqueda nueva? - + Bible not fully loaded. Biblia incompleta. - + Information Información - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. - La Biblia secundaria no contiene todos los versículos de la Bilbia principal. Solo se muestran los versículos comunes. Versículos %d no se incluyen en los resultados. + La Biblia secundaria no contiene todos los versículos de la Biblia principal. Solo se muestran los versículos comunes. Versículos %d no se incluyen en los resultados. + + + + Search Scripture Reference... + Buscar Referencia Bíblica... + + + + Search Text... + Buscar Texto... + + + + Are you sure you want to delete "%s"? + ¿Desea realmente borrar "%s"? BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importando %s %s... @@ -1241,12 +1380,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Detectando codificación (esto puede tardar algunos minutos)... - + Importing %s %s... Importing <book name> <chapter>... Importando %s %s... @@ -1255,149 +1394,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Seleccione un Directorio de Respaldo - + Bible Upgrade Wizard - Asistente para Actualizar Bilias + Asistente para Actualizar Biblias - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Este asistente le ayudará a actualizar sus Bilias desde versiones anteriores a OpenLP 2. Presione siguiente para iniciar el proceso. - + Select Backup Directory Directorio de Respaldo - + Please select a backup directory for your Bibles Por favor seleccione un directorio de respaldo para sus Biblias - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Las versiones anteriores a OpenLP 2.0 no pueden utilizar las Biblias actualizadas. Se creará un respaldo de sus Biblias actuales en caso que tenga que utilizar una versión anterior del programa. Las instrucciones para resturar los archivos están en nuestro <a href="http://wiki.openlp.org/faq">FAQ</a>. - + Please select a backup location for your Bibles. Por favor seleccione una ubicación para los respaldos. - + Backup Directory: Directorio de Respaldo: - + There is no need to backup my Bibles No es necesario respaldar mis Biblias - + Select Bibles Seleccione Biblias - + Please select the Bibles to upgrade Por favor seleccione las Biblias a actualizar - + Upgrading Actualizando - + Please wait while your Bibles are upgraded. Por favor espere mientras sus Biblias son actualizadas. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. El respaldo no fue exitoso. Para respaldar sus Biblias debe tener permisos de escritura en el directorio seleccionado. - + Upgrading Bible %s of %s: "%s" Failed Actualizando Biblia %s de %s: "%s" Fallidas - + Upgrading Bible %s of %s: "%s" Upgrading ... Actualizando Biblia %s de %s: "%s" Actualizando... - + Download Error Error de Descarga - + To upgrade your Web Bibles an Internet connection is required. Para actualizar sus Biblias se requiere de una conexión a internet. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Actualizando Biblia %s de %s: "%s" Actualizando %s... - + Upgrading Bible %s of %s: "%s" Complete Actualizando Biblia %s de %s: "%s" Completado - + , %s failed , %s fallidas - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Actualizando Biblia(s): %s exitosas%s Note que los versículos se descargarán según sea necesario, por lo que debe contar con una conexión a internet. - + Upgrading Bible(s): %s successful%s Actualizando Biblia(s): %s exitosas%s - + Upgrade failed. Actualización fallida. - + You need to specify a backup directory for your Bibles. Debe especificar un directorio de respaldo para sus Biblias. - + Starting upgrade... Iniciando actualización... - + There are no Bibles that need to be upgraded. Las Biblias ya se encuentran actualizadas. @@ -1455,7 +1594,7 @@ Preview the selected custom slide. - Previsualizar diapositiva seleccionada. + Vista Previa de la diapositiva seleccionada. @@ -1471,12 +1610,12 @@ CustomPlugin.CustomTab - + Custom Display - Pantalla Personal + Pantalla Personalizada - + Display footer Mostrar pie de página @@ -1484,42 +1623,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Editar Diapositivas - + &Title: &Título: - + Add a new slide at bottom. Nueva diapositiva al final. - + Edit the selected slide. Editar la diapositiva seleccionada. - + Edit all the slides at once. Editar todas las diapositivas a la vez. - + Split a slide into two by inserting a slide splitter. Dividir la diapositiva insertando un separador. - + The&me: Te&ma: - + &Credits: &Creditos: @@ -1534,12 +1673,12 @@ Debe agregar al menos una diapositiva - + Ed&it All Ed&itar Todo - + Insert Slide Insertar @@ -1547,71 +1686,71 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? - - - + + ¿Desea borrar la diapositiva seleccionada? + ¿Desea borrar las %n diapositivas seleccionadas? ImagePlugin - + <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>Complemento de Imagen</strong><br />El complemento de imagen permite proyectar imágenes.<br />Una de sus características, es que permite agrupar imagenes para facilitar su proyección. Este plugin puede utilizar el "bulce de tiempo" de OpenLP para crear una presentación que avance automáticamente. Aparte, las imágenes de este plugin se pueden utilizar para reemplazar la imagen de fondo del tema en actual. - + Image name singular Imagen - + Images name plural Imágenes - + Images container title Imágenes - + Load a new image. Cargar una imagen nueva. - + Add a new image. Agregar una imagen nueva. - + Edit the selected image. Editar la imagen seleccionada. - + Delete the selected image. Eliminar la imagen seleccionada. - + Preview the selected image. - Previsualizar la imagen seleccionada. + Vista Previa de la imagen seleccionada. - + Send the selected image live. Proyectar la imagen seleccionada. - + Add the selected image to the service. Agregar esta imagen al servicio. @@ -1619,7 +1758,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Seleccionar Anexo @@ -1627,44 +1766,44 @@ ImagePlugin.MediaItem - + Select Image(s) Seleccionar Imagen(es) - + You must select an image to delete. Debe seleccionar una imagen para eliminar. - + You must select an image to replace the background with. Debe seleccionar una imagen para reemplazar el fondo. - + Missing Image(s) Imágen(es) faltante - + The following image(s) no longer exist: %s La siguiente imagen(es) ya no esta disponible: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? La siguiente imagen(es) ya no esta disponible: %s ¿Desea agregar las demás imágenes? - + There was a problem replacing your background, the image file "%s" no longer exists. Ocurrió un problema al reemplazar el fondo, el archivo "%s" ya no existe. - + There was no display item to amend. No se encontraron elementos para corregir. @@ -1672,78 +1811,78 @@ ImagesPlugin.ImageTab - + Background Color Color de fondo - + Default Color: Color predeterminado: - - Provides border where image is not the correct dimensions for the screen when resized. - Agrega un color de fondo cuando la imagen no coincide con la resolución de pantalla al redimensionarla. + + Visible background for images with aspect ratio different to screen. + Fondo visible para canciones con aspecto diferente al de la pantalla. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Complemento de Medios</strong><br />El complemento de medios permite reproducir audio y video. - + Media name singular Medio - + Media name plural Medios - + Media container title Medios - + Load new media. Cargar un medio nuevo. - + Add new media. Agregar un medio nuevo. - + Edit the selected media. Editar el medio seleccionado. - + Delete the selected media. Eliminar el medio seleccionado. - + Preview the selected media. - Previsualizar el medio seleccionado. + Vista Previa del medio seleccionado. - + Send the selected media live. Proyectar el medio seleccionado. - + Add the selected media to the service. Agregar este medio al servicio. @@ -1791,9 +1930,9 @@ Ningún elemento para corregir. - + Unsupported File - Archivo no válido + Archivo Inválido @@ -1809,30 +1948,30 @@ MediaPlugin.MediaTab - + Available Media Players Reproductores disponibles - + %s (unavailable) %s (no disponible) - + Player Order Orden de Reproductores - + Allow media player to be overridden - + Permitir tomar control sobre el reproductor multimedia OpenLP - + Image Files Archivos de Imagen @@ -1854,17 +1993,17 @@ OpenLP.AboutForm - + Credits Créditos - + License Licencia - + Contribute Contribuir @@ -1874,17 +2013,17 @@ compilación %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. - Este es un programa gratuito; usted puede distribuirlo y/o modificarlo bajo los términos de GNU General Public License según la publicación de Free Software Foundation; versión 2 de la Licencia. + Este es un programa gratuito; usted puede distribuirlo y/o modificarlo bajo los términos de la GNU General Public License según la publicación de Free Software Foundation; versión 2 de la Licencia. - + 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. + Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Véase más abajo para más detalles. - + Project Lead %s @@ -2009,7 +2148,7 @@ de forma gratuita, así como Él nos ha liberado. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2026,96 +2165,97 @@ OpenLP es desarrollado y mantenido por voluntarios. Si desea apoyar la creación de más software Cristiano gratuito, por favor considere contribuir mediante el botón de abajo. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s - + Copyright © 2004-2012 %s +Portions copyright © 2004-2012 %s OpenLP.AdvancedTab - + UI Settings Preferencias de Interface - + Number of recent files to display: Archivos recientes a mostrar: - + Remember active media manager tab on startup Recordar la última pestaña de medios utilizada - + Double-click to send items straight to live Doble-click para proyectar directamente - + Expand new service items on creation Expandir elementos nuevos del servicio al crearlos - + Enable application exit confirmation Preguntar antes de cerrar la aplicación - + Mouse Cursor Cursor del Ratón - + Hide mouse cursor when over display window Ocultar el cursor en la pantalla principal - + Default Image Imagen predeterminada - + Background color: Color de fondo: - + Image file: Archivo: - + Open File Abrir Archivo - + Advanced Avanzado - + Preview items when clicked in Media Manager - Previsualizar elementos al hacer click en el Adminstrador de Medios + Vista Previa al seleccionar elementos del Adminstrador de Medios - + Click to select a color. Click para seleccionar color. - + Browse for an image file to display. Buscar un archivo de imagen para mostrar. - + Revert to the default OpenLP logo. Volver al logo predeterminado de OpenLP. @@ -2124,140 +2264,224 @@ Service %Y-%m-%d %H-%M This may not contain any of the following characters: /\?*|<>[]":+ See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. - + Servicio %Y-%m-%d %H-%M - + Default Service Name - + Nombre de Servicio Predeterminado - + Enable default service name - + Habilitar el - + Date and Time: - + Fecha y Hora: - + Monday Lunes - + Tuesday Martes - + Wednesday Miércoles - + Thurdsday Jueves - + Friday Viernes - + Saturday Sábado - + Sunday Domingo - + Now - + Hoy - + Time when usual service starts. - + Hora usual de inicio del servicio. - + Name: Nombre: - + Consult the OpenLP manual for usage. - + Consulte el manual de OpenLP para su uso. - + Revert to the default service name "%s". - + Volver al nombre de servicio predeterminado "%s" - + Example: Ejemplo: - + X11 X11 - + Bypass X11 Window Manager - + No usar el Administrador de Ventanas de X11 - + Syntax error. Error de Sintaxis. + + + Data Location + Ubicación de Datos + + + + Current path: + Ubicación actual: + + + + Custom path: + Ubicación nueva: + + + + Browse for new data file location. + Buscar una nueva ubicación para los datos. + + + + Set the data location to the default. + Restablecer la ubicación original para los datos. + + + + Cancel + Cancelar + + + + Cancel OpenLP data directory location change. + Cancelar el cambio del directorio de datos de OpenLP. + + + + Copy data to new location. + Copiar datos a nueva ubicación. + + + + Copy the OpenLP data files to the new location. + Copiar los datos de OpenLP a un nuevo directorio. + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + <strong>ADVERTENCIA:</strong> El nuevo directorio contiene archivos de datos de OpenLP. Estos archivos serán reemplazados durante la copia. + + + + Data Directory Error + Error en Directorio de Datos + + + + Select Data Directory Location + Seleccione Ubicación de Datos + + + + Confirm Data Directory Change + Confirme Cambio de Directorio + + + + Reset Data Directory + Reestablecer Directorio de Datos + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + ¿Desea cambiar la ubicación predeterminada del directorio de datos de OpenLP? + +Esta ubicación se utilizará luego de cerrar OpenLP. + + + + Overwrite Existing Data + Sobrescribir los Datos Actuales + OpenLP.ExceptionDialog - + Error Occurred Se presento un Error - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. ¡Oh! OpenLP encontró un problema, y no pudo recuperarse. El texto en el cuadro siguiente contiene información que podría ser útil para los desarrolladores de OpenLP, por favor envíe un correo a bugs@openlp.org, junto con una descripción detallada de lo que estaba haciendo cuando se produjo el problema. - + Send E-Mail Enviar E-Mail - + Save to File Guardar Archivo - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Por favor ingrese una descripción de lo que hacia al ocurrir el error (Mínimo 20 caracteres) - + Attach File Adjuntar Archivo - + Description characters to enter : %s Caracteres restantes: %s @@ -2265,24 +2489,24 @@ OpenLP.ExceptionForm - + Platform: %s Plataforma: %s - + Save Crash Report Guardar Reporte de Errores - + Text files (*.txt *.log *.text) Archivos de texto (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2313,7 +2537,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2450,17 +2674,17 @@ Configuración Predeterminada - + Downloading %s... Descargando %s... - + Download complete. Click the finish button to start OpenLP. Descarga completa. Presione finalizar para iniciar OpenLP. - + Enabling selected plugins... Habilitando complementos seleccionados... @@ -2530,32 +2754,32 @@ Este asistente configurará OpenLP para su uso inicial. Presione el botón Siguiente para iniciar. - + Setting Up And Downloading Configurando & Descargando - + Please wait while OpenLP is set up and your data is downloaded. Por favor espere mientras OpenLP se configura e importa los datos. - + Setting Up Configurando - + Click the finish button to start OpenLP. Presione finalizar para iniciar OpenLP. - + Download complete. Click the finish button to return to OpenLP. Descarga completa. Presione finalizar para iniciar OpenLP. - + Click the finish button to return to OpenLP. Presione finalizar para iniciar OpenLP. @@ -2565,78 +2789,78 @@ Diapositivas + + Finish + Finalizar + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - No se encontró una conexión a Internet. El Asistente Inicial requiere de una conexión a Internet para bajar muestras de Canciones, Biblias y Temas. Presione Finalizar para iniciar el programa con las preferencias por defecto y sin material de muestra. + No se cuenta con una conexión a Internet. El Asistente Inicial requiere de una conexión a Internet para descargar canciones, Biblias y temas de muestra. Presione Finalizar para iniciar el programa con las preferencias predeterminadas y sin material de muestra. -Para abrir el Asistente Inicial posteriormente e importar dicho material, revise su conexión a Internet y abra el asistente desde el menú "Herramientas/Abrir Asistente Inicial" de OpenLP. +Para abrir posteriormente este asistente e importar dicho material, revise su conexión a Internet y seleccione desde el menú "Herramientas/Abrir Asistente Inicial" en OpenLP. -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. -Para detener el Asistente Inicial (y no abrir OpenLP), presione Cancelar ahora. - - - - Finish - Finalizar +Para detener el Asistente Inicial (y no iniciar OpenLP), presione Cancelar ahora. OpenLP.FormattingTagDialog - + Configure Formatting Tags Configurar Etiquetas de Formato - + Edit Selection Editar Selección - + Save Guardar - + Description Descripción - + Tag Etiqueta - + Start tag Etiqueta de inicio - + End tag Etiqueta de final - + Tag Id ID de Etiqueta - + Start HTML Inicio HTML - + End HTML Final HTML @@ -2644,32 +2868,32 @@ OpenLP.FormattingTagForm - + Update Error Error de Actualización - + Tag "n" already defined. Etiqueta "n" ya definida. - + New Tag Etiqueta nueva - + <HTML here> <HTML aquí> - + </and here> </and aquí> - + Tag %s already defined. Etiqueta %s ya definida. @@ -2677,82 +2901,82 @@ OpenLP.FormattingTags - + Red Rojo - + Black Negro - + Blue Azul - + Yellow Amarillo - + Green Verde - + Pink Rosado - + Orange Anaranjado - + Purple Morado - + White Blanco - + Superscript Superíndice - + Subscript Subíndice - + Paragraph Párrafo - + Bold Negrita - + Italics Cursiva - + Underline Subrayado - + Break Salto @@ -2760,180 +2984,170 @@ OpenLP.GeneralTab - + General General - + Monitors Monitores - + Select monitor for output display: Seleccionar monitor para proyectar: - + Display if a single screen Mostar si solo hay una pantalla - + Application Startup Inicio de la Aplicación - + Show blank screen warning Mostrar advertencia de pantalla en blanco - + Automatically open the last service Abrir automáticamente el último servicio - + Show the splash screen Mostrar pantalla de bienvenida - + Application Settings Configuración del Programa - + Prompt to save before starting a new service Ofrecer guardar antes de abrir un servicio nuevo - + Automatically preview next item in service - Vista previa automática del siguiente elemento de servicio + Vista previa automática del siguiente elemento en el servicio - + sec seg - + CCLI Details Detalles de CCLI - + SongSelect username: Usuario SongSelect: - + SongSelect password: Contraseña SongSelect: - + X X - + Y Y - + Height Altura - + Width Ancho - + Check for updates to OpenLP Buscar actualizaciones para OpenLP - + Unblank display when adding new live item Mostar proyección al agregar un elemento nuevo - + Timed slide interval: Intervalo de diapositivas: - + Background Audio Audio de Fondo - + Start background audio paused Iniciar audio de fondo en pausa - + Service Item Slide Limits - - - - - &End Slide - + Límites de Diapositivas - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide - + + Override display position: + Personalizar la posición de pantalla - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - + + Repeat track list + Repetir lista de pistas - - &Next Item - + + Behavior of next/previous on the last/first slide: + Comportamiento de siguiente/anterior en la última/primera diapositiva: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - + + &Remain on Slide + &Permanecer en la Diapositiva - - Override display position: - + + &Wrap around + &Volver al principio - - Repeat track list - + + &Move to next/previous service item + &Ir al elemento siguiente/anterior OpenLP.LanguageManager - + Language Idioma - + Please restart OpenLP to use your new language setting. Por favor reinicie OpenLP para usar su nuevo idioma. @@ -2949,287 +3163,287 @@ OpenLP.MainWindow - + &File &Archivo - + &Import &Importar - + &Export &Exportar - + &View &Ver - + M&ode M&odo - + &Tools &Herramientas - + &Settings &Preferencias - + &Language &Idioma - + &Help - &Ayuda + A&yuda - + Media Manager Gestor de Medios - + Service Manager Gestor de Servicio - + Theme Manager Gestor de Temas - + &New &Nuevo - + &Open &Abrir - + Open an existing service. Abrir un servicio existente. - + &Save &Guardar - + Save the current service to disk. Guardar el servicio actual en el disco. - + Save &As... Guardar &Como... - + Save Service As Guardar Servicio Como - + Save the current service under a new name. Guardar el servicio actual con un nombre nuevo. - + E&xit &Salir - + Quit OpenLP Salir de OpenLP - + &Theme &Tema - + &Configure OpenLP... &Configurar OpenLP... - + &Media Manager Gestor de &Medios - + Toggle Media Manager Alternar Gestor de Medios - + Toggle the visibility of the media manager. Alernar la visibilidad del gestor de medios. - + &Theme Manager Gestor de &Temas - + Toggle Theme Manager Alternar Gestor de Temas - + Toggle the visibility of the theme manager. Alernar la visibilidad del gestor de temas. - + &Service Manager Gestor de &Servicio - + Toggle Service Manager Alternar Gestor de Servicio - + Toggle the visibility of the service manager. Alernar la visibilidad del gestor de servicio. - + &Preview Panel &Panel de Vista Previa - + Toggle Preview Panel Alternar Panel de Vista Previa - + Toggle the visibility of the preview panel. Alernar la visibilidad del panel de vista previa. - + &Live Panel Panel de Pro&yección - + Toggle Live Panel Alternar Panel de Proyección - + Toggle the visibility of the live panel. Alternar la visibilidad del panel de proyección. - + &Plugin List Lista de &Complementos - + List the Plugins Lista de Complementos - + &User Guide Guía de &Usuario - + &About &Acerca de - + More information about OpenLP Más información acerca de OpenLP - + &Online Help - &Ayuda En Línea + Ayuda En &Línea - + &Web Site Sitio &Web - + Use the system language, if available. Usar el idioma del sistema, si esta disponible. - + Set the interface language to %s Fijar el idioma de la interface en %s - + Add &Tool... Agregar &Herramienta... - + Add an application to the list of tools. Agregar una aplicación a la lista de herramientas. - + &Default Pre&determinado - + Set the view mode back to the default. Establecer el modo de vizualización predeterminado. - + &Setup &Administración - + Set the view mode to Setup. Modo de Administración. - + &Live En &vivo - + Set the view mode to Live. Modo de visualización.en Vivo. - + 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/. @@ -3238,204 +3452,209 @@ Puede descargar la última versión desde 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 se ha puesto en blanco - + Default Theme: %s Tema predeterminado: %s - + English Please add the name of your language here Español - + Configure &Shortcuts... Configurar &Atajos... - + Close OpenLP Cerrar OpenLP - + Are you sure you want to close OpenLP? - ¿Está seguro que quiere salir de OpenLP? + ¿Desea salir de OpenLP? - + Open &Data Folder... Abrir Folder de &Datos... - + Open the folder where songs, bibles and other data resides. Abrir el folder donde se almacenan las canciones, biblias y otros datos. - + &Autodetect &Autodetectar - + Update Theme Images - Actualizar Imagen de Temas + Actualizar Miniatura de Temas - + Update the preview images for all themes. Actualiza la imagen de vista previa de todos los temas. - + Print the current service. Imprimir Orden del Servicio actual. - + &Recent Files Archivos &recientes - + L&ock Panels - Fi&amp;jar Páneles + Fi&jar Páneles - + Prevent the panels being moved. Prevenir que los páneles se muevan. - + Re-run First Time Wizard Abrir Asistente Inicial - + Re-run the First Time Wizard, importing songs, Bibles and themes. Abrir el asistente inicial para importar canciones, Biblias y temas. - + Re-run First Time Wizard? ¿Abrir Asistente Inicial? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - ¿Está seguro de que desea Abrir el Asistente Inicial? + ¿Desea Abrir el Asistente Inicial? -Abrir este asistente cambia la configuración actual de OpenLP y posiblemente agregar canciones a su base de datos y cambiar el Tema predeterminado. +Abrir este asistente alterala configuración actual de OpenLP y posiblemente agregará canciones a su base de datos y cambiará el Tema predeterminado. - + Clear List Clear List of recent files Borrar Lista - + Clear the list of recent files. Borrar la lista de archivos recientes. - + Configure &Formatting Tags... Configurar &Etiquetas de Formato... - + Export OpenLP settings to a specified *.config file Exportar preferencias de OpenLP al archivo *.config especificado - + Settings Preferencias - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Importar preferencias de OpenLP desde un archivo *.config exportado previamente en cualquier ordenador - + Import settings? ¿Importar preferencias? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. Importing incorrect settings may cause erratic behaviour or OpenLP to terminate abnormally. - ¿Está seguro de que desea importar preferencias? + ¿Desea importar preferencias? Al importar preferencias la configuración actual de OpenLP cambiará permanentemente. -El importar preferencias erróneas puede causar inestabilidad y el cierre inesperado de OpenLP. +El importar preferencias incorrectas puede causar un comportamiento errático y el cierre inesperado de OpenLP. - + Open File Abrir Archivo - + OpenLP Export Settings Files (*.conf) Archivos de Preferencias OpenLP (*.conf) - + Import settings Importar preferencias - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP se cerrará. Las preferencias importadas se aplicarán la próxima vez que inicie OpenLP. - + Export Settings File Exportar Archivo de Preferencias - + OpenLP Export Settings File (*.conf) Archivo de Preferencias OpenLP (*.conf) + + + New Data Directory Error + Error en el Nuevo Directorio de Datos + OpenLP.Manager - + Database Error Error en Base de datos - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3444,7 +3663,7 @@ Base de Datos: %s - + OpenLP cannot load your database. Database: %s @@ -3456,115 +3675,115 @@ OpenLP.MediaManagerItem - + No Items Selected Nada Seleccionado - + &Add to selected Service Item &Agregar al elemento del Servico - + You must select one or more items to preview. Debe seleccionar uno o más elementos para previsualizar. - + You must select one or more items to send live. Debe seleccionar uno o más elementos para proyectar. - + You must select one or more items. Debe seleccionar uno o más elementos. - + You must select an existing service item to add to. Debe seleccionar un elemento existente al cual adjuntar. - + Invalid Service Item - Elemento de Servicio no válido + Elemento de Servicio inválido - + You must select a %s service item. Debe seleccionar un elemento %s del servicio. - + You must select one or more items to add. Debe seleccionar uno o más elementos para agregar. - + No Search Results Sin Resultados - + Invalid File Type - Archivo no válido + Tipo de Archivo Inválido - + Invalid File %s. Suffix not supported - Archivo no válido %s. -Extensión no soportada + Archivo inválido %s. +Extensión no admitida - + &Clone &Duplicar - + Duplicate files were found on import and were ignored. - Los archivos duplicados hallados fueron ignorados. + Se encontraron archivos duplicados y se ignoraron. OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + Etiqueta <lyrics> faltante. - + <verse> tag is missing. - + Etiqueta <verse> faltante. OpenLP.PluginForm - + Plugin List Lista de Complementos - + Plugin Details Detalles del Complemento - + Status: Estado: - + Active Activo - + Inactive Inactivo @@ -3587,12 +3806,12 @@ OpenLP.PrintServiceDialog - + Fit Page Ajustar a Página - + Fit Width Ajustar a Ancho @@ -3600,7 +3819,7 @@ OpenLP.PrintServiceForm - + Options Opciones @@ -3615,47 +3834,47 @@ Copiar como HTML - + Zoom In Acercar - + Zoom Out Alejar - + Zoom Original Zoom Original - + Other Options Otras Opciones - + Include slide text if available - Incluir texto de diap. si está disponible + Incluir texto de diapositivas si está disponible - + Include service item notes - Incluir notas del elemento del servicio + Incluir notas de los elementos del servicio - + Include play length of media items Incluir la duración de los medios - + Add page break before each text item Agregar salto de página antes de cada elemento - + Service Sheet Hoja de Servicio @@ -3665,12 +3884,12 @@ Imprimir - + Title: Título: - + Custom Footer Text: Texto para pié de página: @@ -3678,12 +3897,12 @@ OpenLP.ScreenList - + Screen Pantalla - + primary principal @@ -3691,12 +3910,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Inicio</strong>: %s - + <strong>Length</strong>: %s <strong>Duración</strong>: %s @@ -3704,7 +3923,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Reorganizar Elemento de Servicio @@ -3712,82 +3931,82 @@ OpenLP.ServiceManager - + Move to &top Mover al &inicio - + Move item to the top of the service. Mover el ítem al inicio del servicio. - + Move &up S&ubir - + Move item up one position in the service. Mover el ítem una posición hacia arriba. - + Move &down Ba&jar - + Move item down one position in the service. Mover el ítem una posición hacia abajo. - + Move to &bottom Mover al &final - + Move item to the end of the service. Mover el ítem al final del servicio. - + &Delete From Service &Eliminar Del Servicio - + Delete the selected item from the service. Eliminar el ítem seleccionado del servicio. - + &Add New Item &Agregar un ítem nuevo - + &Add to Selected Item &Agregar al ítem Seleccionado - + &Edit Item &Editar ítem - + &Reorder Item &Reorganizar ítem - + &Notes &Notas - + &Change Item Theme &Cambiar Tema de ítem @@ -3806,115 +4025,110 @@ File is not a valid service. - El archivo no es un servicio válido. + El archivo de servicio es inválido. - + Missing Display Handler Controlador de Pantalla Faltante - + Your item cannot be displayed as there is no handler to display it No se puede mostrar el ítem porque no hay un controlador de pantalla disponible - + Your item cannot be displayed as the plugin required to display it is missing or inactive El ítem no se puede mostar porque falta el complemento requerido o esta desabilitado - + &Expand all &Expandir todo - + Expand all the service items. - Expandir todos los ítems del servicio. + Expandir todos los elementos del servicio. - + &Collapse all &Colapsar todo - + Collapse all the service items. - Colapsar todos los ítems del servicio. + Colapsar todos los elementos del servicio. - + Open File Abrir Archivo - + Moves the selection down the window. Mover selección hacia abajo. - + Move up Subir - + Moves the selection up the window. Mover selección hacia arriba. - + Go Live Proyectar - + Send the selected item to Live. Proyectar el elemento seleccionado. - + &Start Time &Tiempo de Inicio - + Show &Preview Mostrar &Vista Previa - - Show &Live - Mostrar &Proyección - - - + Modified Service Servicio Modificado - + The current service has been modified. Would you like to save this service? El servicio actual a sido modificado. ¿Desea guardar este servicio? - + Custom Service Notes: Notas Personales del Servicio: - + Notes: Notas: - + Playing time: Tiempo de reproducción: - + Untitled Service Servicio Sin nombre @@ -3939,17 +4153,17 @@ Archivo Corrompido - + Load an existing service. Abrir un servicio existente. - + Save this service. Guardar este servicio. - + Select a theme for the service. Seleccione un tema para el servicio. @@ -3959,7 +4173,7 @@ El archivo está corrupto o no es un archivo OpenLP 2.0 válido. - + Service File Missing Archivo de Servicio faltante @@ -3983,11 +4197,21 @@ Service copy only Copia unicamente + + + Error Saving File + Error al Guardar Archivo + + + + There was an error saving your file. + Ocurrió un error al guardar su archivo. + OpenLP.ServiceNoteForm - + Service Item Notes Notas de Elemento de Servicio @@ -4003,67 +4227,67 @@ OpenLP.ShortcutListDialog - + Action Acción - + Shortcut Atajo - + Duplicate Shortcut Duplicar Atajo - + The shortcut "%s" is already assigned to another action, please use a different shortcut. El atajo "%s" esta asignado a otra acción, por favor utilize un atajo diferente. - + Alternate Secundario - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Seleccione una acción y presione uno de los siguientes botones para capturar un nuevo atajo primario y secundario, respectivamente. - + Default Predeterminado - + Custom Personalizado - + Capture shortcut. Capturar atajo. - + Restore the default shortcut of this action. Restuarar el atajo predeterminado para esta acción. - + Restore Default Shortcuts Restaurar los Atajos Predeterminados - + Do you want to restore all shortcuts to their defaults? ¿Quiere restaurar todos los atajos a su valor original? - + Configure Shortcuts Configurar Atajos @@ -4071,179 +4295,174 @@ OpenLP.SlideController - + Hide Ocultar - + Go To Ir A - + Blank Screen Pantalla en Blanco - + Blank to Theme Proyectar el Tema - + Show Desktop Mostrar Escritorio - + Previous Service Servicio Anterior - + Next Service Servicio Siguiente - + Escape Item Salir de ítem - + Move to previous. Ir al anterior. - + Move to next. Ir al siguiente. - + Play Slides Reproducir diapositivas - + Delay between slides in seconds. Tiempo entre diapositivas en segundos. - + Move to live. Proyectar. - + Add to Service. Agregar al Servicio. - + Edit and reload song preview. Editar y actualizar la vista previa. - + Start playing media. Reproducir medios. - + Pause audio. Pausar Audio. - + Pause playing media. Pausar medio en reproducción. - + Stop playing media. Detener medio en reproducción. - + Video position. Posición de video. - + Audio Volume. Volumen de audio. - + Go to "Verse" Ir a "Verso" - + Go to "Chorus" Ir a "Coro" - + Go to "Bridge" Ir a "Puente" - + Go to "Pre-Chorus" Ir a "Pre-Coro" - + Go to "Intro" Ir a "Intro" - + Go to "Ending" Ir a "Final" - + Go to "Other" Ir a "Otro" - + Previous Slide - + Diapositiva anterior - + Next Slide - + Diapositiva siguiente - + Pause Audio - + Pausar Audio - + Background Audio - Audio de Fondo - - - - Next Track - + Audio de Fondo - + Go to next audio track. - + Ir a la siguiente pista de audio. - + Tracks - + Pistas @@ -4309,25 +4528,25 @@ Finish time is set after the end of the media item - El Final se establece despues del final del medio actual + El tiempo fiinal se establece al final del elemento Start time is after the finish time of the media item - El Inicio se establece despues del final del medio actual + El tiempo inicial se establece al final del elemento - + Theme Layout Distribución del Tema - + The blue box shows the main area. El cuadro azul muestra el área principal. - + The red box shows the footer. El cuadro rojo muestra el pié de página. @@ -4335,32 +4554,32 @@ OpenLP.ThemeForm - + Select Image Seleccionar Imagen - + Theme Name Missing Falta Nombre de Tema - + There is no name for this theme. Please enter one. No existe nombre para este tema. Ingrese uno. - + Theme Name Invalid - Nombre de Tema no válido + Nombre de Tema inválido - + Invalid theme name. Please enter one. - Nombre de tema no válido. Ingrese uno. + Nombre de tema inválido. Por favor ingrese uno. - + (approximately %d lines per slide) (aproximadamente %d líneas por diapositiva) @@ -4368,514 +4587,514 @@ OpenLP.ThemeManager - + Create a new theme. Crear un tema nuevo. - + Edit Theme Editar Tema - + Edit a theme. Editar un tema. - + Delete Theme Eliminar Tema - + Delete a theme. Eliminar un tema. - + Import Theme Importar Tema - + Import a theme. Importa un tema. - + Export Theme Exportar Tema - + Export a theme. Exportar un tema. - + &Edit Theme &Editar Tema - + &Delete Theme Elimi&nar Tema - + Set As &Global Default &Global, por defecto - + %s (default) %s (predeterminado) - + You must select a theme to edit. Debe seleccionar un tema para editar. - + You are unable to delete the default theme. No se puede eliminar el tema predeterminado. - + Theme %s is used in the %s plugin. El tema %s se usa en el complemento %s. - + You have not selected a theme. No ha seleccionado un tema. - + Save Theme - (%s) Guardar Tema - (%s) - + Theme Exported Tema Exportado - + Your theme has been successfully exported. Su tema a sido exportado exitosamente. - + Theme Export Failed La importación falló - + Your theme could not be exported due to an error. No se pudo exportar el tema dedido a un error. - + Select Theme Import File Seleccione el Archivo de Tema a Importar - + File is not a valid theme. El archivo no es un tema válido. - + &Copy Theme &Copiar Tema - + &Rename Theme &Renombrar Tema - + &Export Theme &Exportar Tema - + You must select a theme to rename. Debe seleccionar un tema para renombrar. - + Rename Confirmation Confirmar Cambio de Nombre - + Rename %s theme? ¿Renombrar el tema %s? - + You must select a theme to delete. Debe seleccionar un tema para eliminar. - + Delete Confirmation Confirmar Eliminación - + Delete %s theme? ¿Eliminar el tema %s? - + Validation Error Error de Validación - + A theme with this name already exists. Ya existe un tema con este nombre. - + OpenLP Themes (*.theme *.otz) Tema OpenLP (*.theme *otz) - + Copy of %s Copy of <theme name> Copia de %s - + Theme Already Exists - + Este Tema Ya Existe OpenLP.ThemeWizard - + Theme Wizard Asistente para Temas - + Welcome to the Theme Wizard Bienvenido al Asistente para Temas - + Set Up Background Establecer un fondo - + Set up your theme's background according to the parameters below. Establecer el fondo de su tema según los siguientes parámetros. - + Background type: Tipo de fondo: - + Solid Color Color Sólido - + Gradient Gradiente - + Color: Color: - + Gradient: Gradiente: - + Horizontal Horizontal - + Vertical Vertical - + Circular Circular - + Top Left - Bottom Right Arriba Izquierda - Abajo Derecha - + Bottom Left - Top Right Abajo Izquierda - Abajo Derecha - + Main Area Font Details Fuente del Área Principal - + Define the font and display characteristics for the Display text Definir la fuente y las características para el texto en Pantalla - + Font: Fuente: - + Size: Tamaño: - + Line Spacing: Epaciado de Líneas: - + &Outline: &Contorno: - + &Shadow: &Sombra: - + Bold Negrita - + Italic Cursiva - + Footer Area Font Details Fuente de Pié de página - + Define the font and display characteristics for the Footer text Definir la fuente y las características para el texto de Pié de página - + Text Formatting Details Detalles de Formato - + Allows additional display formatting information to be defined Permite definir información adicional de formato - + Horizontal Align: Alinea. Horizontal: - + Left Izquierda - + Right Derecha - + Center Centro - + Output Area Locations Ubicación del Área de Proyección - + Allows you to change and move the main and footer areas. Le permite mover y cambiar la ubicación del área principal y de pié de página. - + &Main Area Área &Principal - + &Use default location &Usar ubicación predeterminada - + X position: Posición x: - + px px - + Y position: Posición y: - + Width: Ancho: - + Height: Altura: - + Use default location Usar ubicaciónpredeterminada - + Save and Preview Guardar && Previsualizar - + View the theme and save it replacing the current one or change the name to create a new theme Ver el tema y guardarlo reemplazando el actual o cambiando el nombre para crear un tema nuevo - + Theme name: Nombre: - + Edit Theme - %s Editar Tema - %s - + 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. Este asistente le ayudará a crear y editar temas. Presione Siguiente para iniciar el proceso al establecer el fondo. - + Transitions: Transiciones: - + &Footer Area &Pie de Página - + Starting color: Color inicial: - + Ending color: Color final: - + Background color: Color de fondo: - + Justify Justificar - + Layout Preview Vista previa de Distribución - + Transparent - + Transparente OpenLP.ThemesTab - + Global Theme Tema Global - + Theme Level Nivel - + S&ong Level &Canción - + 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. Utilizar el tema de la canción en la base de datos. Si una canción no tiene un tema asociado, utilizar el tema del servicio. Si el servicio no tiene un tema, utilizar el tema global. - + &Service Level &Servicio - + 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. Utilizar el tema del servicio ignorando los temas individuales. Si el servicio no tiene un tema, utilizar el tema global. - + &Global Level &Global - + Use the global theme, overriding any themes associated with either the service or the songs. Utilizar el tema global, ignorado los temas asociados con el servicio o con las canciones. - + Themes Temas @@ -4959,239 +5178,239 @@ pto - + Image Imagen - + Import Importar - + Live En vivo - + Live Background Error Error del Fondo de proyección - + Load Cargar - + Middle Medio - + New Nuevo - + New Service Servicio Nuevo - + New Theme Tema Nuevo - + No File Selected Singular Archivo No Seleccionado - + No Files Selected Plural Archivos No Seleccionados - + No Item Selected Singular Nada Seleccionado - + No Items Selected Plural Nada Seleccionado - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Vista previa - + Replace Background Reemplazar Fondo - + Reset Background Restablecer Fondo - + s The abbreviated unit for seconds s - + Save && Preview Guardar && Previsualizar - + Search Buscar - + You must select an item to delete. Debe seleccionar un ítem para eliminar. - + You must select an item to edit. Debe seleccionar un ítem para editar. - + Save Service Guardar Servicio - + Service Servicio - + Start %s Inicio %s - + Theme Singular Tema - + Themes Plural Temas - + Top Superior - + Version Versión - + Delete the selected item. Eliminar el ítem seleccionado. - + Move selection up one position. Mover selección un espacio hacia arriba. - + Move selection down one position. Mover selección un espacio hacia abajo. - + &Vertical Align: Alinea. &Vertical: - + Finished import. Importación finalizada. - + Format: Formato: - + Importing Importando - + Importing "%s"... Importando "%s"... - + Select Import Source Seleccione la Fuente para Importar - + Select the import format and the location to import from. Seleccione el formato a importar y su ubicación. - + 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. Se ha deshabilitado el importador openlp.org 1.x debido a la falta de un módulo Python. Si desea utilizar este importador, debe instalar el módulo "python-sqlite". - + Open %s File Abrir %s Archivo - + %p% %p% - + Ready. Listo. - + Starting import... Iniciando importación... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong Debe especificar un archivo %s para importar. @@ -5207,7 +5426,7 @@ Bienvenido al Asistente para Exportar Canciones - + Welcome to the Song Import Wizard Bienvenido al Asistente para Importar Canciones @@ -5295,60 +5514,60 @@ h - + Layout style: Distribución: - + Live Toolbar Barra de Proyección - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP ya esta abierto. ¿Desea continuar? - + Settings Preferencias - + Tools Herramientas - + Unsupported File - Archivo no Soportado + Archivo Inválido - + Verse Per Slide - Verso por Diapositiva + Versículo por Diapositiva - + Verse Per Line - Verso Por Línea + Versículo por Línea - + View Vista Title and/or verses not found - Título y/o verso no encontrado + Título y/o versos no encontrados @@ -5356,42 +5575,37 @@ Error XML de sintaxis - + View Mode Disposición - + Open service. Abrir Servicio. - + Print Service Imprimir Servicio - + Replace live background. Reemplazar el fondo proyectado. - + Reset live background. Restablecer el fondo proyectado. - - &Split - &Dividir - - - + Split a slide into two only if it does not fit on the screen as one slide. Dividir la diapositiva, solo si no se puede mostrar como una sola. - + Welcome to the Bible Upgrade Wizard Bienvenido al Asistente para Actualizar Biblias @@ -5401,105 +5615,157 @@ Confirmar Eliminación - + Play Slides in Loop Reproducir en Bucle - + Play Slides to End Reproducir hasta el final - + Stop Play Slides in Loop Detener Bucle - + Stop Play Slides to End Detener presentación - + Next Track - + Pista Siguiente + + + + Search Themes... + Search bar place holder text + Buscar Temas... + + + + Optional &Split + &División Opcional + + + + Invalid Folder Selected + Singular + Carpeta Inválida + + + + Invalid File Selected + Singular + Archivo Inválido + + + + Invalid Files Selected + Plural + Archivos Inválidos + + + + No Folder Selected + Singular + Ninguna Carpeta Seleccionada + + + + Open %s Folder + Abrir Carpeta %s + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + Debe especificar un archivo %s para importar. + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + Debe especificar una carpeta %s para importar. OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1 y %2 - + %1, and %2 Locale list separator: end - + %1, y %2 - + %1, %2 Locale list separator: middle - + %1, %2 - + %1, %2 Locale list separator: start - + %1, %2 PresentationPlugin - + <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>Complemento de Presentaciones</strong><br />El complemento de presentaciones permite mostrar presentaciones, usando diversos programas. La selección del programa se realiza por medio de una casilla de selección. - + Presentation name singular Presentación - + Presentations name plural Presentaciones - + Presentations container title Presentaciones - + Load a new presentation. Cargar una Presentación nueva. - + Delete the selected presentation. Eliminar la presentación seleccionada. - + Preview the selected presentation. - Visualizar la presentación seleccionada. + Vista Previa de la presentación seleccionada. - + Send the selected presentation live. Proyectar la presentación seleccionada. - + Add the selected presentation to the service. Agregar esta presentación al servicio. @@ -5507,72 +5773,72 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Seleccionar Presentación(es) - + Automatic Automático - + Present using: Mostrar usando: - + File Exists Ya existe el Archivo - + A presentation with that filename already exists. Ya existe una presentación con este nombre. - + This type of presentation is not supported. - No existe soporte para este tipo de presentación. + No se admite este tipo de presentación. - + Presentations (%s) Presentaciones (%s) - + Missing Presentation Presentación faltante - - The Presentation %s no longer exists. - La Presentación %s ya no esta disponible. + + The presentation %s is incomplete, please reload. + La presentación %s está incompleta, cárgela nuevamente. - - The Presentation %s is incomplete, please reload. - La Presentación %s esta incompleta, por favor recargela. + + The presentation %s no longer exists. + La presentación %s ya no existe. PresentationPlugin.PresentationTab - + Available Controllers Controladores Disponibles - + %s (unavailable) %s (no disponible) - + Allow presentation application to be overridden - + Permitir ignorar el programa de presentación @@ -5604,221 +5870,236 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 Remoto - + OpenLP 2.0 Stage View OpenLP 2.0 Vista del Escenario - + Service Manager Gestor de Servicio - + Slide Controller Control de Diapositivas - + Alerts Alertas - + Search Buscar - - Back - Atrás - - - + Refresh Refrezcar - + Blank - Negro + En blanco - + Show Mostrar - + Prev Anterior - + Next Siguiente - + Text Texto - + Show Alert Mostrar Alerta - + Go Live Proyectar - + No Results Sin Resultados - + Options Opciones - + Add to Service Agregar al Servicio + + + Home + Inicio + + + + Theme + Tema + + + + Desktop + Escritorio + + + + Add &amp; Go to Service + Agregar e Ir al Servicio + RemotePlugin.RemoteTab - + Serve on IP address: Dirección IP a Servir: - + Port number: Puerto número: - + Server Settings Config. de Servidor - + Remote URL: URL Remota: - + Stage view URL: URL Administración: - + Display stage time in 12h format Usar formato de 12h en pantalla de Administración - + Android App - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. - + Escanee el código QR o haga clic en <a href="https://market.android.com/details?id=org.openlp.android">descargar</a> para instalar el Android app. SongUsagePlugin - + &Song Usage Tracking &Historial de Uso - + &Delete Tracking Data &Eliminar datos de Historial - + Delete song usage data up to a specified date. Borrar los datos del historial hasta la fecha especificada. - + &Extract Tracking Data &Extraer datos de Historial - + Generate a report on song usage. Generar un reporte del historial de uso de las canciones. - + Toggle Tracking Activar Historial - + Toggle the tracking of song usage. Encender o apagar el historial del uso de las canciones. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Historial</strong><br />Este complemento mantiene un registro del número de veces que se usa una canción en los servicios. - + SongUsage name singular Historial - + SongUsage name plural Historiales - + SongUsage container title Historial - + Song Usage Historial - + Song usage tracking is active. Monitoreo de historial activo. - + Song usage tracking is inactive. Monitoreo de historial inactivo. - + display mostrar - + printed impreso @@ -5826,7 +6107,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Borrar historial de canción @@ -5838,7 +6119,7 @@ Are you sure you want to delete selected Song Usage data? - ¿Está seguro que quiere borrar los datos del historial de la canción seleccionada? + ¿Desea borrar los datos del historial de la canción seleccionada? @@ -5851,7 +6132,7 @@ Todos los datos han sido borrados exitosamente. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Seleccione la fecha desde la cual borrar el historial. Todos los datos guardados antes de esta fecha serán borrados permanentemente. @@ -5859,42 +6140,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Extracción del Historial - + Select Date Range Seleccionar Rango de Fechas - + to hasta - + Report Location Ubicación de Reporte - + Output File Location Archivo de Salida - + usage_detail_%s_%s.txt historial_%s_%s.txt - + Report Creation Crear Reporte - + Report %s has been successfully created. @@ -5903,12 +6184,12 @@ se ha creado satisfactoriamente. - + Output Path Not Selected Ruta de salida no seleccionada - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. No se ha establecido una ubicación válida para el archivo de reporte. Por favor seleccione una ubicación en su equipo. @@ -5946,82 +6227,82 @@ Reindexando canciones... - + Arabic (CP-1256) Árabe (CP-1256) - + Baltic (CP-1257) Báltico (CP-1257) - + Central European (CP-1250) Europa Central (CP-1250) - + Cyrillic (CP-1251) Cirílico (CP-1251) - + Greek (CP-1253) Griego (CP-1253) - + Hebrew (CP-1255) Hebreo (CP-1255) - + Japanese (CP-932) Japonés (CP-932) - + Korean (CP-949) Koreano (CP-949) - + Simplified Chinese (CP-936) Chino Simplificado (CP-936) - + Thai (CP-874) Tailandés (CP-874) - + Traditional Chinese (CP-950) Chino Tradicional (CP-950) - + Turkish (CP-1254) Turco (CP-1254) - + Vietnam (CP-1258) Vietnamita (CP-1258) - + Western European (CP-1252) Europa Occidental (CP-1252) - + Character Encoding Codificación de Caracteres - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6030,26 +6311,26 @@ Por lo general, la opción preseleccionada es la adecuada. - + Please choose the character encoding. The encoding is responsible for the correct character representation. Por favor elija una codificación de caracteres. La codificación se encarga de la correcta representación de caracteres. - + Song name singular Canción - + Songs name plural Canciones - + Songs container title Canciones @@ -6060,32 +6341,32 @@ Exportar canciones usando el asistente. - + Add a new song. Agregar una canción nueva. - + Edit the selected song. Editar la canción seleccionada. - + Delete the selected song. Eliminar la canción seleccionada. - + Preview the selected song. - Visualizar la canción seleccionada. + Vista Previa de la canción seleccionada. - + Send the selected song live. Proyectar la canción seleccionada. - + Add the selected song to the service. Agregar esta canción al servicio. @@ -6113,17 +6394,17 @@ Apellido: - + You need to type in the first name of the author. Debe escribir el nombre del autor. - + You need to type in the last name of the author. Debe ingresar el apellido del autor. - + You have not set a display name for the author, combine the first and last names? No a establecido un nombre para mostrar, ¿desea unir el nombre y el apellido? @@ -6154,211 +6435,224 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Metadatos + + + + Custom Book Names + Nombres Personalizados + + + SongsPlugin.EditSongForm - + Song Editor Editor de Canción - + &Title: &Título: - + Alt&ernate title: Título alt&ernativo: - + &Lyrics: &Letras: - + &Verse order: Orden de &versos: - + Ed&it All Ed&itar Todo - + Title && Lyrics Título && Letra - + &Add to Song &Agregar a Canción - + &Remove &Quitar - + &Manage Authors, Topics, Song Books Ad&ministrar Autores, Categorías, Himnarios - + A&dd to Song A&gregar a Canción - + R&emove &Quitar - + Book: Libro: - + Number: Número: - + Authors, Topics && Song Book Autores, Categorías e Himnarios - + New &Theme &Tema Nuevo - + Copyright Information Información de Derechos de Autor - + Comments Comentarios - + Theme, Copyright Info && Comments Tema, Derechos de Autor && Comentarios - + Add Author Agregar Autor - + This author does not exist, do you want to add them? Este autor no existe, ¿desea agregarlo? - + This author is already in the list. Este autor ya esta en la lista. - + 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. - No seleccionado un autor válido. Seleccione un autor de la lista o ingrese un nombre nuevo y presione el botón "Agregar Autor a Canción" para agregar el autor nuevo. + No ha seleccionado un autor válido. Seleccione un autor de la lista o ingrese un nombre nuevo y presione el botón "Agregar Autor a Canción" para agregar el autor nuevo. - + Add Topic Agregar Categoría - + This topic does not exist, do you want to add it? Esta categoría no existe, ¿desea agregarla? - + This topic is already in the list. Esta categoría ya esta en la lista. - + 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. No seleccionado una categoría válida. Seleccione una categoría de la lista o ingrese un nombre nuevo y presione el botón "Agregar Categoría a Canción" para agregar la categoría nueva. - + You need to type in a song title. Debe escribir un título. - + You need to type in at least one verse. Debe agregar al menos un verso. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - El orden de los versos no es válido. Ningún verso corresponde a %s. Las entradas válidas so %s. + El orden del verso es inválido. Ningún verso corresponde a %s. Las entradas válidas son %s. - + Add Book Agregar Himnario - + This song book does not exist, do you want to add it? Este himnario no existe, ¿desea agregarlo? - + You need to have an author for this song. Debe ingresar un autor para esta canción. - + You need to type some text in to the verse. Debe ingresar algún texto en el verso. - + Linked Audio Audio Asociado - + Add &File(s) Agregar &Archivo(s) - + Add &Media Agregar &Medio - + Remove &All Quitar &Todo - + Open File(s) Abrir Archivo(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + <strong>Advertencia:</strong> No se han utilizado todos los versos. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. - + El orden de los versos es inválido. Ningún verso corresponde a %s. Las entradas válidas son %s. @@ -6470,130 +6764,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Seleccione Documento/Presentación - + Song Import Wizard Asistente para Exportar Canciones - + 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. Este asistente le ayudará a importar canciones de diversos formatos. Presione Siguiente para iniciar el proceso al seleccionar un formato a importar. - + Generic Document/Presentation Documento/Presentación genérica - - Filename: - Nombre: - - - - 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. - El importador OpenLyrics no esta desarrollado, pero puede notar que tenemos la intención de hacerlo. Esperamos incluirlo en la siguiente versión. - - - + Add Files... Agregar Archivos... - + Remove File(s) Eliminar Archivo(s) - + Please wait while your songs are imported. Por favor espere mientras se exportan las canciones. - + OpenLP 2.0 Databases Base de Datos OpenLP 2.0 - + openlp.org v1.x Databases Base de datos openlp v1.x - + Words Of Worship Song Files Archivo Words Of Worship - - You need to specify at least one document or presentation file to import from. - Debe especificar al menos un documento o presentación para importar. - - - + Songs Of Fellowship Song Files Archivo Songs Of Fellowship - + SongBeamer Files Archivo SongBeamer - + SongShow Plus Song Files Archivo SongShow Plus - + Foilpresenter Song Files Archivo Foilpresenter - + Copy Copiar - + Save to File Guardar a Archivo - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. El importador de Songs of Fellowship se ha deshabilitado porque OpenOffice.org o LibreOffice no esta disponible. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. El importador documento/presentación se ha deshabilitado porque OpenOffice.org o LibreOffice no esta disponible. - + OpenLyrics or OpenLP 2.0 Exported Song Canción exportada de OpenLyrics o OpenLP 2.0 - + OpenLyrics Files Archivos OpenLyrics + + + CCLI SongSelect Files + Archivos CCLI SongSelect + + + + EasySlides XML File + Archivo EasySlides XML + + + + EasyWorship Song Database + Base de Datos EasyWorship + + + + DreamBeam Song Files + Archivos de Canción DreamBeam + + + + You need to specify a valid PowerSong 1.0 database folder. + Debe especificar un folder de datos PowerSong 1.0 válido. + + + + ZionWorx (CSV) + ZionWorx (CSV) + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + Primero convierta su base de datos ZionWork a un archivo de texto CSV, como se explica en el <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">Manual de Usuario</a>. + SongsPlugin.MediaFilesForm - + Select Media File(s) Seleccionar Archivo(s) de Medios - + Select one or more audio files from the list below, and click OK to import them into this song. Seleccione uno o más archivos de audio de la lista, presione OK para incluirlos en esta canción. @@ -6601,44 +6915,69 @@ SongsPlugin.MediaItem - + Titles Títulos - + Lyrics Letra - + CCLI License: Licensia CCLI: - + Entire Song Canción Completa - + Are you sure you want to delete the %n selected song(s)? - ¿Desea realmente borrar %n canción(es) seleccionada(s)? - ¿Desea realmente borrar %n canciones seleccionadas? + ¿Desea borrar %n canción seleccionada? + ¿Desea borrar las %n canciones seleccionadas? - + Maintain the lists of authors, topics and books. - Administrar la lista de autores, categorías y libros. + Administrar la lista de autores, categorías e himnarios. - + copy For song cloning duplicar + + + Search Titles... + Buscar Títulos... + + + + Search Entire Song... + Buscar Canción Completa... + + + + Search Lyrics... + Buscar Letras... + + + + Search Authors... + Buscar Autores... + + + + Search Song Books... + Buscar Himnarios... + SongsPlugin.OpenLP1SongImport @@ -6665,6 +7004,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + No hay canciones para importar. + + + + Verses not found. Missing "PART" header. + Versos no encontrados. Falta encabezado "PART" + + + SongsPlugin.SongBookForm @@ -6703,12 +7055,12 @@ SongsPlugin.SongImport - + copyright derechos de autor - + The following songs could not be imported: Las siguientes canciones no se importaron: @@ -6725,121 +7077,113 @@ File not found - No se encontró el archivo - - - - SongsPlugin.SongImportForm - - - Your song import failed. - La importación falló. + Archivo no encontrado SongsPlugin.SongMaintenanceForm - + Could not add your author. No se pudo agregar el autor. - + This author already exists. Este autor ya existe. - + Could not add your topic. No se pudo agregar la categoría. - + This topic already exists. Esta categoría ya existe. - + Could not add your book. No se pudo agregar el himnario. - + This book already exists. Este himnario ya existe. - + Could not save your changes. No se pudo guardar los cambios. - + Could not save your modified author, because the author already exists. No se pudo guardar el autor, porque este ya existe. - + Could not save your modified topic, because it already exists. No se pudo guardar la categoría, porque esta ya existe. - + Delete Author Borrar Autor - + Are you sure you want to delete the selected author? - ¿Está seguro que desea eliminar el autor seleccionado? + ¿Desea eliminar el autor seleccionado? - + This author cannot be deleted, they are currently assigned to at least one song. No se puede eliminar el autor, esta asociado con al menos una canción. - + Delete Topic Borrar Categoría - + Are you sure you want to delete the selected topic? - ¿Está seguro que desea eliminar la categoría seleccionada? + ¿Desea eliminar la categoría seleccionada? - + This topic cannot be deleted, it is currently assigned to at least one song. No se puede eliminar la categoría, esta asociada con al menos una canción. - + Delete Book Eliminar Libro - + Are you sure you want to delete the selected book? - ¿Está seguro de que quiere eliminar el himnario seleccionado? + ¿Desea eliminar el himnario seleccionado? - + This book cannot be deleted, it is currently assigned to at least one song. Este himnario no se puede eliminar, esta asociado con al menos una canción. - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? El autor %s ya existe. ¿Desea que las canciones con el autor %s utilizen el existente %s? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? La categoría %s ya existe. ¿Desea que las canciones con la categoría %s utilizen la existente %s? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? El himnario %s ya existe. ¿Desea que las canciones con el himnario %s utilizen el existente %s? @@ -6847,29 +7191,29 @@ SongsPlugin.SongsTab - + Songs Mode Modo de canciones - + Enable search as you type Buscar a medida que se escribe - + Display verses on live tool bar Mostar los versos en la barra de proyección - + Update service from song edit Actualizar servicio desde el editor - - Add missing songs when opening service - Agregar canciones faltantes al abrir el servicio + + Import missing songs from service files + Importar canciones faltantes desde archivos de servicio @@ -6928,4 +7272,17 @@ Otro + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Error al leer el archivo CSV. + + + + File not valid ZionWorx CSV format. + Archivo ZionWorx CSV inválido. + + diff -Nru openlp-1.9.9/resources/i18n/et.ts openlp-1.9.10/resources/i18n/et.ts --- openlp-1.9.9/resources/i18n/et.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/et.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Teade - + Show an alert message. Teate kuvamine. - + Alert name singular Teade - + Alerts name plural Teated - + Alerts container title Teated - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Teadete plugin</strong><br />Teadete plugina abil saab ekraanil näidata näiteks lastehoiu või muid teateid. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Teate sõnum - + Alert &text: Teate &tekst: - + &New &Uus - + &Save &Salvesta - + Displ&ay &Kuva - + Display && Cl&ose Kuva && &sulge @@ -79,7 +79,7 @@ Sa ei ole oma teatele teksti lisanud. Enne nupu Uus vajutamist sisesta mingi tekst. - + &Parameter: &Parameeter: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Font - + Font name: Fondi nimi: - + Font color: Teksti värvus: - + Background color: Tausta värvus: - + Font size: Teksti suurus: - + Alert timeout: Teate kestus: @@ -152,551 +152,597 @@ BiblesPlugin - + &Bible &Piibel - + Bible name singular Piibel - + Bibles name plural Piiblid - + Bibles container title Piiblid - + No Book Found Ühtegi raamatut ei leitud - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Sellest Piiblist ei leitud vastavat raamatut. Kontrolli, kas sa sisestasid raamatu nime õigesti. - + Import a Bible. Piibli importimine. - + Add a new Bible. Uue Piibli lisamine. - + Edit the selected Bible. Valitud Piibli muutmine. - + Delete the selected Bible. Valitud Piibli kustutamine. - + Preview the selected Bible. Valitud Piibli eelvaade. - + Send the selected Bible live. Valitud Piibli saatmine ekraanile. - + Add the selected Bible to the service. Valitud Piibli lisamine teenistusele. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Piibli plugin</strong><br />Piibli plugin võimaldab kuvada teenistuse ajal eri allikatest piiblisalme. - + &Upgrade older Bibles &Uuenda vanemad Piiblid - + Upgrade the Bible databases to the latest format. Piiblite andmebaaside uuendamine uusimasse vormingusse. - + Genesis 1. Moosese - + Exodus 2. Moosese - + Leviticus 3. Moosese - + Numbers 4. Moosese - + Deuteronomy 5. Moosese - + Joshua Joosua - + Judges Kohtumõistjate - + Ruth Rutt - + 1 Samuel 1. Saamueli - + 2 Samuel 2. Saamueli - + 1 Kings 1. Kuningate - + 2 Kings 2. Kuningate - + 1 Chronicles 1. Ajaraamat - + 2 Chronicles 2. Ajaraamat - + Ezra Esra - + Nehemiah Nehemja - + Esther Ester - + Job Iiob - + Psalms Psalmid - + Proverbs Õpetussõnad - + Ecclesiastes Koguja - + Song of Solomon Ülemlaul - + Isaiah Jesaja - + Jeremiah Jeremia - + Lamentations Nutulaulud - + Ezekiel Hesekiel - + Daniel Taaniel - + Hosea Hoosea - + Joel Joel - + Amos Aamos - + Obadiah Obadja - + Jonah Joona - + Micah Miika - + Nahum Nahum - + Habakkuk Habakuk - + Zephaniah Sefanja - + Haggai Haggai - + Zechariah Sakarja - + Malachi Malaki - + Matthew Matteuse - + Mark Markuse - + Luke Luuka - + John Johannese - + Acts Apostlite teod - + Romans Roomlastele - + 1 Corinthians 1. Korintlastele - + 2 Corinthians 2. Korintlastele - + Galatians Galaatlastele - + Ephesians Efeslastele - + Philippians Filiplastele - + Colossians Koloslastele - + 1 Thessalonians 1. Tessalooniklastele - + 2 Thessalonians 2. Tessalooniklastele - + 1 Timothy 1. Timoteosele - + 2 Timothy 2. Timoteosele - + Titus Tiitusele - + Philemon Fileemonile - + Hebrews Heebrealastele - + James Jaakobuse - + 1 Peter 1. Peetruse - + 2 Peter 2. Peetruse - + 1 John 1. Johannese - + 2 John 2. Johannese - + 3 John 3. Johannese - + Jude Juuda - + Revelation Ilmutus - + Judith Juudit - + Wisdom Saalomoni tarkuse raamat - + Tobit Toobit - + Sirach Siirak - + Baruch Baaruk - + 1 Maccabees 1. Makkabite - + 2 Maccabees 2. Makkabite - + 3 Maccabees 3. Makkabite - + 4 Maccabees 4. Makkabite - + Rest of Daniel Taanieli raamatu lisad - + Rest of Esther Estri raamatu lisad - + Prayer of Manasses Manasse palved - + Letter of Jeremiah Jeremija kiri - + Prayer of Azariah Asarja palve - + Susanna Susanna - + Bel Bel - + 1 Esdras 1. Esdra - + 2 Esdras 2. Esdra - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. :|s|S|salm|salmid|v|V;;-|kuni;;,|ja|and;;lõpp|end + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Sa pead Piibli versioonile määrama nime. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Sa pead Piibli autoriõiguse omaniku määrama. Kui Piibel kuulub üldsuse omandisse (Public domain), siis märgi see vastavalt. + + + + Bible Exists + Piibel on juba olemas + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Piibel on juba olemas. Impordi Piibel teise nimega või kustuta enne olemasolev Piibel. + + + + You need to specify a book name for "%s". + Pead "%s" jaoks raamatu nime määrama. + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + Raamatu nimi "%s" ei ole õige. +Numbrid võivad asuda ainult alguses ning nende järel peab olema mõni täht. + + + + Duplicate Book Name + Dubleeriv raamatu nimi + + + + The Book Name "%s" has been entered more than once. + Raamatu nimi "%s" on juba ühe korra sisestatud. + + + BiblesPlugin.BibleManager - + Scripture Reference Error Kirjakohaviite tõrge - + Web Bible cannot be used Veebipiiblit pole võimalik kasutada - + Text Search is not available with Web Bibles. Tekstiotsing veebipiiblist pole võimalik. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Sa ei sisestanud otsingusõna. Sa võid eraldada võtmesõnad tühikuga, et otsida neid kõiki, või eraldada need komaga, et otsitaks ühte neist. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Praegu pole ühtegi Piiblit paigaldatud. Palun paigalda mõni Piibel importimise nõustaja abil. - + No Bibles Available Ühtegi Piiblit pole saadaval - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +765,79 @@ BiblesPlugin.BiblesTab - + Verse Display Salmi kuvamine - + Only show new chapter numbers Kuvatakse ainult uute peatükkide numbreid - + Bible theme: Piibli kujundus: - + No Brackets Ilma sulgudeta - + ( And ) ( ja ) - + { And } { ja } - + [ And ] [ ja ] - + Note: Changes do not affect verses already in the service. Märkus: Muudatused ei rakendu juba teenistuses olevatele salmidele. - + Display second Bible verses Piiblit kuvatakse kahes keeles - + Custom Scripture References Kohandatud kirjakohaviited - + Verse Separator: Salmide eraldaja: - + Range Separator: Vahemike eraldaja: - + List Separator: Loendi eraldaja: - + End Mark: Lõpu märk: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +846,7 @@ Vaikeväärtuse kasutamiseks jäta rida tühjaks. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +855,7 @@ Vaikeväärtuse kasutamiseks jäta rida tühjaks. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +864,7 @@ Vaikeväärtuse kasutamiseks jäta rida tühjaks. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,91 +873,80 @@ Vaikeväärtuse kasutamiseks jäta rida tühjaks. - - Preferred Bookname Language - Raamatunimede eelistatud keel - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Vali keel, milles kuvatakse Piibli -raamatute nimesid piibliotsingus: + + English + Inglise - - Bible language - Piibli keel + + Default Bible Language + Piibli vaikimisi keel - - Application language - Rakenduse keel + + Book name language in search field, +search results and on display: + Raamatu nimede keel otsinguväljal, +otsingutulemustes ja ekraanil: - - English - Inglise + + Bible Language + Piibli keel - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Mitu valikut: -Piibli keel - samas keeles, milles Piibli raamatute nimed imporditi. -Rakenduse keel - selles keeles, milles sa kasutad OpenLP-d -Inglise - raamatute nimed on alati inglise keelsed + + Application Language + Rakenduse keel BiblesPlugin.BookNameDialog - + Select Book Name Vali raamatu nimi - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Järgneva raamatu nime ei suudetud ise tuvastada. Palun vali loetelust vastav ingliskeelne nimi. - - - + Current name: Praegune nimi: - + Corresponding name: Vastav nimi: - + Show Books From Näidatakse ainult - + Old Testament Vana testament - + New Testament Uus testament - + Apocrypha Apokrüüfid + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. Pead valima raamatu. @@ -936,40 +971,110 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Piibliredaktor + + + + License Details + Litsentsi andmed + + + + Version name: + Versiooni nimi: + + + + Copyright: + Autoriõigus: + + + + Permissions: + Lubatud: + + + + Default Bible Language + Piibli vaikimisi keel + + + + Book name language in search field, search results and on display: + Raamatu nime keel otsinguväljal, otsingutulemustes ja ekraanil: + + + + Global Settings + Globaalsätted + + + + Bible Language + Piibli keel + + + + Application Language + Rakenduse keel + + + + English + Inglise + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + See on veebipiibel. +Veebipiibli raamatute nimesid pole võimalik muuta. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + Kohandatud raamatunimede kasutamiseks peab metaandmete kaardil või, kui kasutatakse "Globaalsätteid", Piibli lehel OpenLP seadistuse all olema valitud "Piibli keel". + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Piibli registreerimine ja raamatute laadimine... - + Registering Language... Keele registreerimine... - + Importing %s... Importing <book name>... Raamatu %s importimine... - + Download Error Tõrge allalaadimisel - + 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. Valitud salmide allalaadimisel esines viga. Kontrolli oma internetiühendust ning kui see viga kordub, teata sellest veast. - + Parse Error Parsimise viga - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Sinu salmide vahemiku analüüsimisel esines viga. Kui see viga kordub, siis palun teata sellest veast. @@ -1147,17 +1252,17 @@ BiblesPlugin.LanguageDialog - + Select Language Keele valimine - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP ei suuda tuvastada selle piiblitõlke keelt. Palun vali keel järgnevast loendist. - + Language: Keel: @@ -1173,85 +1278,100 @@ BiblesPlugin.MediaItem - + Quick Kiirotsing - + Find: Otsing: - + Book: Raamat: - + Chapter: Peatükk: - + Verse: Salm: - + From: Algus: - + To: Kuni: - + Text Search Tekstiotsing - + Second: Teine: - + Scripture Reference Salmiviide - + Toggle to keep or clear the previous results. Vajuta eelmiste tulemuste säilitamiseks või eemaldamiseks. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Ühe- ja kahekeelseid piiblisalmide otsitulemusi pole võimalik kombineerida. Kas tahad otsingu tulemused kustutada ja alustada uue otsinguga? - + Bible not fully loaded. Piibel ei ole täielikult laaditud. - + Information Andmed - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. Teine Piibel ei sisalda kõiki salme, mis on peamises Piiblis. Näidatakse ainult neid salme, mis leiduvad mõlemas Piiblis. %d salmi ei kaasatud tulemustesse. + + + Search Scripture Reference... + Piibliviite otsing... + + + + Search Text... + Teksti otsing... + + + + Are you sure you want to delete "%s"? + Kas sa oled kindel, et tahad "%s" kustutada? + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... %s %s. peatüki importimine... @@ -1260,12 +1380,12 @@ 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... @@ -1274,149 +1394,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Varunduskataloogi valimine - + Bible Upgrade Wizard Piibli uuendamise nõustaja - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. See nõustaja aitab uuendada olemasolevaid Piibleid eelnevatelt OpenLP 2 versioonidelt. Uuendamise alustamiseks klõpsa edasi. - + Select Backup Directory Varunduskausta valimine - + Please select a backup directory for your Bibles Vali oma Piiblitele varunduskataloog - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Eelmised OpenLP 2.0 versioonid ei suuda kasutada uuendatud Piibleid. Sellega luuakse sinu praegustest Piiblistest varukoopia, et sa saaksid failid kopeerida tagasi OpenLP andmekataloogi, kui sa pead minema tagasi OpenLP eelmisele versioonile. Juhised failide taastamiseks leiad <a href="http://wiki.openlp.org/faq">Korduma Kippuvatest Küsimustest</a>. - + Please select a backup location for your Bibles. Palun vali oma Piiblite varundamise jaoks kataloog. - + Backup Directory: Varunduskataloog: - + There is no need to backup my Bibles Pole vajadust mu Piibleid varundada - + Select Bibles Piiblite valimine - + Please select the Bibles to upgrade Palun vali Piiblid, mida uuendada - + Upgrading Uuendamine - + Please wait while your Bibles are upgraded. Palun oota, kuni Piibleid uuendatakse. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. Varundamine ei õnnestunud. Piiblite varundamiseks peab sul olema õigus antud kataloogi kirjutada. - + Upgrading Bible %s of %s: "%s" Failed %s Piibli uuendamine %s-st : "%s" Nurjus - + Upgrading Bible %s of %s: "%s" Upgrading ... %s Piibli uuendamine %s-st : "%s" Uuendamine... - + Download Error Tõrge allalaadimisel - + To upgrade your Web Bibles an Internet connection is required. Veebipiiblite uuendamiseks on vajalik internetiühendus. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... %s Piibli uuendamine (kokku %s-st): "%s" %s uuendamine... - + Upgrading Bible %s of %s: "%s" Complete %s. Piibli uuendamine (kokku %s-st): "%s" Valmis - + , %s failed , %s nurjus - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Piibli(te) uuendamine: %s edukat%s Pane tähele, et veebipiiblite salmid laaditakse internetist vajadusel, seega on nende kasutamisel vaja internetiühendust. - + Upgrading Bible(s): %s successful%s Piibli(te) uuendamine: %s edukas%s - + Upgrade failed. Uuendamine nurjus. - + You need to specify a backup directory for your Bibles. Pead määrama Piiblite varundamise kataloogi. - + Starting upgrade... Uuendamise alustamine... - + There are no Bibles that need to be upgraded. Pole ühtegi Piiblit, mis vajaks uuendamist. @@ -1490,12 +1610,12 @@ CustomPlugin.CustomTab - + Custom Display Kohandatud kuva - + Display footer Jaluse kuvamine @@ -1503,42 +1623,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Kohandatud slaidide muutmine - + &Title: &Pealkiri: - + Add a new slide at bottom. Uue slaidi lisamine kõige alumiseks. - + Edit the selected slide. Valitud slaidi muutmine. - + Edit all the slides at once. Kõigi slaidide muutmine ühekorraga. - + Split a slide into two by inserting a slide splitter. Slaidi lõikamine kaheks, sisestades slaidide eraldaja. - + The&me: &Kujundus: - + &Credits: &Autorid: @@ -1553,12 +1673,12 @@ Pead lisama vähemalt ühe slaidi - + Ed&it All Muuda &kõiki - + Insert Slide Uus slaid @@ -1566,7 +1686,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Kas tahad kindlasti %n valitud kohandatud slaidi kustutada? @@ -1577,60 +1697,60 @@ ImagePlugin - + <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>Pildiplugin</strong><br />Pildiplugin võimaldab piltide kuvamise.<br />Üks selle plugina tähtsamaid võimalusi on piltide grupeerimine teenistuse halduris, muutes paljude piltide koos kuvamise lihtsamaks. See plugin võib kasutada ka ajastatud slaidivahetust automaatse slaidiesitluse tegemiseks. Lisaks sellele võib plugina pilte kasutada aktiivse kujunduse tausta asendamiseks. - + Image name singular Pilt - + Images name plural Pildid - + Images container title Pildid - + Load a new image. Uue pildi laadimine. - + Add a new image. Uue pildi lisamine. - + Edit the selected image. Valitud pildi muutmine. - + Delete the selected image. Valitud pildi kustutamine. - + Preview the selected image. Valitud pildi eelvaatlus. - + Send the selected image live. Valitud pildi saatmine ekraanile. - + Add the selected image to the service. Valitud pildi lisamine teenistusele. @@ -1638,7 +1758,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Manuse valimine @@ -1646,44 +1766,44 @@ ImagePlugin.MediaItem - + Select Image(s) Piltide valimine - + You must select an image to delete. Pead enne valima pildi, mida kustutada. - + You must select an image to replace the background with. Pead enne valima pildi, millega tausta asendada. - + Missing Image(s) Puuduvad pildid - + The following image(s) no longer exist: %s Järgnevaid pilte enam pole: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? Järgnevaid pilte enam pole: %s Kas tahad teised pildid sellest hoolimata lisada? - + There was a problem replacing your background, the image file "%s" no longer exists. Tausta asendamisel esines viga, pildifaili "%s" enam pole. - + There was no display item to amend. Polnud ühtegi kuvatavat elementi, mida täiendada. @@ -1691,78 +1811,78 @@ ImagesPlugin.ImageTab - + Background Color Taustavärv - + Default Color: Vaikimisi värvus: - - Provides border where image is not the correct dimensions for the screen when resized. - Kui pildi mõõtmed ei sobi ekraani mõõtmetega, näidatakse pildi servades seda värvi ribasid. + + Visible background for images with aspect ratio different to screen. + Tausta värvus piltidel, mille külgede suhe ei vasta ekraani küljesuhtele. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Meediaplugin</strong><br />Meediaplugin võimaldab audio- ja videofailide taasesitamise. - + Media name singular Meedia - + Media name plural Meedia - + Media container title Meedia - + Load new media. Uue meedia laadimine. - + Add new media. Uue meedia lisamine. - + Edit the selected media. Valitud meedia muutmine. - + Delete the selected media. Valitud meedia kustutamine. - + Preview the selected media. Valitud meedia eelvaatlus. - + Send the selected media live. Valitud meedia saatmine ekraanile. - + Add the selected media to the service. Valitud meedia lisamine teenistusele. @@ -1810,7 +1930,7 @@ Polnud ühtegi kuvatavat elementi, mida täiendada. - + Unsupported File Fail pole toetatud: @@ -1828,22 +1948,22 @@ MediaPlugin.MediaTab - + Available Media Players Saadaolevad meediaesitajad - + %s (unavailable) %s (pole saadaval) - + Player Order Esitajate järjestus - + Allow media player to be overridden Meediaesitajat saab käsitsi vahetada @@ -1851,7 +1971,7 @@ OpenLP - + Image Files Pildifailid @@ -1873,17 +1993,17 @@ OpenLP.AboutForm - + Credits Autorid - + License Litsents - + Contribute Aita kaasa @@ -1893,17 +2013,17 @@ kompileering %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. See programm on vaba tarkvara. Sa võid seda edasi levitada ja/või muuta vastavalt GNU Üldise Avaliku Litsentsi versiooni 2 (GNU GPL 2) tingimustele, nagu need on Vaba Tarkvara Fondi poolt avaldatud. - + 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. Seda programmi levitatakse lootuses, et see on kasulik, kuid ILMA IGASUGUSE GARANTIITA; isegi KESKMISE/TAVALISE KVALITEEDI GARANTIITA või SOBIVUSELE TEATUD KINDLAKS EESMÄRGIKS. Üksikasjade suhtes vaata GNU Üldist Avalikku Litsentsi. - + Project Lead %s @@ -2027,7 +2147,7 @@ tasuta, sest Tema on meid vabastanud. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2044,7 +2164,7 @@ OpenLP on kirjutanud ja seda haldavad vabatahtlikud. Kui sa tahad näha rohkem tasuta kristlikku tarkvara, kaalu kaasaaitamist, kasutades all asuvat nuppu. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Copyright © 2004-2012 %s @@ -2054,87 +2174,87 @@ OpenLP.AdvancedTab - + UI Settings Kasutajaliidese sätted - + Number of recent files to display: Kuvatavate hiljutiste failide arv: - + Remember active media manager tab on startup Käivitumisel avatakse viimati avatud meediahalduri osa - + Double-click to send items straight to live Topeltklõps otse ekraanile saatmiseks - + Expand new service items on creation Uued teenistuse kirjed on loomisel laiendatud - + Enable application exit confirmation Rakenduse lõpetamise teabe lubamine - + Mouse Cursor Hiirekursor - + Hide mouse cursor when over display window Ekraaniakna kohal peidetakse hiirekursor - + Default Image Vaikimisi pilt - + Background color: Taustapilt: - + Image file: Pildifail: - + Open File Faili avamine - + Advanced Täpsem - + Preview items when clicked in Media Manager Meediahalduris klõpsamisel kuvatakse eelvaade - + Click to select a color. Klõpsa värvi valimiseks. - + Browse for an image file to display. Kuvatava pildi valimine. - + Revert to the default OpenLP logo. Vaikimisi OpenLP logo kasutamine. @@ -2146,137 +2266,219 @@ Teenistus %Y-%m-%d %H-%M - + Default Service Name Teenistuse vaikimisi nimi - + Enable default service name Teenistuse vaikimisi nimi lubatud - + Date and Time: Kuupäev ja kellaaeg: - + Monday Esmaspäeval - + Tuesday Teisipäeval - + Wednesday Kolmapäeval - + Thurdsday Neljapäeval - + Friday Reedel - + Saturday Laupäeval - + Sunday Pühapäeval - + Now Praegu - + Time when usual service starts. Mis kell teenistus tavaliselt algab. - + Name: Nimi: - + Consult the OpenLP manual for usage. Kasutuse kohta lähemalt OpenLP käsiraamatust. - + Revert to the default service name "%s". Teenistuse vaikimisi vaikenime "%s" taastamine. - + Example: Näidis: - + X11 X11 - + Bypass X11 Window Manager X11 aknahaldur jäetakse vahele - + Syntax error. Süntaksi viga. + + + Data Location + + + + + Current path: + + + + + Custom path: + + + + + Browse for new data file location. + + + + + Set the data location to the default. + + + + + Cancel + Loobu + + + + Cancel OpenLP data directory location change. + + + + + Copy data to new location. + + + + + Copy the OpenLP data files to the new location. + + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + + + + + Data Directory Error + + + + + Select Data Directory Location + + + + + Confirm Data Directory Change + + + + + Reset Data Directory + + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + + + + + Overwrite Existing Data + + OpenLP.ExceptionDialog - + Error Occurred Esines viga - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Uups! OpenLP-s esines viga, millest pole võimalik taastada. Alumises kastis olev tekst võib olla kasulik OpenLP arendajatele, palun meili see aadressil bugs@openlp.org, koos täpse kirjeldusega sellest, mida sa parasjagu tegid, kui selline probleem esines. - + Send E-Mail Saada e-kiri - + Save to File Salvesta faili - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Palun kirjelda siin, mida sa parasjagu tegid, mis kutsus selle vea esile. (vähemalt 20 tähte) - + Attach File Pane fail kaasa - + Description characters to enter : %s Puuduvad tähed kirjelduses: %s @@ -2284,24 +2486,24 @@ OpenLP.ExceptionForm - + Platform: %s Platvorm: %s - + Save Crash Report Vearaporti salvestamine - + Text files (*.txt *.log *.text) Tekstifailid (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2333,7 +2535,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2470,17 +2672,17 @@ Vaikimisi sätted - + Downloading %s... %s allalaadimine... - + Download complete. Click the finish button to start OpenLP. Allalaadimine lõpetatud. OpenLP käivitamiseks klõpsa lõpetamise nupule. - + Enabling selected plugins... Valitud pluginate sisselülitamine... @@ -2550,32 +2752,32 @@ See nõustaja aitab alguses OpenLP seadistada. Alustamiseks klõpsa edasi nupule. - + Setting Up And Downloading Seadistamine ja allalaadimine - + Please wait while OpenLP is set up and your data is downloaded. Palun oota, kuni OpenLP-d seadistatakse ja andmeid allalaaditakse. - + Setting Up Seadistamine - + Click the finish button to start OpenLP. OpenLP käivitamiseks klõpsa lõpetamise nupule. - + Download complete. Click the finish button to return to OpenLP. Allalaadimine lõpetatud. Klõpsa lõpetamise nupule, et naaseda OpenLP-sse. - + Click the finish button to return to OpenLP. Klõpsa lõpetamise nupule, et naaseda OpenLP-sse. @@ -2585,78 +2787,78 @@ Kohandatud slaidid + + Finish + Lõpeta + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Internetiühendust ei leitud. Esmakäivituse nõustajal on näidislaulude, Piiblite ja kujunduste allalaadimiseks vaja internetti. Et käivitada tavalise seadistusega ning ilma näidisandmeteta, klõpsa Lõpeta nupule. + Internetiühendust ei leitud. Esmakäivituse nõustaja vajab internetiühendust näidislaulude, piiblite ja kujunduste allalaadimiseks. OpenLP käivitamiseks tehaseseadistuses ja ilma näidisandmeteta klõpsa lõpetamise nupule. -Esmakäivituse nõustaja käivitamiseks ning näidisandmestiku importimiseks hiljem kontrolli oma internetiühendust ja käivita see nõustaja valides OpenLP menüüst "Tööriistad/Käivita esmakäivituse nõustaja uuesti". +Esmakäivituse nõustaja hiljem uuesti käivitamiseks kontrolli oma internetiühendust ja käivita see nõustaja uuesti OpenLP menüüst "Tööriistad/Esmakäivituse nõustaja". -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. -Esmakäivituse nõustaja lõplikuks katkestamiseks (ning OpenLP mittekäivitamiseks) vajuta nupule Loobu. - - - - Finish - Lõpeta +Esmakäivituse nõustajast loobumiseks (ning OpenLP mittekäivitamiseks) klõpsa loobumise nupule. OpenLP.FormattingTagDialog - + Configure Formatting Tags Vormindussiltide seadistamine - + Edit Selection Valiku muutmine - + Save Salvesta - + Description Kirjeldus - + Tag Märgis - + Start tag Alustav märgis - + End tag Lõpetav märgis - + Tag Id Märgise ID - + Start HTML Alustav HTML - + End HTML Lõpetav HTML @@ -2664,32 +2866,32 @@ OpenLP.FormattingTagForm - + Update Error Tõrge uuendamisel - + Tag "n" already defined. Märgis "n" on juba defineeritud. - + New Tag Uus märgis - + <HTML here> <HTML siia> - + </and here> </ja siia> - + Tag %s already defined. Märgis %s on juba defineeritud. @@ -2697,82 +2899,82 @@ OpenLP.FormattingTags - + Red Punane - + Black Must - + Blue Sinine - + Yellow Kollane - + Green Roheline - + Pink Roosa - + Orange Oranž - + Purple Lilla - + White Valge - + Superscript Ülaindeks - + Subscript Alaindeks - + Paragraph Lõik - + Bold Rasvane - + Italics Kursiiv - + Underline Allajoonitud - + Break Murdmine @@ -2780,180 +2982,170 @@ OpenLP.GeneralTab - + General Üldine - + Monitors Monitorid - + Select monitor for output display: Peamise kuva ekraan: - + Display if a single screen Kuvatakse ka, kui on ainult üks ekraan - + Application Startup Rakenduse käivitumine - + Show blank screen warning Kuvatakse tühjendatud ekraani hoiatust - + Automatically open the last service Automaatselt avatakse viimane teenistus - + Show the splash screen Käivitumisel kuvatakse logo - + Application Settings Rakenduse sätted - + Prompt to save before starting a new service Uue teenistuse alustamisel pakutakse eelmise salvestamist - + Automatically preview next item in service Teenistuse järgmise elemendi automaatne eelvaatlus - + sec s - + CCLI Details CCLI andmed - + SongSelect username: SongSelecti kasutajanimi: - + SongSelect password: SongSelecti parool: - + X X - + Y Y - + Height Kõrgus - + Width Laius - + Check for updates to OpenLP OpenLP uuenduste kontrollimine - + Unblank display when adding new live item Ekraanile saatmisel võetakse ekraani tühjendamine maha - + Timed slide interval: Ajastatud slaidi kestus: - + Background Audio Taustamuusika - + Start background audio paused Taustamuusika on alguses pausitud - + Service Item Slide Limits Teenistuse elemendi slaidi mõõtmed - - &End Slide - &Viimane slaid - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - Üles- ja allanooled peatuvad teenistuse elemendi esimesel ja viimasel slaidil. - - - - &Wrap Slide - &Slaidide kordus + + Override display position: + Kuva asukoha käsitsi muutmine: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - Üles- ja allanooled jätkavad teenistuse elemendi lõppu (algusesse) jõudmisel uuesti algusest (lõpust). + + Repeat track list + Lugude loendi kordamine - - &Next Item - &Järgmine kirje + + Behavior of next/previous on the last/first slide: + Järgmise/eelmise käitumine viimasel/esimesel slaidil: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - Üles- ja allanooled liiguvad teenistuse elemendi lõppu või algusesse jõudes järgmisele teenistuse elemendile. + + &Remain on Slide + &Jäädakse slaidile - - Override display position: - Kuva asukoha käsitsi muutmine: + + &Wrap around + &Teenistuse elementi korratakse - - Repeat track list - Lugude loendi kordamine + + &Move to next/previous service item + &Liigutakse järgmisele teenistuse elemendile OpenLP.LanguageManager - + Language Keel - + Please restart OpenLP to use your new language setting. Uue keele kasutamiseks käivita OpenLP uuesti. @@ -2969,287 +3161,287 @@ OpenLP.MainWindow - + &File &Fail - + &Import &Impordi - + &Export &Ekspordi - + &View &Vaade - + M&ode &Režiim - + &Tools &Tööriistad - + &Settings &Sätted - + &Language &Keel - + &Help A&bi - + Media Manager Meediahaldur - + Service Manager Teenistuse haldur - + Theme Manager Kujunduste haldur - + &New &Uus - + &Open &Ava - + Open an existing service. Olemasoleva teenistuse avamine. - + &Save &Salvesta - + Save the current service to disk. Praeguse teenistuse salvestamine kettale. - + Save &As... Salvesta &kui... - + Save Service As Salvesta teenistus kui - + Save the current service under a new name. Praeguse teenistuse salvestamine uue nimega. - + E&xit &Välju - + Quit OpenLP Lahku OpenLPst - + &Theme &Kujundus - + &Configure OpenLP... &Seadista OpenLP... - + &Media Manager &Meediahaldur - + Toggle Media Manager Meediahalduri lüliti - + Toggle the visibility of the media manager. Meediahalduri nähtavuse ümberlüliti. - + &Theme Manager &Kujunduse haldur - + Toggle Theme Manager Kujunduse halduri lüliti - + Toggle the visibility of the theme manager. Kujunduse halduri nähtavuse ümberlülitamine. - + &Service Manager &Teenistuse haldur - + Toggle Service Manager Teenistuse halduri lüliti - + Toggle the visibility of the service manager. Teenistuse halduri nähtavuse ümberlülitamine. - + &Preview Panel &Eelvaatluspaneel - + Toggle Preview Panel Eelvaatluspaneeli lüliti - + Toggle the visibility of the preview panel. Eelvaatluspaneeli nähtavuse ümberlülitamine. - + &Live Panel &Ekraani paneel - + Toggle Live Panel Ekraani paneeli lüliti - + Toggle the visibility of the live panel. Ekraani paneeli nähtavuse muutmine. - + &Plugin List &Pluginate loend - + List the Plugins Pluginate loend - + &User Guide &Kasutajajuhend - + &About &Lähemalt - + More information about OpenLP Lähem teave OpenLP kohta - + &Online Help &Abi veebis - + &Web Site &Veebileht - + Use the system language, if available. Kui saadaval, kasutatakse süsteemi keelt. - + Set the interface language to %s Kasutajaliidese keeleks %s määramine - + Add &Tool... Lisa &tööriist... - + Add an application to the list of tools. Rakenduse lisamine tööriistade loendisse. - + &Default &Vaikimisi - + Set the view mode back to the default. Vaikimisi kuvarežiimi taastamine. - + &Setup &Ettevalmistus - + Set the view mode to Setup. Ettevalmistuse kuvarežiimi valimine. - + &Live &Otse - + Set the view mode to Live. Vaate režiimiks ekraanivaate valimine. - + 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/. @@ -3258,108 +3450,108 @@ Sa võid viimase versiooni alla laadida aadressilt http://openlp.org/. - + 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 - + English Please add the name of your language here Eesti - + Configure &Shortcuts... &Kiirklahvide seadistamine... - + Close OpenLP OpenLP sulgemine - + Are you sure you want to close OpenLP? Kas oled kindel, et tahad OpenLP sulgeda? - + Open &Data Folder... Ava &andmete kataloog... - + Open the folder where songs, bibles and other data resides. Laulude, Piiblite ja muude andmete kataloogi avamine. - + &Autodetect &Isetuvastus - + Update Theme Images Uuenda kujunduste pildid - + Update the preview images for all themes. Kõigi teemade eelvaatepiltide uuendamine. - + Print the current service. Praeguse teenistuse printimine. - + &Recent Files &Hiljutised failid - + L&ock Panels &Lukusta paneelid - + Prevent the panels being moved. Paneelide liigutamise kaitse. - + Re-run First Time Wizard Käivita esmanõustaja uuesti - + Re-run the First Time Wizard, importing songs, Bibles and themes. Käivita esmanõustaja uuesti laulude, Piiblite ja kujunduste importimiseks. - + Re-run First Time Wizard? Kas käivitada esmanõustaja uuesti? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3368,43 +3560,43 @@ Selle nõustaja taaskäivitamine muudab sinu praegust OpenLP seadistust ja võib lisada laule olemasolevate laulude loetelusse ning muuta vaikimisi kujundust. - + Clear List Clear List of recent files Tühjenda loend - + Clear the list of recent files. Hiljutiste failide nimekirja tühjendamine. - + Configure &Formatting Tags... &Vormindusmärgised... - + Export OpenLP settings to a specified *.config file OpenLP sätete eksportimine määratud *.config faili - + Settings Sätted - + Import OpenLP settings from a specified *.config file previously exported on this or another machine OpenLP sätete importimine määratud *.config failist, mis on varem sellest või mõnest teisest arvutist eksporditud. - + Import settings? Kas importida sätted? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3417,45 +3609,50 @@ Väärade sätete importimine võib põhjustada OpenLP väära käitumist või sulgumist. - + Open File Faili avamine - + OpenLP Export Settings Files (*.conf) OpenLP eksporditud sätete failid (*.conf) - + Import settings Sätete importimine - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP sulgub nüüd. Imporditud sätted rakenduvad OpenLP järgmisel käivitumisel. - + Export Settings File Sättefaili eksportimine - + OpenLP Export Settings File (*.conf) OpenLP eksporditud sätete fail (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error Andmebaasi viga - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3464,7 +3661,7 @@ Andmebaas: %s - + OpenLP cannot load your database. Database: %s @@ -3476,74 +3673,74 @@ OpenLP.MediaManagerItem - + No Items Selected Ühtegi elementi pole valitud - + &Add to selected Service Item &Lisa valitud teenistuse elemendile - + You must select one or more items to preview. Sa pead valima vähemalt ühe kirje, mida eelvaadelda. - + You must select one or more items to send live. Sa pead valima vähemalt ühe kirje, mida tahad ekraanil näidata. - + You must select one or more items. Pead valima vähemalt ühe elemendi. - + You must select an existing service item to add to. Pead valima olemasoleva teenistuse, millele lisada. - + Invalid Service Item Vigane teenistuse element - + You must select a %s service item. Pead valima teenistuse elemendi %s. - + You must select one or more items to add. Pead valima vähemalt ühe kirje, mida tahad lisada. - + No Search Results Otsing ei andnud tulemusi - + Invalid File Type Sobimatut liiki fail - + Invalid File %s. Suffix not supported Sobimatu fail %s. Selle lõpuga fail ei ole toetatud - + &Clone &Klooni - + Duplicate files were found on import and were ignored. Importimisel tuvastati duplikaatfailid ning neid eirati. @@ -3551,12 +3748,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. Puudub <lyrics> silt. - + <verse> tag is missing. Puudub <verse> silt. @@ -3564,27 +3761,27 @@ OpenLP.PluginForm - + Plugin List Pluginate loend - + Plugin Details Plugina andmed - + Status: Olek: - + Active Aktiivne - + Inactive Pole aktiivne @@ -3607,12 +3804,12 @@ OpenLP.PrintServiceDialog - + Fit Page Mahuta lehele - + Fit Width Mahuta laius @@ -3620,7 +3817,7 @@ OpenLP.PrintServiceForm - + Options Valikud @@ -3635,47 +3832,47 @@ Kopeeri HTMLina - + Zoom In Suurendamine - + Zoom Out Vähendamine - + Zoom Original Originaalsuurus - + Other Options Muud valikud - + Include slide text if available Slaidi tekst, kui saadaval - + Include service item notes Teenistuse kirje märkmed - + Include play length of media items Meediakirjete pikkus - + Add page break before each text item Iga tekstikirje algab uuelt lehelt - + Service Sheet Teenistuse leht @@ -3685,12 +3882,12 @@ Prindi - + Title: Pealkiri: - + Custom Footer Text: Kohandatud jaluse tekst: @@ -3698,12 +3895,12 @@ OpenLP.ScreenList - + Screen Ekraan - + primary peamine @@ -3711,12 +3908,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Algus</strong>: %s - + <strong>Length</strong>: %s <strong>Kestus</strong>: %s @@ -3724,7 +3921,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Teenistuse elementide ümberjärjestamine @@ -3732,82 +3929,82 @@ OpenLP.ServiceManager - + Move to &top Tõsta ü&lemiseks - + Move item to the top of the service. Teenistuse algusesse tõstmine. - + Move &up Liiguta &üles - + Move item up one position in the service. Elemendi liigutamine teenistuses ühe koha võrra ettepoole. - + Move &down Liiguta &alla - + Move item down one position in the service. Elemendi liigutamine teenistuses ühe koha võrra tahapoole. - + Move to &bottom Tõsta &alumiseks - + Move item to the end of the service. Teenistuse lõppu tõstmine. - + &Delete From Service &Kustuta teenistusest - + Delete the selected item from the service. Valitud elemendi kustutamine teenistusest. - + &Add New Item &Lisa uus element - + &Add to Selected Item &Lisa valitud elemendile - + &Edit Item &Muuda kirjet - + &Reorder Item &Muuda elemendi kohta järjekorras - + &Notes &Märkmed - + &Change Item Theme &Muuda elemendi kujundust @@ -3829,112 +4026,107 @@ 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, kuna vajalik plugin on puudu või pole aktiivne - + &Expand all &Laienda kõik - + Expand all the service items. Kõigi teenistuse kirjete laiendamine. - + &Collapse all &Ahenda kõik - + Collapse all the service items. Kõigi teenistuse kirjete ahendamine. - + Open File Faili avamine - + Moves the selection down the window. Valiku tõstmine aknas allapoole. - + Move up Liiguta üles - + Moves the selection up the window. Valiku tõstmine aknas ülespoole. - + Go Live Ekraanile - + Send the selected item to Live. Valitud kirje saatmine ekraanile. - + &Start Time &Alguse aeg - + Show &Preview Näita &eelvaadet - - Show &Live - Näita &ekraanil - - - + Modified Service Teenistust on muudetud - + The current service has been modified. Would you like to save this service? Praegust teenistust on muudetud. Kas tahad selle teenistuse salvestada? - + Custom Service Notes: Kohandatud teenistuse märkmed: - + Notes: Märkmed: - + Playing time: Kestus: - + Untitled Service Pealkirjata teenistus @@ -3959,17 +4151,17 @@ Rikutud fail - + Load an existing service. Olemasoleva teenistuse laadimine. - + Save this service. Selle teenistuse salvestamine. - + Select a theme for the service. Teenistuse jaoks kujunduse valimine. @@ -3979,7 +4171,7 @@ See fail on rikutud või ei ole see OpenLP 2.0 teenistuse fail. - + Service File Missing Teenistuse fail puudub @@ -4003,11 +4195,21 @@ Service copy only Ainult teenistuse koopia + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes Teenistuse elemendi märkmed @@ -4023,67 +4225,67 @@ OpenLP.ShortcutListDialog - + Action Tegevus - + Shortcut Kiirklahv - + Duplicate Shortcut Dubleeriv kiirklahv - + The shortcut "%s" is already assigned to another action, please use a different shortcut. Kiirklahv "%s" on juba seotud teise tegevusega, kasuta mingit muud kiirklahvi. - + Alternate Muuda - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Vali tegevus ja klõpsa kummalgi alumisel nupul, et salvestada uus peamine või alternatiivne kiirklahv. - + Default Vaikimisi - + Custom Kohandatud - + Capture shortcut. Kiirklahvi salvestamine. - + Restore the default shortcut of this action. Selle tegevuse vaikimisi kiirklahvi taastamine. - + Restore Default Shortcuts Vaikimisi kiirklahvide taastamine - + Do you want to restore all shortcuts to their defaults? Kas tahad taastada kõigi kiirklahvide vaikimisi väärtused? - + Configure Shortcuts Seadista kiirklahve @@ -4091,177 +4293,172 @@ OpenLP.SlideController - + Hide Peida - + Go To Mine - + Blank Screen Ekraani tühjendamine - + Blank to Theme Kujunduse tausta näitamine - + Show Desktop Töölaua näitamine - + Previous Service Eelmine teenistus - + Next Service Järgmine teenistus - + Escape Item Kuva sulgemine - + Move to previous. Eelmisele liikumine. - + Move to next. Järgmisele liikumine. - + Play Slides Slaidide esitamine - + Delay between slides in seconds. Viivitus slaidide vahel sekundites. - + Move to live. Ekraanile saatmine. - + Add to Service. Teenistusele lisamine. - + Edit and reload song preview. Laulu muutmine ja eelvaate uuesti laadimine. - + Start playing media. Meedia esitamise alustamine. - + Pause audio. Audio pausimine. - + Pause playing media. Meedia esitamise pausimine. - + Stop playing media. Meedia esitamise peatamine. - + Video position. Video asukoht. - + Audio Volume. Helivaljus. - + Go to "Verse" Mine salmile - + Go to "Chorus" Mine refräänile - + Go to "Bridge" Mine vahemängule - + Go to "Pre-Chorus" Mine eelrefräänile - + Go to "Intro" Mine sissejuhatusele - + Go to "Ending" Mine lõpetusele - + Go to "Other" Mine muule osale - + Previous Slide Eelmine slaid - + Next Slide Järgmine slaid - + Pause Audio Audio pausimine - + Background Audio Taustamuusika - - Next Track - Järgmine pala - - - + Go to next audio track. Järgmisele muusikapalale liikumine. - + Tracks Palad @@ -4337,17 +4534,17 @@ Alustamise aeg on pärast meedia lõppu. - + Theme Layout Kujunduse paigutus - + The blue box shows the main area. Sinine raam näitab peaala. - + The red box shows the footer. Punane raam näitab jalust. @@ -4355,32 +4552,32 @@ OpenLP.ThemeForm - + Select Image Pildi valimine - + Theme Name Missing Kujundusel puudub nimi - + There is no name for this theme. Please enter one. Kujundusel ei ole nime. Palun sisesta nimi. - + Theme Name Invalid Sobimatu kujunduse nimi - + Invalid theme name. Please enter one. Kujunduse nimi pole sobiv. Palun sisesta sobiv nimi. - + (approximately %d lines per slide) (umbes %d rida slaidil) @@ -4388,193 +4585,193 @@ OpenLP.ThemeManager - + Create a new theme. Uue kujunduse loomine. - + Edit Theme Kujunduse muutmine - + Edit a theme. Kujunduse muutmine. - + Delete Theme Kujunduse kustutamine - + Delete a theme. Kujunduse kustutamine. - + Import Theme Kujunduse importimine - + Import a theme. Kujunduse importimine. - + Export Theme Kujunduse eksportimine - + Export a theme. Kujunduse eksportimine. - + &Edit Theme Kujunduse &muutmine - + &Delete Theme Kujunduse &kustutamine - + Set As &Global Default 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 kujundus 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. See fail ei ole sobilik kujundus. - + &Copy Theme &Kopeeri kujundust - + &Rename Theme &Nimeta kujundus ümber - + &Export Theme &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) - + Copy of %s Copy of <theme name> %s (koopia) - + Theme Already Exists Kujundus on juba olemas @@ -4582,272 +4779,272 @@ OpenLP.ThemeWizard - + Theme Wizard Kujunduse nõustaja - + Welcome to the Theme Wizard Tere tulemast kujunduse nõustajasse - + Set Up Background Tausta määramine - + Set up your theme's background according to the parameters below. Määra kujunduse taust, kasutades järgnevaid parameetreid. - + Background type: Tausta liik: - + Solid Color Ühtlane värv - + Gradient Üleminek - + Color: Värvus: - + Gradient: Üleminek: - + Horizontal Horisontaalne - + Vertical Vertikaalne - + Circular Radiaalne - + Top Left - Bottom Right Loodest kagusse - + Bottom Left - Top Right Edelast kirdesse - + Main Area Font Details Peamise teksti üksikasjad - + Define the font and display characteristics for the Display text Määra font ja teised teksti omadused - + Font: Font: - + Size: Suurus: - + Line Spacing: Reavahe: - + &Outline: &Kontuurjoon: - + &Shadow: &Vari: - + Bold Rasvane - + Italic Kaldkiri - + Footer Area Font Details Jaluse fondi üksikasjad - + Define the font and display characteristics for the Footer text Määra jaluse font ja muud omadused - + Text Formatting Details Teksti vorminduse üksikasjad - + Allows additional display formatting information to be defined Võimaldab määrata lisavorminduse andmeid - + Horizontal Align: Rõhtjoondus: - + Left Vasakul - + Right Paremal - + Center Keskel - + Output Area Locations Väljundala asukoht - + Allows you to change and move the main and footer areas. Võimaldab muuta ja liigutada peamist ja jaluse ala. - + &Main Area &Peamine ala - + &Use default location &Vaikimisi asukoha kasutamine - + X position: X-asukoht: - + px px - + Y position: Y-asukoht: - + Width: Laius: - + Height: Kõrgus: - + Use default location Vaikimisi asukoha kasutamine - + Save and Preview Salvestamine ja eelvaade - + View the theme and save it replacing the current one or change the name to create a new theme Vaata kujundus üle ja salvesta see, asendades olemasolev, või muuda nime, et luua uus kujundus - + Theme name: Kujunduse nimi: - + Edit Theme - %s Teema muutmine - %s - + 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. See nõustaja aitab kujundusi luua ja muuta. Klõpsa edasi nupul, et alustada tausta määramisest. - + Transitions: Üleminekud: - + &Footer Area &Jaluse ala - + Starting color: Algusvärvus: - + Ending color: Lõppvärvus: - + Background color: Tausta värvus: - + Justify Rööpjoondus - + Layout Preview Kujunduse eelvaade - + Transparent Läbipaistev @@ -4855,47 +5052,47 @@ OpenLP.ThemesTab - + Global Theme Üldine kujundus - + Theme Level Kujunduse tase - + S&ong Level &Laulu tase - + 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. Laul kuvatakse sellele andmebaasis määratud kujundusega. Kui laulul kujundus puudub, kasutatakse teenistuse kujundust. Kui teenistusel kujundus puudub, siis kasutatakse üleüldist kujundust. - + &Service Level &Teenistuse tase - + 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. Kasutatakse teenistuse kujundust, eirates laulude kujundusi. Kui teenistusel kujundust pole, kasutatakse globaalset. - + &Global Level &Üleüldine tase - + Use the global theme, overriding any themes associated with either the service or the songs. Kasutatakse globaalset kujundust, eirates nii teenistuse kui laulu kujundust. - + Themes Kujundused @@ -4979,239 +5176,239 @@ pt - + Image Pilt - + Import Impordi - + Live Ekraan - + Live Background Error Ekraani tausta viga - + Load Laadi - + Middle Keskel - + New Uus - + New Service Uus teenistus - + New Theme Uus kujundus - + No File Selected Singular Ühtegi faili pole valitud - + No Files Selected Plural Ühtegi faili pole valitud - + No Item Selected Singular Ühtegi elementi pole valitud - + No Items Selected Plural Ühtegi elementi pole valitud - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Eelvaade - + Replace Background Tausta asendamine - + Reset Background Tausta lähtestamine - + s The abbreviated unit for seconds s - + Save && Preview Salvesta && eelvaatle - + Search Otsi - + You must select an item to delete. Pead valima elemendi, mida tahad kustutada. - + You must select an item to edit. Pead valima elemendi, mida tahad muuta. - + Save Service Teenistuse salvestamine - + Service Teenistus - + Start %s Algus %s - + Theme Singular Kujundus - + Themes Plural Kujundused - + Top Üleval - + Version Versioon - + Delete the selected item. Valitud kirje kustutamine. - + Move selection up one position. Valiku liigutamine ühe koha võrra ülespoole. - + Move selection down one position. Valiku liigutamine ühe koha võrra allapoole. - + &Vertical Align: &Vertikaaljoondus: - + Finished import. Importimine lõpetatud. - + Format: Vorming: - + Importing Importimine - + Importing "%s"... "%s" importimine... - + Select Import Source Importimise allika valimine - + Select the import format and the location to import from. Vali importimise vorming ja asukoht, kust importida. - + 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. openlp.org 1.x importija on ühe puuduva Pythoni mooduli pärast keelatud. Kui sa tahad seda importijat kasutada, pead paigaldama mooduli "python-sqlite". - + Open %s File %s faili avamine - + %p% %p% - + Ready. Valmis. - + Starting import... Importimise alustamine... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong Pead määrama vähemalt ühe %s faili, millest importida. @@ -5227,7 +5424,7 @@ Tere tulemast laulude eksportimise nõustajasse - + Welcome to the Song Import Wizard Tere tulemast laulude importimise nõustajasse @@ -5315,53 +5512,53 @@ t - + Layout style: Paigutuse laad: - + Live Toolbar Ekraani tööriistariba - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP juba töötab. Kas tahad jätkata? - + Settings Sätted - + Tools Tööriistad - + Unsupported File Fail ei ole toetatud - + Verse Per Slide Iga salm eraldi slaidil - + Verse Per Line Iga salm eraldi real - + View Vaade @@ -5376,42 +5573,37 @@ XML süntaksi viga - + View Mode Vaate režiim - + Open service. Teenistuse avamine. - + Print Service Teenistuse printimine - + Replace live background. Ekraanil tausta asendamine. - + Reset live background. Ekraanil esialgse tausta taastamine. - - &Split - &Tükelda - - - + Split a slide into two only if it does not fit on the screen as one slide. Slaidi kaheks tükeldamine ainult juhul, kui see ei mahu tervikuna ekraanile. - + Welcome to the Bible Upgrade Wizard Tere tulemast Piibli uuendamise nõustajasse @@ -5421,53 +5613,105 @@ Kustutamise kinnitus - + Play Slides in Loop Slaide korratakse - + Play Slides to End Slaide näidatakse üks kord - + Stop Play Slides in Loop Slaidide kordamise lõpetamine - + Stop Play Slides to End Slaidide ühekordse näitamise lõpetamine - + Next Track Järgmine lugu + + + Search Themes... + Search bar place holder text + Teemade otsing... + + + + Optional &Split + Valikuline &slaidivahetus + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 ja %2 - + %1, and %2 Locale list separator: end %1, ja %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5476,50 +5720,50 @@ PresentationPlugin - + <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>Esitluse plugin</strong><br />Esitluse plugin võimaldab näidata esitlusi erinevate programmidega. Saadaolevate esitlusprogrammide valik on saadaval valikukastis. - + Presentation name singular Esitlus - + Presentations name plural Esitlused - + Presentations container title Esitlused - + Load a new presentation. Uue esitluse laadimine. - + Delete the selected presentation. Valitud esitluse kustutamine. - + Preview the selected presentation. Valitud esitluse eelvaade. - + Send the selected presentation live. Valitud esitluse saatmine ekraanile. - + Add the selected presentation to the service. Valitud esitluse lisamine teenistusele. @@ -5527,70 +5771,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Esitluste valimine - + Automatic Automaatne - + Present using: Esitluseks kasutatakse: - + File Exists Fail on olemas - + A presentation with that filename already exists. Sellise nimega esitluse fail on juba olemas. - + This type of presentation is not supported. Seda liiki esitlus ei ole toetatud. - + Presentations (%s) Esitlused (%s) - + Missing Presentation Puuduv esitlus - - The Presentation %s no longer exists. - Esitlust %s enam ei ole. + + The presentation %s is incomplete, please reload. + - - The Presentation %s is incomplete, please reload. - Esitlus %s ei ole täielik, palun laadi see uuesti. + + The presentation %s no longer exists. + PresentationPlugin.PresentationTab - + Available Controllers Saadaolevad juhtijad - + %s (unavailable) %s (pole saadaval) - + Allow presentation application to be overridden Esitluste rakendust saab käsitsi muuta @@ -5624,135 +5868,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 kaugpult - + OpenLP 2.0 Stage View OpenLP 2.0 ekraanivaade - + Service Manager Teenistuse haldur - + Slide Controller Slaidikontroller - + Alerts Teated - + Search Otsi - - Back - Tagasi - - - + Refresh Värskenda - + Blank Tühi - + Show Näita - + Prev Eelm - + Next Järgm - + Text Tekst - + Show Alert Kuva teade - + Go Live Ekraanile - + No Results Tulemusi pole - + Options Valikud - + Add to Service Lisa teenistusele + + + Home + Kodu + + + + Theme + Kujundus + + + + Desktop + Töölaud + + + + Add &amp; Go to Service + Lisa ja liigu teenistusse + RemotePlugin.RemoteTab - + Serve on IP address: Serveeritakse ainult IP-aadressilt: - + Port number: Pordi number: - + Server Settings Serveri sätted - + Remote URL: Kaugjuhtimise URL: - + Stage view URL: Lavavaate URL: - + Display stage time in 12h format Laval kuvatakse aega 12-tunni vormingus - + Android App Androidi rakendus - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Skanni QR kood või klõpsa <a href="https://market.android.com/details?id=org.openlp.android">allalaadimise lingil</a>, et paigaldada Marketist Androidi rakendus. @@ -5760,85 +6019,85 @@ SongUsagePlugin - + &Song Usage Tracking &Laulude kasutuse jälgimine - + &Delete Tracking Data &Kustuta kogutud andmed - + Delete song usage data up to a specified date. Laulukasutuse andmete kustutamine kuni antud kuupäevani. - + &Extract Tracking Data &Eralda laulukasutuse andmed - + Generate a report on song usage. Genereeri raport laulude kasutuse kohta. - + Toggle Tracking Laulukasutuse jälgimine - + Toggle the tracking of song usage. Laulukasutuse jälgimise sisse- ja väljalülitamine. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Laulude plugin</strong><br />See plugin võimaldab laulude kuvamise ja haldamise. - + SongUsage name singular Laulukasutus - + SongUsage name plural Laulukasutus - + SongUsage container title Laulukasutus - + Song Usage Laulude kasutus - + Song usage tracking is active. Laulukasutuse jälgimine on aktiivne - + Song usage tracking is inactive. Laulukasutuse jälgimine pole aktiivne. - + display kuva - + printed prinditud @@ -5846,7 +6105,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Laulukasutuse andmete kustutamine @@ -5871,7 +6130,7 @@ Kõik kustutamisele määratud andmed kustutati edukalt. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Vali kuupäev, milleni laulukasutuse andmed tuleks kustutada. Kõik kuni selle määratud hetkeni kogutud andmed kustutatakse lõplikult. @@ -5879,42 +6138,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Laulukasutuse salvestamine - + Select Date Range Vali kuupäevade vahemik - + to kuni - + Report Location Raporti asukoht - + Output File Location Väljundfaili asukoht - + usage_detail_%s_%s.txt laulukasutuse_andmed_%s_%s.txt - + Report Creation Raporti koostamine - + Report %s has been successfully created. @@ -5923,12 +6182,12 @@ on edukalt loodud. - + Output Path Not Selected Sihtkohta pole valitud - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. Sa pole määranud sobivat sihtkohta laulukasutuse raporti jaoks. Palun vali mõni kataloog oma arvutist. @@ -5966,82 +6225,82 @@ Laulude kordusindekseerimine... - + Arabic (CP-1256) Araabia (CP-1256) - + Baltic (CP-1257) Balti (CP-1257) - + Central European (CP-1250) Kesk-Euroopa (CP-1250) - + Cyrillic (CP-1251) Kirillitsa (CP-1251) - + Greek (CP-1253) Kreeka (CP-1253) - + Hebrew (CP-1255) Heebrea (CP-1255) - + Japanese (CP-932) Jaapani (CP-932) - + Korean (CP-949) Korea (CP-949) - + Simplified Chinese (CP-936) Lihtsustatud Hiina (CP-936) - + Thai (CP-874) Tai (CP-874) - + Traditional Chinese (CP-950) Tradistiooniline Hiina (CP-950) - + Turkish (CP-1254) Türgi (CP-1254) - + Vietnam (CP-1258) Vietnami (CP-1258) - + Western European (CP-1252) Lääne-Euroopa (CP-1252) - + Character Encoding Märgikodeering - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6049,26 +6308,26 @@ Tavaliselt on vaikimisi valik õige. - + Please choose the character encoding. The encoding is responsible for the correct character representation. Palun vali märgikodeering. Kodeering on vajalik märkide õige esitamise jaoks. - + Song name singular Laul - + Songs name plural Laulud - + Songs container title Laulud @@ -6079,32 +6338,32 @@ Eksportimise nõustaja abil laulude eksportimine. - + Add a new song. Uue laulu lisamine. - + Edit the selected song. Valitud laulu muutmine. - + Delete the selected song. Valitud laulu kustutamine. - + Preview the selected song. Valitud laulu eelvaade. - + Send the selected song live. Valitud laulu saatmine ekraanile. - + Add the selected song to the service. Valitud laulu lisamine teenistusele. @@ -6132,17 +6391,17 @@ Perekonnanimi: - + You need to type in the first name of the author. Pead sisestama autori eesnime. - + You need to type in the last name of the author. Pead sisestama autori perekonnanime. - + You have not set a display name for the author, combine the first and last names? Sa ei ole sisestanud autori kuvamise nime, kas see tuleks kombineerida ees- ja perekonnanimest? @@ -6173,209 +6432,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Metaandmed + + + + Custom Book Names + Kohandatud raamatunimed + + + SongsPlugin.EditSongForm - + Song Editor Lauluredaktor - + &Title: &Pealkiri: - + Alt&ernate title: &Teine pealkiri: - + &Lyrics: &Sõnad: - + &Verse order: &Salmide järjekord: - + Ed&it All Muuda &kõiki - + Title && Lyrics Pealkiri && sõnad - + &Add to Song &Lisa laulule - + &Remove &Eemalda - + &Manage Authors, Topics, Song Books &Autorite, teemade ja laulikute haldamine - + A&dd to Song L&isa laulule - + R&emove &Eemalda - + Book: Raamat: - + Number: Number: - + Authors, Topics && Song Book Autorid, teemad && laulik - + New &Theme Uus &kujundus - + Copyright Information Autoriõiguse andmed - + Comments Kommentaarid - + Theme, Copyright Info && Comments Kujundus, autoriõigus && kommentaarid - + Add Author Autori lisamine - + This author does not exist, do you want to add them? Seda autorit veel pole, kas tahad autori lisada? - + This author is already in the list. See autor juba on loendis. - + 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. Sa ei ole valinud ühtegi sobilikku autorit. Vali autor loendist või sisesta uue autori nimi ja klõpsa uue nupul "Lisa laulule autor". - + Add Topic Teema lisamine - + This topic does not exist, do you want to add it? Sellist teemat pole. Kas tahad selle lisada? - + This topic is already in the list. See teema juba on loendis. - + 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. Sa pole valinud sobivat teemat. Vali teema kas loendist või sisesta uus teema ja selle lisamiseks klõpsa nupule "Lisa laulule teema". - + You need to type in a song title. Pead sisestama laulu pealkirja. - + You need to type in at least one verse. Pead sisestama vähemalt ühe salmi. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. Salmide järjekord pole sobiv. Mitte ükski valm ei vasta %s-le. Sobivad salmid on %s. - + Add Book Lauliku lisamine - + This song book does not exist, do you want to add it? Sellist laulikut pole. Kas tahad selle lisada? - + You need to have an author for this song. Pead lisama sellele laulule autori. - + You need to type some text in to the verse. Salm peab sisaldama teksti. - + Linked Audio Lingitud audio - + Add &File(s) Lisa &faile - + Add &Media Lisa &meediat - + Remove &All Eemalda &kõik - + Open File(s) Failide avamine - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Hoiatus</strong> Mitte kõik salmid pole kasutusel. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. Salmide järjekord on vale. Ühtegi salmi nimega %s pole. Õiged nimed on %s. @@ -6489,130 +6761,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Dokumentide/esitluste valimine - + Song Import Wizard Laulude importimise nõustaja - + 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. See nõustaja aitab importida paljudes erinevates vormingutes laule. Klõpsa all asuvat edasi nuppu, et jätkata importimise vormingu valimisega. - + Generic Document/Presentation Tavaline dokument/esitlus - - Filename: - Failinimi: - - - - 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. - OpenLyrics importija ei ole veel valmis, kuid nagu sa näed, on meil plaanis see luua. Loodetavasti saab see järgmiseks väljalaskeks valmis. - - - + Add Files... Lisa faile... - + Remove File(s) Faili(de) eemaldamine - + Please wait while your songs are imported. Palun oota, kuni laule imporditakse. - + OpenLP 2.0 Databases OpenLP 2.0 andmebaas - + openlp.org v1.x Databases openlp.org v1.x andmebaas - + Words Of Worship Song Files Words Of Worship Song failid - - You need to specify at least one document or presentation file to import from. - Pead määrama vähemalt ühe dokumendi või esitluse faili, millest tahad importida. - - - + Songs Of Fellowship Song Files Songs Of Fellowship laulufailid - + SongBeamer Files SongBeameri laulufailid - + SongShow Plus Song Files SongShow Plus laulufailid - + Foilpresenter Song Files Foilpresenteri laulufailid - + Copy Kopeeri - + Save to File Salvesta faili - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Songs of Fellowship importija on keelatud, kuna OpenLP-l puudub ligiäpääs OpenOffice'le või LibreOffice'le. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Tavalise dokumendi/esitluse importija on keelatud, kuna OpenLP-l puudub ligipääs OpenOffice'le või LibreOffice'le. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics või OpenLP 2.0-st eksporditud laul - + OpenLyrics Files OpenLyrics failid + + + CCLI SongSelect Files + CCLI SongSelecti failid + + + + EasySlides XML File + EasySlides XML fail + + + + EasyWorship Song Database + EasyWorship laulude andmebaas + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) Meediafailide valimine - + Select one or more audio files from the list below, and click OK to import them into this song. Vali järgnevast loendist vähemalt üks audiofail ning klõpsa nupule Olgu, et seda sellesse laulu importida. @@ -6620,27 +6912,27 @@ SongsPlugin.MediaItem - + Titles Pealkirjad - + Lyrics Laulusõnad - + CCLI License: CCLI litsents: - + Entire Song Kogu laulust - + Are you sure you want to delete the %n selected song(s)? Kas sa oled kindel, et soovid kustutada %n valitud laulu? @@ -6648,16 +6940,41 @@ - + Maintain the lists of authors, topics and books. Autorite, teemade ja laulikute loendi haldamine. - + copy For song cloning koopia + + + Search Titles... + Pealkirjade otsing... + + + + Search Entire Song... + Otsing kogu laulust... + + + + Search Lyrics... + Laulusõnade otsing... + + + + Search Authors... + Autorite otsing... + + + + Search Song Books... + Laulikute otsimine... + SongsPlugin.OpenLP1SongImport @@ -6684,6 +7001,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6722,12 +7052,12 @@ SongsPlugin.SongImport - + copyright autoriõigus - + The following songs could not be imported: Järgnevaid laule polnud võimalik importida: @@ -6748,117 +7078,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Laulu importimine nurjus. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Autori lisamine pole võimalik. - + This author already exists. See autor on juba olemas. - + Could not add your topic. Sinu teema lisamine pole võimalik. - + This topic already exists. Teema on juba olemas. - + Could not add your book. Lauliku lisamine pole võimalik. - + This book already exists. See laulik on juba olemas. - + Could not save your changes. Muudatuste salvestamine pole võimalik. - + Could not save your modified author, because the author already exists. Sinu muudetud autorit pole võimalik salvestada, kuna autor on juba olemas. - + Could not save your modified topic, because it already exists. Sinu muudetud teemat pole võimalik salvestada, kuna selline on juba olemas. - + Delete Author Autori kustutamine - + Are you sure you want to delete the selected author? Kas oled kindel, et tahad kustutada valitud autori? - + This author cannot be deleted, they are currently assigned to at least one song. Seda autorit pole võimalik kustutada, kuna ta on märgitud vähemalt ühe laulu autoriks. - + Delete Topic Teema kustutamine - + Are you sure you want to delete the selected topic? Kas oled kindel, et tahad valitud teema kustutada? - + This topic cannot be deleted, it is currently assigned to at least one song. Seda teemat pole võimalik kustutada, kuna see on märgib vähemalt ühte laulu. - + Delete Book Lauliku kustutamine - + Are you sure you want to delete the selected book? Kas oled kindel, et tahad valitud lauliku kustutada? - + This book cannot be deleted, it is currently assigned to at least one song. Seda laulikut pole võimalik kustutada, kuna vähemalt üks laul kuulub sellesse laulikusse. - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? Autor %s on juba olemas. Kas sa tahad, et laulud autoriga %s liidetaks olemasolevale autorile %s? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? Teema %s on juba olemas. Kas sa tahad, et laulud teemaga %s kasutaksid olemasolevat teemat %s? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? Laulik %s on juba olemas. Kas sa tahad, et lauliku %s laulud liidetaks olemasoleva laulikuga %s? @@ -6866,29 +7188,29 @@ SongsPlugin.SongsTab - + Songs Mode Laulurežiim - + Enable search as you type Otsing sisestamise ajal - + Display verses on live tool bar Salme kuvatakse ekraani tööriistaribal - + Update service from song edit Teenistuse uuendamine laulu muutmisel - - Add missing songs when opening service - Teenistuse avamisel lisatakse puuduvad laulud + + Import missing songs from service files + Teenistuse failidest imporditakse puuduvad laulud @@ -6947,4 +7269,17 @@ Muu + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Viga CSV faili lugemisel. + + + + File not valid ZionWorx CSV format. + Fail ei ole korrektses ZionWorx CSV vormingus. + + diff -Nru openlp-1.9.9/resources/i18n/fi.ts openlp-1.9.10/resources/i18n/fi.ts --- openlp-1.9.9/resources/i18n/fi.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/fi.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert - + Show an alert message. - + Alert name singular - + Alerts name plural - + Alerts container title - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message - + Alert &text: - + &New - + &Save - + Displ&ay - + Display && Cl&ose @@ -79,7 +79,7 @@ - + &Parameter: @@ -117,32 +117,32 @@ AlertsPlugin.AlertsTab - + Font - + Font name: - + Font color: - + Background color: - + Font size: - + Alert timeout: @@ -150,550 +150,595 @@ BiblesPlugin - + &Bible - + Bible name singular - + Bibles name plural - + Bibles container title - + No Book Found - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. - + Import a Bible. - + Add a new Bible. - + Edit the selected Bible. - + Delete the selected Bible. - + Preview the selected Bible. - + Send the selected Bible live. - + Add the selected Bible to the service. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. - + &Upgrade older Bibles - + Upgrade the Bible databases to the latest format. - + Genesis - + Exodus - + Leviticus - + Numbers - + Deuteronomy - + Joshua - + Judges - + Ruth - + 1 Samuel - + 2 Samuel - + 1 Kings - + 2 Kings - + 1 Chronicles - + 2 Chronicles - + Ezra - + Nehemiah - + Esther - + Job - + Psalms - + Proverbs - + Ecclesiastes - + Song of Solomon - + Isaiah - + Jeremiah - + Lamentations - + Ezekiel - + Daniel - + Hosea - + Joel - + Amos - + Obadiah - + Jonah - + Micah - + Nahum - + Habakkuk - + Zephaniah - + Haggai - + Zechariah - + Malachi - + Matthew - + Mark - + Luke - + John - + Acts - + Romans - + 1 Corinthians - + 2 Corinthians - + Galatians - + Ephesians - + Philippians - + Colossians - + 1 Thessalonians - + 2 Thessalonians - + 1 Timothy - + 2 Timothy - + Titus - + Philemon - + Hebrews - + James - + 1 Peter - + 2 Peter - + 1 John - + 2 John - + 3 John - + Jude - + Revelation - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + + + + + Bible Exists + + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error - + Web Bible cannot be used - + Text Search is not available with Web Bibles. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. - + No Bibles Available - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -709,186 +754,178 @@ BiblesPlugin.BiblesTab - + Verse Display - + Only show new chapter numbers - + Bible theme: - + No Brackets - + ( And ) - + { And } - + [ And ] - + Note: Changes do not affect verses already in the service. - + Display second Bible verses - + Custom Scripture References - + Verse Separator: - + Range Separator: - + List Separator: - + End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + English - - Bible language + + Default Bible Language - - Application language + + Book name language in search field, +search results and on display: - - English + + Bible Language - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language BiblesPlugin.BookNameDialog - + Select Book Name - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - - - - + Current name: - + Corresponding name: - + Show Books From - + Old Testament - + New Testament - + Apocrypha + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. @@ -913,40 +950,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + + + + + Version name: + + + + + Copyright: + + + + + Permissions: + + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... - + Registering Language... - + Importing %s... Importing <book name>... - + Download Error - + 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. - + Parse Error - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. @@ -1123,17 +1229,17 @@ BiblesPlugin.LanguageDialog - + Select Language - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - + Language: @@ -1149,85 +1255,100 @@ BiblesPlugin.MediaItem - + Quick - + Find: - + Book: - + Chapter: - + Verse: - + From: - + To: - + Text Search - + Second: - + Scripture Reference - + Toggle to keep or clear the previous results. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. - + Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -1236,12 +1357,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1250,143 +1371,143 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory - + Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory - + Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. - + Backup Directory: - + There is no need to backup my Bibles - + Select Bibles - + Please select the Bibles to upgrade - + Upgrading - + Please wait while your Bibles are upgraded. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. - + Upgrading Bible %s of %s: "%s" Failed - + Upgrading Bible %s of %s: "%s" Upgrading ... - + Download Error - + To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... - + Upgrading Bible %s of %s: "%s" Complete - + , %s failed - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s - + Upgrade failed. - + You need to specify a backup directory for your Bibles. - + Starting upgrade... - + There are no Bibles that need to be upgraded. @@ -1460,12 +1581,12 @@ CustomPlugin.CustomTab - + Custom Display - + Display footer @@ -1473,42 +1594,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides - + &Title: - + Add a new slide at bottom. - + Edit the selected slide. - + Edit all the slides at once. - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -1523,12 +1644,12 @@ - + Ed&it All - + Insert Slide @@ -1536,7 +1657,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1547,60 +1668,60 @@ ImagePlugin - + <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. - + Image name singular - + Images name plural - + Images container title - + Load a new image. - + Add a new image. - + Edit the selected image. - + Delete the selected image. - + Preview the selected image. - + Send the selected image live. - + Add the selected image to the service. @@ -1608,7 +1729,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment @@ -1616,43 +1737,43 @@ ImagePlugin.MediaItem - + Select Image(s) - + You must select an image to delete. - + You must select an image to replace the background with. - + Missing Image(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? - + There was a problem replacing your background, the image file "%s" no longer exists. - + There was no display item to amend. @@ -1660,78 +1781,78 @@ ImagesPlugin.ImageTab - + Background Color - + Default Color: - - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - + Media name singular - + Media name plural - + Media container title - + Load new media. - + Add new media. - + Edit the selected media. - + Delete the selected media. - + Preview the selected media. - + Send the selected media live. - + Add the selected media to the service. @@ -1779,7 +1900,7 @@ - + Unsupported File @@ -1797,22 +1918,22 @@ MediaPlugin.MediaTab - + Available Media Players - + %s (unavailable) - + Player Order - + Allow media player to be overridden @@ -1820,7 +1941,7 @@ OpenLP - + Image Files @@ -1840,17 +1961,17 @@ OpenLP.AboutForm - + Credits - + License - + Contribute @@ -1860,17 +1981,17 @@ - + 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 @@ -1935,7 +2056,7 @@ - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -1946,7 +2067,7 @@ - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s @@ -1955,228 +2076,310 @@ OpenLP.AdvancedTab - + UI Settings - + Number of recent files to display: - + Remember active media manager tab on startup - + Double-click to send items straight to live - + Expand new service items on creation - + Enable application exit confirmation - + Mouse Cursor - + Hide mouse cursor when over display window - + Default Image - + Background color: - - Image file: + + Image file: + + + + + Open File + + + + + Advanced + + + + + Preview items when clicked in Media Manager + + + + + Click to select a color. + + + + + Browse for an image file to display. + + + + + Revert to the default OpenLP logo. + + + + + Service %Y-%m-%d %H-%M + This may not contain any of the following characters: /\?*|<>[]":+ +See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + + + + Default Service Name + + + + + Enable default service name + + + + + Date and Time: + + + + + Monday + + + + + Tuesday + + + + + Wednesday + + + + + Thurdsday + + + + + Friday + + + + + Saturday - - Open File + + Sunday - - Advanced + + Now - - Preview items when clicked in Media Manager + + Time when usual service starts. - - Click to select a color. + + Name: - - Browse for an image file to display. + + Consult the OpenLP manual for usage. - - Revert to the default OpenLP logo. + + Revert to the default service name "%s". - - Service %Y-%m-%d %H-%M - This may not contain any of the following characters: /\?*|<>[]":+ -See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + Example: - - Default Service Name + + X11 - - Enable default service name + + Bypass X11 Window Manager - - Date and Time: + + Syntax error. - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday + + Cancel - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. - + Send E-Mail - + Save to File - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) - + Attach File - + Description characters to enter : %s @@ -2184,23 +2387,23 @@ OpenLP.ExceptionForm - + Platform: %s - + Save Crash Report - + Text files (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2218,7 +2421,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2341,17 +2544,17 @@ - + Downloading %s... - + Download complete. Click the finish button to start OpenLP. - + Enabling selected plugins... @@ -2421,32 +2624,32 @@ - + Setting Up And Downloading - + Please wait while OpenLP is set up and your data is downloaded. - + Setting Up - + Click the finish button to start OpenLP. - + Download complete. Click the finish button to return to OpenLP. - + Click the finish button to return to OpenLP. @@ -2456,8 +2659,13 @@ + + Finish + + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2466,64 +2674,59 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - - - - Finish +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. OpenLP.FormattingTagDialog - + Configure Formatting Tags - + Edit Selection - + Save - + Description - + Tag - + Start tag - + End tag - + Tag Id - + Start HTML - + End HTML @@ -2531,32 +2734,32 @@ OpenLP.FormattingTagForm - + Update Error - + Tag "n" already defined. - + New Tag - + <HTML here> - + </and here> - + Tag %s already defined. @@ -2564,82 +2767,82 @@ OpenLP.FormattingTags - + Red - + Black - + Blue - + Yellow - + Green - + Pink - + Orange - + Purple - + White - + Superscript - + Subscript - + Paragraph - + Bold - + Italics - + Underline - + Break @@ -2647,180 +2850,170 @@ OpenLP.GeneralTab - + General - + Monitors - + Select monitor for output display: - + Display if a single screen - + Application Startup - + Show blank screen warning - + Automatically open the last service - + Show the splash screen - + Application Settings - + Prompt to save before starting a new service - + Automatically preview next item in service - + sec - + CCLI Details - + SongSelect username: - + SongSelect password: - + X - + Y - + Height - + Width - + Check for updates to OpenLP - + Unblank display when adding new live item - + Timed slide interval: - + Background Audio - + Start background audio paused - + Service Item Slide Limits - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide + + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item + + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide - - Override display position: + + &Wrap around - - Repeat track list + + &Move to next/previous service item OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -2836,438 +3029,438 @@ OpenLP.MainWindow - + &File - + &Import - + &Export - + &View - + M&ode - + &Tools - + &Settings - + &Language - + &Help - + Media Manager - + Service Manager - + Theme Manager - + &New - + &Open - + Open an existing service. - + &Save - + Save the current service to disk. - + Save &As... - + Save Service As - + Save the current service under a new name. - + E&xit - + Quit OpenLP - + &Theme - + &Configure OpenLP... - + &Media Manager - + Toggle Media Manager - + Toggle the visibility of the media manager. - + &Theme Manager - + Toggle Theme Manager - + Toggle the visibility of the theme manager. - + &Service Manager - + Toggle Service Manager - + Toggle the visibility of the service manager. - + &Preview Panel - + Toggle Preview Panel - + Toggle the visibility of the preview panel. - + &Live Panel - + Toggle Live Panel - + Toggle the visibility of the live panel. - + &Plugin List - + List the Plugins - + &User Guide - + &About - + More information about OpenLP - + &Online Help - + &Web Site - + Use the system language, if available. - + Set the interface language to %s - + Add &Tool... - + Add an application to the list of tools. - + &Default - + Set the view mode back to the default. - + &Setup - + Set the view mode to Setup. - + &Live - + 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/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s - + English Please add the name of your language here - + Configure &Shortcuts... - + Close OpenLP - + Are you sure you want to close OpenLP? - + Open &Data Folder... - + Open the folder where songs, bibles and other data resides. - + &Autodetect - + Update Theme Images - + Update the preview images for all themes. - + Print the current service. - + &Recent Files - + L&ock Panels - + Prevent the panels being moved. - + Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files - + Clear the list of recent files. - + Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file - + Settings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3276,52 +3469,57 @@ - + Open File - + OpenLP Export Settings Files (*.conf) - + Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File - + OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s - + OpenLP cannot load your database. Database: %s @@ -3331,73 +3529,73 @@ OpenLP.MediaManagerItem - + No Items Selected - + &Add to selected Service Item - + You must select one or more items to preview. - + You must select one or more items to send live. - + You must select one or more items. - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. - + You must select one or more items to add. - + No Search Results - + Invalid File Type - + Invalid File %s. Suffix not supported - + &Clone - + Duplicate files were found on import and were ignored. @@ -3405,12 +3603,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <verse> tag is missing. @@ -3418,27 +3616,27 @@ OpenLP.PluginForm - + Plugin List - + Plugin Details - + Status: - + Active - + Inactive @@ -3461,12 +3659,12 @@ OpenLP.PrintServiceDialog - + Fit Page - + Fit Width @@ -3474,7 +3672,7 @@ OpenLP.PrintServiceForm - + Options @@ -3489,47 +3687,47 @@ - + Zoom In - + Zoom Out - + Zoom Original - + Other Options - + Include slide text if available - + Include service item notes - + Include play length of media items - + Add page break before each text item - + Service Sheet @@ -3539,12 +3737,12 @@ - + Title: - + Custom Footer Text: @@ -3552,12 +3750,12 @@ OpenLP.ScreenList - + Screen - + primary @@ -3565,12 +3763,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s - + <strong>Length</strong>: %s @@ -3578,7 +3776,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item @@ -3586,82 +3784,82 @@ OpenLP.ServiceManager - + Move to &top - + Move item to the top of the service. - + Move &up - + Move item up one position in the service. - + Move &down - + Move item down one position in the service. - + Move to &bottom - + Move item to the end of the service. - + &Delete From Service - + Delete the selected item from the service. - + &Add New Item - + &Add to Selected Item - + &Edit Item - + &Reorder Item - + &Notes - + &Change Item Theme @@ -3682,112 +3880,107 @@ - + 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 - + &Expand all - + Expand all the service items. - + &Collapse all - + Collapse all the service items. - + Open File - + Moves the selection down the window. - + Move up - + Moves the selection up the window. - + Go Live - + Send the selected item to Live. - + &Start Time - - Show &Preview - - - - Show &Live + Show &Preview - + Modified Service - + The current service has been modified. Would you like to save this service? - + Custom Service Notes: - + Notes: - + Playing time: - + Untitled Service @@ -3812,17 +4005,17 @@ - + Load an existing service. - + Save this service. - + Select a theme for the service. @@ -3832,7 +4025,7 @@ - + Service File Missing @@ -3856,11 +4049,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes @@ -3876,67 +4079,67 @@ OpenLP.ShortcutListDialog - + Action - + Shortcut - + Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default - + Custom - + Capture shortcut. - + Restore the default shortcut of this action. - + Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts @@ -3944,177 +4147,172 @@ OpenLP.SlideController - + Hide - + Go To - + Blank Screen - + Blank to Theme - + Show Desktop - + Previous Service - + Next Service - + Escape Item - + Move to previous. - + Move to next. - + Play Slides - + Delay between slides in seconds. - + Move to live. - + Add to Service. - + Edit and reload song preview. - + Start playing media. - + Pause audio. - + Pause playing media. - + Stop playing media. - + Video position. - + Audio Volume. - + Go to "Verse" - + Go to "Chorus" - + Go to "Bridge" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" - + Previous Slide - + Next Slide - + Pause Audio - + Background Audio - - Next Track - - - - + Go to next audio track. - + Tracks @@ -4190,17 +4388,17 @@ - + Theme Layout - + The blue box shows the main area. - + The red box shows the footer. @@ -4208,32 +4406,32 @@ OpenLP.ThemeForm - + Select Image - + Theme Name Missing - + There is no name for this theme. Please enter one. - + Theme Name Invalid - + Invalid theme name. Please enter one. - + (approximately %d lines per slide) @@ -4241,193 +4439,193 @@ OpenLP.ThemeManager - + Create a new theme. - + Edit Theme - + Edit a theme. - + Delete Theme - + Delete a theme. - + Import Theme - + Import a theme. - + Export Theme - + Export a theme. - + &Edit Theme - + &Delete Theme - + Set As &Global Default - + %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. - + &Copy Theme - + &Rename Theme - + &Export Theme - + 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) - + Copy of %s Copy of <theme name> - + Theme Already Exists @@ -4435,272 +4633,272 @@ OpenLP.ThemeWizard - + Theme Wizard - + Welcome to the Theme Wizard - + Set Up Background - + Set up your theme's background according to the parameters below. - + Background type: - + Solid Color - + Gradient - + Color: - + Gradient: - + Horizontal - + Vertical - + Circular - + Top Left - Bottom Right - + Bottom Left - Top Right - + Main Area Font Details - + Define the font and display characteristics for the Display text - + Font: - + Size: - + Line Spacing: - + &Outline: - + &Shadow: - + Bold - + Italic - + Footer Area Font Details - + Define the font and display characteristics for the Footer text - + Text Formatting Details - + Allows additional display formatting information to be defined - + Horizontal Align: - + Left - + Right - + Center - + Output Area Locations - + Allows you to change and move the main and footer areas. - + &Main Area - + &Use default location - + X position: - + px - + Y position: - + Width: - + Height: - + Use default location - + Save and Preview - + View the theme and save it replacing the current one or change the name to create a new theme - + Theme name: - + Edit Theme - %s - + 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: - + &Footer Area - + Starting color: - + Ending color: - + Background color: - + Justify - + Layout Preview - + Transparent @@ -4708,47 +4906,47 @@ OpenLP.ThemesTab - + Global Theme - + Theme Level - + S&ong Level - + 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 - + 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. - + &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. - + Themes @@ -4832,239 +5030,239 @@ - + Image - + Import - + Live - + Live Background Error - + 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 - + Preview - + Replace Background - + Reset 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 - + Theme Singular - + Themes Plural - + Top - + Version - + Delete the selected item. - + Move selection up one position. - + Move selection down one position. - + &Vertical Align: - + Finished import. - + Format: - + Importing - + Importing "%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. - + Open %s File - + %p% - + Ready. - + Starting import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong @@ -5080,7 +5278,7 @@ - + Welcome to the Song Import Wizard @@ -5168,53 +5366,53 @@ - + Layout style: - + Live Toolbar - + m The abbreviated unit for minutes - + OpenLP is already running. Do you wish to continue? - + Settings - + Tools - + Unsupported File - + Verse Per Slide - + Verse Per Line - + View @@ -5229,42 +5427,37 @@ - + View Mode - + Open service. - + Print Service - + Replace live background. - + Reset live background. - - &Split - - - - + Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard @@ -5274,53 +5467,105 @@ - + Play Slides in Loop - + Play Slides to End - + Stop Play Slides in Loop - + Stop Play Slides to End - + Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1, and %2 Locale list separator: end - + %1, %2 Locale list separator: middle - + %1, %2 Locale list separator: start @@ -5329,50 +5574,50 @@ PresentationPlugin - + <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. - + Presentation name singular - + Presentations name plural - + Presentations container title - + Load a new presentation. - + Delete the selected presentation. - + Preview the selected presentation. - + Send the selected presentation live. - + Add the selected presentation to the service. @@ -5380,70 +5625,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) - + Automatic - + Present using: - + File Exists - + A presentation with that filename already exists. - + This type of presentation is not supported. - + Presentations (%s) - + Missing Presentation - - The Presentation %s no longer exists. + + The presentation %s is incomplete, please reload. - - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers - + %s (unavailable) - + Allow presentation application to be overridden @@ -5477,135 +5722,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote - + OpenLP 2.0 Stage View - + Service Manager - + Slide Controller - - Alerts - - - - Search + Alerts - Back + Search - + Refresh - + Blank - + Show - + Prev - + Next - + Text - + Show Alert - + Go Live - + No Results - + Options - + Add to Service + + + Home + + + + + Theme + + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: - + Port number: - + Server Settings - + Remote URL: - + Stage view URL: - + Display stage time in 12h format - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5613,85 +5873,85 @@ SongUsagePlugin - + &Song Usage Tracking - + &Delete Tracking Data - + Delete song usage data up to a specified date. - + &Extract Tracking Data - + Generate a report on song usage. - + Toggle Tracking - + Toggle the tracking of song usage. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - + SongUsage name singular - + SongUsage name plural - + SongUsage container title - + Song Usage - + Song usage tracking is active. - + Song usage tracking is inactive. - + display - + printed @@ -5699,7 +5959,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data @@ -5724,7 +5984,7 @@ - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5732,54 +5992,54 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction - + Select Date Range - + to - + Report Location - + Output File Location - + usage_detail_%s_%s.txt - + Report Creation - + Report %s has been successfully created. - + Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5817,107 +6077,107 @@ - + Arabic (CP-1256) - + Baltic (CP-1257) - + Central European (CP-1250) - + Cyrillic (CP-1251) - + Greek (CP-1253) - + Hebrew (CP-1255) - + Japanese (CP-932) - + Korean (CP-949) - + Simplified Chinese (CP-936) - + Thai (CP-874) - + Traditional Chinese (CP-950) - + Turkish (CP-1254) - + Vietnam (CP-1258) - + Western European (CP-1252) - + Character Encoding - + 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. - + Song name singular - + Songs name plural - + Songs container title @@ -5928,32 +6188,32 @@ - + 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. @@ -5981,17 +6241,17 @@ - + You need to type in the first name of the author. - + You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? @@ -6020,209 +6280,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor - + &Title: - + Alt&ernate title: - + &Lyrics: - + &Verse order: - + Ed&it All - + Title && Lyrics - + &Add to Song - + &Remove - + &Manage Authors, Topics, Song Books - + A&dd to Song - + R&emove - + Book: - + Number: - + Authors, Topics && Song Book - + New &Theme - + Copyright Information - + Comments - + Theme, Copyright Info && Comments - + Add Author - + This author does not exist, do you want to add them? - + This author is already in the list. - + 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. - + Add Topic - + This topic does not exist, do you want to add it? - + This topic is already in the list. - + 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. - + You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book - + This song book does not exist, do you want to add it? - + You need to have an author for this song. - + You need to type some text in to the verse. - + Linked Audio - + Add &File(s) - + Add &Media - + Remove &All - + Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6336,130 +6609,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files - + 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. - + Generic Document/Presentation - - Filename: - - - - - 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. - - - - + Add Files... - + Remove File(s) - + Please wait while your songs are imported. - + OpenLP 2.0 Databases - + openlp.org v1.x Databases - + Words Of Worship Song Files - - You need to specify at least one document or presentation file to import from. - - - - + Songs Of Fellowship Song Files - + SongBeamer Files - + SongShow Plus Song Files - + Foilpresenter Song Files - + Copy - + Save to File - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. @@ -6467,27 +6760,27 @@ SongsPlugin.MediaItem - + Titles - + Lyrics - + CCLI License: - + Entire Song - + Are you sure you want to delete the %n selected song(s)? @@ -6495,16 +6788,41 @@ - + Maintain the lists of authors, topics and books. - + copy For song cloning + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6531,6 +6849,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6569,12 +6900,12 @@ SongsPlugin.SongImport - + copyright - + The following songs could not be imported: @@ -6595,117 +6926,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. - + This author already exists. - + Could not add your topic. - + This topic already exists. - + Could not add your book. - + This book already exists. - + Could not save your changes. - + Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. - + Delete Author - + Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic - + Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book - + Are you sure you want to delete the selected book? - + 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? - + 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? @@ -6713,28 +7036,28 @@ SongsPlugin.SongsTab - + Songs Mode - + Enable search as you type - + Display verses on live tool bar - + Update service from song edit - - Add missing songs when opening service + + Import missing songs from service files @@ -6794,4 +7117,17 @@ + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/fr.ts openlp-1.9.10/resources/i18n/fr.ts --- openlp-1.9.9/resources/i18n/fr.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/fr.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Alerte - + Show an alert message. Affiche un message d'alerte. - + Alert name singular Alerte - + Alerts name plural Alertes - + Alerts container title Alertes - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Module d'alerte</strong><br />Le module d'alerte permet d'envoyer des messages d'alertes de la pouponnière sur l'écran du direct. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Message d'alerte - + Alert &text: &Texte d'Alerte : - + &New &Nouveau - + &Save &Enregistre - + Displ&ay A&ffiche - + Display && Cl&ose &Affiche && Ferme @@ -79,7 +79,7 @@ Vous n'avez pas spécifié de texte pour votre alerte. Veuillez entrer votre message puis cliquer sur Nouveau. - + &Parameter: &Paramètre : @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Police - + Font name: Nom de la police : - + Font color: Couleur de la police : - + Background color: Couleur de fond : - + Font size: Taille de la police : - + Alert timeout: Temps d'alerte : @@ -152,551 +152,596 @@ BiblesPlugin - + &Bible &Bible - + Bible name singular Bible - + Bibles name plural Bibles - + Bibles container title Bibles - + No Book Found Aucun livre trouvé - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Aucun livre correspondant n'a été trouvé dans cette Bible. Vérifiez que vous avez correctement écrit le nom du livre. - + Import a Bible. Importe une Bible. - + Add a new Bible. Ajoute une nouvelle Bible. - + Edit the selected Bible. Édite la bible sélectionnée. - + Delete the selected Bible. Supprime la Bible sélectionnée. - + Preview the selected Bible. Prévisualise la Bible sélectionnée. - + Send the selected Bible live. Envoie la Bible sélectionnée au direct. - + Add the selected Bible to the service. Ajoute la Bible sélectionnée au service. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Module Bible</strong><br />Le Module Bible permet d'afficher des versets bibliques de différentes sources pendant le service. - + &Upgrade older Bibles Mettre à &jour les anciennes Bibles - + Upgrade the Bible databases to the latest format. Mettre à jour les bases de données de Bible au nouveau format. - + Genesis - + Genèse - + Exodus - + Exode - + Leviticus - + Lévitique - + Numbers - + Nombres - + Deuteronomy - + Deutéronome - + Joshua - + Josué - + Judges - + Juges - + Ruth - + Ruth - + 1 Samuel - + 1 Samuel - + 2 Samuel - + 2 Samuel - + 1 Kings - + 1 Rois - + 2 Kings - + 2 Rois - + 1 Chronicles - + 1 Chroniques - + 2 Chronicles - + 2 Chroniques - + Ezra - + Esdras - + Nehemiah - + Néhémie - + Esther - + Esther - + Job - + Job - + Psalms - + Psaumes - + Proverbs - + Proverbes - + Ecclesiastes - + Ecclésiaste - + Song of Solomon - + Cantique - + Isaiah - + Esaïe - + Jeremiah - + Jérémie - + Lamentations - + Lamentations - + Ezekiel - + Ezéchiel - + Daniel - + Daniel - + Hosea - + Osée - + Joel - + Joël - + Amos - + Amos - + Obadiah - + Abdias - + Jonah - + Jonas - + Micah - + Michée - + Nahum - + Nahum - + Habakkuk - + Habacuc - + Zephaniah - + Sophonie - + Haggai - + Aggée - + Zechariah - + Zacharie - + Malachi - + Malachie - + Matthew - + Matthieu - + Mark - + Marc - + Luke - + Luc - + John - + Jean - + Acts - + Actes - + Romans - + Romains - + 1 Corinthians - + 1 Corinthiens - + 2 Corinthians - + 2 Corinthiens - + Galatians - + Galates - + Ephesians - + Ephésiens - + Philippians - + Philippiens - + Colossians - + Colossiens - + 1 Thessalonians - + 1 Thessaloniciens - + 2 Thessalonians - + 2 Thessaloniciens - + 1 Timothy - + 1 Timothée - + 2 Timothy - + 2 Timothée - + Titus - + Tite - + Philemon - + Philémon - + Hebrews - + Hébreux - + James - + Jacques - + 1 Peter - + 1 Pierre - + 2 Peter - + 2 Pierre - + 1 John - + 1 Jean - + 2 John - + 2 Jean - + 3 John - + 3 Jean - + Jude - + Jude - + Revelation - + Apocalypse - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + :|v|V|verset|versets;;-|à;;,|et;;fin + + + + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Vous devez spécifier le nom de la version de votre Bible. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Vous devez définir un copyright pour votre Bible. Les Bibles dans le Domaine Publique doivent être indiquées comme telle. + + + + Bible Exists + Bible existante + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Cette Bible existe déjà. Veuillez importer une autre Bible ou supprimer la Bible existante. + + + + You need to specify a book name for "%s". + Vous devez spécifier un nom de livre pour "%s". + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + Duplicate Book Name + Dupliquer le nom du livre + + + + The Book Name "%s" has been entered more than once. + Le nom du livre "%s" a été entré plus d'une fois. + BiblesPlugin.BibleManager - + Scripture Reference Error Écriture de référence erronée - + Web Bible cannot be used Les Bible Web ne peut être utilisée - + Text Search is not available with Web Bibles. La recherche textuelle n'est pas disponible avec les Bibles Web. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Vous n'avez pas spécifié de mot clé de recherche. Vous pouvez séparer vos mots clés par un espace afin de tous les rechercher ou les séparer par une virgule afin de rechercher l'un d'entre eux. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Il n'y a pas de Bibles actuellement installée. Veuillez utiliser l'assistant d'importation pour installer une ou plusieurs Bibles. - + No Bibles Available Aucune Bible disponible - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -706,193 +751,200 @@ Book Chapter%(verse)sVerse%(range)sVerse%(list)sChapter%(verse)sVerse%(range)sVerse Book Chapter%(verse)sVerse%(range)sChapter%(verse)sVerse Please pay attention to the appended "s" of the wildcards and refrain from translating the words inside the names in the brackets. - + Votre référence biblique n'est pas supportée par OpenLP ou est invalide. Veuillez vous assurer que votre référence est conforme à l'un des motifs ci-dessous ou consultez le manuel d'utilisation :⏎ +⏎ +Livre Chapitre⏎ +Livre Chapitre%(range)sChapitre⏎ +Livre Chapitre%(verse)sVerset%(range)sVerset⏎ +Livre Chapitre%(verse)sVerset%(range)sVerset%(list)sVerset%(range)sVerset⏎ +Livre Chapitre%(verse)sVerset%(range)sVerset%(list)sChapitre%(verse)sVerset%(range)sVerset⏎ +Livre Chapitre%(verse)sVerset%(range)sChapitre%(verse)sVerset BiblesPlugin.BiblesTab - + Verse Display Affichage de versets - + Only show new chapter numbers Affiche uniquement les nouveaux numéros de chapitre - + Bible theme: Thème : - + No Brackets Pas de parenthèses - + ( And ) ( et ) - + { And } { et } - + [ And ] [ et ] - + Note: Changes do not affect verses already in the service. Remarque : Les modifications ne s'appliquent pas aux versets déjà dans le service. - + Display second Bible verses Affiche les versets de la seconde Bible - + Custom Scripture References - + Références bibliques personnalisées - + Verse Separator: - + Séparateur de verset : - + Range Separator: - + Séparateur d'intervalle : - + List Separator: - + Séparateur de liste : - + End Mark: - + Marque de fin : - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Plusieurs séparateurs de versets peuvent être définis.⏎ +Ils doivent être séparés par la barre verticale "|".⏎ +Veuillez supprimer cette ligne pour utiliser la valeur par défaut. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Plusieurs séparateurs d'intervalles peuvent être définis.⏎ +Ils doivent être séparés par la barre verticale "|".⏎ +Veuillez supprimer cette ligne pour utiliser la valeur par défaut. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Plusieurs séparateurs de listes peuvent être définis.⏎ +Ils doivent être séparés par la barre verticale "|".⏎ +Veuillez supprimer cette ligne pour utiliser la valeur par défaut. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - - - - Preferred Bookname Language - + Plusieurs séparateurs de marque de fin peuvent être définis.⏎ +Ils doivent être séparés par la barre verticale "|".⏎ +Veuillez supprimer cette ligne pour utiliser la valeur par défaut. - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - + + English + Anglais - - Bible language - + + Default Bible Language + Langue par défaut de la bible - - Application language + + Book name language in search field, +search results and on display: - - English - Français + + Bible Language + Langue de la bible - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - + + Application Language + Langue de l'application BiblesPlugin.BookNameDialog - + Select Book Name Sélectionne le nom du livre - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Le nom du livre suivant n'a pas de correspondance interne. Veuillez sélectionner le nom anglais correspondant dans la liste. - - - + Current name: Nom courant : - + Corresponding name: Nom correspondant : - + Show Books From Affiche le formulaire des livres - + Old Testament Ancien testament - + New Testament Nouveau testament - + Apocrypha Apocryphes + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. Vous devez sélectionner un livre. @@ -917,40 +969,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Éditeur de bible + + + + License Details + Détails de la licence + + + + Version name: + Nom de la version : + + + + Copyright: + Droits d'auteur : + + + + Permissions: + Autorisations : + + + + Default Bible Language + Langue de la bible par défaut + + + + Book name language in search field, search results and on display: + + + + + Global Settings + Paramètres généraux + + + + Bible Language + Langue de la bible + + + + Application Language + Langue de l'application + + + + English + Anglais + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Enregistrement de la Bible et chargement des livres... - + Registering Language... Enregistrement des langues... - + Importing %s... Importing <book name>... Importation %s... - + Download Error Erreur de téléchargement - + 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. Un problème de téléchargement de votre sélection de verset a été rencontré. Vérifiez votre connexion Internet et si cette erreur persiste merci de signaler ce dysfonctionnement. - + Parse Error Erreur syntaxique - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Un problème a été rencontré durant l'extraction de votre sélection de verset. Si cette erreur persiste merci de signaler ce dysfonctionnement. @@ -1128,17 +1249,17 @@ BiblesPlugin.LanguageDialog - + Select Language Sélectionne la langue - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP ne peut déterminer la langue de cette traduction de la Bible. Veillez sélectionner la langue dans la liste suivante. - + Language: Langue : @@ -1154,85 +1275,100 @@ BiblesPlugin.MediaItem - + Quick Rapide - + Find: Recherche : - + Book: Livre : - + Chapter: Chapitre : - + Verse: Verset : - + From: De : - + To: A : - + Text Search Recherche de texte - + Second: Deuxième : - + Scripture Reference Référence biblique - + Toggle to keep or clear the previous results. Cocher pour garder ou effacer le résultat précédent. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Vous ne pouvez pas combiner les résultats de recherche pour les versets bibliques simples et doubles. Voulez-vous effacer les résultats et effectuer une nouvelle recherche ? - + Bible not fully loaded. Bible partiellement chargée. - + Information Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. La seconde Bible ne contient pas tous les versets présents dans la Bible principale. Seulement les versets trouvés dans les deux Bibles seront affichés. %d versets n'ont pas été inclus dans les résultats. + + + Search Scripture Reference... + Recherche de référence biblique... + + + + Search Text... + Recherche dans le texte... + + + + Are you sure you want to delete "%s"? + Etes-vous sur de vouloir supprimer "%s" ? + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importation %s %s... @@ -1241,12 +1377,12 @@ 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>... Importation %s %s... @@ -1255,149 +1391,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Sélectionner un répertoire de sauvegarde - + Bible Upgrade Wizard Assistant de mise a jours des Bibles - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Cet assistant vous permet de mettre à jour vos Bibles de version antérieures à OpenLP 2. Cliquer sur le bouton suivant ci-dessous afin de commencer le processus de mise a jour. - + Select Backup Directory Sélectionner un répertoire de sauvegarde - + Please select a backup directory for your Bibles Veuillez sélectionner un répertoire de sauvegarde pour vos Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Les versions précédentes d'OpenLP 2.0 ne sont pas capables d'utiliser les Bibles mises à jour. Une sauvegarde de vos Bibles va être effectuée de sorte que vous puissiez simplement copier ces fichiers vers votre répertoire de données d'OpenLP si vous avez besoin de revenir à une version précédente de OpenLP. La procédure de restauration des fichiers est disponible dans notre <a href="http://wiki.openlp.org/faq">Foire aux questions</ a>. - + Please select a backup location for your Bibles. Veuillez sélectionner un répertoire de sauvegarde pour vos Bibles. - + Backup Directory: Répertoire de sauvegarde : - + There is no need to backup my Bibles Il n'est pas nécessaire de sauvegarder mes Bibles - + Select Bibles Sélectionne des Bibles - + Please select the Bibles to upgrade Veuillez sélectionner les Bibles à mettre à jour - + Upgrading Mise à jour - + Please wait while your Bibles are upgraded. Merci de patienter durant la mise à jour de vos Bibles. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. La sauvegarde à échouée. Pour sauvegarder vos Bibles vous devez disposer des droits en écriture sur le répertoire donné. - + Upgrading Bible %s of %s: "%s" Failed Mise à jour de la Bible %s sur %s : "%s" Échouée - + Upgrading Bible %s of %s: "%s" Upgrading ... Mise a jour de la Bible %s sur %s : "%s" Mise à jour ... - + Download Error Erreur de téléchargement - + To upgrade your Web Bibles an Internet connection is required. Pour mettre à jour vos Bibles Web, une connexion à Internet est nécessaire. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Mise a jour de la Bible %s sur %s : "%s" Mise à jour %s ... - + Upgrading Bible %s of %s: "%s" Complete Mise a jour de la Bible %s sur %s : "%s" Terminée - + , %s failed , %s échouée - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Mise a jour de(s) (la) Bible(s) : %s avec succès%s Veuillez noter que les versets des Bibles Web seront téléchargés à la demande, par conséquent une connexion Internet sera nécessaire. - + Upgrading Bible(s): %s successful%s Mise à jour de(s) (la) Bible(s) : %s avec succès%s - + Upgrade failed. La mise à jour a échouée. - + You need to specify a backup directory for your Bibles. Vous devez spécifier un répertoire de sauvegarde pour vos Bibles. - + Starting upgrade... Démarrage de la mise à jour... - + There are no Bibles that need to be upgraded. Il n'y a pas de Bibles à mettre à jour. @@ -1471,12 +1607,12 @@ CustomPlugin.CustomTab - + Custom Display Affichage Personnalisé - + Display footer Afficher le pied de page @@ -1484,42 +1620,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Édite les diapositives personnalisées - + &Title: &Titre : - + Add a new slide at bottom. Ajoute une nouvelle diapositive en bas. - + Edit the selected slide. Édite la diapositive sélectionnée. - + Edit all the slides at once. Édite toutes les diapositives en une. - + Split a slide into two by inserting a slide splitter. Sépare la diapositive en deux en insérant un séparateur de diapositive. - + The&me: Thè&me : - + &Credits: &Crédits : @@ -1534,12 +1670,12 @@ Vous devez ajouter au moins une diapositive - + Ed&it All Édite &tous - + Insert Slide Insère une diapositive @@ -1547,71 +1683,71 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? - - - + + Etes-vous sur de vouloir supprimer la %n diapositive personnalisée ? + Etes-vous sur de vouloir supprimer les %n diapositives personnalisées ? ImagePlugin - + <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>Module Image</strong><br />Le module Image permet l'affichage d'images.<br />L'une des particularités de ce module est la possibilité de regrouper plusieurs images en un seul élément dans le gestionnaire de services, ce qui facilite son affichage. Ce module permet également de faire défiler les images en boucle avec une pause entre chacune d'elles. Les images du module peuvent également être utilisées pour remplacer l'arrière-plan du thème en cours. - + Image name singular Image - + Images name plural Images - + Images container title Images - + Load a new image. Charge une nouvelle image. - + Add a new image. Ajoute une nouvelle image. - + Edit the selected image. Édite l'image sélectionnée. - + Delete the selected image. Supprime l'image sélectionnée. - + Preview the selected image. Prévisualise l'image sélectionnée. - + Send the selected image live. Envoie l'image sélectionnée au direct. - + Add the selected image to the service. Ajoute l'image sélectionnée au service. @@ -1619,7 +1755,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Sélectionne un objet @@ -1627,44 +1763,44 @@ ImagePlugin.MediaItem - + Select Image(s) Sélectionne une (des) Image(s) - + You must select an image to delete. Vous devez sélectionner une image à supprimer. - + You must select an image to replace the background with. Vous devez sélectionner une image pour remplacer le fond. - + Missing Image(s) Image(s) manquante - + The following image(s) no longer exist: %s L(es) image(s) suivante(s) n'existe(nt) plus : %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? L(es) image(s) suivante(s) n'existe(nt) plus : %s Voulez-vous ajouter les autres images malgré tout ? - + There was a problem replacing your background, the image file "%s" no longer exists. Impossible de remplacer votre fond, le fichier image "%s" n'existe plus. - + There was no display item to amend. Il n'y a aucun élément d'affichage à modifier. @@ -1672,78 +1808,78 @@ ImagesPlugin.ImageTab - + Background Color Couleur de fond - + Default Color: Couleur par défaut : - - Provides border where image is not the correct dimensions for the screen when resized. - Ajoute des bordures si l'image n'a pas le même ratio que l'écran d'affichage. + + Visible background for images with aspect ratio different to screen. + Fond d'écran visible pour les images avec un ratio différent de celui de l'écran. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Module Média</strong><br />Le module Média permet de lire des fichiers audio et vidéo. - + Media name singular Médias - + Media name plural Médias - + Media container title Média - + Load new media. Charge un nouveau média. - + Add new media. Ajoute un nouveau média. - + Edit the selected media. Édite le média sélectionné. - + Delete the selected media. Supprime le média sélectionné. - + Preview the selected media. Prévisualise le média sélectionné. - + Send the selected media live. Envoie le média sélectionné au direct. - + Add the selected media to the service. Ajoute le média sélectionné au service. @@ -1791,7 +1927,7 @@ Il n'y a aucun élément d'affichage à modifier. - + Unsupported File Fichier non supporté @@ -1809,30 +1945,30 @@ MediaPlugin.MediaTab - + Available Media Players Lecteurs de Média disponibles - + %s (unavailable) %s (non disponible) - + Player Order Ordre des lecteurs - + Allow media player to be overridden - + Autoriser le lecteur de média à être surcharger OpenLP - + Image Files Fichiers image @@ -1854,17 +1990,17 @@ OpenLP.AboutForm - + Credits Crédits - + License Licence - + Contribute Contribuer @@ -1874,17 +2010,17 @@ révision %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. Ce programme est un logiciel libre ; vous pouvez le redistribuer et/ou le modifier dans les termes de la licence GNU General Public License tel que publié par la Free Software Foundation ; version 2 de la licence. - + 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. Ce programme est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE, sans même la garantie implicite de COMMERCIALISATION ou D'ADAPTATION A UN USAGE PARTICULIER. Voir ci-dessous pour plus de détails. - + Project Lead %s @@ -2009,7 +2145,7 @@ gratuitement, car Il nous a libérés. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2026,238 +2162,321 @@ OpenLP est écrit et maintenu par des bénévoles. Si vous souhaitez voir plus de logiciels libres chrétien se développer, pensez à apporter votre contribution à l'aide du bouton ci-dessous. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s - + Copyright © 2004-2012 %s⏎ +Portions copyright © 2004-2012 %s OpenLP.AdvancedTab - + UI Settings Propriétés de l'interface utilisateur - + Number of recent files to display: Nombre de fichiers récents à afficher : - + Remember active media manager tab on startup Se souvenir de l'onglet actif du gestionnaire de média au démarrage - + Double-click to send items straight to live Double-cliquer pour envoyer les éléments directement au live - + Expand new service items on creation Étends les nouveaux éléments du service à la création - + Enable application exit confirmation Demande une confirmation avant de quitter l'application - + Mouse Cursor Curseur de la souris - + Hide mouse cursor when over display window Cache le curseur de la souris quand elle se trouve sur l'écran live - + Default Image Image par défaut - + Background color: Couleur de fond : - + Image file: Fichier image : - + Open File Ouvre un fichier - + Advanced Avancé - + Preview items when clicked in Media Manager Prévisualise l’élément cliqué du gestionnaire de média - + Click to select a color. Clique pour sélectionner une couleur. - + Browse for an image file to display. Parcoure pour trouver une image à afficher. - + Revert to the default OpenLP logo. Retour au logo OpenLP par défaut. - - Service %Y-%m-%d %H-%M - This may not contain any of the following characters: /\?*|<>[]":+ -See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. - + + Service %Y-%m-%d %H-%M + This may not contain any of the following characters: /\?*|<>[]":+ +See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + Service %Y-%m-%d %H-%M + + + + Default Service Name + Nom de service par défaut + + + + Enable default service name + Activer le nom de service par défaut + + + + Date and Time: + Date et Heure : + + + + Monday + Lundi + + + + Tuesday + Mardi + + + + Wednesday + Mercredi + + + + Thurdsday + Jeudi + + + + Friday + Vendredi + + + + Saturday + Samedi + + + + Sunday + Dimanche + + + + Now + Maintenant + + + + Time when usual service starts. + Heure de début du service habituelle. + + + + Name: + Nom : + + + + Consult the OpenLP manual for usage. + Veuillez consulter le manuel d'OpenLP. + + + + Revert to the default service name "%s". + Restaurer le nom du service par défaut "%s". + + + + Example: + Exemple : - - Default Service Name - + + X11 + X11 - - Enable default service name - + + Bypass X11 Window Manager + Contourner le gestionnaire de fenêtres X11 - - Date and Time: - + + Syntax error. + Erreur de syntaxe. - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday - + + Cancel + Annuler - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred Erreur survenue - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Oups! OpenLP a rencontré un problème, et ne peut pas continuer à s'exécuter. Le texte dans le champ ci-dessous contient des informations qui pourraient être utiles aux développeurs d'OpenLP, veuillez s'il vous plaît envoyer un courriel à bugs@openlp.org, avec une description détaillée de ce que vous faisiez lorsque le problème est survenu. - + Send E-Mail Envoyer un courriel - + Save to File Enregistre dans un fichier - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Veuillez entrer une description de ce que vous faisiez au moment de l'erreur (Minimum 20 caractères) - + Attach File Attacher un fichier - + Description characters to enter : %s Description : %s @@ -2265,24 +2484,24 @@ OpenLP.ExceptionForm - + Platform: %s Plateforme : %s - + Save Crash Report Enregistre le rapport d'erreur - + Text files (*.txt *.log *.text) Fichiers texte (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2313,7 +2532,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2449,17 +2668,17 @@ Paramètres par défaut - + Downloading %s... Téléchargement %s... - + Download complete. Click the finish button to start OpenLP. Téléchargement terminé. Cliquez sur le bouton terminer pour démarrer OpenLP. - + Enabling selected plugins... Active les modules sélectionnés... @@ -2529,32 +2748,32 @@ Cet assistant vous permet de configurer OpenLP pour sa première utilisation. Cliquez sur le bouton suivant pour démarrer. - + Setting Up And Downloading Paramétrage et téléchargement - + Please wait while OpenLP is set up and your data is downloaded. Merci de patienter durant le paramétrage d'OpenLP et le téléchargement de vos données. - + Setting Up Paramétrage - + Click the finish button to start OpenLP. Cliquez sur le bouton terminer pour démarrer OpenLP. - + Download complete. Click the finish button to return to OpenLP. Téléchargement terminé. Cliquez sur le bouton terminer pour revenir à OpenLP. - + Click the finish button to return to OpenLP. Cliquez sur le bouton terminer pour revenir à OpenLP. @@ -2564,78 +2783,74 @@ Diapositives personnalisées + + Finish + Terminé + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Aucune connexion Internet n'a été trouvée. L'assistant de démarrage a besoin d'une connexion Internet pour pouvoir télécharger les chants d'exemple, les Bibles et les thèmes. Cliquez sur le bouton terminer pour démarrer OpenLP avec les paramètres initiaux sans données d'exemples. - -Pour démarrer à nouveau l'assistant de démarrage et importer les données d'exemples, vérifiez votre connexion Internet et redémarrer cet assistant en sélectionnant "Outils/Redémarrer l'assistant de démarrage". + -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - -Pour annuler l'assistant de démarrage complètement (et ne pas démarrer OpenLP), cliquez sur le bouton annuler. - - - - Finish - Terminé +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. + OpenLP.FormattingTagDialog - + Configure Formatting Tags Configurer les balises de formatage - + Edit Selection Édite la sélection - + Save Enregistre - + Description Description - + Tag Balise - + Start tag Balise de début - + End tag Balise de fin - + Tag Id Identifiant de balise - + Start HTML HTML de début - + End HTML HTML de fin @@ -2643,32 +2858,32 @@ OpenLP.FormattingTagForm - + Update Error Erreur de mise à jour - + Tag "n" already defined. Balise "n" déjà définie. - + New Tag Nouvelle balise - + <HTML here> <HTML ici> - + </and here> </et ici> - + Tag %s already defined. Balise %s déjà définie. @@ -2676,82 +2891,82 @@ OpenLP.FormattingTags - + Red Rouge - + Black Noir - + Blue Bleu - + Yellow Jaune - + Green Vert - + Pink Rose - + Orange Orange - + Purple Pourpre - + White Blanc - + Superscript Exposant - + Subscript Indice - + Paragraph Paragraphe - + Bold Gras - + Italics Italiques - + Underline Souligner - + Break Retour à la ligne @@ -2759,180 +2974,170 @@ OpenLP.GeneralTab - + General Général - + Monitors Moniteurs - + Select monitor for output display: Sélectionne l’écran pour la sortie d'affichage live : - + Display if a single screen Affiche si il n'y a qu'un écran - + Application Startup Démarrage de l'application - + Show blank screen warning Affiche un avertissement d'écran vide - + Automatically open the last service Ouvre automatiquement le dernier service - + Show the splash screen Affiche l'écran de démarrage - + Application Settings Préférence de l'application - + Prompt to save before starting a new service Demande d'enregistrer avant de commencer un nouveau service - + Automatically preview next item in service Prévisualise automatiquement l'élément suivant du service - + sec sec - + CCLI Details CCLI détails - + SongSelect username: Nom d'utilisateur SongSelect : - + SongSelect password: Mot de passe SongSelect : - + X X - + Y Y - + Height Hauteur - + Width Largeur - + Check for updates to OpenLP Vérifie si des mises à jours d'OpenLP sont disponibles - + Unblank display when adding new live item Retire l'écran noir lors de l'ajout de nouveaux éléments au direct - + Timed slide interval: Intervalle de temps entre les diapositives : - + Background Audio Son en fond - + Start background audio paused Démarrer le son de fond en pause - + Service Item Slide Limits - - - - - &End Slide - + Limites des éléments de service - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide - + + Override display position: + Surcharger la position d'affichage : - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - + + Repeat track list + Répéter la liste des pistes - - &Next Item - + + Behavior of next/previous on the last/first slide: + Comportement suivant/précédent sur la dernière/première diapositive : - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - + + &Remain on Slide + &Rester sur la diapositive - - Override display position: + + &Wrap around - - Repeat track list - + + &Move to next/previous service item + &Déplacer l'élément du service vers suivant/précédent OpenLP.LanguageManager - + Language Langage - + Please restart OpenLP to use your new language setting. Veuillez redémarrer OpenLP pour utiliser votre nouveau paramétrage de langue. @@ -2948,287 +3153,287 @@ OpenLP.MainWindow - + &File &Fichier - + &Import &Import - + &Export E&xport - + &View &Visualise - + M&ode M&ode - + &Tools &Outils - + &Settings O&ptions - + &Language &Langue - + &Help &Aide - + Media Manager Gestionnaire de médias - + Service Manager Gestionnaire de services - + Theme Manager Gestionnaire de thèmes - + &New &Nouveau - + &Open &Ouvrir - + Open an existing service. Ouvre un service existant. - + &Save &Enregistre - + Save the current service to disk. Enregistre le service courant sur le disque. - + Save &As... Enregistre &sous... - + Save Service As Enregistre le service sous - + Save the current service under a new name. Enregistre le service courant sous un nouveau nom. - + E&xit &Quitter - + Quit OpenLP Quitter OpenLP - + &Theme &Thème - + &Configure OpenLP... &Personnalise OpenLP... - + &Media Manager Gestionnaire de &médias - + Toggle Media Manager Gestionnaire de Média - + Toggle the visibility of the media manager. Change la visibilité du gestionnaire de média. - + &Theme Manager Gestionnaire de &thèmes - + Toggle Theme Manager Gestionnaire de Thème - + Toggle the visibility of the theme manager. Change la visibilité du gestionnaire de tème. - + &Service Manager Gestionnaire de &services - + Toggle Service Manager Gestionnaire de service - + Toggle the visibility of the service manager. Change la visibilité du gestionnaire de service. - + &Preview Panel Panneau de &prévisualisation - + Toggle Preview Panel Panneau de prévisualisation - + Toggle the visibility of the preview panel. Change la visibilité du panel de prévisualisation. - + &Live Panel Panneau du &direct - + Toggle Live Panel Panneau du direct - + Toggle the visibility of the live panel. Change la visibilité du directe. - + &Plugin List Liste des &modules - + List the Plugins Liste des modules - + &User Guide &Guide utilisateur - + &About À &propos - + More information about OpenLP Plus d'information sur OpenLP - + &Online Help &Aide en ligne - + &Web Site Site &Web - + Use the system language, if available. Utilise le langage système, si disponible. - + Set the interface language to %s Défini la langue de l'interface à %s - + Add &Tool... Ajoute un &outils... - + Add an application to the list of tools. Ajoute une application à la liste des outils. - + &Default &Défaut - + Set the view mode back to the default. Redéfini le mode vue comme par défaut. - + &Setup &Configuration - + Set the view mode to Setup. Mode vue Configuration. - + &Live &Direct - + Set the view mode to Live. Mode vue Direct. - + 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/. @@ -3237,108 +3442,108 @@ Vous pouvez télécharger la dernière version à partir de http://openlp.org/. - + OpenLP Version Updated Version d'OpenLP mis à jour - + OpenLP Main Display Blanked OpenLP affichage principal noirci - + The Main Display has been blanked out L'affichage principal a été noirci - + Default Theme: %s Thème par défaut : %s - + English Please add the name of your language here Français - + Configure &Shortcuts... Personnalise les &raccourcis... - + Close OpenLP Ferme OpenLP - + Are you sure you want to close OpenLP? Êtes vous sur de vouloir fermer OpenLP ? - + Open &Data Folder... &Ouvre le répertoire de données... - + Open the folder where songs, bibles and other data resides. Ouvre le répertoire où se trouve les chants, bibles et autres données. - + &Autodetect &Détecte automatiquement - + Update Theme Images Met à jour les images de thèmes - + Update the preview images for all themes. Mettre à jour les images de tous les thèmes. - + Print the current service. Imprime le service courant. - + &Recent Files Fichiers &récents - + L&ock Panels &Verrouille les panneaux - + Prevent the panels being moved. Empêcher les panneaux d'être déplacé. - + Re-run First Time Wizard Re-démarrer l'assistant de démarrage - + Re-run the First Time Wizard, importing songs, Bibles and themes. Re-démarrer l'assistant de démarrage, importer les chants, Bibles et thèmes. - + Re-run First Time Wizard? Re-démarrer l'assistant de démarrage ? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3347,43 +3552,43 @@ Re-démarrer cet assistant peut apporter des modifications à votre configuration actuelle d'OpenLP, éventuellement ajouter des chants à votre liste de chants existante et changer votre thème par défaut. - + Clear List Clear List of recent files Vide la liste - + Clear the list of recent files. Vide la liste des fichiers récents. - + Configure &Formatting Tags... Configure les &balises de formatage... - + Export OpenLP settings to a specified *.config file Exporte la configuration d'OpenLP vers un fichier *.config spécifié - + Settings Configuration - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Importe la configuration d'OpenLP à partir d'un fichier *.config précédemment exporté depuis un autre ordinateur. - + Import settings? Import de la configuration ? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3396,45 +3601,50 @@ L'import de configurations incorrect peut provoquer des comportements imprévisible d'OpenLP. - + Open File Ouvre un fichier - + OpenLP Export Settings Files (*.conf) Fichier de configuration OpenLP (*.conf) - + Import settings Import de la configuration - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP va se terminer maintenant. La Configuration importée va être appliquée au prochain démarrage. - + Export Settings File Export de la configuration - + OpenLP Export Settings File (*.conf) Fichier d'export de la configuration d'OpenLP (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error Erreur de base de données - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3443,7 +3653,7 @@ Base de données: %s - + OpenLP cannot load your database. Database: %s @@ -3455,74 +3665,74 @@ OpenLP.MediaManagerItem - + No Items Selected Pas d'éléments sélectionnés - + &Add to selected Service Item &Ajoute à l'élément sélectionné du service - + You must select one or more items to preview. Vous devez sélectionner un ou plusieurs éléments à prévisualiser. - + You must select one or more items to send live. Vous devez sélectionner un ou plusieurs éléments pour les envoyer au direct. - + You must select one or more items. Vous devez sélectionner un ou plusieurs éléments. - + You must select an existing service item to add to. Vous devez sélectionner un élément existant du service pour l'ajouter. - + Invalid Service Item Élément du service invalide - + You must select a %s service item. Vous devez sélectionner un %s élément du service. - + You must select one or more items to add. Vous devez sélectionner un ou plusieurs éléments à ajouter. - + No Search Results Aucun résultat de recherche - + Invalid File Type Type de fichier invalide - + Invalid File %s. Suffix not supported Fichier invalide %s. Extension non supportée - + &Clone %Clone - + Duplicate files were found on import and were ignored. Des fichiers dupliqués on été trouvé dans l'import et ont été ignorés. @@ -3530,40 +3740,40 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + La balise <lyrics> est manquante. - + <verse> tag is missing. - + La balise <verse> est manquante. OpenLP.PluginForm - + Plugin List Liste des modules - + Plugin Details Détails du module - + Status: État : - + Active Actif - + Inactive Inactif @@ -3586,12 +3796,12 @@ OpenLP.PrintServiceDialog - + Fit Page Ajuster à la page - + Fit Width Ajuster à la largeur @@ -3599,7 +3809,7 @@ OpenLP.PrintServiceForm - + Options Options @@ -3614,47 +3824,47 @@ Copier comme de l'HTML - + Zoom In Zoom avant - + Zoom Out Zoom arrière - + Zoom Original Zoom d'origine - + Other Options Autres options - + Include slide text if available Inclure le texte des diapositives si disponible - + Include service item notes Inclure les notes des éléments du service - + Include play length of media items Inclure la durée des éléments média - + Add page break before each text item Ajoute des sauts de page entre chaque éléments - + Service Sheet Feuille de service @@ -3664,12 +3874,12 @@ Imprimer - + Title: Titre : - + Custom Footer Text: Texte de pied de page personnalisé : @@ -3677,12 +3887,12 @@ OpenLP.ScreenList - + Screen Écran - + primary primaire @@ -3690,12 +3900,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Début</strong> : %s - + <strong>Length</strong>: %s <strong>Longueur</strong> : %s @@ -3703,7 +3913,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Réordonne les éléments du service @@ -3711,82 +3921,82 @@ OpenLP.ServiceManager - + Move to &top Place en &premier - + Move item to the top of the service. Place l'élément au début du service. - + Move &up Déplace en &haut - + Move item up one position in the service. Déplace l'élément d'une position en haut. - + Move &down Déplace en &bas - + Move item down one position in the service. Déplace l'élément d'une position en bas. - + Move to &bottom Place en &dernier - + Move item to the end of the service. Place l'élément a la fin du service. - + &Delete From Service &Retire du service - + Delete the selected item from the service. Retire l'élément sélectionné du service. - + &Add New Item &Ajoute un nouvel élément - + &Add to Selected Item &Ajoute à l'élément sélectionné - + &Edit Item &Édite l'élément - + &Reorder Item &Réordonne l'élément - + &Notes &Notes - + &Change Item Theme &Change le thème de l'élément @@ -3808,112 +4018,107 @@ Le fichier n'est pas un fichier de service valide. - + Missing Display Handler Composant d'affichage manquant - + Your item cannot be displayed as there is no handler to display it Votre élément ne peut pas être affiché parce qu'il n'y a pas de composant 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é parce que le module nécessaire est manquant ou désactivé - + &Expand all &Développer tout - + Expand all the service items. Développe tous les éléments du service. - + &Collapse all &Réduire tout - + Collapse all the service items. Réduit tous les éléments du service. - + Open File Ouvre un fichier - + Moves the selection down the window. Déplace la sélection en bas de la fenêtre. - + Move up Déplace en haut - + Moves the selection up the window. Déplace la sélection en haut de la fenêtre. - + Go Live Lance le direct - + Send the selected item to Live. Affiche l'élément sélectionné en direct. - + &Start Time Temps de &début - + Show &Preview Affiche en &prévisualisation - - Show &Live - Affiche en &direct - - - + Modified Service Service modifié - + The current service has been modified. Would you like to save this service? Le service courant à été modifié. Voulez-vous l'enregistrer ? - + Custom Service Notes: Notes de service : - + Notes: Notes : - + Playing time: Durée du service : - + Untitled Service Service sans titre @@ -3938,17 +4143,17 @@ Fichier corrompu - + Load an existing service. Charge un service existant. - + Save this service. Enregistre ce service. - + Select a theme for the service. Sélectionne un thème pour le service. @@ -3958,7 +4163,7 @@ Ce fichier est sois corrompu ou n'est pas un fichier de service OpenLP 2.0. - + Service File Missing Fichier de service manquant @@ -3982,11 +4187,21 @@ Service copy only Copie de service uniquement + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes Notes sur l'élément du service @@ -4002,67 +4217,67 @@ OpenLP.ShortcutListDialog - + Action Action - + Shortcut Raccourci - + Duplicate Shortcut Raccourci dupliqué - + The shortcut "%s" is already assigned to another action, please use a different shortcut. Le raccourci "%s" est déjà assigné à une autre action, veuillez utiliser un autre raccourci. - + Alternate Alternatif - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Sélectionnez une action puis cliquez sur un des boutons ci-dessous pour capturer un nouveau raccourci principal ou secondaire. - + Default Défaut - + Custom Personnalisé - + Capture shortcut. Capture un raccourci. - + Restore the default shortcut of this action. Restaure le raccourci par défaut de cette action. - + Restore Default Shortcuts Restaure les raccourcis par défaut - + Do you want to restore all shortcuts to their defaults? Voulez vous restaurer tous les raccourcis par leur valeur par défaut ? - + Configure Shortcuts Configure les raccourcis @@ -4070,179 +4285,174 @@ OpenLP.SlideController - + Hide Cache - + Go To Aller à - + Blank Screen Écran noir - + Blank to Theme Thème vide - + Show Desktop Affiche le bureau - + Previous Service Service précédent - + Next Service Service suivant - + Escape Item Élément d'échappement - + Move to previous. Déplace au précédant. - + Move to next. Déplace au suivant. - + Play Slides Joue les diapositives - + Delay between slides in seconds. Intervalle entre les diapositives en secondes. - + Move to live. Affiche en direct. - + Add to Service. Ajoute au service. - + Edit and reload song preview. Édite et recharge la prévisualisation du chant. - + Start playing media. Joue le média. - + Pause audio. Mettre en pause la lecture audio. - + Pause playing media. Mettre en pause la lecture. - + Stop playing media. Arrêter la lecture. - + Video position. Position vidéo. - + Audio Volume. Volume sonore. - + Go to "Verse" Aller au "Couplet" - + Go to "Chorus" Aller au "Refrain" - + Go to "Bridge" Aller au "Pont" - + Go to "Pre-Chorus" Aller au "Pré-Refrain" - + Go to "Intro" Aller à "Intro" - + Go to "Ending" Aller à "Fin" - + Go to "Other" Aller à "Autre" - + Previous Slide - + Diapositive précédente - + Next Slide - + Diapositive suivante - + Pause Audio - + Pause Audio - + Background Audio - Son en fond - - - - Next Track - + Audio en fond - + Go to next audio track. - + Aller à la piste audio suivante. - + Tracks - + Pistes @@ -4316,17 +4526,17 @@ Le temps de début est après le temps de fin de l'élément média - + Theme Layout Disposition du thème - + The blue box shows the main area. La boîte bleu indique la zone principale. - + The red box shows the footer. La boîte rouge indique la zone de pied de page. @@ -4334,32 +4544,32 @@ OpenLP.ThemeForm - + Select Image Sélectionne l'image - + Theme Name Missing Nom du thème manquant - + There is no name for this theme. Please enter one. Ce thème ne contient aucun nom. Veuillez en saisir un. - + Theme Name Invalid Nom du thème invalide - + Invalid theme name. Please enter one. Nom du thème invalide. Veuillez en saisir un. - + (approximately %d lines per slide) (approximativement %d lignes pas diapositive) @@ -4367,514 +4577,514 @@ OpenLP.ThemeManager - + Create a new theme. Crée un nouveau thème. - + Edit Theme Édite le thème - + Edit a theme. Édite un thème. - + Delete Theme Supprime le thème - + Delete a theme. Supprime un thème. - + Import Theme Import le thème - + Import a theme. Import un thème. - + Export Theme Export le thème - + Export a theme. Export un thème. - + &Edit Theme &Édite le thème - + &Delete Theme &Supprime le thème - + Set As &Global Default Définir comme défaut &Global - + %s (default) %s (défaut) - + You must select a theme to edit. Vous devez sélectionner un thème à éditer. - + 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. Le Thème %s est utilisé par le module %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é exporté 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 exporté à cause d'une erreur. - + Select Theme Import File Sélectionner le fichier thème à importer - + File is not a valid theme. Le fichier n'est pas un thème valide. - + &Copy Theme &Copie le thème - + &Rename Theme &Renomme le thème - + &Export Theme &Exporte le thème - + You must select a theme to rename. Vous devez sélectionner un thème à renommer. - + Rename Confirmation Confirme le renommage - + Rename %s theme? Renomme le thème %s ? - + You must select a theme to delete. Vous devez sélectionner un thème à supprimer. - + Delete Confirmation Confirmation de suppression - + Delete %s theme? Supprime le thème %s ? - + Validation Error Erreur de validation - + A theme with this name already exists. Un autre thème porte déjà ce nom. - + OpenLP Themes (*.theme *.otz) Thèmes OpenLP (*.theme *.otz) - + Copy of %s Copy of <theme name> Copie de %s - + Theme Already Exists - + Le thème existe déjà OpenLP.ThemeWizard - + Theme Wizard Assistant de thème - + Welcome to the Theme Wizard Bienvenue dans l'assistant de thème - + Set Up Background Choisir le font - + Set up your theme's background according to the parameters below. Choisir le fond de votre thème à l'aide des paramètres ci-dessous. - + Background type: Type de fond : - + Solid Color Couleur unie - + Gradient Dégradé - + Color: Couleur : - + Gradient: Dégradé : - + Horizontal Horizontal - + Vertical Vertical - + Circular Circulaire - + Top Left - Bottom Right Haut gauche - Bas droite - + Bottom Left - Top Right Bas gauche - Haut droite - + Main Area Font Details Détails de la police de la zone principale - + Define the font and display characteristics for the Display text Définir la police et les caractéristique d'affichage de ce texte - + Font: Police : - + Size: Taille : - + Line Spacing: Espace entre les lignes : - + &Outline: &Contour : - + &Shadow: &Ombre : - + Bold Gras - + Italic Italique - + Footer Area Font Details Détails de la police de la zone du pied de page - + Define the font and display characteristics for the Footer text Définir la police et les caractéristiques d'affichage du texte de pied de page - + Text Formatting Details Détails de formatage du texte - + Allows additional display formatting information to be defined Permet de définir des paramètres d'affichage supplémentaires - + Horizontal Align: Alignement horizontal : - + Left Gauche - + Right Droite - + Center Centré - + Output Area Locations Emplacement de la zone d'affichage - + Allows you to change and move the main and footer areas. Permet de déplacer les zones principale et de pied de page. - + &Main Area Zone &principale - + &Use default location &Utilise l'emplacement par défaut - + X position: Position x : - + px px - + Y position: Position y : - + Width: Largeur : - + Height: Hauteur : - + Use default location Utilise l'emplacement par défaut - + Save and Preview Enregistre et prévisualise - + View the theme and save it replacing the current one or change the name to create a new theme Visualise le thème et l'enregistre à la place du thème courant ou change le nom pour en créer un nouveau - + Theme name: Nom du thème : - + Edit Theme - %s Édite le thème - %s - + 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. Cet assistant vous permet de créer et d'éditer vos thèmes. Cliquer sur le bouton suivant pour démarrer le processus en choisissant votre fond. - + Transitions: Transitions : - + &Footer Area Zone de &pied de page - + Starting color: Couleur de début : - + Ending color: Couleur de fin : - + Background color: Couleur de fond : - + Justify Justifier - + Layout Preview Prévisualise la mise en page - + Transparent - + Transparent OpenLP.ThemesTab - + Global Theme Thème global - + Theme Level Politique d'application du thème - + S&ong Level Niveau &chant - + 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. Utilise le thème pour chaque chants de la base de données. Si un chant n'a pas de thème associé, le thème du service est utilisé. Si le service n'a pas de thème, le thème global est utilisé. - + &Service Level Niveau &service - + 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. Utilise le thème du service, surcharge le thème de chaque chants. Si le service n'a pas de thème, le thème global est utilisé. - + &Global Level Niveau &global - + Use the global theme, overriding any themes associated with either the service or the songs. Utilise le thème global, surcharge tous les thèmes associés aux services ou aux chants. - + Themes Thèmes @@ -4958,239 +5168,239 @@ pt - + Image Image - + Import Import - + Live Direct - + Live Background Error Erreur de fond du direct - + Load Charge - + Middle Milieu - + New Nouveau - + New Service Nouveau service - + New Theme Nouveau thème - + No File Selected Singular Pas de fichier sélectionné - + No Files Selected Plural Aucun fichiers sélectionnés - + No Item Selected Singular Aucun élément sélectionné - + No Items Selected Plural Aucun éléments sélectionnés - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Prévisualisation - + Replace Background Remplace le fond - + Reset Background Réinitialiser le fond - + s The abbreviated unit for seconds s - + Save && Preview Enregistre && prévisualise - + Search Recherche - + You must select an item to delete. Vous devez sélectionner un élément à supprimer. - + You must select an item to edit. Vous devez sélectionner un élément à éditer. - + Save Service Enregistre le service - + Service Service - + Start %s Début %s - + Theme Singular Thème - + Themes Plural Thèmes - + Top Haut - + Version Version - + Delete the selected item. Supprime l'élément sélectionné. - + Move selection up one position. Déplace la sélection d'une position vers le haut. - + Move selection down one position. Déplace la sélection d'une position vers le bas. - + &Vertical Align: Alignement &vertical : - + Finished import. Import terminé. - + Format: Format : - + Importing Import en cours - + Importing "%s"... Importation de "%s"... - + Select Import Source Sélectionnez la source à importer - + Select the import format and the location to import from. Sélectionne le format d'import et le chemin du fichier à importer. - + 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. L'import openlp.org 1.x a été désactivé parce qu'il manque un module Python. Si vous voulez utiliser cet import, vous devez installer le module Python "python-sqlite". - + Open %s File Ouvre le fichier %s - + %p% %p% - + Ready. Prêt. - + Starting import... Commence l'import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong Vous devez spécifier au moins un fichier de %s à importer. @@ -5206,7 +5416,7 @@ Bienvenue dans l'assistant d'export de Chant - + Welcome to the Song Import Wizard Bienvenue dans l'assistant d'import de Chant @@ -5294,53 +5504,53 @@ h - + Layout style: Type de disposition : - + Live Toolbar Bar d'outils direct - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP est déjà en cours d'utilisation. Voulez-vous continuer ? - + Settings Configuration - + Tools Outils - + Unsupported File Fichier non supporté - + Verse Per Slide Un verset par diapositive - + Verse Per Line Un verset par ligne - + View Affiche @@ -5355,42 +5565,37 @@ Erreur de syntaxe XML - + View Mode Mode d'affichage - + Open service. Ouvre le service. - + Print Service Imprime le service - + Replace live background. Remplace le fond du direct. - + Reset live background. Restaure le fond du direct. - - &Split - &Sépare - - - + Split a slide into two only if it does not fit on the screen as one slide. Divisez la diapositive en deux seulement si elle ne loge pas sur l'écran. - + Welcome to the Bible Upgrade Wizard Bienvenue dans l'assistant de mise à jour de Bible @@ -5400,105 +5605,157 @@ Confirme la suppression - + Play Slides in Loop Affiche les diapositives en boucle - + Play Slides to End Affiche les diapositives jusqu’à la fin - + Stop Play Slides in Loop Arrête la boucle de diapositive - + Stop Play Slides to End Arrête la boucle de diapositive à la fin - + Next Track + Piste suivante + + + + Search Themes... + Search bar place holder text + Recherche dans les thèmes... + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1 et %2 - + %1, and %2 Locale list separator: end - + %1, et %2 - + %1, %2 Locale list separator: middle - + %1, %2 - + %1, %2 Locale list separator: start - + %1, %2 PresentationPlugin - + <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>Module de présentation</strong><br />Le module de présentation permet d'afficher des présentations issues d'autres logiciels. La liste des logiciels disponibles se trouve dans les options d'OpenLP rubrique Présentation. - + Presentation name singular Présentation - + Presentations name plural Présentations - + Presentations container title Présentations - + Load a new presentation. Charge une nouvelle présentation. - + Delete the selected presentation. Supprime la présentation sélectionnée. - + Preview the selected presentation. Prévisualise la présentation sélectionnée. - + Send the selected presentation live. Envoie la présentation sélectionnée au direct. - + Add the selected presentation to the service. Ajoute la présentation sélectionnée au service. @@ -5506,72 +5763,72 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Sélectionne un(des) Présentation(s) - + Automatic Automatique - + Present using: Actuellement utilisé : - + File Exists Ce fichier existe - + A presentation with that filename already exists. Une présentation utilise déjà ce nom de fichier. - + This type of presentation is not supported. Ce type de présentation n'est pas supporté. - + Presentations (%s) Présentations (%s) - + Missing Presentation Présentation manquante - - The Presentation %s no longer exists. - La présentation %s n'existe plus. + + The presentation %s is incomplete, please reload. + - - The Presentation %s is incomplete, please reload. - La présentation %s est incomplète, merci de la recharger. + + The presentation %s no longer exists. + PresentationPlugin.PresentationTab - + Available Controllers Logiciels de présentation disponibles - + %s (unavailable) %s (non disponible) - + Allow presentation application to be overridden - + Autoriser l'application de présentation à être surcharger @@ -5603,221 +5860,236 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 Contrôle à distance - + OpenLP 2.0 Stage View OpenLP 2.0 Prompteur - + Service Manager Gestionnaire de services - + Slide Controller Contrôleur de diapositive - + Alerts Alertes - + Search Recherche - - Back - Arrière - - - + Refresh Rafraîchir - + Blank Vide - + Show Affiche - + Prev Préc - + Next Suiv - + Text Texte - + Show Alert Affiche une alerte - + Go Live Lance le direct - + No Results Pas de résultats - + Options Options - + Add to Service Ajoute au service + + + Home + Accueil + + + + Theme + Thème + + + + Desktop + Bureau + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: Ecoute sur l'adresse IP : - + Port number: Numéro de port : - + Server Settings Configuration du serveur - + Remote URL: URL du contrôle à distance : - + Stage view URL: URL du Prompteur : - + Display stage time in 12h format Affiche l'heure du prompteur au format 12h - + Android App - + Application Android - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. - + Scannez le QR code ou cliquez sur <a href="https://market.android.com/details?id=org.openlp.android">télécharger</a> pour installer l'application Android à partir de Google Play. SongUsagePlugin - + &Song Usage Tracking Suivre de l'utilisation des &chants - + &Delete Tracking Data &Supprime les données de suivi - + Delete song usage data up to a specified date. Supprime les données de l'utilisation des chants jusqu'à une date donnée. - + &Extract Tracking Data &Extraire les données de suivi - + Generate a report on song usage. Génère un rapport de l'utilisation des chants. - + Toggle Tracking Activer/Désactiver le suivi - + Toggle the tracking of song usage. Active/Désactive le suivi de l'utilisation des chants. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Module de suivi des chants</strong><br />Ce module permet d'effectuer des statistiques sur la projection des chants. - + SongUsage name singular Suivi de l'utilisation des chants - + SongUsage name plural Suivi de l'utilisation des chants - + SongUsage container title Suivi de l'utilisation des chants - + Song Usage Suivi de l'utilisation des chants - + Song usage tracking is active. Le suivi de l'utilisation des chants est actif. - + Song usage tracking is inactive. Le suivi de l'utilisation des chants est inactif. - + display affiche - + printed imprimé @@ -5825,7 +6097,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Supprime les données de suivi de l'utilisation des chants @@ -5850,7 +6122,7 @@ Toutes les données demandées ont été supprimées avec succès. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Sélectionnez la date jusqu'à laquelle les données d'utilisation des chants devra être supprimé. Toutes les données enregistrées avant cette date seront définitivement supprimées. @@ -5858,42 +6130,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Extraction de l'utilisation des chants - + Select Date Range Sélectionne une période - + to à - + Report Location Emplacement du rapport - + Output File Location Emplacement du fichier de sortie - + usage_detail_%s_%s.txt rapport_d_utilisation_%s_%s.txt - + Report Creation Création du rapport - + Report %s has been successfully created. @@ -5902,12 +6174,12 @@ à été crée avec succès. - + Output Path Not Selected Répertoire de destination non sélectionné - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. Vous n'avez pas défini de répertoire de destination valide pour votre rapport d'utilisation des chants. Veuillez sélectionner un répertoire existant sur votre ordinateur. @@ -5945,82 +6217,82 @@ Ré-indexation des chants en cours... - + Arabic (CP-1256) Arabe (CP-1256) - + Baltic (CP-1257) Baltique (CP-1257) - + Central European (CP-1250) Europe centrale (CP-1250) - + Cyrillic (CP-1251) Cyrillique (CP-1251) - + Greek (CP-1253) Grecque (CP-1253) - + Hebrew (CP-1255) Hébreux (CP-1255) - + Japanese (CP-932) Japonais (CP-932) - + Korean (CP-949) Coréen (CP-949) - + Simplified Chinese (CP-936) Chinois simplifié (CP-936) - + Thai (CP-874) Thaï (CP-874) - + Traditional Chinese (CP-950) Chinois Traditionnel (CP-950) - + Turkish (CP-1254) Turque (CP-1254) - + Vietnam (CP-1258) Vietnamiens (CP-1258) - + Western European (CP-1252) Europe de l'ouest (CP-1252) - + Character Encoding Encodage des caractères - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6029,26 +6301,26 @@ L'option déjà sélectionnée est en général la bonne. - + Please choose the character encoding. The encoding is responsible for the correct character representation. Veuillez choisir l'encodage des caractères. L'encodage permet un affichage correct des caractères. - + Song name singular Chant - + Songs name plural Chants - + Songs container title Chants @@ -6059,32 +6331,32 @@ Export des chants en utilisant l'assistant d'export. - + Add a new song. Ajoute un nouveau chant. - + Edit the selected song. Édite le chant sélectionné. - + Delete the selected song. Supprime le chant sélectionné. - + Preview the selected song. Prévisualise le chant sélectionné. - + Send the selected song live. Envoie le chant sélectionné au direct. - + Add the selected song to the service. Ajoute le chant sélectionné au service. @@ -6112,17 +6384,17 @@ Nom : - + You need to type in the first name of the author. Vous devez entrer le prénom de l'auteur. - + You need to type in the last name of the author. Vous devez entrer le nom de l'auteur. - + You have not set a display name for the author, combine the first and last names? Nous n'avez pas défini de nom à afficher pour l'auteur, combiner le prénom et le nom ? @@ -6153,211 +6425,224 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Méta données + + + + Custom Book Names + Noms de livres personnalisés + + + SongsPlugin.EditSongForm - + Song Editor Éditeur de Chant - + &Title: &Titre : - + Alt&ernate title: Titre alt&ernatif : - + &Lyrics: &Paroles : - + &Verse order: Ordre des &paragraphes : - + Ed&it All Édite &tous - + Title && Lyrics Titre && paroles - + &Add to Song &Ajoute au Chant - + &Remove &Supprime - + &Manage Authors, Topics, Song Books &Gère les auteurs, sujets, Carnets de chants - + A&dd to Song A&joute au Chant - + R&emove &Supprime - + Book: Carnet de chants : - + Number: Numéro : - + Authors, Topics && Song Book Auteurs, sujets && Carnet de chants - + New &Theme Nouveau &thème - + Copyright Information Information du copyright - + Comments Commentaires - + Theme, Copyright Info && Comments Thème, copyright && commentaires - + Add Author Ajoute un auteur - + This author does not exist, do you want to add them? Cet auteur n'existe pas, voulez-vous l'ajouter ? - + This author is already in the list. Cet auteur ce trouve déjà dans la liste. - + 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. Vous n'avez pas sélectionné un auteur valide. Vous pouvez sélectionner un auteur dans la liste, ou entrer le nom d'un nouvel auteur et cliquez sur "Ajouter un auteur au Chant". - + Add Topic Ajoute un sujet - + This topic does not exist, do you want to add it? Ce sujet n'existe pas voulez-vous l'ajouter ? - + This topic is already in the list. Ce sujet ce trouve déjà dans la liste. - + 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. Vous n'avez pas sélectionné de sujet valide. Vous pouvez sélectionner un sujet dans la liste, ou entrer le nom d'un nouveau sujet et cliquez sur "Ajouter un sujet au Chant". - + You need to type in a song title. Vous devez entrer un titre pour ce chant. - + You need to type in at least one verse. Vous devez entrer au moins un paragraphe. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. L'ordre des paragraphes est invalide. Il n'y a pas de paragraphe correspondant à %s. Les entrées valides sont %s. - + Add Book Ajoute un Carnet de chants - + This song book does not exist, do you want to add it? Ce carnet de chants n'existe pas, voulez-vous l'ajouter ? - + You need to have an author for this song. Vous devez entrer un auteur pour ce chant. - + You need to type some text in to the verse. Vous devez entrer du texte dans ce paragraphe. - + Linked Audio Fichier audio attaché - + Add &File(s) Ajoute un(des) &fichier(s) - + Add &Media Ajoute un &média - + Remove &All Supprime &tout - + Open File(s) Ouvre un(des) fichier(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + <strong>Attention :</strong> Tous les versets ne sont pas utilisés. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. - + L'ordre des versets est invalide. Aucun verset ne correspond à %s. Les entrées valides sont %s. @@ -6469,130 +6754,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Sélectionne les fichiers Document/Présentation - + Song Import Wizard Assistant d'import de Chant - + 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. Cet assistant vous permet d'importer des chants de divers formats. Cliquez sur le bouton suivant ci-dessous pour démarrer le processus en sélectionnant le format à importer. - + Generic Document/Presentation Document/Présentation générique - - Filename: - Nom de fichier : - - - - 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. - L'import OpenLyrics n'a pas encore été développé, mais comme vous pouvez le voir, nous avous toujours l'intention de le faire. J'espère que ce sera dans la prochaine version. - - - + Add Files... Ajoute des fichiers... - + Remove File(s) Supprime un(des) fichier(s) - + Please wait while your songs are imported. Veuillez patienter pendant l'import de vos chants. - + OpenLP 2.0 Databases Base de données OpenLP 2.0 - + openlp.org v1.x Databases Base de données openlp.org 1.x - + Words Of Worship Song Files Fichiers Chant Words Of Worship - - You need to specify at least one document or presentation file to import from. - Vous devez spécifier au moins un fichier document ou présentation à importer. - - - + Songs Of Fellowship Song Files Fichiers Chant Songs Of Fellowship - + SongBeamer Files Fichiers SongBeamer - + SongShow Plus Song Files Fichiers Chant SongShow Plus - + Foilpresenter Song Files Fichiers Chant Foilpresenter - + Copy Copier - + Save to File Enregistre dans le fichier - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. L'import de chants Fellowship a été désactivé car OpenLP ne peut accéder à OpenOffice ou LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. L'import générique de document/présentation a été désactivé car OpenLP ne peut accéder à OpenOffice ou LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song Chant exporté OpenLyrics ou OpenLP 2.0 - + OpenLyrics Files Fichiers OpenLyrics + + + CCLI SongSelect Files + CCLI Song Sélectionner Fichiers + + + + EasySlides XML File + Fichier XML EasySlides + + + + EasyWorship Song Database + Base de données de chants d'EasyWorship + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) Sélectionne un(des) fichier(s) média - + Select one or more audio files from the list below, and click OK to import them into this song. Sélectionnez un ou plusieurs fichier depuis la liste ci-dessous, et cliquez sur le bouton OK pour les importer dans ce chant. @@ -6600,27 +6905,27 @@ SongsPlugin.MediaItem - + Titles Titres - + Lyrics Paroles - + CCLI License: Licence CCLI : - + Entire Song Chant entier - + Are you sure you want to delete the %n selected song(s)? Êtes-vous sûr de vouloir supprimer le chant %n sélectionné ? @@ -6628,16 +6933,41 @@ - + Maintain the lists of authors, topics and books. Maintenir la liste des auteurs, sujets et carnets de chants. - + copy For song cloning copier + + + Search Titles... + Recherche dans les titres... + + + + Search Entire Song... + Recherche dans le chant entier... + + + + Search Lyrics... + Recherche dans les paroles... + + + + Search Authors... + Recherche dans les auteurs... + + + + Search Song Books... + Recherche dans les carnets de chants... + SongsPlugin.OpenLP1SongImport @@ -6664,6 +6994,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6702,12 +7045,12 @@ SongsPlugin.SongImport - + copyright copyright - + The following songs could not be imported: Les chants suivants ne peuvent être importé : @@ -6728,117 +7071,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Votre import de chant a échoué. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Impossible d'ajouter votre auteur. - + This author already exists. Cet auteur existe déjà. - + Could not add your topic. Impossible d'ajouter votre sujet. - + This topic already exists. Ce sujet existe déjà. - + Could not add your book. Impossible d'ajouter votre carnet de chants. - + This book already exists. Ce carnet de chants existe déjà. - + Could not save your changes. Impossible d'enregistrer vos modifications. - + Could not save your modified author, because the author already exists. Impossible d'enregistrer vos modifications de l'auteur, car l'auteur existe déjà. - + Could not save your modified topic, because it already exists. Impossible d'enregistrer vos modifications du sujet, car le sujet existe déjà. - + Delete Author Supprime l'auteur - + Are you sure you want to delete the selected author? Êtes-vous sûr de bien vouloir supprimer l'auteur sélectionné ? - + This author cannot be deleted, they are currently assigned to at least one song. Cet auteur ne peut être supprimé, il est actuellement utilisé par au moins un chant. - + Delete Topic Supprime le sujet - + Are you sure you want to delete the selected topic? Êtes-vous sûr de bien vouloir supprimer le sujet sélectionné ? - + This topic cannot be deleted, it is currently assigned to at least one song. Ce sujet ne peut être supprimé, il est actuellement utilisé par au moins un chant. - + Delete Book Supprime le carnet de chants - + Are you sure you want to delete the selected book? Êtes-vous sûr de bien vouloir supprimer le carnet de chants sélectionné ? - + This book cannot be deleted, it is currently assigned to at least one song. Ce carnet de chants ne peut être supprimé, il est actuellement utilisé par au moins un chant. - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? L'auteur %s existe déjà. Voulez-vous faire en sorte que les chants avec l'auteur %s utilise l'auteur existant %s ? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? Le sujet %s existe déjà. Voulez-vous faire en sorte que les chants avec le sujet %s utilise le sujet existant %s ? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? Le carnet de chants %s existe déjà. Voulez-vous faire en sorte que les chants du carnet de chants %s utilisent le carnet de chants existant %s ? @@ -6846,29 +7181,29 @@ SongsPlugin.SongsTab - + Songs Mode Options de Chants - + Enable search as you type Active la recherche à la frappe - + Display verses on live tool bar Affiche les paragraphes dans la barre d'outils du direct - + Update service from song edit Mettre à jour le service après une modification de chant - - Add missing songs when opening service - Ajoute les chants manquant lors de l'ouverture d'un service + + Import missing songs from service files + Importer les chants manquant des fichiers du service @@ -6927,4 +7262,17 @@ Autre + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/hu.ts openlp-1.9.10/resources/i18n/hu.ts --- openlp-1.9.9/resources/i18n/hu.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/hu.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Értesítés - + Show an alert message. Értesítést jelenít meg. - + Alert name singular Értesítés - + Alerts name plural Értesítések - + Alerts container title Értesítések - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Értesítés bővítmény</strong><br />Az értesítés bővítmény kezeli a gyermekfelügyelet felhívásait a vetítőn. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Értesítő üzenet - + Alert &text: Értesítés &szövege: - + &New &Új - + &Save &Mentés - + Displ&ay &Megjelenítés - + Display && Cl&ose M&egjelenítés és bezárás @@ -79,7 +79,7 @@ Az értesítés szövege nincs megadva. Adj meg valamilyen szöveget az Új gombra való kattintás előtt. - + &Parameter: &Paraméter: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Betűkészlet - + Font name: Betűkészlet neve: - + Font color: Betűszín: - + Background color: Háttérszín: - + Font size: Betűméret: - + Alert timeout: Értesítés időtartama: @@ -152,551 +152,598 @@ BiblesPlugin - + &Bible &Biblia - + Bible name singular Biblia - + Bibles name plural Bibliák - + Bibles container title Bibliák - + No Book Found Nincs ilyen könyv - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. A kért könyv nem található ebben a bibliában. Kérlek, ellenőrizd a könyv nevének helyesírását. - + Import a Bible. Biblia importálása. - + Add a new Bible. Biblia hozzáadása. - + Edit the selected Bible. A kijelölt biblia szerkesztése. - + Delete the selected Bible. A kijelölt biblia törlése. - + Preview the selected Bible. A kijelölt biblia előnézete. - + Send the selected Bible live. A kijelölt biblia élő adásba küldése. - + Add the selected Bible to the service. A kijelölt biblia hozzáadása a szolgálati sorrendhez. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Biblia bővítmény</strong><br />A biblia bővítmény különféle forrásokból származó igehelyek vetítését teszi lehetővé a szolgálat alatt. - + &Upgrade older Bibles &Régebbi bibliák frissítés - + Upgrade the Bible databases to the latest format. Frissíti a biblia adatbázisokat a legutolsó formátumra. - + Genesis Teremtés - + Exodus Kivonulás - + Leviticus Leviták - + Numbers Számok - + Deuteronomy Második törvénykönyv - + Joshua Józsué - + Judges Bírák - + Ruth Rút - + 1 Samuel 1. Sámuel - + 2 Samuel 2. Sámuel - + 1 Kings 1. Királyok - + 2 Kings 2. Királyok - + 1 Chronicles 1. Krónikák - + 2 Chronicles 2. Krónikák - + Ezra Ezdrás - + Nehemiah Nehemiás - + Esther Eszter - + Job Jób - + Psalms Zsoltárok - + Proverbs Példabeszédek - + Ecclesiastes Prédikátor - + Song of Solomon Énekek éneke - + Isaiah Izajás - + Jeremiah Jeremiás - + Lamentations Jeremiás siralmai - + Ezekiel Ezékiel - + Daniel Dániel - + Hosea Ozeás - + Joel Joel - + Amos Ámosz - + Obadiah Abdiás - + Jonah Jónás - + Micah Mikeás - + Nahum Náhum - + Habakkuk Habakuk - + Zephaniah Szofoniás - + Haggai Aggeus - + Zechariah Zakariás - + Malachi Malakiás - + Matthew Máté - + Mark Márk - + Luke Lukács - + John János - + Acts Apostolok cselekedetei - + Romans Római - + 1 Corinthians 1. Korintusi - + 2 Corinthians 2. Korintusi - + Galatians Galata - + Ephesians Efezusi - + Philippians Filippi - + Colossians Kolosszei - + 1 Thessalonians 1. Tesszaloniki - + 2 Thessalonians 2. Tesszaloniki - + 1 Timothy 1. Timóteus - + 2 Timothy 2. Timóteus - + Titus Titusz - + Philemon Filemon - + Hebrews Zsidók - + James Jakab - + 1 Peter 1. Péter - + 2 Peter 2. Péter - + 1 John 1. János - + 2 John 2. János - + 3 John 3. János - + Jude Júdás - + Revelation Jelenések - + Judith Judit - + Wisdom Bölcsesség - + Tobit Tóbiás - + Sirach Sirák fia - + Baruch Báruk - + 1 Maccabees 1. Makkabeusok - + 2 Maccabees 2. Makkabeusok - + 3 Maccabees 3. Makkabeusok - + 4 Maccabees 4. Makkabeusok - + Rest of Daniel Dániel maradék - + Rest of Esther Eszter maradék - + Prayer of Manasses Manassze imája - + Letter of Jeremiah Jeremiás levele - + Prayer of Azariah Azarja imája - + Susanna Zsuzsanna - + Bel Bél és a sárkány - + 1 Esdras Ezdrás - + 2 Esdras Nehemiás - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. :|v|V|versszak|versszakok;;-;;,|és;;vége + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Meg kell adni a biblia verziószámát. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Meg kell adni a biblia szerzői jogait. A közkincsű bibliákat meg kell jelölni ilyennek. + + + + Bible Exists + Létező Biblia + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + 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. + + + + You need to specify a book name for "%s". + Meg kell adni a könyv nevét: %s. + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + A könyv neve nem megfelelő: %s. +Szám csak az elején lehet és ezt követni kell + néhány nem numerikus karakternek. + + + + Duplicate Book Name + Azonos könyvnév + + + + The Book Name "%s" has been entered more than once. + E könyvnév többször lett megadva: %s. + + + BiblesPlugin.BibleManager - + Scripture Reference Error Igehely hivatkozási hiba - + Web Bible cannot be used Online biblia nem használható - + Text Search is not available with Web Bibles. A keresés nem érhető el online biblián. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Nincs megadva keresési kifejezés. Több kifejezés is megadható. Szóközzel történő elválasztás esetén minden egyes kifejezésre történik a keresés, míg vesszővel való elválasztás esetén csak az egyikre. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Jelenleg nincs telepített biblia. Kérlek, használd a bibliaimportáló tündért bibliák telepítéséhez. - + No Bibles Available Nincsenek elérhető bibliák - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +766,79 @@ BiblesPlugin.BiblesTab - + Verse Display Vers megjelenítés - + Only show new chapter numbers Csak az új fejezetszámok megjelenítése - + Bible theme: Biblia téma: - + No Brackets Nincsenek zárójelek - + ( And ) ( és ) - + { And } { és } - + [ And ] [ és ] - + Note: Changes do not affect verses already in the service. Megjegyzés: A módosítások nem érintik a már a szolgálati sorrendben lévő verseket. - + Display second Bible verses A második biblia verseinek megjelenítése - + Custom Scripture References Egyedi szentírási hivatkozások - + Verse Separator: Versek elválasztása: - + Range Separator: Tartományok elválasztása: - + List Separator: Felsorolások elválasztása: - + End Mark: Vég jelölése: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +847,7 @@ Üresen hagyva az alapértelmezett érték áll helyre. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +856,7 @@ Üresen hagyva az alapértelmezett érték áll helyre. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +865,7 @@ Üresen hagyva az alapértelmezett érték áll helyre. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,91 +874,80 @@ Üresen hagyva az alapértelmezett érték áll helyre. - - Preferred Bookname Language - Könyvnevek előnyben részesített nyelve + + English + Angol - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Jelöld ki, hogy a bibliai könyvek milyen nyelven -jelenjenek meg a keresőben: + + Default Bible Language + Alapértelmezett biblia nyelv - - Bible language - Biblia nyelve + + Book name language in search field, +search results and on display: + A keresési mezőben, a találati sorrendben és a képernyőn +megjelenő könyvnevek alapértelmezett nyelve: - - Application language - Alkalmazás nyelve - - - - English - Angol + + Bible Language + Biblia nyelve - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Több lehetőség: - Biblia nyelve – a nyelv, amellyel a bibliai könyvek be lettek importálva - Alkalmazás nyelve – a nyelv, amellyel az OpenLP megjelenik - Angol – az angol elnevezések használata + + Application Language + Alkalmazás nyelve BiblesPlugin.BookNameDialog - + Select Book Name Jelöld ki a könyv nevét - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - A következő könyvnév nem ismerhető fel. Jelölj ki egy helyes angol nevet a következő listából. - - - + Current name: Jelenlegi név: - + Corresponding name: Megfelelő név: - + Show Books From Könyvek megjelenítése - + Old Testament Ószövetség - + New Testament Újszövetség - + Apocrypha Apokrif + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + A következő könyvnév nem ismerhető fel. Jelölj ki egy helyes nevet a következő listából. + BiblesPlugin.BookNameForm - + You need to select a book. Ki kell jelölni egy könyvet. @@ -936,40 +972,110 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Biblia szerkesztő + + + + License Details + Licenc részletek + + + + Version name: + Veziónév: + + + + Copyright: + Szerzői jog: + + + + Permissions: + Engedélyek: + + + + Default Bible Language + Alapértelmezett biblia nyelv + + + + Book name language in search field, search results and on display: + A keresési mezőben, a találati sorrendben és a képernyőn megjelenő könyvnevek alapértelmezett nyelve: + + + + Global Settings + Általános beállítások + + + + Bible Language + Biblia nyelve + + + + Application Language + Alkalmazás nyelve + + + + English + Angol + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + Ez egy webes biblia. +Nincs lehetőség a könyvnevek módosítására. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + Az egyedi könyvnevek alkalmazásához a „Biblia nyelve” beállítást kell alkalmazni a metaadat fülön, vagy az „Általános beállítások” esetén az OpenLP beállításai között a „Biblia” lapon. + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Biblia regisztrálása és a könyvek letöltése… - + Registering Language... Nyelv regisztrálása… - + Importing %s... Importing <book name>... Importálás: %s… - + Download Error Letöltési hiba - + 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. Probléma történt a kijelölt versek letöltésekor. Kérem, ellenőrizd a az internetkapcsolatot, és ha a hiba nem oldódik meg, fontold meg a hiba bejelentését. - + Parse Error Feldolgozási hiba - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Probléma történt a kiválasztott versek kicsomagolásakor. Ha a hiba nem oldódik meg, fontold meg a hiba bejelentését. @@ -1147,17 +1253,17 @@ BiblesPlugin.LanguageDialog - + Select Language Nyelvválasztás - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. Az OpenLP nem képes megállapítani a bibliafordítás nyelvét. Kérem, válassz egy nyelvet az alábbi listából. - + Language: Nyelv: @@ -1173,85 +1279,100 @@ BiblesPlugin.MediaItem - + Quick Gyors - + Find: Keresés: - + Book: Könyv: - + Chapter: Fejezet: - + Verse: Vers: - + From: Innentől: - + To: Idáig: - + Text Search Szöveg keresése - + Second: Második: - + Scripture Reference Igehely hivatkozás - + Toggle to keep or clear the previous results. Átváltás az előző eredmény megőrzése, ill. törlése között. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Az egyes és a kettőzött bibliaversek nem kombinálhatók. Töröljük a keresési eredményt és kezdjünk egy újabbat? - + Bible not fully loaded. A biblia nem töltődött be teljesen. - + Information Információ - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. A második biblia nem tartalmaz minden verset, ami az elsőben megtalálható. Csak a mindkét bibliában fellelhető versek fognak megjelenni. Ezek a versek nem lesznek megtalálhatóak: %d. + + + Search Scripture Reference... + Igehely keresése... + + + + Search Text... + Szöveg keresése... + + + + Are you sure you want to delete "%s"? + Valóban törölhető ez: %s? + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importálás: %s %s… @@ -1260,12 +1381,12 @@ 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>... Importálás: %s %s… @@ -1274,149 +1395,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Jelölj ki egy mappát a biztonsági mentésnek - + Bible Upgrade Wizard Bibliafrissítő tündér - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. A tündér segít az OpenLP 2 korábbi verzióiból származó bibliák frissítésében. Kattints az alábbi Következő gombra a folyamat indításhoz. - + Select Backup Directory Biztonsági mentés mappája - + Please select a backup directory for your Bibles Jelölj ki egy mappát a bibliáid biztonsági mentésének - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Az OpenLP 2.0 előző verziói nem képesek a frissített bibliákat alkalmazni. Ez a tündér segít biztonsági mentést készíteni a jelenlegi bibliákról, így ha vissza kell térni az OpenLP egy régebbi verziójára, akkor ezeket csak be kell majd másolni az OpenLP adatmappájába. A helyreállítási tudnivalók a <a href="http://wiki.openlp.org/faq">Gyakran Ismételt Kérdések</a> között találhatók. - + Please select a backup location for your Bibles. Jelölj ki egy helyet a bibliáid biztonsági mentésének. - + Backup Directory: Biztonsági mentés helye: - + There is no need to backup my Bibles Nincs szükségem biztonsági másolatra - + Select Bibles Bibliák kijelölése - + Please select the Bibles to upgrade Jelöld ki a frissítendő bibliákat - + Upgrading Frissítés - + Please wait while your Bibles are upgraded. Kérlek, várj, míg a bibliák frissítés alatt állnak. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. A biztonsági mentés nem teljes. A bibliák biztonsági mentéséhez írási jogosultság szükséges a megadott mappára. - + Upgrading Bible %s of %s: "%s" Failed Biblia frissítése: %s/%s: „%s” Sikertelen - + Upgrading Bible %s of %s: "%s" Upgrading ... Biblia frissítése: %s/%s: „%s” Frissítés… - + Download Error Letöltési hiba - + To upgrade your Web Bibles an Internet connection is required. A webes bibliák frissítéséhez internet kapcsolat szükséges. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Biblia frissítése: %s/%s: „%s” Frissítés: %s … - + Upgrading Bible %s of %s: "%s" Complete Biblia frissítése: %s/%s: „%s” Teljes - + , %s failed , %s sikertelen - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Bibliák frissítése: %s teljesítve %s. Megjegyzés: a webes bibliák versei csak kérésre lesznek letöltve és ekkor is internet kapcsolat szükségeltetik. - + Upgrading Bible(s): %s successful%s Biblia frissítése: %s teljesítve %s - + Upgrade failed. A frissítés nem sikerült. - + You need to specify a backup directory for your Bibles. Meg kell adni egy könyvtárat a bibliák biztonsági mentéséhez. - + Starting upgrade... Frissítés indítása… - + There are no Bibles that need to be upgraded. Nincsenek frissítésre szoruló bibliák. @@ -1490,12 +1611,12 @@ CustomPlugin.CustomTab - + Custom Display Speciális dia megjelenése - + Display footer Lábléc megjelenítése @@ -1503,42 +1624,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Speciális diasor szerkesztése - + &Title: &Cím: - + Add a new slide at bottom. Új dia hozzáadása alulra. - + Edit the selected slide. Kijelölt dia szerkesztése. - + Edit all the slides at once. Minden kijelölt dia szerkesztése egyszerre. - + Split a slide into two by inserting a slide splitter. Dia ketté vágása egy diaelválasztó beszúrásával. - + The&me: &Téma: - + &Credits: &Közreműködők: @@ -1553,12 +1674,12 @@ Meg kell adnod legalább egy diát - + Ed&it All &Összes szerkesztése - + Insert Slide Dia beszúrása @@ -1566,7 +1687,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Valóban törölhető a kijelölt %n speciális dia? @@ -1576,60 +1697,60 @@ ImagePlugin - + <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>Kép bővítmény</strong><br />A kép a bővítmény különféle képek vetítését teszi lehetővé.<br />A bővítmény egyik különös figyelmet érdemlő képessége az, hogy képes a sorrendkezelőn csoportba foglalni a képeket, így könnyebbé téve képek tömeges vetítését. A bővítmény képes az OpenLP „időzített körkörös” lejátszásra is, amivel a diasort automatikusan tudjuk léptetni. Továbbá, a bővítményben megadott képekkel felülírhatjuk a téma háttérképét, amellyel a szöveg alapú elemek, mint pl. a dalok, a megadott háttérképpel jelennek meg, a témában beállított háttérkép helyett. - + Image name singular Kép - + Images name plural Képek - + Images container title Képek - + Load a new image. Új kép betöltése. - + Add a new image. Új kép hozzáadása. - + Edit the selected image. A kijelölt kép szerkesztése. - + Delete the selected image. A kijelölt kép törlése. - + Preview the selected image. A kijelölt kép előnézete. - + Send the selected image live. A kijelölt kép élő adásba küldése. - + Add the selected image to the service. A kijelölt kép hozzáadása a szolgálati sorrendhez. @@ -1637,7 +1758,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Melléklet kijelölése @@ -1645,44 +1766,44 @@ ImagePlugin.MediaItem - + Select Image(s) Képek kijelölése - + You must select an image to delete. - Ki kell választani egy képet a törléshez. + Ki kell jelölni egy képet a törléshez. - + You must select an image to replace the background with. - Ki kell választani egy képet a háttér cseréjéhez. + Ki kell jelölni egy képet a háttér cseréjéhez. - + Missing Image(s) Hiányzó képek - + The following image(s) no longer exist: %s A következő képek nem léteznek: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? A következő képek nem léteznek: %s Szeretnél más képeket megadni? - + There was a problem replacing your background, the image file "%s" no longer exists. Probléma történt a háttér cseréje során, a(z) „%s” kép nem létezik. - + There was no display item to amend. Nem volt módosított megjelenő elem. @@ -1690,78 +1811,78 @@ ImagesPlugin.ImageTab - + Background Color Háttérszín - + Default Color: Alapértelmezett szín: - - Provides border where image is not the correct dimensions for the screen when resized. - Keretet hoz létre a kép körül, ha a kép mérete nem passzol a képernyő arányához. + + Visible background for images with aspect ratio different to screen. + A kép mögött látható háttér eltérő képernyőarány esetén. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Média bővítmény</strong><br />A média bővítmény hangok és videók lejátszását teszi lehetővé. - + Media name singular Média - + Media name plural Média - + Media container title Média - + Load new media. Új médiafájl betöltése. - + Add new media. Új médiafájl hozzáadása. - + Edit the selected media. A kijelölt médiafájl szerkesztése. - + Delete the selected media. A kijelölt médiafájl törlése. - + Preview the selected media. A kijelölt médiafájl előnézete. - + Send the selected media live. A kijelölt médiafájl élő adásba küldése. - + Add the selected media to the service. A kijelölt médiafájl hozzáadása a szolgálati sorrendhez. @@ -1809,7 +1930,7 @@ Nem volt módosított megjelenő elem. - + Unsupported File Nem támogatott fájl @@ -1827,22 +1948,22 @@ MediaPlugin.MediaTab - + Available Media Players Elérhető médialejátszók - + %s (unavailable) %s (elérhetetlen) - + Player Order Lejátszó sorrend - + Allow media player to be overridden Lejátszó felülírásának engedélyezése @@ -1850,7 +1971,7 @@ OpenLP - + Image Files Kép fájlok @@ -1872,17 +1993,17 @@ OpenLP.AboutForm - + Credits Közreműködők - + License Licenc - + Contribute Részvétel @@ -1892,17 +2013,17 @@ %s összeépíté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. Ez egy szabad szoftver; terjeszthető illetve módosítható a GNU Általános Közreadási Feltételek dokumentumában leírtak szerint - 2. verzió -, melyet a Szabad Szoftver Alapítvány ad ki. - + 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. Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb GARANCIA NÉLKÜL, az eladhatóságra vagy valamely célra való alkalmazhatóságra való származtatott garanciát is beleértve. A további részleteket lásd alább. - + Project Lead %s @@ -2028,7 +2149,7 @@ mert Ő tett minket szabaddá. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2045,7 +2166,7 @@ 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 projektben való részvételt az alábbi gombbal. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Szerzői jog © 2004-2012 %s @@ -2055,87 +2176,87 @@ OpenLP.AdvancedTab - + UI Settings Felhasználói felület beállításai - + Number of recent files to display: Előzmények megjelenítésének hossza: - + Remember active media manager tab on startup Újraindításkor az aktív médiakezelő fülek visszaállítása - + Double-click to send items straight to live Dupla kattintással az elemek azonnali élő adásba küldése - + Expand new service items on creation A sorrendbe kerülő elemek kibontása létrehozáskor - + Enable application exit confirmation Kilépési megerősítés engedélyezése - + Mouse Cursor Egérmutató - + Hide mouse cursor when over display window Egérmutató elrejtése a vetítési képernyő felett - + Default Image Alapértelmezett kép - + Background color: Háttérszín: - + Image file: Kép fájl: - + Open File Fájl megnyitása - + Advanced Haladó - + Preview items when clicked in Media Manager Elem előnézete a médiakezelőben való kattintáskor - + Click to select a color. Kattintás a szín kijelöléséhez. - + Browse for an image file to display. Tallózd be a megjelenítendő képfájlt. - + Revert to the default OpenLP logo. Az eredeti OpenLP logó visszaállítása. @@ -2147,137 +2268,221 @@ Sorrend %Y-%m-%d %H-%M - + Default Service Name Alapértelmezett szolgálati sorrend neve - + Enable default service name Alapértelmezett szolgálati sorrend név - + Date and Time: Dátum és idő: - + Monday Hétfő - + Tuesday Kedd - + Wednesday Szerda - + Thurdsday Csütörtök - + Friday Péntek - + Saturday Szombat - + Sunday Vasárnap - + Now Most - + Time when usual service starts. A szolgálat szokásos kezdete. - + Name: Név: - + Consult the OpenLP manual for usage. Segítségéért tekints meg az OpenLP kézikönyvet. - + Revert to the default service name "%s". Alapértelmezett név helyreállítása: „%s”. - + Example: Példa: - + X11 X11 - + Bypass X11 Window Manager - X11 ablakkezelő kikerülése + X11 ablakkezelő megkerülése - + Syntax error. Szintaktikai hiba. + + + Data Location + Adatok helye + + + + Current path: + Jelenlegi útvonal: + + + + Custom path: + Egyedi útvonal: + + + + Browse for new data file location. + Tallózd be az adatállományok helyét. + + + + Set the data location to the default. + Eredeti adathely visszaállítása. + + + + Cancel + Mégsem + + + + Cancel OpenLP data directory location change. + Az OpenLP adathely-modósításának visszavonása. + + + + Copy data to new location. + Adatok másolása az új helyre. + + + + Copy the OpenLP data files to the new location. + Az OpenLP adatállományainak az új helyre való másolása. + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + <strong>FIGYELMEZTETÉS:</strong> Az új mappa már tartalmaz OpenLP adatállományokat, melyek felül lesznek írva másoláskor. + + + + Data Directory Error + Adatmappa hiba + + + + Select Data Directory Location + Adapmappa helyének kijelölése + + + + Confirm Data Directory Change + Adatmappa változásának megerősítése + + + + Reset Data Directory + Adatmappa visszaállítása + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + Valóban visszaállítható az OpenLP adatmappa az eredeti helyre? + +Az OpenLP bezárása után jut érvényre a változás. + + + + Overwrite Existing Data + Meglévő adatok felülírása + OpenLP.ExceptionDialog - + Error Occurred Hiba történt - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Hoppá! Az OpenLP hibába ütközött, és nem tudta lekezelni. Az alsó szövegdoboz olyan információkat tartalmaz, amelyek hasznosak lehetnek az OpenLP fejlesztői számára, tehát kérjük, küld el a bugs@openlp.org email címre egy részletes leírás mellett, amely tartalmazza, hogy éppen hol és mit tettél, amikor a hiba történt. - + Send E-Mail E-mail küldése - + Save to File Mentés fájlba - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Írd le mit tettél, ami a hibához vezetett (minimum 20 karakter) - + Attach File Fájl csatolása - + Description characters to enter : %s Leírás: %s @@ -2285,24 +2490,24 @@ OpenLP.ExceptionForm - + Platform: %s Platform: %s - + Save Crash Report Összeomlási jelentés mentése - + Text files (*.txt *.log *.text) Szöveg fájlok (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2333,7 +2538,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2469,17 +2674,17 @@ Alapértelmezett beállítások - + Downloading %s... Letöltés %s… - + Download complete. Click the finish button to start OpenLP. Letöltés kész. Kattints a Befejezés gombra az OpenLP indításához. - + Enabling selected plugins... Kijelölt bővítmények engedélyezése… @@ -2549,32 +2754,32 @@ A tündér segít elkezdeni az OpenLP használatát. Kattints az alábbi Következő gombra az indításhoz. - + Setting Up And Downloading Beállítás és letöltés - + Please wait while OpenLP is set up and your data is downloaded. Várj, amíg az OpenLP beállítások érvényre jutnak és míg az adatok letöltődnek. - + Setting Up Beállítás - + Click the finish button to start OpenLP. Kattints a Befejezés gombra az OpenLP indításához. - + Download complete. Click the finish button to return to OpenLP. Letöltés kész. Kattints a Befejezés gombra az OpenLP-hez való visszatéréshez. - + Click the finish button to return to OpenLP. Kattints a Befejezés gombra az OpenLP-hez való visszatéréshez. @@ -2584,11 +2789,16 @@ Speciális diák + + Finish + Befejezés + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Nem sikerült internetkapcsolatot találni. Az Első indítás tündérnek internetkapcsolatra van szüksége ahhoz, hogy a példa dalokat, bibliákat és témákat lehessen letölteni. A Befejezés gombra való kattintással az OpenLP alapértelmezett beállításokkal és a példaadatok nélkül indul el. + Nem sikerült internetkapcsolatot találni. Az Első indítás tündérnek internetkapcsolatra van szüksége ahhoz, hogy a példa dalokat, bibliákat és témákat lehessen letölteni. A Befejezés gombra való kattintással az OpenLP alapértelmezett beállításokkal és a példaadatok nélkül indul el. Az Első indítás tündér újbóli indításához és a példaadatok későbbi betöltéséhez ellenőrizd az internetkapcsolatot és futtasd újra ezt a tündért az OpenLP Eszközök > Első indítás tündér menüpontjával. @@ -2596,66 +2806,61 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. -A tündér teljes leállításához (és az OpenLP további megkerüléséhez) kattints a Mégse gombra. - - - - Finish - Befejezés +A tündér teljes leállításához (és az OpenLP bezárásához) kattints a Mégse gombra. OpenLP.FormattingTagDialog - + Configure Formatting Tags Formázó címkék beállítása - + Edit Selection Kijelölés szerkesztése - + Save Mentés - + Description Leírás - + Tag Címke - + Start tag Nyitó címke - + End tag Záró címke - + Tag Id ID - + Start HTML Nyitó HTML - + End HTML Befejező HTML @@ -2663,32 +2868,32 @@ OpenLP.FormattingTagForm - + Update Error Frissítési hiba - + Tag "n" already defined. Az „n” címke már létezik. - + New Tag Új címke - + <HTML here> <HTML itt> - + </and here> </és itt> - + Tag %s already defined. A címke már létezik: %s. @@ -2696,82 +2901,82 @@ OpenLP.FormattingTags - + Red Vörös - + Black Fekete - + Blue Kék - + Yellow Sárga - + Green Zöld - + Pink Rózsaszín - + Orange Narancs - + Purple Lila - + White Fehér - + Superscript Felső index - + Subscript Alsó index - + Paragraph Bekezdés - + Bold Félkövér - + Italics Dőlt - + Underline Aláhúzott - + Break Sortörés @@ -2779,180 +2984,170 @@ OpenLP.GeneralTab - + General Általános - + Monitors Monitorok - + Select monitor for output display: Vetítési képernyő kijelölése: - + Display if a single screen Megjelenítés egy képernyő esetén - + Application Startup Alkalmazás indítása - + Show blank screen warning Figyelmeztetés megjelenítése az elsötétített képernyőről - + Automatically open the last service Utolsó sorrend automatikus megnyitása - + Show the splash screen Indítóképernyő megjelenítése - + Application Settings Alkalmazás beállítások - + Prompt to save before starting a new service Rákérdezés mentésre új sorrend létrehozása előtt - + Automatically preview next item in service Következő elem automatikus előnézete a sorrendben - + sec mp - + CCLI Details CCLI részletek - + SongSelect username: SongSelect felhasználói név: - + SongSelect password: SongSelect jelszó: - + X X - + Y Y - + Height Magasság - + Width Szélesség - + Check for updates to OpenLP Frissítés keresése az OpenLP-hez - + Unblank display when adding new live item Képernyő elsötétítésének visszavonása új elem élő adásba küldésekor - + Timed slide interval: Időzített dia intervalluma: - + Background Audio Háttérzene - + Start background audio paused Leállított háttérzene indítása - + Service Item Slide Limits Sorrendben lévő diák határolása - - &End Slide - &Dia vége - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - A fel és le gombok vezérlése megáll a sorrendben lévő elemek tetején és alján. - - - - &Wrap Slide - &Körbe + + Override display position: + Megjelenítési pozíció felülbírálása: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - A fel és le gombok vezérlése körbeforog a sorrendben lévő elemek tetején és alján. + + Repeat track list + Számok ismétlése - - &Next Item - &Következő + + Behavior of next/previous on the last/first slide: + A következő/előző gombok viselkedése az első és az utolsó diánál: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - A fel/le nyilak vezérlése továbbugrik a sorrendben lévő elem tetején és alján az előző, ill. következő elemre. + + &Remain on Slide + &Maradjon a dián - - Override display position: - Megjelenítési pozíció felülbírálása: + + &Wrap around + &Kezdje elölről - - Repeat track list - Számok ismétlése + + &Move to next/previous service item + &Ugorjon a következő/előző szolgálati elemre 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. @@ -2968,287 +3163,287 @@ OpenLP.MainWindow - + &File &Fájl - + &Import &Importálás - + &Export &Exportálás - + &View &Nézet - + M&ode &Mód - + &Tools &Eszközök - + &Settings &Beállítások - + &Language &Nyelv - + &Help &Súgó - + Media Manager Médiakezelő - + Service Manager Sorrendkezelő - + Theme Manager Témakezelő - + &New &Új - + &Open Meg&nyitás - + Open an existing service. Meglévő sorrend megnyitása. - + &Save &Mentés - + Save the current service to disk. Aktuális sorrend mentése lemezre. - + Save &As... Mentés má&sként… - + Save Service As Sorrend mentése másként - + Save the current service under a new name. Az aktuális sorrend más néven való mentése. - + E&xit &Kilépés - + Quit OpenLP OpenLP bezárása - + &Theme &Téma - + &Configure OpenLP... OpenLP &beállítása… - + &Media Manager &Médiakezelő - + Toggle Media Manager Médiakezelő átváltása - + Toggle the visibility of the media manager. A médiakezelő láthatóságának átváltása. - + &Theme Manager &Témakezelő - + Toggle Theme Manager Témakezelő átváltása - + Toggle the visibility of the theme manager. A témakezelő láthatóságának átváltása. - + &Service Manager &Sorrendkezelő - + Toggle Service Manager Sorrendkezelő átváltása - + Toggle the visibility of the service manager. A sorrendkezelő láthatóságának átváltása. - + &Preview Panel &Előnézet panel - + Toggle Preview Panel Előnézet panel átváltása - + Toggle the visibility of the preview panel. Az előnézet panel láthatóságának átváltása. - + &Live Panel &Élő adás panel - + Toggle Live Panel Élő adás panel átváltása - + Toggle the visibility of the live panel. Az élő adás panel láthatóságának átváltása. - + &Plugin List &Bővítménylista - + List the Plugins Bővítmények listája - + &User Guide &Felhasználói kézikönyv - + &About &Névjegy - + More information about OpenLP További információ az OpenLP-ről - + &Online Help &Online súgó - + &Web Site &Weboldal - + Use the system language, if available. Rendszernyelv használata, ha elérhető. - + Set the interface language to %s A felhasználói felület nyelvének átváltása erre: %s - + Add &Tool... &Eszköz hozzáadása… - + Add an application to the list of tools. Egy alkalmazás hozzáadása az eszközök listához. - + &Default &Alapértelmezett - + Set the view mode back to the default. Nézetmód visszaállítása az alapértelmezettre. - + &Setup &Szerkesztés - + Set the view mode to Setup. Nézetmód váltása a Beállítás módra. - + &Live &Élő adás - + Set the view mode to Live. 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/. @@ -3257,108 +3452,108 @@ A legfrissebb verzió a http://openlp.org/ oldalról szerezhető be. - + OpenLP Version Updated OpenLP verziófrissítés - + OpenLP Main Display Blanked Elsötétített 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 - + English Please add the name of your language here Magyar - + Configure &Shortcuts... &Gyorsbillentyűk beállítása… - + Close OpenLP OpenLP bezárása - + Are you sure you want to close OpenLP? Valóban bezárható az OpenLP? - + Open &Data Folder... &Adatmappa megnyitása… - + Open the folder where songs, bibles and other data resides. A dalokat, bibliákat és egyéb adatokat tartalmazó mappa megnyitása. - + &Autodetect &Automatikus felismerés - + Update Theme Images Témaképek frissítése - + Update the preview images for all themes. Összes téma előnézeti képének frissítése. - + Print the current service. Az aktuális sorrend nyomtatása. - + &Recent Files &Legutóbbi fájlok - + L&ock Panels Panelek &zárolása - + Prevent the panels being moved. Megakadályozza a panelek mozgatását. - + Re-run First Time Wizard Első indítás tündér - + Re-run the First Time Wizard, importing songs, Bibles and themes. Első indítás tündér újbóli futtatása dalok, bibliák, témák importálásához. - + Re-run First Time Wizard? Újra futtatható az Első indítás tündér? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3367,43 +3562,43 @@ A tündér újbóli futtatása során megváltozhatnak az OpenLP aktuális beállításai, az alapértelmezett téma és új dalok adhatók hozzá a jelenlegi dallistákhoz. - + Clear List Clear List of recent files Lista törlése - + Clear the list of recent files. Törli a legutóbbi fájlok listáját. - + Configure &Formatting Tags... Formázó &címkék beállítása… - + Export OpenLP settings to a specified *.config file OpenLP beállításainak mentése egy meghatározott *.config fájlba - + Settings Beállítások - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Az OpenLP beállításainak betöltése egy előzőleg ezen vagy egy másik gépen exportált meghatározott *.config fájlból - + Import settings? Beállítások betöltése? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3416,45 +3611,50 @@ Hibás beállítások betöltése rendellenes működést okozhat, vagy akár az OpenLP abnormális megszakadását is. - + Open File Fájl megnyitása - + OpenLP Export Settings Files (*.conf) OpenLP beállító export fájlok (*.conf) - + Import settings Importálási beállítások - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. Az OpenLP most leáll. Az importált beállítások az OpenLP következő indításakor lépnek érvénybe. - + Export Settings File Beállító export fájl - + OpenLP Export Settings File (*.conf) OpenLP beállító export fájlok (*.conf) + + + New Data Directory Error + Új adatmappa hiba + OpenLP.Manager - + Database Error Adatbázis hiba - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3463,7 +3663,7 @@ Adatbázis: %s - + OpenLP cannot load your database. Database: %s @@ -3475,74 +3675,74 @@ OpenLP.MediaManagerItem - + No Items Selected Nincs kijelölt elem - + &Add to selected Service Item &Hozzáadás a kijelölt sorrend elemhez - + You must select one or more items to preview. Ki kell jelölni egy elemet az előnézethez. - + You must select one or more items to send live. Ki kell jelölni egy élő adásba küldendő elemet. - + You must select one or more items. Ki kell jelölni egy vagy több elemet. - + You must select an existing service item to add to. Ki kell jelölni egy sorrend elemet, amihez hozzá szeretné adni. - + Invalid Service Item Érvénytelen sorrend elem - + You must select a %s service item. Ki kell jelölni egy %s sorrend elemet. - + You must select one or more items to add. Ki kell jelölni egy vagy több elemet a hozzáadáshoz. - + No Search Results Nincs találat - + Invalid File Type Érvénytelen fájltípus - + Invalid File %s. Suffix not supported Érvénytelen fájl: %s. Az utótag nem támogatott - + &Clone &Klónozás - + Duplicate files were found on import and were ignored. Importálás közben duplikált fájl bukkant elő, figyelmet kívül lett hagyva. @@ -3550,12 +3750,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. A <lyrics> címke hiányzik. - + <verse> tag is missing. A <verse> címke hiányzik. @@ -3563,27 +3763,27 @@ OpenLP.PluginForm - + Plugin List Bővítménylista - + Plugin Details Bővítmény részletei - + Status: Állapot: - + Active Aktív - + Inactive Inaktív @@ -3606,12 +3806,12 @@ OpenLP.PrintServiceDialog - + Fit Page Oldal kitöltése - + Fit Width Szélesség kitöltése @@ -3619,7 +3819,7 @@ OpenLP.PrintServiceForm - + Options Beállítások @@ -3634,47 +3834,47 @@ Másolás HTML-ként - + Zoom In Nagyítás - + Zoom Out Kicsinyítés - + Zoom Original Eredeti nagyítás - + Other Options További beállítások - + Include slide text if available Dia szövegének beillesztése, ha elérhető - + Include service item notes Sorrend elem megjegyzéseinek beillesztése - + Include play length of media items Sorrend elem lejátszási hosszának beillesztése - + Add page break before each text item Oldaltörés hozzáadása minden szöveges elem elé - + Service Sheet Szolgálati adatlap @@ -3684,12 +3884,12 @@ Nyomtatás - + Title: Cím: - + Custom Footer Text: Egyedi lábjegyzet szöveg: @@ -3697,12 +3897,12 @@ OpenLP.ScreenList - + Screen Képernyő - + primary elsődleges @@ -3710,12 +3910,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Kezdés</strong>: %s - + <strong>Length</strong>: %s <strong>Hossz</strong>: %s @@ -3723,7 +3923,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Sorrend elemek újrarendezése @@ -3731,82 +3931,82 @@ OpenLP.ServiceManager - + Move to &top Mozgatás &felülre - + Move item to the top of the service. Elem mozgatása a sorrend elejére. - + Move &up Mozgatás f&eljebb - + Move item up one position in the service. Elem mozgatása a sorrendben eggyel feljebb. - + Move &down Mozgatás &lejjebb - + Move item down one position in the service. Elem mozgatása a sorrendben eggyel lejjebb. - + Move to &bottom Mozgatás &alulra - + Move item to the end of the service. Elem mozgatása a sorrend végére. - + &Delete From Service &Törlés a sorrendből - + Delete the selected item from the service. Kijelölt elem törlése a sorrendből. - + &Add New Item Új elem &hozzáadása - + &Add to Selected Item &Hozzáadás a kijelölt elemhez - + &Edit Item &Elem szerkesztése - + &Reorder Item Elem újra&rendezése - + &Notes &Jegyzetek - + &Change Item Theme Elem témájának &módosítása @@ -3828,112 +4028,107 @@ A fájl nem érvényes sorrend. - + 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 - + &Expand all Mind &kibontása - + Expand all the service items. Minden sorrend elem kibontása. - + &Collapse all Mind össze&csukása - + Collapse all the service items. Minden sorrend elem összecsukása. - + Open File Fájl megnyitása - + Moves the selection down the window. A kiválasztás lejjebb mozgatja az ablakot. - + Move up Mozgatás feljebb - + Moves the selection up the window. A kiválasztás feljebb mozgatja az ablakot. - + Go Live Élő adásba - + Send the selected item to Live. A kiválasztott elem élő adásba küldése. - + &Start Time &Kezdő időpont - + Show &Preview &Előnézet megjelenítése - - Show &Live - Élő &adás megjelenítése - - - + Modified Service Módosított sorrend - + The current service has been modified. Would you like to save this service? Az aktuális sorrend módosult. Szeretnéd elmenteni? - + Custom Service Notes: Egyedi szolgálati elem jegyzetek: - + Notes: Jegyzetek: - + Playing time: Lejátszási idő: - + Untitled Service Névtelen szolgálat @@ -3958,17 +4153,17 @@ Sérült fájl - + Load an existing service. Egy meglévő szolgálati sorrend betöltése. - + Save this service. Sorrend mentése. - + Select a theme for the service. Jelöljön ki egy témát a sorrendhez. @@ -3978,7 +4173,7 @@ A fájl vagy sérült vagy nem egy OpenLP 2.0 szolgálati sorrend fájl. - + Service File Missing Hiányzó sorrend fájl @@ -4002,13 +4197,23 @@ Service copy only A sorrend csak másolható + + + Error Saving File + Állománymentési hiba + + + + There was an error saving your file. + Hiba történt az állomány mentésekor. + OpenLP.ServiceNoteForm - + Service Item Notes - Sorrend elem jegyzetek + Sorrend elem jegyzet @@ -4022,67 +4227,67 @@ OpenLP.ShortcutListDialog - + Action Parancs - + Shortcut Gyorsbillentyű - + Duplicate Shortcut Azonos gyorsbillentyű - + The shortcut "%s" is already assigned to another action, please use a different shortcut. A „%s” gyorsbillentyű már foglalt. - + Alternate Alternatív - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Jelölj ki egy parancsot és kattints egyenként az egyik alul található gombra az elsődleges vagy alternatív gyorsbillentyű elfogásához. - + Default Alapértelmezett - + Custom Egyéni - + Capture shortcut. Gyorsbillentyű elfogása. - + Restore the default shortcut of this action. Az eredeti gyorsbillentyű visszaállítása. - + Restore Default Shortcuts Alapértelmezett gyorsbillentyűk visszaállítása - + Do you want to restore all shortcuts to their defaults? Valóban minden gyorsbillentyű visszaállítandó az alapértelmezettjére? - + Configure Shortcuts Gyorsbillentyűk beállítása @@ -4090,177 +4295,172 @@ OpenLP.SlideController - + Hide Elrejtés - + Go To Ugrás - + Blank Screen Képernyő elsötétítése - + Blank to Theme Elsötétítés a témára - + Show Desktop Asztal megjelenítése - + Previous Service Előző sorrend - + Next Service Következő sorrend - + Escape Item Kilépés az elemből - + Move to previous. Mozgatás az előzőre. - + Move to next. Mozgatás a következőre. - + Play Slides Diák vetítése - + Delay between slides in seconds. Diák közötti késleltetés másodpercben. - + Move to live. Élő adásba küldés. - + Add to Service. Hozzáadás a sorrendhez. - + Edit and reload song preview. Szerkesztés és az dal előnézetének újraolvasása. - + Start playing media. Médialejátszás indítása. - + Pause audio. Hang szüneteltetése. - + Pause playing media. Médialejátszás leállítása. - + Stop playing media. Médialejátszás szüneteltetése. - + Video position. Videó pozíció. - + Audio Volume. Hangerő. - + Go to "Verse" - Ugrás a versszakra + Ugrás a „versszakra” - + Go to "Chorus" - Ugrás a refrénre + Ugrás a „refrénre” - + Go to "Bridge" - Ugrás a hídra + Ugrás a „hídra” - + Go to "Pre-Chorus" - Ugrás az előrefrénre + Ugrás az „előrefrénre” - + Go to "Intro" - Ugrás a bevezetésre + Ugrás a „bevezetésre” - + Go to "Ending" - Ugrás a lezárásra + Ugrás a „lezárásra” - + Go to "Other" - Ugrás az másra + Ugrás a „másra” - + Previous Slide Előző dia - + Next Slide Következő dia - + Pause Audio Hang szüneteltetése - + Background Audio Háttérzene - - Next Track - Következő szám - - - + Go to next audio track. Ugrás a következő számra. - + Tracks Számok @@ -4336,17 +4536,17 @@ A médiaelem kezdő időpontja későbbre van állítva, mint a befejezése - + Theme Layout Téma elrendezése - + The blue box shows the main area. Kék keret jelzi a fő tartalmat. - + The red box shows the footer. Vörös keret jelzi a láblécet. @@ -4354,32 +4554,32 @@ OpenLP.ThemeForm - + Select Image Kép kijelölése - + Theme Name Missing Téma neve nincs megadva - + There is no name for this theme. Please enter one. A témának nincs neve, meg kell adni. - + Theme Name Invalid Érvénytelen téma név - + Invalid theme name. Please enter one. A téma neve érvénytelen, érvényeset kell megadni. - + (approximately %d lines per slide) (körülbelül %d sor diánként) @@ -4387,193 +4587,193 @@ OpenLP.ThemeManager - + Create a new theme. Új téma létrehozása. - + Edit Theme Téma szerkesztése - + Edit a theme. Egy téma szerkesztése. - + Delete Theme Téma törlése - + Delete a theme. Egy téma törlése. - + Import Theme Téma importálása - + Import a theme. Egy téma importálása. - + Export Theme Téma exportálása - + Export a theme. Egy téma exportálása. - + &Edit Theme Téma sz&erkesztése - + &Delete Theme Téma &törlése - + Set As &Global Default Beállítás &globális alapértelmezetté - + %s (default) %s (alapértelmezett) - + You must select a theme to edit. Ki kell jelölni egy 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. - + Theme %s is used in the %s plugin. A(z) %s témát a(z) %s bővítmény használja. - + You have not selected a theme. Nincs kijelölve 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 kijelölése - + File is not a valid theme. Nem érvényes témafájl. - + &Copy Theme Téma &másolása - + &Rename Theme Téma át&nevezése - + &Export Theme Téma e&xportálása - + You must select a theme to rename. Ki kell jelölni egy témát az átnevezéséhez. - + Rename Confirmation Átnevezési megerősítés - + Rename %s theme? A téma átnevezhető: %s? - + You must select a theme to delete. Ki kell jelölni egy témát a törléshez. - + Delete Confirmation Törlés megerősítése - + Delete %s theme? Törölhető ez a téma: %s? - + Validation Error Érvényességi hiba - + A theme with this name already exists. Ilyen fájlnéven már létezik egy téma. - + OpenLP Themes (*.theme *.otz) OpenLP témák (*.theme *.otz) - + Copy of %s Copy of <theme name> %s másolata - + Theme Already Exists A téma már létezik @@ -4581,272 +4781,272 @@ OpenLP.ThemeWizard - + Theme Wizard Téma tündér - + Welcome to the Theme Wizard Üdvözlet a téma tündérben - + Set Up Background Háttér beállítása - + Set up your theme's background according to the parameters below. A téma háttere az alábbi paraméterekkel állítható be. - + Background type: Háttér típusa: - + Solid Color Homogén szín - + Gradient Színátmenet - + Color: Szín: - + Gradient: Színátmenet: - + Horizontal Vízszintes - + Vertical Függőleges - + Circular Körkörös - + Top Left - Bottom Right Bal felső sarokból jobb alsó sarokba - + Bottom Left - Top Right Bal alsó sarokból jobb felső sarokba - + Main Area Font Details Fő tartalom betűkészlet jellemzői - + Define the font and display characteristics for the Display text A fő szöveg betűkészlete és megjelenési tulajdonságai - + Font: Betűkészlet: - + Size: Méret: - + Line Spacing: Sorköz: - + &Outline: &Körvonal: - + &Shadow: &Árnyék: - + Bold Félkövér - + Italic Dőlt - + Footer Area Font Details Lábléc betűkészlet jellemzői - + Define the font and display characteristics for the Footer text A lábléc szöveg betűkészlete és megjelenési tulajdonságai - + Text Formatting Details Szövegformázás jellemzői - + Allows additional display formatting information to be defined További megjelenési formázások - + Horizontal Align: Vízszintes igazítás: - + Left Balra zárt - + Right Jobbra zárt - + Center Középre igazított - + Output Area Locations Pozíciók - + Allows you to change and move the main and footer areas. A fő szöveg és a lábléc helyzetének mozgatása. - + &Main Area &Fő szöveg - + &Use default location &Alapértelmezett helyen - + X position: X pozíció: - + px px - + Y position: Y pozíció: - + Width: Szélesség: - + Height: Magasság: - + Use default location Alapértelmezett helyen - + Save and Preview Mentés és előnézet - + View the theme and save it replacing the current one or change the name to create a new theme A téma előnézete és mentése: egy már meglévő téma felülírható vagy egy új név megadásával új téma hozható létre - + Theme name: Téma neve: - + Edit Theme - %s Téma szerkesztése – %s - + 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. A tündér segít témákat létrehozni és módosítani. Kattints az alábbi Következő gombra a folyamat első lépésének indításhoz, a háttér beállításához. - + Transitions: Átmenetek: - + &Footer Area &Lábléc - + Starting color: Kezdő szín: - + Ending color: Befejező szín: - + Background color: Háttérszín: - + Justify Sorkizárt - + Layout Preview Elrendezés előnézete - + Transparent Átlátszó @@ -4854,47 +5054,47 @@ OpenLP.ThemesTab - + Global Theme Globális téma - + Theme Level Téma szint - + S&ong Level Dal &szint - + 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. Minden dalra az adatbázisban tárolt téma alkalmazása. Ha egy dalhoz nincs saját téma beállítva, akkor a szolgálati sorrendhez beállított alkalmazása. Ha a sorrendhez sincs téma beállítva, akkor a globális téma alkalmazása. - + &Service Level Szolgálati sorrend &szint - + 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. A szolgálati sorrendhez beállított téma alkalmazása, vagyis az egyes dalokhoz megadott témák felülírása. Ha a szolgálati sorrendhez nincs téma beállítva, akkor a globális téma alkalmazása. - + &Global Level &Globális szint - + Use the global theme, overriding any themes associated with either the service or the songs. A globális téma alkalmazása, vagyis a szolgálati sorrendhez, ill. a dalokhoz beállított témák felülírása. - + Themes Témák @@ -4978,242 +5178,242 @@ pt - + Image Kép - + Import Importálás - + Live Élő adás - + Live Background Error Élő háttér hiba - + Load Betöltés - + Middle Középre - + New Új - + New Service Új sorrend - + New Theme Új téma - + No File Selected Singular Nincs kijelölt fájl - + No Files Selected Plural Nincsenek kijelölt fájlok - + No Item Selected Singular Nincs kijelölt elem - + No Items Selected Plural Nincsenek kijelölt elemek - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Előnézet - + Replace Background Háttér cseréje - + Reset Background Háttér visszaállítása - + s The abbreviated unit for seconds mp - + Save && Preview Mentés és előnézet - + Search Keresés - + You must select an item to delete. Ki kell jelölni egy törlendő elemet. - + You must select an item to edit. Ki kell jelölni egy szerkesztendő elemet. - + Save Service Sorrend mentése - + Service Sorrendbe - + Start %s Kezdés %s - + Theme Singular Téma - + Themes Plural Témák - + Top Felülre - + Version Verzió - + Delete the selected item. Kiválasztott elem törlése. - + Move selection up one position. Kiválasztás eggyel feljebb helyezése. - + Move selection down one position. Kiválasztás eggyel lejjebb helyezése. - + &Vertical Align: &Függőleges igazítás: - + Finished import. Az importálás befejeződött. - + Format: Formátum: - + Importing Importálás - + Importing "%s"... Importálás „%s”… - + Select Import Source Jelölj ki az importálandó forrást - + Select the import format and the location to import from. Jelöld ki az importálás formátumát és az importálás helyét. - + 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. Az openlp.org 1.x importáló le lett tiltva egy hiányzó Python modul miatt. Ha szeretnéd használni ezt az importálót, telepíteni kell a „python-sqlite” modult. - + Open %s File %s fájl megnyitása - + %p% %p% - + Ready. Kész. - + Starting import... Importálás indítása… - + You need to specify at least one %s file to import from. A file type e.g. OpenSong - Ki kell választani legalább egy %s fájlt az importáláshoz. + Meg kell adni legalább egy %s fájlt az importáláshoz. @@ -5226,7 +5426,7 @@ Üdvözlet a dalexportáló tündérben - + Welcome to the Song Import Wizard Üdvözlet a dalimportáló tündérben @@ -5314,53 +5514,53 @@ ó - + Layout style: Elrendezés: - + Live Toolbar Élő eszköztár - + m The abbreviated unit for minutes p - + OpenLP is already running. Do you wish to continue? Az OpenLP mér fut. Folytatható? - + Settings Beállítások - + Tools Eszközök - + Unsupported File Nem támogatott fájl - + Verse Per Slide Egy vers diánként - + Verse Per Line Egy vers soronként - + View Nézet @@ -5375,42 +5575,37 @@ XML szintaktikai hiba - + View Mode Nézetmód - + Open service. Sorrend megnyitása. - + Print Service Szolgálati sorrend nyomtatása - + Replace live background. Élő adás hátterének cseréje. - + Reset live background. Élő adás hátterének visszaállítása. - - &Split - &Szétválasztás - - - + Split a slide into two only if it does not fit on the screen as one slide. Diák kettéválasztása csak akkor, ha nem fér ki a képernyőn egy diaként. - + Welcome to the Bible Upgrade Wizard Üdvözlet a bibliafrissítő tündérben @@ -5420,53 +5615,105 @@ Törlés megerősítése - + Play Slides in Loop Ismétlődő diavetítés - + Play Slides to End Diavetítés a végéig - + Stop Play Slides in Loop Ismétlődő vetítés megállítása - + Stop Play Slides to End Vetítés megállítása - + Next Track Következő szám + + + Search Themes... + Search bar place holder text + Témák keresése... + + + + Optional &Split + &Feltételes törés + + + + Invalid Folder Selected + Singular + Érvénytelen kijelölt mappa + + + + Invalid File Selected + Singular + Érvénytelen kijelölt állomány + + + + Invalid Files Selected + Plural + Érvénytelen kijelölt állományok + + + + No Folder Selected + Singular + Nincs kijelölt mappa + + + + Open %s Folder + %s mappa megnyitása + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + Meg kell adni egy %s fájlt az importáláshoz. + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + Meg kell adni egy %s mappát az importáláshoz. + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 és %2 - + %1, and %2 Locale list separator: end %1, és %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5475,50 +5722,50 @@ PresentationPlugin - + <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>Bemutató bővítmény</strong><br />A bemutató bővítmény különböző külső programok segítségével bemutatók megjelenítését teszi lehetővé. A prezentációs programok egy listából választhatók ki. - + Presentation name singular Bemutató - + Presentations name plural Bemutatók - + Presentations container title Bemutatók - + Load a new presentation. Új bemutató betöltése. - + Delete the selected presentation. A kijelölt bemutató törlése. - + Preview the selected presentation. A kijelölt bemutató előnézete. - + Send the selected presentation live. A kijelölt bemutató élő adásba küldése. - + Add the selected presentation to the service. A kijelölt bemutató hozzáadása a sorrendhez. @@ -5526,70 +5773,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Bemutatók kijelölése - + Automatic Automatikus - + Present using: Bemutató ezzel: - + File Exists A fájl létezik - + A presentation with that filename already exists. Ilyen fájlnéven már létezik egy bemutató. - + This type of presentation is not supported. Ez a bemutató típus nem támogatott. - + Presentations (%s) Bemutatók (%s) - + Missing Presentation Hiányzó bemutató - - The Presentation %s no longer exists. - A bemutató már nem létezik: %s. + + The presentation %s is incomplete, please reload. + A bemutató hiányos, újra kell tölteni: %s. - - The Presentation %s is incomplete, please reload. - A bemutató hiányos, újra kell tölteni: %s. + + The presentation %s no longer exists. + A bemutató már nem létezik: %s. PresentationPlugin.PresentationTab - + Available Controllers Elérhető vezérlők - + %s (unavailable) %s (elérhetetlen) - + Allow presentation application to be overridden A bemutató program felülírásának engedélyezése @@ -5623,135 +5870,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 távirányító - + OpenLP 2.0 Stage View OpenLP 2.0 színpadi nézet - + Service Manager Sorrendkezelő - + Slide Controller Diakezelő - + Alerts Értesítések - + Search Keresés - - Back - Vissza - - - + Refresh Frissítés - + Blank Elsötétítés - + Show Vetítés - + Prev Előző - + Next Következő - + Text Szöveg - + Show Alert Értesítés megjelenítése - + Go Live Élő adásba - + No Results Nincs találat - + Options Beállítások - + Add to Service Hozzáadás a sorrendhez + + + Home + Kezdőlap + + + + Theme + Téma + + + + Desktop + Asztal + + + + Add &amp; Go to Service + Hozzáadás és ugrás a sorrendre + RemotePlugin.RemoteTab - + Serve on IP address: Szolgáltatás IP címe: - + Port number: Port száma: - + Server Settings Szerver beállítások - + Remote URL: Távirányító URL: - + Stage view URL: Színpadi nézet URL: - + Display stage time in 12h format Időkijelzés a színpadi nézeten 12 órás formában - + Android App Android alkalmazás - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Szkenneld be a QR kódot vagy kattints az Android alkalmazás <a href="https://market.android.com/details?id=org.openlp.android">letöltéséhez</a> az alkalmazásboltból. @@ -5759,85 +6021,85 @@ SongUsagePlugin - + &Song Usage Tracking &Dalstatisztika rögzítése - + &Delete Tracking Data Rögzített adatok &törlése - + Delete song usage data up to a specified date. Dalstatisztika adatok törlése egy meghatározott dátumig. - + &Extract Tracking Data Rögzített adatok &kicsomagolása - + Generate a report on song usage. Dalstatisztika jelentés összeállítása. - + Toggle Tracking Rögzítés - + Toggle the tracking of song usage. Dalstatisztika rögzítésének átváltása. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Dalstatisztika bővítmény</strong><br />Ez a bővítmény rögzíti, hogy a dalok mikor lettek vetítve egy élő szolgálat vagy istentisztelet során. - + SongUsage name singular Dalstatisztika - + SongUsage name plural Dalstatisztika - + SongUsage container title Dalstatisztika - + Song Usage Dalstatisztika - + Song usage tracking is active. A dalstatisztika rögzítésre kerül. - + Song usage tracking is inactive. A dalstatisztika nincs rögzítés alatt. - + display megjelenítés - + printed nyomtatás @@ -5845,7 +6107,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Dalstatisztika adatok törlése @@ -5870,7 +6132,7 @@ Minden kért adat sikeresen törlésre került. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Ki kell választani egy dátumot, amely előtt a statisztika adatok törlése kerülnek. Minden ezelőtt rögzített adat véglegesen törlődni fog. @@ -5878,42 +6140,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Dalstatisztika kicsomagolása - + Select Date Range Időintervallum kijelölése - + to - + Report Location Helyszín jelentése - + Output File Location Kimeneti fájl elérési útvonala - + usage_detail_%s_%s.txt Dalstatisztika_%s%s.txt - + Report Creation Riport készítése - + Report %s has been successfully created. @@ -5921,12 +6183,12 @@ %s. - + Output Path Not Selected Kimeneti útvonal nincs kijelölve - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. Egy nem létező útvonalat adtál meg a dalstatisztika riporthoz. Jelölj ki egy érvényes űtvonalat a számítógépen. @@ -5964,82 +6226,82 @@ Dalok indexelése folyamatban… - + Arabic (CP-1256) Arab (CP-1256) - + Baltic (CP-1257) Balti (CP-1257) - + Central European (CP-1250) Közép-európai (CP-1250) - + Cyrillic (CP-1251) Cirill (CP-1251) - + Greek (CP-1253) Görög (CP-1253) - + Hebrew (CP-1255) Héber (CP-1255) - + Japanese (CP-932) Japán (CP-932) - + Korean (CP-949) Koreai (CP-949) - + Simplified Chinese (CP-936) Egyszerűsített kínai (CP-936) - + Thai (CP-874) Thai (CP-874) - + Traditional Chinese (CP-950) Hagyományos kínai (CP-950) - + Turkish (CP-1254) Török (CP-1254) - + Vietnam (CP-1258) Vietnami (CP-1258) - + Western European (CP-1252) Nyugat-európai (CP-1252) - + Character Encoding Karakterkódolás - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6048,26 +6310,26 @@ Általában az előre beállított érték megfelelő. - + Please choose the character encoding. The encoding is responsible for the correct character representation. Válaszd ki a karakterkódolást. A kódlap felelős a karakterek helyes megjelenítéséért. - + Song name singular Dal - + Songs name plural Dalok - + Songs container title Dalok @@ -6078,32 +6340,32 @@ Dalok exportálása a dalexportáló tündérrel. - + Add a new song. Új dal hozzáadása. - + Edit the selected song. A kijelölt dal szerkesztése. - + Delete the selected song. A kijelölt dal törlése. - + Preview the selected song. A kijelölt dal előnézete. - + Send the selected song live. A kijelölt dal élő adásba küldése. - + Add the selected song to the service. A kijelölt dal hozzáadása a sorrendhez. @@ -6131,17 +6393,17 @@ Vezetéknév: - + You need to type in the first name of the author. Meg kell adni a szerző vezetéknevét. - + You need to type in the last name of the author. Meg kell adni a szerző keresztnevét. - + You have not set a display name for the author, combine the first and last names? Nincs megadva a szerző megjelenített neve, legyen előállítva a vezeték és keresztnevéből? @@ -6172,209 +6434,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Metaadat + + + + Custom Book Names + Egyedi könyvnevek + + + SongsPlugin.EditSongForm - + Song Editor Dalszerkesztő - + &Title: &Cím: - + Alt&ernate title: &Alternatív cím: - + &Lyrics: &Dalszöveg: - + &Verse order: Versszak &sorrend: - + Ed&it All &Összes szerkesztése - + Title && Lyrics Cím és szöveg - + &Add to Song &Hozzáadás - + &Remove &Eltávolítás - + &Manage Authors, Topics, Song Books Szerző, témakör, könyv &kezelése - + A&dd to Song H&ozzáadás - + R&emove &Eltávolítás - + Book: Könyv: - + Number: Szám: - + Authors, Topics && Song Book Szerző, témakör és könyv - + New &Theme Új &téma - + Copyright Information Szerzői jogi információ - + Comments Megjegyzések - + Theme, Copyright Info && Comments Téma, © és megjegyzés - + Add Author Szerző hozzáadása - + This author does not exist, do you want to add them? Ez a szerző még nem létezik, valóban hozzá kívánja adni? - + This author is already in the list. A szerző már benne van a listában. - + 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. Nincs kijelölve egyetlen szerző sem. Vagy válassz egy szerzőt a listából, vagy írj az új szerző mezőbe és kattints a Hozzáadás gombra a szerző megjelöléséhez. - + Add Topic Témakör hozzáadása - + This topic does not exist, do you want to add it? Ez a témakör még nem létezik, szeretnéd hozzáadni? - + This topic is already in the list. A témakör már benne van a listában. - + 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. Nincs kijelölve egyetlen témakör sem. Vagy válassz egy témakört a listából, vagy írj az új témakör mezőbe és kattints a Hozzáadás gombra a témakör megjelöléséhez. - + You need to type in a song title. Add meg a dal címét. - + You need to type in at least one verse. Legalább egy versszakot meg kell adnod. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. A versszaksorrend hibás. Nincs ilyen versszak: %s. Az érvényes elemek ezek: %s. - + Add Book Könyv hozzáadása - + This song book does not exist, do you want to add it? Ez az énekeskönyv még nem létezik, szeretnéd hozzáadni a listához? - + You need to have an author for this song. Egy szerzőt meg kell adnod ehhez a dalhoz. - + You need to type some text in to the verse. Meg kell adnod a versszak szövegét. - + Linked Audio Fájl - + Add &File(s) Fájl &hozzáadása - + Add &Media &Médiafájl hozzáadása - + Remove &All Fájlok &eltávolítása - + Open File(s) Fájlok megnyitása - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Figyelmeztetés:</strong> Nincs minden verszak alkalmazva. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. A versszaksorrend hibás. Nincsenek ilyen versszakok: %s. Az érvényes elemek ezek: %s. @@ -6452,7 +6727,7 @@ You need to add at least one Song to export. - Ki kell választani legalább egy dalt az exportáláshoz. + Ki kell jelölni legalább egy dalt az exportáláshoz. @@ -6488,130 +6763,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Jelölj ki egy dokumentum vagy egy bemutató fájlokat - + Song Import Wizard Dalimportáló tündér - + 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. A tündér segít a különféle formátumú dalok importálásában. Kattints az alábbi Következő gombra a folyamat első lépésének indításhoz, a formátum kiválasztásához. - + Generic Document/Presentation Általános dokumentum vagy bemutató - - Filename: - Fájlnév: - - - - 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. - Az OpenLyrics importáló még nem lett kifejlesztve, de amint már láthatod, szándékozunk elkészíteni. Remélhetőleg a következő kiadásban már benne lesz. - - - + Add Files... Fájlok hozzáadása… - + Remove File(s) Fájlok törlése - + Please wait while your songs are imported. Kérlek, várj, míg a dalok importálás alatt állnak. - + OpenLP 2.0 Databases OpenLP 2.0 adatbázisok - + openlp.org v1.x Databases openlp.org v1.x adatbázisok - + Words Of Worship Song Files Words of Worship dal fájlok - - You need to specify at least one document or presentation file to import from. - Ki kell jelölnie legalább egy dokumentumot vagy bemutatót az importáláshoz. - - - + Songs Of Fellowship Song Files Songs Of Fellowship dal fájlok - + SongBeamer Files SongBeamer fájlok - + SongShow Plus Song Files SongShow Plus dal fájlok - + Foilpresenter Song Files Foilpresenter dal fájlok - + Copy Másolás - + Save to File Mentés fájlba - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. A Songs of Fellowship importáló le lett tiltva, mivel az OpenLP nem talál OpenOffice-t vagy LibreOffice-t a számítógépen. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Az általános dokumentum, ill. bemutató importáló le lett tiltva, mivel az OpenLP nem talál OpenOffice-t vagy LibreOffice-t a számítógépen. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics vagy OpenLP 2.0 epoxrtált dal - + OpenLyrics Files OpenLyrics fájlok + + + CCLI SongSelect Files + CCLI SongSelect fájlok + + + + EasySlides XML File + EasySlides XML fájl + + + + EasyWorship Song Database + EasyWorship dal adatbázis + + + + DreamBeam Song Files + DreamBeam dal fájlok + + + + You need to specify a valid PowerSong 1.0 database folder. + Meg kell adni egy érvényes PowerSong 1.0 adatvázis mappát. + + + + ZionWorx (CSV) + ZionWorx (CSV) + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + Előbb CSV szövegfájllá kell konvertálni a ZionWorx adatbázist a <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">Felhasználói kézikönyv</a> útmutatása szerint. + SongsPlugin.MediaFilesForm - + Select Media File(s) Médiafájlok kijelölése - + Select one or more audio files from the list below, and click OK to import them into this song. Jelölj ki egy vagy több hangfájlt az alábbi listából és kattints az OK gombra a dalba való importálásukhoz. @@ -6619,43 +6914,68 @@ SongsPlugin.MediaItem - + Titles Címek - + Lyrics Dalszöveg - + CCLI License: CCLI licenc: - + Entire Song Teljes dal - + Are you sure you want to delete the %n selected song(s)? Valóban törölhető a kijelöl %n dal? - + Maintain the lists of authors, topics and books. Szerzők, témakörök, könyvek listájának kezelése. - + copy For song cloning másolás + + + Search Titles... + Címek keresése... + + + + Search Entire Song... + Teljes dal keresése... + + + + Search Lyrics... + Dalszöveg keresése... + + + + Search Authors... + Szerzők keresése... + + + + Search Song Books... + Énekeskönyvek keresése... + SongsPlugin.OpenLP1SongImport @@ -6682,6 +7002,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + Nincsenek importálható dalok. + + + + Verses not found. Missing "PART" header. + Versszakok nem találhatók. Hiányzik a „PART” fejléc. + + + SongsPlugin.SongBookForm @@ -6720,12 +7053,12 @@ SongsPlugin.SongImport - + copyright szerzői jog - + The following songs could not be imported: A következő dalok nem importálhatók: @@ -6746,117 +7079,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Az importálás meghiúsult. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. A szerzőt nem lehet hozzáadni. - + This author already exists. Ez a szerző már létezik. - + Could not add your topic. A témakört nem lehet hozzáadni. - + This topic already exists. Ez a témakör már létezik. - + Could not add your book. A könyvet nem lehet hozzáadni. - + This book already exists. Ez a könyv már létezik. - + Could not save your changes. A módosításokat nem lehet elmenteni. - + Could not save your modified author, because the author already exists. A módosított szerzőt nem lehet elmenteni, mivel már a szerző létezik. - + Could not save your modified topic, because it already exists. A módosított témakört nem lehet elmenteni, mivel már létezik. - + Delete Author Szerző törlése - + Are you sure you want to delete the selected author? Valóban törölhető a kijelölt szerző? - + This author cannot be deleted, they are currently assigned to at least one song. Ezt a szerzőt nem lehet törölni, mivel jelenleg legalább egy dalhoz hozzá van rendelve. - + Delete Topic Témakör törlése - + Are you sure you want to delete the selected topic? Valóban törölhető a kijelölt témakör? - + This topic cannot be deleted, it is currently assigned to at least one song. Ezt a témakört nem lehet törölni, mivel jelenleg legalább egy dalhoz hozzá van rendelve. - + Delete Book Könyv törlése - + Are you sure you want to delete the selected book? Valóban törölhető a kijelölt könyv? - + This book cannot be deleted, it is currently assigned to at least one song. Ezt a könyvet nem lehet törölni, mivel jelenleg legalább egy dalhoz hozzá van rendelve. - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? Ez a szerző már létezik: %s. Szeretnéd, hogy a dal – melynek szerzője %s – a már létező szerző (%s) dalai közé kerüljön rögzítésre? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? Ez a témakör már létezik: %s. Szeretnéd, hogy a dal – melynek témaköre: %s – a már létező témakörben (%s) kerüljön rögzítésre? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? Ez a könyv már létezik: %s. Szeretnéd, hogy a dal – melynek könyve: %s – a már létező könyvben (%s) kerüljön rögzítésre? @@ -6864,29 +7189,29 @@ SongsPlugin.SongsTab - + Songs Mode Dalmód - + Enable search as you type Gépelés közbeni keresés engedélyezése - + Display verses on live tool bar Versszakok megjelenítése az élő adás eszköztáron - + Update service from song edit Sorrendben lévő példány frissítése a dal módosításakor - - Add missing songs when opening service - Hiányzó dalok hozzáadása a sorrend megnyitásakor + + Import missing songs from service files + Hiányzó dalok importálása a szolgálati fájlokból @@ -6945,4 +7270,17 @@ Más + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Hiba a CSV fájl olvasása közben. + + + + File not valid ZionWorx CSV format. + A fájl nem érvényes ZionWorx CSV formátumú. + + diff -Nru openlp-1.9.9/resources/i18n/id.ts openlp-1.9.10/resources/i18n/id.ts --- openlp-1.9.9/resources/i18n/id.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/id.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert Per&ingatan - + Show an alert message. Menampilkan pesan peringatan. - + Alert name singular Peringatan - + Alerts name plural Peringatan - + Alerts container title Peringatan - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Plugin Peringatan</strong><br>Plugin peringatan mengendalikan tampilan peringatan di layar tampilan. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Pesan Peringatan - + Alert &text: Peringatan &teks: - + &New &Baru - + &Save &Simpan - + Displ&ay &Tampilan - + Display && Cl&ose Tampilkan dan &Tutup @@ -79,7 +79,7 @@ Teks isi peringatan belum dispesifikasi. Harap masukkan teks sebelum memilih Baru. - + &Parameter: &Parameter: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Fon - + Font name: Nama fon: - + Font color: Warna fon: - + Background color: Warna latar: - + Font size: Ukuran fon: - + Alert timeout: Waktu-habis untuk peringatan: @@ -152,551 +152,596 @@ BiblesPlugin - + &Bible &Alkitab - + Bible name singular Alkitab - + Bibles name plural Alkitab - + Bibles container title Alkitab - + No Book Found Kitab Tidak Ditemukan - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Kitab tidak ditemukan dalam Alkitab ini. Periksa apakah Anda telah mengeja nama kitab dengan benar. - + Import a Bible. Impor Alkitab. - + Add a new Bible. Tambahkan Alkitab baru. - + Edit the selected Bible. Sunting Alkitab terpilih. - + Delete the selected Bible. Hapus Alkitab terpilih. - + Preview the selected Bible. Pratinjau Alkitab terpilih. - + Send the selected Bible live. Tayangkan Alkitab terpilih. - + Add the selected Bible to the service. Tambahkan Alkitab terpilih ke dalam layanan. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Plugin Alkitab</strong><br />Plugin Alkitab menyediakan kemampuan untuk menayangkan ayat Alkitab dari berbagai sumber selama layanan. - + &Upgrade older Bibles &Upgrade Alkitab lama - + Upgrade the Bible databases to the latest format. Perbarui basis data Alkitab ke format terbaru. - + Genesis - + Exodus - + Leviticus - + Numbers - + Deuteronomy - + Joshua - + Judges - + Ruth - + 1 Samuel - + 2 Samuel - + 1 Kings - + 2 Kings - + 1 Chronicles - + 2 Chronicles - + Ezra - + Nehemiah - + Esther - + Job - + Psalms - + Proverbs - + Ecclesiastes - + Song of Solomon - + Isaiah - + Jeremiah - + Lamentations - + Ezekiel - + Daniel - + Hosea - + Joel - + Amos - + Obadiah - + Jonah - + Micah - + Nahum - + Habakkuk - + Zephaniah - + Haggai - + Zechariah - + Malachi - + Matthew - + Mark - + Luke - + John - + Acts - + Romans - + 1 Corinthians - + 2 Corinthians - + Galatians - + Ephesians - + Philippians - + Colossians - + 1 Thessalonians - + 2 Thessalonians - + 1 Timothy - + 2 Timothy - + Titus - + Philemon - + Hebrews - + James - + 1 Peter - + 2 Peter - + 1 John - + 2 John - + 3 John - + Jude - + Revelation - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Anda harus menentukan nama versi untuk Alkitab Anda. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Anda harus memberikan hak cipta untuk Alkitab Anda. Alkitab di Public Domain harus ditandai sedemikian. + + + + Bible Exists + Alkitab Sudah Ada + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Alkitab sudah ada. Silakan impor Alkitab lain atau hapus yang sudah ada. + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error Referensi Kitab Suci Galat - + Web Bible cannot be used Alkitab Web tidak dapat digunakan - + Text Search is not available with Web Bibles. Pencarian teks tidak dapat dilakukan untuk Alkitab Web. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Anda tidak memasukkan kata kunci pencarian. Anda dapat memisahkan kata kunci dengan spasi untuk mencari seluruh kata kunci dan Anda dapat memisahkan kata kunci dengan koma untuk mencari salah satu kata kunci. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. TIdak ada Alkitab terpasang. Harap gunakan Wisaya Impor untuk memasang sebuah atau beberapa Alkitab. - + No Bibles Available Alkitab tidak tersedia - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -712,187 +757,179 @@ BiblesPlugin.BiblesTab - + Verse Display Tampilan Ayat - + Only show new chapter numbers Hanya tampilkan nomor pasal baru - + Bible theme: Tema Alkitab: - + No Brackets Tanpa tanda kurung - + ( And ) ( Dan ) - + { And } { Dan } - + [ And ] [ Dan ] - + Note: Changes do not affect verses already in the service. Catatan: Perubahan tidak akan mempengaruhi ayat yang kini tampil. - + Display second Bible verses Tampilkan ayat Alkitab selanjutnya - + Custom Scripture References - + Verse Separator: - + Range Separator: - + List Separator: - + End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - + + English + Inggris - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + Default Bible Language - - Bible language + + Book name language in search field, +search results and on display: - - Application language + + Bible Language - - English - Inggris - - - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language BiblesPlugin.BookNameDialog - + Select Book Name Pilih nama Kitab - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Buku ini tidak dapat dicocokkan dengan sistem. Mohon pilih nama buku tersebut dalam bahasa Inggris. - - - + Current name: Nama sekarang: - + Corresponding name: Nama yang cocok: - + Show Books From Tampilkan buku dari; - + Old Testament Perjanjian Lama - + New Testament Perjanjian Baru - + Apocrypha Apokripa + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. Anda harus memilih sebuah kitab. @@ -917,40 +954,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + Rincian Lisensi + + + + Version name: + Nama versi: + + + + Copyright: + Hak cipta: + + + + Permissions: + Izin: + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + Inggris + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Mendaftarkan Alkitab dan memuat buku... - + Registering Language... Mendaftarkan bahasa... - + Importing %s... Importing <book name>... Mengimpor %s... - + Download Error Unduhan Gagal - + 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. Ada masalah dalam mengunduh ayat yang terpilih. Mohon periksa sambungan internet Anda dan jika masalah berlanjut, pertimbangkan untuk melaporkan hal ini sebagai kutu. - + Parse Error Galat saat parsing - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Ada masalah dalam mengekstrak ayat yang terpilih. Jika masalah berlanjut, pertimbangkan untuk melaporkan hal ini sebagai kutu. @@ -1128,17 +1234,17 @@ BiblesPlugin.LanguageDialog - + Select Language Pilih Bahasa - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP tidak dapat menentukan bahasa untuk terjemahan Alkitab ini. Mohon pilih bahasa dari daftar di bawah. - + Language: Bahasa: @@ -1154,85 +1260,100 @@ BiblesPlugin.MediaItem - + Quick Cepat - + Find: Temukan: - + Book: Kitab: - + Chapter: Pasal: - + Verse: Ayat: - + From: Dari: - + To: Kepada: - + Text Search Pencarian Teks - + Second: Kedua: - + Scripture Reference Referensi Alkitab - + Toggle to keep or clear the previous results. Ganti untuk menyimpan atau menghapus hasil sebelumnya. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Tidak dapat menggabungkan hasil pencarian ayat. Ingin menghapus hasil pencarian dan mulai pencarian baru? - + Bible not fully loaded. Alkitab belum termuat seluruhnya. - + Information Informasi - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. Alkitab kedua tidak memiliki seluruh ayat yang ada di Alkitab utama. Hanya ayat yang ditemukan di kedua Alkitab yang akan ditampilkan. %d ayat tidak terlihat di hasil. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Mengimpor %s %s... @@ -1241,12 +1362,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Mendeteksi pengodean (mungkin butuh beberapa menit)... - + Importing %s %s... Importing <book name> <chapter>... Mengimpor %s %s... @@ -1255,149 +1376,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Pilih direktori cadangan - + Bible Upgrade Wizard Wisaya Upgrade Alkitab - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Wisaya ini akan membantu ada mengupgrade Alkitab yang tersedia. Klik tombol selanjutnya untuk memulai proses upgrade. - + Select Backup Directory Pilih Direktori Pencadangan - + Please select a backup directory for your Bibles Mohon pilih direktori pencadangan untuk Alkitab Anda - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Rilis sebelumnya dari OpenLP 2.0 tidak dapat menggunakan Alkitab termutakhirkan. Langkah ini akan membuat sebuah cadangan untuk seluruh Alkitab Anda sehingga Anda tinggal menyalin berkas-berkas ke direktori data OpenLP jika Anda perlu kembali ke rilis sebelumnya dari OpenLP. Silakan lihat <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. Mohon pilh sebuah lokasi pencadangan untuk Alkitab Anda. - + Backup Directory: Direktori Pencadangan: - + There is no need to backup my Bibles Tidak perlu membuat cadangan Alkitab - + Select Bibles Pilih Alkitab - + Please select the Bibles to upgrade Mohon pilih Alkitab untuk dimutakhirkan - + Upgrading Memutakhirkan - + Please wait while your Bibles are upgraded. Mohon tunggu sementara Alkitab sedang diperbarui. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. Pencadangan gagal. Untuk mencadangkan Alkitab Anda perlu izin untuk menulis di direktori terpilih. - + Upgrading Bible %s of %s: "%s" Failed Pemutakhiran Alkitab %s dari %s: "%s" Gagal - + Upgrading Bible %s of %s: "%s" Upgrading ... Pemutakhiran Alkitab %s dari %s: "%s" Memutakhirkan ... - + Download Error Unduhan Gagal - + To upgrade your Web Bibles an Internet connection is required. Untuk memutakhirkan Alkitab Web, koneksi internet dibutuhkan. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Memutakhirkan Alkitab %s dari %s: "%s" Memutakhirkan %s ... - + Upgrading Bible %s of %s: "%s" Complete Perbaruan Alkitab %s dari %s: "%s" Selesai - + , %s failed , %s gagal - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Perbaruan Alkitab: %s sukses%s Perhatikan bahwa ayat dari Alkitab Web akan diunduh saat diminta dan sambungan internet dibutuhkan. - + Upgrading Bible(s): %s successful%s Pemutakhiran Alkitab: %s berhasil%s - + Upgrade failed. Pemutakhirkan gagal. - + You need to specify a backup directory for your Bibles. Anda harus membuat sebuah direktori pencadangan untuk Alkitab Anda. - + Starting upgrade... Memulai perbaruan... - + There are no Bibles that need to be upgraded. Tidak ada Alkitab yang perlu diperbarui. @@ -1471,12 +1592,12 @@ CustomPlugin.CustomTab - + Custom Display Tampilan Suai - + Display footer Catatan kaki tampilan @@ -1484,42 +1605,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Sunting Tampilan Suai - + &Title: &Judul: - + Add a new slide at bottom. Tambahkan slide baru di bawah. - + Edit the selected slide. Sunting slide terpilih. - + Edit all the slides at once. Sunting seluruh slide bersamaan. - + Split a slide into two by inserting a slide splitter. Pecah slide menjadi dua menggunakan pemecah slide. - + The&me: Te&ma: - + &Credits: &Kredit: @@ -1534,12 +1655,12 @@ Anda harus menambah paling sedikit satu salindia - + Ed&it All Sun&ting Semua - + Insert Slide Tampilan Suai @@ -1547,7 +1668,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1557,60 +1678,60 @@ ImagePlugin - + <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 Gambar</strong><br />Plugin gambar memungkinkan penayangan gambar.<br />Salah satu keunggulan fitur ini adalah kemampuan untuk menggabungkan beberapa gambar pada Service Manager, yang menjadikan penayangan beberapa gambar mudah. Plugin ini juga dapat menggunakan "perulangan terwaktu" dari OpenLP untuk membuat slide show yang berjalan otomatis. Juga, gambar dari plugin dapat digunakan untuk menggantikan latar tema. - + Image name singular Gambar - + Images name plural Gambar - + Images container title Gambar - + Load a new image. Muat gambar baru. - + Add a new image. Tambah gambar baru. - + Edit the selected image. Sunting gambar terpilih. - + Delete the selected image. Hapus gambar terpilih. - + Preview the selected image. Pratayang gambar terpilih. - + Send the selected image live. Tayangkan gambar terpilih. - + Add the selected image to the service. Tambahkan gambar terpilih ke layanan. @@ -1618,7 +1739,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Pilih Lampiran @@ -1626,44 +1747,44 @@ ImagePlugin.MediaItem - + Select Image(s) Pilih Gambar - + You must select an image to delete. Pilih sebuah gambar untuk dihapus. - + You must select an image to replace the background with. Pilih sebuah gambar untuk menggantikan latar. - + Missing Image(s) Gambar Tidak Ditemukan - + The following image(s) no longer exist: %s Gambar berikut tidak ada lagi: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? Gambar berikut tidak ada lagi: %s Ingin tetap menambah gambar lain? - + There was a problem replacing your background, the image file "%s" no longer exists. Ada masalah dalam mengganti latar, berkas gambar "%s" tidak ada lagi. - + There was no display item to amend. Tidak ada butir tampilan untuk di-amend. @@ -1671,78 +1792,78 @@ ImagesPlugin.ImageTab - + Background Color Warna Latar - + Default Color: Warna Bawaan: - - Provides border where image is not the correct dimensions for the screen when resized. - Memberi batas untuk gambar yang berbeda dimensi saat layar diubah-ukur. + + Visible background for images with aspect ratio different to screen. + MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Media Plugin</strong><br />Media plugin mampu memutar audio dan video. - + Media name singular Media - + Media name plural Media - + Media container title Media - + Load new media. Muat media baru. - + Add new media. Tambah media baru. - + Edit the selected media. Sunting media terpilih. - + Delete the selected media. Hapus media terpilih. - + Preview the selected media. Pratinjau media terpilih. - + Send the selected media live. Tayangkan media terpilih. - + Add the selected media to the service. Tambahkan media terpilih ke layanan. @@ -1790,7 +1911,7 @@ Tidak ada butir tayangan untuk di-amend. - + Unsupported File Berkas Tidak Didukung @@ -1808,22 +1929,22 @@ MediaPlugin.MediaTab - + Available Media Players - + %s (unavailable) - + Player Order - + Allow media player to be overridden @@ -1831,7 +1952,7 @@ OpenLP - + Image Files Berkas Gambar @@ -1853,17 +1974,17 @@ OpenLP.AboutForm - + Credits Kredit - + License Lisensi - + Contribute Berkontribusi @@ -1873,17 +1994,17 @@ build %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. Program ini adalah perangkat lunak gratis; Anda dapat meredistribusikannya dan/atau memodifikasinya di bawah syarat-syarat GNU General Public License yang dikeluarkan Free Software Foundation; Lisensi versi 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. Program ini didistribusikan dengan harapan dapat berguna, namun TANPA GARANSI; bahkan tanpa garansi implisit dalam PEMBELIAN maupun KETEPATAN TUJUAN TERTENTU. Lihat di bawah untuk detail lengkap. - + Project Lead %s @@ -2009,7 +2130,7 @@ Dia telah membebaskan kita. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2026,7 +2147,7 @@ OpenLP dibuat dan dipelihara oleh relawan. Jika Anda ingin melihat lebih banyak piranti lunak Kristen dikerjakan, mohon pertimbangkan untuk berkontribusi melalui tombol di bawah ini. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s @@ -2035,229 +2156,311 @@ OpenLP.AdvancedTab - + UI Settings Pengaturan Antarmuka - + Number of recent files to display: Jumlah berkas anyar untuk ditampilkan: - + Remember active media manager tab on startup Ingat tab media manager yang aktif saat mulai - + Double-click to send items straight to live Klik-ganda untuk menayangkan butir terpilih - + Expand new service items on creation Tampilkan benda service saat dibuat - + Enable application exit confirmation Gunakan konfirmasi aplikasi keluar - + Mouse Cursor Kursor Tetikus - + Hide mouse cursor when over display window Sembunyikan kursor tetikus saat melewati jendela tampilan - + Default Image Gambar bawaan - + Background color: Warna latar: - + Image file: Berkas gambar: - + Open File Buka Berkas - + Advanced Lanjutan - + Preview items when clicked in Media Manager Pratayang barang saat diklik pada Media Manager - - Click to select a color. - Klik untuk memilih warna. + + Click to select a color. + Klik untuk memilih warna. + + + + Browse for an image file to display. + Ramban sebuah gambar untuk ditayangkan. + + + + Revert to the default OpenLP logo. + Balikkan ke logo OpenLP bawaan. + + + + Service %Y-%m-%d %H-%M + This may not contain any of the following characters: /\?*|<>[]":+ +See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + + + + Default Service Name + + + + + Enable default service name + + + + + Date and Time: + + + + + Monday + + + + + Tuesday + + + + + Wednesday + + + + + Thurdsday + + + + + Friday + + + + + Saturday + + + + + Sunday + + + + + Now + + + + + Time when usual service starts. + + + + + Name: + - - Browse for an image file to display. - Ramban sebuah gambar untuk ditayangkan. + + Consult the OpenLP manual for usage. + - - Revert to the default OpenLP logo. - Balikkan ke logo OpenLP bawaan. + + Revert to the default service name "%s". + - - Service %Y-%m-%d %H-%M - This may not contain any of the following characters: /\?*|<>[]":+ -See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + Example: - - Default Service Name + + X11 - - Enable default service name + + Bypass X11 Window Manager - - Date and Time: + + Syntax error. - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday + + Cancel - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred Galat Terjadi - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Aduh! OpenLP mengalami masalah yang tidak dapat diatasi. Teks di kotak bawah mengandung informasi yang membantu pengembang OpenLP, jadi tolong surelkan ini ke bugs@openlp.org, bersama dengan deskripsi detail apa yang Anda lakukan saat masalah terjadi. - + Send E-Mail Kirim Surel - + Save to File Simpan menjadi Berkas - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Mohon masukkan deskripsi apa yang Anda lakukan saat galat terjadi (Paling sedikit 20 karakter) - + Attach File Lampirkan Berkas - + Description characters to enter : %s Karakter deskripsi untuk dimasukkan: %s @@ -2265,24 +2468,24 @@ OpenLP.ExceptionForm - + Platform: %s Platform: %s - + Save Crash Report Simpan Laporan Crash - + Text files (*.txt *.log *.text) File teks (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2313,7 +2516,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2449,17 +2652,17 @@ Pengaturan Bawaan - + Downloading %s... Mengunduh %s... - + Download complete. Click the finish button to start OpenLP. Unduhan selesai. Klik tombol selesai untuk memulai OpenLP. - + Enabling selected plugins... Mengaktifkan plugin terpilih... @@ -2529,32 +2732,32 @@ Wisaya ini akan membantu mengonfigurasi OpenLP untuk penggunaan pertama. Klik tombol di bawah untuk memulai. - + Setting Up And Downloading Persiapan dan Pengunduhan - + Please wait while OpenLP is set up and your data is downloaded. Mohon tunggu selama OpenLP dipersiapkan dan data Anda diunduh. - + Setting Up Persiapan - + Click the finish button to start OpenLP. Klik tombol selesai untuk memulai OpenLP. - + Download complete. Click the finish button to return to OpenLP. Unduhan selesai. Klik tombol selesai untuk kembali ke OpenLP. - + Click the finish button to return to OpenLP. Klik tombol selesai untuk kembali ke OpenLP. @@ -2564,78 +2767,74 @@ Salindia Suai + + Finish + Selesai + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Sambungan internet tidak ditemukan. Wisaya Kali Pertama butuh sambungan internet untuk mengunduh contoh lagu, Alkitab, dan tema. Tekan tombol Selesai untuk memulai OpenLP dengan pengaturan bawaan dan tanpa contoh data. - -Untuk menjalankan lagi Wisaya Kali Pertama dan mengimpor contoh data ini lain kali, periksa sambungan internet dan jalankan wisaya ini melalui "Kakas/Jalankan Wisaya Pertama Kali" dari OpenLP. + -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - -Untuk membatalkan Wisaya Pertama Kali sepenuhnya (dan tidak memulai OpenLP), tekan Batal. - - - - Finish - Selesai +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. + OpenLP.FormattingTagDialog - + Configure Formatting Tags Konfigurasi Label Pemformatan - + Edit Selection Sunting pilihan - + Save Simpan - + Description Deskripsi - + Tag Label - + Start tag Label awal - + End tag Label akhir - + Tag Id ID Label - + Start HTML Mulai HTML - + End HTML Akhiri HTML @@ -2643,32 +2842,32 @@ OpenLP.FormattingTagForm - + Update Error Galat dalam Memperbarui - + Tag "n" already defined. Label "n" sudah terdefinisi. - + New Tag Label baru - + <HTML here> <HTML di sini> - + </and here> </dan sini> - + Tag %s already defined. Label %s telah terdefinisi. @@ -2676,82 +2875,82 @@ OpenLP.FormattingTags - + Red Merah - + Black Hitam - + Blue Biru - + Yellow Kuning - + Green Hijau - + Pink Merah Muda - + Orange Jingga - + Purple Ungu - + White Putih - + Superscript Tulis-atas - + Subscript Tulis-bawah - + Paragraph Paragraf - + Bold Tebal - + Italics Miring - + Underline Garis Bawah - + Break Rehat @@ -2759,180 +2958,170 @@ OpenLP.GeneralTab - + General Umum - + Monitors Monitor - + Select monitor for output display: Pilih monitor untuk tampilan keluaran: - + Display if a single screen Tampilkan jika layar tunggal - + Application Startup Awal Mulai Aplikasi - + Show blank screen warning Tampilkan peringatan layar kosong - + Automatically open the last service Buka layanan terakhir secara otomatis - + Show the splash screen Tampilkan logo di awal - + Application Settings Pengaturan Aplikasi - + Prompt to save before starting a new service Coba simpan sebelum memulai pelayanan baru - + Automatically preview next item in service Pratinjau item selanjutnya pada sevice - + sec sec - + CCLI Details Detail CCLI - + SongSelect username: Nama pengguna SongSelect: - + SongSelect password: Sandi-lewat SongSelect: - + X X - + Y Y - + Height Tinggi - + Width Lebar - + Check for updates to OpenLP Cek pembaruan untuk OpenLP - + Unblank display when adding new live item Jangan kosongkan layar saat menambah butir tayang baru - + Timed slide interval: Selang waktu salindia: - + Background Audio Audio Latar - + Start background audio paused Mulai audio latar terjeda - + Service Item Slide Limits - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide + + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item + + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide - - Override display position: + + &Wrap around - - Repeat track list + + &Move to next/previous service item OpenLP.LanguageManager - + Language Bahasa - + Please restart OpenLP to use your new language setting. Mohon mulai ulang OpenLP untuk menggunakan pengaturan bahasa baru. @@ -2948,287 +3137,287 @@ OpenLP.MainWindow - + &File &Berkas - + &Import &Impor - + &Export &Ekspor - + &View &Lihat - + M&ode M&ode - + &Tools &Kakas - + &Settings &Pengaturan - + &Language &Bahasa - + &Help Bantua&n - + Media Manager Manajer Media - + Service Manager Manajer Layanan - + Theme Manager Manajer Tema - + &New &Baru - + &Open &Buka - + Open an existing service. Buka layanan yang ada. - + &Save &Simpan - + Save the current service to disk. Menyimpan layanan aktif ke dalam diska. - + Save &As... Simp&an Sebagai... - + Save Service As Simpan Layanan Sebagai - + Save the current service under a new name. Menyimpan layanan aktif dengan nama baru. - + E&xit Kelua&r - + Quit OpenLP Keluar dari OpenLP - + &Theme &Tema - + &Configure OpenLP... &Konfigurasi OpenLP... - + &Media Manager Manajer &Media - + Toggle Media Manager Ganti Manajer Media - + Toggle the visibility of the media manager. Mengganti kenampakan manajer media. - + &Theme Manager Manajer &Tema - + Toggle Theme Manager Ganti Manajer Tema - + Toggle the visibility of the theme manager. Mengganti kenampakan manajer tema. - + &Service Manager Manajer &Layanan - + Toggle Service Manager Ganti Manajer Layanan - + Toggle the visibility of the service manager. Mengganti kenampakan manajer layanan. - + &Preview Panel Panel &Pratinjau - + Toggle Preview Panel Ganti Panel Pratinjau - + Toggle the visibility of the preview panel. Ganti kenampakan panel pratinjau. - + &Live Panel Pane&l Tayang - + Toggle Live Panel Ganti Panel Tayang - + Toggle the visibility of the live panel. Mengganti kenampakan panel tayang. - + &Plugin List Daftar &Plugin - + List the Plugins Melihat daftar Plugin - + &User Guide T&untunan Pengguna - + &About Tent&ang - + More information about OpenLP Informasi lebih lanjut tentang OpenLP - + &Online Help Bantuan &Daring - + &Web Site Situs &Web - + Use the system language, if available. Gunakan bahasa sistem, jika ada. - + Set the interface language to %s Ubah bahasa antarmuka menjadi %s - + Add &Tool... Tambahkan Ala&t... - + Add an application to the list of tools. Tambahkan aplikasi ke daftar alat. - + &Default &Bawaan - + Set the view mode back to the default. Ubah mode tampilan ke bawaan. - + &Setup &Persiapan - + Set the view mode to Setup. Pasang mode tampilan ke Persiapan. - + &Live &Tayang - + Set the view mode to Live. Pasang mode tampilan ke Tayang. - + 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/. @@ -3237,108 +3426,108 @@ Versi terbaru dapat diunduh dari http://openlp.org/. - + OpenLP Version Updated Versi OpenLP Terbarui - + OpenLP Main Display Blanked Tampilan Utama OpenLP Kosong - + The Main Display has been blanked out Tampilan Utama telah dikosongkan - + Default Theme: %s Tema Bawaan: %s - + English Please add the name of your language here Inggris - + Configure &Shortcuts... Atur &Pintasan... - + Close OpenLP Tutup OpenLP - + Are you sure you want to close OpenLP? Yakin ingin menutup OpenLP? - + Open &Data Folder... Buka Folder &Data... - + Open the folder where songs, bibles and other data resides. Buka folder tempat lagu, Alkitab, dan data lain disimpan. - + &Autodetect &Autodeteksi - + Update Theme Images Perbarui Gambar Tema - + Update the preview images for all themes. Perbarui gambar pratinjau untuk semua tema. - + Print the current service. Cetak layanan saat ini. - + &Recent Files Be&rkas Baru-baru Ini - + L&ock Panels Kunci Pane&l - + Prevent the panels being moved. Hindari panel digerakkan. - + Re-run First Time Wizard Jalankan Wisaya Kali Pertama - + Re-run the First Time Wizard, importing songs, Bibles and themes. Jalankan Wisaya Kali Pertama, mengimpor lagu, Alkitab, dan tema. - + Re-run First Time Wizard? Jalankan Wisaya Kali Pertama? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3347,43 +3536,43 @@ Menjalankan wisaya ini mungkin akan mengubah konfigurasi OpenLP saat ini dan mungkin menambah lagu ke dalam daftar lagu dan mengubah tema bawaan. - + Clear List Clear List of recent files Bersihkan Daftar - + Clear the list of recent files. Bersihkan daftar berkas baru-baru ini. - + Configure &Formatting Tags... Konfigurasi Label Pem&formatan... - + Export OpenLP settings to a specified *.config file Ekspor pengaturan OpenLP ke dalam sebuah berkas *.config - + Settings Pengaturan - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Impor pengaturan OpenLP dari sebuah berkas *.config yang telah diekspor - + Import settings? Impor pengaturan? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3392,52 +3581,57 @@ - + Open File Buka Berkas - + OpenLP Export Settings Files (*.conf) - + Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File - + OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s - + OpenLP cannot load your database. Database: %s @@ -3447,73 +3641,73 @@ OpenLP.MediaManagerItem - + No Items Selected Tidak Ada Barang yang Terpilih - + &Add to selected Service Item T&ambahkan ke dalam Butir Layanan - + You must select one or more items to preview. Anda harus memilih satu atau beberapa butir untuk dipratilik. - + You must select one or more items to send live. Anda harus memilih satu atau beberapa butir untuk ditayangkan. - + You must select one or more items. Anda harus memilih satu atau beberapa butir. - + You must select an existing service item to add to. Anda harus memilih butir layanan yang ada untuk ditambahkan. - + Invalid Service Item Butir Layanan Tidak Sahih - + You must select a %s service item. Anda harus memilih sebuah butir layanan %s. - + You must select one or more items to add. - + No Search Results - + Invalid File Type - + Invalid File %s. Suffix not supported - + &Clone - + Duplicate files were found on import and were ignored. @@ -3521,12 +3715,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <verse> tag is missing. @@ -3534,27 +3728,27 @@ OpenLP.PluginForm - + Plugin List Daftar Plugin - + Plugin Details Detail Plugin - + Status: Status: - + Active Aktif - + Inactive Tidak Aktif @@ -3577,12 +3771,12 @@ OpenLP.PrintServiceDialog - + Fit Page Samakan dengan Halaman - + Fit Width Samakan dengan Lebar @@ -3590,7 +3784,7 @@ OpenLP.PrintServiceForm - + Options Pilihan @@ -3605,47 +3799,47 @@ Salin sebagai HTML - + Zoom In Perbesar - + Zoom Out Perkecil - + Zoom Original Kembalikan Ukuran - + Other Options Pilihan Lain - + Include slide text if available Masukkan teks dari salindia jika tersedia - + Include service item notes Masukkan catatan butir layanan - + Include play length of media items Masukkan lama putar butir media - + Add page break before each text item Tambahkan pemisan sebelum tiap butir teks - + Service Sheet @@ -3655,12 +3849,12 @@ - + Title: - + Custom Footer Text: @@ -3668,12 +3862,12 @@ OpenLP.ScreenList - + Screen Layar - + primary Utama @@ -3681,12 +3875,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s - + <strong>Length</strong>: %s @@ -3694,7 +3888,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Atur Ulang Butir Layanan @@ -3702,82 +3896,82 @@ OpenLP.ServiceManager - + Move to &top Pindahkan ke punc&ak - + Move item to the top of the service. Pindahkan butir ke puncak daftar layanan. - + Move &up Pindahkan ke a&tas - + Move item up one position in the service. Naikkan butir satu posisi pada daftar layanan. - + Move &down Pindahkan ke &bawah - + Move item down one position in the service. Turunkan butir satu posisi pada daftar layanan. - + Move to &bottom Pindahkan ke &kaki - + Move item to the end of the service. Pindahkan butir ke kaki daftar layanan. - + &Delete From Service Hapus &dari Layanan - + Delete the selected item from the service. Hapus butir terpilih dari layanan. - + &Add New Item T&ambahkan Butir Baru - + &Add to Selected Item T&ambahkan ke Butir Terpilih - + &Edit Item &Sunting Butir - + &Reorder Item Atu&r Ulang Butir - + &Notes Catata&n - + &Change Item Theme &Ubah Tema @@ -3799,112 +3993,107 @@ Berkas bukan layanan sahih. - + Missing Display Handler Penangan Tayang hilang - + Your item cannot be displayed as there is no handler to display it Butir tidak dapat ditayangkan karena tidak ada penangan untuk menayangkannya - + Your item cannot be displayed as the plugin required to display it is missing or inactive Butir ini tidak dapat ditampilkan karena plugin yang dibutuhkan untuk menampilkannya hilang atau tidak aktif - + &Expand all &Kembangkan semua - + Expand all the service items. Kembangkan seluruh butir layanan. - + &Collapse all K&empiskan semua - + Collapse all the service items. Kempiskan seluruh butir layanan. - + Open File Buka Berkas - + Moves the selection down the window. Gerakkan pilihan ke bawah. - + Move up Pindah atas - + Moves the selection up the window. Pindahkan pilihan ke atas jendela - + Go Live Tayangkan - + Send the selected item to Live. Tayangkan butir terpilih. - + &Start Time &Waktu Mulai - + Show &Preview Tampilkan &Pratinjau - - Show &Live - Tampi&lkan Tayang - - - + Modified Service Layanan Terubah Suai - + The current service has been modified. Would you like to save this service? Layanan saat ini telah terubah suai. Ingin menyimpan layanan ini? - + Custom Service Notes: - + Notes: - + Playing time: - + Untitled Service @@ -3929,17 +4118,17 @@ Berkas Rusak - + Load an existing service. - + Save this service. - + Select a theme for the service. @@ -3949,7 +4138,7 @@ - + Service File Missing @@ -3973,11 +4162,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes @@ -3993,67 +4192,67 @@ OpenLP.ShortcutListDialog - + Action - + Shortcut - + Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default - + Custom - + Capture shortcut. - + Restore the default shortcut of this action. - + Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts @@ -4061,177 +4260,172 @@ OpenLP.SlideController - + Hide - + Go To - + Blank Screen - + Blank to Theme - + Show Desktop - + Previous Service - + Next Service - + Escape Item - + Move to previous. - + Move to next. - + Play Slides - + Delay between slides in seconds. - + Move to live. - + Add to Service. - + Edit and reload song preview. - + Start playing media. - + Pause audio. - + Pause playing media. - + Stop playing media. - + Video position. - + Audio Volume. - + Go to "Verse" - + Go to "Chorus" - + Go to "Bridge" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" - + Previous Slide - + Next Slide - + Pause Audio - + Background Audio Audio Latar - - Next Track - - - - + Go to next audio track. - + Tracks @@ -4307,17 +4501,17 @@ - + Theme Layout - + The blue box shows the main area. - + The red box shows the footer. @@ -4325,32 +4519,32 @@ OpenLP.ThemeForm - + Select Image - + Theme Name Missing - + There is no name for this theme. Please enter one. - + Theme Name Invalid - + Invalid theme name. Please enter one. - + (approximately %d lines per slide) @@ -4358,193 +4552,193 @@ OpenLP.ThemeManager - + Create a new theme. - + Edit Theme - + Edit a theme. - + Delete Theme - + Delete a theme. - + Import Theme - + Import a theme. - + Export Theme - + Export a theme. - + &Edit Theme - + &Delete Theme - + Set As &Global Default - + %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. - + &Copy Theme - + &Rename Theme - + &Export Theme - + 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) - + Copy of %s Copy of <theme name> - + Theme Already Exists @@ -4552,272 +4746,272 @@ OpenLP.ThemeWizard - + Theme Wizard - + Welcome to the Theme Wizard - + Set Up Background - + Set up your theme's background according to the parameters below. - + Background type: - + Solid Color - + Gradient - + Color: - + Gradient: - + Horizontal - + Vertical - + Circular - + Top Left - Bottom Right - + Bottom Left - Top Right - + Main Area Font Details - + Define the font and display characteristics for the Display text - + Font: - + Size: - + Line Spacing: - + &Outline: - + &Shadow: - + Bold Tebal - + Italic - + Footer Area Font Details - + Define the font and display characteristics for the Footer text - + Text Formatting Details - + Allows additional display formatting information to be defined - + Horizontal Align: - + Left - + Right - + Center - + Output Area Locations - + Allows you to change and move the main and footer areas. - + &Main Area - + &Use default location - + X position: - + px - + Y position: - + Width: - + Height: - + Use default location - + Save and Preview - + View the theme and save it replacing the current one or change the name to create a new theme - + Theme name: - + Edit Theme - %s - + 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: - + &Footer Area - + Starting color: - + Ending color: - + Background color: Warna latar: - + Justify - + Layout Preview - + Transparent @@ -4825,47 +5019,47 @@ OpenLP.ThemesTab - + Global Theme - + Theme Level - + S&ong Level - + 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 - + 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. - + &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. - + Themes @@ -4949,239 +5143,239 @@ - + Image Gambar - + Import - + Live Tayang - + Live Background Error - + Load - + Middle - + New - + New Service - + New Theme - + No File Selected Singular - + No Files Selected Plural - + No Item Selected Singular - + No Items Selected Plural Tidak Ada Barang yang Terpilih - + openlp.org 1.x - + OpenLP 2.0 - + Preview - + Replace Background - + Reset 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 - + Theme Singular - + Themes Plural - + Top - + Version - + Delete the selected item. - + Move selection up one position. - + Move selection down one position. - + &Vertical Align: - + Finished import. - + Format: - + Importing - + Importing "%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. - + Open %s File - + %p% - + Ready. - + Starting import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong @@ -5197,7 +5391,7 @@ - + Welcome to the Song Import Wizard @@ -5285,53 +5479,53 @@ - + Layout style: - + Live Toolbar - + m The abbreviated unit for minutes - + OpenLP is already running. Do you wish to continue? - + Settings Pengaturan - + Tools - + Unsupported File Berkas Tidak Didukung - + Verse Per Slide - + Verse Per Line - + View @@ -5346,42 +5540,37 @@ - + View Mode - + Open service. - + Print Service - + Replace live background. - + Reset live background. - - &Split - - - - + Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard @@ -5391,53 +5580,105 @@ - + Play Slides in Loop - + Play Slides to End - + Stop Play Slides in Loop - + Stop Play Slides to End - + Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1, and %2 Locale list separator: end - + %1, %2 Locale list separator: middle - + %1, %2 Locale list separator: start @@ -5446,50 +5687,50 @@ PresentationPlugin - + <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. - + Presentation name singular - + Presentations name plural Presentasi - + Presentations container title Presentasi - + Load a new presentation. - + Delete the selected presentation. - + Preview the selected presentation. - + Send the selected presentation live. - + Add the selected presentation to the service. @@ -5497,70 +5738,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) - + Automatic Otomatis - + Present using: - + File Exists - + A presentation with that filename already exists. - + This type of presentation is not supported. - + Presentations (%s) - + Missing Presentation - - The Presentation %s no longer exists. + + The presentation %s is incomplete, please reload. - - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers - + %s (unavailable) - + Allow presentation application to be overridden @@ -5594,135 +5835,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote - + OpenLP 2.0 Stage View - + Service Manager Manajer Layanan - + Slide Controller - + Alerts Peringatan - - Search - - - - Back + Search - + Refresh - + Blank - + Show - + Prev - + Next - + Text - + Show Alert - + Go Live Tayangkan - + No Results - + Options Pilihan - + Add to Service + + + Home + + + + + Theme + + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: - + Port number: - + Server Settings - + Remote URL: - + Stage view URL: - + Display stage time in 12h format - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5730,85 +5986,85 @@ SongUsagePlugin - + &Song Usage Tracking - + &Delete Tracking Data - + Delete song usage data up to a specified date. - + &Extract Tracking Data - + Generate a report on song usage. - + Toggle Tracking - + Toggle the tracking of song usage. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - + SongUsage name singular - + SongUsage name plural - + SongUsage container title - + Song Usage - + Song usage tracking is active. - + Song usage tracking is inactive. - + display - + printed @@ -5816,7 +6072,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data @@ -5841,7 +6097,7 @@ - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5849,54 +6105,54 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction - + Select Date Range - + to - + Report Location - + Output File Location - + usage_detail_%s_%s.txt - + Report Creation - + Report %s has been successfully created. - + Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5934,107 +6190,107 @@ - + Arabic (CP-1256) - + Baltic (CP-1257) - + Central European (CP-1250) - + Cyrillic (CP-1251) - + Greek (CP-1253) - + Hebrew (CP-1255) - + Japanese (CP-932) - + Korean (CP-949) - + Simplified Chinese (CP-936) - + Thai (CP-874) - + Traditional Chinese (CP-950) - + Turkish (CP-1254) - + Vietnam (CP-1258) - + Western European (CP-1252) - + Character Encoding - + 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. - + Song name singular - + Songs name plural Lagu - + Songs container title Lagu @@ -6045,32 +6301,32 @@ - + 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. @@ -6098,17 +6354,17 @@ - + You need to type in the first name of the author. - + You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? @@ -6137,209 +6393,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor - + &Title: &Judul: - + Alt&ernate title: - + &Lyrics: - + &Verse order: - + Ed&it All Sun&ting Semua - + Title && Lyrics - + &Add to Song - + &Remove - + &Manage Authors, Topics, Song Books - + A&dd to Song - + R&emove - + Book: Kitab: - + Number: - + Authors, Topics && Song Book - + New &Theme - + Copyright Information - + Comments - + Theme, Copyright Info && Comments - + Add Author - + This author does not exist, do you want to add them? - + This author is already in the list. - + 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. - + Add Topic - + This topic does not exist, do you want to add it? - + This topic is already in the list. - + 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. - + You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book - + This song book does not exist, do you want to add it? - + You need to have an author for this song. - + You need to type some text in to the verse. - + Linked Audio - + Add &File(s) - + Add &Media - + Remove &All - + Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6453,130 +6722,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files - + 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. - + Generic Document/Presentation - - Filename: - - - - - 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. - - - - + Add Files... - + Remove File(s) - + Please wait while your songs are imported. - + OpenLP 2.0 Databases - + openlp.org v1.x Databases - + Words Of Worship Song Files - - You need to specify at least one document or presentation file to import from. - - - - + Songs Of Fellowship Song Files - + SongBeamer Files - + SongShow Plus Song Files - + Foilpresenter Song Files - + Copy Salin - + Save to File Simpan menjadi Berkas - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. @@ -6584,43 +6873,68 @@ SongsPlugin.MediaItem - + Titles - + Lyrics - + CCLI License: - + Entire Song - + Are you sure you want to delete the %n selected song(s)? - + Maintain the lists of authors, topics and books. - + copy For song cloning + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6647,6 +6961,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6685,12 +7012,12 @@ SongsPlugin.SongImport - + copyright - + The following songs could not be imported: @@ -6711,117 +7038,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. - + This author already exists. - + Could not add your topic. - + This topic already exists. - + Could not add your book. - + This book already exists. - + Could not save your changes. - + Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. - + Delete Author - + Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic - + Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book - + Are you sure you want to delete the selected book? - + 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? - + 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? @@ -6829,28 +7148,28 @@ SongsPlugin.SongsTab - + Songs Mode - + Enable search as you type - + Display verses on live tool bar - + Update service from song edit - - Add missing songs when opening service + + Import missing songs from service files @@ -6910,4 +7229,17 @@ Lainnya + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/it.ts openlp-1.9.10/resources/i18n/it.ts --- openlp-1.9.9/resources/i18n/it.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/it.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Avviso - + Show an alert message. Mostra un messaggio di avviso. - + Alert name singular Avviso - + Alerts name plural Avvisi - + Alerts container title Avvisi - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Plugin di Avvisi</strong><br />Il plugin di allarme controlla la visualizzazione di avvisi sul display. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Messaggio di avviso - + Alert &text: Avviso &testo: - + &New &Nuovo - + &Save &Salva - + Displ&ay Visualiz&za - + Display && Cl&ose Visualizza && Ch&iudi @@ -79,7 +79,7 @@ Non è stato specificato alcun testo per l'avviso. Si prega di digitare un testo prima di cliccare su Nuovo. - + &Parameter: &Parametro: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Carattere - + Font name: Nome del Carattere - + Font color: Colore del Carattere - + Background color: Colore di sfondo: - + Font size: Dimensione Carattere: - + Alert timeout: Avviso Timeout: @@ -152,551 +152,596 @@ BiblesPlugin - + &Bible &Bibbia - + Bible name singular Bibbia - + Bibles name plural Bibbie - + Bibles container title Bibbie - + No Book Found Nessun libro trovato - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Nessun libro analogo può essere trovato in questa Bibbia. Verificare di aver digitato il nome del libro in modo corretto. - + Import a Bible. Importa una Bibbia. - + Add a new Bible. Aggiungi una nuova Bibbia. - + Edit the selected Bible. Modifica la Bibbia selezionata. - + Delete the selected Bible. Cancella la Bibbia selezionata - + Preview the selected Bible. Anteprima della Bibbia selezionata. - + Send the selected Bible live. Invia la Bibbia selezionata dal vivo. - + Add the selected Bible to the service. Aggiungi la Bibbia selezionata al servizio. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Bibbia Plugin</strong><br />Il plugin della Bibbia offre la possibilità di visualizzare i versetti della Bibbia da fonti diverse durante il servizio. - + &Upgrade older Bibles &Aggiornamento vecchie Bibbie - + Upgrade the Bible databases to the latest format. Aggiorna i database della Bibbia al formato più recente. - + Genesis - + Exodus - + Leviticus - + Numbers - + Deuteronomy - + Joshua - + Judges - + Ruth - + 1 Samuel - + 2 Samuel - + 1 Kings - + 2 Kings - + 1 Chronicles - + 2 Chronicles - + Ezra - + Nehemiah - + Esther - + Job - + Psalms - + Proverbs - + Ecclesiastes - + Song of Solomon - + Isaiah - + Jeremiah - + Lamentations - + Ezekiel - + Daniel - + Hosea - + Joel - + Amos - + Obadiah - + Jonah - + Micah - + Nahum - + Habakkuk - + Zephaniah - + Haggai - + Zechariah - + Malachi - + Matthew - + Mark - + Luke - + John - + Acts - + Romans - + 1 Corinthians - + 2 Corinthians - + Galatians - + Ephesians - + Philippians - + Colossians - + 1 Thessalonians - + 2 Thessalonians - + 1 Timothy - + 2 Timothy - + Titus - + Philemon - + Hebrews - + James - + 1 Peter - + 2 Peter - + 1 John - + 2 John - + 3 John - + Jude - + Revelation - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + + + + + Bible Exists + + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error Errore di Riferimento nella Scrittura - + Web Bible cannot be used La Bibbia nel Web non può essere utilizzato - + Text Search is not available with Web Bibles. Cerca testo non è disponibile con La Bibbia sul Web. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Non hai inserito una parola chiave di ricerca. ⏎ È possibile separare parole chiave diverse da uno spazio per la ricerca di tutte le parole chiave e si possono separare con una virgola per la ricerca di uno di loro. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Non ci sono Bibbie attualmente installati. Si prega di utilizzare l'importazione guidata per installare uno o più Bibbie. - + No Bibles Available Bibbia non disponibile - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -712,187 +757,179 @@ BiblesPlugin.BiblesTab - + Verse Display Visualizza Versetto - + Only show new chapter numbers Mostra solo i numeri del nuovo capitolo - + Bible theme: Tema della Bibbia - + No Brackets Senza Parentesi Quadre - + ( And ) (E) - + { And } {E} - + [ And ] [E] - + Note: Changes do not affect verses already in the service. Nota: ⏎ Le modifiche non influiscono i versetti già nel servizio. - + Display second Bible verses Visualizza i Secondi versetti della Bibbia - + Custom Scripture References - + Verse Separator: - + Range Separator: - + List Separator: - + End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + English - - Bible language + + Default Bible Language - - Application language + + Book name language in search field, +search results and on display: - - English + + Bible Language - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language BiblesPlugin.BookNameDialog - + Select Book Name Seleziona il Nome del Libro - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Il nome del seguente libro non può essere abbinato fino internamente. Si prega di selezionare il nome corrispondente in inglese dalla lista. - - - + Current name: Nome Attuale: - + Corresponding name: Nome corrispondente: - + Show Books From Mostra i Libri da - + Old Testament Vecchio Testamento - + New Testament Nuovo Testamento - + Apocrypha Libri Apocrifi + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. È necessario selezionare un libro. @@ -917,40 +954,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + Dettaglio Licenza + + + + Version name: + Nome Versione: + + + + Copyright: + Copyright: + + + + Permissions: + + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registrazione della Bibbia e caricamento dei libri... - + Registering Language... Registrazione Lingua... - + Importing %s... Importing <book name>... Importazione %s... - + Download Error Errore di Download - + 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. C'è stato un problema nel scaricare il versetto selezionato. Si prega di verificare la connessione internet, se questo errore persiste considera di segnalarlo. - + Parse Error Errore di interpretazione - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. C'è stato un problema di estrazione del versetto selezionato. Se questo errore persiste ti prego di segnalarlo. @@ -1127,17 +1233,17 @@ BiblesPlugin.LanguageDialog - + Select Language - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - + Language: @@ -1153,85 +1259,100 @@ BiblesPlugin.MediaItem - + Quick - + Find: - + Book: - + Chapter: - + Verse: - + From: - + To: - + Text Search - + Second: - + Scripture Reference - + Toggle to keep or clear the previous results. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. - + Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -1240,12 +1361,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1254,143 +1375,143 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory - + Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory - + Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. - + Backup Directory: - + There is no need to backup my Bibles - + Select Bibles - + Please select the Bibles to upgrade - + Upgrading - + Please wait while your Bibles are upgraded. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. - + Upgrading Bible %s of %s: "%s" Failed - + Upgrading Bible %s of %s: "%s" Upgrading ... - + Download Error Errore di Download - + To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... - + Upgrading Bible %s of %s: "%s" Complete - + , %s failed - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s - + Upgrade failed. - + You need to specify a backup directory for your Bibles. - + Starting upgrade... - + There are no Bibles that need to be upgraded. @@ -1464,12 +1585,12 @@ CustomPlugin.CustomTab - + Custom Display - + Display footer @@ -1477,42 +1598,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides - + &Title: - + Add a new slide at bottom. - + Edit the selected slide. - + Edit all the slides at once. - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -1527,12 +1648,12 @@ - + Ed&it All - + Insert Slide @@ -1540,7 +1661,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1551,60 +1672,60 @@ ImagePlugin - + <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. - + Image name singular - + Images name plural - + Images container title - + Load a new image. - + Add a new image. - + Edit the selected image. - + Delete the selected image. - + Preview the selected image. - + Send the selected image live. - + Add the selected image to the service. @@ -1612,7 +1733,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment @@ -1620,43 +1741,43 @@ ImagePlugin.MediaItem - + Select Image(s) - + You must select an image to delete. - + You must select an image to replace the background with. - + Missing Image(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? - + There was a problem replacing your background, the image file "%s" no longer exists. - + There was no display item to amend. @@ -1664,78 +1785,78 @@ ImagesPlugin.ImageTab - + Background Color - + Default Color: - - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - + Media name singular - + Media name plural - + Media container title - + Load new media. - + Add new media. - + Edit the selected media. - + Delete the selected media. - + Preview the selected media. - + Send the selected media live. - + Add the selected media to the service. @@ -1783,7 +1904,7 @@ - + Unsupported File @@ -1801,22 +1922,22 @@ MediaPlugin.MediaTab - + Available Media Players - + %s (unavailable) - + Player Order - + Allow media player to be overridden @@ -1824,7 +1945,7 @@ OpenLP - + Image Files @@ -1844,17 +1965,17 @@ OpenLP.AboutForm - + Credits - + License - + Contribute @@ -1864,17 +1985,17 @@ - + 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 @@ -1939,7 +2060,7 @@ - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -1950,7 +2071,7 @@ - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s @@ -1959,228 +2080,310 @@ OpenLP.AdvancedTab - + UI Settings - + Number of recent files to display: - + Remember active media manager tab on startup - + Double-click to send items straight to live - + Expand new service items on creation - + Enable application exit confirmation - + Mouse Cursor - + Hide mouse cursor when over display window - + Default Image - + Background color: Colore di sfondo: - - Image file: + + Image file: + + + + + Open File + + + + + Advanced + + + + + Preview items when clicked in Media Manager + + + + + Click to select a color. + + + + + Browse for an image file to display. + + + + + Revert to the default OpenLP logo. + + + + + Service %Y-%m-%d %H-%M + This may not contain any of the following characters: /\?*|<>[]":+ +See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + + + + Default Service Name + + + + + Enable default service name + + + + + Date and Time: + + + + + Monday + + + + + Tuesday + + + + + Wednesday + + + + + Thurdsday + + + + + Friday + + + + + Saturday - - Open File + + Sunday - - Advanced + + Now - - Preview items when clicked in Media Manager + + Time when usual service starts. - - Click to select a color. + + Name: - - Browse for an image file to display. + + Consult the OpenLP manual for usage. - - Revert to the default OpenLP logo. + + Revert to the default service name "%s". - - Service %Y-%m-%d %H-%M - This may not contain any of the following characters: /\?*|<>[]":+ -See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + Example: - - Default Service Name + + X11 - - Enable default service name + + Bypass X11 Window Manager - - Date and Time: + + Syntax error. - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday + + Cancel - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. - + Send E-Mail - + Save to File - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) - + Attach File - + Description characters to enter : %s @@ -2188,23 +2391,23 @@ OpenLP.ExceptionForm - + Platform: %s - + Save Crash Report - + Text files (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2222,7 +2425,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2345,17 +2548,17 @@ - + Downloading %s... - + Download complete. Click the finish button to start OpenLP. - + Enabling selected plugins... @@ -2425,32 +2628,32 @@ - + Setting Up And Downloading - + Please wait while OpenLP is set up and your data is downloaded. - + Setting Up - + Click the finish button to start OpenLP. - + Download complete. Click the finish button to return to OpenLP. - + Click the finish button to return to OpenLP. @@ -2460,8 +2663,13 @@ + + Finish + + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2470,64 +2678,59 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - - - - Finish +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. OpenLP.FormattingTagDialog - + Configure Formatting Tags - + Edit Selection - + Save - + Description - + Tag - + Start tag - + End tag - + Tag Id - + Start HTML - + End HTML @@ -2535,32 +2738,32 @@ OpenLP.FormattingTagForm - + Update Error - + Tag "n" already defined. - + New Tag - + <HTML here> - + </and here> - + Tag %s already defined. @@ -2568,82 +2771,82 @@ OpenLP.FormattingTags - + Red - + Black - + Blue - + Yellow - + Green - + Pink - + Orange - + Purple - + White - + Superscript - + Subscript - + Paragraph - + Bold - + Italics - + Underline - + Break @@ -2651,180 +2854,170 @@ OpenLP.GeneralTab - + General - + Monitors - + Select monitor for output display: - + Display if a single screen - + Application Startup - + Show blank screen warning - + Automatically open the last service - + Show the splash screen - + Application Settings - + Prompt to save before starting a new service - + Automatically preview next item in service - + sec - + CCLI Details - + SongSelect username: - + SongSelect password: - + X - + Y - + Height - + Width - + Check for updates to OpenLP - + Unblank display when adding new live item - + Timed slide interval: - + Background Audio - + Start background audio paused - + Service Item Slide Limits - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide + + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item + + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide - - Override display position: + + &Wrap around - - Repeat track list + + &Move to next/previous service item OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -2840,438 +3033,438 @@ OpenLP.MainWindow - + &File - + &Import - + &Export - + &View - + M&ode - + &Tools - + &Settings - + &Language - + &Help - + Media Manager - + Service Manager - + Theme Manager - + &New &Nuovo - + &Open - + Open an existing service. - + &Save &Salva - + Save the current service to disk. - + Save &As... - + Save Service As - + Save the current service under a new name. - + E&xit - + Quit OpenLP - + &Theme - + &Configure OpenLP... - + &Media Manager - + Toggle Media Manager - + Toggle the visibility of the media manager. - + &Theme Manager - + Toggle Theme Manager - + Toggle the visibility of the theme manager. - + &Service Manager - + Toggle Service Manager - + Toggle the visibility of the service manager. - + &Preview Panel - + Toggle Preview Panel - + Toggle the visibility of the preview panel. - + &Live Panel - + Toggle Live Panel - + Toggle the visibility of the live panel. - + &Plugin List - + List the Plugins - + &User Guide - + &About - + More information about OpenLP - + &Online Help - + &Web Site - + Use the system language, if available. - + Set the interface language to %s - + Add &Tool... - + Add an application to the list of tools. - + &Default - + Set the view mode back to the default. - + &Setup - + Set the view mode to Setup. - + &Live - + 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/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s - + English Please add the name of your language here - + Configure &Shortcuts... - + Close OpenLP - + Are you sure you want to close OpenLP? - + Open &Data Folder... - + Open the folder where songs, bibles and other data resides. - + &Autodetect - + Update Theme Images - + Update the preview images for all themes. - + Print the current service. - + &Recent Files - + L&ock Panels - + Prevent the panels being moved. - + Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files - + Clear the list of recent files. - + Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file - + Settings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3280,52 +3473,57 @@ - + Open File - + OpenLP Export Settings Files (*.conf) - + Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File - + OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s - + OpenLP cannot load your database. Database: %s @@ -3335,73 +3533,73 @@ OpenLP.MediaManagerItem - + No Items Selected - + &Add to selected Service Item - + You must select one or more items to preview. - + You must select one or more items to send live. - + You must select one or more items. - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. - + You must select one or more items to add. - + No Search Results - + Invalid File Type - + Invalid File %s. Suffix not supported - + &Clone - + Duplicate files were found on import and were ignored. @@ -3409,12 +3607,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <verse> tag is missing. @@ -3422,27 +3620,27 @@ OpenLP.PluginForm - + Plugin List - + Plugin Details - + Status: - + Active - + Inactive @@ -3465,12 +3663,12 @@ OpenLP.PrintServiceDialog - + Fit Page - + Fit Width @@ -3478,7 +3676,7 @@ OpenLP.PrintServiceForm - + Options @@ -3493,47 +3691,47 @@ - + Zoom In - + Zoom Out - + Zoom Original - + Other Options - + Include slide text if available - + Include service item notes - + Include play length of media items - + Add page break before each text item - + Service Sheet @@ -3543,12 +3741,12 @@ - + Title: - + Custom Footer Text: @@ -3556,12 +3754,12 @@ OpenLP.ScreenList - + Screen - + primary @@ -3569,12 +3767,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s - + <strong>Length</strong>: %s @@ -3582,7 +3780,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item @@ -3590,82 +3788,82 @@ OpenLP.ServiceManager - + Move to &top - + Move item to the top of the service. - + Move &up - + Move item up one position in the service. - + Move &down - + Move item down one position in the service. - + Move to &bottom - + Move item to the end of the service. - + &Delete From Service - + Delete the selected item from the service. - + &Add New Item - + &Add to Selected Item - + &Edit Item - + &Reorder Item - + &Notes - + &Change Item Theme @@ -3686,112 +3884,107 @@ - + 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 - + &Expand all - + Expand all the service items. - + &Collapse all - + Collapse all the service items. - + Open File - + Moves the selection down the window. - + Move up - + Moves the selection up the window. - + Go Live - + Send the selected item to Live. - + &Start Time - - Show &Preview - - - - Show &Live + Show &Preview - + Modified Service - + The current service has been modified. Would you like to save this service? - + Custom Service Notes: - + Notes: - + Playing time: - + Untitled Service @@ -3816,17 +4009,17 @@ - + Load an existing service. - + Save this service. - + Select a theme for the service. @@ -3836,7 +4029,7 @@ - + Service File Missing @@ -3860,11 +4053,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes @@ -3880,67 +4083,67 @@ OpenLP.ShortcutListDialog - + Action - + Shortcut - + Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default - + Custom - + Capture shortcut. - + Restore the default shortcut of this action. - + Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts @@ -3948,177 +4151,172 @@ OpenLP.SlideController - + Hide - + Go To - + Blank Screen - + Blank to Theme - + Show Desktop - + Previous Service - + Next Service - + Escape Item - + Move to previous. - + Move to next. - + Play Slides - + Delay between slides in seconds. - + Move to live. - + Add to Service. - + Edit and reload song preview. - + Start playing media. - + Pause audio. - + Pause playing media. - + Stop playing media. - + Video position. - + Audio Volume. - + Go to "Verse" - + Go to "Chorus" - + Go to "Bridge" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" - + Previous Slide - + Next Slide - + Pause Audio - + Background Audio - - Next Track - - - - + Go to next audio track. - + Tracks @@ -4194,17 +4392,17 @@ - + Theme Layout - + The blue box shows the main area. - + The red box shows the footer. @@ -4212,32 +4410,32 @@ OpenLP.ThemeForm - + Select Image - + Theme Name Missing - + There is no name for this theme. Please enter one. - + Theme Name Invalid - + Invalid theme name. Please enter one. - + (approximately %d lines per slide) @@ -4245,193 +4443,193 @@ OpenLP.ThemeManager - + Create a new theme. - + Edit Theme - + Edit a theme. - + Delete Theme - + Delete a theme. - + Import Theme - + Import a theme. - + Export Theme - + Export a theme. - + &Edit Theme - + &Delete Theme - + Set As &Global Default - + %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. - + &Copy Theme - + &Rename Theme - + &Export Theme - + 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) - + Copy of %s Copy of <theme name> - + Theme Already Exists @@ -4439,272 +4637,272 @@ OpenLP.ThemeWizard - + Theme Wizard - + Welcome to the Theme Wizard - + Set Up Background - + Set up your theme's background according to the parameters below. - + Background type: - + Solid Color - + Gradient - + Color: - + Gradient: - + Horizontal - + Vertical - + Circular - + Top Left - Bottom Right - + Bottom Left - Top Right - + Main Area Font Details - + Define the font and display characteristics for the Display text - + Font: - + Size: - + Line Spacing: - + &Outline: - + &Shadow: - + Bold - + Italic - + Footer Area Font Details - + Define the font and display characteristics for the Footer text - + Text Formatting Details - + Allows additional display formatting information to be defined - + Horizontal Align: - + Left - + Right - + Center - + Output Area Locations - + Allows you to change and move the main and footer areas. - + &Main Area - + &Use default location - + X position: - + px - + Y position: - + Width: - + Height: - + Use default location - + Save and Preview - + View the theme and save it replacing the current one or change the name to create a new theme - + Theme name: - + Edit Theme - %s - + 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: - + &Footer Area - + Starting color: - + Ending color: - + Background color: Colore di sfondo: - + Justify - + Layout Preview - + Transparent @@ -4712,47 +4910,47 @@ OpenLP.ThemesTab - + Global Theme - + Theme Level - + S&ong Level - + 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 - + 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. - + &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. - + Themes @@ -4836,239 +5034,239 @@ - + Image - + Import - + Live - + Live Background Error - + 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 - + Preview - + Replace Background - + Reset 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 - + Theme Singular - + Themes Plural - + Top - + Version - + Delete the selected item. - + Move selection up one position. - + Move selection down one position. - + &Vertical Align: - + Finished import. - + Format: - + Importing - + Importing "%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. - + Open %s File - + %p% - + Ready. - + Starting import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong @@ -5084,7 +5282,7 @@ - + Welcome to the Song Import Wizard @@ -5172,53 +5370,53 @@ - + Layout style: - + Live Toolbar - + m The abbreviated unit for minutes - + OpenLP is already running. Do you wish to continue? - + Settings - + Tools - + Unsupported File - + Verse Per Slide - + Verse Per Line - + View @@ -5233,42 +5431,37 @@ - + View Mode - + Open service. - + Print Service - + Replace live background. - + Reset live background. - - &Split - - - - + Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard @@ -5278,53 +5471,105 @@ - + Play Slides in Loop - + Play Slides to End - + Stop Play Slides in Loop - + Stop Play Slides to End - + Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1, and %2 Locale list separator: end - + %1, %2 Locale list separator: middle - + %1, %2 Locale list separator: start @@ -5333,50 +5578,50 @@ PresentationPlugin - + <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. - + Presentation name singular - + Presentations name plural - + Presentations container title - + Load a new presentation. - + Delete the selected presentation. - + Preview the selected presentation. - + Send the selected presentation live. - + Add the selected presentation to the service. @@ -5384,70 +5629,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) - + Automatic - + Present using: - + File Exists - + A presentation with that filename already exists. - + This type of presentation is not supported. - + Presentations (%s) - + Missing Presentation - - The Presentation %s no longer exists. + + The presentation %s is incomplete, please reload. - - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers - + %s (unavailable) - + Allow presentation application to be overridden @@ -5481,135 +5726,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote - + OpenLP 2.0 Stage View - + Service Manager - + Slide Controller - + Alerts Avvisi - - Search - - - - Back + Search - + Refresh - + Blank - + Show - + Prev - + Next - + Text - + Show Alert - + Go Live - + No Results - + Options - + Add to Service + + + Home + + + + + Theme + + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: - + Port number: - + Server Settings - + Remote URL: - + Stage view URL: - + Display stage time in 12h format - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5617,85 +5877,85 @@ SongUsagePlugin - + &Song Usage Tracking - + &Delete Tracking Data - + Delete song usage data up to a specified date. - + &Extract Tracking Data - + Generate a report on song usage. - + Toggle Tracking - + Toggle the tracking of song usage. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - + SongUsage name singular - + SongUsage name plural - + SongUsage container title - + Song Usage - + Song usage tracking is active. - + Song usage tracking is inactive. - + display - + printed @@ -5703,7 +5963,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data @@ -5728,7 +5988,7 @@ - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5736,54 +5996,54 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction - + Select Date Range - + to - + Report Location - + Output File Location - + usage_detail_%s_%s.txt - + Report Creation - + Report %s has been successfully created. - + Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5821,107 +6081,107 @@ - + Arabic (CP-1256) - + Baltic (CP-1257) - + Central European (CP-1250) - + Cyrillic (CP-1251) - + Greek (CP-1253) - + Hebrew (CP-1255) - + Japanese (CP-932) - + Korean (CP-949) - + Simplified Chinese (CP-936) - + Thai (CP-874) - + Traditional Chinese (CP-950) - + Turkish (CP-1254) - + Vietnam (CP-1258) - + Western European (CP-1252) - + Character Encoding - + 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. - + Song name singular - + Songs name plural - + Songs container title @@ -5932,32 +6192,32 @@ - + 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. @@ -5985,17 +6245,17 @@ - + You need to type in the first name of the author. - + You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? @@ -6024,209 +6284,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor - + &Title: - + Alt&ernate title: - + &Lyrics: - + &Verse order: - + Ed&it All - + Title && Lyrics - + &Add to Song - + &Remove - + &Manage Authors, Topics, Song Books - + A&dd to Song - + R&emove - + Book: - + Number: - + Authors, Topics && Song Book - + New &Theme - + Copyright Information - + Comments - + Theme, Copyright Info && Comments - + Add Author - + This author does not exist, do you want to add them? - + This author is already in the list. - + 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. - + Add Topic - + This topic does not exist, do you want to add it? - + This topic is already in the list. - + 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. - + You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book - + This song book does not exist, do you want to add it? - + You need to have an author for this song. - + You need to type some text in to the verse. - + Linked Audio - + Add &File(s) - + Add &Media - + Remove &All - + Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6340,130 +6613,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files - + 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. - + Generic Document/Presentation - - Filename: - - - - - 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. - - - - + Add Files... - + Remove File(s) - + Please wait while your songs are imported. - + OpenLP 2.0 Databases - + openlp.org v1.x Databases - + Words Of Worship Song Files - - You need to specify at least one document or presentation file to import from. - - - - + Songs Of Fellowship Song Files - + SongBeamer Files - + SongShow Plus Song Files - + Foilpresenter Song Files - + Copy - + Save to File - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. @@ -6471,27 +6764,27 @@ SongsPlugin.MediaItem - + Titles - + Lyrics - + CCLI License: - + Entire Song - + Are you sure you want to delete the %n selected song(s)? @@ -6499,16 +6792,41 @@ - + Maintain the lists of authors, topics and books. - + copy For song cloning + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6535,6 +6853,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6573,12 +6904,12 @@ SongsPlugin.SongImport - + copyright - + The following songs could not be imported: @@ -6599,117 +6930,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. - + This author already exists. - + Could not add your topic. - + This topic already exists. - + Could not add your book. - + This book already exists. - + Could not save your changes. - + Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. - + Delete Author - + Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic - + Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book - + Are you sure you want to delete the selected book? - + 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? - + 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? @@ -6717,28 +7040,28 @@ SongsPlugin.SongsTab - + Songs Mode - + Enable search as you type - + Display verses on live tool bar - + Update service from song edit - - Add missing songs when opening service + + Import missing songs from service files @@ -6798,4 +7121,17 @@ + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/ja.ts openlp-1.9.10/resources/i18n/ja.ts --- openlp-1.9.9/resources/i18n/ja.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/ja.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert 警告(&A) - + Show an alert message. - 警告メッセージを表示 + 警告メッセージを表示します。 - + Alert name singular 警告 - + Alerts name plural 警告 - + Alerts container title 警告 - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>警告プラグイン</strong><br />警告プラグインは、画面への警告の表示を制御します。 @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message 警告メッセージ - + Alert &text: 警告テキスト(&T): - + &New 新規作成(&N) - + &Save 保存(&S) - + Displ&ay 表示(&A) - + Display && Cl&ose 表示して閉じる(&O) @@ -79,7 +79,7 @@ 警告テキストが何も指定されていません。新規作成をクリックする前にテキストを入力してください。 - + &Parameter: パラメータ(&P): @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font フォント - + Font name: フォント名: - + Font color: 文字色: - + Background color: 背景色: - + Font size: フォント サイズ: - + Alert timeout: 警告のタイムアウト: @@ -152,551 +152,598 @@ BiblesPlugin - + &Bible 聖書(&B) - + Bible name singular 聖書 - + Bibles name plural 聖書 - + Bibles container title 聖書 - + No Book Found 書名が見つかりません - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. 書名がこの聖書に見つかりません。書名が正しいか確認してください。 - + Import a Bible. 聖書をインポートします。 - + Add a new Bible. 新しい聖書を追加します。 - + Edit the selected Bible. 選択された聖書を編集します。 - + Delete the selected Bible. 選択された聖書を削除します。 - + Preview the selected Bible. 選択された聖書をプレビューします。 - + Send the selected Bible live. 選択された聖書をライブへ送信します。 - + Add the selected Bible to the service. 選択された聖書を礼拝プログラムに追加します。 - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>聖書プラグイン</strong><br />聖書プラグインは、礼拝プログラムで様々な訳の御言葉を表示する機能を提供します。 - + &Upgrade older Bibles 古い聖書を更新(&U) - + Upgrade the Bible databases to the latest format. 聖書データベースを最新の形式に更新します。 - + Genesis - + 創世記 - + Exodus - + 出エジプト記 - + Leviticus - + レビ記 - + Numbers - + 民数記 - + Deuteronomy - + 申命記 - + Joshua - + ヨシュア記 - + Judges - + 士師記 - + Ruth - + ルツ記 - + 1 Samuel - + サムエル記上 - + 2 Samuel - + サムエル記下 - + 1 Kings - + 列王記上 - + 2 Kings - + 列王記下 - + 1 Chronicles - + 歴代誌上 - + 2 Chronicles - + 歴代誌下 - + Ezra - + エズラ記 - + Nehemiah - + ネヘミヤ記 - + Esther - + エステル記 - + Job - + ヨブ記 - + Psalms - + 詩編 - + Proverbs - + 箴言 - + Ecclesiastes - + コヘレトの言葉 - + Song of Solomon - + 雅歌 - + Isaiah - + イザヤ書 - + Jeremiah - + エレミヤ書 - + Lamentations - + 哀歌 - + Ezekiel - + エゼキエル書 - + Daniel - + ダニエル書 - + Hosea - + ホセア書 - + Joel - + ヨエル書 - + Amos - + アモス書 - + Obadiah - + オバデヤ書 - + Jonah - + ヨナ書 - + Micah - + ミカ書 - + Nahum - + ナホム書 - + Habakkuk - + ハバクク書 - + Zephaniah - + ゼファニヤ書 - + Haggai - + ハガイ書 - + Zechariah - + ゼカリヤ書 - + Malachi - + マラキ書 - + Matthew - + マタイによる福音書 - + Mark - + マルコによる福音書 - + Luke - + ルカによる福音書 - + John - + ヨハネによる福音書 - + Acts - + 使徒言行録 - + Romans - + ローマの信徒への手紙 - + 1 Corinthians - + コリントの信徒への手紙一 - + 2 Corinthians - + コリントの信徒への手紙二 - + Galatians - + ガラテヤの信徒への手紙 - + Ephesians - + エフェソの信徒への手紙 - + Philippians - + フィリピの信徒への手紙 - + Colossians - + コロサイの信徒への手紙 - + 1 Thessalonians - + テサロニケの信徒への手紙一 - + 2 Thessalonians - + テサロニケの信徒への手紙二 - + 1 Timothy - + テモテへの手紙一 - + 2 Timothy - + テモテへの手紙二 - + Titus - + テトスへの手紙 - + Philemon - + フィレモンへの手紙 - + Hebrews - + ヘブライ人への手紙 - + James - + ヤコブの手紙 - + 1 Peter - + ペトロの手紙一 - + 2 Peter - + ペトロの手紙二 - + 1 John - + ヨハネの手紙一 - + 2 John - + ヨハネの手紙二 - + 3 John - + ヨハネの手紙三 - + Jude - + ユダの手紙 - + Revelation - + ヨハネの黙示録 - + Judith - + ユディト記 - + Wisdom - + 知恵の書 - + Tobit - + トビト記 - + Sirach - + シラ書〔集会の書〕 - + Baruch - + バルク書 - + 1 Maccabees - + マカバイ記一 - + 2 Maccabees - + マカバイ記二 - + 3 Maccabees - + マカバイ記三 - + 4 Maccabees - + マカバイ記四 - + Rest of Daniel - + ダニエル書補遺 - + Rest of Esther - + Prayer of Manasses - + マナセの祈り - + Letter of Jeremiah - + エレミヤの手紙 - + Prayer of Azariah - + Susanna - + スザンナ - + Bel - + ベル - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + 聖書のバージョン名を指定する必要があります。 + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + 聖書の著作権情報を設定する必要があります。パブリックドメインの聖書はそのようにマークされている必要があります。 + + + + Bible Exists + 聖書が存在します + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + この聖書は既に存在します。他の聖書をインポートするか、存在する聖書を削除してください。 + + + + You need to specify a book name for "%s". + 「%s」の書名を設定する必要があります。 + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + 書名「%s」は正しくありません。 +数字は最初のみに使用し、 +数字以外の文字が続く必要があります。 + + + + Duplicate Book Name + 書名が重複しています + + + + The Book Name "%s" has been entered more than once. + 書名「%s」は2回以上入力されました。 + + + BiblesPlugin.BibleManager - + Scripture Reference Error 書名章節番号エラー - + Web Bible cannot be used ウェブ聖書は使用できません - + Text Search is not available with Web Bibles. テキスト検索はウェブ聖書では利用できません。 - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. 検索キーワードが入力されていません。 複数のキーワードをスペースで区切るとすべてに該当する箇所を検索し、カンマ (,) で区切るといずれかに該当する箇所を検索します。 - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. 利用できる聖書がありません。インポート ウィザードを利用して、一つ以上の聖書をインストールしてください。 - + No Bibles Available 利用できる聖書翻訳がありません - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -706,192 +753,191 @@ Book Chapter%(verse)sVerse%(range)sVerse%(list)sChapter%(verse)sVerse%(range)sVerse Book Chapter%(verse)sVerse%(range)sChapter%(verse)sVerse Please pay attention to the appended "s" of the wildcards and refrain from translating the words inside the names in the brackets. - + 参照聖句の形式が、OpenLPにサポートされていません。以下のパターンに準拠した参照聖句である事を確認下さい。 + +書 章 +書 章%(range)s章 +書 章%(verse)s節%(range)s節 +書 章%(verse)s節%(range)s節%(list)s節%(range)s節 +書 章%(verse)s節%(range)s節%(list)s章%(verse)s節%(range)s節 +書 章%(verse)s節%(range)s章%(verse)s節 BiblesPlugin.BiblesTab - + Verse Display 聖句の表示 - + Only show new chapter numbers 初めの章番号のみを表示 - + Bible theme: 聖書のテーマ: - + No Brackets 括弧なし - + ( And ) ( と ) - + { And } { と } - + [ And ] [ と ] - + Note: Changes do not affect verses already in the service. 注意: 既に礼拝プログラムに含まれる御言葉は変更されません。 - + Display second Bible verses 2 つの聖句を表示 - + Custom Scripture References - + Verse Separator: - + 節区切: - + Range Separator: - + 範囲区切: - + List Separator: - + リスト区切: - + End Mark: - + 終了マーク - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - + + English + 日本語 - - Bible language - + + Default Bible Language + 既定の聖書言語 - - Application language + + Book name language in search field, +search results and on display: - - English - 日本語 + + Bible Language + 聖書の言語 - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - + + Application Language + アプリケーションの言語 BiblesPlugin.BookNameDialog - + Select Book Name 書名を選択 - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - 以下の書名は内部で一致しませんでした。対応する英語名を一覧から選択してください。 - - - + Current name: 現在の名前: - + Corresponding name: 対応する名前: - + Show Books From 絞込み - + Old Testament 旧約 - + New Testament 新約 - + Apocrypha 旧約聖書続編 + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. 書名を選択してください。 @@ -916,40 +962,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + 聖書エディタ + + + + License Details + ライセンスの詳細 + + + + Version name: + 訳名: + + + + Copyright: + 著作権: + + + + Permissions: + 使用許可: + + + + Default Bible Language + 既定の聖書言語 + + + + Book name language in search field, search results and on display: + + + + + Global Settings + 全体設定 + + + + Bible Language + 聖書の言語 + + + + Application Language + アプリケーションの言語 + + + + English + 日本語 + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... 聖書を登録し書名を取込み中... - + Registering Language... 言語を登録中... - + Importing %s... Importing <book name>... %s をインポート中... - + Download Error ダウンロード エラー - + 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. 選択された聖書のダウンロードに失敗しました。インターネット接続を確認し、それでもエラーが繰り返して起こる場合は、バグ報告を検討してください。 - + Parse Error 構文エラー - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. 選択された聖書の展開に失敗しました。エラーが繰り返して起こる場合は、バグ報告を検討してください。 @@ -1126,17 +1241,17 @@ BiblesPlugin.LanguageDialog - + Select Language 言語を選択 - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP はこの聖書の訳の言語を判定できませんでした。以下の一覧から言語を選択してください。 - + Language: 言語: @@ -1152,85 +1267,100 @@ BiblesPlugin.MediaItem - + Quick 高速 - + Find: 検索: - + Book: 書名: - + Chapter: 章: - + Verse: 節: - + From: 開始: - + To: 終了: - + Text Search テキスト検索 - + Second: 第二訳: - + Scripture Reference 参照聖句 - + Toggle to keep or clear the previous results. 結果を保持するか消去するかを切り替えます。 - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? 1 つの聖書と複数の聖書の検索結果の結合はできません。検索結果を削除して再検索しますか? - + Bible not fully loaded. 聖書が完全に読み込まれていません。 - + Information 情報 - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. 第二訳には検索した箇所すべてが含まれていません。両方の聖書に含まれている箇所を表示します。第 %d 節が除外されます。 + + + Search Scripture Reference... + 参照聖句を検索中... + + + + Search Text... + テキストを検索中... + + + + Are you sure you want to delete "%s"? + 「%s」を削除してよいですか? + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... %s %s をインポート中... @@ -1239,12 +1369,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... エンコーディングを検出中です (数分かかることがあります)... - + Importing %s %s... Importing <book name> <chapter>... %s %s をインポート中... @@ -1253,149 +1383,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory バックアップ ディレクトリを選択 - + Bible Upgrade Wizard 聖書更新ウィザード - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. このウィザードで、古いバージョンのOpenLP 2の聖書を更新をします。次へをクリックして、更新作業を始めてください。 - + Select Backup Directory バックアップ ディレクトリを選択 - + Please select a backup directory for your Bibles 聖書をバックアップするディレクトリを選択してください - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. OpenLP 2.0 の前のリリースでは更新した聖書を使用することができません。このウィザードでは現在の聖書のバックアップを作成するので、前のリリースを使用する必要があるときには、バックアップを OpenLP のデータ ディレクトリにコピーしてください。 - + Please select a backup location for your Bibles. 聖書をバックアップする場所を選択してください。 - + Backup Directory: バックアップ ディレクトリ: - + There is no need to backup my Bibles 聖書をバックアップしない - + Select Bibles 聖書を選択 - + Please select the Bibles to upgrade 更新する聖書を選択 - + Upgrading 更新中 - + Please wait while your Bibles are upgraded. 聖書の更新が完了するまでお待ちください。 - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. バックアップに失敗しました。 聖書をバックアップするため、指定されたディレクトリに書き込み権限があることを確認してください。 - + Upgrading Bible %s of %s: "%s" Failed 聖書の更新中(%s/%s): "%s" 失敗 - + Upgrading Bible %s of %s: "%s" Upgrading ... 聖書の更新中(%s/%s): "%s" 更新中... - + Download Error ダウンロード エラー - + To upgrade your Web Bibles an Internet connection is required. ウェブ聖書を更新するにはインターネット接続が必要です。 - + Upgrading Bible %s of %s: "%s" Upgrading %s ... 聖書を更新中(%s/%s): "%s" 更新中 %s... - + Upgrading Bible %s of %s: "%s" Complete 聖書を更新中(%s/%s): "%s" 完了 - + , %s failed , 失敗: %s - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. 聖書を更新中: 成功: %s%s ウェブ聖書の本文は必要に応じてダウンロードされるため、インターネット接続が必要なことに注意してください。 - + Upgrading Bible(s): %s successful%s 聖書を更新中: 成功: %s%s - + Upgrade failed. 更新に失敗しました。 - + You need to specify a backup directory for your Bibles. 聖書のバックアップ ディレクトリを指定する必要があります。 - + Starting upgrade... 更新を開始中... - + There are no Bibles that need to be upgraded. 更新する聖書はありません。 @@ -1469,12 +1599,12 @@ CustomPlugin.CustomTab - + Custom Display カスタム表示 - + Display footer フッターを表示 @@ -1482,42 +1612,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides カスタム スライドを編集 - + &Title: タイトル(&T): - + Add a new slide at bottom. 一番下に新規スライドを追加します。 - + Edit the selected slide. 選択されたスライドを編集します。 - + Edit all the slides at once. すべてのスライドを一度に編集します。 - + Split a slide into two by inserting a slide splitter. スライド分割機能を用い、スライドを分割します。 - + The&me: テーマ(&M): - + &Credits: クレジット(&C): @@ -1532,12 +1662,12 @@ 最低 1 枚のスライドが必要です - + Ed&it All すべて編集(&I) - + Insert Slide スライドを挿入 @@ -1545,7 +1675,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1555,60 +1685,60 @@ ImagePlugin - + <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 />礼拝プログラムで複数の画像をグループ化したり、複数の画像を簡単に表示することができます。タイムアウト ループの機能を使用してスライドショーを自動的に表示することもできます。さらに、賛美などのテキスト ベースの項目の背景を、外観テーマで指定されたものからこのプラグインの画像に変更することもできます。 - + Image name singular 画像 - + Images name plural 画像 - + Images container title 画像 - + Load a new image. 新しい画像を読み込みます。 - + Add a new image. 新しい画像を追加します。 - + Edit the selected image. 選択された画像を編集します。 - + Delete the selected image. 選択された画像を削除します。 - + Preview the selected image. 選択された画像をプレビューします。 - + Send the selected image live. 選択された画像をライブへ送信します。 - + Add the selected image to the service. 選択された画像を礼拝プログラムに追加します。 @@ -1616,7 +1746,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment 添付を選択 @@ -1624,44 +1754,44 @@ ImagePlugin.MediaItem - + Select Image(s) 画像を選択 - + You must select an image to delete. 削除する画像を選択する必要があります。 - + You must select an image to replace the background with. 背景を置換する画像を選択する必要があります。 - + Missing Image(s) 画像が見つかりません - + The following image(s) no longer exist: %s 以下の画像は存在しません: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? 以下の画像は存在しません: %s それでも他の画像を追加しますか? - + There was a problem replacing your background, the image file "%s" no longer exists. 背景を置換する際に問題が発生しました。画像ファイル "%s" が存在しません。 - + There was no display item to amend. 結合する項目がありません。 @@ -1669,78 +1799,78 @@ ImagesPlugin.ImageTab - + Background Color 背景色 - + Default Color: 既定色: - - Provides border where image is not the correct dimensions for the screen when resized. - 画像の縦横比がスクリーンと異なる場合の周囲の色を設定してください。 + + Visible background for images with aspect ratio different to screen. + MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>メディア プラグイン</strong><br />メディア プラグインは、音声や動画を再生する機能を提供します。 - + Media name singular メディア - + Media name plural メディア - + Media container title メディア - + Load new media. 新しいメディアを読み込みます。 - + Add new media. 新しいメディアを追加します。 - + Edit the selected media. 選択したメディアを編集します。 - + Delete the selected media. 選択したメディアを削除します。 - + Preview the selected media. 選択したメディアをプレビューします。 - + Send the selected media live. 選択したメディアをライブへ送ります。 - + Add the selected media to the service. 選択したメディアを礼拝プログラムに追加します。 @@ -1788,7 +1918,7 @@ 結合する項目がありません。 - + Unsupported File 無効なファイル @@ -1806,30 +1936,30 @@ MediaPlugin.MediaTab - + Available Media Players 利用可能な再生ソフト - + %s (unavailable) %s (利用不可能) - + Player Order 再生ソフトの順序 - + Allow media player to be overridden - + メディアプレーヤを上書き可能にする OpenLP - + Image Files 画像ファイル @@ -1851,17 +1981,17 @@ OpenLP.AboutForm - + Credits クレジット - + License ライセンス - + Contribute 貢献 @@ -1871,17 +2001,17 @@ ビルド %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 @@ -2008,7 +2138,7 @@ します。それは神が私たちをフリー(自由)にして下さった故です。 - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2025,96 +2155,97 @@ OpenLP は、ボランティアの手で開発保守されています。もっと多くのクリスチャンの手によるフリーのソフトウェア開発に興味がある方は、以下のボタンからどうぞ。 - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s - + 著作権 © 2004-2012 %s +追加の著作権 © 2004-2012 %s OpenLP.AdvancedTab - + UI Settings UI 設定 - + Number of recent files to display: 最近使用したファイルの表示数: - + Remember active media manager tab on startup 起動時に前回のメディア マネージャを開く - + Double-click to send items straight to live ダブル クリックで項目を直接ライブへ送信 - + Expand new service items on creation 礼拝項目の作成時に展開 - + Enable application exit confirmation アプリケーションの終了時に確認 - + Mouse Cursor マウス カーソル - + Hide mouse cursor when over display window ディスプレイ ウィンドウの上では、マウス カーソルを隠す - + Default Image 既定の画像 - + Background color: 背景色: - + Image file: 画像ファイル: - + Open File ファイルを開く - + Advanced 高度な設定 - + Preview items when clicked in Media Manager メディア マネージャでクリック時に項目をプレビュー - + Click to select a color. クリックして色を選択します。 - + Browse for an image file to display. 表示する画像ファイルを参照する。 - + Revert to the default OpenLP logo. 既定の OpenLP ロゴに戻す。 @@ -2123,140 +2254,222 @@ Service %Y-%m-%d %H-%M This may not contain any of the following characters: /\?*|<>[]":+ See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. - + Service %Y-%m-%d %H-%M - + Default Service Name - + 既定の礼拝名 - + Enable default service name - + 既定の礼拝名を有効にする - + Date and Time: - + 日付と時刻: + + + + Monday + 月曜日 + + + + Tuesday + 火曜日 + + + + Wednesday + 水曜日 + + + + Thurdsday + 木曜日 + + + + Friday + 金曜日 + + + + Saturday + 土曜日 + + + + Sunday + 日曜日 + + + + Now + 現在 + + + + Time when usual service starts. + 普段の礼拝開始時刻。 + + + + Name: + 名前: + + + + Consult the OpenLP manual for usage. + 詳細はOpenLPのマニュアルをご覧ください。 + + + + Revert to the default service name "%s". + 既定の礼拝名「%s」に戻す。 + + + + Example: + 例: + + + + X11 + X11 + + + + Bypass X11 Window Manager + X11をバイパスする + + + + Syntax error. + 構文エラー - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday - + + Cancel + キャンセル - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred エラーが発生しました - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. OpenLP は問題に直面し、復旧できませんでした。以下に表示される情報は、開発者が問題を修正するのに役立つかも知れません。bugs@openlp.org に以下のエラー メッセージと問題が発生するまでの手順を送ってください。 - + Send E-Mail メールを送信 - + Save to File ファイルに保存 - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) この問題が発生するまで何をしていたかを入力してください。 (20文字以上。お手数ですが、英語でお願いします。) - + Attach File ファイルを添付 - + Description characters to enter : %s 説明 : %s @@ -2264,24 +2477,24 @@ OpenLP.ExceptionForm - + Platform: %s プラットフォーム: %s - + Save Crash Report クラッシュ報告を保存 - + Text files (*.txt *.log *.text) テキスト ファイル (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2313,7 +2526,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2374,7 +2587,7 @@ Choose the translation you'd like to use in OpenLP. - OpenLP を利用する言語を選択 + OpenLP で利用する言語を選択してください。 @@ -2450,17 +2663,17 @@ 既定設定 - + Downloading %s... ダウンロード中 %s... - + Download complete. Click the finish button to start OpenLP. ダウンロードが完了しました。完了をクリックすると OpenLP が開始します。 - + Enabling selected plugins... 選択されたプラグインを有効にしています... @@ -2530,32 +2743,32 @@ このウィザードで、OpenLPを初めて使用する際の設定をします。次へをクリックして開始してください。 - + Setting Up And Downloading 設定とダウンロード中 - + Please wait while OpenLP is set up and your data is downloaded. OpenLPがセットアップされ、あなたのデータがインポートされるまでお待ち下さい。 - + Setting Up 設定中 - + Click the finish button to start OpenLP. 完了をクリックすると、OpenLPが開始します。 - + Download complete. Click the finish button to return to OpenLP. ダウンロードが完了しました。終了ボタンをクリックしてOpenLPを終了してください。 - + Click the finish button to return to OpenLP. 終了ボタンをクリックしてOpenLPに戻ってください。 @@ -2565,78 +2778,74 @@ カスタムスライド + + Finish + 終了 + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - インターネット接続が見つかりません。初回起動ウィザードは、サンプル賛美や聖書、テーマをダウンロードするためにインターネット接続が必要です。終了ボタンをクリックすると、サンプルデータ無しでOpenLPを開始します。 - -あとで一度初回起動ウィザードを起動してこのサンプル データをインポートするには、インターネット接続を確認して、"ツール/初回起動ウィザードの再実行"を選択してください。 + -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - -初回起動ウィザードを中止して今後も起動時に表示しないようにするには、キャンセルボタンをクリックしてください。 - - - - Finish - 終了 +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. + OpenLP.FormattingTagDialog - + Configure Formatting Tags 書式タグを設定 - + Edit Selection 選択項目を編集 - + Save 保存 - + Description 説明 - + Tag タグ - + Start tag 開始タグ - + End tag 終了タグ - + Tag Id タグID - + Start HTML 開始HTML - + End HTML 終了HTML @@ -2644,32 +2853,32 @@ OpenLP.FormattingTagForm - + Update Error 更新エラー - + Tag "n" already defined. タグ「n」は既に定義されています。 - + New Tag 新しいタグ - + <HTML here> <html here> - + </and here> </and here> - + Tag %s already defined. タグ「%s」は既に定義されています。 @@ -2677,82 +2886,82 @@ OpenLP.FormattingTags - + Red - + Black - + Blue - + Yellow - + Green - + Pink ピンク - + Orange - + Purple - + White - + Superscript 上付き - + Subscript 下付き - + Paragraph 段落 - + Bold 太字 - + Italics 斜体 - + Underline 下線 - + Break 改行 @@ -2760,180 +2969,170 @@ OpenLP.GeneralTab - + General 全般 - + Monitors モニタ - + Select monitor for output display: 画面を出力するスクリーンを選択: - + Display if a single screen スクリーンが 1 つしかなくても表示 - + Application Startup アプリケーションの起動 - + Show blank screen warning 警告中には空白の画面を表示 - + Automatically open the last service 自動的に前回の礼拝プログラムを開く - + Show the splash screen スプラッシュ スクリーンを表示 - + Application Settings アプリケーションの設定 - + Prompt to save before starting a new service 新しい礼拝プログラムを開始する前に保存を確認 - + Automatically preview next item in service 礼拝プログラム内の次の項目を自動的にプレビュー - + sec - + CCLI Details CCLI 詳細 - + SongSelect username: SongSelect ユーザ名: - + SongSelect password: SongSelect パスワード: - + X X - + Y Y - + Height 高さ - + Width - + Check for updates to OpenLP OpenLP の更新を確認 - + Unblank display when adding new live item ライブ項目の追加時にブランクを解除 - + Timed slide interval: 時間付きスライドの間隔: - + Background Audio バックグラウンド音声 - + Start background audio paused 一時停止中のバックグラウンド音声を再生 - + Service Item Slide Limits - - - - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - + 礼拝項目スライドの上限 - - &Wrap Slide - + + Override display position: + 表示位置を上書き: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item - + + Behavior of next/previous on the last/first slide: + スライドの最後/最初で次/前へ移動する動作: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - + + &Remain on Slide + 移動しない(&R) - - Override display position: - + + &Wrap around + 周回する(&W) - - Repeat track list - + + &Move to next/previous service item + 次/前の礼拝項目へ移動(&M) OpenLP.LanguageManager - + Language 言語 - + Please restart OpenLP to use your new language setting. 新しい言語設定を使用には OpenLP を再起動してください。 @@ -2949,287 +3148,287 @@ OpenLP.MainWindow - + &File ファイル(&F) - + &Import インポート(&I) - + &Export エクスポート(&E) - + &View 表示(&V) - + M&ode モード(&O) - + &Tools ツール(&T) - + &Settings 設定(&S) - + &Language 言語(&L) - + &Help ヘルプ(&H) - + Media Manager メディア マネージャ - + Service Manager 礼拝プログラム管理 - + Theme Manager テーマ マネージャ - + &New 新規作成(&N) - + &Open 開く(&O) - + Open an existing service. 存在する礼拝プログラムを開きます。 - + &Save 保存(&S) - + Save the current service to disk. 現在の礼拝プログラムをディスクに保存します。 - + Save &As... 名前を付けて保存(&A)... - + Save Service As 名前をつけて礼拝プログラムを保存 - + Save the current service under a new name. 現在の礼拝プログラムを新しい名前で保存します。 - + E&xit 終了(&X) - + Quit OpenLP OpenLP を終了 - + &Theme テーマ(&T) - + &Configure OpenLP... OpenLP の設定(&C)... - + &Media Manager メディア マネージャ(&M) - + Toggle Media Manager メディア マネージャを切り替える - + Toggle the visibility of the media manager. メディア マネージャの表示/非表示を切り替えます。 - + &Theme Manager テーマ マネージャ(&T) - + Toggle Theme Manager テーマ マネージャの切り替え - + Toggle the visibility of the theme manager. テーマ マネージャの表示/非表示を切り替えます。 - + &Service Manager 礼拝プログラム管理(&S) - + Toggle Service Manager 礼拝プログラムの切り替え - + Toggle the visibility of the service manager. 礼拝プログラムの表示/非表示を切り替える。 - + &Preview Panel プレビュー パネル(&P) - + Toggle Preview Panel プレビュー パネルの切り替え - + Toggle the visibility of the preview panel. プレビュー パネルの表示/非表示を切り替えます。 - + &Live Panel ライブ パネル(&L) - + Toggle Live Panel ライブ パネルの切り替え - + Toggle the visibility of the live panel. ライブ パネルの表示/非表示を切り替える。 - + &Plugin List プラグイン一覧(&P) - + List the Plugins プラグイン一覧を表示します - + &User Guide ユーザ ガイド(&U) - + &About バージョン情報(&A) - + More information about OpenLP OpenLP の詳細情報 - + &Online Help オンライン ヘルプ(&O) - + &Web Site ウェブ サイト(&W) - + Use the system language, if available. 可能であればシステム言語を使用します。 - + Set the interface language to %s インタフェース言語を %s に設定 - + Add &Tool... ツールを追加(&T)... - + Add an application to the list of tools. ツールの一覧にアプリケーションを追加します。 - + &Default 既定値(&D) - + Set the view mode back to the default. 表示モードを既定に戻します。 - + &Setup 設定(&S) - + Set the view mode to Setup. 表示モードを設定します。 - + &Live ライブ(&L) - + 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/. @@ -3238,108 +3437,108 @@ http://openlp.org/ から最新版をダウンロードできます。 - + OpenLP Version Updated OpenLP のバージョン アップ完了 - + OpenLP Main Display Blanked OpenLP のプライマリ ディスプレイがブランクです - + The Main Display has been blanked out OpenLP のプライマリ ディスプレイがブランクになりました - + Default Theme: %s 既定のテーマ: %s - + English Please add the name of your language here 日本語 - + Configure &Shortcuts... ショートカットの設定(&S)... - + Close OpenLP OpenLP を閉じる - + Are you sure you want to close OpenLP? OpenLP を本当に終了しますか? - + Open &Data Folder... データフォルダを開く(&D)... - + Open the folder where songs, bibles and other data resides. 賛美、聖書データなどのデータが含まれているフォルダを開く。 - + &Autodetect 自動検出(&A) - + Update Theme Images テーマの縮小画像を更新 - + Update the preview images for all themes. 全てのテーマの縮小画像を更新します。 - + Print the current service. 現在の礼拝プログラムを印刷します。 - + &Recent Files 最近使用したファイル(&R) - + L&ock Panels パネルを固定(&L) - + Prevent the panels being moved. パネルが動くのを妨げる。 - + Re-run First Time Wizard 初回起動ウィザードの再実行 - + Re-run the First Time Wizard, importing songs, Bibles and themes. 初回起動ウィザードを再実行し、賛美や聖書、テーマをインポートする。 - + Re-run First Time Wizard? 初回起動ウィザードを再実行しますか? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3348,43 +3547,43 @@ 初回起動ウィザードを再実行すると、現在のOpenLP設定および既存の賛美やテーマが変更されることがあります。 - + Clear List Clear List of recent files 一覧を消去 - + Clear the list of recent files. 最近使用したファイルの一覧を消去します。 - + Configure &Formatting Tags... 書式タグを設定(&F)... - + Export OpenLP settings to a specified *.config file OpenLPの設定をファイルへエクスポート - + Settings 設定 - + Import OpenLP settings from a specified *.config file previously exported on this or another machine 以前にエクスポートしたファイルから OpenLP の設定をインポート - + Import settings? 設定をインポートしますか? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3397,45 +3596,50 @@ 不正な設定をインポートすると異常な動作やOpenLPの異常終了の原因となります。 - + Open File ファイルを開く - + OpenLP Export Settings Files (*.conf) OpenLP エクスポート設定ファイル (*.conf) - + Import settings 設定のインポート - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP を終了させます。インポートされた設定は次の起動時に適用されます。 - + Export Settings File 設定ファイルのエクスポート - + OpenLP Export Settings File (*.conf) OpenLP 設定ファイル (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error データベースエラー - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3444,7 +3648,7 @@ データベース: %s - + OpenLP cannot load your database. Database: %s @@ -3456,74 +3660,74 @@ OpenLP.MediaManagerItem - + No Items Selected 項目が選択されていません - + &Add to selected Service Item 選択された礼拝項目に追加(&A) - + You must select one or more items to preview. プレビューするには 1 つ以上の項目を選択する必要があります。 - + You must select one or more items to send live. ライブに送信するには 1 つ以上の項目を選択する必要があります。 - + You must select one or more items. 1 つ以上の項目を選択する必要があります。 - + You must select an existing service item to add to. 追加するには既存の礼拝項目を選択する必要があります。 - + Invalid Service Item 無効な礼拝項目 - + You must select a %s service item. %sの項目を選択してください。 - + You must select one or more items to add. 追加するには、一つ以上の項目を選択してください。 - + No Search Results 見つかりませんでした - + Invalid File Type 無効なファイルタイプ - + Invalid File %s. Suffix not supported %sは無効なファイルです。 拡張子がサポートされていません - + &Clone 閉じる(&C) - + Duplicate files were found on import and were ignored. インポート中に重複するファイルが見つかり、無視されました。 @@ -3531,40 +3735,40 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <lyrics>タグが見つかりません。 - + <verse> tag is missing. - + <verse>タグが見つかりません。 OpenLP.PluginForm - + Plugin List プラグイン一覧 - + Plugin Details プラグイン詳細 - + Status: 状況: - + Active 有効 - + Inactive 無効 @@ -3587,12 +3791,12 @@ OpenLP.PrintServiceDialog - + Fit Page サイズをページに合わせる - + Fit Width サイズをページの横幅に合わせる @@ -3600,7 +3804,7 @@ OpenLP.PrintServiceForm - + Options オプション @@ -3615,47 +3819,47 @@ HTMLとしてコピーする - + Zoom In ズームイン - + Zoom Out ズームアウト - + Zoom Original 既定のズームに戻す - + Other Options その他のオプション - + Include slide text if available 可能であれば、スライドテキストを含める - + Include service item notes 礼拝項目メモを含める - + Include play length of media items メディア項目の再生時間を含める - + Add page break before each text item テキスト項目毎に改ページ - + Service Sheet 礼拝シート @@ -3665,12 +3869,12 @@ 印刷 - + Title: タイトル: - + Custom Footer Text: カスタムフッターテキスト: @@ -3678,12 +3882,12 @@ OpenLP.ScreenList - + Screen スクリーン - + primary プライマリ @@ -3691,12 +3895,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>開始</strong>: %s - + <strong>Length</strong>: %s <strong>長さ</strong>: %s @@ -3704,7 +3908,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item 礼拝項目を並べ替え @@ -3712,82 +3916,82 @@ OpenLP.ServiceManager - + Move to &top 一番上に移動(&t) - + Move item to the top of the service. 選択した項目を最も上に移動する。 - + Move &up 一つ上に移動(&u) - + Move item up one position in the service. 選択した項目を1つ上に移動する。 - + Move &down 一つ下に移動(&d) - + Move item down one position in the service. 選択した項目を1つ下に移動する。 - + Move to &bottom 一番下に移動(&b) - + Move item to the end of the service. 選択した項目を最も下に移動する。 - + &Delete From Service 削除(&D) - + Delete the selected item from the service. 選択した項目を礼拝プログラムから削除する。 - + &Add New Item 新しい項目を追加(&A) - + &Add to Selected Item 選択された項目を追加(&A) - + &Edit Item 項目の編集(&E) - + &Reorder Item 項目を並べ替え(&R) - + &Notes メモ(&N) - + &Change Item Theme 項目の外観テーマを変更(&C) @@ -3809,112 +4013,107 @@ 礼拝プログラムファイルが有効でありません。 - + 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 必要なプラグインが見つからないか無効なため、項目を表示する事ができません - + &Expand all すべて展開(&E) - + Expand all the service items. 全ての項目を展開する。 - + &Collapse all すべて折り畳む(&C) - + Collapse all the service items. 全ての項目を折り畳みます。 - + Open File ファイルを開く - + Moves the selection down the window. 選択をウィンドウの下に移動する。 - + Move up 上に移動 - + Moves the selection up the window. 選択をウィンドウの上に移動する。 - + Go Live ライブへ送る - + Send the selected item to Live. 選択された項目をライブ表示する。 - + &Start Time 開始時間(&S) - + Show &Preview プレビュー表示(&P) - - Show &Live - ライブ表示(&L) - - - + Modified Service 礼拝プログラムの編集 - + The current service has been modified. Would you like to save this service? 現在の礼拝プログラムは、編集されています。保存しますか? - + Custom Service Notes: 礼拝項目メモ: - + Notes: メモ: - + Playing time: 再生時間: - + Untitled Service 無題 @@ -3939,17 +4138,17 @@ 破損したファイル - + Load an existing service. 既存の礼拝プログラムを読み込みます。 - + Save this service. 礼拝プログラムを保存します。 - + Select a theme for the service. 礼拝プログラムの外観テーマを選択します。 @@ -3959,7 +4158,7 @@ このファイルは破損しているかOpenLP 2.0の礼拝プログラムファイルではありません。 - + Service File Missing 礼拝プログラムファイルが見つかりません @@ -3983,11 +4182,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes 礼拝項目メモ @@ -4003,67 +4212,67 @@ OpenLP.ShortcutListDialog - + Action 動作 - + Shortcut ショートカット - + Duplicate Shortcut ショートカットの重複 - + The shortcut "%s" is already assigned to another action, please use a different shortcut. このショートカット"%s"は既に他の動作に割り振られています。他のショートカットをご利用ください。 - + Alternate 代替 - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. 動作を選択して下のボタンをクリックし、新しいショートカットを入力してください。 - + Default 初期設定 - + Custom カスタム - + Capture shortcut. ショートカットを入力する。 - + Restore the default shortcut of this action. この動作のショートカットを初期値に戻す。 - + Restore Default Shortcuts ショートカットを初期設定に戻す - + Do you want to restore all shortcuts to their defaults? 全てのショートカットを初期設定に戻しますか? - + Configure Shortcuts ショートカットの設定 @@ -4071,179 +4280,174 @@ OpenLP.SlideController - + Hide 隠す - + Go To 送る - + Blank Screen スクリーンをブランク - + Blank to Theme 外観テーマをブランク - + Show Desktop デスクトップを表示 - + Previous Service 前の礼拝プログラム - + Next Service 次の礼拝プログラム - + Escape Item 項目をエスケープ - + Move to previous. 前に移動。 - + Move to next. 次に移動。 - + Play Slides スライドを再生 - + Delay between slides in seconds. スライドの再生時間を秒で指定する。 - + Move to live. ライブへ移動する。 - + Add to Service. 礼拝プログラムへ追加する。 - + Edit and reload song preview. 編集しプレビューを再読み込みする。 - + Start playing media. メディアの再生を開始する。 - + Pause audio. 音声を一時停止します。 - + Pause playing media. 再生中のメディアを一時停止します。 - + Stop playing media. 再生中のメディアを停止します。 - + Video position. - + ビデオの表示位置。 - + Audio Volume. - + ボリューム。 - + Go to "Verse" - + Go to "Chorus" - + Go to "Bridge" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" - + Previous Slide - + 前のスライド - + Next Slide - + 次のスライド - + Pause Audio - + 音声の一時停止 - + Background Audio - バックグラウンド音声 - - - - Next Track - + バックグラウンド音声 - + Go to next audio track. - + 次の音声トラックへ進みます。 - + Tracks - + トラック @@ -4317,17 +4521,17 @@ 開始時間がメディア項目の終了時間より後に設定されています - + Theme Layout テーマ レイアウト - + The blue box shows the main area. メイン領域に青いボックスが表示されます。 - + The red box shows the footer. フッターに青いボックスが表示されます。 @@ -4335,32 +4539,32 @@ OpenLP.ThemeForm - + Select Image 画像の選択 - + Theme Name Missing 外観テーマ名が不明です - + There is no name for this theme. Please enter one. 外観テーマ名がありません。入力してください。 - + Theme Name Invalid 無効な外観テーマ名 - + Invalid theme name. Please enter one. 無効な外観テーマ名です。入力してください。 - + (approximately %d lines per slide) (スライド1枚におよそ%d行) @@ -4368,514 +4572,514 @@ OpenLP.ThemeManager - + Create a new theme. 新しい外観テーマを作成する。 - + Edit Theme 外観テーマ編集 - + Edit a theme. 外観テーマの編集する。 - + Delete Theme 外観テーマ削除 - + Delete a theme. 外観テーマの削除する。 - + Import Theme 外観テーマインポート - + Import a theme. 外観テーマのインポートをする。 - + Export Theme 外観テーマのエキスポート - + Export a theme. 外観テーマのエキスポートをする。 - + &Edit Theme 外観テーマの編集(&E) - + &Delete Theme 外観テーマの削除(&D) - + Set As &Global Default 全体の既定として設定(&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. 無効な外観テーマファイルです。 - + &Copy Theme 外観テーマのコピー(&C) - + &Rename Theme 外観テーマの名前を変更(&N) - + &Export Theme 外観テーマのエキスポート(&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) - + Copy of %s Copy of <theme name> Copy of %s - + Theme Already Exists - + テーマが既に存在 OpenLP.ThemeWizard - + Theme Wizard 外観テーマウィザード - + Welcome to the Theme Wizard 外観テーマウィザードをようこそ - + Set Up Background 背景設定 - + Set up your theme's background according to the parameters below. 以下の項目に応じて、外観テーマに使用する背景を設定してください。 - + Background type: 背景の種類: - + Solid Color 単色 - + Gradient グラデーション - + Color: 色: - + Gradient: グラデーション: - + Horizontal - + Vertical - + Circular 放射状 - + Top Left - Bottom Right 左上 - 右下 - + Bottom Left - Top Right 左下 - 右上 - + Main Area Font Details 中央表示エリアのフォント詳細 - + Define the font and display characteristics for the Display text 中央エリアの表示のための文字設定とフォントを定義してください - + Font: フォント: - + Size: 文字サイズ: - + Line Spacing: 文字間: - + &Outline: アウトライン(&O): - + &Shadow: 影(&S): - + Bold 太字 - + Italic 斜体 - + Footer Area Font Details フッターフォント詳細 - + Define the font and display characteristics for the Footer text フッター表示のための文字設定とフォントを定義してください - + Text Formatting Details テキストフォーマット詳細 - + Allows additional display formatting information to be defined 追加の表示フォーマット情報が定義される事を許可する - + Horizontal Align: 水平位置: - + Left 左揃え - + Right 右揃え - + Center 中央揃え - + Output Area Locations 出力エリアの場所 - + Allows you to change and move the main and footer areas. 中央エリアとフッターエリアの場所が変更される事を許可する。 - + &Main Area 中央エリア(&M) - + &Use default location 既定の場所を使う(&U) - + X position: X位置: - + px px - + Y position: Y位置: - + Width: 幅: - + Height: 高: - + Use default location 既定の場所を使う - + Save and Preview 保存とプレビュー - + View the theme and save it replacing the current one or change the name to create a new theme 外観テーマを表示し、現在の外観テーマを置き換えるか名前を変更して新しい外観テーマを作成し、保存する - + Theme name: 外観テーマ名: - + Edit Theme - %s 外観テーマ編集 - %s - + 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: 切り替え: - + &Footer Area フッター(&F) - + Starting color: 色1: - + Ending color: 色2: - + Background color: 背景色: - + Justify 揃える - + Layout Preview レイアウト プレビュー - + Transparent - + 透明 OpenLP.ThemesTab - + Global Theme 全体外観テーマ - + Theme Level 外観テーマレベル - + S&ong Level 賛美レベル(&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) - + 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. 礼拝プログラムの外観テーマを用い、賛美個々の外観テーマを上書きします。礼拝プログラムに外観テーマが設定されていなければ、全体設定の外観テーマを使用します。 - + &Global Level 全体レベル(&G) - + Use the global theme, overriding any themes associated with either the service or the songs. 全体外観テーマを用い、すべての礼拝プログラムや賛美に関連付けられた外観テーマを上書きします。 - + Themes 外観テーマ @@ -4959,239 +5163,239 @@ pt - + Image 画像 - + Import インポート - + Live ライブ - + Live Background Error ライブ背景エラー - + 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.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview プレビュー - + Replace Background 背景を置換 - + Reset 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 バージョン - + Delete the selected item. 選択された項目を削除。 - + Move selection up one position. 選択された項目を一つ上げる。 - + Move selection down one position. 選択された項目を一つ下げる。 - + &Vertical Align: 垂直整列(&V): - + Finished import. インポートの完了。 - + Format: 書式: - + Importing インポート中 - + Importing "%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拡張機能をインストール必要があります。 - + Open %s File %sファイルを開く - + %p% %p% - + Ready. 準備完了。 - + Starting import... インポートを開始しています.... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong インポート元となる%sファイルを最低一つ選択する必要があります。 @@ -5207,7 +5411,7 @@ 賛美エキスポートウィザードへようこそ - + Welcome to the Song Import Wizard 賛美インポートウィザードへようこそ @@ -5295,53 +5499,53 @@ - + Layout style: レイアウトスタイル: - + Live Toolbar ライブツールバー - + m The abbreviated unit for minutes - + OpenLP is already running. Do you wish to continue? OpenLPは既に実行されています。続けますか? - + Settings 設定 - + Tools ツール - + Unsupported File サポートされていないファイル - + Verse Per Slide スライドに1節 - + Verse Per Line 1行に1節 - + View 表示 @@ -5356,42 +5560,37 @@ XML構文エラー - + View Mode 表示モード - + Open service. 礼拝プログラムを開きます。 - + Print Service 礼拝プログラムを印刷 - + Replace live background. ライブの背景を置換します。 - + Reset live background. ライブの背景をリセットします。 - - &Split - 分割(&S) - - - + Split a slide into two only if it does not fit on the screen as one slide. 1枚のスライドに納まらないときのみ、スライドが分割されます。 - + Welcome to the Bible Upgrade Wizard 聖書更新ウィザードへようこそ @@ -5401,105 +5600,157 @@ 削除確認 - + Play Slides in Loop スライドを繰り返し再生 - + Play Slides to End スライドを最後まで再生 - + Stop Play Slides in Loop スライドの繰り返し再生を停止 - + Stop Play Slides to End - + Next Track + 次のトラック + + + + Search Themes... + Search bar place holder text + テーマの検索... + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1 と %2 - + %1, and %2 Locale list separator: end - + %1 と %2 - + %1, %2 Locale list separator: middle - + %1 と %2 - + %1, %2 Locale list separator: start - + %1 と %2 PresentationPlugin - + <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>プレゼンテーションプラグイン</strong><br />プレゼンテーションプラグインは、外部のプログラムを使用してプレゼンテーションを表示する機能を提供します。使用可能なプログラムは、ドロップダウンボックスから選択できます。 - + Presentation name singular プレゼンテーション - + Presentations name plural プレゼンテーション - + Presentations container title プレゼンテーション - + Load a new presentation. 新しいプレゼンテーションを読み込みます。 - + Delete the selected presentation. 選択したプレゼンテーションを削除します。 - + Preview the selected presentation. 選択したプレゼンテーションをプレビューします。 - + Send the selected presentation live. 選択したプレゼンテーションをライブへ送ります。 - + Add the selected presentation to the service. 選択したプレゼンテーションを礼拝プログラムに追加します。 @@ -5507,72 +5758,72 @@ PresentationPlugin.MediaItem - + Select Presentation(s) プレゼンテーション選択 - + Automatic 自動 - + Present using: 使用プレゼン: - + File Exists ファイルが存在します - + A presentation with that filename already exists. そのファイル名のプレゼンテーションは既に存在します。 - + This type of presentation is not supported. このタイプのプレゼンテーションはサポートされておりません。 - + Presentations (%s) プレゼンテーション (%s) - + Missing Presentation 不明なプレゼンテーション - - The Presentation %s no longer exists. - プレゼンテーション%sが見つかりません。 + + The presentation %s is incomplete, please reload. + - - The Presentation %s is incomplete, please reload. - プレゼンテーション%sは不完全です。再度読み込んでください。 + + The presentation %s no longer exists. + PresentationPlugin.PresentationTab - + Available Controllers 使用可能なコントローラ - + %s (unavailable) %s (利用不可) - + Allow presentation application to be overridden - + プレゼンテーションアプリケーションの上書きを可能にする @@ -5604,229 +5855,244 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 遠隔操作 - + OpenLP 2.0 Stage View OpenLP 2.0 ステージビュー - + Service Manager 礼拝プログラム - + Slide Controller スライドコントローラ - + Alerts 警告 - + Search 検索 - - Back - 戻る - - - + Refresh 再読込 - + Blank ブランク - + Show 表示 - + Prev - + Next - + Text テキスト - + Show Alert 警告を表示 - + Go Live ライブへ送る - + No Results 見つかりませんでした - + Options オプション - + Add to Service 礼拝プログラムへ追加 + + + Home + ホーム + + + + Theme + 外観テーマ + + + + Desktop + デスクトップ + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: 待ち受けるIPアドレス: - + Port number: ポート番号: - + Server Settings サーバ設定 - + Remote URL: 遠隔操作URL: - + Stage view URL: ステージビューURL: - + Display stage time in 12h format - + ステージの時刻を12時間で表示 - + Android App - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. - + QRコードを読み取るか、<a href="https://market.android.com/details?id=org.openlp.android">ダウンロード</a>をクリックしてAndroidアプリをマーケットからインストールしてください。 SongUsagePlugin - + &Song Usage Tracking 賛美の利用記録(&S) - + &Delete Tracking Data 利用記録を削除(&D) - + Delete song usage data up to a specified date. 削除する利用記録の対象となるまでの日付を指定してください。 - + &Extract Tracking Data 利用記録の抽出(&E) - + Generate a report on song usage. 利用記録のレポートを出力する。 - + Toggle Tracking 記録の切り替え - + 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 />このプラグインは、賛美の利用頻度を記録します。 - + SongUsage name singular 利用記録 - + SongUsage name plural 利用記録 - + SongUsage container title 利用記録 - + Song Usage 利用記録 - + Song usage tracking is active. 賛美の利用記録が有効です。 - + Song usage tracking is inactive. 賛美の利用記録が無効です。 - + display - + 表示 - + printed - + 印刷済み SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data 利用記録削除 @@ -5851,7 +6117,7 @@ 正常に削除されました。 - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5859,42 +6125,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction 賛美利用記録の抽出 - + Select Date Range 賛美利用の期間 - + to から - + Report Location レポートの出力 - + Output File Location レポートの出力場所 - + usage_detail_%s_%s.txt usage_detail_%s_%s.txt - + Report Creation レポート生成 - + Report %s has been successfully created. @@ -5903,12 +6169,12 @@ - は正常に生成されました。 - + Output Path Not Selected 出力先が選択されていません - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. 賛美利用記録レポートの出力先が無効です。コンピューター上に存在するフォルダを選択して下さい。 @@ -5946,107 +6212,107 @@ 賛美のインデックスを再作成中... - + Arabic (CP-1256) アラブ語 (CP-1256) - + Baltic (CP-1257) バルト語 (CP-1257) - + Central European (CP-1250) 中央ヨーロッパ (CP-1250) - + Cyrillic (CP-1251) キリル文字 (CP-1251) - + Greek (CP-1253) ギリシャ語 (CP-1253) - + Hebrew (CP-1255) ヘブライ語 (CP-1255) - + Japanese (CP-932) 日本語 (CP-932) - + Korean (CP-949) 韓国語 (CP-949) - + Simplified Chinese (CP-936) 簡体中国語 (CP-936) - + Thai (CP-874) タイ語 (CP-874) - + Traditional Chinese (CP-950) 繁体中国語 (CP-950) - + Turkish (CP-1254) トルコ語 (CP-1254) - + Vietnam (CP-1258) ベトナム語 (CP-1258) - + Western European (CP-1252) 西ヨーロッパ (CP-1252) - + Character Encoding 文字コード - + 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. 文字コードを選択してください。文字が正常に表示されるのに必要な設定です。 - + Song name singular 賛美 - + Songs name plural 賛美 - + Songs container title 賛美 @@ -6057,32 +6323,32 @@ エキスポートウィザードを使って賛美をエキスポートする。 - + 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. 選択した賛美を礼拝プログラムに追加します。 @@ -6110,17 +6376,17 @@ 姓: - + You need to type in the first name of the author. 名を入力してください。 - + You need to type in the last name of the author. 姓を入力してください。 - + You have not set a display name for the author, combine the first and last names? 表示名が設定されていません。名と姓を合わせますか? @@ -6150,211 +6416,224 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor ソングエディタ - + &Title: タイトル(&T): - + Alt&ernate title: サブタイトル(&e): - + &Lyrics: 賛美詞(&L): - + &Verse order: 節順(&V): - + Ed&it All 全て編集(&E) - + Title && Lyrics タイトル && 賛美詞 - + &Add to Song 賛美に追加(&A) - + &Remove 削除(&R) - + &Manage Authors, Topics, Song Books アーティスト、題目、アルバムを管理(&M) - + A&dd to Song 賛美に追加(&A) - + R&emove 削除(&e) - + Book: 書名: - + Number: ナンバー: - + Authors, Topics && Song Book アーティスト、題目 && アルバム - + New &Theme 新しい外観テーマ(&N) - + Copyright Information 著作権情報 - + Comments コメント - + Theme, Copyright Info && Comments 外観テーマ、著作情報 && コメント - + Add Author アーティストを追加 - + This author does not exist, do you want to add them? アーティストが存在しません。追加しますか? - + This author is already in the list. 既にアーティストは一覧に存在します。 - + 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. 有効なアーティストを選択してください。一覧から選択するか新しいアーティストを入力し、"賛美にアーティストを追加"をクリックしてください。 - + Add Topic トピックを追加 - + This topic does not exist, do you want to add it? このトピックは存在しません。追加しますか? - + This topic is already in the list. このトピックは既に存在します。 - + 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. 賛美のタイトルを入力する必要があります。 - + You need to type in at least one verse. 最低一つのバースを入力する必要があります。 - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. バース順序が無効です。%sに対応するバースはありません。%sは有効です。 - + Add Book アルバムを追加 - + This song book does not exist, do you want to add it? アルバムが存在しません、追加しますか? - + You need to have an author for this song. アーティストを入力する必要があります。 - + You need to type some text in to the verse. バースにテキストを入力する必要があります。 - + Linked Audio - + 関連付けられた音声 - + Add &File(s) ファイルを追加(&F) - + Add &Media メディアを追加(&M) - + Remove &All すべて削除(&A) - + Open File(s) ファイルを開く - + <strong>Warning:</strong> Not all of the verses are in use. - + <strong>警告:</strong>全ての箇所が使用されていません。 - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. - + 順序が正しくありません。%sに対応する箇所が存在しません。有効な箇所は%sです。 @@ -6466,130 +6745,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files ドキュメント/プレゼンテーションファイル選択 - + 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. このウィザードで、様々な形式の賛美をインポートします。次へをクリックし、インポートするファイルの形式を選択してください。 - + Generic Document/Presentation 汎用ドキュメント/プレゼンテーション - - Filename: - ファイル名: - - - - 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. - OpenLyricsのインポートは未開発です。次のバージョンにご期待ください。 - - - + Add Files... ファイルの追加... - + Remove File(s) ファイルの削除 - + Please wait while your songs are imported. 賛美がインポートされるまでしばらくお待ちください。 - + OpenLP 2.0 Databases OpenLP 2.0 データベース - + openlp.org v1.x Databases openlp.org v1.x データベース - + Words Of Worship Song Files Words Of Worship Song ファイル - - 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 ファイル - + Copy コピー - + Save to File ファイルに保存 - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. OpenOfficeまたはLibreOfficeに接続できないため、Songs of Fellowshipのインポート機能は無効になっています。 - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. OpenOfficeまたはLibreOfficeに接続できないため、汎用ドキュメント/プレゼンテーションのインポート機能は無効になっています。 - + OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics OpenLP 2.0からエクスポートされたデータ - + OpenLyrics Files + OpenLyricsファイル + + + + CCLI SongSelect Files + CCLI SongSelectファイル + + + + EasySlides XML File + Easy Slides XMLファイル + + + + EasyWorship Song Database + EasyWorship Songデータベース + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. SongsPlugin.MediaFilesForm - + Select Media File(s) - + メディアファイルを選択 - + Select one or more audio files from the list below, and click OK to import them into this song. 音声ファイルを下の一覧から1つ以上選択し、OKをクリックしてインポートしてください。 @@ -6597,43 +6896,68 @@ SongsPlugin.MediaItem - + Titles タイトル - + Lyrics 賛美詞 - + CCLI License: CCLI ライセンス: - + Entire Song 賛美全体 - + Are you sure you want to delete the %n selected song(s)? 選択された%n件の賛美を削除します。宜しいですか? - + Maintain the lists of authors, topics and books. アーティスト、トピックとアルバムの一覧を保守します。 - + copy For song cloning コピー + + + Search Titles... + タイトルを検索... + + + + Search Entire Song... + 全てのデータを検索... + + + + Search Lyrics... + 歌詞を検索... + + + + Search Authors... + 著者を検索... + + + + Search Song Books... + アルバムを検索中... + SongsPlugin.OpenLP1SongImport @@ -6660,6 +6984,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6698,12 +7035,12 @@ SongsPlugin.SongImport - + copyright 著作権 - + The following songs could not be imported: 以下の賛美はインポートできませんでした: @@ -6724,117 +7061,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - 賛美のインポートに失敗しました。 - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. アーティストが追加できませんでした。 - + This author already exists. このアーティストは既に登録されています。 - + Could not add your topic. トピックの追加に失敗しました。 - + This topic already exists. トピックが既に存在します。 - + Could not add your book. アルバムが追加できませんでした。 - + This book already exists. 既にこのアルバムが存在します。 - + Could not save your changes. 変更が保存できませんでした。 - + Could not save your modified author, because the author already exists. 既にアーティストが登録されているため、変更を保存できませんでした。 - + Could not save your modified topic, because it already exists. 既に題目登録されているため、変更を保存できませんでした。 - + Delete Author アーティスト削除 - + Are you sure you want to delete the selected author? 選択されたアーティストを削除しますか? - + This author cannot be deleted, they are currently assigned to at least one song. 最低一つの賛美に割り振られているため、このアーティストを削除できませんでした。 - + Delete Topic トピックの削除 - + Are you sure you want to delete the selected topic? 選択されたトピックを削除しますか? - + This topic cannot be deleted, it is currently assigned to at least one song. 最低一つの賛美に割り振られているため、このトピックを削除できませんでした。 - + Delete Book アルバム削除 - + Are you sure you want to delete the selected book? 選択されたアルバムを削除しますか? - + 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で賛美を作りますか? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %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で賛美を作りますか? @@ -6842,29 +7171,29 @@ SongsPlugin.SongsTab - + Songs Mode 賛美モード - + Enable search as you type 入力と同時に検索する - + Display verses on live tool bar ライブツールバーにバースを表示 - + Update service from song edit 編集後に礼拝プログラムを更新 - - Add missing songs when opening service - 礼拝プログラムを開いたときに存在しない賛美を追加 + + Import missing songs from service files + @@ -6923,4 +7252,17 @@ その他 + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/ko.ts openlp-1.9.10/resources/i18n/ko.ts --- openlp-1.9.9/resources/i18n/ko.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/ko.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert 경고(&A) - + Show an alert message. 에러 메세지를 보여줍니다. - + Alert name singular 알림 - + Alerts name plural - + Alerts container title - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message 경고 메세지 - + Alert &text: 경고 문구(&T) - + &New 새로 만들기(&N) - + &Save 저장(&S) - + Displ&ay 출력(&A) - + Display && Cl&ose 출력 && 닫기(&O) @@ -79,7 +79,7 @@ 경고 문구를 입력하지 않았습니다. 새로 만들기를 하려면 문구를 입력해주세요. - + &Parameter: @@ -117,32 +117,32 @@ AlertsPlugin.AlertsTab - + Font 글꼴 - + Font name: 글꼴: - + Font color: 글꼴색: - + Background color: 배경색: - + Font size: 글꼴 크기: - + Alert timeout: 경고 타임아웃: @@ -150,550 +150,595 @@ BiblesPlugin - + &Bible - + Bible name singular - + Bibles name plural - + Bibles container title - + No Book Found - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. - + Import a Bible. - + Add a new Bible. - + Edit the selected Bible. - + Delete the selected Bible. - + Preview the selected Bible. - + Send the selected Bible live. - + Add the selected Bible to the service. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. - + &Upgrade older Bibles - + Upgrade the Bible databases to the latest format. - + Genesis - + Exodus - + Leviticus - + Numbers - + Deuteronomy - + Joshua - + Judges - + Ruth - + 1 Samuel - + 2 Samuel - + 1 Kings - + 2 Kings - + 1 Chronicles - + 2 Chronicles - + Ezra - + Nehemiah - + Esther - + Job - + Psalms - + Proverbs - + Ecclesiastes - + Song of Solomon - + Isaiah - + Jeremiah - + Lamentations - + Ezekiel - + Daniel - + Hosea - + Joel - + Amos - + Obadiah - + Jonah - + Micah - + Nahum - + Habakkuk - + Zephaniah - + Haggai - + Zechariah - + Malachi - + Matthew - + Mark - + Luke - + John - + Acts - + Romans - + 1 Corinthians - + 2 Corinthians - + Galatians - + Ephesians - + Philippians - + Colossians - + 1 Thessalonians - + 2 Thessalonians - + 1 Timothy - + 2 Timothy - + Titus - + Philemon - + Hebrews - + James - + 1 Peter - + 2 Peter - + 1 John - + 2 John - + 3 John - + Jude - + Revelation - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + + + + + Bible Exists + + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error 성경 참조 오류 - + Web Bible cannot be used - + Text Search is not available with Web Bibles. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. - + No Bibles Available - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -709,187 +754,179 @@ BiblesPlugin.BiblesTab - + Verse Display 절 출력 - + Only show new chapter numbers 새로운 장번호만 보이기 - + Bible theme: 성경 테마: - + No Brackets 꺽쇠 안보이기 - + ( And ) ( 와 ) - + { And } { 와 } - + [ And ] [ 와 ] - + Note: Changes do not affect verses already in the service. 참고: 이미 서비스 중인 구절에 대해서는 변경사항이 적용되지 않습니다. - + Display second Bible verses - + Custom Scripture References - + Verse Separator: - + Range Separator: - + List Separator: - + End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + English - - Bible language + + Default Bible Language - - Application language + + Book name language in search field, +search results and on display: - - English + + Bible Language - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language BiblesPlugin.BookNameDialog - + Select Book Name - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - - - - + Current name: - + Corresponding name: - + Show Books From - + Old Testament - + New Testament - + Apocrypha + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. @@ -914,40 +951,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + 라이센스 정보 + + + + Version name: + 버전 이름: + + + + Copyright: + 저작권: + + + + Permissions: + + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... - + Registering Language... - + Importing %s... Importing <book name>... - + Download Error - + 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. - + Parse Error - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. @@ -1124,17 +1230,17 @@ BiblesPlugin.LanguageDialog - + Select Language - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - + Language: @@ -1150,85 +1256,100 @@ BiblesPlugin.MediaItem - + Quick - + Find: - + Book: - + Chapter: - + Verse: - + From: - + To: - + Text Search - + Second: - + Scripture Reference - + Toggle to keep or clear the previous results. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. - + Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -1237,12 +1358,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1251,143 +1372,143 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory - + Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory - + Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. - + Backup Directory: - + There is no need to backup my Bibles - + Select Bibles - + Please select the Bibles to upgrade - + Upgrading - + Please wait while your Bibles are upgraded. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. - + Upgrading Bible %s of %s: "%s" Failed - + Upgrading Bible %s of %s: "%s" Upgrading ... - + Download Error - + To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... - + Upgrading Bible %s of %s: "%s" Complete - + , %s failed - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s - + Upgrade failed. - + You need to specify a backup directory for your Bibles. - + Starting upgrade... - + There are no Bibles that need to be upgraded. @@ -1461,12 +1582,12 @@ CustomPlugin.CustomTab - + Custom Display - + Display footer @@ -1474,42 +1595,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides - + &Title: - + Add a new slide at bottom. - + Edit the selected slide. - + Edit all the slides at once. - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -1524,12 +1645,12 @@ - + Ed&it All - + Insert Slide @@ -1537,7 +1658,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1547,60 +1668,60 @@ ImagePlugin - + <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. - + Image name singular - + Images name plural - + Images container title - + Load a new image. - + Add a new image. - + Edit the selected image. - + Delete the selected image. - + Preview the selected image. - + Send the selected image live. - + Add the selected image to the service. @@ -1608,7 +1729,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment @@ -1616,43 +1737,43 @@ ImagePlugin.MediaItem - + Select Image(s) - + You must select an image to delete. - + You must select an image to replace the background with. - + Missing Image(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? - + There was a problem replacing your background, the image file "%s" no longer exists. - + There was no display item to amend. @@ -1660,78 +1781,78 @@ ImagesPlugin.ImageTab - + Background Color - + Default Color: - - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - + Media name singular - + Media name plural - + Media container title - + Load new media. - + Add new media. - + Edit the selected media. - + Delete the selected media. - + Preview the selected media. - + Send the selected media live. - + Add the selected media to the service. @@ -1779,7 +1900,7 @@ - + Unsupported File @@ -1797,22 +1918,22 @@ MediaPlugin.MediaTab - + Available Media Players - + %s (unavailable) - + Player Order - + Allow media player to be overridden @@ -1820,7 +1941,7 @@ OpenLP - + Image Files @@ -1840,17 +1961,17 @@ OpenLP.AboutForm - + Credits - + License - + Contribute @@ -1860,17 +1981,17 @@ - + 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 @@ -1935,7 +2056,7 @@ - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -1946,7 +2067,7 @@ - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s @@ -1955,228 +2076,310 @@ OpenLP.AdvancedTab - + UI Settings - + Number of recent files to display: - + Remember active media manager tab on startup - + Double-click to send items straight to live - + Expand new service items on creation - + Enable application exit confirmation - + Mouse Cursor - + Hide mouse cursor when over display window - + Default Image - + Background color: 배경색: - - Image file: + + Image file: + + + + + Open File + + + + + Advanced + + + + + Preview items when clicked in Media Manager + + + + + Click to select a color. + + + + + Browse for an image file to display. + + + + + Revert to the default OpenLP logo. + + + + + Service %Y-%m-%d %H-%M + This may not contain any of the following characters: /\?*|<>[]":+ +See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + + + + Default Service Name + + + + + Enable default service name + + + + + Date and Time: + + + + + Monday + + + + + Tuesday + + + + + Wednesday + + + + + Thurdsday + + + + + Friday + + + + + Saturday - - Open File + + Sunday - - Advanced + + Now - - Preview items when clicked in Media Manager + + Time when usual service starts. - - Click to select a color. + + Name: - - Browse for an image file to display. + + Consult the OpenLP manual for usage. - - Revert to the default OpenLP logo. + + Revert to the default service name "%s". - - Service %Y-%m-%d %H-%M - This may not contain any of the following characters: /\?*|<>[]":+ -See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + Example: - - Default Service Name + + X11 - - Enable default service name + + Bypass X11 Window Manager - - Date and Time: + + Syntax error. - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday + + Cancel - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. - + Send E-Mail - + Save to File - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) - + Attach File - + Description characters to enter : %s @@ -2184,23 +2387,23 @@ OpenLP.ExceptionForm - + Platform: %s - + Save Crash Report - + Text files (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2218,7 +2421,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2341,17 +2544,17 @@ - + Downloading %s... - + Download complete. Click the finish button to start OpenLP. - + Enabling selected plugins... @@ -2421,32 +2624,32 @@ - + Setting Up And Downloading - + Please wait while OpenLP is set up and your data is downloaded. - + Setting Up - + Click the finish button to start OpenLP. - + Download complete. Click the finish button to return to OpenLP. - + Click the finish button to return to OpenLP. @@ -2456,8 +2659,13 @@ + + Finish + + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2466,64 +2674,59 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - - - - Finish +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. OpenLP.FormattingTagDialog - + Configure Formatting Tags - + Edit Selection - + Save - + Description - + Tag - + Start tag - + End tag - + Tag Id - + Start HTML - + End HTML @@ -2531,32 +2734,32 @@ OpenLP.FormattingTagForm - + Update Error - + Tag "n" already defined. - + New Tag - + <HTML here> - + </and here> - + Tag %s already defined. @@ -2564,82 +2767,82 @@ OpenLP.FormattingTags - + Red - + Black - + Blue - + Yellow - + Green - + Pink - + Orange - + Purple - + White - + Superscript - + Subscript - + Paragraph - + Bold - + Italics - + Underline - + Break @@ -2647,180 +2850,170 @@ OpenLP.GeneralTab - + General - + Monitors - + Select monitor for output display: - + Display if a single screen - + Application Startup - + Show blank screen warning - + Automatically open the last service - + Show the splash screen - + Application Settings - + Prompt to save before starting a new service - + Automatically preview next item in service - + sec - + CCLI Details - + SongSelect username: - + SongSelect password: - + X - + Y - + Height - + Width - + Check for updates to OpenLP - + Unblank display when adding new live item - + Timed slide interval: - + Background Audio - + Start background audio paused - + Service Item Slide Limits - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide + + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item + + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide - - Override display position: + + &Wrap around - - Repeat track list + + &Move to next/previous service item OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -2836,438 +3029,438 @@ OpenLP.MainWindow - + &File - + &Import - + &Export - + &View - + M&ode - + &Tools - + &Settings - + &Language - + &Help - + Media Manager - + Service Manager - + Theme Manager - + &New 새로 만들기(&N) - + &Open - + Open an existing service. - + &Save 저장(&S) - + Save the current service to disk. - + Save &As... - + Save Service As - + Save the current service under a new name. - + E&xit - + Quit OpenLP - + &Theme - + &Configure OpenLP... - + &Media Manager - + Toggle Media Manager - + Toggle the visibility of the media manager. - + &Theme Manager - + Toggle Theme Manager - + Toggle the visibility of the theme manager. - + &Service Manager - + Toggle Service Manager - + Toggle the visibility of the service manager. - + &Preview Panel - + Toggle Preview Panel - + Toggle the visibility of the preview panel. - + &Live Panel - + Toggle Live Panel - + Toggle the visibility of the live panel. - + &Plugin List - + List the Plugins - + &User Guide - + &About - + More information about OpenLP - + &Online Help - + &Web Site - + Use the system language, if available. - + Set the interface language to %s - + Add &Tool... - + Add an application to the list of tools. - + &Default - + Set the view mode back to the default. - + &Setup - + Set the view mode to Setup. - + &Live - + 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/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s - + English Please add the name of your language here - + Configure &Shortcuts... - + Close OpenLP - + Are you sure you want to close OpenLP? - + Open &Data Folder... - + Open the folder where songs, bibles and other data resides. - + &Autodetect - + Update Theme Images - + Update the preview images for all themes. - + Print the current service. - + &Recent Files - + L&ock Panels - + Prevent the panels being moved. - + Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files - + Clear the list of recent files. - + Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file - + Settings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3276,52 +3469,57 @@ - + Open File - + OpenLP Export Settings Files (*.conf) - + Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File - + OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s - + OpenLP cannot load your database. Database: %s @@ -3331,73 +3529,73 @@ OpenLP.MediaManagerItem - + No Items Selected - + &Add to selected Service Item - + You must select one or more items to preview. - + You must select one or more items to send live. - + You must select one or more items. - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. - + You must select one or more items to add. - + No Search Results - + Invalid File Type - + Invalid File %s. Suffix not supported - + &Clone - + Duplicate files were found on import and were ignored. @@ -3405,12 +3603,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <verse> tag is missing. @@ -3418,27 +3616,27 @@ OpenLP.PluginForm - + Plugin List - + Plugin Details - + Status: - + Active - + Inactive @@ -3461,12 +3659,12 @@ OpenLP.PrintServiceDialog - + Fit Page - + Fit Width @@ -3474,7 +3672,7 @@ OpenLP.PrintServiceForm - + Options @@ -3489,47 +3687,47 @@ - + Zoom In - + Zoom Out - + Zoom Original - + Other Options - + Include slide text if available - + Include service item notes - + Include play length of media items - + Add page break before each text item - + Service Sheet @@ -3539,12 +3737,12 @@ - + Title: - + Custom Footer Text: @@ -3552,12 +3750,12 @@ OpenLP.ScreenList - + Screen - + primary @@ -3565,12 +3763,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s - + <strong>Length</strong>: %s @@ -3578,7 +3776,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item @@ -3586,82 +3784,82 @@ OpenLP.ServiceManager - + Move to &top - + Move item to the top of the service. - + Move &up - + Move item up one position in the service. - + Move &down - + Move item down one position in the service. - + Move to &bottom - + Move item to the end of the service. - + &Delete From Service - + Delete the selected item from the service. - + &Add New Item - + &Add to Selected Item - + &Edit Item - + &Reorder Item - + &Notes - + &Change Item Theme @@ -3682,112 +3880,107 @@ - + 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 - + &Expand all - + Expand all the service items. - + &Collapse all - + Collapse all the service items. - + Open File - + Moves the selection down the window. - + Move up - + Moves the selection up the window. - + Go Live - + Send the selected item to Live. - + &Start Time - - Show &Preview - - - - Show &Live + Show &Preview - + Modified Service - + The current service has been modified. Would you like to save this service? - + Custom Service Notes: - + Notes: - + Playing time: - + Untitled Service @@ -3812,17 +4005,17 @@ - + Load an existing service. - + Save this service. - + Select a theme for the service. @@ -3832,7 +4025,7 @@ - + Service File Missing @@ -3856,11 +4049,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes @@ -3876,67 +4079,67 @@ OpenLP.ShortcutListDialog - + Action - + Shortcut - + Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default - + Custom - + Capture shortcut. - + Restore the default shortcut of this action. - + Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts @@ -3944,177 +4147,172 @@ OpenLP.SlideController - + Hide - + Go To - + Blank Screen - + Blank to Theme - + Show Desktop - + Previous Service - + Next Service - + Escape Item - + Move to previous. - + Move to next. - + Play Slides - + Delay between slides in seconds. - + Move to live. - + Add to Service. - + Edit and reload song preview. - + Start playing media. - + Pause audio. - + Pause playing media. - + Stop playing media. - + Video position. - + Audio Volume. - + Go to "Verse" - + Go to "Chorus" - + Go to "Bridge" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" - + Previous Slide - + Next Slide - + Pause Audio - + Background Audio - - Next Track - - - - + Go to next audio track. - + Tracks @@ -4190,17 +4388,17 @@ - + Theme Layout - + The blue box shows the main area. - + The red box shows the footer. @@ -4208,32 +4406,32 @@ OpenLP.ThemeForm - + Select Image - + Theme Name Missing - + There is no name for this theme. Please enter one. - + Theme Name Invalid - + Invalid theme name. Please enter one. - + (approximately %d lines per slide) @@ -4241,193 +4439,193 @@ OpenLP.ThemeManager - + Create a new theme. - + Edit Theme - + Edit a theme. - + Delete Theme - + Delete a theme. - + Import Theme - + Import a theme. - + Export Theme - + Export a theme. - + &Edit Theme - + &Delete Theme - + Set As &Global Default - + %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. - + &Copy Theme - + &Rename Theme - + &Export Theme - + 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) - + Copy of %s Copy of <theme name> - + Theme Already Exists @@ -4435,272 +4633,272 @@ OpenLP.ThemeWizard - + Theme Wizard - + Welcome to the Theme Wizard - + Set Up Background - + Set up your theme's background according to the parameters below. - + Background type: - + Solid Color - + Gradient - + Color: - + Gradient: - + Horizontal - + Vertical - + Circular - + Top Left - Bottom Right - + Bottom Left - Top Right - + Main Area Font Details - + Define the font and display characteristics for the Display text - + Font: - + Size: - + Line Spacing: - + &Outline: - + &Shadow: - + Bold - + Italic - + Footer Area Font Details - + Define the font and display characteristics for the Footer text - + Text Formatting Details - + Allows additional display formatting information to be defined - + Horizontal Align: - + Left - + Right - + Center - + Output Area Locations - + Allows you to change and move the main and footer areas. - + &Main Area - + &Use default location - + X position: - + px - + Y position: - + Width: - + Height: - + Use default location - + Save and Preview - + View the theme and save it replacing the current one or change the name to create a new theme - + Theme name: - + Edit Theme - %s - + 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: - + &Footer Area - + Starting color: - + Ending color: - + Background color: 배경색: - + Justify - + Layout Preview - + Transparent @@ -4708,47 +4906,47 @@ OpenLP.ThemesTab - + Global Theme - + Theme Level - + S&ong Level - + 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 - + 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. - + &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. - + Themes @@ -4832,239 +5030,239 @@ - + Image - + Import - + Live - + Live Background Error - + 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 - + Preview - + Replace Background - + Reset 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 - + Theme Singular - + Themes Plural - + Top - + Version - + Delete the selected item. - + Move selection up one position. - + Move selection down one position. - + &Vertical Align: - + Finished import. - + Format: - + Importing - + Importing "%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. - + Open %s File - + %p% - + Ready. - + Starting import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong @@ -5080,7 +5278,7 @@ - + Welcome to the Song Import Wizard @@ -5168,53 +5366,53 @@ - + Layout style: - + Live Toolbar - + m The abbreviated unit for minutes - + OpenLP is already running. Do you wish to continue? - + Settings - + Tools - + Unsupported File - + Verse Per Slide - + Verse Per Line - + View @@ -5229,42 +5427,37 @@ - + View Mode - + Open service. - + Print Service - + Replace live background. - + Reset live background. - - &Split - - - - + Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard @@ -5274,53 +5467,105 @@ - + Play Slides in Loop - + Play Slides to End - + Stop Play Slides in Loop - + Stop Play Slides to End - + Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1, and %2 Locale list separator: end - + %1, %2 Locale list separator: middle - + %1, %2 Locale list separator: start @@ -5329,50 +5574,50 @@ PresentationPlugin - + <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. - + Presentation name singular - + Presentations name plural - + Presentations container title - + Load a new presentation. - + Delete the selected presentation. - + Preview the selected presentation. - + Send the selected presentation live. - + Add the selected presentation to the service. @@ -5380,70 +5625,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) - + Automatic - + Present using: - + File Exists - + A presentation with that filename already exists. - + This type of presentation is not supported. - + Presentations (%s) - + Missing Presentation - - The Presentation %s no longer exists. + + The presentation %s is incomplete, please reload. - - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers - + %s (unavailable) - + Allow presentation application to be overridden @@ -5477,135 +5722,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote - + OpenLP 2.0 Stage View - + Service Manager - + Slide Controller - - Alerts - - - - Search + Alerts - Back + Search - + Refresh - + Blank - + Show - + Prev - + Next - + Text - + Show Alert - + Go Live - + No Results - + Options - + Add to Service + + + Home + + + + + Theme + + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: - + Port number: - + Server Settings - + Remote URL: - + Stage view URL: - + Display stage time in 12h format - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5613,85 +5873,85 @@ SongUsagePlugin - + &Song Usage Tracking - + &Delete Tracking Data - + Delete song usage data up to a specified date. - + &Extract Tracking Data - + Generate a report on song usage. - + Toggle Tracking - + Toggle the tracking of song usage. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - + SongUsage name singular - + SongUsage name plural - + SongUsage container title - + Song Usage - + Song usage tracking is active. - + Song usage tracking is inactive. - + display - + printed @@ -5699,7 +5959,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data @@ -5724,7 +5984,7 @@ - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5732,54 +5992,54 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction - + Select Date Range - + to - + Report Location - + Output File Location - + usage_detail_%s_%s.txt - + Report Creation - + Report %s has been successfully created. - + Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5817,107 +6077,107 @@ - + Arabic (CP-1256) - + Baltic (CP-1257) - + Central European (CP-1250) - + Cyrillic (CP-1251) - + Greek (CP-1253) - + Hebrew (CP-1255) - + Japanese (CP-932) - + Korean (CP-949) - + Simplified Chinese (CP-936) - + Thai (CP-874) - + Traditional Chinese (CP-950) - + Turkish (CP-1254) - + Vietnam (CP-1258) - + Western European (CP-1252) - + Character Encoding - + 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. - + Song name singular - + Songs name plural - + Songs container title @@ -5928,32 +6188,32 @@ - + 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. @@ -5981,17 +6241,17 @@ - + You need to type in the first name of the author. - + You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? @@ -6020,209 +6280,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor - + &Title: - + Alt&ernate title: - + &Lyrics: - + &Verse order: - + Ed&it All - + Title && Lyrics - + &Add to Song - + &Remove - + &Manage Authors, Topics, Song Books - + A&dd to Song - + R&emove - + Book: - + Number: - + Authors, Topics && Song Book - + New &Theme - + Copyright Information - + Comments - + Theme, Copyright Info && Comments - + Add Author - + This author does not exist, do you want to add them? - + This author is already in the list. - + 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. - + Add Topic - + This topic does not exist, do you want to add it? - + This topic is already in the list. - + 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. - + You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book - + This song book does not exist, do you want to add it? - + You need to have an author for this song. - + You need to type some text in to the verse. - + Linked Audio - + Add &File(s) - + Add &Media - + Remove &All - + Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6336,130 +6609,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files - + 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. - + Generic Document/Presentation - - Filename: - - - - - 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. - - - - + Add Files... - + Remove File(s) - + Please wait while your songs are imported. - + OpenLP 2.0 Databases - + openlp.org v1.x Databases - + Words Of Worship Song Files - - You need to specify at least one document or presentation file to import from. - - - - + Songs Of Fellowship Song Files - + SongBeamer Files - + SongShow Plus Song Files - + Foilpresenter Song Files - + Copy - + Save to File - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. @@ -6467,43 +6760,68 @@ SongsPlugin.MediaItem - + Titles - + Lyrics - + CCLI License: - + Entire Song - + Are you sure you want to delete the %n selected song(s)? - + Maintain the lists of authors, topics and books. - + copy For song cloning + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6530,6 +6848,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6568,12 +6899,12 @@ SongsPlugin.SongImport - + copyright - + The following songs could not be imported: @@ -6594,117 +6925,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. - + This author already exists. - + Could not add your topic. - + This topic already exists. - + Could not add your book. - + This book already exists. - + Could not save your changes. - + Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. - + Delete Author - + Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic - + Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book - + Are you sure you want to delete the selected book? - + 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? - + 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? @@ -6712,28 +7035,28 @@ SongsPlugin.SongsTab - + Songs Mode - + Enable search as you type - + Display verses on live tool bar - + Update service from song edit - - Add missing songs when opening service + + Import missing songs from service files @@ -6793,4 +7116,17 @@ + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/nb.ts openlp-1.9.10/resources/i18n/nb.ts --- openlp-1.9.9/resources/i18n/nb.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/nb.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Varsel - + Show an alert message. Vis en varselmelding. - + Alert name singular Varsel - + Alerts name plural Varsler - + Alerts container title Varsler - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Varselmelding - + Alert &text: Varsel&tekst: - + &New &Ny - + &Save &Lagre - + Displ&ay Vis - + Display && Cl&ose Vis && Lukk @@ -79,7 +79,7 @@ Du har ikke spesifisert noen tekst for varselet. Vennligst skriv inn en tekst før du trykker Ny. - + &Parameter: &Parameter: @@ -117,32 +117,32 @@ AlertsPlugin.AlertsTab - + Font Skrifttype - + Font name: Skriftnavn: - + Font color: Skriftfarge: - + Background color: Bakgrunnsfarge: - + Font size: Skriftstørrelse: - + Alert timeout: Varselvarighet: @@ -150,551 +150,596 @@ BiblesPlugin - + &Bible &Bibel - + Bible name singular - + Bibles name plural - + Bibles container title - + No Book Found Ingen bok funnet - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Ingen samsvarende bok ble funnet i denne bibelen. Sjekk at du har stavet navnet på boken riktig. - + Import a Bible. - + Add a new Bible. - + Edit the selected Bible. - + Delete the selected Bible. - + Preview the selected Bible. - + Send the selected Bible live. - + Add the selected Bible to the service. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. - + &Upgrade older Bibles - + Upgrade the Bible databases to the latest format. - + Genesis - + Exodus - + Leviticus - + Numbers - + Deuteronomy - + Joshua - + Judges - + Ruth - + 1 Samuel - + 2 Samuel - + 1 Kings - + 2 Kings - + 1 Chronicles - + 2 Chronicles - + Ezra - + Nehemiah - + Esther - + Job - + Psalms - + Proverbs - + Ecclesiastes - + Song of Solomon - + Isaiah - + Jeremiah - + Lamentations - + Ezekiel - + Daniel - + Hosea - + Joel - + Amos - + Obadiah - + Jonah - + Micah - + Nahum - + Habakkuk - + Zephaniah - + Haggai - + Zechariah - + Malachi - + Matthew - + Mark - + Luke - + John - + Acts - + Romans - + 1 Corinthians - + 2 Corinthians - + Galatians - + Ephesians - + Philippians - + Colossians - + 1 Thessalonians - + 2 Thessalonians - + 1 Timothy - + 2 Timothy - + Titus - + Philemon - + Hebrews - + James - + 1 Peter - + 2 Peter - + 1 John - + 2 John - + 3 John - + Jude - + Revelation - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Du må spesifisere et versjonsnavn for Bibelen din. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Du må angi kopiretten for Bibelen. Offentlige bibler må markeres deretter. + + + + Bible Exists + Bibelen finnes + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Denne bibelen finnes alt. Vennligst importer en annen bibel eller slett først den eksisterende. + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error Bibelreferansefeil - + Web Bible cannot be used Nettbibel kan ikke brukes - + Text Search is not available with Web Bibles. Tekstsøk er ikke tilgjengelig med nettbibler. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Du har ikke angitt et søkeord. Du kan skille ulike søkeord med mellomrom for å søke etter alle søkeordene dine, og du kan skille dem med komma for å søke etter ett av dem. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Det er ingen bibler installert. Vennligst bruk importeringsveiviseren for å installere en eller flere bibler. - + No Bibles Available Ingen bibler tilgjengelig - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -710,187 +755,179 @@ BiblesPlugin.BiblesTab - + Verse Display Versvisning - + Only show new chapter numbers Bare vis nye kapittelnummer - + Bible theme: Bibel tema: - + No Brackets Ingen klammer - + ( And ) ( Og ) - + { And } { Og } - + [ And ] [ Og ] - + Note: Changes do not affect verses already in the service. Merk: Endringer påvirker ikke vers som alt er lagt til møtet. - + Display second Bible verses Vis alternative bibelvers - + Custom Scripture References - + Verse Separator: - + Range Separator: - + List Separator: - + End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + English - - Bible language + + Default Bible Language - - Application language + + Book name language in search field, +search results and on display: - - English + + Bible Language - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language BiblesPlugin.BookNameDialog - + Select Book Name - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - - - - + Current name: - + Corresponding name: - + Show Books From - + Old Testament - + New Testament - + Apocrypha + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. @@ -915,40 +952,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + Lisensdetaljer + + + + Version name: + Versjonsnavn: + + + + Copyright: + Opphavsrett: + + + + Permissions: + Tillatelser: + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... - + Registering Language... - + Importing %s... Importing <book name>... - + Download Error - + 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. - + Parse Error - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. @@ -1125,17 +1231,17 @@ BiblesPlugin.LanguageDialog - + Select Language - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - + Language: @@ -1151,85 +1257,100 @@ BiblesPlugin.MediaItem - + Quick Hurtig - + Find: - + Book: Bok: - + Chapter: Kapittel: - + Verse: Vers: - + From: - + To: - + Text Search Tekstsøk - + Second: Alternativ: - + Scripture Reference Bibelreferanse - + Toggle to keep or clear the previous results. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. - + Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importerer %s %s... @@ -1238,12 +1359,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Oppdager tegnkoding (dette kan ta noen minutter)... - + Importing %s %s... Importing <book name> <chapter>... Importerer %s %s... @@ -1252,143 +1373,143 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory - + Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory - + Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. - + Backup Directory: - + There is no need to backup my Bibles - + Select Bibles - + Please select the Bibles to upgrade - + Upgrading - + Please wait while your Bibles are upgraded. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. - + Upgrading Bible %s of %s: "%s" Failed - + Upgrading Bible %s of %s: "%s" Upgrading ... - + Download Error - + To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... - + Upgrading Bible %s of %s: "%s" Complete - + , %s failed - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s - + Upgrade failed. - + You need to specify a backup directory for your Bibles. - + Starting upgrade... - + There are no Bibles that need to be upgraded. @@ -1462,12 +1583,12 @@ CustomPlugin.CustomTab - + Custom Display Tilpasset visning - + Display footer Vis bunntekst @@ -1475,42 +1596,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Rediger egendefinerte lysbilder - + &Title: &Tittel: - + Add a new slide at bottom. Legg til nytt lysbilde nederst. - + Edit the selected slide. Rediger markert lysbilde. - + Edit all the slides at once. Rediger alle lysbilder på en gang. - + Split a slide into two by inserting a slide splitter. Del lysbilde i to ved å sette inn en lysbildedeler. - + The&me: Tema: - + &Credits: &Credits: @@ -1525,12 +1646,12 @@ Du må legge til minst et lysbilde - + Ed&it All Rediger alle - + Insert Slide @@ -1538,7 +1659,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1549,60 +1670,60 @@ ImagePlugin - + <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>Bildetillegg</strong><br />Bildetillegget gir mulighet til visning av bilder.<br />Et av særtrekkene med dette tillegget er muligheten til å gruppere flere bilder sammen i møteplanleggeren, noe som gjør visning av flere bilder enklere. Programtillegget kan også benytte seg av OpenLP's "tidsbestemte løkke"-funksjon til å lage en lysbildefremvisning som kjører automatisk. I tillegg kan bilder fra tillegget brukes til å overstyre gjeldende temabakgrunn, noe som gir tekstbaserte saker, som sanger, det valgte bildet som bakgrunn. - + Image name singular Bilde - + Images name plural Bilder - + Images container title Bilder - + Load a new image. - + Add a new image. - + Edit the selected image. - + Delete the selected image. - + Preview the selected image. - + Send the selected image live. - + Add the selected image to the service. @@ -1610,7 +1731,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Velg vedlegg @@ -1618,44 +1739,44 @@ ImagePlugin.MediaItem - + Select Image(s) - + You must select an image to delete. Du må velge et bilde å slette. - + You must select an image to replace the background with. Du må velge et bilde å erstatte bakgrunnen med. - + Missing Image(s) Bilde(r) mangler - + The following image(s) no longer exist: %s De følgende bilde(r) finnes ikke lenger: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? De følgende bilde(r) finnes ikke lenger: %s Vil du likevel legge til de andre bildene? - + There was a problem replacing your background, the image file "%s" no longer exists. Det oppstod et problem ved erstatting av bakgrunnen, bildefilen "%s" finnes ikke lenger. - + There was no display item to amend. @@ -1663,78 +1784,78 @@ ImagesPlugin.ImageTab - + Background Color - + Default Color: - - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Mediatillegg</strong><br />Mediatillegget tilbyr avspilling av lyd og video. - + Media name singular Media - + Media name plural Media - + Media container title Media - + Load new media. - + Add new media. - + Edit the selected media. - + Delete the selected media. - + Preview the selected media. - + Send the selected media live. - + Add the selected media to the service. @@ -1782,7 +1903,7 @@ - + Unsupported File @@ -1800,22 +1921,22 @@ MediaPlugin.MediaTab - + Available Media Players - + %s (unavailable) - + Player Order - + Allow media player to be overridden @@ -1823,7 +1944,7 @@ OpenLP - + Image Files Bildefiler @@ -1843,17 +1964,17 @@ OpenLP.AboutForm - + Credits Credits - + License - + Contribute Bidra @@ -1863,17 +1984,17 @@ build %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. Dette programmet er fri programvare; du kan redistribuere det og/eller endre det under betingelsene i GNU General Public License versjon 2, som publisert av Free Software Foundation. - + 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. Dette programmet er distribuert i det håp at det vil være nyttig, men UTEN NOEN FORM FOR GARANTI; selv uten underforståtte garantier om SALGBARHET eller ANVENDELIGHET FOR ET SPESIELT FORMÅL. Se nedenfor for flere detaljer. - + Project Lead %s @@ -1998,7 +2119,7 @@ fordi han har satt oss fri. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2009,7 +2130,7 @@ - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s @@ -2018,228 +2139,310 @@ OpenLP.AdvancedTab - + UI Settings Innstillinger for brukergrensesnitt - + Number of recent files to display: Antall nylig brukte filer å vise. - + Remember active media manager tab on startup Husk aktiv mediebehandlerfane ved oppstart - + Double-click to send items straight to live Dobbelklikk for å sende saker direkte live - + Expand new service items on creation Utvid nye møteenheter ved opprettelse - + Enable application exit confirmation Aktiver avsluttningsbekreftelse - + Mouse Cursor - + Hide mouse cursor when over display window - + Default Image - + Background color: Bakgrunnsfarge: - - Image file: + + Image file: + + + + + Open File + + + + + Advanced + + + + + Preview items when clicked in Media Manager + + + + + Click to select a color. + + + + + Browse for an image file to display. + + + + + Revert to the default OpenLP logo. + + + + + Service %Y-%m-%d %H-%M + This may not contain any of the following characters: /\?*|<>[]":+ +See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + + + + Default Service Name + + + + + Enable default service name + + + + + Date and Time: + + + + + Monday + + + + + Tuesday + + + + + Wednesday + + + + + Thurdsday + + + + + Friday + + + + + Saturday - - Open File + + Sunday - - Advanced + + Now - - Preview items when clicked in Media Manager + + Time when usual service starts. - - Click to select a color. + + Name: - - Browse for an image file to display. + + Consult the OpenLP manual for usage. - - Revert to the default OpenLP logo. + + Revert to the default service name "%s". - - Service %Y-%m-%d %H-%M - This may not contain any of the following characters: /\?*|<>[]":+ -See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + Example: - - Default Service Name + + X11 - - Enable default service name + + Bypass X11 Window Manager - - Date and Time: + + Syntax error. - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday + + Cancel - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. - + Send E-Mail - + Save to File - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) - + Attach File - + Description characters to enter : %s @@ -2247,23 +2450,23 @@ OpenLP.ExceptionForm - + Platform: %s - + Save Crash Report - + Text files (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2281,7 +2484,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2404,17 +2607,17 @@ - + Downloading %s... - + Download complete. Click the finish button to start OpenLP. - + Enabling selected plugins... @@ -2484,32 +2687,32 @@ - + Setting Up And Downloading - + Please wait while OpenLP is set up and your data is downloaded. - + Setting Up - + Click the finish button to start OpenLP. - + Download complete. Click the finish button to return to OpenLP. - + Click the finish button to return to OpenLP. @@ -2519,8 +2722,13 @@ + + Finish + + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2529,64 +2737,59 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - - - - Finish +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. OpenLP.FormattingTagDialog - + Configure Formatting Tags - + Edit Selection - + Save - + Description - + Tag - + Start tag - + End tag - + Tag Id - + Start HTML - + End HTML @@ -2594,32 +2797,32 @@ OpenLP.FormattingTagForm - + Update Error - + Tag "n" already defined. - + New Tag - + <HTML here> - + </and here> - + Tag %s already defined. @@ -2627,82 +2830,82 @@ OpenLP.FormattingTags - + Red - + Black - + Blue - + Yellow - + Green - + Pink - + Orange - + Purple - + White - + Superscript - + Subscript - + Paragraph - + Bold - + Italics - + Underline - + Break @@ -2710,180 +2913,170 @@ OpenLP.GeneralTab - + General - + Monitors - + Select monitor for output display: - + Display if a single screen - + Application Startup Programoppstart - + Show blank screen warning - + Automatically open the last service Åpne forrige møteplan automatisk - + Show the splash screen - + Application Settings Programinnstillinger - + Prompt to save before starting a new service - + Automatically preview next item in service - + sec - + CCLI Details - + SongSelect username: - + SongSelect password: - + X - + Y - + Height - + Width - + Check for updates to OpenLP - + Unblank display when adding new live item - + Timed slide interval: - + Background Audio - + Start background audio paused - + Service Item Slide Limits - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide + + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item + + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide - - Override display position: + + &Wrap around - - Repeat track list + + &Move to next/previous service item OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -2899,438 +3092,438 @@ OpenLP.MainWindow - + &File &Fil - + &Import &Importer - + &Export &Eksporter - + &View - + M&ode - + &Tools - + &Settings &Innstillinger - + &Language - + &Help &Hjelp - + Media Manager - + Service Manager - + Theme Manager - + &New &Ny - + &Open - + Open an existing service. - + &Save &Lagre - + Save the current service to disk. - + Save &As... - + Save Service As - + Save the current service under a new name. - + E&xit &Avslutt - + Quit OpenLP - + &Theme - + &Configure OpenLP... - + &Media Manager - + Toggle Media Manager - + Toggle the visibility of the media manager. - + &Theme Manager - + Toggle Theme Manager - + Toggle the visibility of the theme manager. - + &Service Manager - + Toggle Service Manager - + Toggle the visibility of the service manager. - + &Preview Panel &Forhåndsvisningspanel - + Toggle Preview Panel Vis forhåndsvisningspanel - + Toggle the visibility of the preview panel. - + &Live Panel - + Toggle Live Panel - + Toggle the visibility of the live panel. - + &Plugin List - + List the Plugins - + &User Guide &Brukerveiledning - + &About - + More information about OpenLP - + &Online Help - + &Web Site - + Use the system language, if available. - + Set the interface language to %s - + Add &Tool... - + Add an application to the list of tools. - + &Default - + Set the view mode back to the default. - + &Setup - + Set the view mode to Setup. - + &Live - + 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/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s - + English Please add the name of your language here - + Configure &Shortcuts... - + Close OpenLP - + Are you sure you want to close OpenLP? - + Open &Data Folder... - + Open the folder where songs, bibles and other data resides. - + &Autodetect - + Update Theme Images - + Update the preview images for all themes. - + Print the current service. - + &Recent Files - + L&ock Panels - + Prevent the panels being moved. - + Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files - + Clear the list of recent files. - + Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file - + Settings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3339,52 +3532,57 @@ - + Open File - + OpenLP Export Settings Files (*.conf) - + Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File - + OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s - + OpenLP cannot load your database. Database: %s @@ -3394,73 +3592,73 @@ OpenLP.MediaManagerItem - + No Items Selected - + &Add to selected Service Item - + You must select one or more items to preview. - + You must select one or more items to send live. - + You must select one or more items. - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. - + You must select one or more items to add. - + No Search Results - + Invalid File Type - + Invalid File %s. Suffix not supported - + &Clone - + Duplicate files were found on import and were ignored. @@ -3468,12 +3666,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <verse> tag is missing. @@ -3481,27 +3679,27 @@ OpenLP.PluginForm - + Plugin List - + Plugin Details - + Status: - + Active Aktiv - + Inactive @@ -3524,12 +3722,12 @@ OpenLP.PrintServiceDialog - + Fit Page - + Fit Width @@ -3537,7 +3735,7 @@ OpenLP.PrintServiceForm - + Options @@ -3552,47 +3750,47 @@ - + Zoom In - + Zoom Out - + Zoom Original - + Other Options - + Include slide text if available - + Include service item notes - + Include play length of media items - + Add page break before each text item - + Service Sheet @@ -3602,12 +3800,12 @@ - + Title: - + Custom Footer Text: @@ -3615,12 +3813,12 @@ OpenLP.ScreenList - + Screen - + primary @@ -3628,12 +3826,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s - + <strong>Length</strong>: %s @@ -3641,7 +3839,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item @@ -3649,82 +3847,82 @@ OpenLP.ServiceManager - + Move to &top - + Move item to the top of the service. - + Move &up - + Move item up one position in the service. - + Move &down - + Move item down one position in the service. - + Move to &bottom - + Move item to the end of the service. - + &Delete From Service - + Delete the selected item from the service. - + &Add New Item - + &Add to Selected Item - + &Edit Item - + &Reorder Item - + &Notes - + &Change Item Theme @@ -3745,112 +3943,107 @@ - + 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 - + &Expand all - + Expand all the service items. - + &Collapse all - + Collapse all the service items. - + Open File - + Moves the selection down the window. - + Move up - + Moves the selection up the window. - + Go Live - + Send the selected item to Live. - + &Start Time - - Show &Preview - - - - Show &Live + Show &Preview - + Modified Service - + The current service has been modified. Would you like to save this service? - + Custom Service Notes: - + Notes: - + Playing time: - + Untitled Service @@ -3875,17 +4068,17 @@ - + Load an existing service. - + Save this service. - + Select a theme for the service. @@ -3895,7 +4088,7 @@ - + Service File Missing @@ -3919,11 +4112,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes @@ -3939,67 +4142,67 @@ OpenLP.ShortcutListDialog - + Action - + Shortcut - + Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default - + Custom - + Capture shortcut. - + Restore the default shortcut of this action. - + Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts @@ -4007,177 +4210,172 @@ OpenLP.SlideController - + Hide - + Go To - + Blank Screen - + Blank to Theme - + Show Desktop - + Previous Service - + Next Service - + Escape Item - + Move to previous. - + Move to next. - + Play Slides - + Delay between slides in seconds. - + Move to live. - + Add to Service. - + Edit and reload song preview. - + Start playing media. - + Pause audio. - + Pause playing media. - + Stop playing media. - + Video position. - + Audio Volume. - + Go to "Verse" - + Go to "Chorus" - + Go to "Bridge" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" - + Previous Slide - + Next Slide - + Pause Audio - + Background Audio - - Next Track - - - - + Go to next audio track. - + Tracks @@ -4253,17 +4451,17 @@ - + Theme Layout - + The blue box shows the main area. - + The red box shows the footer. @@ -4271,32 +4469,32 @@ OpenLP.ThemeForm - + Select Image - + Theme Name Missing - + There is no name for this theme. Please enter one. - + Theme Name Invalid - + Invalid theme name. Please enter one. - + (approximately %d lines per slide) @@ -4304,193 +4502,193 @@ OpenLP.ThemeManager - + Create a new theme. - + Edit Theme - + Edit a theme. - + Delete Theme - + Delete a theme. - + Import Theme - + Import a theme. - + Export Theme - + Export a theme. - + &Edit Theme - + &Delete Theme - + Set As &Global Default - + %s (default) - + You must select a theme to edit. - + You are unable to delete the default theme. Du kan ikke slette det globale temaet. - + 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. Filen er ikke et gyldig tema. - + &Copy Theme - + &Rename Theme - + &Export Theme - + 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) - + Copy of %s Copy of <theme name> - + Theme Already Exists @@ -4498,272 +4696,272 @@ OpenLP.ThemeWizard - + Theme Wizard - + Welcome to the Theme Wizard - + Set Up Background - + Set up your theme's background according to the parameters below. - + Background type: - + Solid Color - + Gradient - + Color: - + Gradient: - + Horizontal - + Vertical - + Circular - + Top Left - Bottom Right - + Bottom Left - Top Right - + Main Area Font Details - + Define the font and display characteristics for the Display text - + Font: - + Size: - + Line Spacing: - + &Outline: - + &Shadow: - + Bold - + Italic - + Footer Area Font Details - + Define the font and display characteristics for the Footer text - + Text Formatting Details - + Allows additional display formatting information to be defined - + Horizontal Align: - + Left - + Right - + Center - + Output Area Locations - + Allows you to change and move the main and footer areas. - + &Main Area - + &Use default location - + X position: - + px - + Y position: - + Width: - + Height: - + Use default location - + Save and Preview - + View the theme and save it replacing the current one or change the name to create a new theme - + Theme name: - + Edit Theme - %s - + 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: - + &Footer Area - + Starting color: - + Ending color: - + Background color: Bakgrunnsfarge: - + Justify - + Layout Preview - + Transparent @@ -4771,47 +4969,47 @@ OpenLP.ThemesTab - + Global Theme - + Theme Level - + S&ong Level - + 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 - + 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. - + &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. - + Themes @@ -4895,239 +5093,239 @@ - + Image Bilde - + Import - + Live - + Live Background Error - + 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 - + Preview - + Replace Background - + Reset 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 - + Theme Singular - + Themes Plural - + Top - + Version - + Delete the selected item. - + Move selection up one position. - + Move selection down one position. - + &Vertical Align: - + Finished import. - + Format: - + Importing - + Importing "%s"... - + Select Import Source Velg importeringskilde - + 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. - + Open %s File - + %p% - + Ready. - + Starting import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong @@ -5143,7 +5341,7 @@ - + Welcome to the Song Import Wizard @@ -5231,53 +5429,53 @@ - + Layout style: - + Live Toolbar - + m The abbreviated unit for minutes - + OpenLP is already running. Do you wish to continue? - + Settings - + Tools - + Unsupported File - + Verse Per Slide - + Verse Per Line - + View @@ -5292,42 +5490,37 @@ - + View Mode - + Open service. - + Print Service - + Replace live background. - + Reset live background. - - &Split - - - - + Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard @@ -5337,53 +5530,105 @@ - + Play Slides in Loop - + Play Slides to End - + Stop Play Slides in Loop - + Stop Play Slides to End - + Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1, and %2 Locale list separator: end - + %1, %2 Locale list separator: middle - + %1, %2 Locale list separator: start @@ -5392,50 +5637,50 @@ PresentationPlugin - + <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. - + Presentation name singular - + Presentations name plural - + Presentations container title - + Load a new presentation. - + Delete the selected presentation. - + Preview the selected presentation. - + Send the selected presentation live. - + Add the selected presentation to the service. @@ -5443,70 +5688,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) - + Automatic - + Present using: - + File Exists - + A presentation with that filename already exists. - + This type of presentation is not supported. - + Presentations (%s) - + Missing Presentation - - The Presentation %s no longer exists. + + The presentation %s is incomplete, please reload. - - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers - + %s (unavailable) - + Allow presentation application to be overridden @@ -5540,135 +5785,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote - + OpenLP 2.0 Stage View - + Service Manager - + Slide Controller - + Alerts Varsler - - Search - - - - Back + Search - + Refresh - + Blank - + Show - + Prev - + Next - + Text - + Show Alert - + Go Live - + No Results - + Options - + Add to Service + + + Home + + + + + Theme + + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: - + Port number: - + Server Settings - + Remote URL: - + Stage view URL: - + Display stage time in 12h format - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5676,85 +5936,85 @@ SongUsagePlugin - + &Song Usage Tracking - + &Delete Tracking Data - + Delete song usage data up to a specified date. - + &Extract Tracking Data - + Generate a report on song usage. - + Toggle Tracking - + Toggle the tracking of song usage. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - + SongUsage name singular - + SongUsage name plural - + SongUsage container title - + Song Usage - + Song usage tracking is active. - + Song usage tracking is inactive. - + display - + printed @@ -5762,7 +6022,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data @@ -5787,7 +6047,7 @@ - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5795,54 +6055,54 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction - + Select Date Range Velg dato-område - + to - + Report Location - + Output File Location - + usage_detail_%s_%s.txt - + Report Creation - + Report %s has been successfully created. - + Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5880,107 +6140,107 @@ - + Arabic (CP-1256) - + Baltic (CP-1257) - + Central European (CP-1250) - + Cyrillic (CP-1251) - + Greek (CP-1253) - + Hebrew (CP-1255) - + Japanese (CP-932) - + Korean (CP-949) - + Simplified Chinese (CP-936) - + Thai (CP-874) - + Traditional Chinese (CP-950) - + Turkish (CP-1254) - + Vietnam (CP-1258) - + Western European (CP-1252) - + Character Encoding - + 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. - + Song name singular - + Songs name plural - + Songs container title @@ -5991,32 +6251,32 @@ - + 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. @@ -6044,17 +6304,17 @@ - + You need to type in the first name of the author. - + You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? @@ -6083,209 +6343,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor Sangredigeringsverktøy - + &Title: &Tittel: - + Alt&ernate title: - + &Lyrics: - + &Verse order: - + Ed&it All Rediger alle - + Title && Lyrics - + &Add to Song - + &Remove - + &Manage Authors, Topics, Song Books - + A&dd to Song - + R&emove - + Book: Bok: - + Number: - + Authors, Topics && Song Book - + New &Theme - + Copyright Information - + Comments - + Theme, Copyright Info && Comments - + Add Author - + This author does not exist, do you want to add them? - + This author is already in the list. - + 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. - + Add Topic - + This topic does not exist, do you want to add it? - + This topic is already in the list. - + 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. - + You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book - + This song book does not exist, do you want to add it? - + You need to have an author for this song. - + You need to type some text in to the verse. - + Linked Audio - + Add &File(s) - + Add &Media - + Remove &All - + Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6399,130 +6672,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files - + 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. - + Generic Document/Presentation - - Filename: - - - - - 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. - - - - + Add Files... - + Remove File(s) - + Please wait while your songs are imported. - + OpenLP 2.0 Databases - + openlp.org v1.x Databases - + Words Of Worship Song Files - - You need to specify at least one document or presentation file to import from. - - - - + Songs Of Fellowship Song Files - + SongBeamer Files - + SongShow Plus Song Files - + Foilpresenter Song Files - + Copy - + Save to File - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. @@ -6530,27 +6823,27 @@ SongsPlugin.MediaItem - + Titles Titler - + Lyrics - + CCLI License: - + Entire Song - + Are you sure you want to delete the %n selected song(s)? @@ -6558,16 +6851,41 @@ - + Maintain the lists of authors, topics and books. - + copy For song cloning + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6594,6 +6912,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6632,12 +6963,12 @@ SongsPlugin.SongImport - + copyright - + The following songs could not be imported: @@ -6658,117 +6989,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. - + This author already exists. - + Could not add your topic. - + This topic already exists. - + Could not add your book. - + This book already exists. - + Could not save your changes. - + Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. - + Delete Author - + Are you sure you want to delete the selected author? Er du sikker på at du vil slette den valgte forfatteren? - + This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic - + Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book - + Are you sure you want to delete the selected book? - + 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? - + 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? @@ -6776,28 +7099,28 @@ SongsPlugin.SongsTab - + Songs Mode - + Enable search as you type - + Display verses on live tool bar - + Update service from song edit - - Add missing songs when opening service + + Import missing songs from service files @@ -6857,4 +7180,17 @@ Annet + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/nl.ts openlp-1.9.10/resources/i18n/nl.ts --- openlp-1.9.9/resources/i18n/nl.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/nl.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert W&aarschuwing - + Show an alert message. Toon waarschuwingsberichten. - + Alert name singular Waarschuwing - + Alerts name plural Waarschuwingen - + Alerts container title Waarschuwingen - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Waarschuwings Plug-in</strong><br />De waarschuwings plug-in regelt de weergave van waarschuwingen op het scherm. Bijvoorbeeld voor de kinderopvang. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Waarschuwing - + Alert &text: Waarschuwings&text: - + &New &Nieuw - + &Save Op&slaan - + Displ&ay Wee&rgeven - + Display && Cl&ose &Weergeven en sluiten @@ -79,7 +79,7 @@ De waarschuwing bevat geen tekst. Voer eerst tekst in voordat u op nieuw klikt. - + &Parameter: &Parameter: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Lettertype - + Font name: Naam lettertype: - + Font color: Letterkleur: - + Background color: Achtergrondkleur: - + Font size: Corpsgrootte: - + Alert timeout: Tijdsduur: @@ -152,551 +152,596 @@ BiblesPlugin - + &Bible &Bijbel - + Bible name singular bijbeltekst - + Bibles name plural bijbelteksten - + Bibles container title Bijbelteksten - + No Book Found Geen bijbelboek gevonden - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Er kon geen bijbelboek met die naam gevonden worden. Controleer de spelling. - + Import a Bible. Importeer een Bijbel. - + Add a new Bible. Voeg een nieuwe Bijbel toe. - + Edit the selected Bible. Geselecteerde Bijbel bewerken. - + Delete the selected Bible. Geselecteerde Bijbel verwijderen. - + Preview the selected Bible. Voorbeeld geselecteerde bijbeltekst. - + Send the selected Bible live. Geselecteerde bijbeltekst live tonen. - + Add the selected Bible to the service. Geselecteerde bijbeltekst aan de liturgie toevoegen. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Bijbel Plugin</strong><br />De Bijbel plugin voorziet in de mogelijkheid bijbelteksten uit verschillende bronnen weer te geven tijdens de dienst. - + &Upgrade older Bibles &Upgrade oude bijbels - + Upgrade the Bible databases to the latest format. Upgrade de bijbel databases naar de meest recente indeling. - + Genesis Genesis - + Exodus Exodus - + Leviticus Leviticus - + Numbers Numeri - + Deuteronomy Deuteronomium - + Joshua Jozua - + Judges Rechteren - + Ruth Ruth - + 1 Samuel 1 Samuël - + 2 Samuel 2 Samuël - + 1 Kings 1 Koningen - + 2 Kings 2 Koningen - + 1 Chronicles 1 Kronieken - + 2 Chronicles 2 Kronieken - + Ezra Ezra - + Nehemiah Nehemiah - + Esther Esther - + Job Job - + Psalms Psalmen - + Proverbs Spreuken - + Ecclesiastes Prediker - + Song of Solomon Hooglied - + Isaiah Jesaja - + Jeremiah Jeremia - + Lamentations Klaagliederen - + Ezekiel Ezechiël - + Daniel Daniël - + Hosea Hosea - + Joel Joël - + Amos Amos - + Obadiah Obadja - + Jonah Jona - + Micah Micha - + Nahum Nahum - + Habakkuk Habakuk - + Zephaniah Sefanja - + Haggai Haggai - + Zechariah Zacharias - + Malachi Maleachi - + Matthew Matteüs - + Mark Marcus - + Luke Lucas - + John Johannes - + Acts Handelingen - + Romans Romeinen - + 1 Corinthians 1 Korintiërs - + 2 Corinthians 2 Korintiërs - + Galatians Galaten - + Ephesians Efeziërs - + Philippians Filippenzen - + Colossians Kolossenzen - + 1 Thessalonians 1 Tessalonicenzen - + 2 Thessalonians 2Tessalonicenzen - + 1 Timothy 1 Timoteüs - + 2 Timothy 2 Timoteüs - + Titus Titus - + Philemon Filemon - + Hebrews Hebreeën - + James Jakobus - + 1 Peter 1 Petrus - + 2 Peter 2 Petrus - + 1 John 1 Johannes - + 2 John 2 Johannes - + 3 John 3 Johannes - + Jude Judas - + Revelation Openbaringen - + Judith Judith - + Wisdom Wijsheid - + Tobit Tobit - + Sirach Sirach - + Baruch Baruch - + 1 Maccabees 1 Makkabeeën - + 2 Maccabees 2 Makkabeeën - + 3 Maccabees 3 Makkabeeën - + 4 Maccabees 4 Makkabeeën - + Rest of Daniel Toevoegingen aan Daniël - + Rest of Esther Ester (Grieks) - + Prayer of Manasses Manasse - + Letter of Jeremiah Brief van Jeremia - + Prayer of Azariah Gebed van Azariah - + Susanna Susanna - + Bel Bel - + 1 Esdras 1 Esdras - + 2 Esdras 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. :|v|V|vers|verzen;;-|tot;;,|en;;eind + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Geef de naam van de bijbelvertaling op. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Copyright moet opgegeven worden. Bijbels in het publieke domein moeten als zodanig gemarkeerd worden. + + + + Bible Exists + Deze bijbelvertaling bestaat reeds + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Deze bijbel bestaat reeds. Geef een andere naam of verwijder eerst het bestaande exemplaar. + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error Fouten in schriftverwijzingen - + Web Bible cannot be used Online bijbels kunnen niet worden gebruikt - + Text Search is not available with Web Bibles. In online bijbels kunt u niet zoeken op tekst. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Geen zoekterm opgegeven. Woorden met een spatie ertussen betekent zoeken naar alle woorden, Woorden met een komma ertussen betekent zoeken naar de afzonderlijke woorden. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Er zijn geen bijbels geïnstalleerd. Gebruik de Import assistent om een of meerdere bijbels te installeren. - + No Bibles Available Geen bijbels beschikbaar - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +764,79 @@ BiblesPlugin.BiblesTab - + Verse Display Bijbeltekst weergave - + Only show new chapter numbers Toon alleen nieuw hoodstuknummer - + Bible theme: Bijbel thema: - + No Brackets geen haakjes - + ( And ) ( en ) - + { And } { en } - + [ And ] [ en ] - + Note: Changes do not affect verses already in the service. Nota Bene: Deze wijzigingen hebben geen betrekking op bijbelverzen die al in de liturgie zijn opgenomen. - + Display second Bible verses Toon tweede bijbelvertaling - + Custom Scripture References Aangepaste schriftverwijzingen - + Verse Separator: Vers scheidingsteken: - + Range Separator: Bereik scheidingsteken: - + List Separator: Lijst scheidingsteken: - + End Mark: End teken: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +845,7 @@ Maak de regel leeg om de standaardinstelling te gebruiken. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +854,7 @@ Maak de regel leeg om de standaardinstelling te gebruiken. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +863,7 @@ Maak de regel leeg om de standaardinstelling te gebruiken. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,91 +872,79 @@ Maak de regel leeg om de standaardinstelling te gebruiken. - - Preferred Bookname Language - Voorkeurstaal bijbelboeken - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Kies de taal waarin de bijbelboeken moeten -worden getoond in het zoekveld: + + English + Engels - - Bible language - Bijbeltaal + + Default Bible Language + - - Application language - Programmataal + + Book name language in search field, +search results and on display: + - - English - Engels + + Bible Language + - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Meerdere opties: -Bijbeltaal - de taal waarin de bijbelboeken zijn geïmporteerd -Programmataal - de taal de gebruikt wordt voor OpenLP -Engels - altijd de Engelse namen voor bijbelboeken gebruiken + + Application Language + BiblesPlugin.BookNameDialog - + Select Book Name Selecteer naam bijbelboek - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Er kon geen bijbelboek met die naam gevonden worden. Selecteer de overeenkomstige Engels naam uit de lijst. - - - + Current name: Huidige naam: - + Corresponding name: Overeenkomstige naam: - + Show Books From Toon boeken uit - + Old Testament Oude Testament - + New Testament Nieuwe Testament - + Apocrypha Apocriefe boeken + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. Geef een boek op. @@ -936,40 +969,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + Licentiedetails + + + + Version name: + Bijbeluitgave: + + + + Copyright: + Copyright: + + + + Permissions: + Rechten: + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registreer Bijbel en laad de boeken... - + Registering Language... Registreer de taal... - + Importing %s... Importing <book name>... Importeer "%s"... - + Download Error Download fout - + 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. Er ging iets mis bij het downloaden van de bijbelverzen. Controleer uw internet verbinding (open bijv. een pagina in de internetbrowser). Als dit probleem zich blijft herhalen is er misschien sprake van een bug. - + Parse Error Verwerkingsfout - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Er ging iets mis bij het uitpakken van de bijbelverzen. Als dit probleem zich blijft herhalen is er misschien sprake van een bug. @@ -1147,17 +1249,17 @@ BiblesPlugin.LanguageDialog - + Select Language Selecteer taal - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP kan niet bepalen in welke taal deze Bijbel is geschreven. Selecteer een taal uit de onderstaande lijst. - + Language: Taal: @@ -1173,85 +1275,100 @@ BiblesPlugin.MediaItem - + Quick Snelzoeken - + Find: Vind: - + Book: Boek: - + Chapter: Hoofdstuk: - + Verse: Vers: - + From: Van: - + To: Tot: - + Text Search Zoek op tekst - + Second: Tweede: - + Scripture Reference Schriftverwijzing - + Toggle to keep or clear the previous results. Zoekresultaten wel / niet behouden. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Enkele en dubbele bijbelvers zoekresultaten kunnen niet gecombineerd worden. Resultaten wissen en opnieuw beginnen? - + Bible not fully loaded. Bijbel niet geheel geladen. - + Information Informatie - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. De tweede bijbelvertaling bevat niet alle verzen die in de eerste bijbelvertaling staan. Alleen de verzen die in beide vertalingen voorkomen worden getoond. %d verzen zijn niet opgenomen in de resultaten. + + + Search Scripture Reference... + Doorzoek schriftverwijzing + + + + Search Text... + Doorzoek tekst... + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... %s %s wordt geïmporteerd... @@ -1260,12 +1377,12 @@ 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... @@ -1274,149 +1391,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Selecteer Backup map - + Bible Upgrade Wizard Bijbel Upgrade Assistent - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Deze Assistent helpt u bestaande bijbels op te waarderen van een eerdere indeling van OpenLP 2. Om de Assistent te starten klikt op volgende. - + Select Backup Directory Selecteer Backup map - + Please select a backup directory for your Bibles Selecteer een map om de backup van uw bijbel in op te slaan - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Eerdere versies van OpenLP 2.0 kunnen de nieuwe bijbelbestanden niet lezen. De assistent maakt een backup van uw huidige bestanden zodat u eenvoudig de bijbels terug kunt zetten in de OpenLP data-map voor het geval u met een oude versie van OpenLP moet werken. Instructies hoe de oorspronkelijke bestanden te herstellen staan in de <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>(engelstalig). - + Please select a backup location for your Bibles. Selecteer een map om de backup van uw bijbel in op te slaan. - + Backup Directory: Backup map: - + There is no need to backup my Bibles Er hoeft geen Backup gemaakt te worden - + Select Bibles Selecteer bijbels - + Please select the Bibles to upgrade Selecteer de bijbels om op te waarderen - + Upgrading Opwaarderen - + Please wait while your Bibles are upgraded. Even geduld. De bijbels worden opgewaardeerd. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. De backup is mislukt. Om bijbels op te waarderen moet de map beschrijfbaar zijn.. - + Upgrading Bible %s of %s: "%s" Failed Opwaarderen Bijbel %s van %s: "%s" Faal - + Upgrading Bible %s of %s: "%s" Upgrading ... Opwaarderen Bijbel %s van %s: "%s" Opwaarderen ... - + Download Error Download fout - + To upgrade your Web Bibles an Internet connection is required. Om online bijbels op te waarderen is een internet verbinding noodzakelijk. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Opwaarderen Bijbel %s van %s: "%s" Opwaarderen %s ... - + Upgrading Bible %s of %s: "%s" Complete Opwaarderen Bijbel %s van %s: "%s" Klaar - + , %s failed , %s mislukt - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Opwaarderen Bijbel(s): %s gelukt%s Let op, de bijbelverzen worden gedownload indien nodig en een internetverbinding is dus noodzakelijk. - + Upgrading Bible(s): %s successful%s Opwaarderen Bijbel(s): %s gelukt%s - + Upgrade failed. Opwaarderen mislukt. - + You need to specify a backup directory for your Bibles. Selecteer een map om de backup van uw bijbels in op te slaan. - + Starting upgrade... Start upgrade... - + There are no Bibles that need to be upgraded. Er zijn geen bijbels om op te waarderen. @@ -1490,12 +1607,12 @@ CustomPlugin.CustomTab - + Custom Display Aangepaste weergave - + Display footer Voettekst weergeven @@ -1503,42 +1620,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Aangepaste dia's bewerken - + &Title: &Titel: - + Add a new slide at bottom. Nieuwe dia onderaan invoegen. - + Edit the selected slide. Geselecteerde dia bewerken. - + Edit all the slides at once. Alle dia's tegelijk bewerken. - + Split a slide into two by inserting a slide splitter. Dia doormidden delen door een dia 'splitter' in te voegen. - + The&me: The&ma: - + &Credits: &Credits: @@ -1553,12 +1670,12 @@ Minstens een dia invoegen - + Ed&it All &Alles bewerken - + Insert Slide Invoegen dia @@ -1566,7 +1683,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Weet u zeker dat u %n geslecteerde dia(s) wilt verwijderen? @@ -1577,60 +1694,60 @@ ImagePlugin - + <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>Afbeeldingen Plugin</strong><br />De afbeeldingen plugin voorziet in de mogelijkheid afbeeldingen te laten zien.<br />Een van de bijzondere mogelijkheden is dat meerdere afbeeldingen als groep in de liturgie worden opgenomen, zodat weergave van meerdere afbeeldingen eenvoudiger wordt. Deze plugin maakt doorlopende diashows (bijv. om de 3 sec. een nieuwe dia) mogelijk. Ook kun met deze plugin de achtergrondafbeelding van het thema vervangen met een andere afbeelding. Ook de combinatie van tekst en beeld is mogelijk. - + Image name singular Afbeelding - + Images name plural Bilder - + Images container title Afbeeldingen - + Load a new image. Afbeelding laden. - + Add a new image. Afbeelding toevoegen. - + Edit the selected image. Afbeelding bewerken. - + Delete the selected image. Geselecteerde afbeelding wissen. - + Preview the selected image. Geselecteerde afbeelding voorbeeld bekijken. - + Send the selected image live. Geselecteerde afbeelding Live tonen. - + Add the selected image to the service. Geselecteerde afbeelding aan liturgie toevoegen. @@ -1638,7 +1755,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Selecteer bijlage @@ -1646,44 +1763,44 @@ ImagePlugin.MediaItem - + Select Image(s) Selecteer afbeelding(en) - + You must select an image to delete. Selecteer een afbeelding om te verwijderen. - + You must select an image to replace the background with. Selecteer een afbeelding om de achtergrond te vervangen. - + Missing Image(s) Ontbrekende afbeelding(en) - + The following image(s) no longer exist: %s De volgende afbeelding(en) ontbreken: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? De volgende afbeelding(en) ontbreken: %s De andere afbeeldingen alsnog toevoegen? - + There was a problem replacing your background, the image file "%s" no longer exists. Achtergrond kan niet vervangen worden, omdat de afbeelding "%s" ontbreekt. - + There was no display item to amend. Er is geen weergave item om te verbeteren. @@ -1691,78 +1808,78 @@ ImagesPlugin.ImageTab - + Background Color Achtergrondkleur - + Default Color: Standaard kleur: - - Provides border where image is not the correct dimensions for the screen when resized. - Voorziet in een rand om de afbeelding als de verhoudingen niet overeenkomen met de schermafmetingen. + + Visible background for images with aspect ratio different to screen. + MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Media Plugin</strong><br />De media plugin voorziet in mogelijkheden audio en video af te spelen. - + Media name singular Medien - + Media name plural Medien - + Media container title Media - + Load new media. Laad nieuw media bestand. - + Add new media. Voeg nieuwe media toe. - + Edit the selected media. Bewerk geselecteerd media bestand. - + Delete the selected media. Verwijder geselecteerd media bestand. - + Preview the selected media. Toon voorbeeld van geselecteerd media bestand. - + Send the selected media live. Toon geselecteerd media bestand Live. - + Add the selected media to the service. Voeg geselecteerd media bestand aan liturgie toe. @@ -1810,7 +1927,7 @@ Er is geen weergave item om te verbeteren. - + Unsupported File Niet ondersteund bestandsformaat @@ -1828,22 +1945,22 @@ MediaPlugin.MediaTab - + Available Media Players Beschikbare media spelers - + %s (unavailable) %s (niet beschikbaar) - + Player Order Speler volgorde - + Allow media player to be overridden Toestaan om de mediaspeler te overschrijven @@ -1851,7 +1968,7 @@ OpenLP - + Image Files Afbeeldingsbestanden @@ -1873,17 +1990,17 @@ OpenLP.AboutForm - + Credits Credits - + License Licentie - + Contribute Bijdragen @@ -1893,17 +2010,17 @@ build %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. 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 @@ -2030,7 +2147,7 @@ Deze tekst is niet vertaald. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2047,7 +2164,7 @@ OpenLP wordt ontwikkeld en bijgehouden door vrijwilligers. Als u meer vrije software op het gebied van het christelijk geloof wilt zien, overweeg dan een bijdrage te leveren door onderstaande knop te gebruiken. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Copyright © 2004-2012 %s @@ -2057,87 +2174,87 @@ OpenLP.AdvancedTab - + UI Settings Werkomgeving instellingen - + Number of recent files to display: Aantal recent geopende bestanden: - + Remember active media manager tab on startup Laatstgeopende tab opslaan - + Double-click to send items straight to live Dubbelklikken om onderdelen direct aan live toe te voegen - + Expand new service items on creation Nieuwe liturgieonderdelen automatisch uitklappen - + Enable application exit confirmation Afsluiten OpenLP bevestigen - + Mouse Cursor Muisaanwijzer - + Hide mouse cursor when over display window Verberg muisaanwijzer in het weergave venster - + Default Image standaard afbeelding - + Background color: Achtergrondkleur: - + Image file: Afbeeldingsbestand: - + Open File Open bestand - + Advanced Geavanceerd - + Preview items when clicked in Media Manager Voorbeeld direct laten zien bij aanklikken in Media beheer - + Click to select a color. Klik om een kleur te kiezen. - + Browse for an image file to display. Blader naar een afbeelding om te laten zien. - + Revert to the default OpenLP logo. Herstel standaard OpenLP logo. @@ -2149,138 +2266,220 @@ Liturgie %d-%m-%Y %H-%M - + Default Service Name Standaard liturgienaam - + Enable default service name Gebruik standaard liturgienaam - + Date and Time: Datum en tijd: - + Monday maandag - + Tuesday dinsdag - + Wednesday woensdag - + Thurdsday donderdag - + Friday vrijdag - + Saturday zaterdag - + Sunday zondag - + Now Nu - + Time when usual service starts. Begintijd gewone dienst - + Name: Naam: - + Consult the OpenLP manual for usage. Raadpleeg de OpenLP handleiding voor gebruik. - + Revert to the default service name "%s". Herstel de standaard liturgienaam "%s". - + Example: Voorbeeld: - + X11 X11 - + Bypass X11 Window Manager Negeer X11 Window Manager - + Syntax error. Syntax error. + + + Data Location + + + + + Current path: + + + + + Custom path: + + + + + Browse for new data file location. + + + + + Set the data location to the default. + + + + + Cancel + Annuleren + + + + Cancel OpenLP data directory location change. + + + + + Copy data to new location. + + + + + Copy the OpenLP data files to the new location. + + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + + + + + Data Directory Error + + + + + Select Data Directory Location + + + + + Confirm Data Directory Change + + + + + Reset Data Directory + + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + + + + + Overwrite Existing Data + + OpenLP.ExceptionDialog - + Error Occurred Er gaat iets fout - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Oeps! OpenLP heeft een probleem en kan het niet zelf oplossen. De tekst in het onderste venster bevat informatie waarmee de OpenLP ontwikkelaars iets kunnen. Stuur een e-mail naar: bugs@openlp.org met een gedetailleerde beschrijving van het probleem en hoe het ontstond. - + Send E-Mail Stuur e-mail - + Save to File Opslaan als bestand - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Omschrijf in het Engels wat u deed toen deze fout zich voordeed (minstens 20 tekens gebruiken) - + Attach File Voeg bestand toe - + Description characters to enter : %s Toelichting aanvullen met nog %s tekens @@ -2288,24 +2487,24 @@ OpenLP.ExceptionForm - + Platform: %s Plattform: %s - + Save Crash Report Bewaar Bug Report - + Text files (*.txt *.log *.text) Tekstbestand (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2336,7 +2535,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2472,17 +2671,17 @@ Standaard instellingen - + Downloading %s... Downloaden %s... - + Download complete. Click the finish button to start OpenLP. Download compleet. Klik op afrond om OpenLP te starten. - + Enabling selected plugins... Geselecteerde plugins inschakelen... @@ -2552,32 +2751,32 @@ Deze assistent helpt u bij het instellen van OpenLP voor het eerste gebruik. Klik op volgende om te beginnen. - + Setting Up And Downloading Instellen en downloaden - + Please wait while OpenLP is set up and your data is downloaded. Even geduld terwijl OpenLP ingesteld wordt en de voorbeeldgegevens worden gedownload. - + Setting Up Instellen - + Click the finish button to start OpenLP. Klik op afronden om OpenLP te starten. - + Download complete. Click the finish button to return to OpenLP. Download compleet. Klik op afronden om OpenLP te starten. - + Click the finish button to return to OpenLP. Klik op afronden om OpenLP te starten. @@ -2587,78 +2786,78 @@ Aangepaste dia’s + + Finish + Eind + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Geen Internet verbinding gevonden. De Eerste Keer Assistent heeft een internet verbinding nodig om voorbeeld liederen en bijbels te downloaden. Klik op afronden om OpenLP te starten met standaardinstellingen en geen voorbeeld data. + Geen internetverbinding gevonden. The First Time Wizard heeft een internetverbinding nodig om voorbeelden van liederen, bijbels en thema's te downloaden. Klik op klaar om OpenLP op te starten met standaardinstellingen zonder voorbeelddata. -Om de Eerste Keer Assistent opnieuw te starten en later voorbeeld data te importeren, check de Internet verbeinding herstart de assistent door in het menu "Gereedschap/Herstart Eerste Keer Assistent" in OpenLP. +To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. -Om de Eerste Keer Assistent te annuleren (zonder OpenLP te starten), klik op Annuleren. - - - - Finish - Eind +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. OpenLP.FormattingTagDialog - + Configure Formatting Tags Configureer Opmaak tags - + Edit Selection Bewerk selectie - + Save Opslaan - + Description Omschrijving - + Tag Tag - + Start tag Start tag - + End tag Eind tag - + Tag Id Tag Id - + Start HTML Start HTML - + End HTML Eind HTML @@ -2666,32 +2865,32 @@ OpenLP.FormattingTagForm - + Update Error Update Fout - + Tag "n" already defined. Tag "n" bestaat al. - + New Tag Nieuwe tag - + <HTML here> <HTML here> - + </and here> </and here> - + Tag %s already defined. Tag %s bestaat al. @@ -2699,82 +2898,82 @@ OpenLP.FormattingTags - + Red Rood - + Black Zwart - + Blue Blauw - + Yellow Geel - + Green Groen - + Pink Roze - + Orange Oranje - + Purple Paars - + White Wit - + Superscript Superscript - + Subscript Subscript - + Paragraph Paragraaf - + Bold Vet - + Italics Cursief - + Underline Onderstreept - + Break Breek af @@ -2782,180 +2981,170 @@ OpenLP.GeneralTab - + General Algemeen - + Monitors Beeldschermen - + Select monitor for output display: Projectiescherm: - + Display if a single screen Weergeven bij enkel scherm - + Application Startup Programma start - + Show blank screen warning Toon zwart scherm waarschuwing - + Automatically open the last service Automatisch laatste liturgie openen - + Show the splash screen Toon splash screen - + Application Settings Programma instellingen - + Prompt to save before starting a new service Waarschuw om werk op te slaan bij het beginnen van een nieuwe liturgie - + Automatically preview next item in service Automatisch volgend onderdeel van liturgie tonen - + sec sec - + CCLI Details CCLI-details - + SongSelect username: SongSelect gebruikersnaam: - + SongSelect password: SongSelect wachtwoord: - + X X - + Y Y - + Height Hoogte - + Width Breedte - + Check for updates to OpenLP Controleer op updates voor OpenLP - + Unblank display when adding new live item Zwart scherm uitschakelen als er een nieuw live item wordt toegevoegd - + Timed slide interval: Tijd tussen dia’s: - + Background Audio Achtergrond geluid - + Start background audio paused Start achtergrond geluid gepausseerd - + Service Item Slide Limits Limiet Liturgieitems per dia - - &End Slide - &Eind dia - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - De pijl-toetsen naar boven en beneden stoppen boven- en onderaan de dia's van elk liturgienoderdeel. - - - - &Wrap Slide - &Wrap dia + + Override display position: + Overschrijf scherm positie - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - De pijl-toetsen naar boven en beneden gaan verder boven- en onderaan de dia's van elk liturgienoderdeel. + + Repeat track list + herhaal tracklijst - - &Next Item - &Volgend item + + Behavior of next/previous on the last/first slide: + - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - De pijl-toetsen naar boven en beneden gaan verder boven- en onderaan de volgende of vorige dia van het liturgienoderdeel. + + &Remain on Slide + - - Override display position: - Overschrijf scherm positie + + &Wrap around + - - Repeat track list - herhaal tracklijst + + &Move to next/previous service item + OpenLP.LanguageManager - + Language Taal - + Please restart OpenLP to use your new language setting. Start OpenLP opnieuw op om de nieuwe taalinstellingen te gebruiken. @@ -2971,287 +3160,287 @@ OpenLP.MainWindow - + &File &Bestand - + &Import &Importeren - + &Export &Exporteren - + &View &Weergave - + M&ode M&odus - + &Tools &Hulpmiddelen - + &Settings &Instellingen - + &Language Taa&l - + &Help &Help - + Media Manager Mediabeheer - + Service Manager Liturgie beheer - + Theme Manager Thema beheer - + &New &Nieuw - + &Open &Open - + Open an existing service. Open een bestaande liturgie. - + &Save Op&slaan - + Save the current service to disk. Deze liturgie opslaan. - + Save &As... Opslaan &als... - + Save Service As Liturgie opslaan als - + Save the current service under a new name. Deze liturgie onder een andere naam opslaan. - + E&xit &Afsluiten - + Quit OpenLP OpenLP afsluiten - + &Theme &Thema - + &Configure OpenLP... &Instellingen... - + &Media Manager &Media beheer - + Toggle Media Manager Media beheer wel / niet tonen - + Toggle the visibility of the media manager. Media beheer wel / niet tonen. - + &Theme Manager &Thema beheer - + Toggle Theme Manager Thema beheer wel / niet tonen - + Toggle the visibility of the theme manager. Thema beheer wel / niet tonen. - + &Service Manager &Liturgie beheer - + Toggle Service Manager Liturgie beheer wel / niet tonen - + Toggle the visibility of the service manager. Liturgie beheer wel / niet tonen. - + &Preview Panel &Voorbeeld - + Toggle Preview Panel Voorbeeld wel / niet tonen - + Toggle the visibility of the preview panel. Voorbeeld wel / niet tonen. - + &Live Panel &Live venster - + Toggle Live Panel Live venster wel / niet tonen - + Toggle the visibility of the live panel. Live venster wel / niet tonen. - + &Plugin List &Plugin Lijst - + List the Plugins Lijst met plugins =uitbreidingen van OpenLP - + &User Guide Gebr&uikshandleiding - + &About &Over OpenLP - + More information about OpenLP Meer Informatie over OpenLP - + &Online Help &Online help - + &Web Site &Website - + Use the system language, if available. Gebruik systeem standaardtaal, indien mogelijk. - + Set the interface language to %s %s als taal in OpenLP gebruiken - + Add &Tool... Hulpprogramma &toevoegen... - + Add an application to the list of tools. Voeg een hulpprogramma toe aan de lijst. - + &Default &Standaard - + Set the view mode back to the default. Terug naar de standaard weergave modus. - + &Setup &Setup - + Set the view mode to Setup. Weergave modus naar Setup. - + &Live &Live - + Set the view mode to Live. Weergave modus naar 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/. @@ -3260,108 +3449,108 @@ U kunt de laatste versie op http://openlp.org/ downloaden. - + 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 - + English Please add the name of your language here Nederlands - + Configure &Shortcuts... &Sneltoetsen instellen... - + Close OpenLP OpenLP afsluiten - + Are you sure you want to close OpenLP? OpenLP afsluiten? - + Open &Data Folder... Open &Data map... - + Open the folder where songs, bibles and other data resides. Open de map waar liederen, bijbels en andere data staat. - + &Autodetect &Autodetecteer - + Update Theme Images Thema afbeeldingen opwaarderen - + Update the preview images for all themes. Voorbeeld afbeeldingen opwaarderen voor alle thema’s. - + Print the current service. Druk de huidige liturgie af. - + &Recent Files &Recente bestanden - + L&ock Panels Panelen op sl&ot - + Prevent the panels being moved. Voorkomen dat panelen verschuiven. - + Re-run First Time Wizard Herstart Eerste keer assistent - + Re-run the First Time Wizard, importing songs, Bibles and themes. Herstart Eerste keer assistent, importeer voorbeeld liederen, bijbels en thema’s. - + Re-run First Time Wizard? Herstart Eerste keer assistent? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3370,43 +3559,43 @@ De Eerste keer assistent opnieuw starten zou veranderingen in uw huidige OpenLP instellingen kunnen maken en mogelijk liederen aan uw huidige lijst kunnen toevoegen en uw standaard thema wijzigen. - + Clear List Clear List of recent files Lijst leegmaken - + Clear the list of recent files. Maak de lijst met recente bestanden leeg. - + Configure &Formatting Tags... Configureer &Opmaak tags... - + Export OpenLP settings to a specified *.config file Exporteer OpenLP instellingen naar een *.config bestand - + Settings Instellingen - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Importeer OpenLP instellingen uit een bestaand *.config bestand afkomstig van deze of een andere computer - + Import settings? Importeer instelling? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3419,45 +3608,50 @@ Incorrecte instellingen importeren veroorzaakt onvoorspelbare effecten of OpenLP kan spontaan stoppen. - + Open File Open bestand - + OpenLP Export Settings Files (*.conf) OpenLP Export instellingsbestanden (*.config) - + Import settings Importeer instellingen - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP sluit nu af. De geïmporteeerde instellingen worden bij de volgende start van OpenLP toegepast. - + Export Settings File Exporteer instellingen - + OpenLP Export Settings File (*.conf) OpenLP Export instellingsbestand (*.config) + + + New Data Directory Error + + OpenLP.Manager - + Database Error Database Fout - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3466,7 +3660,7 @@ Database: %s - + OpenLP cannot load your database. Database: %s @@ -3478,74 +3672,74 @@ OpenLP.MediaManagerItem - + No Items Selected Niets geselecteerd - + &Add to selected Service Item &Voeg selectie toe aan de liturgie - + You must select one or more items to preview. Selecteer een of meerdere onderdelen om voorbeeld te laten zien. - + You must select one or more items to send live. Selecteer een of meerdere onderdelen om Live te tonen. - + You must select one or more items. Selecteer een of meerdere onderdelen. - + You must select an existing service item to add to. Selecteer een liturgie om deze onderdelen aan toe te voegen. - + Invalid Service Item Ongeldige Liturgie onderdeel - + You must select a %s service item. Selecteer een %s liturgie onderdeel. - + You must select one or more items to add. Selecteer een of meerdere onderdelen om toe te voegen. - + No Search Results Niets gevonden - + Invalid File Type Ongeldig bestandsformaat - + Invalid File %s. Suffix not supported Ongeldig bestand %s. Extensie niet ondersteund - + &Clone &Kloon - + Duplicate files were found on import and were ignored. Identieke bestanden zijn bij het importeren gevonden en worden genegeerd. @@ -3553,12 +3747,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. <liedtekst> tag mist. - + <verse> tag is missing. <vers> tag mist. @@ -3566,27 +3760,27 @@ OpenLP.PluginForm - + Plugin List Plugin Lijst - + Plugin Details Plugin details - + Status: Status: - + Active Actief - + Inactive Inactief @@ -3609,12 +3803,12 @@ OpenLP.PrintServiceDialog - + Fit Page Passend hele pagina - + Fit Width Passend pagina breedte @@ -3622,7 +3816,7 @@ OpenLP.PrintServiceForm - + Options Opties @@ -3637,47 +3831,47 @@ Kopieer als HTML - + Zoom In Inzoomen - + Zoom Out Uitzoomen - + Zoom Original Werkelijke grootte - + Other Options Overige opties - + Include slide text if available Inclusief dia tekst indien beschikbaar - + Include service item notes Inclusief liturgie opmerkingen - + Include play length of media items Inclusief afspeellengte van media items - + Add page break before each text item Voeg een pagina-einde toe voor elke tekst item - + Service Sheet Liturgie blad @@ -3687,12 +3881,12 @@ Afdrukken - + Title: Titel: - + Custom Footer Text: Aangepaste voettekst: @@ -3700,12 +3894,12 @@ OpenLP.ScreenList - + Screen Beeldscherm - + primary primair scherm @@ -3713,12 +3907,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Start</strong>: %s - + <strong>Length</strong>: %s <strong>Lengte</strong>: %s @@ -3726,7 +3920,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Liturgie onderdelen herschikken @@ -3734,82 +3928,82 @@ OpenLP.ServiceManager - + Move to &top Bovenaan plaa&tsen - + Move item to the top of the service. Plaats dit onderdeel bovenaan. - + Move &up Naar b&oven - + Move item up one position in the service. Verplaats een plek naar boven. - + Move &down Naar bene&den - + Move item down one position in the service. Verplaats een plek naar beneden. - + Move to &bottom Onderaan &plaatsen - + Move item to the end of the service. Plaats dit onderdeel onderaan. - + &Delete From Service Verwij&deren uit de liturgie - + Delete the selected item from the service. Verwijder dit onderdeel uit de liturgie. - + &Add New Item &Voeg toe - + &Add to Selected Item &Voeg selectie toe - + &Edit Item B&ewerk onderdeel - + &Reorder Item He&rschik onderdeel - + &Notes Aa&ntekeningen - + &Change Item Theme &Wijzig onderdeel thema @@ -3831,112 +4025,107 @@ 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 - + &Expand all Alles &uitklappen - + Expand all the service items. Alle liturgie onderdelen uitklappen. - + &Collapse all Alles &inklappen - + Collapse all the service items. Alle liturgie onderdelen inklappen. - + Open File Open bestand - + Moves the selection down the window. Verplaatst de selectie naar beneden. - + Move up Naar boven - + Moves the selection up the window. Verplaatst de selectie naar boven. - + Go Live Ga Live - + Send the selected item to Live. Toon selectie Live. - + &Start Time &Start Tijd - + Show &Preview Toon &Voorbeeld - - Show &Live - Toon &Live - - - + Modified Service Gewijzigde liturgie - + The current service has been modified. Would you like to save this service? De huidige liturgie is gewijzigd. Veranderingen opslaan? - + Custom Service Notes: Aangepaste liturgie kanttekeningen: - + Notes: Aantekeningen: - + Playing time: Speeltijd: - + Untitled Service Liturgie zonder naam @@ -3961,17 +4150,17 @@ Corrupt bestand - + Load an existing service. Laad een bestaande liturgie. - + Save this service. Deze liturgie opslaan. - + Select a theme for the service. Selecteer een thema voor de liturgie. @@ -3981,7 +4170,7 @@ Dit bestand is beschadigd of geen OpenLP 2.0 liturgie bestand. - + Service File Missing Ontbrekend liturgiebestand @@ -4005,11 +4194,21 @@ Service copy only Liturgie alleen kopiëren + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes Liturgische kanttekeningen @@ -4025,67 +4224,67 @@ OpenLP.ShortcutListDialog - + Action Actie - + Shortcut snelkoppeling - + Duplicate Shortcut Snelkoppelingen dupliceren - + The shortcut "%s" is already assigned to another action, please use a different shortcut. Deze snelkoppeling "%s" wordt al voor iets anders gebruikt. Kies een andere toetscombinatie. - + Alternate Afwisselend - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Selecteer een actie en klik op één van de knoppen hieronder om respectievelijk een primaire of alternatieve sneltoets vast te leggen. - + Default Standaard - + Custom Aangepaste dia - + Capture shortcut. Sneltoets vastleggen. - + Restore the default shortcut of this action. Herstel de standaard sneltoets voor de actie. - + Restore Default Shortcuts Herstel standaard sneltoetsen - + Do you want to restore all shortcuts to their defaults? Weet u zeker dat u alle standaard sneltoetsen wilt herstellen? - + Configure Shortcuts Sneltoetsen instellen @@ -4093,177 +4292,172 @@ OpenLP.SlideController - + Hide Verbergen - + Go To Ga naar - + Blank Screen Zwart scherm - + Blank to Theme Zwart naar thema - + Show Desktop Toon bureaublad - + Previous Service Vorige liturgie - + Next Service Volgende liturgie - + Escape Item Onderdeel annuleren - + Move to previous. Vorige. - + Move to next. Volgende. - + Play Slides Dia’s tonen - + Delay between slides in seconds. Pauze tussen dia’s in seconden. - + Move to live. Toon Live. - + Add to Service. Voeg toe aan Liturgie. - + Edit and reload song preview. Bewerk en herlaad lied voorbeeld. - + Start playing media. Speel media af. - + Pause audio. Pauzeer audio. - + Pause playing media. Afspelen pauzeren - + Stop playing media. Afspelen stoppen - + Video position. Video positie - + Audio Volume. Audio volume - + Go to "Verse" Ga naar "Vers" - + Go to "Chorus" Ga naar "Refrein" - + Go to "Bridge" Ga naar "Bridge" - + Go to "Pre-Chorus" Ga naar "pre-Refrein" - + Go to "Intro" Ga naar "Intro" - + Go to "Ending" Ga naar "Einde" - + Go to "Other" Ga naar "Overige" - + Previous Slide vorige dia - + Next Slide volgende dia - + Pause Audio Pauzeer audio - + Background Audio Achtergrondgeluid - - Next Track - Volgende track - - - + Go to next audio track. Ga naar de volgende audiotrack. - + Tracks Tracks @@ -4339,17 +4533,17 @@ Start tijd is ingesteld tot na het eind van het media item - + Theme Layout Thema Layout - + The blue box shows the main area. Het blauwe vlak toont het hoofdgebied. - + The red box shows the footer. Het rode vlak toont het gebied voor de voettekst. @@ -4357,32 +4551,32 @@ OpenLP.ThemeForm - + Select Image Selecteer afbeelding - + Theme Name Missing Thema naam ontbreekt - + There is no name for this theme. Please enter one. Dit thema heeft nog geen naam. Geef een naam voor dit thema. - + Theme Name Invalid Ongeldige naam - + Invalid theme name. Please enter one. Deze naam kan niet worden gebruikt als thema naam. Kies een andere naam. - + (approximately %d lines per slide) (ongeveer %d regels per dia) @@ -4390,193 +4584,193 @@ OpenLP.ThemeManager - + Create a new theme. Maak een nieuw thema. - + Edit Theme Bewerk thema - + Edit a theme. Bewerk een thema. - + Delete Theme Verwijder thema - + Delete a theme. Verwijder thema. - + Import Theme Importeer thema - + Import a theme. Importeer thema. - + Export Theme Exporteer thema - + Export a theme. Exporteer thema. - + &Edit Theme B&ewerk thema - + &Delete Theme Verwij&der thema - + Set As &Global Default 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. - + Theme %s is used in the %s plugin. Thema %s wordt gebruikt in de %s plugin. - + 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. Geen geldig thema bestand. - + &Copy Theme &Kopieer thema - + &Rename Theme He&rnoem thema - + &Export Theme &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) OpenLP Thema's (*.theme *.otz) - + Copy of %s Copy of <theme name> Kopie van %s - + Theme Already Exists Theama bestaat al @@ -4584,272 +4778,272 @@ OpenLP.ThemeWizard - + Theme Wizard Thema assistent - + Welcome to the Theme Wizard Welkom bij de thema assistent - + Set Up Background Achtergrond instellen - + Set up your theme's background according to the parameters below. Thema achtergrond instellen met onderstaande parameters. - + Background type: Achtergrond type: - + Solid Color Vaste kleur - + Gradient Kleurverloop - + Color: Kleur: - + Gradient: Kleurverloop: - + Horizontal Horizontaal - + Vertical Verticaal - + Circular Radiaal - + Top Left - Bottom Right Links boven - rechts onder - + Bottom Left - Top Right Links onder - Rechts boven - + Main Area Font Details Font instellingen algemeen - + Define the font and display characteristics for the Display text Stel de eigenschappen voor de tekst weergave in - + Font: Lettertype: - + Size: Grootte: - + Line Spacing: Interlinie: - + &Outline: &Omtrek: - + &Shadow: &Schaduw: - + Bold Vet - + Italic Cursief - + Footer Area Font Details Eigenschappen voettekst - + Define the font and display characteristics for the Footer text Stel de eigenschappen voor de voettekst weergave in - + Text Formatting Details Tekst opmaak eigenschappen - + Allows additional display formatting information to be defined Toestaan dat er afwijkende opmaak kan worden bepaald - + Horizontal Align: Horizontaal uitlijnen: - + Left links - + Right rechts - + Center Centreren - + Output Area Locations Uitvoer gebied locaties - + Allows you to change and move the main and footer areas. Toestaan dat tekstvelden gewijzigd en verplaatst worden. - + &Main Area &Hoofdgebied - + &Use default location Gebr&uik standaard locatie - + X position: X positie: - + px px - + Y position: Y positie: - + Width: Breedte: - + Height: Hoogte: - + Use default location Gebruik standaard locatie - + Save and Preview Opslaan en voorbeeld - + View the theme and save it replacing the current one or change the name to create a new theme Thema bekijken en sla het op onder dezelfde naam om te vervangen of onder een andere naam om een nieuw thema te maken - + Theme name: Thema naam: - + Edit Theme - %s Bewerk thema - %s - + 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. Deze assistent helpt bij het maken en bewerken van thema's. Klik op volgende om als eerste een achtergrond in te stellen. - + Transitions: Overgangen: - + &Footer Area &Voettekst gebied - + Starting color: Beginkleur: - + Ending color: Eindkleur: - + Background color: Achtergrondkleur: - + Justify Uitvullen - + Layout Preview Layout voorbeeld - + Transparent Transparant @@ -4857,47 +5051,47 @@ OpenLP.ThemesTab - + Global Theme Globaal thema - + Theme Level Thema niveau - + S&ong Level &Lied niveau - + 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. Gebruik het thema bij elk lied in de database. Als een lied geen eigen thema heeft, gebruik dan het thema van de liturgie. Als de liturgie geen eigen thema heeft, gebruik dan het globale thema. - + &Service Level &Liturgie niveau - + 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. Gebruik het thema van de liturgie en negeer de thema's van elk lied afzonderlijk. Als de liturgie geen eigen thema heeft, gebruik dan het globale thema. - + &Global Level &Globaal niveau - + Use the global theme, overriding any themes associated with either the service or the songs. Gebruik het globale thema en negeer alle thema's van de liturgie of de afzonderlijke liederen. - + Themes Thema's @@ -4981,239 +5175,239 @@ pt - + Image Afbeelding - + Import Importeren - + Live Live - + Live Background Error Live achtergrond fout - + Load Laad - + Middle Midden - + New Nieuw - + New Service Nieuwe liturgie - + New Theme Nieuw thema - + No File Selected Singular Geen bestand geselecteerd - + No Files Selected Plural Geen bestanden geselecteerd - + No Item Selected Singular Geen item geselecteerd - + No Items Selected Plural Geen items geselecteerd - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Voorbeeld - + Replace Background Vervang achtergrond - + Reset Background Herstel achtergrond - + s The abbreviated unit for seconds s - + Save && Preview Opslaan && voorbeeld bekijken - + Search Zoek - + You must select an item to delete. Selecteer een item om te verwijderen. - + You must select an item to edit. Selecteer iets om te bewerken. - + Save Service Liturgie opslaan - + Service Liturgie - + Start %s Start %s - + Theme Singular Thema - + Themes Plural Thema's - + Top Boven - + Version Versie - + Delete the selected item. Verwijder het geselecteerde item. - + Move selection up one position. Verplaats selectie een plek naar boven. - + Move selection down one position. Verplaats selectie een plek naar beneden. - + &Vertical Align: &Verticaal uitlijnen: - + Finished import. Importeren beëindigd. - + Format: Formaat: - + Importing Importeren - + Importing "%s"... Importeren "%s"... - + Select Import Source Selecteer te importeren bestand - + Select the import format and the location to import from. Selecteer te importeren bestand en het bestandsformaat. - + 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 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. - + Open %s File Open %s bestand - + %p% %p% - + Ready. Klaar. - + Starting import... Start importeren... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong Selecteer minstens een %s bestand om te importeren. @@ -5229,7 +5423,7 @@ Welkom bij de lied export assistent - + Welcome to the Song Import Wizard Welkom bij de lied import assistent @@ -5317,53 +5511,53 @@ h - + Layout style: Paginaformaat: - + Live Toolbar Live Werkbalk - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP is reeds gestart. Weet u zeker dat u wilt doorgaan? - + Settings Instellingen - + Tools Hulpmiddelen - + Unsupported File Niet ondersteund bestandsformaat - + Verse Per Slide Bijbelvers per dia - + Verse Per Line Bijbelvers per regel - + View Weergave @@ -5378,42 +5572,37 @@ XML syntax fout - + View Mode Weergave modus - + Open service. Open liturgie. - + Print Service Liturgie afdrukken - + Replace live background. Vervang Live achtergrond. - + Reset live background. Herstel Live achtergrond. - - &Split - &Splitsen - - - + Split a slide into two only if it does not fit on the screen as one slide. Dia opdelen als de inhoud niet op een dia past. - + Welcome to the Bible Upgrade Wizard Welkom bij de Bijbel Opwaardeer Assistent @@ -5423,53 +5612,105 @@ Bevestig verwijderen - + Play Slides in Loop Dia’s doorlopend tonen - + Play Slides to End Dia’s tonen tot eind - + Stop Play Slides in Loop Stop dia’s doorlopend tonen - + Stop Play Slides to End Stop dia’s tonen tot eind - + Next Track Volgende track + + + Search Themes... + Search bar place holder text + Doorzoek thema... + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 en %2 - + %1, and %2 Locale list separator: end %1, en %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5478,50 +5719,50 @@ PresentationPlugin - + <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>Presentatie plugin</strong><br />De presentatie plugin voorziet in de mogelijkheid om verschillende soorten presentaties weer te geven. De keuze van beschikbare presentatie software staat in een uitklapmenu. - + Presentation name singular Presentatie - + Presentations name plural Präsentationen - + Presentations container title Presentaties - + Load a new presentation. Laad nieuwe presentatie. - + Delete the selected presentation. Geselecteerde presentatie verwijderen. - + Preview the selected presentation. Geef van geselecteerde presentatie voorbeeld weer. - + Send the selected presentation live. Geselecteerde presentatie Live. - + Add the selected presentation to the service. Voeg geselecteerde presentatie toe aan de liturgie. @@ -5529,70 +5770,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Selecteer presentatie(s) - + Automatic automatisch - + Present using: Presenteren met: - + File Exists Bestand bestaat - + A presentation with that filename already exists. Er bestaat al een presentatie met die naam. - + This type of presentation is not supported. Dit soort presentatie wordt niet ondersteund. - + Presentations (%s) Presentaties (%s) - + Missing Presentation Ontbrekende presentatie - - The Presentation %s no longer exists. - De presentatie %s bestaat niet meer. + + The presentation %s is incomplete, please reload. + - - The Presentation %s is incomplete, please reload. - De presentatie %s is niet compleet, herladen aub. + + The presentation %s no longer exists. + PresentationPlugin.PresentationTab - + Available Controllers Beschikbare regelaars - + %s (unavailable) %s (niet beschikbaar) - + Allow presentation application to be overridden Toestaan presentatieprogramma te overschrijven @@ -5626,135 +5867,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 Remote - + OpenLP 2.0 Stage View OpenLP 2.0 Podium Weergave - + Service Manager Liturgie beheer - + Slide Controller Dia regelaar - + Alerts Waarschuwingen - + Search Zoek - - Back - Terug - - - + Refresh Vernieuwen - + Blank Leeg - + Show Toon - + Prev Vorige - + Next Volgende - + Text Tekst - + Show Alert Toon waarschuwingen - + Go Live Ga Live - + No Results Niets gevonden - + Options Opties - + Add to Service Voeg toe aan Liturgie + + + Home + + + + + Theme + Thema + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: Beschikbaar via IP-adres: - + Port number: Poort nummer: - + Server Settings Server instellingen - + Remote URL: Remote URL: - + Stage view URL: Podium weergave URL: - + Display stage time in 12h format Toon tijd in 12h opmaak - + Android App Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Scan de QR code if klik <a href="https://market.android.com/details?id=org.openlp.android">download</a> om de Android app van de Market te downloaden. @@ -5762,85 +6018,85 @@ SongUsagePlugin - + &Song Usage Tracking &Lied gebruik bijhouden - + &Delete Tracking Data Verwij&der gegevens liedgebruik - + Delete song usage data up to a specified date. Verwijder alle gegevens over lied gebruik tot een bepaalde datum. - + &Extract Tracking Data &Extraheer gegevens liedgebruik - + Generate a report on song usage. Geneer rapportage liedgebruik. - + Toggle Tracking Gegevens bijhouden aan|uit - + Toggle the tracking of song usage. Gegevens liedgebruik bijhouden aan of uit zetten. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Liedgebruik plugin</strong><br />Met deze plugin kunt u bijhouden welke liederen tijdens de vieringen gezongen worden. - + SongUsage name singular Liedprotokollierung - + SongUsage name plural Liedprotokollierung - + SongUsage container title Liedgebruik - + Song Usage Liedgebruik - + Song usage tracking is active. Lied gebruik bijhouden is actief. - + Song usage tracking is inactive. Lied gebruik bijhouden is in-actief. - + display weergave - + printed afgedrukt @@ -5848,7 +6104,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Gegevens liedgebruik verwijderen @@ -5873,7 +6129,7 @@ Alle opgegeven data is verwijderd. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Selecteer de datum tot wanneer de gegevens liedgebruik verwijderd moeten worden. Alle gegevens van voor die datum worden verwijderd. @@ -5881,42 +6137,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Gegevens liedgebruik extraheren - + Select Date Range Selecteer periode - + to tot - + Report Location Locatie rapport - + Output File Location Bestandslocatie - + usage_detail_%s_%s.txt liedgebruik_details_%s_%s.txt - + Report Creation Maak rapportage - + Report %s has been successfully created. @@ -5925,12 +6181,12 @@ is gemaakt. - + Output Path Not Selected Uitvoer pad niet geselecteerd - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. Geen geldige bestandslocatie opgegeven om de rapportage liedgebruik op te slaan. Kies een bestaande map op uw computer. @@ -5968,82 +6224,82 @@ Liederen her-indexeren... - + Arabic (CP-1256) Arabisch (CP-1256) - + Baltic (CP-1257) Baltisch (CP-1257) - + Central European (CP-1250) Centraal Europees (CP-1250) - + Cyrillic (CP-1251) Cyrillisch (CP-1251) - + Greek (CP-1253) Grieks (CP-1253) - + Hebrew (CP-1255) Hebreeuws (CP-1255) - + Japanese (CP-932) Japans (CP-932) - + Korean (CP-949) Koreaans (CP-949) - + Simplified Chinese (CP-936) Chinees, eenvoudig (CP-936) - + Thai (CP-874) Thais (CP-874) - + Traditional Chinese (CP-950) Traditioneel Chinees (CP-950) - + Turkish (CP-1254) Turks (CP-1254) - + Vietnam (CP-1258) Vietnamees (CP-1258) - + Western European (CP-1252) Westeuropees (CP-1252) - + Character Encoding Tekst codering - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6052,26 +6308,26 @@ Meestal voldoet de suggestie van OpenLP. - + Please choose the character encoding. The encoding is responsible for the correct character representation. Kies een tekstcodering (codepage). De tekstcodering is verantwoordelijk voor een correcte weergave van lettertekens. - + Song name singular Lied - + Songs name plural Lieder - + Songs container title Liederen @@ -6082,32 +6338,32 @@ Exporteer liederen met de export assistent. - + Add a new song. Voeg nieuw lied toe. - + Edit the selected song. Bewerk geselecteerde lied. - + Delete the selected song. Verwijder geselecteerde lied. - + Preview the selected song. Toon voorbeeld geselecteerd lied. - + Send the selected song live. Toon lied Live. - + Add the selected song to the service. Voeg geselecteerde lied toe aan de liturgie. @@ -6135,17 +6391,17 @@ Achternaam: - + You need to type in the first name of the author. De voornaam van de auteur moet worden opgegeven. - + You need to type in the last name of the author. De achternaam van de auteur moet worden opgegeven. - + You have not set a display name for the author, combine the first and last names? Geen weergave naam opgegeven. Moeten de voor- en achternaam gecombineerd worden? @@ -6176,209 +6432,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor Lied bewerker - + &Title: &Titel: - + Alt&ernate title: Afwiss&elende titel: - + &Lyrics: Lied&tekst: - + &Verse order: &Vers volgorde: - + Ed&it All &Alles bewerken - + Title && Lyrics Titel && Liedtekst - + &Add to Song Voeg toe &aan lied - + &Remove Ve&rwijderen - + &Manage Authors, Topics, Song Books &Beheer auteurs, onderwerpen, liedboeken - + A&dd to Song Voeg toe &aan lied - + R&emove V&erwijderen - + Book: Boek: - + Number: Nummer: - + Authors, Topics && Song Book Auteurs, onderwerpen && liedboeken - + New &Theme Nieuw &Thema - + Copyright Information Copyright - + Comments Commentaren - + Theme, Copyright Info && Comments Thema, Copyright && Commentaren - + Add Author Voeg auteur toe - + This author does not exist, do you want to add them? Deze auteur bestaat nog niet, toevoegen? - + This author is already in the list. Deze auteur staat al in de lijst. - + 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. Geen auteur geselecteerd. Kies een auteur uit de lijst of voeg er een toe door de naam in te typen en op de knop "Voeg auteur toe" te klikken. - + Add Topic Voeg onderwerp toe - + This topic does not exist, do you want to add it? Dit onderwerp bestaat nog niet, toevoegen? - + This topic is already in the list. Dit onderwerp staat al in de lijst. - + 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. Geen geldig onderwerp geselecteerd. Kies een onderwerp uit de lijst of type een nieuw onderwerp en klik op "Nieuw onderwerp toevoegen". - + You need to type in a song title. Vul de titel van het lied in. - + You need to type in at least one verse. Vul minstens de tekst van één couplet in. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. De volgorde van de coupletten klopt niet. Er is geen couplet dat overeenkomt met %s. Wel zijn %s beschikbaar. - + Add Book Voeg boek toe - + This song book does not exist, do you want to add it? Dit liedboek bestaat nog niet, toevoegen? - + You need to have an author for this song. Iemand heeft dit lied geschreven. - + You need to type some text in to the verse. Er moet toch een tekst zijn om te zingen. - + Linked Audio Gekoppelde audio - + Add &File(s) Bestand(en) &toevoegen - + Add &Media Voeg &Media toe - + Remove &All &Alles verwijderen - + Open File(s) Open bestand(en) - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Let op:</strong> Niet alle verzen worden gebruikt. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. Ongeldige vers volgorde. Er zijn geen verzen die overeenkomen met %s. Geldig zijn %s. @@ -6492,130 +6761,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Selecteer Documenten/Presentatie bestanden - + Song Import Wizard 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. Deze assistent helpt liederen in verschillende bestandsformaten te importeren in OpenLP. Klik op volgende en kies daarna het bestandsformaat van het te importeren lied. - + Generic Document/Presentation Algemeen Document/Presentatie - - Filename: - Bestandsnaam: - - - - 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. - OpenLyrics import is nog niet gemaakt, maar we hebben het voornemen dit te doen. Hopelijk lukt dit in een volgende versie. - - - + Add Files... Toevoegen... - + Remove File(s) Verwijder bestand(en) - + Please wait while your songs are imported. Even geduld tijdens het importeren. - + 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 Lied bestanden - - You need to specify at least one document or presentation file to import from. - Selecteer minimaal een document of presentatie om te importeren. - - - + Songs Of Fellowship Song Files Songs Of Fellowship lied bestanden - + SongBeamer Files SongBeamer bestanden - + SongShow Plus Song Files SongShow Plus lied bestanden - + Foilpresenter Song Files Foilpresenter lied bestanden - + Copy Kopieer - + Save to File Opslaan als bestand - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Songs of Fellowship import is uitgeschakeld omdat OpenLP OpenOffice.org niet kan vinden op deze computer. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Algemeen document/presentatie import is uitgeschakeld omdat OpenLP OpenOffice.org niet kan vinden op deze computer. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics of OpenLP 2.0 geëxporteerd lied - + OpenLyrics Files OpenLyrics bestanden + + + CCLI SongSelect Files + CCLI SongSelect bestanden + + + + EasySlides XML File + EasySlides XML bestanden + + + + EasyWorship Song Database + EasyWorship Lied Database + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) Selecteer media bestand(en) - + Select one or more audio files from the list below, and click OK to import them into this song. Selecteer een of meerdere audiobestanden uit de lijst, en klik OK om te importeren in dit lied. @@ -6623,27 +6912,27 @@ SongsPlugin.MediaItem - + Titles Titels - + Lyrics Liedtekst - + CCLI License: CCLI Licentie: - + Entire Song Gehele lied - + Are you sure you want to delete the %n selected song(s)? Weet u zeker dat u dit %n lied wilt verwijderen? @@ -6651,16 +6940,41 @@ - + Maintain the lists of authors, topics and books. Beheer de lijst met auteurs, onderwerpen en liedboeken. - + copy For song cloning kopieer + + + Search Titles... + Doorzoek titels... + + + + Search Entire Song... + Doorzoek gehele lied... + + + + Search Lyrics... + Doorzoek liedtekst... + + + + Search Authors... + Doorzoek auteurs... + + + + Search Song Books... + Doorzoek liedboeken... + SongsPlugin.OpenLP1SongImport @@ -6687,6 +7001,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6725,12 +7052,12 @@ SongsPlugin.SongImport - + copyright copyright - + The following songs could not be imported: De volgende liederen konden niet worden geïmporteerd: @@ -6751,117 +7078,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Lied import mislukt. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Kon de auteur niet toevoegen. - + This author already exists. Deze auteur bestaat al. - + Could not add your topic. Kon dit onderwerp niet toevoegen. - + This topic already exists. Dit onderwerp bestaat al. - + Could not add your book. Kon dit boek niet toevoegen. - + This book already exists. Dit boek bestaat al. - + Could not save your changes. De wijzigingen kunnen niet opgeslagen worden. - + Could not save your modified author, because the author already exists. Kan de auteur niet opslaan, omdat deze reeds bestaat. - + Could not save your modified topic, because it already exists. Kan dit onderwerp niet opslaan, omdat het reeds bestaat. - + Delete Author Auteur verwijderen - + Are you sure you want to delete the selected author? Weet u zeker dat u de auteur wilt verwijderen? - + This author cannot be deleted, they are currently assigned to at least one song. Deze auteur kan niet worden verwijderd, omdat er nog een lied aan is gekoppeld. - + Delete Topic Onderwerp verwijderen - + Are you sure you want to delete the selected topic? Weet u zeker dat u dit onderwerp wilt verwijderen? - + This topic cannot be deleted, it is currently assigned to at least one song. Dit onderwerp kan niet worden verwijderd, omdat er nog een lied aan is gekoppeld. - + Delete Book Verwijder boek - + Are you sure you want to delete the selected book? Weet u zeker dat u dit boek wilt verwijderen? - + This book cannot be deleted, it is currently assigned to at least one song. Dit liedboek kan niet worden verwijderd, omdat er nog een lied aan is gekoppeld. - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? Deze auteur %s bestaat al. Liederen met auteur %s aan deze auteur %s koppelen? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? Dit onderwerp %s bestaat al. Liederen met onderwerp %s aan %s koppelen? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? Dit liedboek %s bestaat al. Liederen uit het Liedboek %s aan het liedboek %s koppelen? @@ -6869,29 +7188,29 @@ SongsPlugin.SongsTab - + Songs Mode Lied instellingen - + Enable search as you type Zoeken tijdens het typen - + Display verses on live tool bar Coupletten weergeven op live werkbalk - + Update service from song edit Liturgie bijwerken met bewerkt lied - - Add missing songs when opening service - Ontbrekende liederen toevoegen bij het openen van de liturgie + + Import missing songs from service files + @@ -6950,4 +7269,17 @@ Overig + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/pl.ts openlp-1.9.10/resources/i18n/pl.ts --- openlp-1.9.9/resources/i18n/pl.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/pl.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert - + Show an alert message. - + Alert name singular - + Alerts name plural - + Alerts container title - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message - + Alert &text: - + &New - + &Save - + Displ&ay - + Display && Cl&ose @@ -79,7 +79,7 @@ - + &Parameter: @@ -117,32 +117,32 @@ AlertsPlugin.AlertsTab - + Font - + Czcionka - + Font name: - + Nazwa czcionki: - + Font color: - + Kolor czcionki: - + Background color: - + Tło czcionki: - + Font size: - + Wielkość czcionki: - + Alert timeout: @@ -150,550 +150,595 @@ BiblesPlugin - + &Bible - + Bible name singular - + Bibles name plural - + Bibles container title - + No Book Found - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. - + Import a Bible. - + Add a new Bible. - + Edit the selected Bible. - + Delete the selected Bible. - + Preview the selected Bible. - + Send the selected Bible live. - + Add the selected Bible to the service. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. - + &Upgrade older Bibles - + Upgrade the Bible databases to the latest format. - + Genesis - + Exodus - + Leviticus - + Numbers - + Deuteronomy - + Joshua - + Judges - + Ruth - + 1 Samuel - + 2 Samuel - + 1 Kings - + 2 Kings - + 1 Chronicles - + 2 Chronicles - + Ezra - + Nehemiah - + Esther - + Job - + Psalms - + Proverbs - + Ecclesiastes - + Song of Solomon - + Isaiah - + Jeremiah - + Lamentations - + Ezekiel - + Daniel - + Hosea - + Joel - + Amos - + Obadiah - + Jonah - + Micah - + Nahum - + Habakkuk - + Zephaniah - + Haggai - + Zechariah - + Malachi - + Matthew - + Mark - + Luke - + John - + Acts - + Romans - + 1 Corinthians - + 2 Corinthians - + Galatians - + Ephesians - + Philippians - + Colossians - + 1 Thessalonians - + 2 Thessalonians - + 1 Timothy - + 2 Timothy - + Titus - + Philemon - + Hebrews - + James - + 1 Peter - + 2 Peter - + 1 John - + 2 John - + 3 John - + Jude - + Revelation - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + + + + + Bible Exists + + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error - + Web Bible cannot be used - + Text Search is not available with Web Bibles. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. - + No Bibles Available - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -709,186 +754,178 @@ BiblesPlugin.BiblesTab - + Verse Display - + Only show new chapter numbers - + Bible theme: - + No Brackets - + ( And ) - + { And } - + [ And ] - + Note: Changes do not affect verses already in the service. - + Display second Bible verses - + Custom Scripture References - + Verse Separator: - + Range Separator: - + List Separator: - + End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + English - - Bible language + + Default Bible Language - - Application language + + Book name language in search field, +search results and on display: - - English + + Bible Language - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language BiblesPlugin.BookNameDialog - + Select Book Name - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - - - - + Current name: - + Corresponding name: - + Show Books From - + Old Testament - + New Testament - + Apocrypha + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. @@ -913,40 +950,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + + + + + Version name: + + + + + Copyright: + + + + + Permissions: + + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... - + Registering Language... - + Importing %s... Importing <book name>... - + Download Error - + 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. - + Parse Error - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. @@ -1123,17 +1229,17 @@ BiblesPlugin.LanguageDialog - + Select Language - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - + Language: @@ -1149,85 +1255,100 @@ BiblesPlugin.MediaItem - + Quick - + Find: - + Book: - + Chapter: - + Verse: - + From: - + To: - + Text Search - + Second: - + Scripture Reference - + Toggle to keep or clear the previous results. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. - + Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -1236,12 +1357,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1250,143 +1371,143 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory - + Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory - + Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. - + Backup Directory: - + There is no need to backup my Bibles - + Select Bibles - + Please select the Bibles to upgrade - + Upgrading - + Please wait while your Bibles are upgraded. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. - + Upgrading Bible %s of %s: "%s" Failed - + Upgrading Bible %s of %s: "%s" Upgrading ... - + Download Error - + To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... - + Upgrading Bible %s of %s: "%s" Complete - + , %s failed - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s - + Upgrade failed. - + You need to specify a backup directory for your Bibles. - + Starting upgrade... - + There are no Bibles that need to be upgraded. @@ -1460,12 +1581,12 @@ CustomPlugin.CustomTab - + Custom Display - + Display footer @@ -1473,42 +1594,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides - + &Title: - + Add a new slide at bottom. - + Edit the selected slide. - + Edit all the slides at once. - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -1523,12 +1644,12 @@ - + Ed&it All - + Insert Slide @@ -1536,7 +1657,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1548,60 +1669,60 @@ ImagePlugin - + <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. - + Image name singular - + Images name plural - + Images container title - + Load a new image. - + Add a new image. - + Edit the selected image. - + Delete the selected image. - + Preview the selected image. - + Send the selected image live. - + Add the selected image to the service. @@ -1609,7 +1730,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment @@ -1617,43 +1738,43 @@ ImagePlugin.MediaItem - + Select Image(s) - + You must select an image to delete. - + You must select an image to replace the background with. - + Missing Image(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? - + There was a problem replacing your background, the image file "%s" no longer exists. - + There was no display item to amend. @@ -1661,78 +1782,78 @@ ImagesPlugin.ImageTab - + Background Color - + Default Color: - - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - + Media name singular - + Media name plural - + Media container title - + Load new media. - + Add new media. - + Edit the selected media. - + Delete the selected media. - + Preview the selected media. - + Send the selected media live. - + Add the selected media to the service. @@ -1780,7 +1901,7 @@ - + Unsupported File @@ -1798,22 +1919,22 @@ MediaPlugin.MediaTab - + Available Media Players - + %s (unavailable) - + Player Order - + Allow media player to be overridden @@ -1821,7 +1942,7 @@ OpenLP - + Image Files @@ -1841,17 +1962,17 @@ OpenLP.AboutForm - + Credits - + License - + Contribute @@ -1861,17 +1982,17 @@ - + 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 @@ -1936,7 +2057,7 @@ - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -1947,7 +2068,7 @@ - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s @@ -1956,228 +2077,310 @@ OpenLP.AdvancedTab - + UI Settings - + Number of recent files to display: - + Remember active media manager tab on startup - + Double-click to send items straight to live - + Expand new service items on creation - + Enable application exit confirmation - + Mouse Cursor - + Hide mouse cursor when over display window - + Default Image - + Background color: + Tło czcionki: + + + + Image file: + + + + + Open File + + + + + Advanced + + + + + Preview items when clicked in Media Manager + + + + + Click to select a color. + + + + + Browse for an image file to display. + + + + + Revert to the default OpenLP logo. + + + + + Service %Y-%m-%d %H-%M + This may not contain any of the following characters: /\?*|<>[]":+ +See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + + + + Default Service Name + + + + + Enable default service name + + + + + Date and Time: + + + + + Monday + + + + + Tuesday + + + + + Wednesday + + + + + Thurdsday + + + + + Friday - - Image file: + + Saturday - - Open File + + Sunday - - Advanced + + Now - - Preview items when clicked in Media Manager + + Time when usual service starts. - - Click to select a color. + + Name: - - Browse for an image file to display. + + Consult the OpenLP manual for usage. - - Revert to the default OpenLP logo. + + Revert to the default service name "%s". - - Service %Y-%m-%d %H-%M - This may not contain any of the following characters: /\?*|<>[]":+ -See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + Example: - - Default Service Name + + X11 - - Enable default service name + + Bypass X11 Window Manager - - Date and Time: + + Syntax error. - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday + + Cancel - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. - + Send E-Mail - + Save to File - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) - + Attach File - + Description characters to enter : %s @@ -2185,23 +2388,23 @@ OpenLP.ExceptionForm - + Platform: %s - + Save Crash Report - + Text files (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2219,7 +2422,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2342,17 +2545,17 @@ - + Downloading %s... - + Download complete. Click the finish button to start OpenLP. - + Enabling selected plugins... @@ -2422,32 +2625,32 @@ - + Setting Up And Downloading - + Please wait while OpenLP is set up and your data is downloaded. - + Setting Up - + Click the finish button to start OpenLP. - + Download complete. Click the finish button to return to OpenLP. - + Click the finish button to return to OpenLP. @@ -2457,8 +2660,13 @@ + + Finish + + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2467,64 +2675,59 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - - - - Finish +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. OpenLP.FormattingTagDialog - + Configure Formatting Tags - + Edit Selection - + Save - + Description - + Tag - + Start tag - + End tag - + Tag Id - + Start HTML - + End HTML @@ -2532,32 +2735,32 @@ OpenLP.FormattingTagForm - + Update Error - + Tag "n" already defined. - + New Tag - + <HTML here> - + </and here> - + Tag %s already defined. @@ -2565,82 +2768,82 @@ OpenLP.FormattingTags - + Red - + Black - + Blue - + Yellow - + Green - + Pink - + Orange - + Purple - + White - + Superscript - + Subscript - + Paragraph - + Bold - + Italics - + Underline - + Break @@ -2648,180 +2851,170 @@ OpenLP.GeneralTab - + General - + Monitors - + Select monitor for output display: - + Display if a single screen - + Application Startup - + Show blank screen warning - + Automatically open the last service - + Show the splash screen - + Application Settings - + Prompt to save before starting a new service - + Automatically preview next item in service - + sec - + CCLI Details - + SongSelect username: - + SongSelect password: - + X - + Y - + Height - + Width - + Check for updates to OpenLP - + Unblank display when adding new live item - + Timed slide interval: - + Background Audio - + Start background audio paused - + Service Item Slide Limits - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide + + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item + + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide - - Override display position: + + &Wrap around - - Repeat track list + + &Move to next/previous service item OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -2837,438 +3030,438 @@ OpenLP.MainWindow - + &File - + &Import - + &Export - + &View - + M&ode - + &Tools - + &Settings - + &Language - + &Help - + Media Manager - + Service Manager - + Theme Manager - + &New - + &Open - + Open an existing service. - + &Save - + Save the current service to disk. - + Save &As... - + Save Service As - + Save the current service under a new name. - + E&xit - + Quit OpenLP - + &Theme - + &Configure OpenLP... - + &Media Manager - + Toggle Media Manager - + Toggle the visibility of the media manager. - + &Theme Manager - + Toggle Theme Manager - + Toggle the visibility of the theme manager. - + &Service Manager - + Toggle Service Manager - + Toggle the visibility of the service manager. - + &Preview Panel - + Toggle Preview Panel - + Toggle the visibility of the preview panel. - + &Live Panel - + Toggle Live Panel - + Toggle the visibility of the live panel. - + &Plugin List - + List the Plugins - + &User Guide - + &About - + More information about OpenLP - + &Online Help - + &Web Site - + Use the system language, if available. - + Set the interface language to %s - + Add &Tool... - + Add an application to the list of tools. - + &Default - + Set the view mode back to the default. - + &Setup - + Set the view mode to Setup. - + &Live - + 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/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s - + English Please add the name of your language here - + Configure &Shortcuts... - + Close OpenLP - + Are you sure you want to close OpenLP? - + Open &Data Folder... - + Open the folder where songs, bibles and other data resides. - + &Autodetect - + Update Theme Images - + Update the preview images for all themes. - + Print the current service. - + &Recent Files - + L&ock Panels - + Prevent the panels being moved. - + Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files - + Clear the list of recent files. - + Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file - + Settings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3277,52 +3470,57 @@ - + Open File - + OpenLP Export Settings Files (*.conf) - + Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File - + OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s - + OpenLP cannot load your database. Database: %s @@ -3332,73 +3530,73 @@ OpenLP.MediaManagerItem - + No Items Selected - + &Add to selected Service Item - + You must select one or more items to preview. - + You must select one or more items to send live. - + You must select one or more items. - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. - + You must select one or more items to add. - + No Search Results - + Invalid File Type - + Invalid File %s. Suffix not supported - + &Clone - + Duplicate files were found on import and were ignored. @@ -3406,12 +3604,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <verse> tag is missing. @@ -3419,27 +3617,27 @@ OpenLP.PluginForm - + Plugin List - + Plugin Details - + Status: - + Active - + Inactive @@ -3462,12 +3660,12 @@ OpenLP.PrintServiceDialog - + Fit Page - + Fit Width @@ -3475,7 +3673,7 @@ OpenLP.PrintServiceForm - + Options @@ -3490,47 +3688,47 @@ - + Zoom In - + Zoom Out - + Zoom Original - + Other Options - + Include slide text if available - + Include service item notes - + Include play length of media items - + Add page break before each text item - + Service Sheet @@ -3540,12 +3738,12 @@ - + Title: - + Custom Footer Text: @@ -3553,12 +3751,12 @@ OpenLP.ScreenList - + Screen - + primary @@ -3566,12 +3764,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s - + <strong>Length</strong>: %s @@ -3579,7 +3777,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item @@ -3587,82 +3785,82 @@ OpenLP.ServiceManager - + Move to &top - + Move item to the top of the service. - + Move &up - + Move item up one position in the service. - + Move &down - + Move item down one position in the service. - + Move to &bottom - + Move item to the end of the service. - + &Delete From Service - + Delete the selected item from the service. - + &Add New Item - + &Add to Selected Item - + &Edit Item - + &Reorder Item - + &Notes - + &Change Item Theme @@ -3683,112 +3881,107 @@ - + 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 - + &Expand all - + Expand all the service items. - + &Collapse all - + Collapse all the service items. - + Open File - + Moves the selection down the window. - + Move up - + Moves the selection up the window. - + Go Live - + Send the selected item to Live. - + &Start Time - - Show &Preview - - - - Show &Live + Show &Preview - + Modified Service - + The current service has been modified. Would you like to save this service? - + Custom Service Notes: - + Notes: - + Playing time: - + Untitled Service @@ -3813,17 +4006,17 @@ - + Load an existing service. - + Save this service. - + Select a theme for the service. @@ -3833,7 +4026,7 @@ - + Service File Missing @@ -3857,11 +4050,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes @@ -3877,67 +4080,67 @@ OpenLP.ShortcutListDialog - + Action - + Shortcut - + Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default - + Custom - + Capture shortcut. - + Restore the default shortcut of this action. - + Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts @@ -3945,177 +4148,172 @@ OpenLP.SlideController - + Hide - + Go To - + Blank Screen - + Blank to Theme - + Show Desktop - + Previous Service - + Next Service - + Escape Item - + Move to previous. - + Move to next. - + Play Slides - + Delay between slides in seconds. - + Move to live. - + Add to Service. - + Edit and reload song preview. - + Start playing media. - + Pause audio. - + Pause playing media. - + Stop playing media. - + Video position. - + Audio Volume. - + Go to "Verse" - + Go to "Chorus" - + Go to "Bridge" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" - + Previous Slide - + Next Slide - + Pause Audio - + Background Audio - - Next Track - - - - + Go to next audio track. - + Tracks @@ -4191,17 +4389,17 @@ - + Theme Layout - + The blue box shows the main area. - + The red box shows the footer. @@ -4209,32 +4407,32 @@ OpenLP.ThemeForm - + Select Image - + Theme Name Missing - + There is no name for this theme. Please enter one. - + Theme Name Invalid - + Invalid theme name. Please enter one. - + (approximately %d lines per slide) @@ -4242,193 +4440,193 @@ OpenLP.ThemeManager - + Create a new theme. - + Edit Theme - + Edit a theme. - + Delete Theme - + Delete a theme. - + Import Theme - + Import a theme. - + Export Theme - + Export a theme. - + &Edit Theme - + &Delete Theme - + Set As &Global Default - + %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. - + &Copy Theme - + &Rename Theme - + &Export Theme - + 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) - + Copy of %s Copy of <theme name> - + Theme Already Exists @@ -4436,272 +4634,272 @@ OpenLP.ThemeWizard - + Theme Wizard - + Welcome to the Theme Wizard - + Set Up Background - + Set up your theme's background according to the parameters below. - + Background type: - + Solid Color - + Gradient - + Color: - + Gradient: - + Horizontal - + Vertical - + Circular - + Top Left - Bottom Right - + Bottom Left - Top Right - + Main Area Font Details - + Define the font and display characteristics for the Display text - + Font: - + Size: - + Line Spacing: - + &Outline: - + &Shadow: - + Bold - + Italic - + Footer Area Font Details - + Define the font and display characteristics for the Footer text - + Text Formatting Details - + Allows additional display formatting information to be defined - + Horizontal Align: - + Left - + Right - + Center - + Output Area Locations - + Allows you to change and move the main and footer areas. - + &Main Area - + &Use default location - + X position: - + px - + Y position: - + Width: - + Height: - + Use default location - + Save and Preview - + View the theme and save it replacing the current one or change the name to create a new theme - + Theme name: - + Edit Theme - %s - + 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: - + &Footer Area - + Starting color: - + Ending color: - + Background color: - + Tło czcionki: - + Justify - + Layout Preview - + Transparent @@ -4709,47 +4907,47 @@ OpenLP.ThemesTab - + Global Theme - + Theme Level - + S&ong Level - + 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 - + 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. - + &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. - + Themes @@ -4833,239 +5031,239 @@ - + Image - + Import - + Live - + Live Background Error - + 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 - + Preview - + Replace Background - + Reset 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 - + Theme Singular - + Themes Plural - + Top - + Version - + Delete the selected item. - + Move selection up one position. - + Move selection down one position. - + &Vertical Align: - + Finished import. - + Format: - + Importing - + Importing "%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. - + Open %s File - + %p% - + Ready. - + Starting import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong @@ -5081,7 +5279,7 @@ - + Welcome to the Song Import Wizard @@ -5169,53 +5367,53 @@ - + Layout style: - + Live Toolbar - + m The abbreviated unit for minutes - + OpenLP is already running. Do you wish to continue? - + Settings - + Tools - + Unsupported File - + Verse Per Slide - + Verse Per Line - + View @@ -5230,42 +5428,37 @@ - + View Mode - + Open service. - + Print Service - + Replace live background. - + Reset live background. - - &Split - - - - + Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard @@ -5275,53 +5468,105 @@ - + Play Slides in Loop - + Play Slides to End - + Stop Play Slides in Loop - + Stop Play Slides to End - + Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1, and %2 Locale list separator: end - + %1, %2 Locale list separator: middle - + %1, %2 Locale list separator: start @@ -5330,50 +5575,50 @@ PresentationPlugin - + <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. - + Presentation name singular - + Presentations name plural - + Presentations container title - + Load a new presentation. - + Delete the selected presentation. - + Preview the selected presentation. - + Send the selected presentation live. - + Add the selected presentation to the service. @@ -5381,70 +5626,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) - + Automatic - + Present using: - + File Exists - + A presentation with that filename already exists. - + This type of presentation is not supported. - + Presentations (%s) - + Missing Presentation - - The Presentation %s no longer exists. + + The presentation %s is incomplete, please reload. - - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers - + %s (unavailable) - + Allow presentation application to be overridden @@ -5478,135 +5723,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote - + OpenLP 2.0 Stage View - + Service Manager - + Slide Controller - - Alerts - - - - Search + Alerts - Back + Search - + Refresh - + Blank - + Show - + Prev - + Next - + Text - + Show Alert - + Go Live - + No Results - + Options - + Add to Service + + + Home + + + + + Theme + + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: - + Port number: - + Server Settings - + Remote URL: - + Stage view URL: - + Display stage time in 12h format - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5614,85 +5874,85 @@ SongUsagePlugin - + &Song Usage Tracking - + &Delete Tracking Data - + Delete song usage data up to a specified date. - + &Extract Tracking Data - + Generate a report on song usage. - + Toggle Tracking - + Toggle the tracking of song usage. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - + SongUsage name singular - + SongUsage name plural - + SongUsage container title - + Song Usage - + Song usage tracking is active. - + Song usage tracking is inactive. - + display - + printed @@ -5700,7 +5960,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data @@ -5725,7 +5985,7 @@ - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5733,54 +5993,54 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction - + Select Date Range - + to - + Report Location - + Output File Location - + usage_detail_%s_%s.txt - + Report Creation - + Report %s has been successfully created. - + Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5818,107 +6078,107 @@ - + Arabic (CP-1256) - + Baltic (CP-1257) - + Central European (CP-1250) - + Cyrillic (CP-1251) - + Greek (CP-1253) - + Hebrew (CP-1255) - + Japanese (CP-932) - + Korean (CP-949) - + Simplified Chinese (CP-936) - + Thai (CP-874) - + Traditional Chinese (CP-950) - + Turkish (CP-1254) - + Vietnam (CP-1258) - + Western European (CP-1252) - + Character Encoding - + 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. - + Song name singular - + Songs name plural - + Songs container title @@ -5929,32 +6189,32 @@ - + 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. @@ -5982,17 +6242,17 @@ - + You need to type in the first name of the author. - + You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? @@ -6021,209 +6281,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor - + &Title: - + Alt&ernate title: - + &Lyrics: - + &Verse order: - + Ed&it All - + Title && Lyrics - + &Add to Song - + &Remove - + &Manage Authors, Topics, Song Books - + A&dd to Song - + R&emove - + Book: - + Number: - + Authors, Topics && Song Book - + New &Theme - + Copyright Information - + Comments - + Theme, Copyright Info && Comments - + Add Author - + This author does not exist, do you want to add them? - + This author is already in the list. - + 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. - + Add Topic - + This topic does not exist, do you want to add it? - + This topic is already in the list. - + 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. - + You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book - + This song book does not exist, do you want to add it? - + You need to have an author for this song. - + You need to type some text in to the verse. - + Linked Audio - + Add &File(s) - + Add &Media - + Remove &All - + Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6337,130 +6610,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files - + 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. - + Generic Document/Presentation - - Filename: - - - - - 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. - - - - + Add Files... - + Remove File(s) - + Please wait while your songs are imported. - + OpenLP 2.0 Databases - + openlp.org v1.x Databases - + Words Of Worship Song Files - - You need to specify at least one document or presentation file to import from. - - - - + Songs Of Fellowship Song Files - + SongBeamer Files - + SongShow Plus Song Files - + Foilpresenter Song Files - + Copy - + Save to File - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. @@ -6468,27 +6761,27 @@ SongsPlugin.MediaItem - + Titles - + Lyrics - + CCLI License: - + Entire Song - + Are you sure you want to delete the %n selected song(s)? @@ -6497,16 +6790,41 @@ - + Maintain the lists of authors, topics and books. - + copy For song cloning + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6533,6 +6851,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6571,12 +6902,12 @@ SongsPlugin.SongImport - + copyright - + The following songs could not be imported: @@ -6597,117 +6928,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. - + This author already exists. - + Could not add your topic. - + This topic already exists. - + Could not add your book. - + This book already exists. - + Could not save your changes. - + Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. - + Delete Author - + Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic - + Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book - + Are you sure you want to delete the selected book? - + 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? - + 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? @@ -6715,28 +7038,28 @@ SongsPlugin.SongsTab - + Songs Mode - + Enable search as you type - + Display verses on live tool bar - + Update service from song edit - - Add missing songs when opening service + + Import missing songs from service files @@ -6796,4 +7119,17 @@ + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/pt_BR.ts openlp-1.9.10/resources/i18n/pt_BR.ts --- openlp-1.9.9/resources/i18n/pt_BR.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/pt_BR.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Alerta - + Show an alert message. Exibir uma mensagem de alerta. - + Alert name singular Alerta - + Alerts name plural Alertas - + Alerts container title Alertas - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Plugin de Alerta</strong><br />O plugin de alerta controla a exibição de mensagens do berçario na tela. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Mensagem de Alerta - + Alert &text: &Texto de Alerta: - + &New &Novo - + &Save &Salvar - + Displ&ay &Exibir - + Display && Cl&ose Exibir && &Fechar @@ -79,7 +79,7 @@ Você não digitou nenhum texto para o seu alerta. Por favor digite algum texto antes de clicar em Novo. - + &Parameter: &Parâmetro: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Fonte - + Font name: Nome da fonte: - + Font color: Cor da fonte: - + Background color: Cor de fundo: - + Font size: Tamanho da fonte: - + Alert timeout: Tempo limite para o Alerta: @@ -152,551 +152,598 @@ BiblesPlugin - + &Bible &Bíblia - + Bible name singular Bíblia - + Bibles name plural Bíblias - + Bibles container title Bíblias - + No Book Found Nenhum Livro Encontrado - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Nenhum livro correspondente foi encontrado nesta Bíblia. Verifique se você digitou o nome do livro corretamente. - + Import a Bible. Importar uma Bíblia. - + Add a new Bible. Adicionar uma Bíblia nova. - + Edit the selected Bible. Editar a Bíblia selecionada. - + Delete the selected Bible. Excluir a Bíblia selecionada. - + Preview the selected Bible. Pré-visualizar a Bíblia selecionada. - + Send the selected Bible live. Projetar a Bíblia selecionada. - + Add the selected Bible to the service. Adicionar a Bíblia selecionada ao culto. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Plugin de Bíblia</strong><br />O plugin de Bíblia permite exibir versículos bíblicos de diferentes origens durante o culto. - + &Upgrade older Bibles &Atualizar Bíblias antigas - + Upgrade the Bible databases to the latest format. Atualizar o banco de dados de Bíblias para o formato atual. - + Genesis Gênesis - + Exodus Êxodo - + Leviticus Levítico - + Numbers Números - + Deuteronomy Deuteronômio - + Joshua Josué - + Judges Juízes - + Ruth Rute - + 1 Samuel 1 Samuel - + 2 Samuel 2 Samuel - + 1 Kings 1 Reis - + 2 Kings 2 Reis - + 1 Chronicles 1 Crônicas - + 2 Chronicles 2 Crônicas - + Ezra Esdras - + Nehemiah Neemias - + Esther Ester - + Job - + Psalms Salmos - + Proverbs Provérbios - + Ecclesiastes Eclesiastes - + Song of Solomon Cântico dos Cânticos - + Isaiah Isaías - + Jeremiah Jeremias - + Lamentations Lamentações de Jeremias - + Ezekiel Ezequiel - + Daniel Daniel - + Hosea Oseias - + Joel Joel - + Amos Amós - + Obadiah Obadias - + Jonah Jonas - + Micah Miqueias - + Nahum Naum - + Habakkuk Habacuque - + Zephaniah Sofonias - + Haggai Ageu - + Zechariah Zacarias - + Malachi Malaquias - + Matthew Mateus - + Mark Marcos - + Luke Lucas - + John João - + Acts Atos dos Apóstolos - + Romans Romanos - + 1 Corinthians 1 Coríntios - + 2 Corinthians 2 Coríntios - + Galatians Gálatas - + Ephesians Efésios - + Philippians Filipenses - + Colossians Colossenses - + 1 Thessalonians 1 Tessalonicenses - + 2 Thessalonians 2 Tessalonicenses - + 1 Timothy 1 Timóteo - + 2 Timothy 2 Timóeo - + Titus Tito - + Philemon Filemon - + Hebrews Hebreus - + James Tiago - + 1 Peter 1 Pedro - + 2 Peter 2 Pedro - + 1 John 1 João - + 2 John 2 João - + 3 John 3 João - + Jude Judas - + Revelation Apócalipse - + Judith Judite - + Wisdom Sabedoria - + Tobit Tobias - + Sirach Eclesiástico - + Baruch Baruque - + 1 Maccabees 1 Macabeus - + 2 Maccabees 2 Macabeus - + 3 Maccabees 3 Macabeus - + 4 Maccabees 4 Macabeus - + Rest of Daniel Acréscimos de Daniel - + Rest of Esther Adições a Ester - + Prayer of Manasses Oração de Manassés - + Letter of Jeremiah Carta de Jeremias - + Prayer of Azariah Oração de Azarias - + Susanna Suzana - + Bel Bel - + 1 Esdras 1 Esdras - + 2 Esdras 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. :|v|V|verso|versos;;-|até;;,|e;;fim + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + É necessário especificar um nome para esta versão da Bíblia. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + É necessário informar os Direitos Autorais para esta Bíblia. Traduções em domínio público precisam ser marcadas como tal. + + + + Bible Exists + A Bíblia existe + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Esta Bíblia já existe. Por favor importa outra Bíblia ou remova a já existente. + + + + You need to specify a book name for "%s". + É necessário especificar um nome de livro para "%s". + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + O nome de livro "%s" não é válido. +Números só podem ser usados na início e precisam +ser seguidos de um ou mais caracteres não-numéricos. + + + + Duplicate Book Name + Nome de Livro Duplicado + + + + The Book Name "%s" has been entered more than once. + O nome de Livro "%s" foi informado mais de uma vez. + + + BiblesPlugin.BibleManager - + Scripture Reference Error Erro de Referência na Escritura - + Web Bible cannot be used Não é possível usar a Bíblia Online - + Text Search is not available with Web Bibles. A Pesquisa de Texto não está disponível para Bíblias Online. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Você não digitou uma palavra-chave de pesquisa. Você pode separar diferentes palavras-chave com um espaço para procurar por todas as palavras-chave e pode separá-las com uma vírgula para pesquisar por alguma delas. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Não há Bíblias instaladas atualmente. Por favor, utilize o Assistente de Importação para instalar uma ou mais Bíblias. - + No Bibles Available Nenhum Bíblia Disponível - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +766,79 @@ BiblesPlugin.BiblesTab - + Verse Display Exibição do Versículo - + Only show new chapter numbers Somente mostrar números de capítulos novos - + Bible theme: Tema da Bíblia: - + No Brackets Sem Parênteses - + ( And ) ( E ) - + { And } { E } - + [ And ] [ E ] - + Note: Changes do not affect verses already in the service. Observação: Mudanças não afetam os versículos que já estão no culto. - + Display second Bible verses Exibir versículos da Bíblia secundária - + Custom Scripture References Referências Personalizadas das Escrituras - + Verse Separator: Separador de Versos - + Range Separator: Separador de Faixas: - + List Separator: Separador de Listas: - + End Mark: Marcação de Fim: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +847,7 @@ Por favor, limpe esta linha edição para usar o valor padrão. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +856,7 @@ Por favor, limpe esta linha edição para usar o valor padrão. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +865,7 @@ Por favor, limpe esta linha edição para usar o valor padrão. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,90 +874,80 @@ Por favor, limpe esta linha edição para usar o valor padrão. - - Preferred Bookname Language - Idioma Preferido de Nomes de Livros - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Selecione o idioma em que os nomes dos livros da Bíblia devem ser exibidos na busca de Bíblia + + English + Inglês - - Bible language - Idioma da Bíblia + + Default Bible Language + Idioma Padrão de Bíblia - - Application language - Idioma do Aplicativo + + Book name language in search field, +search results and on display: + Idioma do nome de livros a ser usado na caixa de +busca, resultados da busca e na exibição: - - English - Inglês + + Bible Language + Idioma da Bíblia - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Múltiplas opções: -Idioma da Bíblia - o idioma em que os nomes dos lívros da Bíblia foram importados -Idioma do aplicativo - o idioma que escolheu para OpenLP -Inglês - usar sempre nomes de livro em Inglês + + Application Language + Idioma do Aplicativo BiblesPlugin.BookNameDialog - + Select Book Name Selecione o Nome do Livro - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Não foi encontrado um correspondente para o nome do livro a seguir. Por favor, selecione o nome em Inglês a partir da lista. - - - + Current name: Nome atual: - + Corresponding name: Nome correspondente: - + Show Books From Mostrar Livros do - + Old Testament Antigo Testamento - + New Testament Novo Testamento - + Apocrypha Apócrifos + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + Não foi encontrado um nome interno que corresponde ao seguinte nome de livro. Por favor escolha o nome correspondente da lista. + BiblesPlugin.BookNameForm - + You need to select a book. Você deve selecionar um livro. @@ -935,40 +972,110 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Editor de Bíblia + + + + License Details + Detalhes da Licença + + + + Version name: + Nome da versão: + + + + Copyright: + Direitos Autorais: + + + + Permissions: + Permissões: + + + + Default Bible Language + Idioma Padrão de Bíblia + + + + Book name language in search field, search results and on display: + Idioma do nome de livros a ser usado na caixa de +busca, resultados da busca e na exibição: + + + + Global Settings + Configurações Globais + + + + Bible Language + Idioma da Bíblia + + + + Application Language + Idioma da Aplicação + + + + English + Inglês + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + Esta Bíblia foi baixada da Internet. Não é possível modificar os nomes dos Livros. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + Para usar os nomes de livros personalizados, "Idioma da Bíblia" deve estar selecionado na aba Meta Dados ou, se estiver selecionado "Ajustes Globais", na página Bíblia no Configurar OpenLP. + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registrando Bíblia e carregando livros... - + Registering Language... Registrando Idioma... - + Importing %s... Importing <book name>... Importando %s... - + Download Error Erro ao Baixar - + 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. Ocorreu um problema ao baixar os versículos selecionados. Verifique sua conexão com a Internet, e se este erro continuar ocorrendo, por favor considere relatar um bug. - + Parse Error Erro de Interpretação - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Ocorreu um problema ao extrair os versículos selecionados. Se este erro continuar ocorrendo, por favor considere relatar um bug. @@ -1146,17 +1253,17 @@ BiblesPlugin.LanguageDialog - + Select Language Selecione Idioma - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP não pôde determinar o idioma desta tradução da Bíblia. Por favor, selecione o idioma na lista abaixo. - + Language: Idioma: @@ -1172,85 +1279,100 @@ BiblesPlugin.MediaItem - + Quick Rápido - + Find: Localizar: - + Book: Livro: - + Chapter: Capítulo: - + Verse: Versículo: - + From: De: - + To: Até: - + Text Search Pesquisar Texto - + Second: Segundo: - + Scripture Reference Referência da Escritura - + Toggle to keep or clear the previous results. Alternar entre manter ou limpar resultados anteriores. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Você não pode combinar os resultados de buscas de versículo Bíblicos simples e duplo. Você deseja deletar os resultados da sua busca e comecar uma nova? - + Bible not fully loaded. Bíblia não carregada completamente. - - Information - Informações + + Information + Informações + + + + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + A Bíblia secundária não contém todos os versículos que estão na Bíblia principal. Somente versículos encontrados em ambas as Bíblias serão exibidas. %d versículos não foram inclusos nos resultados. + + + + Search Scripture Reference... + Pesquisar referência... + + + + Search Text... + Pesquisar texto... - - The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. - A Bíblia secundária não contém todos os versículos que estão na Bíblia principal. Somente versículos encontrados em ambas as Bíblias serão exibidas. %d versículos não foram inclusos nos resultados. + + Are you sure you want to delete "%s"? + Tem certeza de que desejas apagar "%s"? BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importando %s %s... @@ -1259,12 +1381,12 @@ 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... @@ -1273,149 +1395,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Selecione um Diretório para Cópia de Segurança - + Bible Upgrade Wizard Assistente de Atualização de Bíblias - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Este assistente irá ajudá-lo a atualizar suas Bíblias existentes a partir de uma versão anterior do OpenLP 2. Clique no botão avançar abaixo para começar o processo de atualização. - + Select Backup Directory Selecione o Diretório para Cópia de Segurança - + Please select a backup directory for your Bibles Por favor, selecione um diretório para a cópia de segurança das suas Bíblias - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. As versões anteriores do OpenLP 2.0 não conseguem usar as Bíblias atualizadas. Isto irá criar uma cópia de segurança das suas Bíblias atuais para que possa copiar os arquivos de voltar para o diretório de dados do OpenLP caso seja necessário voltar a uma versão anterior do OpenLP. Instruções de como recuperar os arquivos podem ser encontradas no nosso <a href="http://wiki.openlp.org/faq">Perguntas Frequentes</a>. - + Please select a backup location for your Bibles. Por favor, selecione o local da cópia de segurança das suas Bíblias. - + Backup Directory: Diretório de Cópia de Segurança: - + There is no need to backup my Bibles Não é necessário fazer uma cópia de segurança das minhas Bíblias - + Select Bibles Selecione Bíblias - + Please select the Bibles to upgrade Por favor, selecione as Bíblias a atualizar - + Upgrading Atualizando - + Please wait while your Bibles are upgraded. Por favor, aguarde enquanto suas Bíblias são atualizadas. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. A cópia de segurança não teve êxito. Para fazer uma cópia de segurança das suas Bíblias é necessário permissão de escrita no diretório selecionado. - + Upgrading Bible %s of %s: "%s" Failed Atualizando Bíblia %s de %s: "%s" Falhou - + Upgrading Bible %s of %s: "%s" Upgrading ... Atualizando Bíblia %s de %s: "%s" Atualizando ... - + Download Error Erro ao Baixar - + To upgrade your Web Bibles an Internet connection is required. Para atualizar suas Bíblias Internet é necessária uma conexão com a internet. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Atualizando Bíblia %s de %s: "%s" Atualizando %s ... - + Upgrading Bible %s of %s: "%s" Complete Atualizando Bíblia %s de %s: "%s" Finalizado - + , %s failed . %s falhou - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Atualizando Bíblia(s): %s com sucesso%s Observe, que versículos das Bíblias Internet serão transferidos sob demanda então é necessária uma conexão com a internet. - + Upgrading Bible(s): %s successful%s Atualizando Bíblia(s): %s com sucesso%s - + Upgrade failed. A atualização falhou. - + You need to specify a backup directory for your Bibles. Você precisa informar um diretório de backup para as suas Bíblias. - + Starting upgrade... Iniciando atualização... - + There are no Bibles that need to be upgraded. Não há Bíblias que necessitam ser atualizadas. @@ -1489,12 +1611,12 @@ CustomPlugin.CustomTab - + Custom Display Exibir Personalizado - + Display footer Exibir rodapé @@ -1502,42 +1624,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Editar Slides Personalizados - + &Title: &Título: - + Add a new slide at bottom. Adicionar um novo slide no final. - + Edit the selected slide. Editar o slide selecionado. - + Edit all the slides at once. Editar todos os slides de uma vez. - + Split a slide into two by inserting a slide splitter. Dividir um slide em dois, inserindo um divisor de slides. - + The&me: Te&ma: - + &Credits: &Créditos: @@ -1552,12 +1674,12 @@ Você deve adicionar pelo menos um slide - + Ed&it All &Editar Todos - + Insert Slide Inserir Slide @@ -1565,7 +1687,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Tem certeza que deseja excluir o %n slide personalizado selecionado? @@ -1576,60 +1698,60 @@ ImagePlugin - + <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 permite a exibição de imagens.<br />Uma das funcionalidades importantes deste plugin é a possibilidade de agrupar várias imagens no culto, facilitando a exibição de várias imagens. Este plugin também pode usar a funcionalidade de "repetição temporizada" 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. - + Image name singular Imagem - + Images name plural Imagens - + Images container title Imagens - + Load a new image. Carregar uma nova imagem. - + Add a new image. Adicionar uma nova imagem. - + Edit the selected image. Editar a imagem selecionada. - + Delete the selected image. Excluir a imagem selecionada. - + Preview the selected image. Pré-visualizar a imagem selecionada. - + Send the selected image live. Enviar a imagem selecionada para a projeção. - + Add the selected image to the service. Adicionar a imagem selecionada ao culto. @@ -1637,7 +1759,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Selecionar Anexo @@ -1645,44 +1767,44 @@ ImagePlugin.MediaItem - + Select Image(s) Selecionar Imagem(s) - + You must select an image to delete. Você precisa selecionar uma imagem para excluir. - + You must select an image to replace the background with. Você precisa selecionar uma imagem para definir como plano de fundo. - + Missing Image(s) Imagem(s) não encontrada(s) - + The following image(s) no longer exist: %s A(s) seguinte(s) imagem(s) não existe(m) mais: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? A(s) seguinte(s) imagem(s) não existe(m) mais: %s Mesmo assim, deseja continuar adicionando as outras imagens? - + There was a problem replacing your background, the image file "%s" no longer exists. Ocorreu um erro ao substituir o plano de fundo, o arquivo de imagem "%s" não existe. - + There was no display item to amend. Não há nenhum item de exibição para corrigir. @@ -1690,78 +1812,78 @@ ImagesPlugin.ImageTab - + Background Color Cor do Plano de Fundo - + Default Color: Cor Padrão: - - Provides border where image is not the correct dimensions for the screen when resized. - Provê uma borda se a imagem não estiver nas dimensões corretas da tela quando redimensionada. + + Visible background for images with aspect ratio different to screen. + Plano de fundo que será visto nas imagens que possuem proporção altura/largura diferente da tela. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Plugin de Mídia</strong><br />O plugin de mídia permite a reprodução de áudio e vídeo. - + Media name singular Mídia - + Media name plural Mídia - + Media container title Mídia - + Load new media. Carregar nova mídia. - + Add new media. Adicionar nova mídia. - + Edit the selected media. Editar a mídia selecionada. - + Delete the selected media. Excluir a mídia selecionada. - + Preview the selected media. Pré-visualizar a mídia selecionada. - + Send the selected media live. Enviar a mídia selecionada para a projeção. - + Add the selected media to the service. Adicionar a mídia selecionada ao culto. @@ -1809,7 +1931,7 @@ Não há nenhum item de exibição para corrigir. - + Unsupported File Arquivo não suportado @@ -1827,22 +1949,22 @@ MediaPlugin.MediaTab - + Available Media Players Reprodutores de Mídia Disponíveis - + %s (unavailable) %s (indisponível) - + Player Order Sequência de Reprodução - + Allow media player to be overridden Permitir que o reprodutor de mídia seja alterado @@ -1850,7 +1972,7 @@ OpenLP - + Image Files Arquivos de Imagem @@ -1872,17 +1994,17 @@ OpenLP.AboutForm - + Credits Créditos - + License Licença - + Contribute Contribuir @@ -1892,17 +2014,17 @@ compilação %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. 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; 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 @@ -2027,7 +2149,7 @@ pela Graça ele nos libertou. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2044,7 +2166,7 @@ O OpenLP é escrito e mantido por voluntários. Se você gostaria de ver mais softwares Cristãos gratuítos sendo escritos, por favor, considere contribuir usando o botão abaixo. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Copyright © 2004-2012 %s @@ -2054,87 +2176,87 @@ OpenLP.AdvancedTab - + UI Settings Configurações da Interface - + Number of recent files to display: Número de arquivos recentes a serem exibidos: - + Remember active media manager tab on startup Lembrar aba ativa do gerenciador de mídia ao iniciar - + Double-click to send items straight to live Clicar duas vezes para diretamente projetar itens - + Expand new service items on creation Expandir novos itens do culto ao serem criados - + Enable application exit confirmation Habilitar confirmação de saída do programa - + Mouse Cursor Ponteiro do Mouse - + Hide mouse cursor when over display window Ocultar o cursor do mouse quando estiver sobre a tela de projeção - + Default Image Imagem Padrão - + Background color: Cor do plano de fundo: - + Image file: Arquivo de Imagem: - + Open File Abrir Arquivo - + Advanced Avançado - + Preview items when clicked in Media Manager Pré-visualizar itens quando clicados no Gerenciador de Mídia - + Click to select a color. Clique para selecionar uma cor. - + Browse for an image file to display. Procurar um arquivo de imagem para exibir. - + Revert to the default OpenLP logo. Reverter ao logotipo padrão OpenLP. @@ -2146,137 +2268,221 @@ Culto %Y-%m-%d %H-%M - + Default Service Name Nome Padrão de Culto - + Enable default service name Habilitar nome padrão de culto - + Date and Time: Data e Hora: - + Monday Segunda-feira - + Tuesday Terça-feira - + Wednesday Quarta-feira - + Thurdsday Quinta-feira - + Friday Sexta-feira - + Saturday Sábado - + Sunday Domingo - + Now Agora - + Time when usual service starts. Hora em que o culto normal se inicia. - + Name: Nome: - + Consult the OpenLP manual for usage. Consulte o manual OpenLP para uso. - + Revert to the default service name "%s". Reverter para o nome padrão de culto "%s". - + Example: Exemplo: - + X11 X11 - + Bypass X11 Window Manager Desativar Gerenciador de Janelas X11 - + Syntax error. Erro de sintaxe. + + + Data Location + Local dos Dados + + + + Current path: + Caminho atual: + + + + Custom path: + Caminho personalizado: + + + + Browse for new data file location. + Escolher um novo local para os arquivos de dados. + + + + Set the data location to the default. + Restabelecer o local de dados para o padrão. + + + + Cancel + Cancelar + + + + Cancel OpenLP data directory location change. + Cancelar a mudança da localização dos dados do OpenLP. + + + + Copy data to new location. + Copiar os dados para a nova localização. + + + + Copy the OpenLP data files to the new location. + Copiar os arquivos de dados do OpenLP para a nova localização. + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + <strong>AVISO:</strong> O novo diretório de dados já contém arquivos do OpenLP. Estes arquivos SERÃO sobrescritos durante uma cópia. + + + + Data Directory Error + Erro no Diretório de Dados + + + + Select Data Directory Location + Seleciona a Localização do Diretório de Dados + + + + Confirm Data Directory Change + Confirmar Mudança do Diretório de Dados + + + + Reset Data Directory + Restabelecer o Diretório de Dados + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + Tem certeza de que quer mudar a localização do diretório de dados do OpenLP para a localização padrão? + +Esta localização será usada depois que o OpenLP for fechado. + + + + Overwrite Existing Data + Sobrescrever Dados Existentes + OpenLP.ExceptionDialog - + Error Occurred Ocorreu um Erro - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Ops! O OpenLP encontrou um problema e não pôde recuperar-se. O texto na caixa abaixo contém informações que podem ser úteis para os desenvolvedores do OpenLP, então, por favor, envie um e-mail para bugs@openlp.org, junto com uma descrição detalhada daquilo que você estava fazendo quando o problema ocorreu. - + Send E-Mail Enviar E-Mail - + Save to File Salvar para um Arquivo - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Por favor, descreva o que você estava fazendo para causar este erro (Mínimo de 20 caracteres) - + Attach File Anexar Arquivo - + Description characters to enter : %s Caracteres que podem ser digitadas na descrição: %s @@ -2284,24 +2490,24 @@ OpenLP.ExceptionForm - + Platform: %s Plataforma: %s - + Save Crash Report Salvar Relatório de Travamento - + Text files (*.txt *.log *.text) Arquivos de texto (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2332,7 +2538,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2469,17 +2675,17 @@ Configurações Padrões - + Downloading %s... Transferindo %s... - + Download complete. Click the finish button to start OpenLP. Transferência finalizada. Clique no botão terminar para iniciar o OpenLP. - + Enabling selected plugins... Habilitando os plugins selecionados... @@ -2549,32 +2755,32 @@ Este assistente irá ajudá-lo na configuração do OpenLP para o uso inicial. Clique abaixo no botão avançar para começar. - + Setting Up And Downloading Configurando e Transferindo - + Please wait while OpenLP is set up and your data is downloaded. Por favor, aguarde enquanto o OpenLP é configurado e seus dados são transferidos. - + Setting Up Configurando - + Click the finish button to start OpenLP. Clique o botão finalizar para iniciar o OpenLP. - + Download complete. Click the finish button to return to OpenLP. Transferência finalizada. Clique no botão finalizar para retornar ao OpenLP. - + Click the finish button to return to OpenLP. Cloque no botão finalizar para retornar ao OpenLP. @@ -2584,78 +2790,82 @@ Slides Personalizados + + Finish + Finalizar + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Não foi possível encontrar uma conexão com a internet. O Assistente de Primeira Execução necessita de uma conexão para fazer a transferência de músicas, Bíblias e temas. Pressione o botão finalizar para iniciar o OpenLP com as configurações iniciais e sem arquivos de exemplo. + Nenhuma conexão com a internet encontrada. O Assistente de Primeira Execução necessita de uma conexão para baixar letras de músicas, bíblias e temas. + +Para iniciar o Assistente de Primeira Execução novamente e baixar letras de músicas, bíblias e temas, verifique a sua conexão com a internet e siga estes passos para executar este assistente novamente: "Ferramentas/Iniciar o Assistente de Primeira Execução novamente" no OpenLP. -Para iniciar o Assistente de Primeira Execução novamente e importar estes arquivos de exemplo mais tarde, verifique a sua conexão com a internet e execute o assistente novamente selecionando "Ferramentas/Iniciar o Assistente de Primeira Execução novamente" no OpenLP. +Clique no botão finalizar para iniciar o OpenLP com as configurações iniciais. -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. -Para cancelar completamente o Assistente de Primeira Execução (e não iniciar o OpenLP), clique agora no botão Cancelar. - - - - Finish - Finalizar +Para cancelar o Assistente de Primeira Execução (e não iniciar o OpenLP), clique no botão Cancelar. + + OpenLP.FormattingTagDialog - + Configure Formatting Tags Configurar Etiquetas de Formatação - + Edit Selection Editar Seleção - + Save Salvar - + Description Descrição - + Tag Tag - + Start tag Tag Inicial - + End tag Tag Final - + Tag Id Id do Tag - + Start HTML Iniciar HTML - + End HTML Finalizar HTML @@ -2663,32 +2873,32 @@ OpenLP.FormattingTagForm - + Update Error Erro na Atualização - + Tag "n" already defined. Tag "n" já está definida. - + New Tag Novo Tag - + <HTML here> <HTML aqui> - + </and here> </e aqui> - + Tag %s already defined. Tag %s já está definida. @@ -2696,82 +2906,82 @@ OpenLP.FormattingTags - + Red Vermelho - + Black Preto - + Blue Azul - + Yellow Amarelo - + Green Verde - + Pink Rosa - + Orange Laranja - + Purple Roxo - + White Branco - + Superscript Sobrescrito - + Subscript Subscrito - + Paragraph Parágrafo - + Bold Negrito - + Italics Itálico - + Underline Sublinhado - + Break Quebra @@ -2779,180 +2989,170 @@ OpenLP.GeneralTab - + General Geral - + Monitors Monitores - + Select monitor for output display: Selecione o monitor para exibição: - + Display if a single screen Exibir no caso de uma única tela - + Application Startup Inicialização do Aplicativo - + Show blank screen warning Exibir alerta de tela em branco - + Automatically open the last service Abrir automaticamente o último culto - + Show the splash screen Exibir a tela de abertura - + Application Settings Configurações do Aplicativo - + Prompt to save before starting a new service Perguntar se salva antes de iniciar um novo culto - + Automatically preview next item in service Pré-visualizar automaticamente o item seguinte do culto - + sec seg - + CCLI Details Detalhes de CCLI - + SongSelect username: Usuário SongSelect: - + SongSelect password: Senha SongSelect: - + X X - + Y Y - + Height Altura - + Width Largura - + Check for updates to OpenLP Procurar por atualizações do OpenLP - + Unblank display when adding new live item Ativar projeção ao adicionar um item novo - + Timed slide interval: Intervalo temporizado de slide: - + Background Audio Áudio de Fundo - + Start background audio paused Iniciar áudio de fundo em pausa - + Service Item Slide Limits Limites de Slide de Itens de Culto - - &End Slide - Slide &Final - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - As setas para cima e para baixo param nos slides iniciais de finais de cada Item de Culto. - - - - &Wrap Slide - Slide &Contínuo + + Override display position: + Alterar posição de exibição: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - As setas para cima e para baixo continuam no outro extremo de cada Item de Culto. + + Repeat track list + Repetir lista de faixas - - &Next Item - Item &Seguinte + + Behavior of next/previous on the last/first slide: + Comportamento do Próximo/Anterior no primeiro e últimos slides: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - As setas para cima e para baixo passam para o Item de Culto seguinte ou anterior a partir dos slide iniciais ou finais de cada Item de Culto. + + &Remain on Slide + &Permanecer no Slide - - Override display position: - Alterar posição de exibição: + + &Wrap around + Quebrar linhas - - Repeat track list - Repetir lista de faixas + + &Move to next/previous service item + &Mover para o próximo/anterior item do culto 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. @@ -2968,287 +3168,287 @@ OpenLP.MainWindow - + &File &Arquivo - + &Import &Importar - + &Export &Exportar - + &View &Exibir - + M&ode M&odo - + &Tools &Ferramentas - + &Settings &Configurações - + &Language &Idioma - + &Help Aj&uda - + Media Manager Gerenciador de Mídia - + Service Manager Gerenciador de Culto - + Theme Manager Gerenciador de Tema - + &New &Novo - + &Open &Abrir - + Open an existing service. Abrir um culto existente. - + &Save &Salvar - + Save the current service to disk. Salvar o culto atual no disco. - + Save &As... Salvar &Como... - + Save Service As Salvar Culto Como - + Save the current service under a new name. Salvar o culto atual com um novo nome. - + E&xit S&air - + Quit OpenLP Fechar o OpenLP - + &Theme &Tema - + &Configure OpenLP... &Configurar o OpenLP... - + &Media Manager &Gerenciador de Mídia - + Toggle Media Manager Alternar Gerenciador de Mídia - + Toggle the visibility of the media manager. Alternar a visibilidade do gerenciador de mídia. - + &Theme Manager &Gerenciador de Tema - + Toggle Theme Manager Alternar para Gerenciamento de Tema - + Toggle the visibility of the theme manager. Alternar a visibilidade do gerenciador de tema. - + &Service Manager Gerenciador de &Culto - + Toggle Service Manager Alternar o Gerenciador de Culto - + Toggle the visibility of the service manager. Alternar visibilidade do gerenciador de culto. - + &Preview Panel &Painel de Pré-Visualização - + Toggle Preview Panel Alternar o Painel de Pré-Visualização - + Toggle the visibility of the preview panel. Alternar a visibilidade do painel de pré-visualização. - + &Live Panel &Painel de Projeção - + Toggle Live Panel Alternar Painel da Projeção - + Toggle the visibility of the live panel. Alternar a visibilidade do painel de projeção. - + &Plugin List &Lista de Plugins - + List the Plugins Listar os Plugins - + &User Guide &Guia do Usuário - + &About &Sobre - + More information about OpenLP Mais informações sobre o OpenLP - + &Online Help &Ajuda Online - + &Web Site &Web Site - + Use the system language, if available. Usar o idioma do sistema, caso disponível. - + Set the interface language to %s Definir o idioma da interface como %s - + Add &Tool... Adicionar &Ferramenta... - + Add an application to the list of tools. Adicionar um aplicativo à lista de ferramentas. - + &Default &Padrão - + Set the view mode back to the default. Reverter o modo de visualização ao padrão. - + &Setup &Configuração - + Set the view mode to Setup. Configurar o modo de visualização para Configuração. - + &Live &Ao Vivo - + Set the view mode to Live. Configurar o modo de visualização como Ao Vivo. - + 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/. @@ -3257,108 +3457,108 @@ Voce pode baixar a última versão em http://openlp.org/. - + OpenLP Version Updated Versão do OpenLP Atualizada - + OpenLP Main Display Blanked Tela Principal do OpenLP desativada - + The Main Display has been blanked out A Tela Principal foi desativada - + Default Theme: %s Tema padrão: %s - + English Please add the name of your language here Português do Brasil - + Configure &Shortcuts... Configurar &Atalhos... - + Close OpenLP Fechar o OpenLP - + Are you sure you want to close OpenLP? Você tem certeza de que deseja fechar o OpenLP? - + 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. - + &Autodetect &Auto detectar - + Update Theme Images Atualizar Imagens de Tema - + Update the preview images for all themes. Atualizar as imagens de pré-visualização de todos os temas. - + Print the current service. Imprimir o culto atual. - + &Recent Files Arquivos &Recentes - + L&ock Panels Tr&avar Painéis - + Prevent the panels being moved. Previne que os painéis sejam movidos. - + Re-run First Time Wizard Iniciar o Assistente de Primeira Execução novamente - + Re-run the First Time Wizard, importing songs, Bibles and themes. Iniciar o Assistente de Primeira Execução novamente importando músicas, Bíblia e temas. - + Re-run First Time Wizard? Deseja iniciar o Assistente de Primeira Execução novamente? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3367,43 +3567,43 @@ Executar o assistente novamente poderá fazer mudanças na sua configuração atual, adicionar músicas à sua base existente e mudar o seu tema padrão. - + Clear List Clear List of recent files Limpar Lista - + Clear the list of recent files. Limpar a lista de arquivos recentes. - + Configure &Formatting Tags... Configurar Etiquetas de &Formatação... - + Export OpenLP settings to a specified *.config file Exportar as configurações do OpenLP para um arquivo *.config - + Settings Configurações - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Importar as configurações do OpenLP de um arquivo *.config que foi previamente exportado neste ou em outro computador - + Import settings? Importar configurações? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3416,45 +3616,50 @@ Importar configurações incorretas pode causar problemas de execução ou que o OpenLP finalize de forma inesperada. - + Open File Abrir Arquivo - + OpenLP Export Settings Files (*.conf) Arquivo de Configurações do OpenLP (*.conf) - + Import settings Importar configurações - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. O OpenLP irá finalizar. As configurações importadas serão aplicadas na próxima execução do OpenLP. - + Export Settings File Exportar arquivo de configurações - + OpenLP Export Settings File (*.conf) Arquivo de Configurações do OpenLP (*.conf) + + + New Data Directory Error + Erro no Novo Diretório de Dados + OpenLP.Manager - + Database Error Erro no Banco de Dados - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3463,7 +3668,7 @@ Banco de dados: %s - + OpenLP cannot load your database. Database: %s @@ -3475,74 +3680,74 @@ OpenLP.MediaManagerItem - + No Items Selected Nenhum Item Selecionado - + &Add to selected Service Item &Adicionar ao Item de Ordem de Culto selecionado - + You must select one or more items to preview. Você deve selecionar um ou mais itens para pré-visualizar. - + You must select one or more items to send live. Você deve selecionar um ou mais itens para projetar. - + You must select one or more items. Você deve selecionar um ou mais itens. - + You must select an existing service item to add to. Você deve selecionar um item de culto existente ao qual adicionar. - + Invalid Service Item Item de Culto inválido - + You must select a %s service item. Você deve selecionar um item de culto %s. - + You must select one or more items to add. Você deve selecionar um ou mais itens para adicionar. - + No Search Results Nenhum Resultado de Busca - + Invalid File Type Tipo de Arquivo Inválido - + Invalid File %s. Suffix not supported Arquivo Inválido %s. Sufixo não suportado - + &Clone &Duplicar - + Duplicate files were found on import and were ignored. Arquivos duplicados foram encontrados na importação e foram ignorados. @@ -3550,12 +3755,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. tag <lyrics> ausente. - + <verse> tag is missing. tag <verse> ausente. @@ -3563,27 +3768,27 @@ OpenLP.PluginForm - + Plugin List Lista de Plugins - + Plugin Details Detalhes do Plugin - + Status: Status: - + Active Ativo - + Inactive Inativo @@ -3606,12 +3811,12 @@ OpenLP.PrintServiceDialog - + Fit Page Ajustar à Página - + Fit Width Ajustar à Largura @@ -3619,7 +3824,7 @@ OpenLP.PrintServiceForm - + Options Opções @@ -3634,47 +3839,47 @@ 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 do item de culto - + Include play length of media items Incluir duração dos itens de mídia - + Add page break before each text item Adicionar uma quebra de página antes de cada item de texto - + Service Sheet Folha de Culto @@ -3684,12 +3889,12 @@ Imprimir - + Title: Título: - + Custom Footer Text: Texto de Rodapé Customizado: @@ -3697,12 +3902,12 @@ OpenLP.ScreenList - + Screen Tela - + primary primário @@ -3710,12 +3915,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Início</strong>: %s - + <strong>Length</strong>: %s <strong>Duração</strong>: %s @@ -3723,7 +3928,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Reordenar Item de Culto @@ -3731,82 +3936,82 @@ OpenLP.ServiceManager - + Move to &top Mover para o &topo - + Move item to the top of the service. Mover item para o topo do culto. - + Move &up Mover para &cima - + Move item up one position in the service. Mover item uma posição para cima no culto. - + Move &down Mover para &baixo - + Move item down one position in the service. Mover item uma posição para baixo no culto. - + Move to &bottom Mover para o &final - + Move item to the end of the service. Mover item para o final do culto. - + &Delete From Service &Excluir do Culto - + Delete the selected item from the service. Excluir o item selecionado do culto. - + &Add New Item &Adicionar um Novo Item - + &Add to Selected Item &Adicionar ao Item Selecionado - + &Edit Item &Editar Item - + &Reorder Item &Reordenar Item - + &Notes &Anotações - + &Change Item Theme &Alterar Tema do Item @@ -3828,112 +4033,107 @@ Arquivo não é uma ordem de culto válida. - + Missing Display Handler Faltando o Manipulador de Exibição - + Your item cannot be displayed as there is no handler to display it O seu item não pode ser exibido porque não existe um manipulador para exibí-lo - + 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á ausente ou está desativado - + &Expand all &Expandir todos - + Expand all the service items. Expandir todos os itens do culto. - + &Collapse all &Recolher todos - + Collapse all the service items. Recolher todos os itens do culto. - + Open File Abrir Arquivo - + Moves the selection down the window. Move a seleção para baixo dentro da janela. - + Move up Mover para cima - + Moves the selection up the window. Move a seleção para cima dentro da janela. - + Go Live Projetar - + Send the selected item to Live. Enviar o item selecionado para a Projeção. - + &Start Time &Horário Inicial - + Show &Preview Exibir &Pré-visualização - - Show &Live - Exibir &Projeção - - - + Modified Service Culto Modificado - + The current service has been modified. Would you like to save this service? O culto atual foi modificada. Você gostaria de salvar este culto? - + Custom Service Notes: Anotações de Culto Personalizados: - + Notes: Observações: - + Playing time: Duração: - + Untitled Service Culto Sem Nome @@ -3958,17 +4158,17 @@ Arquivo corrompido - + Load an existing service. Carregar um culto existente. - + Save this service. Salvar este culto. - + Select a theme for the service. Selecionar um tema para o culto. @@ -3978,7 +4178,7 @@ Este arquivo está corrompido ou não é um arquivo de culto do OpenLP 2.0. - + Service File Missing Arquivo do Culto não encontrado @@ -4002,11 +4202,21 @@ Service copy only Somente cópia de culto + + + Error Saving File + Erro ao Salvar Arquivo + + + + There was an error saving your file. + Houve um erro ao salvar seu arquivo. + OpenLP.ServiceNoteForm - + Service Item Notes Anotações do Item de Culto @@ -4022,67 +4232,67 @@ OpenLP.ShortcutListDialog - + Action Ação - + Shortcut Atalho - + Duplicate Shortcut Atalho Repetido - + The shortcut "%s" is already assigned to another action, please use a different shortcut. O atalho "%s" já está designado para outra ação, escolha um atalho diferente. - + Alternate Alternativo - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Selecione uma ação e clique em um dos botões abaixo para iniciar a captura de um novo atalho primário ou alternativo, respectivamente. - + Default Padrão - + Custom Personalizado - + Capture shortcut. Capturar atalho. - + Restore the default shortcut of this action. Restaurar o atalho padrão desta ação. - + Restore Default Shortcuts Restaurar Atalhos Padrões - + Do you want to restore all shortcuts to their defaults? Deseja restaurar todos os atalhos ao seus padrões? - + Configure Shortcuts Configurar Atalhos @@ -4090,177 +4300,172 @@ OpenLP.SlideController - + Hide Ocultar - + Go To Ir Para - + Blank Screen Apagar Tela - + Blank to Theme Apagar e deixar o Tema - + Show Desktop Mostrar a Área de Trabalho - + Previous Service Lista Anterior - + Next Service Próxima Lista - + Escape Item Escapar Item - + Move to previous. Mover para o anterior. - + Move to next. Mover para o seguinte. - + Play Slides Exibir Slides - + Delay between slides in seconds. Espera entre slides em segundos. - + Move to live. Mover para projeção. - + Add to Service. Adicionar ao Culto. - + Edit and reload song preview. Editar e recarregar pré-visualização da música. - + Start playing media. Começar a reproduzir mídia. - + Pause audio. Pausar o áudio. - + Pause playing media. Pausar mídia sendo reproduzido. - + Stop playing media. Parar mídia sendo reproduzido. - + Video position. Posição do vídeo - + Audio Volume. Volume do Áudio. - + Go to "Verse" Ir para "Estrofe" - + Go to "Chorus" Ir para "Refrão" - + Go to "Bridge" Ir para "Ponte" - + Go to "Pre-Chorus" Ir para "Pré-Refrão" - + Go to "Intro" Ir para "Introdução" - + Go to "Ending" Ir para "Final" - + Go to "Other" Ir para "Outro" - + Previous Slide Slide Anterior - + Next Slide Slide Seguinte - + Pause Audio Interromper Som - + Background Audio Som de Fundo - - Next Track - Faixa Seguinte - - - + Go to next audio track. Ir para a próxima faixa de áudio - + Tracks Faixas @@ -4336,17 +4541,17 @@ O tempo inicial está após o fim do item de mídia - + Theme Layout Disposição do Tema - + The blue box shows the main area. A caixa azul mostra a área principal. - + The red box shows the footer. A caixa vermelha mostra o rodapé. @@ -4354,32 +4559,32 @@ OpenLP.ThemeForm - + Select Image Selecionar Imagem - + Theme Name Missing Faltando Nome do Tema - + There is no name for this theme. Please enter one. Não há nome para este tema. Por favor forneça um. - + Theme Name Invalid Nome do Tema Inválido - + Invalid theme name. Please enter one. O nome do tema é inválido. Por favor forneça um. - + (approximately %d lines per slide) (aproximadamente %d linhas por slide) @@ -4387,193 +4592,193 @@ OpenLP.ThemeManager - + Create a new theme. Criar um novo tema. - + Edit Theme Editar Tema - + Edit a theme. Editar um tema. - + Delete Theme Excluir Tema - + Delete a theme. Excluir um tema. - + Import Theme Importar Tema - + Import a theme. Importar um tema. - + Export Theme Exportar Tema - + Export a theme. Exportar um tema. - + &Edit Theme &Editar Tema - + &Delete Theme &Apagar Tema - + Set As &Global Default 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. - + Theme %s is used in the %s plugin. O tema %s é usado no plugin %s. - + 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. O arquivo não é um tema válido. - + &Copy Theme &Copiar Tema - + &Rename Theme &Renomear Tema - + &Export Theme &Exportar Tema - + You must select a theme to rename. Você precisa selecionar um tema para renomear. - + Rename Confirmation Confirmar Renomeação - + Rename %s theme? Renomear o tema %s? - + You must select a theme to delete. Você precisa selecionar um tema para excluir. - + Delete Confirmation 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) - + Copy of %s Copy of <theme name> Cópia do %s - + Theme Already Exists Tema Já Existe @@ -4581,272 +4786,272 @@ OpenLP.ThemeWizard - + Theme Wizard Assistente de Tema - + Welcome to the Theme Wizard Bem-vindo ao Assistente de Tema - + Set Up Background Configurar Plano de Fundo - + Set up your theme's background according to the parameters below. Configure o plano de fundo de seu tema de acordo com os parâmetros abaixo. - + Background type: Tipo de plano de fundo: - + Solid Color Cor Sólida - + Gradient Degradê - + Color: Cor: - + Gradient: Degradê: - + Horizontal Horizontal - + Vertical Vertical - + Circular Circular - + Top Left - Bottom Right Esquerda Superior - Direita Inferior - + Bottom Left - Top Right Esquerda Inferior - Direita Superior - + Main Area Font Details Detalhes da Fonte da Área Principal - + Define the font and display characteristics for the Display text Definir a fonte e características de exibição para o texto de Exibição - + Font: Fonte: - + Size: Tamanho: - + Line Spacing: Espaçamento entre linhas: - + &Outline: &Contorno: - + &Shadow: &Sombra: - + Bold Negrito - + Italic Itálico - + Footer Area Font Details Detalhes de Fonte da Área de Rodapé - + Define the font and display characteristics for the Footer text Defina a fone e as características de exibição do texto de Rodapé - + Text Formatting Details Detalhes da Formatação de Texto - + Allows additional display formatting information to be defined Permite que informações adicionais de formatações de exibição sejam definidas - + Horizontal Align: Alinhamento Horizontal: - + Left Esquerda - + Right Direita - + Center Centralizado - + Output Area Locations Posições das Áreas de Saída - + Allows you to change and move the main and footer areas. Permite modificar e mover as áreas principal e de rodapé. - + &Main Area &Área Principal - + &Use default location &Usar posição padrão - + X position: Posição X: - + px px - + Y position: Posição Y: - + Width: Largura: - + Height: Altura: - + Use default location Usar posição padrão - + Save and Preview Salvar e pré-visualizar - + View the theme and save it replacing the current one or change the name to create a new theme Visualizar o tema e salvá-lo, substituindo o atual ou mudar o nome para criar um novo tema - + Theme name: Nome do tema: - + Edit Theme - %s Editar Tema - %s - + 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. Este assistente vai ajudá-lo a criar e editar seus temas. Clique no botão avançar abaixo para iniciar o processo, configurando seu plano de fundo. - + Transitions: Transições: - + &Footer Area Área do &Rodapé - + Starting color: Cor inicial: - + Ending color: Cor final: - + Background color: Cor do Plano de Fundo: - + Justify Justificar - + Layout Preview Previsualizar a Disposição - + Transparent Transparente @@ -4854,47 +5059,47 @@ OpenLP.ThemesTab - + Global Theme Tema Global - + Theme Level Nível do Tema - + S&ong Level Nível de &Música - + 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 a ela, então usar o tema do culto. Se o culto não tiver um tema, então usar o tema global. - + &Service Level Nível de &Culto - + 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. Usar o tema do culto, ignorando qualquer temas das músicas individuais. Se o culto não tiver um tema, então usar o tema global. - + &Global Level Nível &Global - + Use the global theme, overriding any themes associated with either the service or the songs. Usar o tema global, ignorando qualquer tema associado ao culto ou às músicas. - + Themes Temas @@ -4978,239 +5183,239 @@ pt - + Image Imagem - + Import Importar - + Live Projeção - + Live Background Error Erro no Fundo da Projeção - + Load Carregar - + Middle Meio - + New Novo - + New Service Novo Culto - + New Theme 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 - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Pré-Visualização - + Replace Background Substituir Plano de Fundo - + Reset Background Restabelecer o Plano de Fundo - + s The abbreviated unit for seconds s - + Save && Preview Salvar && Pré-Visualizar - + Search Pesquisar - + You must select an item to delete. Você precisa selecionar um item para excluir. - + You must select an item to edit. Você precisa selecionar um item para editar. - + Save Service Salvar Culto - + Service Culto - + Start %s Início %s - + Theme Singular Tema - + Themes Plural Temas - + Top Topo - + Version Versão - + Delete the selected item. Excluir o item selecionado. - + Move selection up one position. 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. - + &Vertical Align: Alinhamento &Vertical: - + Finished import. Importação concluída. - + Format: Formato: - + Importing Importando - + Importing "%s"... Importando "%s"... - + Select Import Source 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ê precisará instalar o módulo "python-sqlite". - + Open %s File Abrir o Arquivo %s - + %p% %p% - + Ready. Pronto. - + Starting import... 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. @@ -5226,7 +5431,7 @@ 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 @@ -5314,53 +5519,53 @@ h - + Layout style: Estilo do Layout: - + Live Toolbar Barra de Ferramentas de Projeção - + m The abbreviated unit for minutes m - + OpenLP is already running. Do you wish to continue? OpenLP já está sendo executado. Deseja continuar? - + Settings Configurações - + Tools Ferramentas - + Unsupported File Arquivo Não Suportado - + Verse Per Slide Versículos por Slide - + Verse Per Line Versículos por Linha - + View Visualizar @@ -5375,42 +5580,37 @@ Erro de sintaxe XML - + View Mode Modo de Visualização - + Open service. Abrir culto. - + Print Service Imprimir Culto - + Replace live background. Trocar fundo da projeção. - + Reset live background. Reverter fundo da projeção. - - &Split - &Dividir - - - + Split a slide into two only if it does not fit on the screen as one slide. Dividir um slide em dois somente se não couber na tela em um único slide. - + Welcome to the Bible Upgrade Wizard Bem-vindo ao Assistente de Atualização de Bíblias @@ -5420,53 +5620,105 @@ Confirmar Exclusão - + Play Slides in Loop Exibir Slides com Repetição - + Play Slides to End Exibir Slides até o Fim - + Stop Play Slides in Loop Parar Slides com Repetição - + Stop Play Slides to End Parar Slides até o Final - + Next Track Faixa Seguinte + + + Search Themes... + Search bar place holder text + Pesquisar temas... + + + + Optional &Split + Divisão Opcional + + + + Invalid Folder Selected + Singular + Diretório Inválido Selecionado + + + + Invalid File Selected + Singular + Arquivo Inválido Selecionado + + + + Invalid Files Selected + Plural + Arquivos Inválidos Selecionados + + + + No Folder Selected + Singular + Nenhum Diretório Selecionado + + + + Open %s Folder + Abrir Diretório %s + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + Você precisa especificar um arquivo %s de onde importar. + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + Você precisa especificar um diretório %s de onde importar. + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 e %2 - + %1, and %2 Locale list separator: end %1, e %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5475,50 +5727,50 @@ PresentationPlugin - + <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 permite exibir apresentações utilizando vários programas diferentes. Os programas disponíveis são exibidos em uma caixa de seleção. - + Presentation name singular Apresentação - + Presentations name plural Apresentações - + Presentations container title Apresentações - + Load a new presentation. Carregar uma nova apresentação. - + Delete the selected presentation. Excluir a apresentação selecionada. - + Preview the selected presentation. Pré-visualizar a apresentação selecionada. - + Send the selected presentation live. Enviar a apresentação selecionada para a projeção. - + Add the selected presentation to the service. Adicionar a apresentação selecionada ao culto. @@ -5526,70 +5778,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Selecionar Apresentação(ões) - + Automatic Automático - + Present using: Apresentar usando: - + File Exists O Arquivo já Existe - + A presentation with that filename already exists. Já existe uma apresentação com este nome. - + This type of presentation is not supported. Este tipo de apresentação não é suportado. - + Presentations (%s) Apresentações (%s) - + Missing Presentation Apresentação Não Encontrada - - The Presentation %s no longer exists. - A Apresentação %s não existe mais. + + The presentation %s is incomplete, please reload. + A apresentação %s está incompleta, por favor recarregue. - - The Presentation %s is incomplete, please reload. - A Apresentação %s está incompleta, por favor recarregue-a. + + The presentation %s no longer exists. + A apresentação %s já não existe mais. PresentationPlugin.PresentationTab - + Available Controllers Controladores Disponíveis - + %s (unavailable) %s (indisponivel) - + Allow presentation application to be overridden Permitir que o aplicativo de apresentações seja alterado @@ -5623,135 +5875,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 Remoto - + OpenLP 2.0 Stage View OpenLP 2.0 Visão de Palco - + Service Manager Gerenciador de Culto - + Slide Controller Controlador de Slide - + Alerts Alertas - + Search Pesquisar - - Back - Voltar - - - + Refresh Atualizar - + Blank Desativar - + Show Exibir - + Prev Ant - + Next Seg - + Text Texto - + Show Alert Mostrar Alerta - + Go Live Projetar - + No Results Nenhum Resultado - + Options Opções - + Add to Service Adicionar ao Culto + + + Home + Home + + + + Theme + Tema + + + + Desktop + Área de Trabalho + + + + Add &amp; Go to Service + Adicionar ao Culto + RemotePlugin.RemoteTab - + Serve on IP address: Endereço IP do servidor: - + Port number: Número de porta: - + Server Settings Configurações do Servidor - + Remote URL: URL Remoto: - + Stage view URL: URL de Visualização de Palco: - + Display stage time in 12h format Exibir hora de palco no formato 12h - + Android App Aplicativo Android - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Scaneia o código QR ou clique <a href="https://market.android.com/details?id=org.openlp.android">download</a> para instalar o aplicativo Android a partir do Market. @@ -5759,85 +6026,85 @@ SongUsagePlugin - + &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 UsoDaMúsica - + SongUsage container title Uso das Músicas - + Song Usage Uso das Músicas - + Song usage tracking is active. Registro de uso das Músicas está ativado. - + Song usage tracking is inactive. Registro de uso das Músicas está desativado. - + display exibir - + printed impresso @@ -5845,7 +6112,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Excluir Dados de Registro das Músicas @@ -5870,7 +6137,7 @@ Todos os dados solicitados foram apagados com sucesso. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Selecione uma data limite para que os dados de uso de músicas seja excluído. Todos os registros antes desta data será excluídos permanentemente. @@ -5878,42 +6145,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Extração de Uso das Músicas - + Select Date Range Selecionar Faixa de Datas - + to até - + Report Location Localização do Relatório - + Output File Location Local do arquivo de saída - + usage_detail_%s_%s.txt detalhe_uso_%s_%s.txt - + Report Creation Criação de Relatório - + Report %s has been successfully created. @@ -5922,12 +6189,12 @@ foi criado com sucesso. - + Output Path Not Selected Caminho de saída não foi selecionado - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. Você precisa selecionar uma localização de sapida válida para o relatório de uso de músicas. Por favor selecione um caminho existente no seu computador. @@ -5965,82 +6232,82 @@ Reindexando músicas... - + Arabic (CP-1256) Arábico (CP-1256) - + Baltic (CP-1257) Báltico (CP-1257) - + Central European (CP-1250) Europeu Central (CP-1250) - + Cyrillic (CP-1251) Cirílico (CP-1251) - + Greek (CP-1253) Grego (CP-1253) - + Hebrew (CP-1255) Hebraico (CP-1255) - + Japanese (CP-932) Japonês (CP-932) - + Korean (CP-949) Coreano (CP-949) - + Simplified Chinese (CP-936) Chinês Simplificado (CP-936) - + Thai (CP-874) Tailandês (CP-874) - + Traditional Chinese (CP-950) Chinês Tradicional (CP-950) - + Turkish (CP-1254) Turco (CP-1254) - + Vietnam (CP-1258) Vietnamita (CP-1258) - + Western European (CP-1252) Europeu Ocidental (CP-1252) - + Character Encoding Codificação de Caracteres - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6049,26 +6316,26 @@ Normalmente pode usar a opção pré-selecionada. - + Please choose the character encoding. The encoding is responsible for the correct character representation. Escolha a codificação dos caracteres. A codificação é responsável pela correta representação dos caracteres. - + Song name singular Música - + Songs name plural Músicas - + Songs container title Músicas @@ -6079,32 +6346,32 @@ Exporta músicas utilizando o assistente de exportação. - + Add a new song. Adicionar uma nova música. - + Edit the selected song. Editar a música selecionada. - + Delete the selected song. Excluir a música selecionada. - + Preview the selected song. Pré-visualizar a música selecionada. - + Send the selected song live. Enviar a música selecionada para a projeção. - + Add the selected song to the service. Adicionar a música selecionada ao culto. @@ -6132,17 +6399,17 @@ Sobrenome: - + You need to type in the first name of the author. Você precisa digitar o primeiro nome do autor. - + You need to type in the last name of the author. Você precisa digitar o sobrenome do autor. - + 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? @@ -6173,209 +6440,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Metadados + + + + Custom Book Names + Nomes de Livros Personalizados + + + SongsPlugin.EditSongForm - + Song Editor Editor de Músicas - + &Title: &Título: - + Alt&ernate title: Título &Alternativo: - + &Lyrics: &Letra: - + &Verse order: Ordem das &estrofes: - + Ed&it All &Editar Todos - + Title && Lyrics Título && Letra - + &Add to Song &Adicionar à Música - + &Remove &Remover - + &Manage Authors, Topics, Song Books &Gerenciar Autores, Assuntos, Hinários - + A&dd to Song A&dicionar uma Música - + R&emove R&emover - + Book: Hinário: - + Number: Número: - + Authors, Topics && Song Book Autores, Assuntos && Hinários - + New &Theme Novo &Tema - + Copyright Information Direitos Autorais - + Comments Comentários - + Theme, Copyright Info && Comments Tema, Direitos Autorais && Comentários - + Add Author Adicionar Autor - + This author does not exist, do you want to add them? Este autor não existe, deseja adicioná-lo? - + This author is already in the list. Este autor já está na lista. - + 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 lista, ou digite um novo autor e clique em "Adicionar Autor à Música" para adicioná-lo. - + Add Topic Adicionar Assunto - + This topic does not exist, do you want to add it? Este assunto não existe, deseja adicioná-lo? - + This topic is already in the list. Este assunto já está na lista. - + 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. Você não selecionou um assunto válido. Selecione um assunto da lista ou digite um novo assunto e clique em "Adicionar Assunto à Música" para adicioná-lo. - + You need to type in a song title. Você deve digitar um título para a música. - + You need to type in at least one verse. Você deve digitar ao menos um verso. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. A ordem das estrofes é inválida. Não há estrofe correspondente a %s. Valores válidos são %s. - + Add Book Adicionar Hinário - + This song book does not exist, do you want to add it? Este hinário não existe, deseja adicioná-lo? - + You need to have an author for this song. Você precisa ter um autor para esta música. - + You need to type some text in to the verse. Você precisa digitar algum texto na estrofe. - + Linked Audio Áudio Ligado - + Add &File(s) Adicionar &Arquivo(s) - + Add &Media Adicionar &Mídia - + Remove &All Excluir &Todos - + Open File(s) Abrir Arquivo(s) - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Aviso:</strong> Nem todos os versos estão em uso. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. A ordem dos versos está inválido. Não há versos correspondentes a %s. Entradas válidas são %s. @@ -6489,130 +6769,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Selecione Arquivos de Documentos/Apresentações - + Song Import Wizard Assistente de Importação de Música - + 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. Este assistente irá ajudá-lo a importar músicas de uma variedade de formatos. Clique no abaixo no botão Próximo para iniciar o processo, escolhendo um desses formatos. - + Generic Document/Presentation Documento/Apresentação Genérica - - Filename: - Nome do arquivo: - - - - 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. - - - + Add Files... Adicionar Arquivos... - + Remove File(s) Remover Arquivos(s) - + Please wait while your songs are imported. Por favor espere enquanto as suas músicas são importadas. - + OpenLP 2.0 Databases Bancos de Dados do OpenLP 2.0 - + openlp.org v1.x Databases Bancos de Dados do openlp.org v1.x - + Words Of Worship Song Files Arquivos de Música do Words Of Worship - - 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 - + Copy Copiar - + Save to File Salvar em Arquivo - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. A importação Songs of Fellowship foi desabilitada porque OpenLP não consegue acessar OpenOffice ou LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. A importação de documentos/apresentações genéricos foi desabilitada porque OpenLP não consegue acessar OpenOffice ou LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song Música Exportada OpenLyrics ou OpenLP 2.0 - + OpenLyrics Files Arquivos OpenLyrics + + + CCLI SongSelect Files + Arquivos CCLI + + + + EasySlides XML File + Arquivo XML EasySlides + + + + EasyWorship Song Database + Músicas EasyWorship + + + + DreamBeam Song Files + Arquivos de Música DreamBeam + + + + You need to specify a valid PowerSong 1.0 database folder. + Você precisa especificar um diretório válido de banco de dados do PowerSong 1.0. + + + + ZionWorx (CSV) + ZionWorx (CSV) + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + Primeiro converta o seu banco de dados do ZionWorx, como explicado no <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">Manual do Usuário</a> + SongsPlugin.MediaFilesForm - + Select Media File(s) Selecionar Arquivo(s) de Mídia - + Select one or more audio files from the list below, and click OK to import them into this song. Selecione um ou mais arquivos de áudio da lista abaixo. Clique OK para importá-los à esta música. @@ -6620,27 +6920,27 @@ SongsPlugin.MediaItem - + Titles Títulos - + Lyrics Letras - + CCLI License: Licença CCLI: - + Entire Song Música Inteira - + Are you sure you want to delete the %n selected song(s)? Tem certeza de que deseja excluir a(s) %n música(s) selecionada(s)? @@ -6648,16 +6948,41 @@ - + Maintain the lists of authors, topics and books. Gerencia a lista de autores, tópicos e hinários. - + copy For song cloning copiar + + + Search Titles... + Pesquisar títulos... + + + + Search Entire Song... + Música Inteira + + + + Search Lyrics... + Pesquisar letras... + + + + Search Authors... + Pesquisar autores... + + + + Search Song Books... + Pesquisar hinos... + SongsPlugin.OpenLP1SongImport @@ -6684,6 +7009,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + Nenhuma música para importar. + + + + Verses not found. Missing "PART" header. + Os versículos não foram encontrados. O cabeçalho "PART" está faltando. + + + SongsPlugin.SongBookForm @@ -6722,12 +7060,12 @@ SongsPlugin.SongImport - + copyright copyright - + The following songs could not be imported: As seguintes músicas não puderam ser importadas: @@ -6748,117 +7086,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Sua importação de música falhou. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Não foi possível adicionar seu autor. - + This author already exists. Este autor já existe. - + Could not add your topic. Não foi possível adicionar seu assunto. - + This topic already exists. Este assunto já existe. - + Could not add your book. Não foi possível adicionar seu livro. - + This book already exists. Este livro já existe. - + Could not save your changes. Não foi possível salvar suas alterações. - + Could not save your modified author, because the author already exists. Não foi possível salvar sue autor modificado, pois o autor já existe. - + Could not save your modified topic, because it already exists. O assunto modificado não pode ser salvo porque já existe. - + Delete Author Excluir Autor - + Are you sure you want to delete the selected author? Você tem certeza de que deseja excluir o autor selecionado? - + This author cannot be deleted, they are currently assigned to at least one song. Este autor não pode ser apagado, pois está associado a pelo menos uma música. - + Delete Topic Excluir Assunto - + Are you sure you want to delete the selected topic? Tem certeza de que quer apagar o assunto selecionado? - + This topic cannot be deleted, it is currently assigned to at least one song. Este assunto não pode ser apagado, pois está associado a pelo menos uma música. - + Delete Book Excluir Hinário - + Are you sure you want to delete the selected book? 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 excluido, pois está associado a ao menos uma música. - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? O autor %s já existe. Deseja que as músicas com o autor %s usem o autor %s existente? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? O assunto %s já existe. Deseja que as músicas com o assunto %s usem o assunto %s existente? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? O hinário %s já existe. Deseja que as músicas com o hinário %s usem o hinário %s existente? @@ -6866,29 +7196,29 @@ SongsPlugin.SongsTab - + Songs Mode Modo de Música - + Enable search as you type Habilitar busca ao digitar - + Display verses on live tool bar Exibir versículos na barra de ferramentas de projeção - + Update service from song edit Atualizar culto após editar música - - Add missing songs when opening service - Adicionar músicas ausentes ao abrir culto + + Import missing songs from service files + Importar músicas de arquivos de culto @@ -6947,4 +7277,17 @@ Outra + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Erro ao ler o arquivo CSV. + + + + File not valid ZionWorx CSV format. + O arquivo não é um arquivo CSV válido do ZionWorx. + + diff -Nru openlp-1.9.9/resources/i18n/ru.ts openlp-1.9.10/resources/i18n/ru.ts --- openlp-1.9.9/resources/i18n/ru.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/ru.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert О&повещение - + Show an alert message. Показать текст оповещения. - + Alert name singular Оповещение - + Alerts name plural Оповещения - + Alerts container title Оповещения - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Плагин оповещений</strong><br />Плагин оповещений контролирует отображения срочной информации на экране. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Сообщение оповещения - + Alert &text: Текст &оповещения: - + &New &Новый - + &Save &Сохранить - + Displ&ay Показ&ать - + Display && Cl&ose Показать и за&крыть @@ -79,7 +79,7 @@ Ві не указали текста для вашего оповещения. Пожалуйста введите текст. - + &Parameter: П&араметр: @@ -118,32 +118,32 @@ AlertsPlugin.AlertsTab - + Font Шрифт - + Font name: Шрифт: - + Font color: Цвет: - + Background color: Цвет фона: - + Font size: Размер: - + Alert timeout: Таймаут оповещения: @@ -151,551 +151,596 @@ BiblesPlugin - + &Bible &Библия - + Bible name singular Библия - + Bibles name plural Священное Писание - + Bibles container title Священное Писание - + No Book Found Книги не найдены - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Не было найдено подходящей книги в этой Библии. Проверьте что вы правильно указали название книги. - + Import a Bible. Импортировать Библию. - + Add a new Bible. Добавить Библию. - + Edit the selected Bible. Изменить выбранную Библию. - + Delete the selected Bible. Удалить выбранную Библию. - + Preview the selected Bible. Просмотреть выбранную Библию. - + Send the selected Bible live. Показать выбранную Библию на экране. - + Add the selected Bible to the service. Добавить выбранную Библию к порядку служения. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Плагин Библии</strong><br />Плагин Библии обеспечивает возможность показывать отрывки Писания во время служения. - + &Upgrade older Bibles &Обновить старые Библии - + Upgrade the Bible databases to the latest format. Обновить формат базы данных для хранения Библии. - + Genesis - + Exodus - + Leviticus - + Numbers - + Deuteronomy - + Joshua - + Judges - + Ruth - + 1 Samuel - + 2 Samuel - + 1 Kings - + 2 Kings - + 1 Chronicles - + 2 Chronicles - + Ezra - + Nehemiah - + Esther - + Job - + Psalms - + Proverbs - + Ecclesiastes - + Song of Solomon - + Isaiah - + Jeremiah - + Lamentations - + Ezekiel - + Daniel - + Hosea - + Joel - + Amos - + Obadiah - + Jonah - + Micah - + Nahum - + Habakkuk - + Zephaniah - + Haggai - + Zechariah - + Malachi - + Matthew - + Mark - + Luke - + John - + Acts - + Romans - + 1 Corinthians - + 2 Corinthians - + Galatians - + Ephesians - + Philippians - + Colossians - + 1 Thessalonians - + 2 Thessalonians - + 1 Timothy - + 2 Timothy - + Titus - + Philemon - + Hebrews - + James - + 1 Peter - + 2 Peter - + 1 John - + 2 John - + 3 John - + Jude - + Revelation - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Вам необходимо указать название перевода Библии. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Вам необходимо указать авторские права Библии. Переводы Библии находящиеся в свободном доступе должны быть помечены как таковые. + + + + Bible Exists + Библия существует + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Библия уже существует. Выполните импорт другой Библии или удалите существующую. + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error Ошибка ссылки на Писание - + Web Bible cannot be used Веб-Библия не может быть использована - + Text Search is not available with Web Bibles. Текстовый поиск не доступен для Веб-Библий. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Вы не указали ключевое слово для поиска. Вы можете разделить разичные ключевые слова пробелами чтобы осуществить поиск по фразе, а также можете использовать запятые, чтобы искать по каждому из указанных ключевых слов. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. В настоящее время ни одна Библия не установлена. Пожалуйста, воспользуйтесь Мастером Импорта чтобы установить одну Библию или более. - + No Bibles Available Библии отсутствуют - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -711,187 +756,179 @@ BiblesPlugin.BiblesTab - + Verse Display Отображение стихов - + Only show new chapter numbers Показывать только номера новых глав - + Bible theme: Тема для отображения Библии - + No Brackets Без скобок - + ( And ) ( XXX ) - + { And } { XXX } - + [ And ] [ XXX ] - + Note: Changes do not affect verses already in the service. Обратите внимание: Изменения не повлияют на стихи в порядке служения. - + Display second Bible verses Показать альтернативный перевод - + Custom Scripture References - + Verse Separator: - + Range Separator: - + List Separator: - + End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - + + English + Русский - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + Default Bible Language - - Bible language + + Book name language in search field, +search results and on display: - - Application language + + Bible Language - - English - Русский - - - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language BiblesPlugin.BookNameDialog - + Select Book Name Выберите название книги - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Книге не было найдено внутренне соответствие. Пожалуйста, выберите соответствующее английское название из списка. - - - + Current name: Текущее название: - + Corresponding name: Соответствующее имя: - + Show Books From Показать книги из - + Old Testament Ветхий Завет - + New Testament Новый Завет - + Apocrypha Апокрифы + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. Вы должны выбрать книгу. @@ -916,40 +953,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + Детали лицензии + + + + Version name: + Название версии: + + + + Copyright: + Авторские права: + + + + Permissions: + Разрешения: + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + Русский + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Регистрация Библии и загрузка книг... - + Registering Language... Регистрация языка... - + Importing %s... Importing <book name>... Импорт %s... - + Download Error - + 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. Возникла проблема при загрузке секции стихов. Пожалуйста, проверьте параметры Интернет соединения, и случае если ошибка происходит при нормальном Интернет соединении, сообщите о ней на сайте разработчика в разделе Ошибки. - + Parse Error Ошибка обработки - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. @@ -1127,17 +1233,17 @@ BiblesPlugin.LanguageDialog - + Select Language Выбор языка - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP не удалось определить язык этого перевода Библии. Укажите язык перевод из списка. - + Language: Язык: @@ -1153,85 +1259,100 @@ BiblesPlugin.MediaItem - + Quick Быстрый - + Find: Поиск: - + Book: Книга: - + Chapter: Глава: - + Verse: Стих: - + From: От: - + To: До: - + Text Search Поиск текста: - + Second: Альтернативный: - + Scripture Reference Ссылка на Писание - + Toggle to keep or clear the previous results. Переключать сохранения или очистки результатов. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. - + Information Информация - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. Альтернативный перевод Библии не содержит всех стихов, которые требует основной перевод. Будут показаны только те стихи, которые найдены в обеих вариантах перевод. %d стихов не будут включены в результаты. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Импортирую %s %s... @@ -1240,12 +1361,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... Определение кодировки (это может занять несколько минут)... - + Importing %s %s... Importing <book name> <chapter>... Импортирую %s %s... @@ -1254,149 +1375,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Выберите папку для резервной копии - + Bible Upgrade Wizard Мастер обновления Библии - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Этот мастер поможет вам обновить существующие Библии с предыдущих версий OpenLP 2. Нажмите кнопку далее чтобы начать процесс обновления. - + Select Backup Directory Выберите папку для резервной копии - + Please select a backup directory for your Bibles Выберите папку для резервной копии ваших Библий - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Предыдущий релиз OpenLP 2.0 не может использовать обновленные Библии. Мы создаем резервную копию ваших Библий для того, чтобы вы могли просто скопировать файлы данных в папку данных OpenLP если у вас возникнет необходимость вернуться на предыдущую версию OpenLP. Инструкции о том, как восстановить файлы могут быть найдены на сайте <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. Пожалуйста, укажите расположение резервной копии ваших Библий. - + Backup Directory: Директория резервной копии: - + There is no need to backup my Bibles Выполнять резервное копирование Библий нет необходимости - + Select Bibles Выберите Библии - + Please select the Bibles to upgrade Выберите Библии для обновления - + Upgrading Обновление - + Please wait while your Bibles are upgraded. Пожалуйста, подождите пока выполнится обновление Библий. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. Не удалось создать резервную копию. Для создания резервной копии ваших Библий вы должны обладать правами записи в указанную директорию. - + Upgrading Bible %s of %s: "%s" Failed Обновление Библий %s из %s: "%s" Провалилось - + Upgrading Bible %s of %s: "%s" Upgrading ... Обновление Библий %s из %s: "%s" Обновление ... - + Download Error - + To upgrade your Web Bibles an Internet connection is required. Для выполнения обновления сетевых Библий необходимо наличие интернет соединения. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Обновление Библий %s из %s: "%s" Обновление %s ... - + Upgrading Bible %s of %s: "%s" Complete Обновление Библий %s из %s: "%s" Завершено - + , %s failed , %s провалилось - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Обновление Библии(й): %s успешно %s Пожалуйста, помните, что стихи сетевых Библий загружаются по требованию, поэтому необходимо наличие интернет соединения. - + Upgrading Bible(s): %s successful%s Обновление Библии(ий): %s успешно%s - + Upgrade failed. Обновление провалилось. - + You need to specify a backup directory for your Bibles. Необходимо указать директорию резервного копирования ваших Библий. - + Starting upgrade... Начинаю обновление... - + There are no Bibles that need to be upgraded. Нет Библий, которым необходимо обновление. @@ -1470,12 +1591,12 @@ CustomPlugin.CustomTab - + Custom Display Отображение - + Display footer @@ -1483,42 +1604,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Редактор специальных слайдов - + &Title: &Заголовок: - + Add a new slide at bottom. Добавить новый слайд вверх. - + Edit the selected slide. Изменить выбранный слайд. - + Edit all the slides at once. Редактировать все слайды сразу. - + Split a slide into two by inserting a slide splitter. Разделить слайд, добавив к нему разделитель. - + The&me: Те&ма: - + &Credits: &Подпись: @@ -1533,12 +1654,12 @@ Необходимо добавить как минимум один слайд - + Ed&it All Редактировать &все - + Insert Slide Вставить слайд @@ -1546,7 +1667,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1558,60 +1679,60 @@ ImagePlugin - + <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 />Одной из отличительных возможностей этого плагина является возможность группировать выбранные изображение в менеджере служения, что делает работу с большим количеством изображений более легкой. Этот плагин также позволяет использовать возможности "временной петли" OpenLP, чтобы создавать слайд-шоу, которые выполняются автоматически. В дополнение к этому, изображения из плагина могут быть использованы, чтобы заменить текущий фон, что позволяет отображать текстовые элементы, такие как песни, с выбранным изображением в качестве фона, вместо фона, который указан в теме. - + Image name singular Изображение - + Images name plural Изображения - + Images container title Изображения - + Load a new image. Загрузить новое изображение. - + Add a new image. Добавить новое изображение - + Edit the selected image. Изменить выбранное изображение. - + Delete the selected image. Удалить выбранное изображение. - + Preview the selected image. Просмотреть выбранное изображение. - + Send the selected image live. Отправить выбранное изображение на проектор. - + Add the selected image to the service. Добавить выбранное изображение к служению. @@ -1619,7 +1740,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Выбрать Вложение @@ -1627,44 +1748,44 @@ ImagePlugin.MediaItem - + Select Image(s) Выбрать Изображение(я) - + You must select an image to delete. Вы должны выбрать изображение для удаления. - + You must select an image to replace the background with. Вы должны выбрать изображение, которым следует заменить фон. - + Missing Image(s) Отсутствует изображение(я) - + The following image(s) no longer exist: %s Следующие изображения больше не существуют: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? Следующих изображений больше не существуют: %s Добавить остальные изображения? - + There was a problem replacing your background, the image file "%s" no longer exists. Возникла проблема при замене Фона проектора, файл "%s" больше не существует. - + There was no display item to amend. Отсутствует объект для изменений. @@ -1672,78 +1793,78 @@ ImagesPlugin.ImageTab - + Background Color - + Default Color: - - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Плагин Мультимедиа</strong><br />Плагин Мультимедиа обеспечивает проигрывание аудио и видео файлов. - + Media name singular Медиа - + Media name plural Медиа - + Media container title Мультимедиа - + Load new media. Загрузить новый объект мультимедиа. - + Add new media. Добавить новый объект мультимедиа. - + Edit the selected media. Изменить выбранный объект мультимедиа. - + Delete the selected media. Удалить выбранный мультимедиа объект. - + Preview the selected media. Просмотреть выбранный объект мультимедиа. - + Send the selected media live. Отправить выбранный объект мультимедиа на проектор. - + Add the selected media to the service. Добавить выбранный объект к порядку служения. @@ -1791,7 +1912,7 @@ Отсутствует объект для изменений. - + Unsupported File @@ -1809,22 +1930,22 @@ MediaPlugin.MediaTab - + Available Media Players - + %s (unavailable) - + Player Order - + Allow media player to be overridden @@ -1832,7 +1953,7 @@ OpenLP - + Image Files Файлы изображений @@ -1854,17 +1975,17 @@ OpenLP.AboutForm - + Credits Разрешения - + License Лицензия - + Contribute Вклад @@ -1874,17 +1995,17 @@ билд %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. Это программа является свободным программным обеспечением; вы можете свободно распространять ее и/или изменять в рамках 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 @@ -2009,7 +2130,7 @@ Он освободил нас, не требуя платы. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2026,7 +2147,7 @@ OpenLP написано и поддерживается добровольцами. Если вы хотите видеть больше свободного ПО, написанного христианами, пожалуйста, подумайте о том, чтобы поддержать нас, используя кнопку ниже. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s @@ -2035,87 +2156,87 @@ OpenLP.AdvancedTab - + UI Settings Настройки интерфейса - + Number of recent files to display: Количество недавних файлов: - + Remember active media manager tab on startup Запоминать активную вкладу при запуске - + Double-click to send items straight to live Использовать двойной щелчок для запуска на проектор - + Expand new service items on creation Разворачивать новый объект служения - + Enable application exit confirmation Разрешить подтверждения при выходе - + Mouse Cursor Курсор мыши - + Hide mouse cursor when over display window Прятать курсор мыши когда он над окном показа - + Default Image Изображение по умолчанию - + Background color: Цвет фона: - + Image file: Файл изображения: - + Open File Открыть файл - + Advanced Расширенные настройки - + Preview items when clicked in Media Manager Просматривать объекты по клику в Менеджере мультимедиа - + Click to select a color. Выберите цвет - + Browse for an image file to display. Укажите файл для показа - + Revert to the default OpenLP logo. Возврат к логотипу OpenLP @@ -2127,137 +2248,219 @@ - + Default Service Name - + Enable default service name - + Date and Time: - + Monday - + Tuesday - + Wednesday - + Thurdsday - + Friday - + Saturday - + Sunday - + Now - + Time when usual service starts. - + Name: - + Consult the OpenLP manual for usage. - + Revert to the default service name "%s". - + Example: - + X11 - + Bypass X11 Window Manager - + Syntax error. + + + Data Location + + + + + Current path: + + + + + Custom path: + + + + + Browse for new data file location. + + + + + Set the data location to the default. + + + + + Cancel + Отмена + + + + Cancel OpenLP data directory location change. + + + + + Copy data to new location. + + + + + Copy the OpenLP data files to the new location. + + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + + + + + Data Directory Error + + + + + Select Data Directory Location + + + + + Confirm Data Directory Change + + + + + Reset Data Directory + + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + + + + + Overwrite Existing Data + + OpenLP.ExceptionDialog - + Error Occurred Произошла ошибка. - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Ой! OpenLP столкнулся с ошибкой и не смог обработать ее. Текст ниже содержит информацию, которая может быть полезна разработчикам продукта, поэтому, пожалуйста, отправьте ее на bugs@openlp.org, добавив к этому письму детальное описание того, что вы делали в то время, когда возникла ошибка. - + Send E-Mail Послать e-mail - + Save to File Сохранить в файл - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Пожалуйста, опишите сценарий возникновения ошибки (Минимум 20 символов) - + Attach File Добавить файл - + Description characters to enter : %s Символы описания: %s @@ -2265,24 +2468,24 @@ OpenLP.ExceptionForm - + Platform: %s Платформа: %s - + Save Crash Report Сохранить отчет об ошибке - + Text files (*.txt *.log *.text) Текстовый файл (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2313,7 +2516,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2449,17 +2652,17 @@ Настройки по умолчанию - + Downloading %s... Загрузка %s... - + Download complete. Click the finish button to start OpenLP. Загрузка завершена. Нажмите кнопку Завершить для запуска OpenLP. - + Enabling selected plugins... Разрешение выбранных плагинов... @@ -2529,32 +2732,32 @@ Этот мастер поможет вам настроить OpenLP для первого использования. Чтобы приступить, нажмите кнопку Далее. - + Setting Up And Downloading Настройка и загрузка - + Please wait while OpenLP is set up and your data is downloaded. Пожалуйста, дождитесь пока OpenLP применит настройки и загрузит данные. - + Setting Up Настройка - + Click the finish button to start OpenLP. Нажмите кнопку Завершить чтобы запустить OpenLP. - + Download complete. Click the finish button to return to OpenLP. Загрузка завершена. Нажмите кнопку Завершить, чтобы вернуться в OpenLP. - + Click the finish button to return to OpenLP. Нажмите кнопку Завершить для возврата в OpenLP. @@ -2564,8 +2767,13 @@ Специальные Слайды + + Finish + Конец + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2574,64 +2782,59 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. - - - Finish - Конец - OpenLP.FormattingTagDialog - + Configure Formatting Tags Настроить теги форматирования - + Edit Selection - + Save - + Description - + Tag - + Start tag - + End tag - + Tag Id - + Start HTML - + End HTML @@ -2639,32 +2842,32 @@ OpenLP.FormattingTagForm - + Update Error - + Tag "n" already defined. - + New Tag - + <HTML here> <HTML здесь> - + </and here> - + Tag %s already defined. @@ -2672,82 +2875,82 @@ OpenLP.FormattingTags - + Red - + Black - + Blue - + Yellow - + Green - + Pink - + Orange - + Purple - + White - + Superscript - + Subscript - + Paragraph - + Bold - + Italics - + Underline - + Break @@ -2755,180 +2958,170 @@ OpenLP.GeneralTab - + General Общие - + Monitors Мониторы - + Select monitor for output display: Выберите монитор для показа: - + Display if a single screen Выполнять на одном экране - + Application Startup Запуск приложения - + Show blank screen warning - + Automatically open the last service Автоматически загружать последнее служение - + Show the splash screen Показывать заставку - + Application Settings Настройки приложения - + Prompt to save before starting a new service Запрос сохранения перед созданием нового служения - + Automatically preview next item in service Автоматически просматривать следующий объект в служении - + sec сек - + CCLI Details Детали CCLI - + SongSelect username: SongSelect логин: - + SongSelect password: SongSelect пароль: - + X Х - + Y - + Height Высота - + Width Ширина - + Check for updates to OpenLP Проверять обновления OpenLP - + Unblank display when adding new live item Снимать блокировку дисплея при добавлении нового объекта - + Timed slide interval: Интервал показа: - + Background Audio - + Start background audio paused - + Service Item Slide Limits - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide + + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item + + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide - - Override display position: + + &Wrap around - - Repeat track list + + &Move to next/previous service item OpenLP.LanguageManager - + Language Язык - + Please restart OpenLP to use your new language setting. Перезагрузите OpenLP чтобы использовать новые языковые настройки. @@ -2944,287 +3137,287 @@ OpenLP.MainWindow - + &File &Файл - + &Import &Импорт - + &Export &Экспорт - + &View &Вид - + M&ode Р&ежим - + &Tools &Инструменты - + &Settings &Настройки - + &Language &Язык - + &Help &Помощь - + Media Manager Менеджер Мультимедиа - + Service Manager Менеджер служения - + Theme Manager Менеджер Тем - + &New &Новая - + &Open &Открыть - + Open an existing service. Открыть существующее служение. - + &Save &Сохранить - + Save the current service to disk. Сохранить текущее служение на диск. - + Save &As... Сохранить к&ак... - + Save Service As Сохранить служение как - + Save the current service under a new name. Сохранить текущее служение под новым именем. - + E&xit Вы&ход - + Quit OpenLP Завершить работу OpenLP - + &Theme Т&ема - + &Configure OpenLP... &Настроить OpenLP... - + &Media Manager Управление &Материалами - + Toggle Media Manager Свернуть Менеджер Медиа - + Toggle the visibility of the media manager. Свернуть видимость менеджера мультимедиа. - + &Theme Manager Управление &темами - + Toggle Theme Manager Свернуть Менеджер Тем - + Toggle the visibility of the theme manager. - + &Service Manager Управление &Служением - + Toggle Service Manager Свернуть Менеджер Служения - + Toggle the visibility of the service manager. Свернуть видимость Менеджера Служения. - + &Preview Panel Пан&ель предпросмотра - + Toggle Preview Panel Toggle Preview Panel - + Toggle the visibility of the preview panel. Toggle the visibility of the preview panel. - + &Live Panel &Панель проектора - + Toggle Live Panel Toggle Live Panel - + Toggle the visibility of the live panel. Toggle the visibility of the live panel. - + &Plugin List &Список плагинов - + List the Plugins Выводит список плагинов - + &User Guide &Руководство пользователя - + &About &О программе - + More information about OpenLP Больше информации про OpenLP - + &Online Help &Помощь онлайн - + &Web Site &Веб-сайт - + Use the system language, if available. Использовать системный язык, если доступно. - + Set the interface language to %s Изменить язык интерфеса на %s - + Add &Tool... Добавить &Инструмент... - + Add an application to the list of tools. Добавить приложение к списку инструментов - + &Default &По умолчанию - + Set the view mode back to the default. Установить вид в режим по умолчанию. - + &Setup &Настройка - + Set the view mode to Setup. Установить вид в режим настройки. - + &Live &Демонстрация - + 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/. @@ -3233,108 +3426,108 @@ Вы можете загрузить последнюю версию с http://openlp.org/. - + OpenLP Version Updated Версия OpenLP обновлена - + OpenLP Main Display Blanked Главный дисплей OpenLP очищен - + The Main Display has been blanked out Главный дисплей был очищен - + Default Theme: %s - + English Please add the name of your language here Русский - + Configure &Shortcuts... Настройки и б&ыстрые клавиши... - + Close OpenLP Закрыть OpenLP - + Are you sure you want to close OpenLP? Вы уверены что хотите закрыть OpenLP? - + Open &Data Folder... Открыть &папку данных... - + Open the folder where songs, bibles and other data resides. Открыть папку размещения песен, Библий и других данных. - + &Autodetect &Автоопределение - + Update Theme Images Обновить изображение Темы - + Update the preview images for all themes. Обновить миниатюры тем. - + Print the current service. Распечатать текущее служение. - + &Recent Files &Недавние файлы - + L&ock Panels За&блокировать панели - + Prevent the panels being moved. Сохраняет панели от перемещения. - + Re-run First Time Wizard Перезапустить мастер первого запуска - + Re-run the First Time Wizard, importing songs, Bibles and themes. Перезапуск Мастера первого запуска, импорт песен, Библий и тем. - + Re-run First Time Wizard? Перезапустить Мастер первого запуска? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3343,43 +3536,43 @@ Перезапуск мастера сделает изменения в текущей конфигурации OpenLP и, возможно, добавит песни к существующему списку и произведет изменения темы по умолчанию. - + Clear List Clear List of recent files Очистить список - + Clear the list of recent files. Очистить список недавних файлов. - + Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file - + Settings Настройки - + Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3388,52 +3581,57 @@ - + Open File Открыть файл - + OpenLP Export Settings Files (*.conf) - + Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File - + OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s - + OpenLP cannot load your database. Database: %s @@ -3443,74 +3641,74 @@ OpenLP.MediaManagerItem - + No Items Selected Объекты не выбраны - + &Add to selected Service Item &Добавить в выбранный объект Служения - + You must select one or more items to preview. Вы должны выбрать объекты для просмотра. - + You must select one or more items to send live. Вы должны выбрать элементы для показа. - + You must select one or more items. Вы должны выбрать один или более элементов. - + You must select an existing service item to add to. Для добавления вы должны выбрать существующий элемент служения. - + Invalid Service Item Неправильный элемент Служения - + You must select a %s service item. Вы должны выбрать объект служения %s. - + You must select one or more items to add. Для добавления вы должны выбрать один или более элементов. - + No Search Results Результаты поиска отсутствуют - + Invalid File Type Неправильный тип файла - + Invalid File %s. Suffix not supported Неправильный файл %s. Расширение не поддерживается - + &Clone &Клонировать - + Duplicate files were found on import and were ignored. @@ -3518,12 +3716,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <verse> tag is missing. @@ -3531,27 +3729,27 @@ OpenLP.PluginForm - + Plugin List Список плагинов - + Plugin Details Описание плагина - + Status: Статус: - + Active Активирован - + Inactive Деактивирован @@ -3574,12 +3772,12 @@ OpenLP.PrintServiceDialog - + Fit Page Вписать в страницу - + Fit Width @@ -3587,7 +3785,7 @@ OpenLP.PrintServiceForm - + Options Опции @@ -3602,47 +3800,47 @@ Копировать как HTML - + Zoom In Увеличить - + Zoom Out Уменьшить - + Zoom Original 1:1 - + Other Options Другие опции - + Include slide text if available Включить текст слайда, если доступно - + Include service item notes Включить заметки к элементам служения - + Include play length of media items Включить время для мультимедиа объектов - + Add page break before each text item Добавить разрыв страницы перед каждым текстовым элементом - + Service Sheet Лист Служения @@ -3652,12 +3850,12 @@ Печать - + Title: Название: - + Custom Footer Text: Специальный текст подписи: @@ -3665,12 +3863,12 @@ OpenLP.ScreenList - + Screen Экран - + primary основной @@ -3678,12 +3876,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Начать</strong>: %s - + <strong>Length</strong>: %s <strong>Длина</strong>: %s @@ -3691,7 +3889,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Изменить порядок служения @@ -3699,82 +3897,82 @@ OpenLP.ServiceManager - + Move to &top Передвинуть &вверх - + Move item to the top of the service. Передвинуть объект в начало служения. - + Move &up - + Move item up one position in the service. Передвинуть объект на одну позицию в служении - + Move &down - + Move item down one position in the service. Передвинуть объект на одну позицию вниз в служении. - + Move to &bottom Передвинуть &вниз - + Move item to the end of the service. Передвинуть объект в конец служения. - + &Delete From Service &Удалить из служения - + Delete the selected item from the service. Удалить выбранный объект из служения. - + &Add New Item &Добавить новый элемент - + &Add to Selected Item &Добавить к выбранному элементу - + &Edit Item &Изменить элемент - + &Reorder Item &Упорядочить элементы - + &Notes &Заметки - + &Change Item Theme &Изменить тему элемента @@ -3796,112 +3994,107 @@ Файл не является правильным служением. - + 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 Элемент служения не может быть показан, поскольку требуемый плагин отсутствует или отключен - + &Expand all &Расширить все - + Expand all the service items. Расширить все объекты служения. - + &Collapse all &Свернуть все - + Collapse all the service items. Свернуть все объекты служения. - + Open File Открыть файл - + Moves the selection down the window. Передвинуть выделенное вниз окна. - + Move up Передвинуть вверх - + Moves the selection up the window. Передвинуть выделенное вверх окна. - + Go Live Показать - + Send the selected item to Live. Показать выбранный объект. - + &Start Time &Время начала - + Show &Preview Показать &Просмотр - - Show &Live - Показать &на проектор - - - + Modified Service Измененное служение - + The current service has been modified. Would you like to save this service? Текущее служение было изменено. Вы хотите сохранить это служение? - + Custom Service Notes: Заметки к служению: - + Notes: Заметки: - + Playing time: Время игры: - + Untitled Service Служение без названия @@ -3926,17 +4119,17 @@ Поврежденный файл - + Load an existing service. Загрузить существующее служение. - + Save this service. Сохранить это служение. - + Select a theme for the service. Выбрать тему для служения. @@ -3946,7 +4139,7 @@ Этот файл поврежден или не является файлом служения OpenLP 2.0. - + Service File Missing Файл служения отсутствует @@ -3970,11 +4163,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes Заметки к элементам служения @@ -3990,67 +4193,67 @@ OpenLP.ShortcutListDialog - + Action Действие - + Shortcut Быстрые клавиши - + Duplicate Shortcut Дублировать быстрые клавиши - + The shortcut "%s" is already assigned to another action, please use a different shortcut. Сочетание "%s" уже назначено для другого действия. Пожалуйста используйте другое сокращение. - + Alternate Альтернатива - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Выберите действие и щелкните на кнопку ниже, чтобы начать захват основного или альтернативного сочетания клавиш. - + Default По-умолчанию - + Custom Особое - + Capture shortcut. Захватить сочетание. - + Restore the default shortcut of this action. Восстановить сочетание клавиш по умолчанию для этого действия. - + Restore Default Shortcuts Восстановить быстрые клавиши по умолчанию - + Do you want to restore all shortcuts to their defaults? Вы хотите восстановить все быстрые клавиши на значения по умолчанию? - + Configure Shortcuts Настроить быстрые клавиши @@ -4058,177 +4261,172 @@ OpenLP.SlideController - + Hide Скрыть - + Go To Перейти к - + Blank Screen Пустой экран - + Blank to Theme Фон темы - + Show Desktop Показать рабочий стол - + Previous Service Предыдущее служение - + Next Service Следующее служение - + Escape Item - + Move to previous. Переместить к предыдущему. - + Move to next. Переместить к следующему. - + Play Slides Проиграть слайды. - + Delay between slides in seconds. Задержка между слайдами в секундах. - + Move to live. Переместить к показу. - + Add to Service. Добавить к служению. - + Edit and reload song preview. Изменить и перезагрузить предпросмотр песни. - + Start playing media. Начать проигрывание медиафайла. - + Pause audio. - + Pause playing media. - + Stop playing media. - + Video position. - + Audio Volume. - + Go to "Verse" - + Go to "Chorus" - + Go to "Bridge" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" - + Previous Slide - + Next Slide - + Pause Audio - + Background Audio - - Next Track - - - - + Go to next audio track. - + Tracks @@ -4304,17 +4502,17 @@ Время начало больше длительности медиа файла - + Theme Layout - + The blue box shows the main area. - + The red box shows the footer. @@ -4322,32 +4520,32 @@ OpenLP.ThemeForm - + Select Image Выбрать изображение - + Theme Name Missing Название темы отсутствует - + There is no name for this theme. Please enter one. Не указано название темы. Укажите его. - + Theme Name Invalid Название темы неправильное - + Invalid theme name. Please enter one. Наверное название темы. Исправьте его. - + (approximately %d lines per slide) @@ -4355,193 +4553,193 @@ OpenLP.ThemeManager - + Create a new theme. Создать новую тему. - + Edit Theme Изменить Тему - + Edit a theme. Изменить тему. - + Delete Theme Удалить Тему. - + Delete a theme. Удаляет тему. - + Import Theme Импортировать Тему. - + Import a theme. Импортирует тему. - + Export Theme Экспортировать Тему - + Export a theme. Экспортирует тему. - + &Edit Theme - + &Delete Theme &Удалить Тему - + Set As &Global Default Установить &по умолчания для всех - + %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 используется в плагине %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. Файл не является темой. - + &Copy Theme &Скопировать Тему - + &Rename Theme &Переименовать Тему - + &Export Theme &Экспортировать Тему - + 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) - + Copy of %s Copy of <theme name> Копия %s - + Theme Already Exists @@ -4549,272 +4747,272 @@ OpenLP.ThemeWizard - + Theme Wizard Мастер Тем - + Welcome to the Theme Wizard Добро пожаловать в Мастер Тем - + Set Up Background Выбор фона - + Set up your theme's background according to the parameters below. Установите фон темы в соответствии с параметрами. - + Background type: Тип фона: - + Solid Color Сплошная заливка - + Gradient Градиент - + Color: Цвет: - + Gradient: Градиент: - + Horizontal Горизонтальный - + Vertical Вертикальный - + Circular Круговой - + Top Left - Bottom Right Верх слева - низ справа - + Bottom Left - Top Right Низ слева - верх справа - + Main Area Font Details Шрифт основной области - + Define the font and display characteristics for the Display text Определите шрифт и характеристики дисплея - + Font: Шрифт: - + Size: Размер: - + Line Spacing: Интервал: - + &Outline: &Контур: - + &Shadow: &Тень: - + Bold - + Italic Курсив - + Footer Area Font Details Настройки шрифта подписи - + Define the font and display characteristics for the Footer text Определите шрифт для подписи - + Text Formatting Details Настройки форматирования текста - + Allows additional display formatting information to be defined Разрешить дополнительные настройки форматирования - + Horizontal Align: Горизонтальная привязка: - + Left Слева - + Right Справа - + Center По центру - + Output Area Locations Расположение области вывода - + Allows you to change and move the main and footer areas. Разрешить изменять и перемещать основную область и область вывода. - + &Main Area &Основная область - + &Use default location &Использовать положение по умолчанию - + X position: Позиция Х: - + px px - + Y position: Позиция Y: - + Width: Ширина: - + Height: Высота: - + Use default location Использовать расположение по умолчанию - + Save and Preview Сохранить и просмотреть - + View the theme and save it replacing the current one or change the name to create a new theme Просмотреть тему и сохранить ее заменяя текущую или изменить название создав новую тему - + Theme name: Название темы: - + Edit Theme - %s Изменить тему - %s - + 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: Переходы: - + &Footer Area &Область подписи - + Starting color: Начальный цвет: - + Ending color: Конечный цвет: - + Background color: Цвет фона: - + Justify - + Layout Preview - + Transparent @@ -4822,47 +5020,47 @@ OpenLP.ThemesTab - + Global Theme Основная Тема - + Theme Level Уровень Темы - + S&ong Level У&ровень песен - + 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 - + 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. Использовать тему служения, заменяя индивидуальные настройки песен. Если тема служения не существует, используется основная тема. - + &Global Level &Основной уровень - + Use the global theme, overriding any themes associated with either the service or the songs. Используется основная тема, заменяя все темы назначенные служению или песне. - + Themes Темы @@ -4946,239 +5144,239 @@ пт - + Image Изображение - + Import Импорт - + Live На проектор - + Live Background Error Ошибка Фона Проектора - + 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.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Просмотр - + Replace Background Заменить Фон - + Reset 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 Версия - + Delete the selected item. Удалить выбранный элемент. - + Move selection up one position. Переместить выше. - + Move selection down one position. Переместить ниже. - + &Vertical Align: &Вертикальная привязка: - + Finished import. Импорт завершен. - + Format: Формат: - + Importing Импортр - + Importing "%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. Импорт из openlp.org 1.x был запрещен из-за отсутствующего модуля Питона. Если вы хотите испольовать этот модуль, вы должны установить модуль "python-sqlite". - + Open %s File Отрырь %s Файл - + %p% %p% - + Ready. Готов. - + Starting import... Начинаю импорт... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong Вы должны указатть по крайней мере %s файл для импорта из него. @@ -5194,7 +5392,7 @@ Добро пожаловать в Мастер экспорта песен - + Welcome to the Song Import Wizard Добро пожалоДобро пожаловать в Мастер Импорта Песен @@ -5282,53 +5480,53 @@ ч - + Layout style: Стиль размещения: - + Live Toolbar Панель показа - + m The abbreviated unit for minutes м - + OpenLP is already running. Do you wish to continue? OpenLP уже запущен. Вы хотите продолжить? - + Settings Настройки - + Tools Инструменты - + Unsupported File - + Verse Per Slide Стих на слайд - + Verse Per Line Стих на абзац - + View Просмотр @@ -5343,42 +5541,37 @@ Ошибка синтаксиса XML - + View Mode Режим отображения - + Open service. Открыть служение. - + Print Service Распечатать служение - + Replace live background. Заменить фон показа - + Reset live background. Сбросить фон показа - - &Split - &Разделить - - - + Split a slide into two only if it does not fit on the screen as one slide. Разделить слайд на два если он не помещается как один слайд. - + Welcome to the Bible Upgrade Wizard Добро пожаловать в Мастер обновления Библии @@ -5388,53 +5581,105 @@ Подтвердить удаление - + Play Slides in Loop Воспроизводить слайды в цикле - + Play Slides to End - + Stop Play Slides in Loop - + Stop Play Slides to End - + Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1, and %2 Locale list separator: end - + %1, %2 Locale list separator: middle - + %1, %2 Locale list separator: start @@ -5443,50 +5688,50 @@ PresentationPlugin - + <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. - + Presentation name singular - + Presentations name plural Презентации - + Presentations container title Презентации - + Load a new presentation. - + Delete the selected presentation. - + Preview the selected presentation. - + Send the selected presentation live. - + Add the selected presentation to the service. @@ -5494,70 +5739,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) - + Automatic - + Present using: - + File Exists - + A presentation with that filename already exists. - + This type of presentation is not supported. - + Presentations (%s) - + Missing Presentation - - The Presentation %s no longer exists. + + The presentation %s is incomplete, please reload. - - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers - + %s (unavailable) - + Allow presentation application to be overridden @@ -5591,135 +5836,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote - + OpenLP 2.0 Stage View - + Service Manager Менеджер служения - + Slide Controller - + Alerts Оповещения - + Search Поиск - - Back - - - - + Refresh - + Blank - + Show - + Prev - + Next - + Text - + Show Alert - + Go Live Показать - + No Results - + Options Опции - + Add to Service + + + Home + + + + + Theme + Тема + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: - + Port number: - + Server Settings - + Remote URL: - + Stage view URL: - + Display stage time in 12h format - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5727,85 +5987,85 @@ SongUsagePlugin - + &Song Usage Tracking &Отслеживание использования песен - + &Delete Tracking Data &Удалить данные отслеживания - + Delete song usage data up to a specified date. Удалить данные использования песен до указанной даты. - + &Extract Tracking Data &Извлечь данные использования - + Generate a report on song usage. Отчет по использованию песен. - + Toggle Tracking - + Toggle the tracking of song usage. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Плагин Использования песен</strong><br />Этот плагин отслеживает использование песен в служениях. - + SongUsage name singular Использование песен - + SongUsage name plural Использование песен - + SongUsage container title Использование песен - + Song Usage - + Song usage tracking is active. - + Song usage tracking is inactive. - + display - + printed @@ -5813,7 +6073,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Удалить данные использования песен @@ -5838,7 +6098,7 @@ Все запросы были успешно удалены. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5846,54 +6106,54 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction - + Select Date Range - + to - + Report Location - + Output File Location - + usage_detail_%s_%s.txt - + Report Creation - + Report %s has been successfully created. - + Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5931,82 +6191,82 @@ Индексация песен... - + 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 Кодировка символов - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6016,26 +6276,26 @@ - + Please choose the character encoding. The encoding is responsible for the correct character representation. Пожалуйста, выберите кодировку символов. Кодировка ответственна за корректное отображение символов. - + Song name singular Песня - + Songs name plural ПесниПсалмы - + Songs container title Псалмы @@ -6046,32 +6306,32 @@ Экспортировать песни используя мастер экспорта. - + 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. @@ -6099,17 +6359,17 @@ Фамилия: - + You need to type in the first name of the author. Вы должны указать имя автора. - + You need to type in the last name of the author. Вы должны указать фамилию автора. - + You have not set a display name for the author, combine the first and last names? Вы не указали отображаемое имя автора. Использовать комбинацию имени и фамилии? @@ -6138,209 +6398,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor Редактор Песен - + &Title: &Название: - + Alt&ernate title: До&полнительное название: - + &Lyrics: &Слова: - + &Verse order: П&орядок куплтов: - + Ed&it All Редактировать &все - + Title && Lyrics Название и слова - + &Add to Song Д&обавить к песне - + &Remove Уда&лить - + &Manage Authors, Topics, Song Books &Управление Авторами, Темами и Сборниками песен - + A&dd to Song Д&обавить к песне - + R&emove Уда&лить - + Book: Сборник: - + Number: Номер: - + Authors, Topics && Song Book Авторы, Темы и Сборники песен - + New &Theme Новая &Тема - + Copyright Information Информация об авторских правах - + Comments Комментарии - + Theme, Copyright Info && Comments Тема, информация об авторских правах и комментарии - + Add Author Добавить Автора - + This author does not exist, do you want to add them? Этот автор не существует. Хотите добавить его? - + This author is already in the list. Такой автор уже присутсвует в списке. - + 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. Вы не выбрали подходящего автора. Выберите автора из списка, или введите нового автора и выберите "Добавить Автора к Песне", чтобы добавить нового автора. - + Add Topic Добавить Тему - + This topic does not exist, do you want to add it? Эта тема не существует. Хотите добавить её? - + This topic is already in the list. Такая тема уже присутсвует в списке. - + 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. Вы должны указать название песни. - + You need to type in at least one verse. Вы должны ввести по крайней мере один куплет. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. Порядок куплетов указан неверно. Нет куплета, который бы соответсвовал %s. Правильными записями являютеся %s. - + Add Book Добавить Книгу - + This song book does not exist, do you want to add it? Этот сборник песен не существует. Хотите добавить его? - + You need to have an author for this song. Вы должны добавить автора к этой песне. - + You need to type some text in to the verse. Вы должны указать какой-то текст в этом куплете. - + Linked Audio - + Add &File(s) - + Add &Media - + Remove &All - + Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6454,130 +6727,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Выберите файл документа или презентации - + 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. Этот Мастер поможет Вам импортировать песни из различных форматов. Выберите кнопку Далее чтобы начать процесс выбора формата для импорта. - + Generic Document/Presentation Общий формат или презентация - - Filename: - Имя файла: - - - - 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. - 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. - - - + Add Files... Добавить файлы... - + Remove File(s) Удалить Файл(ы) - + Please wait while your songs are imported. Дождитесь, пока песни будут импортированы. - + OpenLP 2.0 Databases База данных OpenLP 2.0 - + openlp.org v1.x Databases База данных openlp.org v1.x - + Words Of Worship Song Files - - You need to specify at least one document or presentation file to import from. - Вы должны указать по крайней мере один документ или презентацию, чтобы осуществить импорт из них. - - - + Songs Of Fellowship Song Files Файлы песен Songs Of Fellowship - + SongBeamer Files Файлы SongBeamer - + SongShow Plus Song Files Файлы SongShow Plus - + Foilpresenter Song Files Foilpresenter Song Files - + Copy Копировать - + Save to File Сохранить в файл - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. @@ -6585,27 +6878,27 @@ SongsPlugin.MediaItem - + Titles Название - + Lyrics Слова - + CCLI License: Лицензия CCLI: - + Entire Song Всю песню - + Are you sure you want to delete the %n selected song(s)? Вы уверены, что хотите удалить %n выбранную песню? @@ -6614,16 +6907,41 @@ - + Maintain the lists of authors, topics and books. - + copy For song cloning + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6650,6 +6968,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6688,12 +7019,12 @@ SongsPlugin.SongImport - + copyright - + The following songs could not be imported: @@ -6714,117 +7045,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. - + This author already exists. - + Could not add your topic. - + This topic already exists. - + Could not add your book. - + This book already exists. - + Could not save your changes. - + Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. - + Delete Author - + Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic - + Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book - + Are you sure you want to delete the selected book? - + 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? - + 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? @@ -6832,28 +7155,28 @@ SongsPlugin.SongsTab - + Songs Mode - + Enable search as you type - + Display verses on live tool bar - + Update service from song edit - - Add missing songs when opening service + + Import missing songs from service files @@ -6913,4 +7236,17 @@ + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/sq.ts openlp-1.9.10/resources/i18n/sq.ts --- openlp-1.9.9/resources/i18n/sq.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/sq.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert - + Show an alert message. - + Alert name singular - + Alerts name plural - + Alerts container title - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message - + Alert &text: - + &New - + &Save - + Displ&ay - + Display && Cl&ose @@ -79,7 +79,7 @@ - + &Parameter: @@ -117,32 +117,32 @@ AlertsPlugin.AlertsTab - + Font - + Font name: - + Font color: - + Background color: - + Font size: - + Alert timeout: @@ -150,550 +150,595 @@ BiblesPlugin - + &Bible - + Bible name singular - + Bibles name plural - + Bibles container title - + No Book Found - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. - + Import a Bible. - + Add a new Bible. - + Edit the selected Bible. - + Delete the selected Bible. - + Preview the selected Bible. - + Send the selected Bible live. - + Add the selected Bible to the service. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. - + &Upgrade older Bibles - + Upgrade the Bible databases to the latest format. - + Genesis - + Exodus - + Leviticus - + Numbers - + Deuteronomy - + Joshua - + Judges - + Ruth - + 1 Samuel - + 2 Samuel - + 1 Kings - + 2 Kings - + 1 Chronicles - + 2 Chronicles - + Ezra - + Nehemiah - + Esther - + Job - + Psalms - + Proverbs - + Ecclesiastes - + Song of Solomon - + Isaiah - + Jeremiah - + Lamentations - + Ezekiel - + Daniel - + Hosea - + Joel - + Amos - + Obadiah - + Jonah - + Micah - + Nahum - + Habakkuk - + Zephaniah - + Haggai - + Zechariah - + Malachi - + Matthew - + Mark - + Luke - + John - + Acts - + Romans - + 1 Corinthians - + 2 Corinthians - + Galatians - + Ephesians - + Philippians - + Colossians - + 1 Thessalonians - + 2 Thessalonians - + 1 Timothy - + 2 Timothy - + Titus - + Philemon - + Hebrews - + James - + 1 Peter - + 2 Peter - + 1 John - + 2 John - + 3 John - + Jude - + Revelation - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + + + + + Bible Exists + + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error - + Web Bible cannot be used - + Text Search is not available with Web Bibles. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. - + No Bibles Available - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -709,186 +754,178 @@ BiblesPlugin.BiblesTab - + Verse Display - + Only show new chapter numbers - + Bible theme: - + No Brackets - + ( And ) - + { And } - + [ And ] - + Note: Changes do not affect verses already in the service. - + Display second Bible verses - + Custom Scripture References - + Verse Separator: - + Range Separator: - + List Separator: - + End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - + + English + Shqiptar - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + Default Bible Language - - Bible language + + Book name language in search field, +search results and on display: - - Application language + + Bible Language - - English - Shqiptar - - - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language BiblesPlugin.BookNameDialog - + Select Book Name - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - - - - + Current name: - + Corresponding name: - + Show Books From - + Old Testament - + New Testament - + Apocrypha + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. @@ -913,40 +950,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + + + + + Version name: + + + + + Copyright: + + + + + Permissions: + + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + Shqiptar + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... - + Registering Language... - + Importing %s... Importing <book name>... - + Download Error - + 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. - + Parse Error - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. @@ -1123,17 +1229,17 @@ BiblesPlugin.LanguageDialog - + Select Language - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - + Language: @@ -1149,85 +1255,100 @@ BiblesPlugin.MediaItem - + Quick - + Find: - + Book: - + Chapter: - + Verse: - + From: - + To: - + Text Search - + Second: - + Scripture Reference - + Toggle to keep or clear the previous results. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. - + Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -1236,12 +1357,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1250,143 +1371,143 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory - + Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory - + Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. - + Backup Directory: - + There is no need to backup my Bibles - + Select Bibles - + Please select the Bibles to upgrade - + Upgrading - + Please wait while your Bibles are upgraded. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. - + Upgrading Bible %s of %s: "%s" Failed - + Upgrading Bible %s of %s: "%s" Upgrading ... - + Download Error - + To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... - + Upgrading Bible %s of %s: "%s" Complete - + , %s failed - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s - + Upgrade failed. - + You need to specify a backup directory for your Bibles. - + Starting upgrade... - + There are no Bibles that need to be upgraded. @@ -1460,12 +1581,12 @@ CustomPlugin.CustomTab - + Custom Display - + Display footer @@ -1473,42 +1594,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides - + &Title: - + Add a new slide at bottom. - + Edit the selected slide. - + Edit all the slides at once. - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -1523,12 +1644,12 @@ - + Ed&it All - + Insert Slide @@ -1536,7 +1657,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1547,60 +1668,60 @@ ImagePlugin - + <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. - + Image name singular - + Images name plural - + Images container title - + Load a new image. - + Add a new image. - + Edit the selected image. - + Delete the selected image. - + Preview the selected image. - + Send the selected image live. - + Add the selected image to the service. @@ -1608,7 +1729,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment @@ -1616,43 +1737,43 @@ ImagePlugin.MediaItem - + Select Image(s) - + You must select an image to delete. - + You must select an image to replace the background with. - + Missing Image(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? - + There was a problem replacing your background, the image file "%s" no longer exists. - + There was no display item to amend. @@ -1660,78 +1781,78 @@ ImagesPlugin.ImageTab - + Background Color - + Default Color: - - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - + Media name singular - + Media name plural - + Media container title - + Load new media. - + Add new media. - + Edit the selected media. - + Delete the selected media. - + Preview the selected media. - + Send the selected media live. - + Add the selected media to the service. @@ -1779,7 +1900,7 @@ - + Unsupported File @@ -1797,22 +1918,22 @@ MediaPlugin.MediaTab - + Available Media Players - + %s (unavailable) - + Player Order - + Allow media player to be overridden @@ -1820,7 +1941,7 @@ OpenLP - + Image Files @@ -1840,17 +1961,17 @@ OpenLP.AboutForm - + Credits - + License - + Contribute @@ -1860,17 +1981,17 @@ - + 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 @@ -1935,7 +2056,7 @@ - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -1946,7 +2067,7 @@ - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s @@ -1955,228 +2076,310 @@ OpenLP.AdvancedTab - + UI Settings - + Number of recent files to display: - + Remember active media manager tab on startup - + Double-click to send items straight to live - + Expand new service items on creation - + Enable application exit confirmation - + Mouse Cursor - + Hide mouse cursor when over display window - + Default Image - + Background color: - - Image file: + + Image file: + + + + + Open File + + + + + Advanced + + + + + Preview items when clicked in Media Manager + + + + + Click to select a color. + + + + + Browse for an image file to display. + + + + + Revert to the default OpenLP logo. + + + + + Service %Y-%m-%d %H-%M + This may not contain any of the following characters: /\?*|<>[]":+ +See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + + + + Default Service Name + + + + + Enable default service name + + + + + Date and Time: + + + + + Monday + + + + + Tuesday + + + + + Wednesday + + + + + Thurdsday + + + + + Friday + + + + + Saturday - - Open File + + Sunday - - Advanced + + Now - - Preview items when clicked in Media Manager + + Time when usual service starts. - - Click to select a color. + + Name: - - Browse for an image file to display. + + Consult the OpenLP manual for usage. - - Revert to the default OpenLP logo. + + Revert to the default service name "%s". - - Service %Y-%m-%d %H-%M - This may not contain any of the following characters: /\?*|<>[]":+ -See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + Example: - - Default Service Name + + X11 - - Enable default service name + + Bypass X11 Window Manager - - Date and Time: + + Syntax error. - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday + + Cancel - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. - + Send E-Mail - + Save to File - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) - + Attach File - + Description characters to enter : %s @@ -2184,23 +2387,23 @@ OpenLP.ExceptionForm - + Platform: %s - + Save Crash Report - + Text files (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2218,7 +2421,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2341,17 +2544,17 @@ - + Downloading %s... - + Download complete. Click the finish button to start OpenLP. - + Enabling selected plugins... @@ -2421,32 +2624,32 @@ - + Setting Up And Downloading - + Please wait while OpenLP is set up and your data is downloaded. - + Setting Up - + Click the finish button to start OpenLP. - + Download complete. Click the finish button to return to OpenLP. - + Click the finish button to return to OpenLP. @@ -2456,8 +2659,13 @@ + + Finish + + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2466,64 +2674,59 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - - - - Finish +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. OpenLP.FormattingTagDialog - + Configure Formatting Tags - + Edit Selection - + Save - + Description - + Tag - + Start tag - + End tag - + Tag Id - + Start HTML - + End HTML @@ -2531,32 +2734,32 @@ OpenLP.FormattingTagForm - + Update Error - + Tag "n" already defined. - + New Tag - + <HTML here> - + </and here> - + Tag %s already defined. @@ -2564,82 +2767,82 @@ OpenLP.FormattingTags - + Red - + Black - + Blue - + Yellow - + Green - + Pink - + Orange - + Purple - + White - + Superscript - + Subscript - + Paragraph - + Bold - + Italics - + Underline - + Break @@ -2647,180 +2850,170 @@ OpenLP.GeneralTab - + General - + Monitors - + Select monitor for output display: - + Display if a single screen - + Application Startup - + Show blank screen warning - + Automatically open the last service - + Show the splash screen - + Application Settings - + Prompt to save before starting a new service - + Automatically preview next item in service - + sec - + CCLI Details - + SongSelect username: - + SongSelect password: - + X - + Y - + Height - + Width - + Check for updates to OpenLP - + Unblank display when adding new live item - + Timed slide interval: - + Background Audio - + Start background audio paused - + Service Item Slide Limits - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide + + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item + + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide - - Override display position: + + &Wrap around - - Repeat track list + + &Move to next/previous service item OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -2836,438 +3029,438 @@ OpenLP.MainWindow - + &File - + &Import - + &Export - + &View - + M&ode - + &Tools - + &Settings - + &Language - + &Help - + Media Manager - + Service Manager - + Theme Manager - + &New - + &Open - + Open an existing service. - + &Save - + Save the current service to disk. - + Save &As... - + Save Service As - + Save the current service under a new name. - + E&xit - + Quit OpenLP - + &Theme - + &Configure OpenLP... - + &Media Manager - + Toggle Media Manager - + Toggle the visibility of the media manager. - + &Theme Manager - + Toggle Theme Manager - + Toggle the visibility of the theme manager. - + &Service Manager - + Toggle Service Manager - + Toggle the visibility of the service manager. - + &Preview Panel - + Toggle Preview Panel - + Toggle the visibility of the preview panel. - + &Live Panel - + Toggle Live Panel - + Toggle the visibility of the live panel. - + &Plugin List - + List the Plugins - + &User Guide - + &About - + More information about OpenLP - + &Online Help - + &Web Site - + Use the system language, if available. - + Set the interface language to %s - + Add &Tool... - + Add an application to the list of tools. - + &Default - + Set the view mode back to the default. - + &Setup - + Set the view mode to Setup. - + &Live - + 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/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s - + English Please add the name of your language here Shqiptar - + Configure &Shortcuts... - + Close OpenLP - + Are you sure you want to close OpenLP? - + Open &Data Folder... - + Open the folder where songs, bibles and other data resides. - + &Autodetect - + Update Theme Images - + Update the preview images for all themes. - + Print the current service. - + &Recent Files - + L&ock Panels - + Prevent the panels being moved. - + Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files - + Clear the list of recent files. - + Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file - + Settings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3276,52 +3469,57 @@ - + Open File - + OpenLP Export Settings Files (*.conf) - + Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File - + OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s - + OpenLP cannot load your database. Database: %s @@ -3331,73 +3529,73 @@ OpenLP.MediaManagerItem - + No Items Selected - + &Add to selected Service Item - + You must select one or more items to preview. - + You must select one or more items to send live. - + You must select one or more items. - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. - + You must select one or more items to add. - + No Search Results - + Invalid File Type - + Invalid File %s. Suffix not supported - + &Clone - + Duplicate files were found on import and were ignored. @@ -3405,12 +3603,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <verse> tag is missing. @@ -3418,27 +3616,27 @@ OpenLP.PluginForm - + Plugin List - + Plugin Details - + Status: - + Active - + Inactive @@ -3461,12 +3659,12 @@ OpenLP.PrintServiceDialog - + Fit Page - + Fit Width @@ -3474,7 +3672,7 @@ OpenLP.PrintServiceForm - + Options @@ -3489,47 +3687,47 @@ - + Zoom In - + Zoom Out - + Zoom Original - + Other Options - + Include slide text if available - + Include service item notes - + Include play length of media items - + Add page break before each text item - + Service Sheet @@ -3539,12 +3737,12 @@ - + Title: - + Custom Footer Text: @@ -3552,12 +3750,12 @@ OpenLP.ScreenList - + Screen - + primary @@ -3565,12 +3763,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s - + <strong>Length</strong>: %s @@ -3578,7 +3776,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item @@ -3586,82 +3784,82 @@ OpenLP.ServiceManager - + Move to &top - + Move item to the top of the service. - + Move &up - + Move item up one position in the service. - + Move &down - + Move item down one position in the service. - + Move to &bottom - + Move item to the end of the service. - + &Delete From Service - + Delete the selected item from the service. - + &Add New Item - + &Add to Selected Item - + &Edit Item - + &Reorder Item - + &Notes - + &Change Item Theme @@ -3682,112 +3880,107 @@ - + 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 - + &Expand all - + Expand all the service items. - + &Collapse all - + Collapse all the service items. - + Open File - + Moves the selection down the window. - + Move up - + Moves the selection up the window. - + Go Live - + Send the selected item to Live. - + &Start Time - - Show &Preview - - - - Show &Live + Show &Preview - + Modified Service - + The current service has been modified. Would you like to save this service? - + Custom Service Notes: - + Notes: - + Playing time: - + Untitled Service @@ -3812,17 +4005,17 @@ - + Load an existing service. - + Save this service. - + Select a theme for the service. @@ -3832,7 +4025,7 @@ - + Service File Missing @@ -3856,11 +4049,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes @@ -3876,67 +4079,67 @@ OpenLP.ShortcutListDialog - + Action - + Shortcut - + Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default - + Custom - + Capture shortcut. - + Restore the default shortcut of this action. - + Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts @@ -3944,177 +4147,172 @@ OpenLP.SlideController - + Hide - + Go To - + Blank Screen - + Blank to Theme - + Show Desktop - + Previous Service - + Next Service - + Escape Item - + Move to previous. - + Move to next. - + Play Slides - + Delay between slides in seconds. - + Move to live. - + Add to Service. - + Edit and reload song preview. - + Start playing media. - + Pause audio. - + Pause playing media. - + Stop playing media. - + Video position. - + Audio Volume. - + Go to "Verse" - + Go to "Chorus" - + Go to "Bridge" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" - + Previous Slide - + Next Slide - + Pause Audio - + Background Audio - - Next Track - - - - + Go to next audio track. - + Tracks @@ -4190,17 +4388,17 @@ - + Theme Layout - + The blue box shows the main area. - + The red box shows the footer. @@ -4208,32 +4406,32 @@ OpenLP.ThemeForm - + Select Image - + Theme Name Missing - + There is no name for this theme. Please enter one. - + Theme Name Invalid - + Invalid theme name. Please enter one. - + (approximately %d lines per slide) @@ -4241,193 +4439,193 @@ OpenLP.ThemeManager - + Create a new theme. - + Edit Theme - + Edit a theme. - + Delete Theme - + Delete a theme. - + Import Theme - + Import a theme. - + Export Theme - + Export a theme. - + &Edit Theme - + &Delete Theme - + Set As &Global Default - + %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. - + &Copy Theme - + &Rename Theme - + &Export Theme - + 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) - + Copy of %s Copy of <theme name> - + Theme Already Exists @@ -4435,272 +4633,272 @@ OpenLP.ThemeWizard - + Theme Wizard - + Welcome to the Theme Wizard - + Set Up Background - + Set up your theme's background according to the parameters below. - + Background type: - + Solid Color - + Gradient - + Color: - + Gradient: - + Horizontal - + Vertical - + Circular - + Top Left - Bottom Right - + Bottom Left - Top Right - + Main Area Font Details - + Define the font and display characteristics for the Display text - + Font: - + Size: - + Line Spacing: - + &Outline: - + &Shadow: - + Bold - + Italic - + Footer Area Font Details - + Define the font and display characteristics for the Footer text - + Text Formatting Details - + Allows additional display formatting information to be defined - + Horizontal Align: - + Left - + Right - + Center - + Output Area Locations - + Allows you to change and move the main and footer areas. - + &Main Area - + &Use default location - + X position: - + px - + Y position: - + Width: - + Height: - + Use default location - + Save and Preview - + View the theme and save it replacing the current one or change the name to create a new theme - + Theme name: - + Edit Theme - %s - + 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: - + &Footer Area - + Starting color: - + Ending color: - + Background color: - + Justify - + Layout Preview - + Transparent @@ -4708,47 +4906,47 @@ OpenLP.ThemesTab - + Global Theme - + Theme Level - + S&ong Level - + 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 - + 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. - + &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. - + Themes @@ -4832,239 +5030,239 @@ - + Image - + Import - + Live - + Live Background Error - + 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 - + Preview - + Replace Background - + Reset 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 - + Theme Singular - + Themes Plural - + Top - + Version - + Delete the selected item. - + Move selection up one position. - + Move selection down one position. - + &Vertical Align: - + Finished import. - + Format: - + Importing - + Importing "%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. - + Open %s File - + %p% - + Ready. - + Starting import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong @@ -5080,7 +5278,7 @@ - + Welcome to the Song Import Wizard @@ -5168,53 +5366,53 @@ - + Layout style: - + Live Toolbar - + m The abbreviated unit for minutes - + OpenLP is already running. Do you wish to continue? - + Settings - + Tools - + Unsupported File - + Verse Per Slide - + Verse Per Line - + View @@ -5229,42 +5427,37 @@ - + View Mode - + Open service. - + Print Service - + Replace live background. - + Reset live background. - - &Split - - - - + Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard @@ -5274,53 +5467,105 @@ - + Play Slides in Loop - + Play Slides to End - + Stop Play Slides in Loop - + Stop Play Slides to End - + Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1, and %2 Locale list separator: end - + %1, %2 Locale list separator: middle - + %1, %2 Locale list separator: start @@ -5329,50 +5574,50 @@ PresentationPlugin - + <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. - + Presentation name singular - + Presentations name plural - + Presentations container title - + Load a new presentation. - + Delete the selected presentation. - + Preview the selected presentation. - + Send the selected presentation live. - + Add the selected presentation to the service. @@ -5380,70 +5625,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) - + Automatic - + Present using: - + File Exists - + A presentation with that filename already exists. - + This type of presentation is not supported. - + Presentations (%s) - + Missing Presentation - - The Presentation %s no longer exists. + + The presentation %s is incomplete, please reload. - - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers - + %s (unavailable) - + Allow presentation application to be overridden @@ -5477,135 +5722,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote - + OpenLP 2.0 Stage View - + Service Manager - + Slide Controller - - Alerts - - - - Search + Alerts - Back + Search - + Refresh - + Blank - + Show - + Prev - + Next - + Text - + Show Alert - + Go Live - + No Results - + Options - + Add to Service + + + Home + + + + + Theme + + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: - + Port number: - + Server Settings - + Remote URL: - + Stage view URL: - + Display stage time in 12h format - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5613,85 +5873,85 @@ SongUsagePlugin - + &Song Usage Tracking - + &Delete Tracking Data - + Delete song usage data up to a specified date. - + &Extract Tracking Data - + Generate a report on song usage. - + Toggle Tracking - + Toggle the tracking of song usage. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - + SongUsage name singular - + SongUsage name plural - + SongUsage container title - + Song Usage - + Song usage tracking is active. - + Song usage tracking is inactive. - + display - + printed @@ -5699,7 +5959,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data @@ -5724,7 +5984,7 @@ - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5732,54 +5992,54 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction - + Select Date Range - + to - + Report Location - + Output File Location - + usage_detail_%s_%s.txt - + Report Creation - + Report %s has been successfully created. - + Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5817,107 +6077,107 @@ - + Arabic (CP-1256) - + Baltic (CP-1257) - + Central European (CP-1250) - + Cyrillic (CP-1251) - + Greek (CP-1253) - + Hebrew (CP-1255) - + Japanese (CP-932) - + Korean (CP-949) - + Simplified Chinese (CP-936) - + Thai (CP-874) - + Traditional Chinese (CP-950) - + Turkish (CP-1254) - + Vietnam (CP-1258) - + Western European (CP-1252) - + Character Encoding - + 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. - + Song name singular - + Songs name plural - + Songs container title @@ -5928,32 +6188,32 @@ - + 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. @@ -5981,17 +6241,17 @@ - + You need to type in the first name of the author. - + You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? @@ -6020,209 +6280,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor - + &Title: - + Alt&ernate title: - + &Lyrics: - + &Verse order: - + Ed&it All - + Title && Lyrics - + &Add to Song - + &Remove - + &Manage Authors, Topics, Song Books - + A&dd to Song - + R&emove - + Book: - + Number: - + Authors, Topics && Song Book - + New &Theme - + Copyright Information - + Comments - + Theme, Copyright Info && Comments - + Add Author - + This author does not exist, do you want to add them? - + This author is already in the list. - + 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. - + Add Topic - + This topic does not exist, do you want to add it? - + This topic is already in the list. - + 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. - + You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book - + This song book does not exist, do you want to add it? - + You need to have an author for this song. - + You need to type some text in to the verse. - + Linked Audio - + Add &File(s) - + Add &Media - + Remove &All - + Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6336,130 +6609,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files - + 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. - + Generic Document/Presentation - - Filename: - - - - - 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. - - - - + Add Files... - + Remove File(s) - + Please wait while your songs are imported. - + OpenLP 2.0 Databases - + openlp.org v1.x Databases - + Words Of Worship Song Files - - You need to specify at least one document or presentation file to import from. - - - - + Songs Of Fellowship Song Files - + SongBeamer Files - + SongShow Plus Song Files - + Foilpresenter Song Files - + Copy - + Save to File - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. @@ -6467,27 +6760,27 @@ SongsPlugin.MediaItem - + Titles - + Lyrics - + CCLI License: - + Entire Song - + Are you sure you want to delete the %n selected song(s)? @@ -6495,16 +6788,41 @@ - + Maintain the lists of authors, topics and books. - + copy For song cloning + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6531,6 +6849,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6569,12 +6900,12 @@ SongsPlugin.SongImport - + copyright - + The following songs could not be imported: @@ -6595,117 +6926,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. - + This author already exists. - + Could not add your topic. - + This topic already exists. - + Could not add your book. - + This book already exists. - + Could not save your changes. - + Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. - + Delete Author - + Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic - + Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book - + Are you sure you want to delete the selected book? - + 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? - + 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? @@ -6713,28 +7036,28 @@ SongsPlugin.SongsTab - + Songs Mode - + Enable search as you type - + Display verses on live tool bar - + Update service from song edit - - Add missing songs when opening service + + Import missing songs from service files @@ -6794,4 +7117,17 @@ + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/i18n/sv.ts openlp-1.9.10/resources/i18n/sv.ts --- openlp-1.9.9/resources/i18n/sv.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/sv.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert &Meddelande - + Show an alert message. Visa ett publikt meddelande. - + Alert name singular Meddelande - + Alerts name plural Meddelanden - + Alerts container title Meddelanden - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. <strong>Meddelandemodul</strong><br />Meddelandemodulen kontrollerar visningen av publika meddelanden på visningsskärmen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message Meddelande - + Alert &text: Meddelande&text: - + &New &Nytt - + &Save &Spara - + Displ&ay &Visa - + Display && Cl&ose Visa && stän&g @@ -79,7 +79,7 @@ Du har inte angivit någon text för ditt meddelande. Ange en text innan du klickar på Nytt. - + &Parameter: &Parameter: @@ -119,32 +119,32 @@ AlertsPlugin.AlertsTab - + Font Teckensnitt - + Font name: Teckensnitt: - + Font color: Teckenfärg: - + Background color: Bakgrundsfärg: - + Font size: Teckenstorlek: - + Alert timeout: Visningstid: @@ -152,551 +152,598 @@ BiblesPlugin - + &Bible &Bibel - + Bible name singular Bibel - + Bibles name plural Biblar - + Bibles container title Biblar - + No Book Found Bok saknas - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. Ingen bok hittades i vald bibel. Kontrollera stavningen av bokens namn. - + Import a Bible. Importera en bibelöversättning. - + Add a new Bible. Lägg till en ny bibel. - + Edit the selected Bible. Redigera vald bibel. - + Delete the selected Bible. Ta bort vald bibel. - + Preview the selected Bible. Förhandsgranska bibeltexten. - + Send the selected Bible live. Visa bibeltexten live. - + Add the selected Bible to the service. Lägg till bibeltexten i körschemat. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. <strong>Bibelmodul</strong><br />Bibelmodulen gör det möjligt att visa bibelverser från olika översättningar under gudstjänsten. - + &Upgrade older Bibles &Uppgradera äldre biblar - + Upgrade the Bible databases to the latest format. Uppgradera bibeldatabasen till det senaste formatet. - + Genesis Första Moseboken - + Exodus Andra Moseboken - + Leviticus Tredje Moseboken - + Numbers Fjärde Moseboken - + Deuteronomy Femte Moseboken - + Joshua Josua - + Judges Domarboken - + Ruth Rut - + 1 Samuel Första Samuelsboken - + 2 Samuel Andra Samuelsboken - + 1 Kings Första Kungaboken - + 2 Kings Andra Kungaboken - + 1 Chronicles Första Krönikeboken - + 2 Chronicles Andra Krönikeboken - + Ezra Esra - + Nehemiah Nehemja - + Esther Ester - + Job Job - + Psalms Psaltaren - + Proverbs Ordspråksboken - + Ecclesiastes Predikaren - + Song of Solomon Höga Visan - + Isaiah Jesaja - + Jeremiah Jeremia - + Lamentations Klagovisorna - + Ezekiel Hesekiel - + Daniel Daniel - + Hosea Hosea - + Joel Joel - + Amos Amos - + Obadiah Obadja - + Jonah Jona - + Micah Mika - + Nahum Nahum - + Habakkuk Habackuk - + Zephaniah Sefanja - + Haggai Haggaj - + Zechariah Sakarja - + Malachi Malaki - + Matthew Matteusevangeliet - + Mark Markusevangeliet - + Luke Lukasevangeliet - + John Johannesevangeliet - + Acts Apostlagärningarna - + Romans Romarbrevet - + 1 Corinthians Första Korinthierbrevet - + 2 Corinthians Andra Korinthierbrevet - + Galatians Galaterbrevet - + Ephesians Efesierbrevet - + Philippians Filipperbrevet - + Colossians Kolosserbrevet - + 1 Thessalonians Första Thessalonikerbrevet - + 2 Thessalonians Andra Thessalonikerbrevet - + 1 Timothy Första Timotheosbrevet - + 2 Timothy Andra Timotheosbrevet - + Titus Titusbrevet - + Philemon Filemonbrevet - + Hebrews Hebreerbrevet - + James Jakobsbrevet - + 1 Peter Första Petrusbrevet - + 2 Peter Andra Petrusbrevet - + 1 John Första Johannesbrevet - + 2 John Andra Johannesbrevet - + 3 John Tredje Johannesbrevet - + Jude Judasbrevet - + Revelation Uppenbarelseboken - + Judith Judit - + Wisdom Salomos vishet - + Tobit Tobit - + Sirach Jesus Syraks vishet - + Baruch Baruk - + 1 Maccabees Första Mackabeerboken - + 2 Maccabees Andra Mackabeerboken - + 3 Maccabees Tredje Mackabeerboken - + 4 Maccabees Fjärde Mackabeerboken - + Rest of Daniel Tillägg till Daniel - + Rest of Esther Ester enligt den grekiska texten - + Prayer of Manasses Manasses bön - + Letter of Jeremiah Jeremias brev - + Prayer of Azariah Asarjas bön - + Susanna Susanna i badet - + Bel Bel i Babylon - + 1 Esdras Tredje Esra - + 2 Esdras Fjärde Esra - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. :|v|V|vers|verser;;-|till;;,|och;;slut + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + Du måste ange ett namn på bibelöversättningen. + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + Du måste ange copyright för bibeln. Biblar i public domain måste markeras som sådana. + + + + Bible Exists + Bibeln finns redan + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + Bibeln finns redan. Importera en annan bibel eller ta först bort den existerande. + + + + You need to specify a book name for "%s". + Du måste ange ett boknamn för "%s". + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + Boknamnet "%s" är inte korrekt. +Siffror kan bara användas i början och måste +följas av ett eller flera ickenumeriska tecken. + + + + Duplicate Book Name + Dublettnamn på bok + + + + The Book Name "%s" has been entered more than once. + Boknamnet "%s" har angivits flera gånger. + + + BiblesPlugin.BibleManager - + Scripture Reference Error Felaktig bibelreferens - + Web Bible cannot be used Webb-bibel kan inte användas - + Text Search is not available with Web Bibles. Textsökning är inte tillgänglig för webb-biblar. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. Du angav inget sökord. Du kan ange flera sökord avskilda med mellanslag för att söka på alla sökord och du kan avskilja sökorden med kommatecken för att söka efter ett av sökorden. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. Det finns inga biblar installerade. Använd guiden för bibelimport och installera en eller flera bibelöversättningar. - + No Bibles Available Inga biblar tillgängliga - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -719,79 +766,79 @@ BiblesPlugin.BiblesTab - + Verse Display Visning av bibeltext - + Only show new chapter numbers Visa bara nummer för nya kapitel - + Bible theme: Bibeltema: - + No Brackets Inga parenteser - + ( And ) ( och ) - + { And } { och } - + [ And ] [ och ] - + Note: Changes do not affect verses already in the service. Observera: Ändringar kommer inte att påverka verser som redan finns i körschemat. - + Display second Bible verses Visa andra bibelns verser - + Custom Scripture References Anpassade bibelreferenser - + Verse Separator: Versavskiljare: - + Range Separator: Intervallavskiljare: - + List Separator: Listavskiljare: - + End Mark: Slutmärke: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -800,7 +847,7 @@ Lämna fältet tomt för att använda standardvärdet. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -809,7 +856,7 @@ Lämna fältet tomt för att använda standardvärdet. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -818,7 +865,7 @@ Lämna fältet tomt för att använda standardvärdet. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. @@ -827,91 +874,80 @@ Lämna fältet tomt för att använda standardvärdet. - - Preferred Bookname Language - Föredraget språk för boknamn - - - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: - Välj språket på vilket bibelns boknamn ska visas -vid bibelsökning: + + English + Engelska - - Bible language - Bibelns språk + + Default Bible Language + Förvalt bibelspråk - - Application language - Programmets språk + + Book name language in search field, +search results and on display: + Språk på boknamn i sökfält, +sökresultat och vid visning: - - English - Engelska + + Bible Language + Bibelspråk - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names - Valmöjligheter: - Bibelns språk - språket för den importerade bibelns boknamn - Programmets språk - språket som OpenLP är inställt på - Engelska - använd alltid engelska boknamn + + Application Language + Programmets språk BiblesPlugin.BookNameDialog - + Select Book Name Välj bok - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - Följande bok kunde inte identifieras. Välj motsvarande engelskt namn från listan. - - - + Current name: Nuvarande namn: - + Corresponding name: Motsvarande namn: - + Show Books From Visa böcker från - + Old Testament Gamla testamentet - + New Testament Nya testamentet - + Apocrypha Apokryferna + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + Följande boknamn kan inte kopplas till någon bok. Välj tillhörande namn från listan. + BiblesPlugin.BookNameForm - + You need to select a book. Du måste välja en bok. @@ -936,40 +972,110 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + Bibelredigering + + + + License Details + Licensdetaljer + + + + Version name: + Namn på översättningen: + + + + Copyright: + Copyright: + + + + Permissions: + Tillstånd: + + + + Default Bible Language + Förvalt bibelspråk + + + + Book name language in search field, search results and on display: + Språk på boknamn i sökfält, sökresultat och vid visning: + + + + Global Settings + Globala inställningar + + + + Bible Language + Bibelspråk + + + + Application Language + Programmets språk + + + + English + Engelska + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + Det här är en webb-bibel. +Det går inte att anpassa boknamnen. + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + För att kunna använda anpassade boknamn måste "Bibelspråk" vara valt under fliken "Metadata" eller, om "Globala inställningar" är valt, på bibelsidan i OpenLP-inställningarna. + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... Registrerar bibel och laddar böcker... - + Registering Language... Registrerar språk... - + Importing %s... Importing <book name>... Importerar %s... - + Download Error Fel vid nedladdning - + 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 uppstod problem vid nedladdningen av versurvalet. Kontrollera Internetanslutningen och om problemet återkommer, överväg att rapportera det som en bugg. - + Parse Error Fel vid tolkning - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. Det uppstod problem vid extraherande av vers-urvalet. Om problemet uppstår igen, överväg att rapportera det som en bugg. @@ -1147,17 +1253,17 @@ BiblesPlugin.LanguageDialog - + Select Language Välj språk - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. OpenLP kan inte avgöra den här bibelöversättningens språk. Välj språk från listan nedan. - + Language: Språk: @@ -1173,85 +1279,100 @@ BiblesPlugin.MediaItem - + Quick Enkelt - + Find: Sök efter: - + Book: Bok: - + Chapter: Kapitel: - + Verse: Vers: - + From: Från: - + To: Till: - + Text Search Textsökning - + Second: Alternativ: - + Scripture Reference Bibelreferens - + Toggle to keep or clear the previous results. Växla mellan att behålla eller rensa föregående sökresultat. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? Du kan inte kombinera resultat från sökning i en bibel med resultat från sökning i två biblar. Vill du ta bort dina sökresultat och starta en ny sökning? - + Bible not fully loaded. Bibeln är inte helt laddad. - + Information Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. Den alternativa bibelöversättningen innehåller inte alla verser som finns i huvudöversättningen. Endast verser som finns i båda översättningar kommer att visas. %d verser har utelämnats. + + + Search Scripture Reference... + Sök bibelvers... + + + + Search Text... + Sök text... + + + + Are you sure you want to delete "%s"? + Är du säker på att du vill ta bort "%s"? + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... Importerar %s %s... @@ -1260,12 +1381,12 @@ 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... @@ -1274,149 +1395,149 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory Välj en backupmapp - + Bible Upgrade Wizard Bibeluppgraderingsguiden - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. Den här guiden hjälper dig att uppgradera dina befintliga biblar från en tidigare version av OpenLP 2. Klicka på Nästa för att starta uppgraderingsprocessen. - + Select Backup Directory Välj backupmapp - + Please select a backup directory for your Bibles Välj en mapp för backup av dina biblar - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. Tidigare utgåvor av OpenLP 2.0 kan inte använda uppgraderade biblar. Nu skapas en backup av dina nuvarande biblar så att du enkelt kan kopiera tillbaks filerna till din OpenLP-datamapp om du skulle behöva återgå till en tidigare utgåva av OpenLP. Instruktioner om hur man återställer finns i vår <a href="http://wiki.openlp.org/faq">FAQ</a>. - + Please select a backup location for your Bibles. Välj en mapp för backup av dina biblar. - + Backup Directory: Backupmapp: - + There is no need to backup my Bibles Det är inte nödvändigt med backup av mina biblar - + Select Bibles Välj biblar - + Please select the Bibles to upgrade Välj biblar att uppgradera - + Upgrading Uppgraderar - + Please wait while your Bibles are upgraded. Vänta medan biblarna uppgraderas. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. Backuptagningen lyckades inte. För att kunna göra backup av dina biblar krävs skrivrättigheter i den givna mappen. - + Upgrading Bible %s of %s: "%s" Failed Uppgraderar bibel %s av %s: "%s" Misslyckades - + Upgrading Bible %s of %s: "%s" Upgrading ... Uppgraderar bibel %s av %s: "%s" Uppgraderar ... - + Download Error Fel vid nedladdning - + To upgrade your Web Bibles an Internet connection is required. För att uppgradera dina webb-biblar krävs en Internetanslutning. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... Uppgraderar bibel %s av %s: "%s" Uppgraderar %s ... - + Upgrading Bible %s of %s: "%s" Complete Uppgraderar bibel %s av %s: "%s" Färdig - + , %s failed , %s misslyckades - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. Uppgradering av biblar: %s lyckades%s Observera att verser från webb-biblar kommer att laddas ner vid behov, och därför behövs en Internetanslutning. - + Upgrading Bible(s): %s successful%s Uppgradering av biblar: %s lyckades%s - + Upgrade failed. Uppgradering misslyckades. - + You need to specify a backup directory for your Bibles. Du måste välja en backupmapp för dina biblar. - + Starting upgrade... Startar uppgradering... - + There are no Bibles that need to be upgraded. Det finns inga biblar som behöver uppgraderas. @@ -1490,12 +1611,12 @@ CustomPlugin.CustomTab - + Custom Display Anpassad visning - + Display footer Visa sidfot @@ -1503,42 +1624,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides Redigera anpassade diabilder - + &Title: &Titel: - + Add a new slide at bottom. Lägg till en ny diabild sist. - + Edit the selected slide. Redigera vald diabild. - + Edit all the slides at once. Redigera alla diabilder på en gång. - + Split a slide into two by inserting a slide splitter. Dela diabilden i två genom att lägga till en diabild delare. - + The&me: Te&ma: - + &Credits: &Erkännande: @@ -1553,12 +1674,12 @@ Du måste lägga till minst en diabild - + Ed&it All Red&igera alla - + Insert Slide Infoga sida @@ -1566,7 +1687,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? Är du säker på att du vill ta bort den valda bilden? @@ -1577,60 +1698,60 @@ ImagePlugin - + <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>Bildmodul</strong><br />Bildmodulen erbjuder visning av bilder.<br />En av funktionerna i modulen är möjligheten att gruppera bilder i körschemat, vilket gör visning av flera bilder enklare. Modulen kan även använda OpenLP:s funktion för "tidsstyrd bildväxling" för att skapa ett bildspel som rullar automatiskt. Dessutom kan bilder från modulen användas för att ersätta det aktuella temats bakgrund, så att textbaserade sidor som till exempel sånger visas med den valda bilden som bakgrund i stället för temats bakgrund. - + Image name singular Bild - + Images name plural Bilder - + Images container title Bilder - + Load a new image. Ladda en ny bild. - + Add a new image. Lägg till en ny bild. - + Edit the selected image. Redigera den valda bilden. - + Delete the selected image. Ta bort den valda bilden. - + Preview the selected image. Förhandsgranska den valda bilden. - + Send the selected image live. Visa den valda bilden live. - + Add the selected image to the service. Lägg till den valda bilden i körschemat. @@ -1638,7 +1759,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment Välj bilaga @@ -1646,44 +1767,44 @@ ImagePlugin.MediaItem - + Select Image(s) Välj bild(er) - + 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. - + Missing Image(s) Bild(er) saknas - + The following image(s) no longer exist: %s Följande bild(er) finns inte längre: %s - + The following image(s) no longer exist: %s Do you want to add the other images anyway? Följande bild(er) finns inte längre: %s Vill du lägga till dom andra bilderna ändå? - + There was a problem replacing your background, the image file "%s" no longer exists. Det uppstod ett problem med att ersätta din bakgrund, bildfilen "%s" finns inte längre. - + There was no display item to amend. Det fanns ingen visningspost att ändra. @@ -1691,78 +1812,78 @@ ImagesPlugin.ImageTab - + Background Color Bakgrundsfärg - + Default Color: Standardfärg: - - Provides border where image is not the correct dimensions for the screen when resized. - Visas som fyllning där bilden inte har rätt dimensioner för skärmen. + + Visible background for images with aspect ratio different to screen. + Synlig bakgrund för bilder med annat bildformat än skärmen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. <strong>Mediamodul</strong><br />Mediamodulen gör det möjligt att spela upp ljud och video. - + Media name singular Media - + Media name plural Media - + Media container title Media - + Load new media. Ladda en ny mediafil. - + Add new media. Lägg till media. - + Edit the selected media. Redigera den valda mediaposten. - + Delete the selected media. Ta bort den valda mediaposten. - + Preview the selected media. Förhandsgranska den valda mediaposten. - + Send the selected media live. Visa den valda mediaposten live. - + Add the selected media to the service. Lägg till den valda mediaposten i körschemat. @@ -1810,7 +1931,7 @@ Det fanns ingen visningspost att ändra. - + Unsupported File Ej stödd fil @@ -1828,22 +1949,22 @@ MediaPlugin.MediaTab - + Available Media Players Tillgängliga mediaspelare - + %s (unavailable) %s (ej tillgänglig) - + Player Order Spelarordning - + Allow media player to be overridden Tillåt åsidosättning av vald mediaspelare @@ -1851,7 +1972,7 @@ OpenLP - + Image Files Bildfiler @@ -1873,17 +1994,17 @@ OpenLP.AboutForm - + Credits Lista över medverkande - + License Licens - + Contribute Bidra @@ -1893,17 +2014,17 @@ build %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. Det här programmet är fri mjukvara; du får sprida den vidare och/eller ändra i den under villkoren i GNU General Public License så som publicerade av Free Software Foundation; version 2 av licensen. - + 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. Det här programmet ges ut i hopp om att det kan vara användbart, men UTAN NÅGON GARANTI; inte ens någon underförstådd garanti vid köp eller lämplighet för ett särskilt ändamål. Se nedan för mer detaljer. - + Project Lead %s @@ -2028,7 +2149,7 @@ eftersom han har gjort oss fria. - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -2045,7 +2166,7 @@ OpenLP utvecklas och underhålls av frivilliga. Om du vill se mer fri kristen mjukvara utvecklad, klicka gärna på knappen nedan för att se hur du kan bidra. - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s Copyright © 2004-2012 %s @@ -2055,87 +2176,87 @@ OpenLP.AdvancedTab - + UI Settings Inställningar för användargränssnitt - + Number of recent files to display: Antal tidigare körscheman att visa: - + Remember active media manager tab on startup Kom ihåg aktiv mediaflik vid start - + Double-click to send items straight to live Dubbelklicka för att visa poster live - + Expand new service items on creation Expandera nya poster i körschemat vid skapandet - + Enable application exit confirmation Bekräfta för att avsluta programmet - + Mouse Cursor Muspekare - + Hide mouse cursor when over display window Dölj muspekaren över visningsfönstret - + Default Image Standardbild - + Background color: Bakgrundsfärg: - + Image file: Bildfil: - + Open File Öppna fil - + Advanced Avancerat - + Preview items when clicked in Media Manager Förhandsgranska poster vid klick i mediahanteraren - + Click to select a color. Klicka för att välja en färg. - + Browse for an image file to display. Välj en bildfil att visa. - + Revert to the default OpenLP logo. Återställ till OpenLP:s standardlogotyp. @@ -2147,137 +2268,221 @@ Körschema %Y-%m-%d %H-%M - + Default Service Name Förvalt namn på körschema - + Enable default service name Aktivera förvalt namn på körschema - + Date and Time: Datum och tid: - + Monday Måndag - + Tuesday Tisdag - + Wednesday Onsdag - + Thurdsday Torsdag - + Friday Fredag - + Saturday Lördag - + Sunday Söndag - + Now Nu - + Time when usual service starts. Tid när schemat vanligen börjar. - + Name: Namn: - + Consult the OpenLP manual for usage. Läs i OpenLP-manualen för information om funktionen. - + Revert to the default service name "%s". Återställ till körschemats standardnamn "%s". - + Example: Exempel: - + X11 X11 - + Bypass X11 Window Manager Kringgå X11:s fönsterhanterare - + Syntax error. Syntaxfel. + + + Data Location + Datalagring + + + + Current path: + Nuvarande sökväg: + + + + Custom path: + Anpassad sökväg: + + + + Browse for new data file location. + Bläddra efter ny plats för datalagring. + + + + Set the data location to the default. + Återställ plats för datalagring till standardinställningen. + + + + Cancel + Avbryt + + + + Cancel OpenLP data directory location change. + Avbryt ändring av plats för OpenLP:s datalagring. + + + + Copy data to new location. + Kopiera data till ny plats. + + + + Copy the OpenLP data files to the new location. + Kopiera OpenLP:s data till den nya platsen. + + + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. + <strong>VARNING:</strong> Den nya datakatalogen innehåller OpenLP-datafiler. Dessa filer kommer att ersättas vid kopieringen. + + + + Data Directory Error + Datakatalogfel + + + + Select Data Directory Location + Välj plats för datakatalog + + + + Confirm Data Directory Change + Bekräfta ändring av datakatalog + + + + Reset Data Directory + Återställ datakatalog + + + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. + Är du säker på att du vill ändra platsen för OpenLP:s data till standardinställningen? + +Den nya platsen kommer att användas efter att OpenLP har avslutats. + + + + Overwrite Existing Data + Skriv över befintlig data + OpenLP.ExceptionDialog - + Error Occurred Fel uppstod - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. Hoppsan! OpenLP stötte på ett problem som inte hanterades. Texten i rutan nedan innehåller information som kan vara användbar för utvecklarna av OpenLP, så e-posta den gärna till bugs@openlp.org, tillsammans med en detaljerad beskrivning av vad du gjorde när problemet uppstod. - + Send E-Mail Skicka e-post - + Save to File Spara till fil - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) Skriv gärna en beskrivning av vad du gjorde för att få det här felet (minst 20 tecken) - + Attach File Lägg till fil - + Description characters to enter : %s Beskrivningstecken att ange: %s @@ -2285,24 +2490,24 @@ OpenLP.ExceptionForm - + Platform: %s Plattform: %s - + Save Crash Report Spara kraschrapport - + Text files (*.txt *.log *.text) Textfiler (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2333,7 +2538,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2469,17 +2674,17 @@ Standardinställningar - + Downloading %s... Hämtar %s... - + Download complete. Click the finish button to start OpenLP. Nedladdning färdig. Klicka på Slutför för att starta OpenLP. - + Enabling selected plugins... Aktivera valda moduler... @@ -2496,7 +2701,7 @@ Sample Songs - Fria sånger + Exempelsånger @@ -2506,7 +2711,7 @@ Sample Bibles - Fria bibelöversättningar + Exempelbiblar @@ -2516,12 +2721,12 @@ Sample Themes - Fria teman + Exempelteman Select and download sample themes. - Välj och ladda ner färdiga teman. + Välj och ladda ner exempelteman. @@ -2549,32 +2754,32 @@ Den här guiden hjälper dig att ställa in OpenLP före första användningen. Klicka på Nästa för att starta. - + Setting Up And Downloading Ställer in och laddar ner - + Please wait while OpenLP is set up and your data is downloaded. Vänta medan OpenLP ställs in och din data laddas ner. - + Setting Up Ställer in - + Click the finish button to start OpenLP. Klicka på Slutför för att starta OpenLP. - + Download complete. Click the finish button to return to OpenLP. Nedladdning färdig. Klicka på Slutför för att återvända till OpenLP. - + Click the finish button to return to OpenLP. Klicka på Slutför för att återvända till OpenLP. @@ -2584,78 +2789,78 @@ Anpassade sidor + + Finish + Slutför + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. - Ingen Internetanslutning kunde hittas. Kom igång-guiden behöver en anslutning till Internet för att kunna ladda ner fria sånger, biblar och teman. Klicka Slutför för att starta OpenLP med grundinställningar och utan hämtad data. + Ingen Internetanslutning hittades. Kom igång-guiden behöver en Internetanslutning för att kunna ladda ner ett urval av sånger, biblar och teman. Klicka på knappen Slutför nu för att starta OpenLP med grundinställningarna och utan data. -För att köra kom igång-guiden och importera den här datan senare, kontrollera din Internetanslutning och kör den här guiden genom att välja "Verktyg/Kör kom igång-guide" från OpenLP. +För att köra Kom igång-guiden igen och importera exempeldatan senare, kontrollera din Internetanslutning och starta om den här guiden genom att välja "Verktyg/Kör kom igång-guiden" från OpenLP. -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. -För att avbryta kom igång-guiden helt (och inte starta OpenLP), klicka Avbryt nu. - - - - Finish - Slutför +För att avbryta Kom igång-guiden helt (och inte starta OpenLP), klicka på knappen Avbryt nu. OpenLP.FormattingTagDialog - + Configure Formatting Tags Konfigurera format-taggar - + Edit Selection Redigera val - + Save Spara - + Description Beskrivning - + Tag Tagg - + Start tag Start-tagg - + End tag Slut-tagg - + Tag Id Tagg-id - + Start HTML Start-HTML - + End HTML Slut-HTML @@ -2663,32 +2868,32 @@ OpenLP.FormattingTagForm - + Update Error Fel vid uppdatering - + Tag "n" already defined. Taggen "n" finns redan. - + New Tag Ny tagg - + <HTML here> <HTML här> - + </and here> </och här> - + Tag %s already defined. Taggen %s finns redan. @@ -2696,82 +2901,82 @@ OpenLP.FormattingTags - + Red Röd - + Black Svart - + Blue Blå - + Yellow Gul - + Green Grön - + Pink Rosa - + Orange Orange - + Purple Lila - + White Vit - + Superscript Upphöjt - + Subscript Nedsänkt - + Paragraph Stycke - + Bold Fet - + Italics Kursiv - + Underline Understruken - + Break Radbrytning @@ -2779,180 +2984,170 @@ OpenLP.GeneralTab - + General Allmänt - + Monitors Skärmar - + Select monitor for output display: Välj skärm för bildvisning: - + Display if a single screen Visa även på enkel skärm - + Application Startup Programstart - + Show blank screen warning Visa varning vid tom skärm - + Automatically open the last service Öppna det senaste körschemat automatiskt - + Show the splash screen Visa startbilden - + Application Settings Programinställningar - + Prompt to save before starting a new service Fråga om att spara innan ett nytt körschema skapas - + Automatically preview next item in service Förhandsgranska nästa post i körschemat automatiskt - + sec sekunder - + CCLI Details CCLI-detaljer - + SongSelect username: SongSelect användarnamn: - + SongSelect password: SongSelect lösenord: - + X X - + Y Y - + Height Höjd - + Width Bredd - + Check for updates to OpenLP Sök efter uppdateringar till OpenLP - + Unblank display when adding new live item Lägg ut bilden direkt när en ny live-bild läggs till - + Timed slide interval: Tidsstyrd bildväxling: - + Background Audio Bakgrundsljud - + Start background audio paused Starta bakgrundsljud pausat - + Service Item Slide Limits Bildväxlingsgräns - - &End Slide - &Slutbild - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - Upp- och nerpil stannar på första respektive sista bilden i varje körschemapost. - - - - &Wrap Slide - &Börja om + + Override display position: + Manuell skärmposition: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. - Upp- och nerpil börjar om när slutet på en körschemapost är nådd. + + Repeat track list + Repetera spellistan - - &Next Item - &Nästa post + + Behavior of next/previous on the last/first slide: + Inställning för nästa/föregående vid sista/första bilden: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. - Upp- och nerpil går vidare till föregående respektive nästa post i körschemat när slutet på en post är nådd. + + &Remain on Slide + &Stanna på bilden - - Override display position: - Manuell skärmposition: + + &Wrap around + Börja &om - - Repeat track list - Repetera spellistan + + &Move to next/previous service item + &Gå till nästa/föregående post i körschemat 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. @@ -2968,287 +3163,287 @@ OpenLP.MainWindow - + &File &Arkiv - + &Import &Importera - + &Export &Exportera - + &View &Visa - + M&ode &Läge - + &Tools &Verktyg - + &Settings &Inställningar - + &Language &Språk - + &Help &Hjälp - + Media Manager Mediahanterare - + Service Manager Körschema - + Theme Manager Temahanterare - + &New &Nytt - + &Open &Öppna - + Open an existing service. Öppna ett befintligt körschema. - + &Save &Spara - + Save the current service to disk. Spara det nuvarande körschemat till disk. - + Save &As... Spara s&om... - + Save Service As Spara körschema som - + Save the current service under a new name. Spara det nuvarande körschemat under ett nytt namn. - + E&xit A&vsluta - + Quit OpenLP Avsluta OpenLP - + &Theme &Tema - + &Configure OpenLP... &Konfigurera OpenLP... - + &Media Manager &Mediahanterare - + Toggle Media Manager Växla mediahanterare - + Toggle the visibility of the media manager. Växla visning av mediahanteraren. - + &Theme Manager &Temahanterare - + Toggle Theme Manager Växla temahanteraren - + Toggle the visibility of the theme manager. Växla visning av temahanteraren. - + &Service Manager &Körschema - + Toggle Service Manager Växla körschema - + Toggle the visibility of the service manager. Växla visning av körschemat. - + &Preview Panel &Förhandsgranskningpanel - + Toggle Preview Panel Växla förhandsgranskning - + Toggle the visibility of the preview panel. Växla visning av förhandsgranskning. - + &Live Panel Li&ve - + Toggle Live Panel Växla live-rutan - + Toggle the visibility of the live panel. Växla visning av live-rutan. - + &Plugin List &Modullista - + List the Plugins Lista modulerna - + &User Guide &Bruksanvisning - + &About &Om - + More information about OpenLP Mer information om OpenLP - + &Online Help &Hjälp online - + &Web Site &Webbplats - + Use the system language, if available. Använd systemspråket om möjligt. - + Set the interface language to %s Sätt användargränssnittets språk till %s - + Add &Tool... Lägg till &verktyg... - + Add an application to the list of tools. Lägg till en applikation i verktygslistan. - + &Default &Standard - + Set the view mode back to the default. Återställ visningslayouten till standardinställningen. - + &Setup &Förberedelse - + Set the view mode to Setup. Ställ in visningslayouten förberedelseläge. - + &Live &Live - + Set the view mode to Live. Ställ in visningslayouten till live-läge. - + 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/. @@ -3257,108 +3452,108 @@ Du kan ladda ner den senaste versionen från http://openlp.org/. - + OpenLP Version Updated Ny version av OpenLP - + OpenLP Main Display Blanked OpenLPs huvudbild släckt - + The Main Display has been blanked out Huvudbilden har släckts - + Default Theme: %s Standardtema: %s - + English Please add the name of your language here Svenska - + Configure &Shortcuts... Konfigurera &genvägar... - + Close OpenLP Avsluta OpenLP - + Are you sure you want to close OpenLP? Är du säker på att du vill avsluta OpenLP? - + Open &Data Folder... Öppna &datamapp... - + Open the folder where songs, bibles and other data resides. Öppna mappen där sånger, biblar och annan data lagras. - + &Autodetect Detektera &automatiskt - + Update Theme Images Uppdatera temabilder - + Update the preview images for all themes. Uppdatera förhandsgranskningsbilder för alla teman. - + Print the current service. Skriv ut den nuvarande körschemat. - + &Recent Files Senaste &körscheman - + L&ock Panels L&ås paneler - + Prevent the panels being moved. Förhindra att panelerna flyttas. - + Re-run First Time Wizard Kör kom igång-guiden - + Re-run the First Time Wizard, importing songs, Bibles and themes. Kör kom igång-guiden och importera sånger, biblar och teman. - + Re-run First Time Wizard? Kör kom igång-guiden? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. @@ -3367,43 +3562,43 @@ Om du kör den här guiden kan din nuvarande konfiguration av OpenLP komma att ändras, sånger eventuellt läggas till din befintliga sånglista, och standardtemat bytas. - + Clear List Clear List of recent files Rensa listan - + Clear the list of recent files. Rensa listan med senaste körscheman. - + Configure &Formatting Tags... Konfigurera &format-taggar... - + Export OpenLP settings to a specified *.config file Exportera OpenLP-inställningar till en given *.config-fil - + Settings Inställningar - + Import OpenLP settings from a specified *.config file previously exported on this or another machine Importera OpenLP-inställningar från en given *.config-fil som tidigare har exporterats på den här datorn eller någon annan - + Import settings? Importera inställningar? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3416,45 +3611,50 @@ Att importera inställningar kan leda till oväntade beteenden eller att OpenLP avslutas onormalt. - + Open File Öppna fil - + OpenLP Export Settings Files (*.conf) OpenLP-inställningsfiler (*.conf) - + Import settings Importera inställningar - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. OpenLP kommer nu att avslutas. Importerade inställningar kommer att tillämpas nästa gång du startar OpenLP. - + Export Settings File Exportera inställningsfil - + OpenLP Export Settings File (*.conf) OpenLP-inställningsfiler (*.conf) + + + New Data Directory Error + Ny datakatalog-fel + OpenLP.Manager - + Database Error Databasfel - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s @@ -3463,7 +3663,7 @@ Databas: %s - + OpenLP cannot load your database. Database: %s @@ -3475,74 +3675,74 @@ OpenLP.MediaManagerItem - + No Items Selected Inga poster valda - + &Add to selected Service Item &Lägg till i vald post i körschemat - + You must select one or more items to preview. Du måste välja en eller flera poster att förhandsgranska. - + You must select one or more items to send live. Du måste välja en eller flera poster att visa live. - + You must select one or more items. Du måste välja en eller flera poster. - + You must select an existing service item to add to. Du måste välja en befintlig post i körschemat att lägga till i. - + Invalid Service Item Ogiltig körschemapost - + You must select a %s service item. Du måste välja en post av typen %s i körschemat. - + You must select one or more items to add. Du måste välja en eller flera poster att lägga till. - + No Search Results Inga sökresultat - + Invalid File Type Ogiltig filtyp - + Invalid File %s. Suffix not supported Ogiltig fil %s. Filändelsen stöds ej - + &Clone &Klona - + Duplicate files were found on import and were ignored. Dubblettfiler hittades vid importen och ignorerades. @@ -3550,12 +3750,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. <lyrics>-tagg saknas. - + <verse> tag is missing. <verse>-tagg saknas. @@ -3563,27 +3763,27 @@ OpenLP.PluginForm - + Plugin List Modullista - + Plugin Details Moduldetaljer - + Status: Status: - + Active Aktiv - + Inactive Inaktiv @@ -3606,12 +3806,12 @@ OpenLP.PrintServiceDialog - + Fit Page Passa sidan - + Fit Width Passa bredden @@ -3619,7 +3819,7 @@ OpenLP.PrintServiceForm - + Options Alternativ @@ -3634,47 +3834,47 @@ Kopiera som HTML - + Zoom In Zooma in - + Zoom Out Zooma ut - + Zoom Original Återställ zoom - + Other Options Övriga alternativ - + Include slide text if available Inkludera sidtext om tillgänglig - + Include service item notes Inkludera anteckningar - + Include play length of media items Inkludera spellängd för mediaposter - + Add page break before each text item Lägg till sidbrytning före varje textpost - + Service Sheet Körschema @@ -3684,12 +3884,12 @@ Skriv ut - + Title: Titel: - + Custom Footer Text: Anpassad sidfot: @@ -3697,12 +3897,12 @@ OpenLP.ScreenList - + Screen Skärm - + primary primär @@ -3710,12 +3910,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s <strong>Start</strong>: %s - + <strong>Length</strong>: %s <strong>Längd</strong>: %s @@ -3723,7 +3923,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item Arrangera om körschemapost @@ -3731,82 +3931,82 @@ OpenLP.ServiceManager - + Move to &top Lägg &först - + Move item to the top of the service. Lägg posten först i körschemat. - + Move &up Flytta &upp - + Move item up one position in the service. Flytta upp posten ett steg i körschemat. - + Move &down Flytta &ner - + Move item down one position in the service. Flytta ner posten ett steg i körschemat. - + Move to &bottom Lägg &sist - + Move item to the end of the service. Lägg posten sist i körschemat. - + &Delete From Service &Ta bort från körschemat - + Delete the selected item from the service. Ta bort den valda posten från körschemat. - + &Add New Item &Lägg till ny post - + &Add to Selected Item Lägg till i &vald post - + &Edit Item &Redigera post - + &Reorder Item Arrangera &om post - + &Notes &Anteckningar - + &Change Item Theme &Byt postens tema @@ -3828,112 +4028,107 @@ Filen är inte ett giltigt körschema. - + Missing Display Handler Visningsmodul saknas - + Your item cannot be displayed as there is no handler to display it Posten kan inte visas eftersom det inte finns någon visningsmodul för att visa den - + Your item cannot be displayed as the plugin required to display it is missing or inactive Posten kan inte visas eftersom modulen som krävs för att visa den saknas eller är inaktiv - + &Expand all &Expandera alla - + Expand all the service items. Expandera alla poster i körschemat. - + &Collapse all &Fäll ihop alla - + Collapse all the service items. Fäll ihop alla poster i körschemat. - + Open File Öppna fil - + Moves the selection down the window. Flyttar urvalet neråt i fönstret. - + Move up Flytta upp - + Moves the selection up the window. Flyttar urvalet uppåt i fönstret. - + Go Live Lägg ut live-bilden - + Send the selected item to Live. Visa den valda posten live. - + &Start Time &Starttid - + Show &Preview &Förhandsgranska - - Show &Live - Visa &Live - - - + Modified Service Körschemat ändrat - + The current service has been modified. Would you like to save this service? Det nuvarande körschemat har ändrats. Vill du spara körschemat? - + Custom Service Notes: Egna körschemaanteckningar: - + Notes: Anteckningar: - + Playing time: Speltid: - + Untitled Service Nytt körschema @@ -3958,17 +4153,17 @@ Korrupt fil - + Load an existing service. Ladda ett befintligt körschema. - + Save this service. Spara körschemat. - + Select a theme for the service. Välj ett tema för körschemat. @@ -3978,7 +4173,7 @@ Filen är antingen korrupt eller inte en OpenLP 2.0 körschemafil. - + Service File Missing Körschemafil saknas @@ -4002,11 +4197,21 @@ Service copy only Endast kopian i körschemat + + + Error Saving File + Fel vid filsparande + + + + There was an error saving your file. + Det inträffade ett fel när filen skulle sparas. + OpenLP.ServiceNoteForm - + Service Item Notes Körschemaanteckningar @@ -4022,67 +4227,67 @@ OpenLP.ShortcutListDialog - + Action Åtgärd - + Shortcut Genväg - + Duplicate Shortcut Dubblett - + The shortcut "%s" is already assigned to another action, please use a different shortcut. Genvägen "%s" är redan kopplad till en annan åtgärd; välj en annan genväg. - + Alternate Alternativ - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. Välj en åtgärd och använd knapparna nedan för att skapa en ny primär eller alternativ genväg. - + Default Standard - + Custom Anpassad - + Capture shortcut. Skapa genväg. - + Restore the default shortcut of this action. Återställ till standardgenvägen för den här åtgärden. - + Restore Default Shortcuts Återställ till standardgenvägar - + Do you want to restore all shortcuts to their defaults? Vill du återställa alla genvägar till standardvärdena? - + Configure Shortcuts Konfigurera genvägar @@ -4090,177 +4295,172 @@ OpenLP.SlideController - + Hide Dölj - + Go To Gå till - + Blank Screen Släck skärm - + Blank to Theme Släck till tema - + Show Desktop Visa skrivbord - + Previous Service Föregående post - + Next Service Nästa post - + Escape Item Avbryt post - + Move to previous. Flytta till föregående. - + Move to next. Flytta till nästa. - + Play Slides Sidvisning - + Delay between slides in seconds. Tid i sekunder mellan sidorna. - + Move to live. Visa live. - + Add to Service. Lägg till i körschema. - + Edit and reload song preview. Redigera och uppdatera förhandsvisning. - + Start playing media. Starta uppspelning. - + Pause audio. Pausa ljud. - + Pause playing media. Pausa spelande media. - + Stop playing media. Stoppa spelande media. - + Video position. Videoposition. - + Audio Volume. Ljudvolym. - + Go to "Verse" Gå till "Vers" - + Go to "Chorus" Gå till "Refräng" - + Go to "Bridge" Gå till "Stick" - + Go to "Pre-Chorus" Gå till "Brygga" - + Go to "Intro" Gå till "Intro" - + Go to "Ending" - Gå till "Slut" + Gå till "Avslut" - + Go to "Other" Gå till "Övrigt" - + Previous Slide Föregående bild - + Next Slide Nästa bild - + Pause Audio Pausa ljud - + Background Audio Bakgrundsljud - - Next Track - Nästa spår - - - + Go to next audio track. Gå till nästa ljudspår - + Tracks Spår @@ -4336,17 +4536,17 @@ Starttiden är efter mediapostens slut - + Theme Layout Temalayout - + The blue box shows the main area. Den blåa rutan visar huvudytan. - + The red box shows the footer. Den röda rutan visar sidfoten. @@ -4354,32 +4554,32 @@ OpenLP.ThemeForm - + Select Image Välj bild - + Theme Name Missing Temanamn saknas - + There is no name for this theme. Please enter one. Det finns inget namn på temat. Var vänlig att ange ett. - + Theme Name Invalid Ogiltigt temanamn - + Invalid theme name. Please enter one. Ogiltigt temanamn. Ange ett giltigt namn. - + (approximately %d lines per slide) (ungefär %d rader per sida) @@ -4387,193 +4587,193 @@ OpenLP.ThemeManager - + Create a new theme. Skapa ett nytt tema. - + Edit Theme Redigera tema - + Edit a theme. Redigera ett tema. - + Delete Theme Ta bort tema - + Delete a theme. Ta bort ett tema. - + Import Theme Importera tema - + Import a theme. Importera tema. - + Export Theme Exportera tema - + Export a theme. Exportera tema. - + &Edit Theme &Redigera tema - + &Delete Theme &Ta bort tema - + Set As &Global Default Ange som &globalt tema - + %s (default) %s (standard) - + You must select a theme to edit. Du måste välja ett tema att redigera. - + You are unable to delete the default theme. Du kan inte ta bort standardtemat. - + Theme %s is used in the %s plugin. Temat %s används i modulen %s. - + You have not selected a theme. Du har inte valt ett tema. - + Save Theme - (%s) Spara tema - (%s) - + Theme Exported Tema exporterat - + Your theme has been successfully exported. Temat exporterades utan problem. - + Theme Export Failed Temaexport misslyckades - + Your theme could not be exported due to an error. Ett fel inträffade när temat skulle exporteras. - + Select Theme Import File Välj temafil - + File is not a valid theme. Filen är inte ett giltigt tema. - + &Copy Theme &Kopiera tema - + &Rename Theme &Byt namn på tema - + &Export Theme &Exportera tema - + You must select a theme to rename. Du måste välja ett tema att byta namn på. - + Rename Confirmation Bekräftelse av namnbyte - + Rename %s theme? Byt namn på temat %s? - + You must select a theme to delete. Du måste välja ett tema att ta bort. - + Delete Confirmation Borttagningsbekräftelse - + Delete %s theme? Ta bort temat %s? - + Validation Error Valideringsfel - + A theme with this name already exists. Ett tema med det här namnet finns redan. - + OpenLP Themes (*.theme *.otz) OpenLP-teman (*.theme *.otz) - + Copy of %s Copy of <theme name> Kopia av %s - + Theme Already Exists Tema finns redan @@ -4581,272 +4781,272 @@ OpenLP.ThemeWizard - + Theme Wizard Temaguiden - + Welcome to the Theme Wizard Välkommen till temaguiden - + Set Up Background Ställ in bakgrund - + Set up your theme's background according to the parameters below. Ställ in temats bakgrund enligt parametrarna nedan. - + Background type: Bakgrundstyp: - + Solid Color Solid färg - + Gradient Gradient - + Color: Färg: - + Gradient: Gradient: - + Horizontal Horisontell - + Vertical Vertikal - + Circular Cirkulär - + Top Left - Bottom Right Uppe vänster - nere höger - + Bottom Left - Top Right Nere vänster - uppe höger - + Main Area Font Details Huvudytans tecken - + Define the font and display characteristics for the Display text Definiera font och egenskaper för visningstexten - + Font: Teckensnitt: - + Size: Storlek: - + Line Spacing: Radavstånd: - + &Outline: &Kant: - + &Shadow: Sk&ugga: - + Bold Fetstil - + Italic Kursiv - + Footer Area Font Details Sidfotens tecken - + Define the font and display characteristics for the Footer text Definiera font och egenskaper för sidfotstexten - + Text Formatting Details Textformatering - + Allows additional display formatting information to be defined Ytterligare inställningsmöjligheter för visningsformatet - + Horizontal Align: Horisontell justering: - + Left Vänster - + Right Höger - + Center Centrera - + Output Area Locations Visningsytornas positioner - + Allows you to change and move the main and footer areas. Låter dig ändra och flytta huvud- och sidfotsytorna. - + &Main Area &Huvudyta - + &Use default location Använd &standardposition - + X position: X-position: - + px px - + Y position: Y-position: - + Width: Bredd: - + Height: Höjd: - + Use default location Använd standardposition - + Save and Preview Spara och förhandsgranska - + View the theme and save it replacing the current one or change the name to create a new theme Visa temat och spara det under samma namn för att ersätta det befintliga, eller under nytt namn för att skapa ett nytt tema - + Theme name: Temanamn: - + Edit Theme - %s Redigera tema - %s - + 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. Den här guiden hjälper dig att skapa och redigera dina teman. Klicka på Nästa för att börja processen med att ställa in bakgrund. - + Transitions: Övergångar: - + &Footer Area &Sidfotsyta - + Starting color: Startfärg: - + Ending color: Slutfärg: - + Background color: Bakgrundsfärg: - + Justify Marginaljustera - + Layout Preview Förhandsgranskning av layout - + Transparent Transparent @@ -4854,47 +5054,47 @@ OpenLP.ThemesTab - + Global Theme Globalt tema - + Theme Level Temanivå - + S&ong Level &Sångnivå - + 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. Använd temat för varje sång i databasen indviduellt. Om en sång inte har ett associerat tema, använd körschemats tema. Om körschemat inte har ett tema, använd det globala temat. - + &Service Level &Körschemanivå - + 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. Använd temat för körschemat och ignorera sångernas individuella teman. Om körschemat inte har ett tema, använd det globala temat. - + &Global Level &Global nivå - + Use the global theme, overriding any themes associated with either the service or the songs. Använd det globala temat och ignorera teman associerade med körschemat eller sångerna. - + Themes Teman @@ -4978,239 +5178,239 @@ pt - + Image Bild - + Import Importera - + Live Live - + Live Background Error Live-bakgrundsproblem - + Load Ladda - + Middle Mitten - + New Nytt - + New Service Nytt körschema - + New Theme Nytt tema - + No File Selected Singular Ingen fil vald - + No Files Selected Plural Inga filer valda - + No Item Selected Singular Ingen post vald - + No Items Selected Plural Inga poster valda - + openlp.org 1.x openlp.org 1.x - + OpenLP 2.0 OpenLP 2.0 - + Preview Förhandsgranskning - + Replace Background Ersätt bakgrund - + Reset Background Återställ bakgrund - + s The abbreviated unit for seconds s - + Save && Preview Spara && förhandsgranska - + Search Sök - + You must select an item to delete. Du måste välja en post att ta bort. - + You must select an item to edit. Du måste välja en post att redigera. - + Save Service Spara körschema - + Service Körschema - + Start %s Starta %s - + Theme Singular Tema - + Themes Plural Teman - + Top Toppen - + Version Version - + Delete the selected item. Ta bort den valda posten. - + Move selection up one position. Flytta upp urvalet ett steg. - + Move selection down one position. Flytta ner urvalet ett steg. - + &Vertical Align: &Vertikal justering: - + Finished import. Importen är slutförd. - + Format: Format: - + Importing Importerar - + Importing "%s"... Importerar "%s"... - + Select Import Source Välj importkälla - + Select the import format and the location to import from. Välj importformat och plats att importera från. - + 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. openlp.org 1.x-import är inaktiverad på grund av en saknad Python-modul. Om du vill göra den här importen måste du installera modulen "python-sqlite". - + Open %s File Öppna %s-fil - + %p% %p % - + Ready. Klar. - + Starting import... Startar import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong Du måste ange åtminstone en %s-fil att importera från. @@ -5226,7 +5426,7 @@ Välkommen till sångexportguiden - + Welcome to the Song Import Wizard Välkommen till sångimportguiden @@ -5314,53 +5514,53 @@ h - + Layout style: Layout: - + Live Toolbar Live-verktygsrad - + m The abbreviated unit for minutes min - + OpenLP is already running. Do you wish to continue? OpenLP körs redan. Vill du fortsätta? - + Settings Inställningar - + Tools Verktyg - + Unsupported File Okänd filtyp - + Verse Per Slide En vers per sida - + Verse Per Line En vers per rad - + View Visa @@ -5375,42 +5575,37 @@ XML-syntaxfel - + View Mode Visningsläge - + Open service. Öppna körschema. - + Print Service Skriv ut körschema - + Replace live background. Ersätt live-bakgrund. - + Reset live background. Återställ live-bakgrund. - - &Split - &Dela - - - + Split a slide into two only if it does not fit on the screen as one slide. Dela en sida i två bara om den inte ryms som en sida på skärmen. - + Welcome to the Bible Upgrade Wizard Välkommen till bibeluppgraderingsguiden @@ -5420,53 +5615,105 @@ Bekräfta borttagning - + Play Slides in Loop Kör visning i slinga - + Play Slides to End Kör visning till slutet - + Stop Play Slides in Loop Stoppa slingvisning - + Stop Play Slides to End Stoppa visning till slutet - + Next Track Nästa spår + + + Search Themes... + Search bar place holder text + Sök teman... + + + + Optional &Split + &Brytanvisning + + + + Invalid Folder Selected + Singular + Felaktig katalog vald + + + + Invalid File Selected + Singular + Felaktig fil vald + + + + Invalid Files Selected + Plural + Felaktiga filer valda + + + + No Folder Selected + Singular + Ingen katalog vald + + + + Open %s Folder + Öppna %s-katalog + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + Du måste ange en %s-fil att importera från. + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + Du måste ange en %s-katalog att importera från. + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items %1 och %2 - + %1, and %2 Locale list separator: end %1, och %2 - + %1, %2 Locale list separator: middle %1, %2 - + %1, %2 Locale list separator: start %1, %2 @@ -5475,50 +5722,50 @@ PresentationPlugin - + <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>Presentationsmodul</strong><br />Presentationsmodulen ger möjlighet att visa presentationer med en mängd olika program. Val av presentationsprogram görs av användaren i en flervalslista. - + Presentation name singular Presentation - + Presentations name plural Presentationer - + Presentations container title Presentationer - + Load a new presentation. Ladda en ny presentation. - + Delete the selected presentation. Ta bort den valda presentationen. - + Preview the selected presentation. Förhandsgranska den valda presentationen. - + Send the selected presentation live. Visa den valda presentationen live. - + Add the selected presentation to the service. Lägg till den valda presentationen i körschemat. @@ -5526,70 +5773,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) Välj presentation(er) - + Automatic Automatiskt - + Present using: Presentera med: - + File Exists Fil finns redan - + A presentation with that filename already exists. En presentation med det namnet finns redan. - + This type of presentation is not supported. Den här presentationstypen stöds inte. - + Presentations (%s) Presentationer (%s) - + Missing Presentation Presentation saknas - - The Presentation %s no longer exists. - Presentationen %s finns inte längre. + + The presentation %s is incomplete, please reload. + Presentationen %s är inte komplett. Försök att ladda om den. - - The Presentation %s is incomplete, please reload. - Presentationen %s är inte komplett; ladda om den. + + The presentation %s no longer exists. + Presentationen %s finns inte längre. PresentationPlugin.PresentationTab - + Available Controllers Tillgängliga presentationsprogram - + %s (unavailable) %s (inte tillgängligt) - + Allow presentation application to be overridden Tillåt åsidosättning av valt presentationsprogram @@ -5623,135 +5870,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote OpenLP 2.0 fjärrstyrning - + OpenLP 2.0 Stage View OpenLP 2.0 scenvisning - + Service Manager Körschema - + Slide Controller Visningskontroll - + Alerts Meddelanden - + Search Sök - - Back - Tillbaka - - - + Refresh Uppdatera - + Blank Släck - + Show Visa - + Prev Förra - + Next Nästa - + Text Text - + Show Alert Visa meddelande - + Go Live Lägg ut bilden - + No Results Inga resultat - + Options Alternativ - + Add to Service Lägg till i körschema + + + Home + Hem + + + + Theme + Tema + + + + Desktop + Skrivbord + + + + Add &amp; Go to Service + Lägg till &amp; gå till körschema + RemotePlugin.RemoteTab - + Serve on IP address: Kör på IP-adress: - + Port number: Portnummer: - + Server Settings Serverinställningar - + Remote URL: Fjärrstyrningsadress: - + Stage view URL: Scenvisningsadress: - + Display stage time in 12h format Visa scentiden i 12-timmarsformat - + Android App Android-app - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. Skanna QR-koden eller välj <a href="https://market.android.com/details?id=org.openlp.android">ladda ner</a> för att installera Android-appen från butiken. @@ -5759,85 +6021,85 @@ SongUsagePlugin - + &Song Usage Tracking &Sångloggning - + &Delete Tracking Data &Ta bort loggdata - + Delete song usage data up to a specified date. Ta bort sånganvändningsdata fram till ett givet datum. - + &Extract Tracking Data &Extrahera loggdata - + Generate a report on song usage. Generera en rapport över sånganvändning. - + Toggle Tracking Växla loggning - + Toggle the tracking of song usage. Växla sångloggning på/av. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. <strong>Sånganvändningsmodul</strong><br />Den här modulen loggar användning av sångerna som visas. - + SongUsage name singular Sånganvändning - + SongUsage name plural Sånganvändning - + SongUsage container title Sånganvändning - + Song Usage Sånganvändning - + Song usage tracking is active. Sångloggning är aktiv. - + Song usage tracking is inactive. Sångloggning är inaktiv. - + display visa - + printed utskriven @@ -5845,7 +6107,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data Ta bort sånganvändningsdata @@ -5870,7 +6132,7 @@ All vald data har tagits bort. - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. Välj datum fram till vilket sånganvändningsdatan ska tas bort. All data loggad före det datumet kommer att tas bort permanent. @@ -5878,42 +6140,42 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction Sånganvändningsutdrag - + Select Date Range Välj datumspann - + to till - + Report Location Målmapp - + Output File Location Lagringssökväg - + usage_detail_%s_%s.txt användning_%s_%s.txt - + Report Creation Rapportskapande - + Report %s has been successfully created. @@ -5922,12 +6184,12 @@ skapades utan problem. - + Output Path Not Selected Målmapp inte vald - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. Du måste välja en giltig målmapp för sångrapporten. Välj en befintlig sökväg på datorn. @@ -5965,82 +6227,82 @@ Indexerar om sånger... - + Arabic (CP-1256) Arabiska (CP-1256) - + Baltic (CP-1257) Baltiska (CP-1257) - + Central European (CP-1250) Centraleuropeisk (CP-1250) - + Cyrillic (CP-1251) Kyrilliska (CP-1251) - + Greek (CP-1253) Grekiska (CP-1253) - + Hebrew (CP-1255) Hebreiska (CP-1255) - + Japanese (CP-932) Japanska (CP-932) - + Korean (CP-949) Koreanska (CP-949) - + Simplified Chinese (CP-936) Förenklad kinesiska (CP-936) - + Thai (CP-874) Thai (CP-874) - + Traditional Chinese (CP-950) Traditionell kinesiska (CP-950) - + Turkish (CP-1254) Turkiska (CP-1254) - + Vietnam (CP-1258) Vietnamesiska (CP-1258) - + Western European (CP-1252) Västeuropeisk (CP-1252) - + Character Encoding Teckenkodning - + The codepage setting is responsible for the correct character representation. Usually you are fine with the preselected choice. @@ -6049,26 +6311,26 @@ Vanligtvis fungerar den förvalda inställningen bra. - + Please choose the character encoding. The encoding is responsible for the correct character representation. Välj teckenkodning. Teckenkodningen ansvarar för rätt teckenrepresentation. - + Song name singular Sång - + Songs name plural Sånger - + Songs container title Sånger @@ -6079,32 +6341,32 @@ Exportera sånger med exportguiden. - + Add a new song. Lägg till en ny sång. - + Edit the selected song. Redigera den valda sången. - + Delete the selected song. Ta bort den valda sången. - + Preview the selected song. Förhandsgranska den valda sången. - + Send the selected song live. Visa den valda sången live. - + Add the selected song to the service. Lägg till den valda sången i körschemat. @@ -6132,17 +6394,17 @@ Efternamn: - + You need to type in the first name of the author. Du måste ange författarens förnamn. - + You need to type in the last name of the author. Du måste ange författarens efternamn. - + You have not set a display name for the author, combine the first and last names? Du har inte angett ett visningsnamn för författaren; kombinera för- och efternamn? @@ -6173,209 +6435,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + Metadata + + + + Custom Book Names + Anpassade boknamn + + + SongsPlugin.EditSongForm - + Song Editor Sångredigering - + &Title: &Titel: - + Alt&ernate title: &Alternativ titel: - + &Lyrics: &Sångtext: - + &Verse order: &Versordning: - + Ed&it All Red&igera alla - + Title && Lyrics Titel && sångtext - + &Add to Song &Lägg till för sång - + &Remove &Ta bort - + &Manage Authors, Topics, Song Books &Hantera författare, ämnen, sångböcker - + A&dd to Song Lä&gg till för sång - + R&emove Ta &bort - + Book: Bok: - + Number: Nummer: - + Authors, Topics && Song Book Författare, ämnen && sångböcker - + New &Theme Nytt &tema - + Copyright Information Copyrightinformation - + Comments Kommentarer - + Theme, Copyright Info && Comments Tema, copyrightinfo && kommentarer - + Add Author Lägg till författare - + This author does not exist, do you want to add them? Författaren finns inte; vill du lägga till den? - + This author is already in the list. Författaren finns redan i listan. - + 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. Du har inte valt en giltig författare. Välj antingen en författare från listan, eller skriv in en ny författare och klicka "Lägg till för sång" för att lägga till den nya författaren. - + Add Topic Lägg till ämne - + This topic does not exist, do you want to add it? Ämnet finns inte; vill du skapa det? - + This topic is already in the list. Ämnet finns redan i listan. - + 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. Du har inte valt ett giltigt ämne. Välj antingen ett ämne från listan, eller skriv in ett nytt ämne och klicka "Lägg till för sång" för att lägga till det nya ämnet. - + You need to type in a song title. Du måste ange en sångtitel. - + You need to type in at least one verse. Du måste ange åtminstone en vers. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. Versordningen är ogiltig. Det finns ingen vers motsvarande %s. Giltiga värden är %s. - + Add Book Lägg till bok - + This song book does not exist, do you want to add it? Boken finns inte; vill du skapa den? - + You need to have an author for this song. Du måste ange en författare för sången. - + You need to type some text in to the verse. Du måste skriva någon text i versen. - + Linked Audio Länkat ljud - + Add &File(s) Lägg till &fil(er) - + Add &Media Lägg till &media - + Remove &All &Ta bort alla - + Open File(s) Öppna fil(er) - + <strong>Warning:</strong> Not all of the verses are in use. <strong>Varning:</strong> Alla verser används inte. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. Versordningen är ogiltig. Det finns inga verser som hör till %s. Giltiga värden är %s. @@ -6489,130 +6764,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files Välj dokument/presentation - + Song Import Wizard Sångimportguiden - + 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. Den här guiden hjälper dig att importera sånger från en mängd olika format. Klicka på Nästa för att börja processen med att välja ett format att importera från. - + Generic Document/Presentation Vanligt dokument/presentation - - Filename: - Filnamn: - - - - 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. - Import av OpenLyrics är ännu inte utvecklat, men som du ser avser vi fortfarande att göra det. Förhoppningsvis finns det i nästa utgåva. - - - + Add Files... Lägg till filer... - + Remove File(s) Ta bort fil(er) - + Please wait while your songs are imported. Vänta medan sångerna importeras. - + OpenLP 2.0 Databases OpenLP 2.0-databas - + openlp.org v1.x Databases openlp.org v1.x-databas - + Words Of Worship Song Files Words of Worship-sångfiler - - You need to specify at least one document or presentation file to import from. - Du måste ange minst ett dokument eller en presentation att importera från. - - - + Songs Of Fellowship Song Files Songs of Fellowship-sångfiler - + SongBeamer Files SongBeamer-filer - + SongShow Plus Song Files SongShow Plus-sångfiler - + Foilpresenter Song Files Foilpresenter-sångfiler - + Copy Kopiera - + Save to File Spara till fil - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Import av Songs of Fellowship har inaktiverats eftersom OpenLP inte kan hitta OpenOffice eller LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. Import av vanliga dokument/presentationer har inaktiverats eftersom OpenLP inte hittar OpenOffice eller LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song OpenLyrics eller sång exporterad från OpenLP 2.0 - + OpenLyrics Files OpenLyrics-filer + + + CCLI SongSelect Files + CCLI SongSelect-filer + + + + EasySlides XML File + EasySlides XML-fil + + + + EasyWorship Song Database + EasyWorship sångdatabas + + + + DreamBeam Song Files + DreamBeam sångfiler + + + + You need to specify a valid PowerSong 1.0 database folder. + Du måste ange en giltig PowerSong 1.0-databaskatalog. + + + + ZionWorx (CSV) + ZionWorx (CSV) + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + Konvertera först din ZionWorx-databas till en CSV-textfil, som beskrivs i <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">Användarmanualen</a>. + SongsPlugin.MediaFilesForm - + Select Media File(s) Välj mediafil(er) - + Select one or more audio files from the list below, and click OK to import them into this song. Välj en eller flera ljudfiler från listan nedan, och klicka OK för att importera dem till sången. @@ -6620,27 +6915,27 @@ SongsPlugin.MediaItem - + Titles - Titel + Titlel - + Lyrics Sångtext - + CCLI License: CCLI-licens: - + Entire Song - Hela sången + Allt sånginnehåll - + Are you sure you want to delete the %n selected song(s)? Är du säker på att du vill ta bort den valda sången? @@ -6648,16 +6943,41 @@ - + Maintain the lists of authors, topics and books. Underhåll listan över författare, ämnen och böcker. - + copy For song cloning kopia + + + Search Titles... + Sök titel... + + + + Search Entire Song... + Sök i allt sånginnehåll... + + + + Search Lyrics... + Sök i sångtexter... + + + + Search Authors... + Sök författare... + + + + Search Song Books... + Sök sångbok... + SongsPlugin.OpenLP1SongImport @@ -6684,6 +7004,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + Inga sånger att importera. + + + + Verses not found. Missing "PART" header. + Inga verser hittade. "PART"-huvud saknas. + + + SongsPlugin.SongBookForm @@ -6722,12 +7055,12 @@ SongsPlugin.SongImport - + copyright copyright - + The following songs could not be imported: De följande sångerna kunde inte importeras: @@ -6748,117 +7081,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - Sångimporten misslyckades. - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. Kunde inte lägga till författaren. - + This author already exists. Författaren finns redan. - + Could not add your topic. Kunde inte lägga till ämnet. - + This topic already exists. Ämnet finns redan. - + Could not add your book. Kunde inte lägga till boken. - + This book already exists. Boken finns redan. - + Could not save your changes. Kunde inte spara ändringarna. - + Could not save your modified author, because the author already exists. Kunde inte spara den ändrade författaren eftersom den redan finns. - + Could not save your modified topic, because it already exists. Kunde inte spara det ändrade ämnet eftersom det redan finns. - + Delete Author Ta bort författare - + Are you sure you want to delete the selected author? Är du säker på att du vill ta bort den valda författaren? - + This author cannot be deleted, they are currently assigned to at least one song. Författaren kan inte tas bort; den används för närvarande av minst en sång. - + Delete Topic Ta bort ämne - + Are you sure you want to delete the selected topic? Är du säker på att du vill ta bort det valda ämnet? - + This topic cannot be deleted, it is currently assigned to at least one song. Ämnet kan inte tas bort; det används för närvarande av minst en sång. - + Delete Book Ta bort bok - + Are you sure you want to delete the selected book? Är du säker på att du vill ta bort den valda boken? - + This book cannot be deleted, it is currently assigned to at least one song. Boken kan inte tas bort; den används för närvarande av minst en sång. - + The author %s already exists. Would you like to make songs with author %s use the existing author %s? Författaren %s finns redan. Vill du låta sånger med författaren %s använda den befintliga författaren %s? - + The topic %s already exists. Would you like to make songs with topic %s use the existing topic %s? Ämnet %s finns redan. Vill du låta sånger med ämnet %s använda det befintliga ämnet %s? - + The book %s already exists. Would you like to make songs with book %s use the existing book %s? Boken %s finns redan. Vill du låta sånger med boken %s använda den befintliga boken %s? @@ -6866,29 +7191,29 @@ SongsPlugin.SongsTab - + Songs Mode Sångläge - + Enable search as you type Sök när du skriver - + Display verses on live tool bar Visa verser i live-verktygsraden - + Update service from song edit Uppdatera körschemat från sångredigeringen - - Add missing songs when opening service - Lägg till saknade sånger vid öppning av körschema + + Import missing songs from service files + Importera saknade sånger från körschemafiler @@ -6939,7 +7264,7 @@ Ending - Slut + Avslut @@ -6947,4 +7272,17 @@ Övrigt + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + Fel vid läsning från CSV-fil. + + + + File not valid ZionWorx CSV format. + Filen är inte i giltigt ZionWorx CSV-format. + + diff -Nru openlp-1.9.9/resources/i18n/zh_CN.ts openlp-1.9.10/resources/i18n/zh_CN.ts --- openlp-1.9.9/resources/i18n/zh_CN.ts 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/i18n/zh_CN.ts 2012-06-23 16:35:18.000000000 +0000 @@ -3,35 +3,35 @@ AlertsPlugin - + &Alert - + Show an alert message. - + Alert name singular - + Alerts name plural - + Alerts container title - + <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen. @@ -39,32 +39,32 @@ AlertsPlugin.AlertForm - + Alert Message - + Alert &text: - + &New - + &Save - + Displ&ay - + Display && Cl&ose @@ -79,7 +79,7 @@ - + &Parameter: @@ -117,32 +117,32 @@ AlertsPlugin.AlertsTab - + Font - + Font name: - + Font color: - + Background color: - + Font size: - + Alert timeout: @@ -150,550 +150,595 @@ BiblesPlugin - + &Bible - + Bible name singular - + Bibles name plural - + Bibles container title - + No Book Found - + No matching book could be found in this Bible. Check that you have spelled the name of the book correctly. - + Import a Bible. - + Add a new Bible. - + Edit the selected Bible. - + Delete the selected Bible. - + Preview the selected Bible. - + Send the selected Bible live. - + Add the selected Bible to the service. - + <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display Bible verses from different sources during the service. - + &Upgrade older Bibles - + Upgrade the Bible databases to the latest format. - + Genesis - + Exodus - + Leviticus - + Numbers - + Deuteronomy - + Joshua - + Judges - + Ruth - + 1 Samuel - + 2 Samuel - + 1 Kings - + 2 Kings - + 1 Chronicles - + 2 Chronicles - + Ezra - + Nehemiah - + Esther - + Job - + Psalms - + Proverbs - + Ecclesiastes - + Song of Solomon - + Isaiah - + Jeremiah - + Lamentations - + Ezekiel - + Daniel - + Hosea - + Joel - + Amos - + Obadiah - + Jonah - + Micah - + Nahum - + Habakkuk - + Zephaniah - + Haggai - + Zechariah - + Malachi - + Matthew - + Mark - + Luke - + John - + Acts - + Romans - + 1 Corinthians - + 2 Corinthians - + Galatians - + Ephesians - + Philippians - + Colossians - + 1 Thessalonians - + 2 Thessalonians - + 1 Timothy - + 2 Timothy - + Titus - + Philemon - + Hebrews - + James - + 1 Peter - + 2 Peter - + 1 John - + 2 John - + 3 John - + Jude - + Revelation - + Judith - + Wisdom - + Tobit - + Sirach - + Baruch - + 1 Maccabees - + 2 Maccabees - + 3 Maccabees - + 4 Maccabees - + Rest of Daniel - + Rest of Esther - + Prayer of Manasses - + Letter of Jeremiah - + Prayer of Azariah - + Susanna - + Bel - + 1 Esdras - + 2 Esdras - + :|v|V|verse|verses;;-|to;;,|and;;end Double-semicolon delimited separators for parsing references. Consult the developers for further information. + BiblesPlugin.BibleEditForm + + + You need to specify a version name for your Bible. + + + + + You need to set a copyright for your Bible. Bibles in the Public Domain need to be marked as such. + + + + + Bible Exists + + + + + This Bible already exists. Please import a different Bible or first delete the existing one. + + + + + You need to specify a book name for "%s". + + + + + The book name "%s" is not correct. +Numbers can only be used at the beginning and must +be followed by one or more non-numeric characters. + + + + + Duplicate Book Name + + + + + The Book Name "%s" has been entered more than once. + + + + BiblesPlugin.BibleManager - + Scripture Reference Error - + Web Bible cannot be used - + Text Search is not available with Web Bibles. - + You did not enter a search keyword. You can separate different keywords by a space to search for all of your keywords and you can separate them by a comma to search for one of them. - + There are no Bibles currently installed. Please use the Import Wizard to install one or more Bibles. - + No Bibles Available - + Your scripture reference is either not supported by OpenLP or is invalid. Please make sure your reference conforms to one of the following patterns or consult the manual: Book Chapter @@ -709,186 +754,178 @@ BiblesPlugin.BiblesTab - + Verse Display - + Only show new chapter numbers - + Bible theme: - + No Brackets - + ( And ) - + { And } - + [ And ] - + Note: Changes do not affect verses already in the service. - + Display second Bible verses - + Custom Scripture References - + Verse Separator: - + Range Separator: - + List Separator: - + End Mark: - + Multiple alternative verse separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative range separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative list separators may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - + Multiple alternative end marks may be defined. They have to be separated by a vertical bar "|". Please clear this edit line to use the default value. - - Preferred Bookname Language - + + English + 中国 - - Choose the language in which the book names of the -Bible should be displayed in the Bible search: + + Default Bible Language - - Bible language + + Book name language in search field, +search results and on display: - - Application language + + Bible Language - - English - 中国 - - - - Multiple options: - Bible language - the language in which the Bible book names were imported - Application language - the language you have chosen for OpenLP - English - always use English book names + + Application Language BiblesPlugin.BookNameDialog - + Select Book Name - - The following book name cannot be matched up internally. Please select the corresponding English name from the list. - - - - + Current name: - + Corresponding name: - + Show Books From - + Old Testament - + New Testament - + Apocrypha + + + The following book name cannot be matched up internally. Please select the corresponding name from the list. + + BiblesPlugin.BookNameForm - + You need to select a book. @@ -913,40 +950,109 @@ + BiblesPlugin.EditBibleForm + + + Bible Editor + + + + + License Details + + + + + Version name: + + + + + Copyright: + + + + + Permissions: + + + + + Default Bible Language + + + + + Book name language in search field, search results and on display: + + + + + Global Settings + + + + + Bible Language + + + + + Application Language + + + + + English + 中国 + + + + This is a Web Download Bible. +It is not possible to customize the Book Names. + + + + + To use the customized book names, "Bible language" must be selected on the Meta Data tab or, if "Global settings" is selected, on the Bible page in Configure OpenLP. + + + + BiblesPlugin.HTTPBible - + Registering Bible and loading books... - + Registering Language... - + Importing %s... Importing <book name>... - + Download Error - + 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. - + Parse Error - + There was a problem extracting your verse selection. If this error continues to occur please consider reporting a bug. @@ -1123,17 +1229,17 @@ BiblesPlugin.LanguageDialog - + Select Language - + OpenLP is unable to determine the language of this translation of the Bible. Please select the language from the list below. - + Language: @@ -1149,85 +1255,100 @@ BiblesPlugin.MediaItem - + Quick - + Find: - + Book: - + Chapter: - + Verse: - + From: - + To: - + Text Search - + Second: - + Scripture Reference - + Toggle to keep or clear the previous results. - + You cannot combine single and dual Bible verse search results. Do you want to delete your search results and start a new search? - + Bible not fully loaded. - + Information - + The second Bible does not contain all the verses that are in the main Bible. Only verses found in both Bibles will be shown. %d verses have not been included in the results. + + + Search Scripture Reference... + + + + + Search Text... + + + + + Are you sure you want to delete "%s"? + + BiblesPlugin.Opensong - + Importing %s %s... Importing <book name> <chapter>... @@ -1236,12 +1357,12 @@ BiblesPlugin.OsisImport - + Detecting encoding (this may take a few minutes)... - + Importing %s %s... Importing <book name> <chapter>... @@ -1250,143 +1371,143 @@ BiblesPlugin.UpgradeWizardForm - + Select a Backup Directory - + Bible Upgrade Wizard - + This wizard will help you to upgrade your existing Bibles from a prior version of OpenLP 2. Click the next button below to start the upgrade process. - + Select Backup Directory - + Please select a backup directory for your Bibles - + Previous releases of OpenLP 2.0 are unable to use upgraded Bibles. This will create a backup of your current Bibles so that you can simply copy the files back to your OpenLP data directory if you need to revert to a previous release of OpenLP. Instructions on how to restore the files can be found in our <a href="http://wiki.openlp.org/faq">Frequently Asked Questions</a>. - + Please select a backup location for your Bibles. - + Backup Directory: - + There is no need to backup my Bibles - + Select Bibles - + Please select the Bibles to upgrade - + Upgrading - + Please wait while your Bibles are upgraded. - + The backup was not successful. To backup your Bibles you need permission to write to the given directory. - + Upgrading Bible %s of %s: "%s" Failed - + Upgrading Bible %s of %s: "%s" Upgrading ... - + Download Error - + To upgrade your Web Bibles an Internet connection is required. - + Upgrading Bible %s of %s: "%s" Upgrading %s ... - + Upgrading Bible %s of %s: "%s" Complete - + , %s failed - + Upgrading Bible(s): %s successful%s Please note that verses from Web Bibles will be downloaded on demand and so an Internet connection is required. - + Upgrading Bible(s): %s successful%s - + Upgrade failed. - + You need to specify a backup directory for your Bibles. - + Starting upgrade... - + There are no Bibles that need to be upgraded. @@ -1460,12 +1581,12 @@ CustomPlugin.CustomTab - + Custom Display - + Display footer @@ -1473,42 +1594,42 @@ CustomPlugin.EditCustomForm - + Edit Custom Slides - + &Title: - + Add a new slide at bottom. - + Edit the selected slide. - + Edit all the slides at once. - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -1523,12 +1644,12 @@ - + Ed&it All - + Insert Slide @@ -1536,7 +1657,7 @@ CustomPlugin.MediaItem - + Are you sure you want to delete the %n selected custom slide(s)? @@ -1546,60 +1667,60 @@ ImagePlugin - + <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. - + Image name singular - + Images name plural - + Images container title - + Load a new image. - + Add a new image. - + Edit the selected image. - + Delete the selected image. - + Preview the selected image. - + Send the selected image live. - + Add the selected image to the service. @@ -1607,7 +1728,7 @@ ImagePlugin.ExceptionDialog - + Select Attachment @@ -1615,43 +1736,43 @@ ImagePlugin.MediaItem - + Select Image(s) - + You must select an image to delete. - + You must select an image to replace the background with. - + Missing Image(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? - + There was a problem replacing your background, the image file "%s" no longer exists. - + There was no display item to amend. @@ -1659,78 +1780,78 @@ ImagesPlugin.ImageTab - + Background Color - + Default Color: - - Provides border where image is not the correct dimensions for the screen when resized. + + Visible background for images with aspect ratio different to screen. MediaPlugin - + <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - + Media name singular - + Media name plural - + Media container title - + Load new media. - + Add new media. - + Edit the selected media. - + Delete the selected media. - + Preview the selected media. - + Send the selected media live. - + Add the selected media to the service. @@ -1778,7 +1899,7 @@ - + Unsupported File @@ -1796,22 +1917,22 @@ MediaPlugin.MediaTab - + Available Media Players - + %s (unavailable) - + Player Order - + Allow media player to be overridden @@ -1819,7 +1940,7 @@ OpenLP - + Image Files @@ -1839,17 +1960,17 @@ OpenLP.AboutForm - + Credits - + License - + Contribute @@ -1859,17 +1980,17 @@ - + 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 @@ -1934,7 +2055,7 @@ - + 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 Impress, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. @@ -1945,7 +2066,7 @@ - + Copyright © 2004-2012 %s Portions copyright © 2004-2012 %s @@ -1954,228 +2075,310 @@ OpenLP.AdvancedTab - + UI Settings - + Number of recent files to display: - + Remember active media manager tab on startup - + Double-click to send items straight to live - + Expand new service items on creation - + Enable application exit confirmation - + Mouse Cursor - + Hide mouse cursor when over display window - + Default Image - + Background color: - - Image file: + + Image file: + + + + + Open File + + + + + Advanced + + + + + Preview items when clicked in Media Manager + + + + + Click to select a color. + + + + + Browse for an image file to display. + + + + + Revert to the default OpenLP logo. + + + + + Service %Y-%m-%d %H-%M + This may not contain any of the following characters: /\?*|<>[]":+ +See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + + + + Default Service Name + + + + + Enable default service name + + + + + Date and Time: + + + + + Monday + + + + + Tuesday + + + + + Wednesday + + + + + Thurdsday + + + + + Friday + + + + + Saturday - - Open File + + Sunday - - Advanced + + Now - - Preview items when clicked in Media Manager + + Time when usual service starts. - - Click to select a color. + + Name: - - Browse for an image file to display. + + Consult the OpenLP manual for usage. - - Revert to the default OpenLP logo. + + Revert to the default service name "%s". - - Service %Y-%m-%d %H-%M - This may not contain any of the following characters: /\?*|<>[]":+ -See http://docs.python.org/library/datetime.html#strftime-strptime-behavior for more information. + + Example: - - Default Service Name + + X11 - - Enable default service name + + Bypass X11 Window Manager - - Date and Time: + + Syntax error. - - Monday + + Data Location - - Tuesday + + Current path: - - Wednesday + + Custom path: - - Thurdsday + + Browse for new data file location. - - Friday + + Set the data location to the default. - - Saturday + + Cancel - - Sunday + + Cancel OpenLP data directory location change. - - Now + + Copy data to new location. - - Time when usual service starts. + + Copy the OpenLP data files to the new location. - - Name: + + <strong>WARNING:</strong> New data directory location contains OpenLP data files. These files WILL be replaced during a copy. - - Consult the OpenLP manual for usage. + + Data Directory Error - - Revert to the default service name "%s". + + Select Data Directory Location - - Example: + + Confirm Data Directory Change - - X11 + + Reset Data Directory - - Bypass X11 Window Manager + + Are you sure you want to change the location of the OpenLP data directory to the default location? + +This location will be used after OpenLP is closed. - - Syntax error. + + Overwrite Existing Data OpenLP.ExceptionDialog - + Error Occurred - + Oops! OpenLP hit a problem, and couldn't recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred. - + Send E-Mail - + Save to File - + Please enter a description of what you were doing to cause this error (Minimum 20 characters) - + Attach File - + Description characters to enter : %s @@ -2183,23 +2386,23 @@ OpenLP.ExceptionForm - + Platform: %s - + Save Crash Report - + Text files (*.txt *.log *.text) - + **OpenLP Bug Report** Version: %s @@ -2217,7 +2420,7 @@ - + *OpenLP Bug Report* Version: %s @@ -2340,17 +2543,17 @@ - + Downloading %s... - + Download complete. Click the finish button to start OpenLP. - + Enabling selected plugins... @@ -2420,32 +2623,32 @@ - + Setting Up And Downloading - + Please wait while OpenLP is set up and your data is downloaded. - + Setting Up - + Click the finish button to start OpenLP. - + Download complete. Click the finish button to return to OpenLP. - + Click the finish button to return to OpenLP. @@ -2455,8 +2658,13 @@ + + Finish + + + - 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. Press the Finish button now to start OpenLP with initial settings and no sample data. + 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. Click the Finish button now to start OpenLP with initial settings and no sample data. To re-run the First Time Wizard and import this sample data at a later time, check your Internet connection and re-run this wizard by selecting "Tools/Re-run First Time Wizard" from OpenLP. @@ -2465,64 +2673,59 @@ -To cancel the First Time Wizard completely (and not start OpenLP), press the Cancel button now. - - - - - Finish +To cancel the First Time Wizard completely (and not start OpenLP), click the Cancel button now. OpenLP.FormattingTagDialog - + Configure Formatting Tags - + Edit Selection - + Save - + Description - + Tag - + Start tag - + End tag - + Tag Id - + Start HTML - + End HTML @@ -2530,32 +2733,32 @@ OpenLP.FormattingTagForm - + Update Error - + Tag "n" already defined. - + New Tag - + <HTML here> - + </and here> - + Tag %s already defined. @@ -2563,82 +2766,82 @@ OpenLP.FormattingTags - + Red - + Black - + Blue - + Yellow - + Green - + Pink - + Orange - + Purple - + White - + Superscript - + Subscript - + Paragraph - + Bold - + Italics - + Underline - + Break @@ -2646,180 +2849,170 @@ OpenLP.GeneralTab - + General - + Monitors - + Select monitor for output display: - + Display if a single screen - + Application Startup - + Show blank screen warning - + Automatically open the last service - + Show the splash screen - + Application Settings - + Prompt to save before starting a new service - + Automatically preview next item in service - + sec - + CCLI Details - + SongSelect username: - + SongSelect password: - + X - + Y - + Height - + Width - + Check for updates to OpenLP - + Unblank display when adding new live item - + Timed slide interval: - + Background Audio - + Start background audio paused - + Service Item Slide Limits - - &End Slide - - - - - Up and down arrow keys stop at the top and bottom slides of each Service Item. - - - - - &Wrap Slide + + Override display position: - - Up and down arrow keys wrap around at the top and bottom slides of each Service Item. + + Repeat track list - - &Next Item + + Behavior of next/previous on the last/first slide: - - Up and down arrow keys advance to the next or previous Service Item from the top and bottom slides of each Service Item. + + &Remain on Slide - - Override display position: + + &Wrap around - - Repeat track list + + &Move to next/previous service item OpenLP.LanguageManager - + Language - + Please restart OpenLP to use your new language setting. @@ -2835,438 +3028,438 @@ OpenLP.MainWindow - + &File - + &Import - + &Export - + &View - + M&ode - + &Tools - + &Settings - + &Language - + &Help - + Media Manager - + Service Manager - + Theme Manager - + &New - + &Open - + Open an existing service. - + &Save - + Save the current service to disk. - + Save &As... - + Save Service As - + Save the current service under a new name. - + E&xit - + Quit OpenLP - + &Theme - + &Configure OpenLP... - + &Media Manager - + Toggle Media Manager - + Toggle the visibility of the media manager. - + &Theme Manager - + Toggle Theme Manager - + Toggle the visibility of the theme manager. - + &Service Manager - + Toggle Service Manager - + Toggle the visibility of the service manager. - + &Preview Panel - + Toggle Preview Panel - + Toggle the visibility of the preview panel. - + &Live Panel - + Toggle Live Panel - + Toggle the visibility of the live panel. - + &Plugin List - + List the Plugins - + &User Guide - + &About - + More information about OpenLP - + &Online Help - + &Web Site - + Use the system language, if available. - + Set the interface language to %s - + Add &Tool... - + Add an application to the list of tools. - + &Default - + Set the view mode back to the default. - + &Setup - + Set the view mode to Setup. - + &Live - + 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/. - + OpenLP Version Updated - + OpenLP Main Display Blanked - + The Main Display has been blanked out - + Default Theme: %s - + English Please add the name of your language here 中国 - + Configure &Shortcuts... - + Close OpenLP - + Are you sure you want to close OpenLP? - + Open &Data Folder... - + Open the folder where songs, bibles and other data resides. - + &Autodetect - + Update Theme Images - + Update the preview images for all themes. - + Print the current service. - + &Recent Files - + L&ock Panels - + Prevent the panels being moved. - + Re-run First Time Wizard - + Re-run the First Time Wizard, importing songs, Bibles and themes. - + Re-run First Time Wizard? - + Are you sure you want to re-run the First Time Wizard? Re-running this wizard may make changes to your current OpenLP configuration and possibly add songs to your existing songs list and change your default theme. - + Clear List Clear List of recent files - + Clear the list of recent files. - + Configure &Formatting Tags... - + Export OpenLP settings to a specified *.config file - + Settings - + Import OpenLP settings from a specified *.config file previously exported on this or another machine - + Import settings? - + Are you sure you want to import settings? Importing settings will make permanent changes to your current OpenLP configuration. @@ -3275,52 +3468,57 @@ - + Open File - + OpenLP Export Settings Files (*.conf) - + Import settings - + OpenLP will now close. Imported settings will be applied the next time you start OpenLP. - + Export Settings File - + OpenLP Export Settings File (*.conf) + + + New Data Directory Error + + OpenLP.Manager - + Database Error - + The database being loaded was created in a more recent version of OpenLP. The database is version %d, while OpenLP expects version %d. The database will not be loaded. Database: %s - + OpenLP cannot load your database. Database: %s @@ -3330,73 +3528,73 @@ OpenLP.MediaManagerItem - + No Items Selected - + &Add to selected Service Item - + You must select one or more items to preview. - + You must select one or more items to send live. - + You must select one or more items. - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. - + You must select one or more items to add. - + No Search Results - + Invalid File Type - + Invalid File %s. Suffix not supported - + &Clone - + Duplicate files were found on import and were ignored. @@ -3404,12 +3602,12 @@ OpenLP.OpenLyricsImportError - + <lyrics> tag is missing. - + <verse> tag is missing. @@ -3417,27 +3615,27 @@ OpenLP.PluginForm - + Plugin List - + Plugin Details - + Status: - + Active - + Inactive @@ -3460,12 +3658,12 @@ OpenLP.PrintServiceDialog - + Fit Page - + Fit Width @@ -3473,7 +3671,7 @@ OpenLP.PrintServiceForm - + Options @@ -3488,47 +3686,47 @@ - + Zoom In - + Zoom Out - + Zoom Original - + Other Options - + Include slide text if available - + Include service item notes - + Include play length of media items - + Add page break before each text item - + Service Sheet @@ -3538,12 +3736,12 @@ - + Title: - + Custom Footer Text: @@ -3551,12 +3749,12 @@ OpenLP.ScreenList - + Screen - + primary @@ -3564,12 +3762,12 @@ OpenLP.ServiceItem - + <strong>Start</strong>: %s - + <strong>Length</strong>: %s @@ -3577,7 +3775,7 @@ OpenLP.ServiceItemEditForm - + Reorder Service Item @@ -3585,82 +3783,82 @@ OpenLP.ServiceManager - + Move to &top - + Move item to the top of the service. - + Move &up - + Move item up one position in the service. - + Move &down - + Move item down one position in the service. - + Move to &bottom - + Move item to the end of the service. - + &Delete From Service - + Delete the selected item from the service. - + &Add New Item - + &Add to Selected Item - + &Edit Item - + &Reorder Item - + &Notes - + &Change Item Theme @@ -3681,112 +3879,107 @@ - + 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 - + &Expand all - + Expand all the service items. - + &Collapse all - + Collapse all the service items. - + Open File - + Moves the selection down the window. - + Move up - + Moves the selection up the window. - + Go Live - + Send the selected item to Live. - + &Start Time - - Show &Preview - - - - Show &Live + Show &Preview - + Modified Service - + The current service has been modified. Would you like to save this service? - + Custom Service Notes: - + Notes: - + Playing time: - + Untitled Service @@ -3811,17 +4004,17 @@ - + Load an existing service. - + Save this service. - + Select a theme for the service. @@ -3831,7 +4024,7 @@ - + Service File Missing @@ -3855,11 +4048,21 @@ Service copy only + + + Error Saving File + + + + + There was an error saving your file. + + OpenLP.ServiceNoteForm - + Service Item Notes @@ -3875,67 +4078,67 @@ OpenLP.ShortcutListDialog - + Action - + Shortcut - + Duplicate Shortcut - + The shortcut "%s" is already assigned to another action, please use a different shortcut. - + Alternate - + Select an action and click one of the buttons below to start capturing a new primary or alternate shortcut, respectively. - + Default - + Custom - + Capture shortcut. - + Restore the default shortcut of this action. - + Restore Default Shortcuts - + Do you want to restore all shortcuts to their defaults? - + Configure Shortcuts @@ -3943,177 +4146,172 @@ OpenLP.SlideController - + Hide - + Go To - + Blank Screen - + Blank to Theme - + Show Desktop - + Previous Service - + Next Service - + Escape Item - + Move to previous. - + Move to next. - + Play Slides - + Delay between slides in seconds. - + Move to live. - + Add to Service. - + Edit and reload song preview. - + Start playing media. - + Pause audio. - + Pause playing media. - + Stop playing media. - + Video position. - + Audio Volume. - + Go to "Verse" - + Go to "Chorus" - + Go to "Bridge" - + Go to "Pre-Chorus" - + Go to "Intro" - + Go to "Ending" - + Go to "Other" - + Previous Slide - + Next Slide - + Pause Audio - + Background Audio - - Next Track - - - - + Go to next audio track. - + Tracks @@ -4189,17 +4387,17 @@ - + Theme Layout - + The blue box shows the main area. - + The red box shows the footer. @@ -4207,32 +4405,32 @@ OpenLP.ThemeForm - + Select Image - + Theme Name Missing - + There is no name for this theme. Please enter one. - + Theme Name Invalid - + Invalid theme name. Please enter one. - + (approximately %d lines per slide) @@ -4240,193 +4438,193 @@ OpenLP.ThemeManager - + Create a new theme. - + Edit Theme - + Edit a theme. - + Delete Theme - + Delete a theme. - + Import Theme - + Import a theme. - + Export Theme - + Export a theme. - + &Edit Theme - + &Delete Theme - + Set As &Global Default - + %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. - + &Copy Theme - + &Rename Theme - + &Export Theme - + 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) - + Copy of %s Copy of <theme name> - + Theme Already Exists @@ -4434,272 +4632,272 @@ OpenLP.ThemeWizard - + Theme Wizard - + Welcome to the Theme Wizard - + Set Up Background - + Set up your theme's background according to the parameters below. - + Background type: - + Solid Color - + Gradient - + Color: - + Gradient: - + Horizontal - + Vertical - + Circular - + Top Left - Bottom Right - + Bottom Left - Top Right - + Main Area Font Details - + Define the font and display characteristics for the Display text - + Font: - + Size: - + Line Spacing: - + &Outline: - + &Shadow: - + Bold - + Italic - + Footer Area Font Details - + Define the font and display characteristics for the Footer text - + Text Formatting Details - + Allows additional display formatting information to be defined - + Horizontal Align: - + Left - + Right - + Center - + Output Area Locations - + Allows you to change and move the main and footer areas. - + &Main Area - + &Use default location - + X position: - + px - + Y position: - + Width: - + Height: - + Use default location - + Save and Preview - + View the theme and save it replacing the current one or change the name to create a new theme - + Theme name: - + Edit Theme - %s - + 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: - + &Footer Area - + Starting color: - + Ending color: - + Background color: - + Justify - + Layout Preview - + Transparent @@ -4707,47 +4905,47 @@ OpenLP.ThemesTab - + Global Theme - + Theme Level - + S&ong Level - + 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 - + 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. - + &Global Level - + Use the global theme, overriding any themes associated with either the service or the songs. - + Themes @@ -4831,239 +5029,239 @@ - + Image - + Import - + Live - + Live Background Error - + 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 - + Preview - + Replace Background - + Reset 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 - + Theme Singular - + Themes Plural - + Top - + Version - + Delete the selected item. - + Move selection up one position. - + Move selection down one position. - + &Vertical Align: - + Finished import. - + Format: - + Importing - + Importing "%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. - + Open %s File - + %p% - + Ready. - + Starting import... - + You need to specify at least one %s file to import from. A file type e.g. OpenSong @@ -5079,7 +5277,7 @@ - + Welcome to the Song Import Wizard @@ -5167,53 +5365,53 @@ - + Layout style: - + Live Toolbar - + m The abbreviated unit for minutes - + OpenLP is already running. Do you wish to continue? - + Settings - + Tools - + Unsupported File - + Verse Per Slide - + Verse Per Line - + View @@ -5228,42 +5426,37 @@ - + View Mode - + Open service. - + Print Service - + Replace live background. - + Reset live background. - - &Split - - - - + Split a slide into two only if it does not fit on the screen as one slide. - + Welcome to the Bible Upgrade Wizard @@ -5273,53 +5466,105 @@ - + Play Slides in Loop - + Play Slides to End - + Stop Play Slides in Loop - + Stop Play Slides to End - + Next Track + + + Search Themes... + Search bar place holder text + + + + + Optional &Split + + + + + Invalid Folder Selected + Singular + + + + + Invalid File Selected + Singular + + + + + Invalid Files Selected + Plural + + + + + No Folder Selected + Singular + + + + + Open %s Folder + + + + + You need to specify one %s file to import from. + A file type e.g. OpenSong + + + + + You need to specify one %s folder to import from. + A song format e.g. PowerSong + + OpenLP.core.lib - + %1 and %2 Locale list separator: 2 items - + %1, and %2 Locale list separator: end - + %1, %2 Locale list separator: middle - + %1, %2 Locale list separator: start @@ -5328,50 +5573,50 @@ PresentationPlugin - + <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. - + Presentation name singular - + Presentations name plural - + Presentations container title - + Load a new presentation. - + Delete the selected presentation. - + Preview the selected presentation. - + Send the selected presentation live. - + Add the selected presentation to the service. @@ -5379,70 +5624,70 @@ PresentationPlugin.MediaItem - + Select Presentation(s) - + Automatic - + Present using: - + File Exists - + A presentation with that filename already exists. - + This type of presentation is not supported. - + Presentations (%s) - + Missing Presentation - - The Presentation %s no longer exists. + + The presentation %s is incomplete, please reload. - - The Presentation %s is incomplete, please reload. + + The presentation %s no longer exists. PresentationPlugin.PresentationTab - + Available Controllers - + %s (unavailable) - + Allow presentation application to be overridden @@ -5476,135 +5721,150 @@ RemotePlugin.Mobile - + OpenLP 2.0 Remote - + OpenLP 2.0 Stage View - + Service Manager - + Slide Controller - - Alerts - - - - Search + Alerts - Back + Search - + Refresh - + Blank - + Show - + Prev - + Next - + Text - + Show Alert - + Go Live - + No Results - + Options - + Add to Service + + + Home + + + + + Theme + + + + + Desktop + + + + + Add &amp; Go to Service + + RemotePlugin.RemoteTab - + Serve on IP address: - + Port number: - + Server Settings - + Remote URL: - + Stage view URL: - + Display stage time in 12h format - + Android App - + Scan the QR code or click <a href="https://market.android.com/details?id=org.openlp.android">download</a> to install the Android app from the Market. @@ -5612,85 +5872,85 @@ SongUsagePlugin - + &Song Usage Tracking - + &Delete Tracking Data - + Delete song usage data up to a specified date. - + &Extract Tracking Data - + Generate a report on song usage. - + Toggle Tracking - + Toggle the tracking of song usage. - + <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - + SongUsage name singular - + SongUsage name plural - + SongUsage container title - + Song Usage - + Song usage tracking is active. - + Song usage tracking is inactive. - + display - + printed @@ -5698,7 +5958,7 @@ SongUsagePlugin.SongUsageDeleteForm - + Delete Song Usage Data @@ -5723,7 +5983,7 @@ - + Select the date up to which the song usage data should be deleted. All data recorded before this date will be permanently deleted. @@ -5731,54 +5991,54 @@ SongUsagePlugin.SongUsageDetailForm - + Song Usage Extraction - + Select Date Range - + to - + Report Location - + Output File Location - + usage_detail_%s_%s.txt - + Report Creation - + Report %s has been successfully created. - + Output Path Not Selected - + You have not set a valid output location for your song usage report. Please select an existing path on your computer. @@ -5816,107 +6076,107 @@ - + Arabic (CP-1256) - + Baltic (CP-1257) - + Central European (CP-1250) - + Cyrillic (CP-1251) - + Greek (CP-1253) - + Hebrew (CP-1255) - + Japanese (CP-932) - + Korean (CP-949) - + Simplified Chinese (CP-936) - + Thai (CP-874) - + Traditional Chinese (CP-950) - + Turkish (CP-1254) - + Vietnam (CP-1258) - + Western European (CP-1252) - + Character Encoding - + 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. - + Song name singular - + Songs name plural - + Songs container title @@ -5927,32 +6187,32 @@ - + 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. @@ -5980,17 +6240,17 @@ - + You need to type in the first name of the author. - + You need to type in the last name of the author. - + You have not set a display name for the author, combine the first and last names? @@ -6019,209 +6279,222 @@ + SongsPlugin.EditBibleForm + + + Meta Data + + + + + Custom Book Names + + + + SongsPlugin.EditSongForm - + Song Editor - + &Title: - + Alt&ernate title: - + &Lyrics: - + &Verse order: - + Ed&it All - + Title && Lyrics - + &Add to Song - + &Remove - + &Manage Authors, Topics, Song Books - + A&dd to Song - + R&emove - + Book: - + Number: - + Authors, Topics && Song Book - + New &Theme - + Copyright Information - + Comments - + Theme, Copyright Info && Comments - + Add Author - + This author does not exist, do you want to add them? - + This author is already in the list. - + 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. - + Add Topic - + This topic does not exist, do you want to add it? - + This topic is already in the list. - + 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. - + You need to type in at least one verse. - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + Add Book - + This song book does not exist, do you want to add it? - + You need to have an author for this song. - + You need to type some text in to the verse. - + Linked Audio - + Add &File(s) - + Add &Media - + Remove &All - + Open File(s) - + <strong>Warning:</strong> Not all of the verses are in use. - + The verse order is invalid. There are no verses corresponding to %s. Valid entries are %s. @@ -6335,130 +6608,150 @@ SongsPlugin.ImportWizardForm - + Select Document/Presentation Files - + 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. - + Generic Document/Presentation - - Filename: - - - - - 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. - - - - + Add Files... - + Remove File(s) - + Please wait while your songs are imported. - + OpenLP 2.0 Databases - + openlp.org v1.x Databases - + Words Of Worship Song Files - - You need to specify at least one document or presentation file to import from. - - - - + Songs Of Fellowship Song Files - + SongBeamer Files - + SongShow Plus Song Files - + Foilpresenter Song Files - + Copy - + Save to File - + The Songs of Fellowship importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + The generic document/presentation importer has been disabled because OpenLP cannot access OpenOffice or LibreOffice. - + OpenLyrics or OpenLP 2.0 Exported Song - + OpenLyrics Files + + + CCLI SongSelect Files + + + + + EasySlides XML File + + + + + EasyWorship Song Database + + + + + DreamBeam Song Files + + + + + You need to specify a valid PowerSong 1.0 database folder. + + + + + ZionWorx (CSV) + + + + + First convert your ZionWorx database to a CSV text file, as explained in the <a href="http://manual.openlp.org/songs.html#importing-from-zionworx">User Manual</a>. + + SongsPlugin.MediaFilesForm - + Select Media File(s) - + Select one or more audio files from the list below, and click OK to import them into this song. @@ -6466,43 +6759,68 @@ SongsPlugin.MediaItem - + Titles - + Lyrics - + CCLI License: - + Entire Song - + Are you sure you want to delete the %n selected song(s)? - + Maintain the lists of authors, topics and books. - + copy For song cloning + + + Search Titles... + + + + + Search Entire Song... + + + + + Search Lyrics... + + + + + Search Authors... + + + + + Search Song Books... + + SongsPlugin.OpenLP1SongImport @@ -6529,6 +6847,19 @@ + SongsPlugin.PowerSongImport + + + No songs to import. + + + + + Verses not found. Missing "PART" header. + + + + SongsPlugin.SongBookForm @@ -6567,12 +6898,12 @@ SongsPlugin.SongImport - + copyright - + The following songs could not be imported: @@ -6593,117 +6924,109 @@ - SongsPlugin.SongImportForm - - - Your song import failed. - - - - SongsPlugin.SongMaintenanceForm - + Could not add your author. - + This author already exists. - + Could not add your topic. - + This topic already exists. - + Could not add your book. - + This book already exists. - + Could not save your changes. - + Could not save your modified author, because the author already exists. - + Could not save your modified topic, because it already exists. - + Delete Author - + Are you sure you want to delete the selected author? - + This author cannot be deleted, they are currently assigned to at least one song. - + Delete Topic - + Are you sure you want to delete the selected topic? - + This topic cannot be deleted, it is currently assigned to at least one song. - + Delete Book - + Are you sure you want to delete the selected book? - + 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? - + 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? @@ -6711,28 +7034,28 @@ SongsPlugin.SongsTab - + Songs Mode - + Enable search as you type - + Display verses on live tool bar - + Update service from song edit - - Add missing songs when opening service + + Import missing songs from service files @@ -6792,4 +7115,17 @@ + + SongsPlugin.ZionWorxImport + + + Error reading CSV file. + + + + + File not valid ZionWorx CSV format. + + + diff -Nru openlp-1.9.9/resources/osx/applescript-adjustview-10-5.master openlp-1.9.10/resources/osx/applescript-adjustview-10-5.master --- openlp-1.9.9/resources/osx/applescript-adjustview-10-5.master 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/applescript-adjustview-10-5.master 1970-01-01 00:00:00.000000000 +0000 @@ -1,74 +0,0 @@ -on saveImageWithItselfAsIcon(icon_image_file) - -- save icon_image_file with itself as icon - set icon_image_file_string to icon_image_file as string - tell application "Image Events" - launch - set icon_image to open file icon_image_file_string - save icon_image with icon - close icon_image - end tell -end saveImageWithItselfAsIcon - -on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder) - tell application "Finder" to set f to aFileOrFolderWithIcon as alias - -- grab the file's icon - my CopyOrPaste(f, "c") - -- now the icon is in the clipboard - tell application "Finder" to set c to aFileOrFolder as alias - my CopyOrPaste(result, "v") -end copyIconOfTo - -on CopyOrPaste(i, cv) - tell application "Finder" - activate - open information window of i - end tell - tell application "System Events" to tell process "Finder" to tell window 1 - keystroke tab -- select icon button - keystroke (cv & "w") using command down (* (copy or paste) + close window *) - end tell -- window 1 then process Finder then System Events -end CopyOrPaste - -on run - set icon_image_file to POSIX file "%s" as alias - set dmg_file to POSIX file "/Volumes/%s" as alias - - my saveImageWithItselfAsIcon(icon_image_file) - -- wait for virus scanner - delay 2 - my copyIconOfTo(icon_image_file, dmg_file) - - tell application "Finder" - tell disk "%s" - open - set current view of container window to icon view - set toolbar visible of container window to false - set statusbar visible of container window to false - set the bounds of container window to {400, 100, 1100, 500} - set theViewOptions to the icon view options of container window - set arrangement of theViewOptions to not arranged - set icon size of theViewOptions to 128 - set background picture of theViewOptions to file ".background:installer-background.png" - if not exists file "Applications" then - make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} - end if - delay 5 - set position of item "%s" of container window to {160, 200} - set position of item ".Trashes" of container window to {100, 500} - set position of item ".installer-background.png" of container window to {200, 500} - set position of item ".DS_Store" of container window to {400, 500} - set position of item "Applications" of container window to {550, 200} - set position of item ".VolumeIcon.icns" of container window to {500, 500} - set position of item ".fseventsd" of container window to {300, 500} - if exists POSIX file ".SymAVx86QSFile" then - set position of item ".SymAVx86QSFile" of container window to {600, 500} - end if - open - close - update without registering applications - -- wait until the virus scan completes - delay 5 - -- eject - end tell - end tell -end run diff -Nru openlp-1.9.9/resources/osx/applescript-adjustview-10-6.master openlp-1.9.10/resources/osx/applescript-adjustview-10-6.master --- openlp-1.9.9/resources/osx/applescript-adjustview-10-6.master 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/applescript-adjustview-10-6.master 1970-01-01 00:00:00.000000000 +0000 @@ -1,77 +0,0 @@ -on saveImageWithItselfAsIcon(icon_image_file) - -- save icon_image_file with itself as icon - set icon_image_file_string to icon_image_file as string - tell application "Image Events" - launch - set icon_image to open file icon_image_file_string - save icon_image with icon - close icon_image - end tell -end saveImageWithItselfAsIcon - -on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder) - tell application "Finder" to set f to aFileOrFolderWithIcon as alias - -- grab the file's icon - my CopyOrPaste(f, "c") - -- now the icon is in the clipboard - tell application "Finder" to set c to aFileOrFolder as alias - my CopyOrPaste(result, "v") -end copyIconOfTo - -on CopyOrPaste(i, cv) - tell application "Finder" - activate - set infoWindow to open information window of i - set infoWindowName to name of infoWindow - end tell - tell application "System Events" to tell process "Finder" to tell window infoWindowName - keystroke tab -- select icon button - keystroke (cv & "w") using command down (* (copy or paste) + close window *) - end tell -- window 1 then process Finder then System Events -end CopyOrPaste - -on run - set icon_image_file to POSIX file "%s" as alias - set dmg_file to POSIX file "/Volumes/%s" as alias - - my saveImageWithItselfAsIcon(icon_image_file) - -- wait for virus scanner - delay 2 - my copyIconOfTo(icon_image_file, dmg_file) - - tell application "Finder" - tell disk "%s" - open - set current view of container window to icon view - set toolbar visible of container window to false - set statusbar visible of container window to false - set the bounds of container window to {400, 100, 1100, 500} - set theViewOptions to the icon view options of container window - set arrangement of theViewOptions to not arranged - set icon size of theViewOptions to 128 - set background picture of theViewOptions to file ".background:installer-background.png" - if not exists file "Applications" then - make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} - end if - delay 1 - set position of item "%s" of container window to {160, 200} - set position of item ".Trashes" of container window to {100, 500} - set position of item ".background" of container window to {200, 500} - set position of item ".DS_Store" of container window to {400, 500} - set position of item "Applications" of container window to {550, 200} - if exists file ".VolumeIcon.icns" then - set position of item ".VolumeIcon.icns" of container window to {500, 500} - end if - set position of item ".fseventsd" of container window to {300, 500} - if exists POSIX file ".SymAVx86QSFile" then - set position of item ".SymAVx86QSFile" of container window to {600, 500} - end if - open - close - update without registering applications - -- wait until the virus scan completes - delay 5 - -- eject - end tell - end tell -end run diff -Nru openlp-1.9.9/resources/osx/applescript-seticon-10-5.master openlp-1.9.10/resources/osx/applescript-seticon-10-5.master --- openlp-1.9.9/resources/osx/applescript-seticon-10-5.master 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/applescript-seticon-10-5.master 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -on saveImageWithItselfAsIcon(icon_image_file) - -- save icon_image_file with itself as icon - set icon_image_file_string to icon_image_file as string - tell application "Image Events" - launch - set icon_image to open file icon_image_file_string - save icon_image with icon - close icon_image - end tell -end saveImageWithItselfAsIcon - -on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder) - tell application "Finder" to set f to aFileOrFolderWithIcon as alias - -- grab the file's icon - my CopyOrPaste(f, "c") - -- now the icon is in the clipboard - tell application "Finder" to set c to aFileOrFolder as alias - my CopyOrPaste(result, "v") -end copyIconOfTo - -on CopyOrPaste(i, cv) - tell application "Finder" - activate - open information window of i - end tell - tell application "System Events" to tell process "Finder" to tell window 1 - keystroke tab -- select icon button - keystroke (cv & "w") using command down (* (copy or paste) + close window *) - end tell -- window 1 then process Finder then System Events -end CopyOrPaste - -on run - set icon_image_file to POSIX file "%s" as alias - set dmg_file to POSIX file "%s" as alias - - my saveImageWithItselfAsIcon(icon_image_file) - -- wait for virus scanner - delay 2 - my copyIconOfTo(icon_image_file, dmg_file) -end run diff -Nru openlp-1.9.9/resources/osx/applescript-seticon-10-6.master openlp-1.9.10/resources/osx/applescript-seticon-10-6.master --- openlp-1.9.9/resources/osx/applescript-seticon-10-6.master 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/applescript-seticon-10-6.master 1970-01-01 00:00:00.000000000 +0000 @@ -1,41 +0,0 @@ -on saveImageWithItselfAsIcon(icon_image_file) - -- save icon_image_file with itself as icon - set icon_image_file_string to icon_image_file as string - tell application "Image Events" - launch - set icon_image to open file icon_image_file_string - save icon_image with icon - close icon_image - end tell -end saveImageWithItselfAsIcon - -on copyIconOfTo(aFileOrFolderWithIcon, aFileOrFolder) - tell application "Finder" to set f to aFileOrFolderWithIcon as alias - -- grab the file's icon - my CopyOrPaste(f, "c") - -- now the icon is in the clipboard - tell application "Finder" to set c to aFileOrFolder as alias - my CopyOrPaste(result, "v") -end copyIconOfTo - -on CopyOrPaste(i, cv) - tell application "Finder" - activate - set infoWindow to open information window of i - set infoWindowName to name of infoWindow - end tell - tell application "System Events" to tell process "Finder" to tell window infoWindowName - keystroke tab -- select icon button - keystroke (cv & "w") using command down (* (copy or paste) + close window *) - end tell -- window 1 then process Finder then System Events -end CopyOrPaste - -on run - set icon_image_file to POSIX file "%s" as alias - set dmg_file to POSIX file "%s" as alias - - my saveImageWithItselfAsIcon(icon_image_file) - -- wait for virus scanner - delay 2 - my copyIconOfTo(icon_image_file, dmg_file) -end run diff -Nru openlp-1.9.9/resources/osx/build.py openlp-1.9.10/resources/osx/build.py --- openlp-1.9.9/resources/osx/build.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/build.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,426 +0,0 @@ -#!/usr/bin/python -# -*- encoding: utf-8 -*- - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 # -############################################################################### - -""" -Mac OS X Build Script ---------------------- - -This script is used to build the OS X binary and the accompanying installer. -For this script to work out of the box, it depends on a number of things: - -Python 2.6/2.7 - This build script only works with Python 2.6/2.7 - -PyQt4 - You should already have this installed, OpenLP doesn't work without it. - The version the script expects is the packaged one available from River - Bank Computing. - -PyInstaller - PyInstaller should be a checkout of revision 1355 of trunk, and in a - directory which is configured in the openlp.cfg. The revision is very - important as there is just included a fix for builds on OS X. - - To install PyInstaller, first checkout trunk from Subversion. The - easiest way is to do a - - svn co http://svn.pyinstaller.org/trunk - - Then you need to copy the two hook-*.py files from the "pyinstaller" - subdirectory in OpenLP's "resources" directory into PyInstaller's - "hooks" directory. - -openlp.cfg - The configuration file contains settings of the version string to include - in the bundle as well as directory and file settings for different - purposes (e.g. PyInstaller location or installer background image) - -To start the build process do a - - make - -inside the resources/osx directory. The result should be a {openlp_dmgname}.dmg -file in the same directory. If something went wrong - this sometimes happen -with the graphical commands in the Apple script - do a - - make clean - -and start the build process again. If you want to execute only parts of the -build process you can specify different make targets - - make view -- runs the Apple scripts to set the icons - make package -- creates the dmg file and copies the application files - make bundle -- compresses the dmg file and sets the dmg file icon -""" - -import os -import ConfigParser -import logging -import optparse -import sys -import glob -import platform -import re -import subprocess as subp - -from shutil import copy - -# set the script name -script_name = "build" - - -def build_application(settings, app_name_lower, app_dir): - logging.info('[%s] now building the app with pyinstaller at "%s"...', - script_name, settings['pyinstaller_basedir']) - result = os.system('arch -i386 %s %s/pyinstaller.py openlp.spec' \ - % ( sys.executable, - settings['pyinstaller_basedir']) ) - if (result != 0): - logging.error('[%s] The pyinstaller build reported an error, cannot \ - continue!', script_name) - sys.exit(1) - - - dist_folder = os.getcwd() + '/dist/' + app_name_lower - - logging.info('[%s] copying the new plugins...', script_name) - result = os.system('cp -R %(openlp_directory)s/openlp/plugins \ - %(application_directory)s/Contents/MacOS' \ - % { 'openlp_directory' : settings['openlp_basedir'], - 'application_directory' : app_dir }) - if (result != 0): - logging.error('[%s] could not copy plugins, dmg creation failed!', - script_name) - sys.exit(1) - - logging.info('[%s] removing the presentations plugin...', script_name) - result = os.system('rm -rf \ - %(application_directory)s/Contents/MacOS/plugins/presentations' \ - % { 'application_directory' : app_dir }) - if (result != 0): - logging.error('[%s] could not remove presentations plugins, dmg \ - creation failed!', script_name) - sys.exit(1) - - logging.info('[%s] copying the icons to the resource directory...', - script_name) - result = os.system('cp %(icon_file)s \ - %(application_directory)s/Contents/Resources' \ - % { 'icon_file' : settings['openlp_icon_file'], - 'application_directory' : app_dir }) - if (result != 0): - logging.error('[%s] could not copy the icon, dmg creation failed!', - script_name) - sys.exit(1) - - logging.info('[%s] copying the version file...', script_name) - result = os.system('CpMac %s/.version %s/Contents/MacOS' % (os.getcwd(), - app_dir)) - if (result != 0): - logging.error('[%s] could not copy the version file, dmg creation \ - failed!', script_name) - sys.exit(1) - - logging.info('[%s] copying the new Info.plist...', script_name) - result = os.system('cp %(target_directory)s/Info.plist \ - %(application_directory)s/Contents' \ - % { 'target_directory' : os.getcwd(), - 'application_directory' : app_dir }) - if (result != 0): - logging.error('[%s] could not copy the info file, dmg creation \ - failed!', script_name) - sys.exit(1) - - logging.info('[%s] copying the translations...', script_name) - os.makedirs(app_dir + '/Contents/MacOS/i18n') - for ts_file in glob.glob(os.path.join(settings['openlp_basedir'] - + '/resources/i18n/', '*ts')): - result = os.system('lconvert -i %(ts_file)s \ - -o %(target_directory)s/Contents/MacOS/i18n/%(base)s.qm' \ - % { 'ts_file' : ts_file, 'target_directory' : app_dir, - 'base': os.path.splitext(os.path.basename(ts_file))[0] }) - if (result != 0): - logging.error('[%s] could not copy the translations, dmg \ - creation failed!', script_name) - sys.exit(1) - - # Backported from windows build script. - logging.info('[%s] copying the media player...', script_name) - os.makedirs(os.path.join(app_dir, 'Contents/MacOS/core/ui/media')) - source = os.path.join(settings['openlp_basedir'], u'openlp', u'core', u'ui', u'media') - dest = os.path.join(app_dir, u'Contents/MacOS/core/ui/media') - for root, dirs, files in os.walk(source): - for filename in files: - print filename - if not filename.endswith(u'.pyc'): - dest_path = os.path.join(dest, root[len(source)+1:]) - if not os.path.exists(dest_path): - os.makedirs(dest_path) - copy(os.path.join(root, filename), - os.path.join(dest_path, filename)) - - -def create_dmg(settings): - logging.info('[%s] creating the dmg...', script_name) - dmg_file = os.getcwd() + '/' + settings['openlp_dmgname'] + '.dmg' - result = os.system('hdiutil create %(dmg_file)s~ -ov -megabytes \ - %(vol_size)s -fs HFS+ -volname %(vol_name)s' \ - % { 'dmg_file' : dmg_file, - 'vol_size' : '250', - 'vol_name' : settings['openlp_appname'] }) - if (result != 0): - logging.error('[%s] could not create dmg file!', script_name) - sys.exit(1) - - logging.info('[%s] mounting the dmg file...', script_name) - output = subp.Popen(["hdiutil", "attach", dmg_file + "~.dmg"], - stdout=subp.PIPE).communicate()[0] - logging.debug(output) - - p = re.compile('Apple_HFS\s+(.+?)\s*$') - result = p.search(output, re.M) - volume_basedir = '' - if result: - volume_basedir = result.group(1) - else: - logging.error('could not mount dmg file, cannot continue!') - sys.exit(1) - - logging.info('[%s] copying the app (from %s) to the dmg (at %s)...', - script_name, app_dir, volume_basedir) - result = os.system('CpMac -r %s %s' \ - % ( app_dir, volume_basedir )) - if (result != 0): - logging.error('[%s] could not copy application, dmg creation failed!', - script_name) - sys.exit(1) - - logging.info('[%s] copying the background image...', script_name) - os.mkdir(volume_basedir + '/.background') - result = os.system('CpMac %s %s' - % (settings['installer_backgroundimage_file'], - volume_basedir + '/.background/installer-background.png')) - if (result != 0): - logging.error('[%s] could not copy the background image, dmg creation\ - failed!', script_name) - sys.exit(1) - - return (volume_basedir, dmg_file) - -def unmount_dmg(settings, volume_basedir): - logging.info('[%s] unmounting the dmg...', script_name) - result = os.system('hdiutil detach %s' % volume_basedir) - if (result != 0): - logging.error('[%s] could not unmount the dmg file, dmg creation \ - failed!', script_name) - sys.exit(1) - -def compress_view(settings, seticon_scriptname, dmg_file): - logging.info('[%s] setting icon of the dmg file...', script_name) - try: - f = open(seticon_scriptname) - p = subp.Popen(["osascript"], stdin=subp.PIPE) - p.communicate(f.read() % ((os.getcwd() + '/' + - settings['openlp_dmg_icon_file']), dmg_file)) - f.close() - result = p.returncode - if (result != 0): - logging.error('[%s] could not set the icon to the dmg file, \ - dmg creation failed!', script_name) - sys.exit(1) - except IOError, e: - logging.error('[%s] could not adjust the view (%s), dmg creation \ - failed!', script_name, e) - sys.exit(1) - except OSError, e: - logging.error('[%s] could not set the icon to the dmg file(%s), \ - dmg creation failed!', script_name, e) - sys.exit(1) - -def adjust_package_view(settings, adjustview_scriptname): - logging.info('[%s] making adjustments to the view...', script_name) - try: - f = open(adjustview_scriptname) - p = subp.Popen(["osascript"], stdin=subp.PIPE) - p.communicate(f.read() % ((os.getcwd() + '/' + \ - settings['openlp_dmg_icon_file']), - settings['openlp_appname'], - settings['openlp_appname'], - settings['openlp_appname'])) - f.close() - result = p.returncode - if (result != 0): - logging.error('[%s] could not adjust the view, dmg creation \ - failed!', script_name) - sys.exit(1) - except IOError, e: - logging.error('[%s] could not adjust the view (%s), dmg creation \ - failed!', script_name, e) - sys.exit(1) - except OSError, e: - logging.error('[%s] could not adjust the view (%s), dmg creation \ - failed!', script_name, e) - sys.exit(1) - -def compress_dmg(settings): - logging.info('[%s] compress the dmg file...', script_name) - result = os.system('hdiutil convert %s~.dmg -format UDZO \ - -imagekey zlib-level=9 -o %s' \ - % (dmg_file, dmg_file)) - if (result != 0): - logging.error('[%s] could not compress the dmg file, dmg creation \ - failed!', script_name) - sys.exit(1) - - -if __name__ == '__main__': - - # set default actions - do_build = True - do_compress_view = True - do_package_view = True - do_create_dmg = True - do_compress_dmg = True - - parser = optparse.OptionParser() - parser.add_option('-c', '--config', dest='config', help='config file', - metavar='CONFIG') - parser.add_option('-v', '--package-view', dest='package_view', - help='triggers view adjustment scripts for package', - metavar='PACKAGEVIEWONLY', action='store_true', default=False) - parser.add_option('-y', '--compress-view', dest='compress_view', - help='triggers view adjustment scripts for dmg', - metavar='COMPRESSVIEWONLY', action='store_true', default=False) - parser.add_option('-p', '--package', dest='package', - help='package application folder to dmg', metavar='PACKAGE', - action='store_true', default=False) - parser.add_option('-z', '--compress', dest='compress', - help='compresses the existing dmg', metavar='COMPRESS', - action='store_true', default=False) - parser.add_option('-b', '--basedir', dest='basedir', - help='volume basedir like /Volumes/OpenLP', metavar='BASEDIR', - default='/Volumes/OpenLP') - - (options, args) = parser.parse_args() - - # if an option is set, false all - if (options.package_view is True or options.compress_view is True - or options.package is True or options.compress is True): - do_build = False - do_package_view = options.package_view - do_compress_view = options.compress_view - do_create_dmg = options.package - do_compress_dmg = options.compress - - if not options.config: - parser.error('option --config|-c is required') - - logHandler = logging.StreamHandler() - logHandler.setFormatter(logging.Formatter( - '%(asctime)s %(levelname)-8s %(message)s', - '%a, %d %b %Y %H:%M:%S')) - logging.getLogger().addHandler(logHandler) - logging.getLogger().setLevel(logging.DEBUG) - - config = ConfigParser.RawConfigParser() - config.readfp(open(options.config, 'r')) - - if not config.has_section('openlp'): - logging.error('[%s] config file "%s" lacks an [openlp] section', - script_name, options.config) - sys.exit(1) - - if not sys.platform == "darwin": - logging.error('[%s] this script only works on Macintosh OS X systems,' - + 'not on %s', script_name, sys.platform) - sys.exit(1) - - version = platform.mac_ver()[0] - # we only need the differenciation between leopard and snow leopard - if version.startswith("10.6") or version.startswith("10.7"): - SNOWLEOPARD = True - logging.info('[%s] using snow leopard scripts (version = %s)', - script_name, version) - adjustview_scriptname = "applescript-adjustview-10-6.master" - seticon_scriptname = "applescript-seticon-10-6.master" - else: - SNOWLEOPARD = False - logging.info('[%s] using leopard scripts (version = %s)', script_name, - version) - adjustview_scriptname = "applescript-adjustview-10-5.master" - seticon_scriptname = "applescript-seticon-10-5.master" - - if not os.path.isfile(adjustview_scriptname) \ - or not os.path.isfile(seticon_scriptname): - logging.error('[%s] could not find apple scripts for given OS X ' - + 'version %s', script_name, version) - sys.exit(1) - - settings = dict() - for k in config.options('openlp'): - settings[k] = config.get('openlp', k) - - # prepare the configuration files - os.system('python expander.py --config %(config_file)s \ - --template openlp.spec.master \ - --expandto %(target_directory)s/openlp.spec' \ - % { 'config_file' : options.config, 'target_directory' : os.getcwd() }) - os.system('python expander.py --config %(config_file)s \ - --template Info.plist.master \ - --expandto %(target_directory)s/Info.plist' \ - % { 'config_file' : options.config, 'target_directory' : os.getcwd() }) - os.system('python get_version.py > .version') - - # prepare variables - app_name_lower = settings['openlp_appname'].lower() - app_dir = os.getcwd() + '/' + settings['openlp_appname'] + '.app' - - # if the view option is set, skip the building steps - if (do_build is True): - build_application(settings, app_name_lower, app_dir) - - if (do_create_dmg is True): - (volume_basedir, dmg_file) = create_dmg(settings) - else: - # setting base dir - volume_basedir = options.basedir - dmg_file = os.getcwd() + '/' + settings['openlp_dmgname'] + '.dmg' - - if (do_package_view is True): - adjust_package_view(settings, adjustview_scriptname) - - if (do_create_dmg is True): - unmount_dmg(settings, volume_basedir) - - if (do_compress_dmg is True): - compress_dmg(settings) - - if (do_compress_view is True): - compress_view(settings, seticon_scriptname, dmg_file) - - if (do_compress_dmg is True): - logging.info('[%s] finished creating dmg file, resulting file is "%s"', - script_name, dmg_file) diff -Nru openlp-1.9.9/resources/osx/expander.py openlp-1.9.10/resources/osx/expander.py --- openlp-1.9.9/resources/osx/expander.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/expander.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,227 +0,0 @@ -#!/usr/bin/python -# -*- 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, Matthias Hub, Meinert Jordan, Armin Köhler, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 # -############################################################################### - -# TODOs: -# - defaults for non-supplied expansions: -# template contains - -import ConfigParser -import logging -import optparse -import os -import re -import sys - -# variable expansion: -# - %(dog)s --- normal python expansion -# - %(dog%)s --- no python expansion, leave as is (stripping the trailing %) -# - %(dog:cat) --- if there is an expansion for dog, dog will be used; -# otherwise if cat exists cat will be used -# - %(dog=cat) --- if there is an expansion for dog, dog will be used; -# otherwise "cat" will be used -# re_conf = re.compile(r'(?[^\(]+?)\)s') -re_conf = re.compile(r'(?P%?)%\((?P[^+=:&\)]+?)' - + '(?:(?P[+=:&])(?P[^\)]+))?\)(?Ps|d)') - -def expand_variable(match, expansions, errors): - key = match.group('key') - kind = match.group('kind') - default = match.group('default') - typ = match.group('type') - verbatim = match.group('verbatim') - - if verbatim: - return match.group(0)[1:] - - # literal default - if kind == '=': - if key in expansions: - return expansions[key] - return default - - # variable default - if kind == ':' and default in expansions: - return expansions[default] - - if kind == '+' and default in expansions: - if key in expansions: - key = expansions[key] - if typ == 's': - return '%s%s' % (key, expansions[default]) - if typ == 'd': - try: - return str(int(key) + int(expansions[default])) - except: - pass - - if kind == '&' and default in expansions: - if typ == 's': - return '%s%s' % (key, expansions[default]) - if typ == 'd': - try: - return str(int(key) + int(expansions[default])) - except: - pass - - if key in expansions: - return expansions[key] - - if not match.group(0) in errors: - errors.append(match.group(0)) - - return None - -options = None - -if __name__ == '__main__': - - # get config file - parser = optparse.OptionParser() - parser.add_option('-c', '--config', dest='config', - help='config file', metavar='CONFIG') - parser.add_option('-t', '--template', dest='template', - help='template file', metavar='TEMPLATE') - parser.add_option('-x', '--expandto', dest='expanded', - help='expanded file', metavar='EXPANDED') - parser.add_option('-e', '--echo', dest='echo', - help='echo variable', metavar='ECHOVAR') - - (options, args) = parser.parse_args() - - if not options.config: - parser.error('option --config|-c is required') - if not os.path.exists(options.config): - parser.error('config file "%s" does not exist' % options.config) - if not options.echo: - if not options.template: - parser.error('option --template|-t is required') - if not os.path.exists(options.template): - parser.error('template file "%s" does not exist' \ - % options.template) - if not options.expanded: - parser.error('option --expandto|-e is required') - - logHandler = logging.StreamHandler() - logHandler.setFormatter(logging.Formatter('%(asctime)s %(levelname)-8s ' - + ' %(message)s', '%a, %d %b %Y %H:%M:%S')) - logging.getLogger().addHandler(logHandler) - logging.getLogger().setLevel(logging.DEBUG) - - config = ConfigParser.RawConfigParser() - config.readfp(open(options.config, 'r')) - - if not config.has_section('openlp'): - logging.error('[expander] %s: config file "%s" lacks an [openlp] ' - + 'section', options.template, options.config) - - expansions = dict() - for k in config.options('openlp'): - expansions[k] = config.get('openlp', k) - - # commandline overrides? - for override in args: - if not '=' in override: - continue - - (k, v) = override.split('=', 2) - expansions[k] = v - - if options.echo: - if options.echo in expansions: - print expansions[options.echo] - sys.exit(0) - else: - sys.exit(1) - - # closure to capture expansions and errors variable - errors = [] - expanded = [] - - try: - # try to expand the template - line = 0 - faulty = False - - template = open(options.template, 'r') - raw = template.readlines() - template.close() - - def _expand(m): - return expand_variable(m, expansions = expansions, errors = errors) - - for l in raw: - line += 1 - exp = re_conf.sub(_expand, l) - if errors: - for key in errors: - logging.error('[expander] %s: line %d: could not expand ' - + 'key "%s"', options.template, line, key) - faulty = True - errors = [] - else: - expanded.append(exp) - - if faulty: - sys.exit(1) - - # successfully expanded template, now backup potentially existing - # target file - targetFile = options.expanded % expansions - if os.path.exists(targetFile): - if os.path.exists('%s~' % targetFile): - os.unlink('%s~' % targetFile) - os.rename(options.expanded, '%s~' % targetFile) - logging.info('[expander] %s: backed up existing target file "%s" ' - + 'to "%s"', options.template, targetFile, - '%s~' % options.expanded) - - # make sure that target directory exists - targetDir = os.path.dirname(targetFile) - if not os.path.exists(targetDir): - os.makedirs(targetDir) - - # write target file - try: - target = open(targetFile, 'w') - for exp in expanded: - target.write(exp) - target.close() - except Exception, e: - logging.error('[expander] %s: could not expand to "%s"', - options.template, options.expaned, e) - - # copy over file access mode from template - mode = os.stat(options.template) - os.chmod(options.expanded, mode.st_mode) - - logging.info('[expander] expanded "%s" to "%s"', - options.template, options.expanded) - - except: - pass - diff -Nru openlp-1.9.9/resources/osx/get_version.py openlp-1.9.10/resources/osx/get_version.py --- openlp-1.9.9/resources/osx/get_version.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/get_version.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -#!/usr/bin/env python -# -*- 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, Matthias Hub, Meinert Jordan, Armin Köhler, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 # -############################################################################### -import sys -import os -from bzrlib.branch import Branch - -def get_version(path): - b = Branch.open_containing(path)[0] - b.lock_read() - result = '0.0.0' - try: - # Get the branch's latest revision number. - revno = b.revno() - # Convert said revision number into a bzr revision id. - revision_id = b.dotted_revno_to_revision_id((revno,)) - # Get a dict of tags, with the revision id as the key. - tags = b.tags.get_reverse_tag_dict() - # Check if the latest - if revision_id in tags: - result = tags[revision_id][0] - else: - result = '%s-bzr%s' % (sorted(b.tags.get_tag_dict().keys())[-1], revno) - finally: - b.unlock() - return result - -def get_path(): - if len(sys.argv) > 1: - return os.path.abspath(sys.argv[1]) - else: - return os.path.abspath('.') - -if __name__ == u'__main__': - path = get_path() - print get_version(path) - diff -Nru openlp-1.9.9/resources/osx/Info.plist.master openlp-1.9.10/resources/osx/Info.plist.master --- openlp-1.9.9/resources/osx/Info.plist.master 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/Info.plist.master 1970-01-01 00:00:00.000000000 +0000 @@ -1,125 +0,0 @@ - - - - - - CFBundleDocumentTypes - - - CFBundleTypeExtension - - osz - - CFBundleTypeIconFiles - - openlp-logo-with-text.icns - - CFBundleTypeName - OpenLP Service - CFBundleTypeRole - Viewer - LSHandlerRank - Owner - LSItemContentTypes - - org.openlp.osz - - - - CFBundleTypeExtension - - otz - - CFBundleTypeIconFiles - - openlp-logo-with-text.icns - - CFBundleTypeName - OpenLP Theme - CFBundleTypeRole - Viewer - LSHandlerRank - Owner - LSItemContentTypes - - org.openlp.otz - - - - - UTExportedTypeDeclarations - - - UTTypeIdentifier - org.openlp.osz - UTTypeDescription - OpenLP Service - UTTypeConformsTo - - public.data - public.content - - UTTypeTagSpecification - - public.filename-extension - - osz - - public.mime-type - - application/x-openlp-service - - - - - UTTypeIdentifier - org.openlp.otz - UTTypeDescription - OpenLP Theme - UTTypeConformsTo - - public.data - public.content - - UTTypeTagSpecification - - public.filename-extension - - otz - - public.mime-type - - application/x-openlp-theme - - - - - -CFBundleIdentifier -org.openlp -CFBundleShortVersionString -%(openlp_version)s -CFBundleVersion -%(openlp_version)s -CFBundleInfoDictionaryVersion -6.0 -CFBundleDisplayName -%(openlp_appname)s -CFBundleIconFile -openlp-logo-with-text.icns -CFBundleExecutable -MacOS/openlp -CFBundleName -%(openlp_appname)s -CFBundleGetInfoString -%(openlp_appname)s %(openlp_version)s -LSHasLocalizedDisplayName - -NSAppleScriptEnabled - -CFBundlePackageType -APPL -LSBackgroundOnly - - - Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/resources/osx/installation-background.png and /tmp/Ord85b14Vk/openlp-1.9.10/resources/osx/installation-background.png differ diff -Nru openlp-1.9.9/resources/osx/Makefile openlp-1.9.10/resources/osx/Makefile --- openlp-1.9.9/resources/osx/Makefile 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/Makefile 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -all: - python build.py -c openlp.cfg - -view: - python build.py -c openlp.cfg --package-view --compress-view - -package: - - python build.py -c openlp.cfg --package --package-view - -bundle: - - python build.py -c openlp.cfg --compress --compress-view - -clean: - # remove old configuration files - rm -f openlp.spec - rm -f Info.plist - rm -f .version - - # remove old build artifacts - rm -rf build - rm -rf dist - rm -rf Macopenlp.app - rm -rf OpenLP.app - rm -f warnopenlp.txt - rm -f *dmg - diff -Nru openlp-1.9.9/resources/osx/openlp.cfg.sample openlp-1.9.10/resources/osx/openlp.cfg.sample --- openlp-1.9.9/resources/osx/openlp.cfg.sample 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/openlp.cfg.sample 1970-01-01 00:00:00.000000000 +0000 @@ -1,10 +0,0 @@ -[openlp] -openlp_appname = OpenLP -openlp_dmgname = OpenLP-1.9.6-bzrXXXX -openlp_version = XXXX -openlp_basedir = /Users/openlp/repo/trunk -openlp_icon_file = openlp-logo-with-text.icns -openlp_dmg_icon_file = openlp-logo-420x420.png -installer_backgroundimage_file = installation-background.png -pyinstaller_basedir = /Users/openlp/pyinstaller/trunk -qt_menu_basedir = /Library/Frameworks/QtGui.framework/Versions/4/Resources/qt_menu.nib Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/resources/osx/openlp-logo-420x420-background.png and /tmp/Ord85b14Vk/openlp-1.9.10/resources/osx/openlp-logo-420x420-background.png differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/resources/osx/openlp-logo-420x420.png and /tmp/Ord85b14Vk/openlp-1.9.10/resources/osx/openlp-logo-420x420.png differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/resources/osx/openlp-logo-with-text.icns and /tmp/Ord85b14Vk/openlp-1.9.10/resources/osx/openlp-logo-with-text.icns differ diff -Nru openlp-1.9.9/resources/osx/openlp.spec.master openlp-1.9.10/resources/osx/openlp.spec.master --- openlp-1.9.9/resources/osx/openlp.spec.master 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/osx/openlp.spec.master 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -# -*- mode: python -*- -a = Analysis([os.path.join(HOMEPATH,'support/_mountzlib.py'), os.path.join(CONFIGDIR,'support/useUnicode.py'), '%(openlp_basedir)s/openlp.pyw'], - pathex=['%(pyinstaller_basedir)s'], hookspath=['%(openlp_basedir)s/resources/pyinstaller']) -pyz = PYZ(a.pure) -exe = EXE(pyz, - a.scripts, - exclude_binaries=1, - name=os.path.join('build/pyi.darwin/openlp', 'openlp'), - debug=False, - strip=False, - upx=True, - console=1 ) -coll = COLLECT( exe, - a.binaries, - a.zipfiles, - a.datas, - strip=False, - upx=True, - name=os.path.join('dist', 'openlp')) -import sys -if sys.platform.startswith("darwin"): - app = BUNDLE(coll, - name='%(openlp_appname)s.app', - version='%(openlp_version)s') Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/resources/osx/openlp-splash-screen.png and /tmp/Ord85b14Vk/openlp-1.9.10/resources/osx/openlp-splash-screen.png differ diff -Nru openlp-1.9.9/resources/pyinstaller/hook-openlp.core.ui.media.py openlp-1.9.10/resources/pyinstaller/hook-openlp.core.ui.media.py --- openlp-1.9.9/resources/pyinstaller/hook-openlp.core.ui.media.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/pyinstaller/hook-openlp.core.ui.media.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,11 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # # Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode # -# Woldsund # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/resources/pyinstaller/hook-openlp.plugins.presentations.presentationplugin.py openlp-1.9.10/resources/pyinstaller/hook-openlp.plugins.presentations.presentationplugin.py --- openlp-1.9.9/resources/pyinstaller/hook-openlp.plugins.presentations.presentationplugin.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/pyinstaller/hook-openlp.plugins.presentations.presentationplugin.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,11 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # # Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode # -# Woldsund # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/resources/pyinstaller/hook-openlp.py openlp-1.9.10/resources/pyinstaller/hook-openlp.py --- openlp-1.9.9/resources/pyinstaller/hook-openlp.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/pyinstaller/hook-openlp.py 2012-06-23 16:35:18.000000000 +0000 @@ -5,11 +5,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # # Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode # -# Woldsund # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/resources/windows/LICENSE.txt openlp-1.9.10/resources/windows/LICENSE.txt --- openlp-1.9.9/resources/windows/LICENSE.txt 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/windows/LICENSE.txt 1970-01-01 00:00:00.000000000 +0000 @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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; either version 2 of the License, or - (at your option) any later version. - - 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., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a 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. diff -Nru openlp-1.9.9/resources/windows/OpenLP-2.0.iss openlp-1.9.10/resources/windows/OpenLP-2.0.iss --- openlp-1.9.9/resources/windows/OpenLP-2.0.iss 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/windows/OpenLP-2.0.iss 1970-01-01 00:00:00.000000000 +0000 @@ -1,184 +0,0 @@ -; Script generated by the Inno Setup Script Wizard. -; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! - -#define AppName "OpenLP" -#define AppVerName "OpenLP 2.0" -#define AppPublisher "OpenLP Developers" -#define AppURL "http://openlp.org/" -#define AppExeName "OpenLP.exe" - -#define FileHandle FileOpen("..\..\dist\OpenLP\.version") -#define FileLine FileRead(FileHandle) -#define RealVersion FileLine -#expr FileClose(FileHandle) - -[Setup] -; NOTE: The value of AppId uniquely identifies this application. -; Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppID={{AA7699FA-B2D2-43F4-8A70-D497D03C9485} -AppName={#AppName} -AppVerName={#AppVerName} -AppPublisher={#AppPublisher} -AppPublisherURL={#AppURL} -AppSupportURL={#AppURL} -AppUpdatesURL={#AppURL} -DefaultDirName={pf}\{#AppName} -DefaultGroupName={#AppVerName} -AllowNoIcons=true -LicenseFile=LICENSE.txt -OutputDir=..\..\dist -OutputBaseFilename=OpenLP-{#RealVersion}-setup -Compression=lzma/Max -SolidCompression=true -SetupIconFile=OpenLP.ico -WizardImageFile=WizImageBig.bmp -WizardSmallImageFile=WizImageSmall.bmp -ChangesAssociations=true - -[Languages] -Name: english; MessagesFile: compiler:Default.isl -Name: basque; MessagesFile: compiler:Languages\Basque.isl -Name: brazilianportuguese; MessagesFile: compiler:Languages\BrazilianPortuguese.isl -Name: catalan; MessagesFile: compiler:Languages\Catalan.isl -Name: czech; MessagesFile: compiler:Languages\Czech.isl -Name: danish; MessagesFile: compiler:Languages\Danish.isl -Name: dutch; MessagesFile: compiler:Languages\Dutch.isl -Name: finnish; MessagesFile: compiler:Languages\Finnish.isl -Name: french; MessagesFile: compiler:Languages\French.isl -Name: german; MessagesFile: compiler:Languages\German.isl -Name: hebrew; MessagesFile: compiler:Languages\Hebrew.isl -Name: hungarian; MessagesFile: compiler:Languages\Hungarian.isl -Name: italian; MessagesFile: compiler:Languages\Italian.isl -Name: japanese; MessagesFile: compiler:Languages\Japanese.isl -Name: norwegian; MessagesFile: compiler:Languages\Norwegian.isl -Name: polish; MessagesFile: compiler:Languages\Polish.isl -Name: portuguese; MessagesFile: compiler:Languages\Portuguese.isl -Name: russian; MessagesFile: compiler:Languages\Russian.isl -Name: slovak; MessagesFile: compiler:Languages\Slovak.isl -Name: slovenian; MessagesFile: compiler:Languages\Slovenian.isl -Name: spanish; MessagesFile: compiler:Languages\Spanish.isl - -[Tasks] -Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons} -Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; OnlyBelowVersion: 0, 6.1 - -[Files] -Source: ..\..\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs -; DLL used to check if the target program is running at install time -Source: psvince.dll; flags: dontcopy -; psvince is installed in {app} folder, so it will be loaded at -; uninstall time to check if the target program is running -Source: psvince.dll; DestDir: {app} - -[Icons] -Name: {group}\{#AppName}; Filename: {app}\{#AppExeName} -Name: {group}\{#AppName} (Debug); Filename: {app}\{#AppExeName}; Parameters: -l debug -Name: {group}\{#AppName} Help; Filename: {app}\{#AppName}.chm; Check: FileExists(ExpandConstant('{app}\{#AppName}.chm')) -Name: {group}\{cm:ProgramOnTheWeb,{#AppName}}; Filename: {#AppURL} -Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe} -Name: {commondesktop}\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: desktopicon -Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: quicklaunchicon - -[Run] -Filename: {app}\{#AppExeName}; Description: {cm:LaunchProgram,{#AppName}}; Flags: nowait postinstall skipifsilent - -[Registry] -Root: HKCR; Subkey: .osz; ValueType: string; ValueName: ; ValueData: OpenLP; Flags: uninsdeletevalue -Root: HKCR; Subkey: OpenLP; ValueType: string; ValueName: ; ValueData: OpenLP Service; Flags: uninsdeletekey -Root: HKCR; Subkey: OpenLP\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\OpenLP.exe,0 -Root: HKCR; Subkey: OpenLP\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\OpenLP.exe"" ""%1""" - -[UninstallDelete] -; Remove support directory created when program is run: -Type: filesandordirs; Name: {app}\support -; Remove program directory if empty: -Name: {app}; Type: dirifempty - -[Code] -// Function to call psvince.dll at install time -function IsModuleLoadedInstall(modulename: AnsiString ): Boolean; -external 'IsModuleLoaded@files:psvince.dll stdcall setuponly'; - -// Function to call psvince.dll at uninstall time -function IsModuleLoadedUninstall(modulename: AnsiString ): Boolean; -external 'IsModuleLoaded@{app}\psvince.dll stdcall uninstallonly' ; - -function GetUninstallString(): String; -var - sUnInstPath: String; - sUnInstallString: String; -begin - sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'); - sUnInstallString := ''; - if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then - RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); - Result := sUnInstallString; -end; - -function IsUpgrade(): Boolean; -begin - Result := (GetUninstallString() <> ''); -end; - -// Return Values: -// 1 - uninstall string is empty -// 2 - error executing the UnInstallString -// 3 - successfully executed the UnInstallString -function UnInstallOldVersion(): Integer; -var - sUnInstallString: String; - iResultCode: Integer; -begin - Result := 0; - sUnInstallString := GetUninstallString(); - if sUnInstallString <> '' then - begin - sUnInstallString := RemoveQuotes(sUnInstallString); - if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then - Result := 3 - else - Result := 2; - end - else - Result := 1; -end; - -function InitializeSetup(): Boolean; -begin - Result := true; - while IsModuleLoadedInstall( 'OpenLP.exe' ) and Result do - begin - if MsgBox( 'Openlp is currently running, please close it to continue the install.', - mbError, MB_OKCANCEL ) = IDCANCEL then - begin - Result := false; - end; - end; -end; - -procedure CurStepChanged(CurStep: TSetupStep); -begin - if (CurStep=ssInstall) then - begin - if (IsUpgrade()) then - begin - UnInstallOldVersion(); - end; - end; -end; - -function InitializeUninstall(): Boolean; -begin - Result := true; - while IsModuleLoadedUninstall( 'OpenLP.exe' ) and Result do - begin - if MsgBox( 'Openlp is currently running, please close it to continue the uninstall.', - mbError, MB_OKCANCEL ) = IDCANCEL then - begin - Result := false; - end; - end; -// Unload psvince.dll, otherwise it is not deleted - UnloadDLL(ExpandConstant('{app}\psvince.dll')); -end; diff -Nru openlp-1.9.9/resources/windows/openlp.conf openlp-1.9.10/resources/windows/openlp.conf --- openlp-1.9.9/resources/windows/openlp.conf 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/resources/windows/openlp.conf 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -[bibles] -status = 1 - -[media] -status = 1 - -[alerts] -status = 1 - -[presentations] -status = 1 - -[custom] -status = 1 - -[remotes] -status = 0 - -[images] -status = 1 - -[songusage] -status = 1 - -[songs] -status = 1 Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/resources/windows/OpenLP.ico and /tmp/Ord85b14Vk/openlp-1.9.10/resources/windows/OpenLP.ico differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/resources/windows/OpenLP.reg and /tmp/Ord85b14Vk/openlp-1.9.10/resources/windows/OpenLP.reg differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/resources/windows/WizImageBig.bmp and /tmp/Ord85b14Vk/openlp-1.9.10/resources/windows/WizImageBig.bmp differ Binary files /tmp/vtaWEC1pUB/openlp-1.9.9/resources/windows/WizImageSmall.bmp and /tmp/Ord85b14Vk/openlp-1.9.10/resources/windows/WizImageSmall.bmp differ diff -Nru openlp-1.9.9/scripts/check_dependencies.py openlp-1.9.10/scripts/check_dependencies.py --- openlp-1.9.9/scripts/check_dependencies.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/scripts/check_dependencies.py 2012-06-23 16:35:18.000000000 +0000 @@ -7,10 +7,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/scripts/generate_resources.sh openlp-1.9.10/scripts/generate_resources.sh --- openlp-1.9.9/scripts/generate_resources.sh 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/scripts/generate_resources.sh 2012-06-23 16:35:18.000000000 +0000 @@ -6,10 +6,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/scripts/openlp-remoteclient.py openlp-1.9.10/scripts/openlp-remoteclient.py --- openlp-1.9.9/scripts/openlp-remoteclient.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/scripts/openlp-remoteclient.py 2012-06-23 16:35:18.000000000 +0000 @@ -6,11 +6,12 @@ # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # # Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode # -# Woldsund # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/scripts/translation_utils.py openlp-1.9.10/scripts/translation_utils.py --- openlp-1.9.9/scripts/translation_utils.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/scripts/translation_utils.py 2012-06-23 16:35:18.000000000 +0000 @@ -7,10 +7,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/scripts/windows-builder.py openlp-1.9.10/scripts/windows-builder.py --- openlp-1.9.9/scripts/windows-builder.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/scripts/windows-builder.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,407 +0,0 @@ -# -*- 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, Matthias Hub, Meinert Jordan, Armin Köhler, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 # -############################################################################### - -""" -Windows Build Script --------------------- - -This script is used to build the Windows binary and the accompanying installer. -For this script to work out of the box, it depends on a number of things: - -Python 2.6/2.7 - -PyQt4 - You should already have this installed, OpenLP doesn't work without it. The - version the script expects is the packaged one available from River Bank - Computing. - -PyEnchant - This script expects the precompiled, installable version of PyEnchant to be - installed. You can find this on the PyEnchant site. - -Inno Setup 5 - Inno Setup should be installed into "C:\%PROGRAMFILES%\Inno Setup 5" - -Sphinx - This is used to build the documentation. The documentation trunk must be at - the same directory level as Openlp trunk and named "documentation". - -HTML Help Workshop - This is used to create the help file. - -PyInstaller - PyInstaller should be a checkout of revision 1470 of trunk, and in a - directory called, "pyinstaller" on the same level as OpenLP's Bazaar shared - repository directory. The revision is very important as there is currently - a major regression in HEAD. - - To install PyInstaller, first checkout trunk from Subversion. The easiest - way is to install TortoiseSVN and then checkout the following URL to a - directory called "pyinstaller":: - - http://svn.pyinstaller.org/trunk - -Bazaar - You need the command line "bzr" client installed. - -OpenLP - A checkout of the latest code, in a branch directory, which is in a Bazaar - shared repository directory. This means your code should be in a directory - structure like this: "openlp\branch-name". - -Visual C++ 2008 Express Edition - This is to build pptviewlib.dll, the library for controlling the - PowerPointViewer. - -windows-builder.py - This script, of course. It should be in the "scripts" directory of OpenLP. - -psvince.dll - This dll is used during the actual install of OpenLP to check if OpenLP is - running on the users machine prior to the setup. If OpenLP is running, - the install will fail. The dll can be obtained from here: - - http://www.vincenzo.net/isxkb/index.php?title=PSVince) - - The dll is presently included in .\\resources\\windows - -Mako - Mako Templates for Python. This package is required for building the - remote plugin. It can be installed by going to your - python_directory\scripts\.. and running "easy_install Mako". If you do not - have easy_install, the Mako package can be obtained here: - - http://www.makotemplates.org/download.html - -Sqlalchemy Migrate - Required for the data-bases used in OpenLP. The package can be - obtained here: - - http://code.google.com/p/sqlalchemy-migrate/ - -""" - -import os -import sys -from shutil import copy, rmtree -from subprocess import Popen, PIPE -from ConfigParser import SafeConfigParser as ConfigParser - -# Executable paths -python_exe = sys.executable -innosetup_exe = os.path.join(os.getenv(u'PROGRAMFILES'), 'Inno Setup 5', - u'ISCC.exe') -sphinx_exe = os.path.join(os.path.split(python_exe)[0], u'Scripts', - u'sphinx-build.exe') -hhc_exe = os.path.join(os.getenv(u'PROGRAMFILES'), 'HTML Help Workshop', - u'hhc.exe') -vcbuild_exe = os.path.join(os.getenv(u'PROGRAMFILES'), - u'Microsoft Visual Studio 9.0', u'VC', u'vcpackages', u'vcbuild.exe') - -# Base paths -script_path = os.path.split(os.path.abspath(__file__))[0] -branch_path = os.path.abspath(os.path.join(script_path, u'..')) -doc_branch_path = os.path.abspath(os.path.join(script_path, u'..', - u'..', u'documentation')) -site_packages = os.path.join(os.path.split(python_exe)[0], u'Lib', - u'site-packages') - -# Files and executables -pyi_build = os.path.abspath(os.path.join(branch_path, u'..', u'..', - u'pyinstaller', u'pyinstaller.py')) -openlp_main_script = os.path.abspath(os.path.join(branch_path, 'openlp.pyw')) -if os.path.exists(os.path.join(site_packages, u'PyQt4', u'bin')): - # Older versions of the PyQt4 Windows installer put their binaries in the - # "bin" directory - lrelease_exe = os.path.join(site_packages, u'PyQt4', u'bin', u'lrelease.exe') -else: - # Newer versions of the PyQt4 Windows installer put their binaries in the - # base directory of the installation - lrelease_exe = os.path.join(site_packages, u'PyQt4', u'lrelease.exe') -i18n_utils = os.path.join(script_path, u'translation_utils.py') -win32_icon = os.path.join(branch_path, u'resources', u'images', 'OpenLP.ico') - -# Paths -source_path = os.path.join(branch_path, u'openlp') -manual_path = os.path.join(doc_branch_path, u'manual') -manual_build_path = os.path.join(manual_path, u'build') -helpfile_path = os.path.join(manual_build_path, u'htmlhelp') -i18n_path = os.path.join(branch_path, u'resources', u'i18n') -winres_path = os.path.join(branch_path, u'resources', u'windows') -build_path = os.path.join(branch_path, u'build') -dist_path = os.path.join(branch_path, u'dist', u'OpenLP') -pptviewlib_path = os.path.join(source_path, u'plugins', u'presentations', - u'lib', u'pptviewlib') -hooks_path = os.path.join(branch_path , u'resources', u'pyinstaller') - -# Transifex details -- will be read in from the file. -transifex_filename = os.path.abspath(os.path.join(branch_path, '..', - 'transifex.conf')) - -def update_code(): - os.chdir(branch_path) - print u'Reverting any changes to the code...' - bzr = Popen((u'bzr', u'revert'), stdout=PIPE) - output, error = bzr.communicate() - code = bzr.wait() - if code != 0: - print output - raise Exception(u'Error reverting the code') - print u'Updating the code...' - bzr = Popen((u'bzr', u'update'), stdout=PIPE) - output, error = bzr.communicate() - code = bzr.wait() - if code != 0: - print output - raise Exception(u'Error updating the code') - -def run_pyinstaller(): - print u'Running PyInstaller...' - os.chdir(branch_path) - pyinstaller = Popen((python_exe, pyi_build, - u'--noconfirm', - u'--windowed', - u'--noupx', - u'--additional-hooks-dir', hooks_path, - u'--log-level=ERROR', - u'-o', branch_path, - u'-i', win32_icon, - u'-p', branch_path, - u'-n', 'OpenLP', - openlp_main_script), - stdout=PIPE) - output, error = pyinstaller.communicate() - code = pyinstaller.wait() - if code != 0: - print output - raise Exception(u'Error running PyInstaller') - -def write_version_file(): - print u'Writing version file...' - os.chdir(branch_path) - bzr = Popen((u'bzr', u'tags', u'--sort', u'time'), stdout=PIPE) - output, error = bzr.communicate() - code = bzr.wait() - if code != 0: - raise Exception(u'Error running bzr tags') - lines = output.splitlines() - if len(lines) == 0: - tag = u'0.0.0' - revision = u'0' - else: - tag, revision = lines[-1].split() - bzr = Popen((u'bzr', u'log', u'--line', u'-r', u'-1'), stdout=PIPE) - output, error = bzr.communicate() - code = bzr.wait() - if code != 0: - raise Exception(u'Error running bzr log') - outputAscii = unicode(output, errors='ignore') - latest = outputAscii.split(u':')[0] - versionstring = latest == revision and tag or u'%s-bzr%s' % (tag, latest) - f = open(os.path.join(dist_path, u'.version'), u'w') - f.write(versionstring) - f.close() - -def copy_plugins(): - print u'Copying plugins...' - source = os.path.join(source_path, u'plugins') - dest = os.path.join(dist_path, u'plugins') - for root, dirs, files in os.walk(source): - for filename in files: - if not filename.endswith(u'.pyc'): - dest_path = os.path.join(dest, root[len(source)+1:]) - if not os.path.exists(dest_path): - os.makedirs(dest_path) - copy(os.path.join(root, filename), - os.path.join(dest_path, filename)) - -def copy_media_player(): - print u'Copying media player...' - source = os.path.join(source_path, u'core', u'ui', u'media') - dest = os.path.join(dist_path, u'core', u'ui', u'media') - for root, dirs, files in os.walk(source): - for filename in files: - if not filename.endswith(u'.pyc'): - dest_path = os.path.join(dest, root[len(source)+1:]) - if not os.path.exists(dest_path): - os.makedirs(dest_path) - copy(os.path.join(root, filename), - os.path.join(dest_path, filename)) - -def copy_windows_files(): - print u'Copying extra files for Windows...' - copy(os.path.join(winres_path, u'OpenLP.ico'), - os.path.join(dist_path, u'OpenLP.ico')) - copy(os.path.join(winres_path, u'LICENSE.txt'), - os.path.join(dist_path, u'LICENSE.txt')) - copy(os.path.join(winres_path, u'psvince.dll'), - os.path.join(dist_path, u'psvince.dll')) - if os.path.isfile(os.path.join(helpfile_path, u'OpenLP.chm')): - print u' Windows help file found' - copy(os.path.join(helpfile_path, u'OpenLP.chm'), - os.path.join(dist_path, u'OpenLP.chm')) - else: - print u' WARNING ---- Windows help file not found ---- WARNING' - -def update_translations(): - print u'Updating translations...' - if not os.path.exists(transifex_filename): - raise Exception(u'Could not find Transifex credentials file: %s' \ - % transifex_filename) - config = ConfigParser() - config.read(transifex_filename) - if not config.has_section('transifex'): - raise Exception(u'No section named "transifex" found.') - if not config.has_option('transifex', 'username'): - raise Exception(u'No option named "username" found.') - if not config.has_option('transifex', 'password'): - raise Exception(u'No option named "password" found.') - username = config.get('transifex', 'username') - password = config.get('transifex', 'password') - os.chdir(script_path) - translation_utils = Popen([python_exe, i18n_utils, u'-qdpu', '-U', - username, '-P', password]) - code = translation_utils.wait() - if code != 0: - raise Exception(u'Error running translation_utils.py') - -def compile_translations(): - print u'Compiling translations...' - files = os.listdir(i18n_path) - if not os.path.exists(os.path.join(dist_path, u'i18n')): - os.makedirs(os.path.join(dist_path, u'i18n')) - for file in files: - if file.endswith(u'.ts'): - source_path = os.path.join(i18n_path, file) - dest_path = os.path.join(dist_path, u'i18n', - file.replace(u'.ts', u'.qm')) - lconvert = Popen((lrelease_exe, u'-compress', u'-silent', - source_path, u'-qm', dest_path)) - code = lconvert.wait() - if code != 0: - raise Exception('Error running lconvert on %s' % source_path) - print u'Copying qm files...' - source = os.path.join(site_packages, u'PyQt4', u'translations') - files = os.listdir(source) - for filename in files: - if filename.startswith(u'qt_') and filename.endswith(u'.qm') and \ - len(filename) == 8: - copy(os.path.join(source, filename), - os.path.join(dist_path, u'i18n', filename)) - -def run_sphinx(): - print u'Deleting previous manual build...', manual_build_path - if os.path.exists(manual_build_path): - rmtree(manual_build_path) - print u'Running Sphinx...' - os.chdir(manual_path) - sphinx = Popen((sphinx_exe, u'-b', u'htmlhelp', u'-d', u'build/doctrees', - u'source', u'build/htmlhelp'), stdout=PIPE) - output, error = sphinx.communicate() - code = sphinx.wait() - if code != 0: - print output - raise Exception(u'Error running Sphinx') - -def run_htmlhelp(): - print u'Running HTML Help Workshop...' - os.chdir(os.path.join(manual_build_path, u'htmlhelp')) - hhc = Popen((hhc_exe, u'OpenLP.chm'), stdout=PIPE) - output, error = hhc.communicate() - code = hhc.wait() - if code != 1: - print u'Exit code:', code - print output - raise Exception(u'Error running HTML Help Workshop') - -def run_innosetup(): - print u'Running Inno Setup...' - os.chdir(winres_path) - innosetup = Popen((innosetup_exe, - os.path.join(winres_path, u'OpenLP-2.0.iss'), u'/q')) - code = innosetup.wait() - if code != 0: - raise Exception(u'Error running Inno Setup') - -def build_pptviewlib(): - print u'Building PPTVIEWLIB.DLL...' - vcbuild = Popen((vcbuild_exe, u'/rebuild', - os.path.join(pptviewlib_path, u'pptviewlib.vcproj'), u'Release|Win32')) - code = vcbuild.wait() - if code != 0: - raise Exception(u'Error building pptviewlib.dll') - copy(os.path.join(pptviewlib_path, u'Release', u'pptviewlib.dll'), - pptviewlib_path) - -def main(): - skip_update = False - import sys - for arg in sys.argv: - if arg == u'-v' or arg == u'--verbose': - print "OpenLP main script: ......", openlp_main_script - print "Script path: .............", script_path - print "Branch path: .............", branch_path - print "Source path: .............", source_path - print "\"dist\" path: .............", dist_path - print "PyInstaller: .............", pyi_build - print "Documentation branch path:", doc_branch_path - print "Help file build path: ....", helpfile_path - print "Inno Setup path: .........", innosetup_exe - print "Windows resources: .......", winres_path - print "VCBuild path: ............", vcbuild_exe - print "PPTVIEWLIB path: .........", pptviewlib_path - print "" - elif arg == u'--skip-update': - skip_update = True - elif arg == u'/?' or arg == u'-h' or arg == u'--help': - print u'Command options:' - print u' -v --verbose : More verbose output' - print u' --skip-update : Do not update or revert current branch' - exit() - if not skip_update: - update_code() - build_pptviewlib() - run_pyinstaller() - write_version_file() - copy_plugins() - copy_media_player() - if os.path.exists(manual_path): - run_sphinx() - run_htmlhelp() - else: - print u' ' - print u' WARNING ---- Documentation Trunk not found ---- WARNING' - print u' --- Windows Help file will not be included in build ---' - print u' ' - copy_windows_files() - update_translations() - compile_translations() - run_innosetup() - print "Done." - -if __name__ == u'__main__': - main() diff -Nru openlp-1.9.9/setup.py openlp-1.9.10/setup.py --- openlp-1.9.9/setup.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/setup.py 2012-06-23 16:35:18.000000000 +0000 @@ -7,10 +7,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2012 Raoul Snyman # # Portions copyright (c) 2008-2012 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -104,7 +105,7 @@ url='http://openlp.org/', license='GNU General Public License', packages=find_packages(exclude=['ez_setup', 'examples', 'tests']), - scripts=['openlp.pyw', 'scripts/openlp-remoteclient.py'], + scripts=['openlp.pyw'], include_package_data=True, zip_safe=False, install_requires=[ diff -Nru openlp-1.9.9/testing/conftest.py openlp-1.9.10/testing/conftest.py --- openlp-1.9.9/testing/conftest.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/testing/conftest.py 2012-06-23 16:35:18.000000000 +0000 @@ -7,10 +7,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # diff -Nru openlp-1.9.9/testing/run.py openlp-1.9.10/testing/run.py --- openlp-1.9.9/testing/run.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/testing/run.py 2012-06-23 16:35:18.000000000 +0000 @@ -7,10 +7,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 # @@ -34,7 +35,7 @@ """ -import os.path +import os import sys TESTS_PATH = os.path.dirname(os.path.abspath(__file__)) diff -Nru openlp-1.9.9/testing/test_app.py openlp-1.9.10/testing/test_app.py --- openlp-1.9.9/testing/test_app.py 2012-05-04 16:32:53.000000000 +0000 +++ openlp-1.9.10/testing/test_app.py 2012-06-23 16:35:18.000000000 +0000 @@ -7,10 +7,11 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # -# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # -# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # +# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, # +# Meinert Jordan, Armin Köhler, Edwin Lunando, Joshua Miller, Stevan Pettit, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Simon Scudder, Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon # +# Tibble, Dave Warnock, 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 #