diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 1f911491f..7fd4cc313 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -1,336 +1,336 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### -""" -The :mod:`lib` module contains most of the components and libraries that make -OpenLP work. -""" -import logging -import os.path -import types - -from PyQt4 import QtCore, QtGui - -log = logging.getLogger(__name__) - -# TODO make external and configurable in alpha 4 via a settings dialog -html_expands = [] - -html_expands.append({u'desc':u'Red', u'start tag':u'{r}', \ - u'start html':u'', \ - u'end tag':u'{/r}', u'end html':u'', \ - u'protected':False}) -html_expands.append({u'desc':u'Black', u'start tag':u'{b}', \ - u'start html':u'', \ - u'end tag':u'{/b}', u'end html':u'', \ - u'protected':False}) -html_expands.append({u'desc':u'Blue', u'start tag':u'{bl}', \ - u'start html':u'', \ - u'end tag':u'{/bl}', u'end html':u'', \ - u'protected':False}) -html_expands.append({u'desc':u'Yellow', u'start tag':u'{y}', \ - u'start html':u'', \ - u'end tag':u'{/y}', u'end html':u'', \ - u'protected':False}) -html_expands.append({u'desc':u'Green', u'start tag':u'{g}', \ - u'start html':u'', \ - u'end tag':u'{/g}', u'end html':u'', \ - u'protected':False}) -html_expands.append({u'desc':u'Pink', u'start tag':u'{pk}', \ - u'start html':u'', \ - u'end tag':u'{/pk}', u'end html':u'', \ - u'protected':False}) -html_expands.append({u'desc':u'Orange', u'start tag':u'{o}', \ - u'start html':u'', \ - u'end tag':u'{/o}', u'end html':u'', \ - u'protected':False}) -html_expands.append({u'desc':u'Purple', u'start tag':u'{pp}', \ - u'start html':u'', \ - u'end tag':u'{/pp}', u'end html':u'', \ - u'protected':False}) -html_expands.append({u'desc':u'White', u'start tag':u'{w}', \ - u'start html':u'', \ - u'end tag':u'{/w}', u'end html':u'', \ - u'protected':False}) -html_expands.append({u'desc':u'Superscript', u'start tag':u'{su}', \ - u'start html':u'', \ - u'end tag':u'{/su}', u'end html':u'', \ - u'protected':True}) -html_expands.append({u'desc':u'Subscript', u'start tag':u'{sb}', \ - u'start html':u'', \ - u'end tag':u'{/sb}', u'end html':u'', \ - u'protected':True}) -html_expands.append({u'desc':u'Paragraph', u'start tag':u'{p}', \ - u'start html':u'

', \ - u'end tag':u'{/p}', u'end html':u'

', \ - u'protected':True}) -html_expands.append({u'desc':u'Bold', u'start tag':u'{st}', \ - u'start html':u'', \ - u'end tag':u'{/st}', \ - u'end html':u'', \ - u'protected':True}) -html_expands.append({u'desc':u'Italics', u'start tag':u'{it}', \ - u'start html':u'', \ - u'end tag':u'{/it}', u'end html':u'', \ - u'protected':True}) - -def translate(context, text, comment=None): - """ - A special shortcut method to wrap around the Qt4 translation functions. - This abstracts the translation procedure so that we can change it if at a - later date if necessary, without having to redo the whole of OpenLP. - - ``context`` - The translation context, used to give each string a context or a - namespace. - - ``text`` - The text to put into the translation tables for translation. - - ``comment`` - An identifying string for when the same text is used in different roles - within the same context. - """ - return QtCore.QCoreApplication.translate(context, text, comment) - -def get_text_file_string(text_file): - """ - Open a file and return its content as unicode string. If the supplied file - name is not a file then the function returns False. If there is an error - loading the file or the content can't be decoded then the function will - return None. - - ``textfile`` - The name of the file. - """ - if not os.path.isfile(text_file): - return False - file_handle = None - content_string = None - try: - file_handle = open(text_file, u'r') - content = file_handle.read() - content_string = content.decode(u'utf-8') - except (IOError, UnicodeError): - log.exception(u'Failed to open text file %s' % text_file) - finally: - if file_handle: - file_handle.close() - return content_string - -def str_to_bool(stringvalue): - """ - Convert a string version of a boolean into a real boolean. - - ``stringvalue`` - The string value to examine and convert to a boolean type. - """ - if isinstance(stringvalue, bool): - 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 - physical file location. If the icon is a QIcon instance, that icon is - simply returned. If not, it builds a QIcon instance from the resource or - file name. - - ``icon`` - The icon to build. This can be a QIcon, a resource string in the form - ``:/resource/file.png``, or a file location like ``/path/to/file.png``. - """ - button_icon = QtGui.QIcon() - if isinstance(icon, QtGui.QIcon): - button_icon = icon - elif isinstance(icon, basestring): - if icon.startswith(u':/'): - button_icon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal, - QtGui.QIcon.Off) - else: - button_icon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), - QtGui.QIcon.Normal, QtGui.QIcon.Off) - elif isinstance(icon, QtGui.QImage): - button_icon.addPixmap(QtGui.QPixmap.fromImage(icon), - QtGui.QIcon.Normal, QtGui.QIcon.Off) - return button_icon - -def context_menu_action(base, icon, text, slot): - """ - Utility method to help build context menus for plugins - - ``base`` - The parent menu to add this menu item to - - ``icon`` - An icon for this action - - ``text`` - The text to display for this action - - ``slot`` - The code to run when this action is triggered - """ - action = QtGui.QAction(text, base) - if icon: - action.setIcon(build_icon(icon)) - QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) - return action - -def context_menu(base, icon, text): - """ - Utility method to help build context menus for plugins - - ``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 context_menu_separator(base): - """ - Add a separator to a context menu - - ``base`` - The menu object to add the separator to - """ - action = QtGui.QAction(u'', base) - action.setSeparator(True) - return action - -def image_to_byte(image): - """ - Resize an image to fit on the current screen for the web and returns - it as a byte stream. - - ``image`` - The image to converted. - """ - byte_array = QtCore.QByteArray() - # use buffer to store pixmap into byteArray - buffie = QtCore.QBuffer(byte_array) - buffie.open(QtCore.QIODevice.WriteOnly) - if isinstance(image, QtGui.QImage): - pixmap = QtGui.QPixmap.fromImage(image) - else: - pixmap = QtGui.QPixmap(image) - pixmap.save(buffie, "PNG") - # convert to base64 encoding so does not get missed! - return byte_array.toBase64() - -def resize_image(image, width, height, background=QtCore.Qt.black): - """ - Resize an image to fit on the current screen. - - ``image`` - The image to resize. - - ``width`` - The new image width. - - ``height`` - The new image height. - - ``background`` - The background colour defaults to black. - - """ - preview = QtGui.QImage(image) - if not preview.isNull(): - # Only resize if different size - if preview.width() == width and preview.height == height: - return preview - preview = preview.scaled(width, height, QtCore.Qt.KeepAspectRatio, - QtCore.Qt.SmoothTransformation) - realw = preview.width() - realh = preview.height() - # and move it to the centre of the preview space - new_image = QtGui.QImage(width, height, - QtGui.QImage.Format_ARGB32_Premultiplied) - new_image.fill(background) - painter = QtGui.QPainter(new_image) - 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 - - ``list_widget`` - The list to check for selected items - - ``message`` - The message to give the user if no item is selected - """ - if not list_widget.selectedIndexes(): - QtGui.QMessageBox.information(list_widget.parent(), - translate('OpenLP.MediaManagerItem', 'No Items Selected'), message) - return False - return True - -def clean_tags(text): - """ - Remove Tags from text for display - """ - text = text.replace(u'
', u'\n') - for tag in html_expands: - text = text.replace(tag[u'start tag'], u'') - text = text.replace(tag[u'end tag'], u'') - return text - -def expand_tags(text): - """ - Expand tags HTML for display - """ - for tag in html_expands: - text = text.replace(tag[u'start tag'], tag[u'start html']) - text = text.replace(tag[u'end tag'], tag[u'end html']) - return text - -from spelltextedit import SpellTextEdit -from eventreceiver import Receiver -from settingsmanager import SettingsManager -from plugin import PluginStatus, Plugin -from pluginmanager import PluginManager -from settingstab import SettingsTab -from serviceitem import ServiceItem -from serviceitem import ServiceItemType -from serviceitem import ItemCapabilities -from htmlbuilder import build_html, build_lyrics_format_css, \ - build_lyrics_outline_css -from toolbar import OpenLPToolbar -from dockwidget import OpenLPDockWidget -from theme import ThemeLevel, ThemeXML -from renderer import Renderer -from rendermanager import RenderManager -from mediamanageritem import MediaManagerItem -from baselistwithdnd import BaseListWithDnD +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### +""" +The :mod:`lib` module contains most of the components and libraries that make +OpenLP work. +""" +import logging +import os.path +import types + +from PyQt4 import QtCore, QtGui + +log = logging.getLogger(__name__) + +# TODO make external and configurable in alpha 4 via a settings dialog +html_expands = [] + +html_expands.append({u'desc':u'Red', u'start tag':u'{r}', \ + u'start html':u'', \ + u'end tag':u'{/r}', u'end html':u'', \ + u'protected':False}) +html_expands.append({u'desc':u'Black', u'start tag':u'{b}', \ + u'start html':u'', \ + u'end tag':u'{/b}', u'end html':u'', \ + u'protected':False}) +html_expands.append({u'desc':u'Blue', u'start tag':u'{bl}', \ + u'start html':u'', \ + u'end tag':u'{/bl}', u'end html':u'', \ + u'protected':False}) +html_expands.append({u'desc':u'Yellow', u'start tag':u'{y}', \ + u'start html':u'', \ + u'end tag':u'{/y}', u'end html':u'', \ + u'protected':False}) +html_expands.append({u'desc':u'Green', u'start tag':u'{g}', \ + u'start html':u'', \ + u'end tag':u'{/g}', u'end html':u'', \ + u'protected':False}) +html_expands.append({u'desc':u'Pink', u'start tag':u'{pk}', \ + u'start html':u'', \ + u'end tag':u'{/pk}', u'end html':u'', \ + u'protected':False}) +html_expands.append({u'desc':u'Orange', u'start tag':u'{o}', \ + u'start html':u'', \ + u'end tag':u'{/o}', u'end html':u'', \ + u'protected':False}) +html_expands.append({u'desc':u'Purple', u'start tag':u'{pp}', \ + u'start html':u'', \ + u'end tag':u'{/pp}', u'end html':u'', \ + u'protected':False}) +html_expands.append({u'desc':u'White', u'start tag':u'{w}', \ + u'start html':u'', \ + u'end tag':u'{/w}', u'end html':u'', \ + u'protected':False}) +html_expands.append({u'desc':u'Superscript', u'start tag':u'{su}', \ + u'start html':u'', \ + u'end tag':u'{/su}', u'end html':u'', \ + u'protected':True}) +html_expands.append({u'desc':u'Subscript', u'start tag':u'{sb}', \ + u'start html':u'', \ + u'end tag':u'{/sb}', u'end html':u'', \ + u'protected':True}) +html_expands.append({u'desc':u'Paragraph', u'start tag':u'{p}', \ + u'start html':u'

', \ + u'end tag':u'{/p}', u'end html':u'

', \ + u'protected':True}) +html_expands.append({u'desc':u'Bold', u'start tag':u'{st}', \ + u'start html':u'', \ + u'end tag':u'{/st}', \ + u'end html':u'', \ + u'protected':True}) +html_expands.append({u'desc':u'Italics', u'start tag':u'{it}', \ + u'start html':u'', \ + u'end tag':u'{/it}', u'end html':u'', \ + u'protected':True}) + +def translate(context, text, comment=None): + """ + A special shortcut method to wrap around the Qt4 translation functions. + This abstracts the translation procedure so that we can change it if at a + later date if necessary, without having to redo the whole of OpenLP. + + ``context`` + The translation context, used to give each string a context or a + namespace. + + ``text`` + The text to put into the translation tables for translation. + + ``comment`` + An identifying string for when the same text is used in different roles + within the same context. + """ + return QtCore.QCoreApplication.translate(context, text, comment) + +def get_text_file_string(text_file): + """ + Open a file and return its content as unicode string. If the supplied file + name is not a file then the function returns False. If there is an error + loading the file or the content can't be decoded then the function will + return None. + + ``textfile`` + The name of the file. + """ + if not os.path.isfile(text_file): + return False + file_handle = None + content_string = None + try: + file_handle = open(text_file, u'r') + content = file_handle.read() + content_string = content.decode(u'utf-8') + except (IOError, UnicodeError): + log.exception(u'Failed to open text file %s' % text_file) + finally: + if file_handle: + file_handle.close() + return content_string + +def str_to_bool(stringvalue): + """ + Convert a string version of a boolean into a real boolean. + + ``stringvalue`` + The string value to examine and convert to a boolean type. + """ + if isinstance(stringvalue, bool): + 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 + physical file location. If the icon is a QIcon instance, that icon is + simply returned. If not, it builds a QIcon instance from the resource or + file name. + + ``icon`` + The icon to build. This can be a QIcon, a resource string in the form + ``:/resource/file.png``, or a file location like ``/path/to/file.png``. + """ + button_icon = QtGui.QIcon() + if isinstance(icon, QtGui.QIcon): + button_icon = icon + elif isinstance(icon, basestring): + if icon.startswith(u':/'): + button_icon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal, + QtGui.QIcon.Off) + else: + button_icon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + elif isinstance(icon, QtGui.QImage): + button_icon.addPixmap(QtGui.QPixmap.fromImage(icon), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + return button_icon + +def context_menu_action(base, icon, text, slot): + """ + Utility method to help build context menus for plugins + + ``base`` + The parent menu to add this menu item to + + ``icon`` + An icon for this action + + ``text`` + The text to display for this action + + ``slot`` + The code to run when this action is triggered + """ + action = QtGui.QAction(text, base) + if icon: + action.setIcon(build_icon(icon)) + QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) + return action + +def context_menu(base, icon, text): + """ + Utility method to help build context menus for plugins + + ``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 context_menu_separator(base): + """ + Add a separator to a context menu + + ``base`` + The menu object to add the separator to + """ + action = QtGui.QAction(u'', base) + action.setSeparator(True) + return action + +def image_to_byte(image): + """ + Resize an image to fit on the current screen for the web and returns + it as a byte stream. + + ``image`` + The image to converted. + """ + byte_array = QtCore.QByteArray() + # use buffer to store pixmap into byteArray + buffie = QtCore.QBuffer(byte_array) + buffie.open(QtCore.QIODevice.WriteOnly) + if isinstance(image, QtGui.QImage): + pixmap = QtGui.QPixmap.fromImage(image) + else: + pixmap = QtGui.QPixmap(image) + pixmap.save(buffie, "PNG") + # convert to base64 encoding so does not get missed! + return byte_array.toBase64() + +def resize_image(image, width, height, background=QtCore.Qt.black): + """ + Resize an image to fit on the current screen. + + ``image`` + The image to resize. + + ``width`` + The new image width. + + ``height`` + The new image height. + + ``background`` + The background colour defaults to black. + + """ + preview = QtGui.QImage(image) + if not preview.isNull(): + # Only resize if different size + if preview.width() == width and preview.height == height: + return preview + preview = preview.scaled(width, height, QtCore.Qt.KeepAspectRatio, + QtCore.Qt.SmoothTransformation) + realw = preview.width() + realh = preview.height() + # and move it to the centre of the preview space + new_image = QtGui.QImage(width, height, + QtGui.QImage.Format_ARGB32_Premultiplied) + new_image.fill(background) + painter = QtGui.QPainter(new_image) + 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 + + ``list_widget`` + The list to check for selected items + + ``message`` + The message to give the user if no item is selected + """ + if not list_widget.selectedIndexes(): + QtGui.QMessageBox.information(list_widget.parent(), + translate('OpenLP.MediaManagerItem', 'No Items Selected'), message) + return False + return True + +def clean_tags(text): + """ + Remove Tags from text for display + """ + text = text.replace(u'
', u'\n') + for tag in html_expands: + text = text.replace(tag[u'start tag'], u'') + text = text.replace(tag[u'end tag'], u'') + return text + +def expand_tags(text): + """ + Expand tags HTML for display + """ + for tag in html_expands: + text = text.replace(tag[u'start tag'], tag[u'start html']) + text = text.replace(tag[u'end tag'], tag[u'end html']) + return text + +from spelltextedit import SpellTextEdit +from eventreceiver import Receiver +from settingsmanager import SettingsManager +from plugin import PluginStatus, StringType, Plugin +from pluginmanager import PluginManager +from settingstab import SettingsTab +from serviceitem import ServiceItem +from serviceitem import ServiceItemType +from serviceitem import ItemCapabilities +from htmlbuilder import build_html, build_lyrics_format_css, \ + build_lyrics_outline_css +from toolbar import OpenLPToolbar +from dockwidget import OpenLPDockWidget +from theme import ThemeLevel, ThemeXML +from renderer import Renderer +from rendermanager import RenderManager +from mediamanageritem import MediaManagerItem +from baselistwithdnd import BaseListWithDnD diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 5056237ae..c49e37a19 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -1,527 +1,531 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### -""" -Provides the generic functions for interfacing plugins with the Media Manager. -""" -import logging -import os - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import context_menu_action, context_menu_separator, \ - SettingsManager, OpenLPToolbar, ServiceItem, build_icon, translate - -log = logging.getLogger(__name__) - -class MediaManagerItem(QtGui.QWidget): - """ - MediaManagerItem is a helper widget for plugins. - - None of the following *need* to be used, feel free to override - them completely in your plugin's implementation. Alternatively, - call them from your plugin before or after you've done extra - things that you need to. - - **Constructor Parameters** - - ``parent`` - The parent widget. Usually this will be the *Media Manager* - itself. This needs to be a class descended from ``QWidget``. - - ``icon`` - Either a ``QIcon``, a resource path, or a file name. This is - the icon which is displayed in the *Media Manager*. - - ``title`` - The title visible on the item in the *Media Manager*. - - **Member Variables** - - When creating a descendant class from this class for your plugin, - the following member variables should be set. - - ``self.OnNewPrompt`` - Defaults to *'Select Image(s)'*. - - ``self.OnNewFileMasks`` - Defaults to *'Images (*.jpg *jpeg *.gif *.png *.bmp)'*. This - assumes that the new action is to load a file. If not, you - need to override the ``OnNew`` method. - - ``self.ListViewWithDnD_class`` - This must be a **class**, not an object, descended from - ``openlp.core.lib.BaseListWithDnD`` that is not used in any - other part of OpenLP. - - ``self.PreviewFunction`` - This must be a method which returns a QImage to represent the - item (usually a preview). No scaling is required, that is - performed automatically by OpenLP when necessary. If this - method is not defined, a default will be used (treat the - filename as an image). - """ - log.info(u'Media Item loaded') - - def __init__(self, parent=None, icon=None, title=None): - """ - Constructor to create the media manager item. - """ - QtGui.QWidget.__init__(self) - self.parent = parent - self.settingsSection = parent.get_text('name_lower') - if isinstance(icon, QtGui.QIcon): - self.icon = icon - elif isinstance(icon, basestring): - self.icon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), - QtGui.QIcon.Normal, QtGui.QIcon.Off) - else: - self.icon = None - if title: - self.title = parent.get_text('name_more') - self.toolbar = None - self.remoteTriggered = None - self.serviceItemIconName = None - self.singleServiceItem = True - self.pageLayout = QtGui.QVBoxLayout(self) - self.pageLayout.setSpacing(0) - self.pageLayout.setContentsMargins(4, 0, 4, 0) - self.requiredIcons() - self.setupUi() - self.retranslateUi() - - def requiredIcons(self): - """ - This method is called to define the icons for the plugin. - It provides a default set and the plugin is able to override - the if required. - """ - self.hasImportIcon = False - self.hasNewIcon = True - self.hasEditIcon = True - self.hasFileIcon = False - self.hasDeleteIcon = True - self.addToServiceItem = False - - def retranslateUi(self): - """ - This method is called automatically to provide OpenLP with the - opportunity to translate the ``MediaManagerItem`` to another - language. - """ - pass - - def addToolbar(self): - """ - A method to help developers easily add a toolbar to the media - manager item. - """ - if self.toolbar is None: - self.toolbar = OpenLPToolbar(self) - self.pageLayout.addWidget(self.toolbar) - - def addToolbarButton( - self, title, tooltip, icon, slot=None, checkable=False): - """ - A method to help developers easily add a button to the toolbar. - - ``title`` - The title of the button. - - ``tooltip`` - The tooltip to be displayed when the mouse hovers over the - button. - - ``icon`` - The icon of the button. This can be an instance of QIcon, or a - string cotaining either the absolute path to the image, or an - internal resource path starting with ':/'. - - ``slot`` - The method to call when the button is clicked. - - ``objectname`` - The name of the button. - """ - # NB different order (when I broke this out, I didn't want to - # break compatability), but it makes sense for the icon to - # come before the tooltip (as you have to have an icon, but - # not neccesarily a tooltip) - self.toolbar.addToolbarButton(title, icon, tooltip, slot, checkable) - - def addToolbarSeparator(self): - """ - A very simple method to add a separator to the toolbar. - """ - self.toolbar.addSeparator() - - def setupUi(self): - """ - This method sets up the interface on the button. Plugin - developers use this to add and create toolbars, and the rest - of the interface of the media manager item. - """ - # Add a toolbar - self.addToolbar() - #Allow the plugin to define buttons at start of bar - self.addStartHeaderBar() - #Add the middle of the tool bar (pre defined) - self.addMiddleHeaderBar() - #Allow the plugin to define buttons at end of bar - self.addEndHeaderBar() - #Add the list view - self.addListViewToToolBar() - - def addMiddleHeaderBar(self): - """ - Create buttons for the media item toolbar - """ - ## Import Button ## - if self.hasImportIcon: - self.addToolbarButton( - unicode(translate('OpenLP.MediaManagerItem', 'Import %s')) % - self.parent.name, - unicode(self.parent.get_text('import')), - u':/general/general_import.png', self.onImportClick) - ## File Button ## - if self.hasFileIcon: - self.addToolbarButton( - unicode(translate('OpenLP.MediaManagerItem', 'Load %s')) % - self.parent.name, - unicode(self.parent.get_text('load')), - u':/general/general_open.png', self.onFileClick) - ## New Button ## - if self.hasNewIcon: - self.addToolbarButton( - unicode(translate('OpenLP.MediaManagerItem', 'New %s')) % - self.parent.name, - unicode(self.parent.get_text('new')), - u':/general/general_new.png', self.onNewClick) - ## Edit Button ## - if self.hasEditIcon: - self.addToolbarButton( - unicode(translate('OpenLP.MediaManagerItem', 'Edit %s')) % - self.parent.name, - unicode(self.parent.get_text('edit')), - u':/general/general_edit.png', self.onEditClick) - ## Delete Button ## - if self.hasDeleteIcon: - self.addToolbarButton( - unicode(translate('OpenLP.MediaManagerItem', 'Delete %s')) % - self.parent.name, - unicode(self.parent.get_text('delete')), - u':/general/general_delete.png', self.onDeleteClick) - ## Separator Line ## - self.addToolbarSeparator() - ## Preview ## - self.addToolbarButton( - unicode(translate('OpenLP.MediaManagerItem', 'Preview %s')) % - self.parent.name, - unicode(self.parent.get_text('preview')), - u':/general/general_preview.png', self.onPreviewClick) - ## Live Button ## - self.addToolbarButton( - unicode(translate('OpenLP.MediaManagerItem', u'Go Live')), - unicode(self.parent.get_text('live')), - u':/general/general_live.png', self.onLiveClick) - ## Add to service Button ## - self.addToolbarButton( - unicode(translate('OpenLP.MediaManagerItem', 'Add %s to Service')) % - self.parent.name, - unicode(self.parent.get_text('service')), - u':/general/general_add.png', self.onAddClick) - - def addListViewToToolBar(self): - """ - Creates the main widget for listing items the media item is tracking - """ - #Add the List widget - self.listView = self.ListViewWithDnD_class(self) - self.listView.uniformItemSizes = True - self.listView.setGeometry(QtCore.QRect(10, 100, 256, 591)) - self.listView.setSpacing(1) - self.listView.setSelectionMode( - QtGui.QAbstractItemView.ExtendedSelection) - self.listView.setAlternatingRowColors(True) - self.listView.setDragEnabled(True) - self.listView.setObjectName(u'%sListView' % self.parent.name) - #Add to pageLayout - self.pageLayout.addWidget(self.listView) - #define and add the context menu - self.listView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) - if self.hasEditIcon: - self.listView.addAction( - context_menu_action( - self.listView, u':/general/general_edit.png', - unicode(translate('OpenLP.MediaManagerItem', '&Edit %s')) % - self.parent.name, - self.onEditClick)) - self.listView.addAction(context_menu_separator(self.listView)) - if self.hasDeleteIcon: - self.listView.addAction( - context_menu_action( - self.listView, u':/general/general_delete.png', - unicode(translate('OpenLP.MediaManagerItem', - '&Delete %s')) % - self.parent.name, - self.onDeleteClick)) - self.listView.addAction(context_menu_separator(self.listView)) - self.listView.addAction( - context_menu_action( - self.listView, u':/general/general_preview.png', - unicode(translate('OpenLP.MediaManagerItem', '&Preview %s')) % - self.parent.name, - self.onPreviewClick)) - self.listView.addAction( - context_menu_action( - self.listView, u':/general/general_live.png', - translate('OpenLP.MediaManagerItem', '&Show Live'), - self.onLiveClick)) - self.listView.addAction( - context_menu_action( - self.listView, u':/general/general_add.png', - translate('OpenLP.MediaManagerItem', '&Add to Service'), - self.onAddClick)) - if self.addToServiceItem: - self.listView.addAction( - context_menu_action( - self.listView, u':/general/general_add.png', - translate('OpenLP.MediaManagerItem', - '&Add to selected Service Item'), - self.onAddEditClick)) - if QtCore.QSettings().value(u'advanced/double click live', - QtCore.QVariant(False)).toBool(): - QtCore.QObject.connect(self.listView, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), - self.onLiveClick) - else: - QtCore.QObject.connect(self.listView, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), - self.onPreviewClick) - - def initialise(self): - """ - Implement this method in your descendent media manager item to - do any UI or other initialisation. This method is called automatically. - """ - pass - - def addStartHeaderBar(self): - """ - Slot at start of toolbar for plugin to addwidgets - """ - pass - - def addEndHeaderBar(self): - """ - Slot at end of toolbar for plugin to add widgets - """ - pass - - def onFileClick(self): - """ - Add a file to the list widget to make it available for showing - """ - files = QtGui.QFileDialog.getOpenFileNames( - self, self.OnNewPrompt, - SettingsManager.get_last_dir(self.settingsSection), - self.OnNewFileMasks) - log.info(u'New files(s) %s', unicode(files)) - if files: - self.loadList(files) - lastDir = os.path.split(unicode(files[0]))[0] - SettingsManager.set_last_dir(self.settingsSection, lastDir) - SettingsManager.set_list(self.settingsSection, - self.settingsSection, self.getFileList()) - - def getFileList(self): - """ - Return the current list of files - """ - count = 0 - filelist = [] - while count < self.listView.count(): - bitem = self.listView.item(count) - filename = unicode(bitem.data(QtCore.Qt.UserRole).toString()) - filelist.append(filename) - count += 1 - return filelist - - def validate(self, file, thumb): - """ - Validates to see if the file still exists or thumbnail is up to date - """ - if not os.path.exists(file): - return False - if os.path.exists(thumb): - filedate = os.stat(file).st_mtime - thumbdate = os.stat(thumb).st_mtime - #if file updated rebuild icon - if filedate > thumbdate: - self.iconFromFile(file, thumb) - else: - self.iconFromFile(file, thumb) - return True - - def iconFromFile(self, file, thumb): - """ - Create a thumbnail icon from a given file - - ``file`` - The file to create the icon from - - ``thumb`` - The filename to save the thumbnail to - """ - icon = build_icon(unicode(file)) - pixmap = icon.pixmap(QtCore.QSize(88, 50)) - ext = os.path.splitext(thumb)[1].lower() - pixmap.save(thumb, ext[1:]) - return icon - - def loadList(self, list): - raise NotImplementedError(u'MediaManagerItem.loadList needs to be ' - u'defined by the plugin') - - def onNewClick(self): - raise NotImplementedError(u'MediaManagerItem.onNewClick needs to be ' - u'defined by the plugin') - - def onEditClick(self): - raise NotImplementedError(u'MediaManagerItem.onEditClick needs to be ' - u'defined by the plugin') - - def onDeleteClick(self): - raise NotImplementedError(u'MediaManagerItem.onDeleteClick needs to ' - u'be defined by the plugin') - - def generateSlideData(self, service_item, item): - raise NotImplementedError(u'MediaManagerItem.generateSlideData needs ' - u'to be defined by the plugin') - - def onPreviewClick(self): - """ - Preview an item by building a service item then adding that service - item to the preview slide controller. - """ - if not self.listView.selectedIndexes() and not self.remoteTriggered: - QtGui.QMessageBox.information(self, - translate('OpenLP.MediaManagerItem', 'No Items Selected'), - translate('OpenLP.MediaManagerItem', - 'You must select one or more items to preview.')) - else: - log.debug(self.parent.name + u' Preview requested') - service_item = self.buildServiceItem() - if service_item: - service_item.from_plugin = True - self.parent.previewController.addServiceItem(service_item) - - def onLiveClick(self): - """ - Send an item live by building a service item then adding that service - item to the live slide controller. - """ - if not self.listView.selectedIndexes(): - QtGui.QMessageBox.information(self, - translate('OpenLP.MediaManagerItem', 'No Items Selected'), - translate('OpenLP.MediaManagerItem', - 'You must select one or more items to send live.')) - else: - log.debug(self.parent.name + u' Live requested') - service_item = self.buildServiceItem() - if service_item: - service_item.from_plugin = True - self.parent.liveController.addServiceItem(service_item) - - def onAddClick(self): - """ - Add a selected item to the current service - """ - if not self.listView.selectedIndexes() and not self.remoteTriggered: - QtGui.QMessageBox.information(self, - translate('OpenLP.MediaManagerItem', 'No Items Selected'), - translate('OpenLP.MediaManagerItem', - 'You must select one or more items.')) - else: - #Is it posssible to process multiple list items to generate multiple - #service items? - if self.singleServiceItem or self.remoteTriggered: - log.debug(self.parent.name + u' Add requested') - service_item = self.buildServiceItem() - if service_item: - service_item.from_plugin = False - self.parent.serviceManager.addServiceItem(service_item, - replace=self.remoteTriggered) - else: - items = self.listView.selectedIndexes() - for item in items: - service_item = self.buildServiceItem(item) - if service_item: - service_item.from_plugin = False - self.parent.serviceManager.addServiceItem(service_item) - - def onAddEditClick(self): - """ - Add a selected item to an existing item in the current service. - """ - if not self.listView.selectedIndexes() and not self.remoteTriggered: - QtGui.QMessageBox.information(self, - translate('OpenLP.MediaManagerItem', 'No items selected'), - translate('OpenLP.MediaManagerItem', - 'You must select one or more items')) - else: - log.debug(self.parent.name + u' Add requested') - service_item = self.parent.serviceManager.getServiceItem() - if not service_item: - QtGui.QMessageBox.information(self, - translate('OpenLP.MediaManagerItem', - 'No Service Item Selected'), - translate('OpenLP.MediaManagerItem', - 'You must select an existing service item to add to.')) - elif self.title.lower() == service_item.name.lower(): - self.generateSlideData(service_item) - self.parent.serviceManager.addServiceItem(service_item, - replace=True) - else: - #Turn off the remote edit update message indicator - QtGui.QMessageBox.information(self, - translate('OpenLP.MediaManagerItem', - 'Invalid Service Item'), - unicode(translate('OpenLP.MediaManagerItem', - 'You must select a %s service item.')) % self.title) - - def buildServiceItem(self, item=None): - """ - Common method for generating a service item - """ - service_item = ServiceItem(self.parent) - if self.serviceItemIconName: - service_item.add_icon(self.serviceItemIconName) - else: - service_item.add_icon(self.parent.icon_path) - if self.generateSlideData(service_item, item): - return service_item - else: - return None +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### +""" +Provides the generic functions for interfacing plugins with the Media Manager. +""" +import logging +import os + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import context_menu_action, context_menu_separator, \ + SettingsManager, OpenLPToolbar, ServiceItem, StringType, build_icon, \ + translate + +log = logging.getLogger(__name__) + +class MediaManagerItem(QtGui.QWidget): + """ + MediaManagerItem is a helper widget for plugins. + + None of the following *need* to be used, feel free to override + them completely in your plugin's implementation. Alternatively, + call them from your plugin before or after you've done extra + things that you need to. + + **Constructor Parameters** + + ``parent`` + The parent widget. Usually this will be the *Media Manager* + itself. This needs to be a class descended from ``QWidget``. + + ``icon`` + Either a ``QIcon``, a resource path, or a file name. This is + the icon which is displayed in the *Media Manager*. + + ``title`` + The title visible on the item in the *Media Manager*. + + **Member Variables** + + When creating a descendant class from this class for your plugin, + the following member variables should be set. + + ``self.OnNewPrompt`` + Defaults to *'Select Image(s)'*. + + ``self.OnNewFileMasks`` + Defaults to *'Images (*.jpg *jpeg *.gif *.png *.bmp)'*. This + assumes that the new action is to load a file. If not, you + need to override the ``OnNew`` method. + + ``self.ListViewWithDnD_class`` + This must be a **class**, not an object, descended from + ``openlp.core.lib.BaseListWithDnD`` that is not used in any + other part of OpenLP. + + ``self.PreviewFunction`` + This must be a method which returns a QImage to represent the + item (usually a preview). No scaling is required, that is + performed automatically by OpenLP when necessary. If this + method is not defined, a default will be used (treat the + filename as an image). + """ + log.info(u'Media Item loaded') + + def __init__(self, parent=None, icon=None, title=None, plugin=None): + """ + Constructor to create the media manager item. + """ + QtGui.QWidget.__init__(self) + self.parent = parent + self.plugin = parent # rimach may changed + self.settingsSection = self.plugin.name_lower + if isinstance(icon, QtGui.QIcon): + self.icon = icon + elif isinstance(icon, basestring): + self.icon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + else: + self.icon = None + if title: + nameString = self.plugin.getString(StringType.Name) + self.title = nameString[u'plural'] + self.toolbar = None + self.remoteTriggered = None + self.serviceItemIconName = None + self.singleServiceItem = True + self.pageLayout = QtGui.QVBoxLayout(self) + self.pageLayout.setSpacing(0) + self.pageLayout.setContentsMargins(4, 0, 4, 0) + self.requiredIcons() + self.setupUi() + self.retranslateUi() + + def requiredIcons(self): + """ + This method is called to define the icons for the plugin. + It provides a default set and the plugin is able to override + the if required. + """ + self.hasImportIcon = False + self.hasNewIcon = True + self.hasEditIcon = True + self.hasFileIcon = False + self.hasDeleteIcon = True + self.addToServiceItem = False + + def retranslateUi(self): + """ + This method is called automatically to provide OpenLP with the + opportunity to translate the ``MediaManagerItem`` to another + language. + """ + pass + + def addToolbar(self): + """ + A method to help developers easily add a toolbar to the media + manager item. + """ + if self.toolbar is None: + self.toolbar = OpenLPToolbar(self) + self.pageLayout.addWidget(self.toolbar) + + def addToolbarButton( + self, title, tooltip, icon, slot=None, checkable=False): + """ + A method to help developers easily add a button to the toolbar. + + ``title`` + The title of the button. + + ``tooltip`` + The tooltip to be displayed when the mouse hovers over the + button. + + ``icon`` + The icon of the button. This can be an instance of QIcon, or a + string cotaining either the absolute path to the image, or an + internal resource path starting with ':/'. + + ``slot`` + The method to call when the button is clicked. + + ``objectname`` + The name of the button. + """ + # NB different order (when I broke this out, I didn't want to + # break compatability), but it makes sense for the icon to + # come before the tooltip (as you have to have an icon, but + # not neccesarily a tooltip) + self.toolbar.addToolbarButton(title, icon, tooltip, slot, checkable) + + def addToolbarSeparator(self): + """ + A very simple method to add a separator to the toolbar. + """ + self.toolbar.addSeparator() + + def setupUi(self): + """ + This method sets up the interface on the button. Plugin + developers use this to add and create toolbars, and the rest + of the interface of the media manager item. + """ + # Add a toolbar + self.addToolbar() + #Allow the plugin to define buttons at start of bar + self.addStartHeaderBar() + #Add the middle of the tool bar (pre defined) + self.addMiddleHeaderBar() + #Allow the plugin to define buttons at end of bar + self.addEndHeaderBar() + #Add the list view + self.addListViewToToolBar() + + def addMiddleHeaderBar(self): + """ + Create buttons for the media item toolbar + """ + ## Import Button ## + if self.hasImportIcon: + importString = self.plugin.getString(StringType.Import) + self.addToolbarButton( + importString[u'title'], + importString[u'tooltip'], + u':/general/general_import.png', self.onImportClick) + ## Load Button ## + if self.hasFileIcon: + loadString = self.plugin.getString(StringType.Load) + self.addToolbarButton( + loadString[u'title'], + loadString[u'tooltip'], + u':/general/general_open.png', self.onFileClick) + ## New Button ## rimach + if self.hasNewIcon: + newString = self.plugin.getString(StringType.New) + self.addToolbarButton( + newString[u'title'], + newString[u'tooltip'], + u':/general/general_new.png', self.onNewClick) + ## Edit Button ## + if self.hasEditIcon: + editString = self.plugin.getString(StringType.Edit) + self.addToolbarButton( + editString[u'title'], + editString[u'tooltip'], + u':/general/general_edit.png', self.onEditClick) + ## Delete Button ## + if self.hasDeleteIcon: + deleteString = self.plugin.getString(StringType.Delete) + self.addToolbarButton( + deleteString[u'title'], + deleteString[u'tooltip'], + u':/general/general_delete.png', self.onDeleteClick) + ## Separator Line ## + self.addToolbarSeparator() + ## Preview ## + previewString = self.plugin.getString(StringType.Preview) + self.addToolbarButton( + previewString[u'title'], + previewString[u'tooltip'], + u':/general/general_preview.png', self.onPreviewClick) + ## Live Button ## + liveString = self.plugin.getString(StringType.Live) + self.addToolbarButton( + liveString[u'title'], + liveString[u'tooltip'], + u':/general/general_live.png', self.onLiveClick) + ## Add to service Button ## + serviceString = self.plugin.getString(StringType.Service) + self.addToolbarButton( + serviceString[u'title'], + serviceString[u'tooltip'], + u':/general/general_add.png', self.onAddClick) + + def addListViewToToolBar(self): + """ + Creates the main widget for listing items the media item is tracking + """ + #Add the List widget + self.listView = self.ListViewWithDnD_class(self) + self.listView.uniformItemSizes = True + self.listView.setGeometry(QtCore.QRect(10, 100, 256, 591)) + self.listView.setSpacing(1) + self.listView.setSelectionMode( + QtGui.QAbstractItemView.ExtendedSelection) + self.listView.setAlternatingRowColors(True) + self.listView.setDragEnabled(True) + self.listView.setObjectName(u'%sListView' % self.parent.name) + #Add to pageLayout + self.pageLayout.addWidget(self.listView) + #define and add the context menu + self.listView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) + if self.hasEditIcon: + self.listView.addAction( + context_menu_action( + self.listView, u':/general/general_edit.png', + unicode(translate('OpenLP.MediaManagerItem', '&Edit %s')) % + self.parent.name, + self.onEditClick)) + self.listView.addAction(context_menu_separator(self.listView)) + if self.hasDeleteIcon: + self.listView.addAction( + context_menu_action( + self.listView, u':/general/general_delete.png', + unicode(translate('OpenLP.MediaManagerItem', + '&Delete %s')) % + self.parent.name, + self.onDeleteClick)) + self.listView.addAction(context_menu_separator(self.listView)) + self.listView.addAction( + context_menu_action( + self.listView, u':/general/general_preview.png', + unicode(translate('OpenLP.MediaManagerItem', '&Preview %s')) % + self.parent.name, + self.onPreviewClick)) + self.listView.addAction( + context_menu_action( + self.listView, u':/general/general_live.png', + translate('OpenLP.MediaManagerItem', '&Show Live'), + self.onLiveClick)) + self.listView.addAction( + context_menu_action( + self.listView, u':/general/general_add.png', + translate('OpenLP.MediaManagerItem', '&Add to Service'), + self.onAddClick)) + if self.addToServiceItem: + self.listView.addAction( + context_menu_action( + self.listView, u':/general/general_add.png', + translate('OpenLP.MediaManagerItem', + '&Add to selected Service Item'), + self.onAddEditClick)) + if QtCore.QSettings().value(u'advanced/double click live', + QtCore.QVariant(False)).toBool(): + QtCore.QObject.connect(self.listView, + QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), + self.onLiveClick) + else: + QtCore.QObject.connect(self.listView, + QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), + self.onPreviewClick) + + def initialise(self): + """ + Implement this method in your descendent media manager item to + do any UI or other initialisation. This method is called automatically. + """ + pass + + def addStartHeaderBar(self): + """ + Slot at start of toolbar for plugin to addwidgets + """ + pass + + def addEndHeaderBar(self): + """ + Slot at end of toolbar for plugin to add widgets + """ + pass + + def onFileClick(self): + """ + Add a file to the list widget to make it available for showing + """ + files = QtGui.QFileDialog.getOpenFileNames( + self, self.OnNewPrompt, + SettingsManager.get_last_dir(self.settingsSection), + self.OnNewFileMasks) + log.info(u'New files(s) %s', unicode(files)) + if files: + self.loadList(files) + lastDir = os.path.split(unicode(files[0]))[0] + SettingsManager.set_last_dir(self.settingsSection, lastDir) + SettingsManager.set_list(self.settingsSection, + self.settingsSection, self.getFileList()) + + def getFileList(self): + """ + Return the current list of files + """ + count = 0 + filelist = [] + while count < self.listView.count(): + bitem = self.listView.item(count) + filename = unicode(bitem.data(QtCore.Qt.UserRole).toString()) + filelist.append(filename) + count += 1 + return filelist + + def validate(self, file, thumb): + """ + Validates to see if the file still exists or thumbnail is up to date + """ + if not os.path.exists(file): + return False + if os.path.exists(thumb): + filedate = os.stat(file).st_mtime + thumbdate = os.stat(thumb).st_mtime + #if file updated rebuild icon + if filedate > thumbdate: + self.iconFromFile(file, thumb) + else: + self.iconFromFile(file, thumb) + return True + + def iconFromFile(self, file, thumb): + """ + Create a thumbnail icon from a given file + + ``file`` + The file to create the icon from + + ``thumb`` + The filename to save the thumbnail to + """ + icon = build_icon(unicode(file)) + pixmap = icon.pixmap(QtCore.QSize(88, 50)) + ext = os.path.splitext(thumb)[1].lower() + pixmap.save(thumb, ext[1:]) + return icon + + def loadList(self, list): + raise NotImplementedError(u'MediaManagerItem.loadList needs to be ' + u'defined by the plugin') + + def onNewClick(self): + raise NotImplementedError(u'MediaManagerItem.onNewClick needs to be ' + u'defined by the plugin') + + def onEditClick(self): + raise NotImplementedError(u'MediaManagerItem.onEditClick needs to be ' + u'defined by the plugin') + + def onDeleteClick(self): + raise NotImplementedError(u'MediaManagerItem.onDeleteClick needs to ' + u'be defined by the plugin') + + def generateSlideData(self, service_item, item): + raise NotImplementedError(u'MediaManagerItem.generateSlideData needs ' + u'to be defined by the plugin') + + def onPreviewClick(self): + """ + Preview an item by building a service item then adding that service + item to the preview slide controller. + """ + if not self.listView.selectedIndexes() and not self.remoteTriggered: + QtGui.QMessageBox.information(self, + translate('OpenLP.MediaManagerItem', 'No Items Selected'), + translate('OpenLP.MediaManagerItem', + 'You must select one or more items to preview.')) + else: + log.debug(self.parent.name + u' Preview requested') + service_item = self.buildServiceItem() + if service_item: + service_item.from_plugin = True + self.parent.previewController.addServiceItem(service_item) + + def onLiveClick(self): + """ + Send an item live by building a service item then adding that service + item to the live slide controller. + """ + if not self.listView.selectedIndexes(): + QtGui.QMessageBox.information(self, + translate('OpenLP.MediaManagerItem', 'No Items Selected'), + translate('OpenLP.MediaManagerItem', + 'You must select one or more items to send live.')) + else: + log.debug(self.parent.name + u' Live requested') + service_item = self.buildServiceItem() + if service_item: + service_item.from_plugin = True + self.parent.liveController.addServiceItem(service_item) + + def onAddClick(self): + """ + Add a selected item to the current service + """ + if not self.listView.selectedIndexes() and not self.remoteTriggered: + QtGui.QMessageBox.information(self, + translate('OpenLP.MediaManagerItem', 'No Items Selected'), + translate('OpenLP.MediaManagerItem', + 'You must select one or more items.')) + else: + #Is it posssible to process multiple list items to generate multiple + #service items? + if self.singleServiceItem or self.remoteTriggered: + log.debug(self.parent.name + u' Add requested') + service_item = self.buildServiceItem() + if service_item: + service_item.from_plugin = False + self.parent.serviceManager.addServiceItem(service_item, + replace=self.remoteTriggered) + else: + items = self.listView.selectedIndexes() + for item in items: + service_item = self.buildServiceItem(item) + if service_item: + service_item.from_plugin = False + self.parent.serviceManager.addServiceItem(service_item) + + def onAddEditClick(self): + """ + Add a selected item to an existing item in the current service. + """ + if not self.listView.selectedIndexes() and not self.remoteTriggered: + QtGui.QMessageBox.information(self, + translate('OpenLP.MediaManagerItem', 'No items selected'), + translate('OpenLP.MediaManagerItem', + 'You must select one or more items')) + else: + log.debug(self.parent.name + u' Add requested') + service_item = self.parent.serviceManager.getServiceItem() + if not service_item: + QtGui.QMessageBox.information(self, + translate('OpenLP.MediaManagerItem', + 'No Service Item Selected'), + translate('OpenLP.MediaManagerItem', + 'You must select an existing service item to add to.')) + elif self.title.lower() == service_item.name.lower(): + self.generateSlideData(service_item) + self.parent.serviceManager.addServiceItem(service_item, + replace=True) + else: + #Turn off the remote edit update message indicator + QtGui.QMessageBox.information(self, + translate('OpenLP.MediaManagerItem', + 'Invalid Service Item'), + unicode(translate('OpenLP.MediaManagerItem', + 'You must select a %s service item.')) % self.title) + + def buildServiceItem(self, item=None): + """ + Common method for generating a service item + """ + service_item = ServiceItem(self.parent) + if self.serviceItemIconName: + service_item.add_icon(self.serviceItemIconName) + else: + service_item.add_icon(self.parent.icon_path) + if self.generateSlideData(service_item, item): + return service_item + else: + return None diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index 7eee2dd6e..8f7fd4f38 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -1,306 +1,319 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### -""" -Provide the generic plugin functionality for OpenLP plugins. -""" -import logging - -from PyQt4 import QtCore - -from openlp.core.lib import Receiver - -log = logging.getLogger(__name__) - -class PluginStatus(object): - """ - Defines the status of the plugin - """ - Active = 1 - Inactive = 0 - Disabled = -1 - -class Plugin(QtCore.QObject): - """ - Base class for openlp plugins to inherit from. - - **Basic Attributes** - - ``name`` - The name that should appear in the plugins list. - - ``version`` - The version number of this iteration of the plugin. - - ``settingsSection`` - The namespace to store settings for the plugin. - - ``icon`` - An instance of QIcon, which holds an icon for this plugin. - - ``log`` - A log object used to log debugging messages. This is pre-instantiated. - - ``weight`` - A numerical value used to order the plugins. - - **Hook Functions** - - ``checkPreConditions()`` - Provides the Plugin with a handle to check if it can be loaded. - - ``getMediaManagerItem()`` - Returns an instance of MediaManagerItem to be used in the Media Manager. - - ``addImportMenuItem(import_menu)`` - Add an item to the Import menu. - - ``addExportMenuItem(export_menu)`` - Add an item to the Export menu. - - ``getSettingsTab()`` - Returns an instance of SettingsTabItem to be used in the Settings - dialog. - - ``addToMenu(menubar)`` - A method to add a menu item to anywhere in the menu, given the menu bar. - - ``handle_event(event)`` - A method use to handle events, given an Event object. - - ``about()`` - Used in the plugin manager, when a person clicks on the 'About' button. - - """ - log.info(u'loaded') - - def __init__(self, name, version=None, plugin_helpers=None): - """ - This is the constructor for the plugin object. This provides an easy - way for descendent plugins to populate common data. This method *must* - be overridden, like so:: - - class MyPlugin(Plugin): - def __init__(self): - Plugin.__init(self, u'MyPlugin', u'0.1') - - ``name`` - Defaults to *None*. The name of the plugin. - - ``version`` - Defaults to *None*. The version of the plugin. - - ``plugin_helpers`` - Defaults to *None*. A list of helper objects. - """ - QtCore.QObject.__init__(self) - self.name = name - if version: - self.version = version - self.settingsSection = self.name.lower() - self.icon = None - self.weight = 0 - self.status = PluginStatus.Inactive - # Set up logging - self.log = logging.getLogger(self.name) - self.previewController = plugin_helpers[u'preview'] - self.liveController = plugin_helpers[u'live'] - self.renderManager = plugin_helpers[u'render'] - self.serviceManager = plugin_helpers[u'service'] - self.settingsForm = plugin_helpers[u'settings form'] - self.mediadock = plugin_helpers[u'toolbox'] - self.pluginManager = plugin_helpers[u'pluginmanager'] - self.formparent = plugin_helpers[u'formparent'] - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'%s_add_service_item' % self.name), - self.processAddServiceEvent) - - def checkPreConditions(self): - """ - Provides the Plugin with a handle to check if it can be loaded. - Failing Preconditions does not stop a settings Tab being created - - Returns True or False. - """ - return True - - def setStatus(self): - """ - Sets the status of the plugin - """ - self.status = QtCore.QSettings().value( - self.settingsSection + u'/status', - QtCore.QVariant(PluginStatus.Inactive)).toInt()[0] - - def toggleStatus(self, new_status): - """ - Changes the status of the plugin and remembers it - """ - self.status = new_status - QtCore.QSettings().setValue( - self.settingsSection + u'/status', QtCore.QVariant(self.status)) - - def isActive(self): - """ - Indicates if the plugin is active - - Returns True or False. - """ - return self.status == PluginStatus.Active - - def getMediaManagerItem(self): - """ - Construct a MediaManagerItem object with all the buttons and things - you need, and return it for integration into openlp.org. - """ - pass - - def addImportMenuItem(self, importMenu): - """ - Create a menu item and add it to the "Import" menu. - - ``importMenu`` - The Import menu. - """ - pass - - def addExportMenuItem(self, exportMenu): - """ - Create a menu item and add it to the "Export" menu. - - ``exportMenu`` - The Export menu - """ - pass - - def addToolsMenuItem(self, toolsMenu): - """ - Create a menu item and add it to the "Tools" menu. - - ``toolsMenu`` - The Tools menu - """ - pass - - def getSettingsTab(self): - """ - Create a tab for the settings window. - """ - pass - - def addToMenu(self, menubar): - """ - Add menu items to the menu, given the menubar. - - ``menubar`` - The application's menu bar. - """ - pass - - def processAddServiceEvent(self, replace=False): - """ - Generic Drag and drop handler triggered from service_manager. - """ - log.debug(u'processAddServiceEvent event called for plugin %s' % - self.name) - if replace: - self.mediaItem.onAddEditClick() - else: - self.mediaItem.onAddClick() - - def about(self): - """ - Show a dialog when the user clicks on the 'About' button in the plugin - manager. - """ - raise NotImplementedError( - u'Plugin.about needs to be defined by the plugin') - - def initialise(self): - """ - Called by the plugin Manager to initialise anything it needs. - """ - if self.mediaItem: - self.mediaItem.initialise() - self.insertToolboxItem() - - def finalise(self): - """ - Called by the plugin Manager to cleanup things. - """ - self.removeToolboxItem() - - def removeToolboxItem(self): - """ - Called by the plugin to remove toolbar - """ - if self.mediaItem: - self.mediadock.remove_dock(self.name) - if self.settings_tab: - self.settingsForm.removeTab(self.name) - - def insertToolboxItem(self): - """ - Called by plugin to replace toolbar - """ - if self.mediaItem: - self.mediadock.insert_dock(self.mediaItem, self.icon, self.weight) - if self.settings_tab: - self.settingsForm.insertTab(self.settings_tab, self.weight) - - def usesTheme(self, theme): - """ - Called to find out if a plugin is currently using a theme. - - Returns True if the theme is being used, otherwise returns False. - """ - return False - - def renameTheme(self, oldTheme, newTheme): - """ - Renames a theme a plugin is using making the plugin use the new name. - - ``oldTheme`` - The name of the theme the plugin should stop using. - - ``newTheme`` - The new name the plugin should now use. - """ - pass - def set_plugin_translations(self): - """ - Called to define all translatable texts of the plugin - """ - pass - self.text = {} - - def get_text(self, content): - """ - Called to retrieve a translated piece of text for menues, context menues, ... - """ - if self.text.has_key(content): - return self.text[content] - else: - return self.name +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### +""" +Provide the generic plugin functionality for OpenLP plugins. +""" +import logging + +from PyQt4 import QtCore + +from openlp.core.lib import Receiver + +log = logging.getLogger(__name__) + +class PluginStatus(object): + """ + Defines the status of the plugin + """ + Active = 1 + Inactive = 0 + Disabled = -1 + +class StringType(object): + Name = u'name' + Import = u'import' + Load = u'load' + New = u'new' + Edit = u'edit' + Delete = u'delete' + Preview = u'preview' + Live = u'live' + Service = u'service' + +class Plugin(QtCore.QObject): + """ + Base class for openlp plugins to inherit from. + + **Basic Attributes** + + ``name`` + The name that should appear in the plugins list. + + ``version`` + The version number of this iteration of the plugin. + + ``settingsSection`` + The namespace to store settings for the plugin. + + ``icon`` + An instance of QIcon, which holds an icon for this plugin. + + ``log`` + A log object used to log debugging messages. This is pre-instantiated. + + ``weight`` + A numerical value used to order the plugins. + + **Hook Functions** + + ``checkPreConditions()`` + Provides the Plugin with a handle to check if it can be loaded. + + ``getMediaManagerItem()`` + Returns an instance of MediaManagerItem to be used in the Media Manager. + + ``addImportMenuItem(import_menu)`` + Add an item to the Import menu. + + ``addExportMenuItem(export_menu)`` + Add an item to the Export menu. + + ``getSettingsTab()`` + Returns an instance of SettingsTabItem to be used in the Settings + dialog. + + ``addToMenu(menubar)`` + A method to add a menu item to anywhere in the menu, given the menu bar. + + ``handle_event(event)`` + A method use to handle events, given an Event object. + + ``about()`` + Used in the plugin manager, when a person clicks on the 'About' button. + + """ + log.info(u'loaded') + + def __init__(self, name, version=None, plugin_helpers=None): + """ + This is the constructor for the plugin object. This provides an easy + way for descendent plugins to populate common data. This method *must* + be overridden, like so:: + + class MyPlugin(Plugin): + def __init__(self): + Plugin.__init(self, u'MyPlugin', u'0.1') + + ``name`` + Defaults to *None*. The name of the plugin. + + ``version`` + Defaults to *None*. The version of the plugin. + + ``plugin_helpers`` + Defaults to *None*. A list of helper objects. + """ + QtCore.QObject.__init__(self) + self.name = name + self.set_plugin_strings() + if version: + self.version = version + self.settingsSection = self.name.lower() + self.icon = None + self.weight = 0 + self.status = PluginStatus.Inactive + # Set up logging + self.log = logging.getLogger(self.name) + self.previewController = plugin_helpers[u'preview'] + self.liveController = plugin_helpers[u'live'] + self.renderManager = plugin_helpers[u'render'] + self.serviceManager = plugin_helpers[u'service'] + self.settingsForm = plugin_helpers[u'settings form'] + self.mediadock = plugin_helpers[u'toolbox'] + self.pluginManager = plugin_helpers[u'pluginmanager'] + self.formparent = plugin_helpers[u'formparent'] + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'%s_add_service_item' % self.name), + self.processAddServiceEvent) + + def checkPreConditions(self): + """ + Provides the Plugin with a handle to check if it can be loaded. + Failing Preconditions does not stop a settings Tab being created + + Returns True or False. + """ + return True + + def setStatus(self): + """ + Sets the status of the plugin + """ + self.status = QtCore.QSettings().value( + self.settingsSection + u'/status', + QtCore.QVariant(PluginStatus.Inactive)).toInt()[0] + + def toggleStatus(self, new_status): + """ + Changes the status of the plugin and remembers it + """ + self.status = new_status + QtCore.QSettings().setValue( + self.settingsSection + u'/status', QtCore.QVariant(self.status)) + + def isActive(self): + """ + Indicates if the plugin is active + + Returns True or False. + """ + return self.status == PluginStatus.Active + + def getMediaManagerItem(self): + """ + Construct a MediaManagerItem object with all the buttons and things + you need, and return it for integration into openlp.org. + """ + pass + + def addImportMenuItem(self, importMenu): + """ + Create a menu item and add it to the "Import" menu. + + ``importMenu`` + The Import menu. + """ + pass + + def addExportMenuItem(self, exportMenu): + """ + Create a menu item and add it to the "Export" menu. + + ``exportMenu`` + The Export menu + """ + pass + + def addToolsMenuItem(self, toolsMenu): + """ + Create a menu item and add it to the "Tools" menu. + + ``toolsMenu`` + The Tools menu + """ + pass + + def getSettingsTab(self): + """ + Create a tab for the settings window. + """ + pass + + def addToMenu(self, menubar): + """ + Add menu items to the menu, given the menubar. + + ``menubar`` + The application's menu bar. + """ + pass + + def processAddServiceEvent(self, replace=False): + """ + Generic Drag and drop handler triggered from service_manager. + """ + log.debug(u'processAddServiceEvent event called for plugin %s' % + self.name) + if replace: + self.mediaItem.onAddEditClick() + else: + self.mediaItem.onAddClick() + + def about(self): + """ + Show a dialog when the user clicks on the 'About' button in the plugin + manager. + """ + raise NotImplementedError( + u'Plugin.about needs to be defined by the plugin') + + def initialise(self): + """ + Called by the plugin Manager to initialise anything it needs. + """ + if self.mediaItem: + self.mediaItem.initialise() + self.insertToolboxItem() + + def finalise(self): + """ + Called by the plugin Manager to cleanup things. + """ + self.removeToolboxItem() + + def removeToolboxItem(self): + """ + Called by the plugin to remove toolbar + """ + if self.mediaItem: + self.mediadock.remove_dock(self.name) + if self.settings_tab: + self.settingsForm.removeTab(self.name) + + def insertToolboxItem(self): + """ + Called by plugin to replace toolbar + """ + if self.mediaItem: + self.mediadock.insert_dock(self.mediaItem, self.icon, self.weight) + if self.settings_tab: + self.settingsForm.insertTab(self.settings_tab, self.weight) + + def usesTheme(self, theme): + """ + Called to find out if a plugin is currently using a theme. + + Returns True if the theme is being used, otherwise returns False. + """ + return False + + def renameTheme(self, oldTheme, newTheme): + """ + Renames a theme a plugin is using making the plugin use the new name. + + ``oldTheme`` + The name of the theme the plugin should stop using. + + ``newTheme`` + The new name the plugin should now use. + """ + pass + + def getString(self, name): + if name in self.strings: + return self.strings[name] + else: + # do something here? + return None + + def set_plugin_strings(self): + """ + Called to define all translatable texts of the plugin + """ + self.name = u'Plugin' + self.name_lower = u'plugin' + + self.strings = {} diff --git a/openlp/core/ui/mediadockmanager.py b/openlp/core/ui/mediadockmanager.py index 24a3fd64d..f3061a35a 100644 --- a/openlp/core/ui/mediadockmanager.py +++ b/openlp/core/ui/mediadockmanager.py @@ -1,84 +1,84 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging - -log = logging.getLogger(__name__) - -class MediaDockManager(object): - """ - Provide a repository for MediaManagerItems - """ - def __init__(self, media_dock): - """ - Initialise the media dock - """ - self.media_dock = media_dock - - def add_dock(self, media_item, icon, weight): - """ - Add a MediaManagerItem to the dock - - ``media_item`` - The item to add to the dock - - ``icon`` - An icon for this dock item - """ - log.info(u'Adding %s dock' % media_item.title) - self.media_dock.addItem(media_item, icon, media_item.title) - - def insert_dock(self, media_item, icon, weight): - """ - This should insert a dock item at a given location - This does not work as it gives a Segmentation error. - For now add at end of stack if not present - """ - log.debug(u'Inserting %s dock' % media_item.title) - match = False - for dock_index in range(0, self.media_dock.count()): - if self.media_dock.widget(dock_index).settingsSection == \ - media_item.parent.get_text('name_lower'): - match = True - break - if not match: - self.media_dock.addItem(media_item, icon, media_item.title) - - def remove_dock(self, name): - """ - Removes a MediaManagerItem from the dock - - ``name`` - The item to remove - """ - log.debug(u'remove %s dock' % name) - for dock_index in range(0, self.media_dock.count()): - if self.media_dock.widget(dock_index): - log.debug(u'%s %s' % (name, self.media_dock.widget(dock_index).settingsSection)) - if self.media_dock.widget(dock_index).settingsSection == \ - name: - self.media_dock.widget(dock_index).hide() - self.media_dock.removeItem(dock_index) +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging + +log = logging.getLogger(__name__) + +class MediaDockManager(object): + """ + Provide a repository for MediaManagerItems + """ + def __init__(self, media_dock): + """ + Initialise the media dock + """ + self.media_dock = media_dock + + def add_dock(self, media_item, icon, weight): + """ + Add a MediaManagerItem to the dock + + ``media_item`` + The item to add to the dock + + ``icon`` + An icon for this dock item + """ + log.info(u'Adding %s dock' % media_item.title) + self.media_dock.addItem(media_item, icon, media_item.title) + + def insert_dock(self, media_item, icon, weight): + """ + This should insert a dock item at a given location + This does not work as it gives a Segmentation error. + For now add at end of stack if not present + """ + log.debug(u'Inserting %s dock' % media_item.title) + match = False + for dock_index in range(0, self.media_dock.count()): + if self.media_dock.widget(dock_index).settingsSection == \ + media_item.parent.name_lower: + match = True + break + if not match: + self.media_dock.addItem(media_item, icon, media_item.title) + + def remove_dock(self, name): + """ + Removes a MediaManagerItem from the dock + + ``name`` + The item to remove + """ + log.debug(u'remove %s dock' % name) + for dock_index in range(0, self.media_dock.count()): + if self.media_dock.widget(dock_index): + log.debug(u'%s %s' % (name, self.media_dock.widget(dock_index).settingsSection)) + if self.media_dock.widget(dock_index).settingsSection == \ + name: + self.media_dock.widget(dock_index).hide() + self.media_dock.removeItem(dock_index) diff --git a/openlp/core/ui/pluginform.py b/openlp/core/ui/pluginform.py index 053acb3f1..6473acf7a 100644 --- a/openlp/core/ui/pluginform.py +++ b/openlp/core/ui/pluginform.py @@ -1,138 +1,141 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import PluginStatus, translate -from plugindialog import Ui_PluginViewDialog - -log = logging.getLogger(__name__) - -class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): - - def __init__(self, parent=None): - QtGui.QDialog.__init__(self, parent) - self.parent = parent - self.activePlugin = None - self.programaticChange = False - self.setupUi(self) - self.load() - self._clearDetails() - # Right, now let's put some signals and slots together! - QtCore.QObject.connect( - self.pluginListWidget, - QtCore.SIGNAL(u'itemSelectionChanged()'), - self.onPluginListWidgetSelectionChanged) - QtCore.QObject.connect( - self.statusComboBox, - QtCore.SIGNAL(u'currentIndexChanged(int)'), - self.onStatusComboBoxChanged) - - def load(self): - """ - Load the plugin details into the screen - """ - self.pluginListWidget.clear() - for plugin in self.parent.plugin_manager.plugins: - item = QtGui.QListWidgetItem(self.pluginListWidget) - # We do this just to make 100% sure the status is an integer as - # sometimes when it's loaded from the config, it isn't cast to int. - plugin.status = int(plugin.status) - # Set the little status text in brackets next to the plugin name. - status_text = unicode( - translate('OpenLP.PluginForm', '%s (Inactive)')) - if plugin.status == PluginStatus.Active: - status_text = unicode( - translate('OpenLP.PluginForm', '%s (Active)')) - elif plugin.status == PluginStatus.Inactive: - status_text = unicode( - translate('OpenLP.PluginForm', '%s (Inactive)')) - elif plugin.status == PluginStatus.Disabled: - status_text = unicode( - translate('OpenLP.PluginForm', '%s (Disabled)')) - item.setText(status_text % plugin.get_text('name_more')) - # If the plugin has an icon, set it! - if plugin.icon: - item.setIcon(plugin.icon) - self.pluginListWidget.addItem(item) - - def _clearDetails(self): - self.statusComboBox.setCurrentIndex(-1) - self.versionNumberLabel.setText(u'') - self.aboutTextBrowser.setHtml(u'') - self.statusComboBox.setEnabled(False) - - def _setDetails(self): - log.debug('PluginStatus: %s', str(self.activePlugin.status)) - self.versionNumberLabel.setText(self.activePlugin.version) - self.aboutTextBrowser.setHtml(self.activePlugin.about()) - self.programaticChange = True - status = 1 - if self.activePlugin.status == PluginStatus.Active: - status = 0 - self.statusComboBox.setCurrentIndex(status) - self.statusComboBox.setEnabled(True) - self.programaticChange = False - - def onPluginListWidgetSelectionChanged(self): - if self.pluginListWidget.currentItem() is None: - self._clearDetails() - return - plugin_name_more = self.pluginListWidget.currentItem().text().split(u' ')[0] - self.activePlugin = None - for plugin in self.parent.plugin_manager.plugins: - if plugin.get_text('name_more') == plugin_name_more: - self.activePlugin = plugin - break - if self.activePlugin: - self._setDetails() - else: - self._clearDetails() - - def onStatusComboBoxChanged(self, status): - if self.programaticChange: - return - if status == 0: - self.activePlugin.toggleStatus(PluginStatus.Active) - self.activePlugin.initialise() - else: - self.activePlugin.toggleStatus(PluginStatus.Inactive) - self.activePlugin.finalise() - status_text = unicode( - translate('OpenLP.PluginForm', '%s (Inactive)')) - if self.activePlugin.status == PluginStatus.Active: - status_text = unicode( - translate('OpenLP.PluginForm', '%s (Active)')) - elif self.activePlugin.status == PluginStatus.Inactive: - status_text = unicode( - translate('OpenLP.PluginForm', '%s (Inactive)')) - elif self.activePlugin.status == PluginStatus.Disabled: - status_text = unicode( - translate('OpenLP.PluginForm', '%s (Disabled)')) - self.pluginListWidget.currentItem().setText( - status_text % self.activePlugin.get_text('name_more')) +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import PluginStatus, StringType, translate +from plugindialog import Ui_PluginViewDialog + +log = logging.getLogger(__name__) + +class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): + + def __init__(self, parent=None): + QtGui.QDialog.__init__(self, parent) + self.parent = parent + self.activePlugin = None + self.programaticChange = False + self.setupUi(self) + self.load() + self._clearDetails() + # Right, now let's put some signals and slots together! + QtCore.QObject.connect( + self.pluginListWidget, + QtCore.SIGNAL(u'itemSelectionChanged()'), + self.onPluginListWidgetSelectionChanged) + QtCore.QObject.connect( + self.statusComboBox, + QtCore.SIGNAL(u'currentIndexChanged(int)'), + self.onStatusComboBoxChanged) + + def load(self): + """ + Load the plugin details into the screen + """ + self.pluginListWidget.clear() + for plugin in self.parent.plugin_manager.plugins: + item = QtGui.QListWidgetItem(self.pluginListWidget) + # We do this just to make 100% sure the status is an integer as + # sometimes when it's loaded from the config, it isn't cast to int. + plugin.status = int(plugin.status) + # Set the little status text in brackets next to the plugin name. + status_text = unicode( + translate('OpenLP.PluginForm', '%s (Inactive)')) + if plugin.status == PluginStatus.Active: + status_text = unicode( + translate('OpenLP.PluginForm', '%s (Active)')) + elif plugin.status == PluginStatus.Inactive: + status_text = unicode( + translate('OpenLP.PluginForm', '%s (Inactive)')) + elif plugin.status == PluginStatus.Disabled: + status_text = unicode( + translate('OpenLP.PluginForm', '%s (Disabled)')) + nameString = plugin.getString(StringType.Name) + item.setText(status_text % nameString[u'plural']) + # If the plugin has an icon, set it! + if plugin.icon: + item.setIcon(plugin.icon) + self.pluginListWidget.addItem(item) + + def _clearDetails(self): + self.statusComboBox.setCurrentIndex(-1) + self.versionNumberLabel.setText(u'') + self.aboutTextBrowser.setHtml(u'') + self.statusComboBox.setEnabled(False) + + def _setDetails(self): + log.debug('PluginStatus: %s', str(self.activePlugin.status)) + self.versionNumberLabel.setText(self.activePlugin.version) + self.aboutTextBrowser.setHtml(self.activePlugin.about()) + self.programaticChange = True + status = 1 + if self.activePlugin.status == PluginStatus.Active: + status = 0 + self.statusComboBox.setCurrentIndex(status) + self.statusComboBox.setEnabled(True) + self.programaticChange = False + + def onPluginListWidgetSelectionChanged(self): + if self.pluginListWidget.currentItem() is None: + self._clearDetails() + return + plugin_name_more = self.pluginListWidget.currentItem().text().split(u' ')[0] + self.activePlugin = None + for plugin in self.parent.plugin_manager.plugins: + nameString = plugin.getString(StringType.Name) + if nameString[u'plural'] == plugin_name_more: + self.activePlugin = plugin + break + if self.activePlugin: + self._setDetails() + else: + self._clearDetails() + + def onStatusComboBoxChanged(self, status): + if self.programaticChange: + return + if status == 0: + self.activePlugin.toggleStatus(PluginStatus.Active) + self.activePlugin.initialise() + else: + self.activePlugin.toggleStatus(PluginStatus.Inactive) + self.activePlugin.finalise() + status_text = unicode( + translate('OpenLP.PluginForm', '%s (Inactive)')) + if self.activePlugin.status == PluginStatus.Active: + status_text = unicode( + translate('OpenLP.PluginForm', '%s (Active)')) + elif self.activePlugin.status == PluginStatus.Inactive: + status_text = unicode( + translate('OpenLP.PluginForm', '%s (Inactive)')) + elif self.activePlugin.status == PluginStatus.Disabled: + status_text = unicode( + translate('OpenLP.PluginForm', '%s (Disabled)')) + nameString = self.activePlugin.getString(StringType.Name) + self.pluginListWidget.currentItem().setText( + status_text % nameString[u'plural']) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 2ea985598..1bfd1e777 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1,982 +1,988 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging -import os - -from PyQt4 import QtCore, QtGui -from PyQt4.phonon import Phonon - -from openlp.core.ui import HideMode, MainDisplay -from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ - ItemCapabilities, translate - -log = logging.getLogger(__name__) - -class SlideList(QtGui.QTableWidget): - """ - Customised version of QTableWidget which can respond to keyboard - events. - """ - def __init__(self, parent=None, name=None): - QtGui.QTableWidget.__init__(self, parent.Controller) - self.parent = parent - self.hotkeyMap = { - QtCore.Qt.Key_Return: 'servicemanager_next_item', - QtCore.Qt.Key_Space: 'slidecontroller_live_next_noloop', - QtCore.Qt.Key_Enter: 'slidecontroller_live_next_noloop', - QtCore.Qt.Key_0: 'servicemanager_next_item', - QtCore.Qt.Key_Backspace: 'slidecontroller_live_previous_noloop'} - - def keyPressEvent(self, event): - if isinstance(event, QtGui.QKeyEvent): - #here accept the event and do something - if event.key() == QtCore.Qt.Key_Up: - self.parent.onSlideSelectedPrevious() - event.accept() - elif event.key() == QtCore.Qt.Key_Down: - self.parent.onSlideSelectedNext() - event.accept() - elif event.key() == QtCore.Qt.Key_PageUp: - self.parent.onSlideSelectedFirst() - event.accept() - elif event.key() == QtCore.Qt.Key_PageDown: - self.parent.onSlideSelectedLast() - event.accept() - elif event.key() in self.hotkeyMap and self.parent.isLive: - Receiver.send_message(self.hotkeyMap[event.key()]) - event.accept() - event.ignore() - else: - event.ignore() - -class SlideController(QtGui.QWidget): - """ - SlideController is the slide controller widget. This widget is what the - user uses to control the displaying of verses/slides/etc on the screen. - """ - def __init__(self, parent, settingsmanager, screens, isLive=False): - """ - Set up the Slide Controller. - """ - QtGui.QWidget.__init__(self, parent) - self.settingsmanager = settingsmanager - self.isLive = isLive - self.parent = parent - self.screens = screens - self.ratio = float(self.screens.current[u'size'].width()) / \ - float(self.screens.current[u'size'].height()) - self.display = MainDisplay(self, screens, isLive) - self.loopList = [ - u'Start Loop', - u'Loop Separator', - u'Image SpinBox' - ] - self.songEditList = [ - u'Edit Song', - ] - self.volume = 10 - self.timer_id = 0 - self.songEdit = False - self.selectedRow = 0 - self.serviceItem = None - self.alertTab = None - self.Panel = QtGui.QWidget(parent.ControlSplitter) - self.slideList = {} - # Layout for holding panel - self.PanelLayout = QtGui.QVBoxLayout(self.Panel) - self.PanelLayout.setSpacing(0) - self.PanelLayout.setMargin(0) - # Type label for the top of the slide controller - self.TypeLabel = QtGui.QLabel(self.Panel) - if self.isLive: - self.TypeLabel.setText(translate('OpenLP.SlideController', 'Live')) - self.split = 1 - self.typePrefix = u'live' - else: - self.TypeLabel.setText(translate('OpenLP.SlideController', - 'Preview')) - self.split = 0 - self.typePrefix = u'preview' - self.TypeLabel.setStyleSheet(u'font-weight: bold; font-size: 12pt;') - self.TypeLabel.setAlignment(QtCore.Qt.AlignCenter) - self.PanelLayout.addWidget(self.TypeLabel) - # Splitter - self.Splitter = QtGui.QSplitter(self.Panel) - self.Splitter.setOrientation(QtCore.Qt.Vertical) - self.Splitter.setOpaqueResize(False) - self.PanelLayout.addWidget(self.Splitter) - # Actual controller section - self.Controller = QtGui.QWidget(self.Splitter) - self.Controller.setGeometry(QtCore.QRect(0, 0, 100, 536)) - self.Controller.setSizePolicy( - QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, - QtGui.QSizePolicy.Maximum)) - self.ControllerLayout = QtGui.QVBoxLayout(self.Controller) - self.ControllerLayout.setSpacing(0) - self.ControllerLayout.setMargin(0) - # Controller list view - self.PreviewListWidget = SlideList(self) - self.PreviewListWidget.setColumnCount(1) - self.PreviewListWidget.horizontalHeader().setVisible(False) - self.PreviewListWidget.setColumnWidth( - 0, self.Controller.width()) - self.PreviewListWidget.isLive = self.isLive - self.PreviewListWidget.setObjectName(u'PreviewListWidget') - self.PreviewListWidget.setSelectionBehavior(1) - self.PreviewListWidget.setEditTriggers( - QtGui.QAbstractItemView.NoEditTriggers) - self.PreviewListWidget.setHorizontalScrollBarPolicy( - QtCore.Qt.ScrollBarAlwaysOff) - self.PreviewListWidget.setAlternatingRowColors(True) - self.ControllerLayout.addWidget(self.PreviewListWidget) - # Build the full toolbar - self.Toolbar = OpenLPToolbar(self) - sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, - QtGui.QSizePolicy.Fixed) - sizeToolbarPolicy.setHorizontalStretch(0) - sizeToolbarPolicy.setVerticalStretch(0) - sizeToolbarPolicy.setHeightForWidth( - self.Toolbar.sizePolicy().hasHeightForWidth()) - self.Toolbar.setSizePolicy(sizeToolbarPolicy) - self.Toolbar.addToolbarButton( - u'Previous Slide', u':/slides/slide_previous.png', - translate('OpenLP.SlideController', 'Move to previous'), - self.onSlideSelectedPrevious) - self.Toolbar.addToolbarButton( - u'Next Slide', u':/slides/slide_next.png', - translate('OpenLP.SlideController', 'Move to next'), - self.onSlideSelectedNext) - if self.isLive: - self.Toolbar.addToolbarSeparator(u'Close Separator') - self.HideMenu = QtGui.QToolButton(self.Toolbar) - self.HideMenu.setText(translate('OpenLP.SlideController', 'Hide')) - self.HideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) - self.Toolbar.addToolbarWidget(u'Hide Menu', self.HideMenu) - self.HideMenu.setMenu(QtGui.QMenu( - translate('OpenLP.SlideController', 'Hide'), self.Toolbar)) - self.BlankScreen = QtGui.QAction(QtGui.QIcon( - u':/slides/slide_blank.png'), u'Blank Screen', self.HideMenu) - self.BlankScreen.setCheckable(True) - QtCore.QObject.connect(self.BlankScreen, - QtCore.SIGNAL("triggered(bool)"), self.onBlankDisplay) - self.ThemeScreen = QtGui.QAction(QtGui.QIcon( - u':/slides/slide_theme.png'), u'Blank to Theme', self.HideMenu) - self.ThemeScreen.setCheckable(True) - QtCore.QObject.connect(self.ThemeScreen, - QtCore.SIGNAL("triggered(bool)"), self.onThemeDisplay) - if self.screens.display_count > 1: - self.DesktopScreen = QtGui.QAction(QtGui.QIcon( - u':/slides/slide_desktop.png'), u'Show Desktop', - self.HideMenu) - self.DesktopScreen.setCheckable(True) - QtCore.QObject.connect(self.DesktopScreen, - QtCore.SIGNAL("triggered(bool)"), self.onHideDisplay) - self.HideMenu.setDefaultAction(self.BlankScreen) - self.HideMenu.menu().addAction(self.BlankScreen) - self.HideMenu.menu().addAction(self.ThemeScreen) - if self.screens.display_count > 1: - self.HideMenu.menu().addAction(self.DesktopScreen) - if not self.isLive: - self.Toolbar.addToolbarSeparator(u'Close Separator') - self.Toolbar.addToolbarButton( - u'Go Live', u':/general/general_live.png', - translate('OpenLP.SlideController', 'Move to live'), - self.onGoLive) - self.Toolbar.addToolbarSeparator(u'Close Separator') - self.Toolbar.addToolbarButton( - u'Edit Song', u':/general/general_edit.png', - translate('OpenLP.SlideController', 'Edit and re-preview Song'), - self.onEditSong) - if isLive: - self.Toolbar.addToolbarSeparator(u'Loop Separator') - self.Toolbar.addToolbarButton( - u'Start Loop', u':/media/media_time.png', - translate('OpenLP.SlideController', 'Start continuous loop'), - self.onStartLoop) - self.Toolbar.addToolbarButton( - u'Stop Loop', u':/media/media_stop.png', - translate('OpenLP.SlideController', 'Stop continuous loop'), - self.onStopLoop) - self.DelaySpinBox = QtGui.QSpinBox() - self.DelaySpinBox.setMinimum(1) - self.DelaySpinBox.setMaximum(180) - self.Toolbar.addToolbarWidget( - u'Image SpinBox', self.DelaySpinBox) - self.DelaySpinBox.setSuffix(translate('OpenLP.SlideController', - 's')) - self.DelaySpinBox.setToolTip(translate('OpenLP.SlideController', - 'Delay between slides in seconds')) - self.ControllerLayout.addWidget(self.Toolbar) - # Build a Media ToolBar - self.Mediabar = OpenLPToolbar(self) - self.Mediabar.addToolbarButton( - u'Media Start', u':/slides/media_playback_start.png', - translate('OpenLP.SlideController', 'Start playing media'), - self.onMediaPlay) - self.Mediabar.addToolbarButton( - u'Media Pause', u':/slides/media_playback_pause.png', - translate('OpenLP.SlideController', 'Start playing media'), - self.onMediaPause) - self.Mediabar.addToolbarButton( - u'Media Stop', u':/slides/media_playback_stop.png', - translate('OpenLP.SlideController', 'Start playing media'), - self.onMediaStop) - if not self.isLive: - self.seekSlider = Phonon.SeekSlider() - self.seekSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) - self.seekSlider.setObjectName(u'seekSlider') - self.Mediabar.addToolbarWidget( - u'Seek Slider', self.seekSlider) - self.volumeSlider = Phonon.VolumeSlider() - self.volumeSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) - self.volumeSlider.setObjectName(u'volumeSlider') - self.Mediabar.addToolbarWidget(u'Audio Volume', self.volumeSlider) - else: - self.volumeSlider = QtGui.QSlider(QtCore.Qt.Horizontal) - self.volumeSlider.setTickInterval(1) - self.volumeSlider.setTickPosition(QtGui.QSlider.TicksAbove) - self.volumeSlider.setMinimum(0) - self.volumeSlider.setMaximum(10) - self.volumeSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) - self.volumeSlider.setObjectName(u'volumeSlider') - self.Mediabar.addToolbarWidget(u'Audio Volume', self.volumeSlider) - self.ControllerLayout.addWidget(self.Mediabar) - # Build the Song Toolbar - if isLive: - self.SongMenu = QtGui.QToolButton(self.Toolbar) - self.SongMenu.setText(translate('OpenLP.SlideController', - 'Go to')) - self.SongMenu.setPopupMode(QtGui.QToolButton.InstantPopup) - self.Toolbar.addToolbarWidget(u'Song Menu', self.SongMenu) - self.SongMenu.setMenu(QtGui.QMenu( - translate('OpenLP.SlideController', 'Go to'), - self.Toolbar)) - self.Toolbar.makeWidgetsInvisible([u'Song Menu']) - # Screen preview area - self.PreviewFrame = QtGui.QFrame(self.Splitter) - self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 300, 225)) - self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy( - QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Label)) - self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel) - self.PreviewFrame.setFrameShadow(QtGui.QFrame.Sunken) - self.PreviewFrame.setObjectName(u'PreviewFrame') - self.grid = QtGui.QGridLayout(self.PreviewFrame) - self.grid.setMargin(8) - self.grid.setObjectName(u'grid') - self.SlideLayout = QtGui.QVBoxLayout() - self.SlideLayout.setSpacing(0) - self.SlideLayout.setMargin(0) - self.SlideLayout.setObjectName(u'SlideLayout') - self.mediaObject = Phonon.MediaObject(self) - self.video = Phonon.VideoWidget() - self.video.setVisible(False) - self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self.mediaObject) - Phonon.createPath(self.mediaObject, self.video) - Phonon.createPath(self.mediaObject, self.audio) - if not self.isLive: - self.video.setGeometry(QtCore.QRect(0, 0, 300, 225)) - self.video.setVisible(False) - self.SlideLayout.insertWidget(0, self.video) - # Actual preview screen - self.SlidePreview = QtGui.QLabel(self) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( - self.SlidePreview.sizePolicy().hasHeightForWidth()) - self.SlidePreview.setSizePolicy(sizePolicy) - self.SlidePreview.setFixedSize( - QtCore.QSize(self.settingsmanager.slidecontroller_image, - self.settingsmanager.slidecontroller_image / self.ratio)) - self.SlidePreview.setFrameShape(QtGui.QFrame.Box) - self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain) - self.SlidePreview.setLineWidth(1) - self.SlidePreview.setScaledContents(True) - self.SlidePreview.setObjectName(u'SlidePreview') - self.SlideLayout.insertWidget(0, self.SlidePreview) - self.grid.addLayout(self.SlideLayout, 0, 0, 1, 1) - # Signals - QtCore.QObject.connect(self.PreviewListWidget, - QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected) - if not self.isLive: - if QtCore.QSettings().value(u'advanced/double click live', - QtCore.QVariant(False)).toBool(): - QtCore.QObject.connect(self.PreviewListWidget, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onGoLive) - if isLive: - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), - self.receiveSpinDelay) - if isLive: - self.Toolbar.makeWidgetsInvisible(self.loopList) - self.Toolbar.actions[u'Stop Loop'].setVisible(False) - else: - self.Toolbar.makeWidgetsInvisible(self.songEditList) - self.Mediabar.setVisible(False) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_stop_loop' % self.typePrefix), - self.onStopLoop) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_first' % self.typePrefix), - self.onSlideSelectedFirst) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_next' % self.typePrefix), - self.onSlideSelectedNext) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_previous' % self.typePrefix), - self.onSlideSelectedPrevious) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_next_noloop' % self.typePrefix), - self.onSlideSelectedNextNoloop) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_previous_noloop' % - self.typePrefix), - self.onSlideSelectedPreviousNoloop) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_last' % self.typePrefix), - self.onSlideSelectedLast) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_change' % self.typePrefix), - self.onSlideChange) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_set' % self.typePrefix), - self.onSlideSelectedIndex) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.typePrefix), - self.onSlideBlank) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix), - self.onSlideUnblank) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.typePrefix), - self.onTextRequest) - QtCore.QObject.connect(self.Splitter, - QtCore.SIGNAL(u'splitterMoved(int, int)'), self.trackSplitter) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'config_updated'), self.refreshServiceItem) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged) - if self.isLive: - QtCore.QObject.connect(self.volumeSlider, - QtCore.SIGNAL(u'sliderReleased()'), self.mediaVolume) - - def screenSizeChanged(self): - """ - Settings dialog has changed the screen size of adjust output and - screen previews - """ - log.debug(u'screenSizeChanged live = %s' % self.isLive) - # rebuild display as screen size changed - self.display = MainDisplay(self, self.screens, self.isLive) - self.display.alertTab = self.alertTab - self.ratio = float(self.screens.current[u'size'].width()) / \ - float(self.screens.current[u'size'].height()) - self.display.setup() - self.SlidePreview.setFixedSize( - QtCore.QSize(self.settingsmanager.slidecontroller_image, - self.settingsmanager.slidecontroller_image / self.ratio)) - - def widthChanged(self): - """ - Handle changes of width from the splitter between the live and preview - controller. Event only issues when changes have finished - """ - log.debug(u'widthChanged live = %s' % self.isLive) - width = self.parent.ControlSplitter.sizes()[self.split] - height = width * self.parent.RenderManager.screen_ratio - self.PreviewListWidget.setColumnWidth(0, width) - # Sort out image heights (Songs, bibles excluded) - if self.serviceItem and not self.serviceItem.is_text(): - for framenumber in range(len(self.serviceItem.get_frames())): - self.PreviewListWidget.setRowHeight(framenumber, height) - - def trackSplitter(self, tab, pos): - """ - Splitter between the slide list and the preview panel - """ - pass - - def onSongBarHandler(self): - request = unicode(self.sender().text()) - slideno = self.slideList[request] - if slideno > self.PreviewListWidget.rowCount(): - self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) - else: - self.PreviewListWidget.selectRow(slideno) - self.onSlideSelected() - - def receiveSpinDelay(self, value): - self.DelaySpinBox.setValue(int(value)) - - def enableToolBar(self, item): - """ - Allows the toolbars to be reconfigured based on Controller Type - and ServiceItem Type - """ - if self.isLive: - self.enableLiveToolBar(item) - else: - self.enablePreviewToolBar(item) - - def enableLiveToolBar(self, item): - """ - Allows the live toolbar to be customised - """ - self.Toolbar.setVisible(True) - self.Mediabar.setVisible(False) - self.Toolbar.makeWidgetsInvisible([u'Song Menu']) - self.Toolbar.makeWidgetsInvisible(self.loopList) - self.Toolbar.actions[u'Stop Loop'].setVisible(False) - if item.is_text(): - if QtCore.QSettings().value( - self.parent.songsSettingsSection + u'/show songbar', - QtCore.QVariant(True)).toBool() and len(self.slideList) > 0: - self.Toolbar.makeWidgetsVisible([u'Song Menu']) - if item.is_capable(ItemCapabilities.AllowsLoop) and \ - len(item.get_frames()) > 1: - self.Toolbar.makeWidgetsVisible(self.loopList) - if item.is_media(): - self.Toolbar.setVisible(False) - self.Mediabar.setVisible(True) - - def enablePreviewToolBar(self, item): - """ - Allows the Preview toolbar to be customised - """ - self.Toolbar.setVisible(True) - self.Mediabar.setVisible(False) - self.Toolbar.makeWidgetsInvisible(self.songEditList) - if item.is_capable(ItemCapabilities.AllowsEdit) and item.from_plugin: - self.Toolbar.makeWidgetsVisible(self.songEditList) - elif item.is_media(): - self.Toolbar.setVisible(False) - self.Mediabar.setVisible(True) - self.volumeSlider.setAudioOutput(self.audio) - - def refreshServiceItem(self): - """ - Method to update the service item if the screen has changed - """ - log.debug(u'refreshServiceItem live = %s' % self.isLive) - if self.serviceItem: - if self.serviceItem.is_text() or self.serviceItem.is_image(): - item = self.serviceItem - item.render() - self._processItem(item, self.selectedRow) - - def addServiceItem(self, item): - """ - Method to install the service item into the controller - Called by plugins - """ - log.debug(u'addServiceItem live = %s' % self.isLive) - item.render() - slideno = 0 - if self.songEdit: - slideno = self.selectedRow - self.songEdit = False - self._processItem(item, slideno) - - def replaceServiceManagerItem(self, item): - """ - Replacement item following a remote edit - """ - if item.__eq__(self.serviceItem): - self._processItem(item, self.PreviewListWidget.currentRow()) - - def addServiceManagerItem(self, item, slideno): - """ - Method to install the service item into the controller and - request the correct toolbar for the plugin. - Called by ServiceManager - """ - log.debug(u'addServiceManagerItem live = %s' % self.isLive) - # If service item is the same as the current on only change slide - if item.__eq__(self.serviceItem): - self.PreviewListWidget.selectRow(slideno) - self.onSlideSelected() - return - self._processItem(item, slideno) - - def _processItem(self, serviceItem, slideno): - """ - Loads a ServiceItem into the system from ServiceManager - Display the slide number passed - """ - log.debug(u'processManagerItem live = %s' % self.isLive) - self.onStopLoop() - # If old item was a command tell it to stop - if self.serviceItem: - if self.serviceItem.is_command(): - Receiver.send_message(u'%s_stop' % - self.serviceItem.name.lower(), [serviceItem, self.isLive]) - if self.serviceItem.is_media(): - self.onMediaStop() - if self.isLive: - blanked = self.BlankScreen.isChecked() - else: - blanked = False - Receiver.send_message(u'%s_start' % serviceItem.name.lower(), - [serviceItem, self.isLive, blanked, slideno]) - self.slideList = {} - width = self.parent.ControlSplitter.sizes()[self.split] - # Set pointing cursor when we have somthing to point at - self.PreviewListWidget.setCursor(QtCore.Qt.PointingHandCursor) - self.serviceItem = serviceItem - self.PreviewListWidget.clear() - self.PreviewListWidget.setRowCount(0) - self.PreviewListWidget.setColumnWidth(0, width) - if self.isLive: - self.SongMenu.menu().clear() - row = 0 - text = [] - for framenumber, frame in enumerate(self.serviceItem.get_frames()): - self.PreviewListWidget.setRowCount( - self.PreviewListWidget.rowCount() + 1) - item = QtGui.QTableWidgetItem() - slideHeight = 0 - if self.serviceItem.is_text(): - if frame[u'verseTag']: - bits = frame[u'verseTag'].split(u':') - tag = u'%s\n%s' % (bits[0][0], bits[1][0:] ) - tag1 = u'%s%s' % (bits[0][0], bits[1][0:] ) - row = tag - if self.isLive: - if tag1 not in self.slideList: - self.slideList[tag1] = framenumber - self.SongMenu.menu().addAction(tag1, - self.onSongBarHandler) - else: - row += 1 - item.setText(frame[u'text']) - else: - label = QtGui.QLabel() - label.setMargin(4) - pixmap = resize_image(frame[u'image'], - self.parent.RenderManager.width, - self.parent.RenderManager.height) - label.setScaledContents(True) - label.setPixmap(QtGui.QPixmap.fromImage(pixmap)) - self.PreviewListWidget.setCellWidget(framenumber, 0, label) - slideHeight = width * self.parent.RenderManager.screen_ratio - row += 1 - text.append(unicode(row)) - self.PreviewListWidget.setItem(framenumber, 0, item) - if slideHeight != 0: - self.PreviewListWidget.setRowHeight(framenumber, slideHeight) - self.PreviewListWidget.setVerticalHeaderLabels(text) - if self.serviceItem.is_text(): - self.PreviewListWidget.resizeRowsToContents() - self.PreviewListWidget.setColumnWidth(0, - self.PreviewListWidget.viewport().size().width()) - if slideno > self.PreviewListWidget.rowCount(): - self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) - else: - self.PreviewListWidget.selectRow(slideno) - self.enableToolBar(serviceItem) - # Pass to display for viewing - self.display.buildHtml(self.serviceItem) - if serviceItem.is_media(): - self.onMediaStart(serviceItem) - self.onSlideSelected() - self.PreviewListWidget.setFocus() - Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, - [serviceItem]) - - def onTextRequest(self): - """ - Return the text for the current item in controller - """ - data = [] - if self.serviceItem: - for framenumber, frame in enumerate(self.serviceItem.get_frames()): - dataItem = {} - if self.serviceItem.is_text(): - dataItem[u'tag'] = unicode(frame[u'verseTag']) - dataItem[u'text'] = unicode(frame[u'html']) - else: - dataItem[u'tag'] = unicode(framenumber) - dataItem[u'text'] = u'' - dataItem[u'selected'] = \ - (self.PreviewListWidget.currentRow() == framenumber) - data.append(dataItem) - Receiver.send_message(u'slidecontroller_%s_text_response' - % self.typePrefix, data) - - # Screen event methods - def onSlideSelectedFirst(self): - """ - Go to the first slide. - """ - if not self.serviceItem: - return - Receiver.send_message(u'%s_first' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - if self.serviceItem.is_command(): - self.updatePreview() - else: - self.PreviewListWidget.selectRow(0) - self.onSlideSelected() - - def onSlideSelectedIndex(self, message): - """ - Go to the requested slide - """ - index = int(message[0]) - if not self.serviceItem: - return - Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive, index]) - if self.serviceItem.is_command(): - self.updatePreview() - else: - self.PreviewListWidget.selectRow(index) - self.onSlideSelected() - - def mainDisplaySetBackground(self): - """ - Allow the main display to blank the main display at startup time - """ - log.debug(u'mainDisplaySetBackground live = %s' % self.isLive) - if not self.display.primary: - self.onHideDisplay(True) - - def onSlideBlank(self): - """ - Handle the slidecontroller blank event - """ - self.onBlankDisplay(True) - - def onSlideUnblank(self): - """ - Handle the slidecontroller unblank event - """ - self.onBlankDisplay(False) - - def onBlankDisplay(self, checked): - """ - Handle the blank screen button actions - """ - log.debug(u'onBlankDisplay %s' % checked) - self.HideMenu.setDefaultAction(self.BlankScreen) - self.BlankScreen.setChecked(checked) - self.ThemeScreen.setChecked(False) - if self.screens.display_count > 1: - self.DesktopScreen.setChecked(False) - QtCore.QSettings().setValue( - self.parent.generalSettingsSection + u'/screen blank', - QtCore.QVariant(checked)) - if checked: - Receiver.send_message(u'maindisplay_hide', HideMode.Blank) - else: - Receiver.send_message(u'maindisplay_show') - self.blankPlugin(checked) - - def onThemeDisplay(self, checked): - """ - Handle the Theme screen button - """ - log.debug(u'onThemeDisplay %s' % checked) - self.HideMenu.setDefaultAction(self.ThemeScreen) - self.BlankScreen.setChecked(False) - self.ThemeScreen.setChecked(checked) - if self.screens.display_count > 1: - self.DesktopScreen.setChecked(False) - if checked: - Receiver.send_message(u'maindisplay_hide', HideMode.Theme) - else: - Receiver.send_message(u'maindisplay_show') - self.blankPlugin(checked) - - def onHideDisplay(self, checked): - """ - Handle the Hide screen button - """ - log.debug(u'onHideDisplay %s' % checked) - self.HideMenu.setDefaultAction(self.DesktopScreen) - self.BlankScreen.setChecked(False) - self.ThemeScreen.setChecked(False) - if self.screens.display_count > 1: - self.DesktopScreen.setChecked(checked) - if checked: - Receiver.send_message(u'maindisplay_hide', HideMode.Screen) - else: - Receiver.send_message(u'maindisplay_show') - self.hidePlugin(checked) - - def blankPlugin(self, blank): - """ - Blank the display screen within a plugin if required. - """ - log.debug(u'blankPlugin %s ', blank) - if self.serviceItem is not None: - if blank: - Receiver.send_message(u'%s_blank' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - else: - Receiver.send_message(u'%s_unblank' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - - def hidePlugin(self, hide): - """ - Tell the plugin to hide the display screen. - """ - log.debug(u'hidePlugin %s ', hide) - if self.serviceItem is not None: - if hide: - Receiver.send_message(u'%s_hide' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - else: - Receiver.send_message(u'%s_unblank' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - - def onSlideSelected(self): - """ - Generate the preview when you click on a slide. - if this is the Live Controller also display on the screen - """ - row = self.PreviewListWidget.currentRow() - self.selectedRow = 0 - if row > -1 and row < self.PreviewListWidget.rowCount(): - Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive, row]) - if self.serviceItem.is_command() and self.isLive: - self.updatePreview() - else: - frame, raw_html = self.serviceItem.get_rendered_frame(row) - if self.serviceItem.is_text(): - frame = self.display.text(raw_html) - else: - self.display.image(frame) - if isinstance(frame, QtGui.QImage): - self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) - else: - self.SlidePreview.setPixmap(QtGui.QPixmap(frame)) - self.selectedRow = row - Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, - row) - - def onSlideChange(self, row): - """ - The slide has been changed. Update the slidecontroller accordingly - """ - self.PreviewListWidget.selectRow(row) - self.updatePreview() - Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, - row) - - def updatePreview(self): - if not self.screens.current[u'primary']: - # Grab now, but try again in a couple of seconds if slide change - # is slow - QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) - QtCore.QTimer.singleShot(2.5, self.grabMainDisplay) - else: - label = self.PreviewListWidget.cellWidget( - self.PreviewListWidget.currentRow(), 1) - if label: - self.SlidePreview.setPixmap(label.pixmap()) - - def grabMainDisplay(self): - winid = QtGui.QApplication.desktop().winId() - rect = self.screens.current[u'size'] - winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), - rect.y(), rect.width(), rect.height()) - self.SlidePreview.setPixmap(winimg) - - def onSlideSelectedNextNoloop(self): - self.onSlideSelectedNext(False) - - def onSlideSelectedNext(self, loop=True): - """ - Go to the next slide. - """ - if not self.serviceItem: - return - Receiver.send_message(u'%s_next' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - if self.serviceItem.is_command() and self.isLive: - self.updatePreview() - else: - row = self.PreviewListWidget.currentRow() + 1 - if row == self.PreviewListWidget.rowCount(): - if loop: - row = 0 - else: - Receiver.send_message('servicemanager_next_item') - return - self.PreviewListWidget.selectRow(row) - self.onSlideSelected() - - def onSlideSelectedPreviousNoloop(self): - self.onSlideSelectedPrevious(False) - - def onSlideSelectedPrevious(self, loop=True): - """ - Go to the previous slide. - """ - if not self.serviceItem: - return - Receiver.send_message(u'%s_previous' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - if self.serviceItem.is_command() and self.isLive: - self.updatePreview() - else: - row = self.PreviewListWidget.currentRow() - 1 - if row == -1: - if loop: - row = self.PreviewListWidget.rowCount() - 1 - else: - row = 0 - self.PreviewListWidget.selectRow(row) - self.onSlideSelected() - - def onSlideSelectedLast(self): - """ - Go to the last slide. - """ - if not self.serviceItem: - return - Receiver.send_message(u'%s_last' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - if self.serviceItem.is_command(): - self.updatePreview() - else: - self.PreviewListWidget.selectRow( - self.PreviewListWidget.rowCount() - 1) - self.onSlideSelected() - - def onStartLoop(self): - """ - Start the timer loop running and store the timer id - """ - if self.PreviewListWidget.rowCount() > 1: - self.timer_id = self.startTimer( - int(self.DelaySpinBox.value()) * 1000) - self.Toolbar.actions[u'Stop Loop'].setVisible(True) - self.Toolbar.actions[u'Start Loop'].setVisible(False) - - def onStopLoop(self): - """ - Stop the timer loop running - """ - if self.timer_id != 0: - self.killTimer(self.timer_id) - self.timer_id = 0 - self.Toolbar.actions[u'Start Loop'].setVisible(True) - self.Toolbar.actions[u'Stop Loop'].setVisible(False) - - def timerEvent(self, event): - """ - If the timer event is for this window select next slide - """ - if event.timerId() == self.timer_id: - self.onSlideSelectedNext() - - def onEditSong(self): - """ - From the preview display requires the service Item to be editied - """ - self.songEdit = True - Receiver.send_message(u'%s_edit' % self.serviceItem.name.lower(), - u'P:%s' % self.serviceItem.editId) - - def onGoLive(self): - """ - If preview copy slide item to live - """ - row = self.PreviewListWidget.currentRow() - if row > -1 and row < self.PreviewListWidget.rowCount(): - self.parent.LiveController.addServiceManagerItem( - self.serviceItem, row) - - def onMediaStart(self, item): - """ - Respond to the arrival of a media service item - """ - log.debug(u'SlideController onMediaStart') - if self.isLive: - file = os.path.join(item.get_frame_path(), item.get_frame_title()) - self.display.video(file, self.volume) - self.volumeSlider.setValue(self.volume) - else: - self.mediaObject.stop() - self.mediaObject.clearQueue() - file = os.path.join(item.get_frame_path(), item.get_frame_title()) - self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) - self.seekSlider.setMediaObject(self.mediaObject) - self.seekSlider.show() - self.onMediaPlay() - - def mediaVolume(self): - """ - Respond to the release of Volume Slider - """ - log.debug(u'SlideController mediaVolume') - self.volume = self.volumeSlider.value() - self.display.videoVolume(self.volume) - - def onMediaPause(self): - """ - Respond to the Pause from the media Toolbar - """ - log.debug(u'SlideController onMediaPause') - if self.isLive: - self.display.videoPause() - else: - self.mediaObject.pause() - - def onMediaPlay(self): - """ - Respond to the Play from the media Toolbar - """ - log.debug(u'SlideController onMediaPlay') - if self.isLive: - self.display.videoPlay() - else: - self.SlidePreview.hide() - self.video.show() - self.mediaObject.play() - - def onMediaStop(self): - """ - Respond to the Stop from the media Toolbar - """ - log.debug(u'SlideController onMediaStop') - if self.isLive: - self.display.videoStop() - else: - self.mediaObject.stop() - self.video.hide() - self.SlidePreview.clear() - self.SlidePreview.show() +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging +import os + +from PyQt4 import QtCore, QtGui +from PyQt4.phonon import Phonon + +from openlp.core.ui import HideMode, MainDisplay +from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ + ItemCapabilities, translate + +log = logging.getLogger(__name__) + +class SlideList(QtGui.QTableWidget): + """ + Customised version of QTableWidget which can respond to keyboard + events. + """ + def __init__(self, parent=None, name=None): + QtGui.QTableWidget.__init__(self, parent.Controller) + self.parent = parent + self.hotkeyMap = { + QtCore.Qt.Key_Return: 'servicemanager_next_item', + QtCore.Qt.Key_Space: 'slidecontroller_live_next_noloop', + QtCore.Qt.Key_Enter: 'slidecontroller_live_next_noloop', + QtCore.Qt.Key_0: 'servicemanager_next_item', + QtCore.Qt.Key_Backspace: 'slidecontroller_live_previous_noloop'} + + def keyPressEvent(self, event): + if isinstance(event, QtGui.QKeyEvent): + #here accept the event and do something + if event.key() == QtCore.Qt.Key_Up: + self.parent.onSlideSelectedPrevious() + event.accept() + elif event.key() == QtCore.Qt.Key_Down: + self.parent.onSlideSelectedNext() + event.accept() + elif event.key() == QtCore.Qt.Key_PageUp: + self.parent.onSlideSelectedFirst() + event.accept() + elif event.key() == QtCore.Qt.Key_PageDown: + self.parent.onSlideSelectedLast() + event.accept() + elif event.key() in self.hotkeyMap and self.parent.isLive: + Receiver.send_message(self.hotkeyMap[event.key()]) + event.accept() + event.ignore() + else: + event.ignore() + +class SlideController(QtGui.QWidget): + """ + SlideController is the slide controller widget. This widget is what the + user uses to control the displaying of verses/slides/etc on the screen. + """ + def __init__(self, parent, settingsmanager, screens, isLive=False): + """ + Set up the Slide Controller. + """ + QtGui.QWidget.__init__(self, parent) + self.settingsmanager = settingsmanager + self.isLive = isLive + self.parent = parent + self.screens = screens + self.ratio = float(self.screens.current[u'size'].width()) / \ + float(self.screens.current[u'size'].height()) + self.display = MainDisplay(self, screens, isLive) + self.loopList = [ + u'Start Loop', + u'Loop Separator', + u'Image SpinBox' + ] + self.songEditList = [ + u'Edit Song', + ] + self.volume = 10 + self.timer_id = 0 + self.songEdit = False + self.selectedRow = 0 + self.serviceItem = None + self.alertTab = None + self.Panel = QtGui.QWidget(parent.ControlSplitter) + self.slideList = {} + # Layout for holding panel + self.PanelLayout = QtGui.QVBoxLayout(self.Panel) + self.PanelLayout.setSpacing(0) + self.PanelLayout.setMargin(0) + # Type label for the top of the slide controller + self.TypeLabel = QtGui.QLabel(self.Panel) + if self.isLive: + self.TypeLabel.setText(translate('OpenLP.SlideController', 'Live')) + self.split = 1 + self.typePrefix = u'live' + else: + self.TypeLabel.setText(translate('OpenLP.SlideController', + 'Preview')) + self.split = 0 + self.typePrefix = u'preview' + self.TypeLabel.setStyleSheet(u'font-weight: bold; font-size: 12pt;') + self.TypeLabel.setAlignment(QtCore.Qt.AlignCenter) + self.PanelLayout.addWidget(self.TypeLabel) + # Splitter + self.Splitter = QtGui.QSplitter(self.Panel) + self.Splitter.setOrientation(QtCore.Qt.Vertical) + self.Splitter.setOpaqueResize(False) + self.PanelLayout.addWidget(self.Splitter) + # Actual controller section + self.Controller = QtGui.QWidget(self.Splitter) + self.Controller.setGeometry(QtCore.QRect(0, 0, 100, 536)) + self.Controller.setSizePolicy( + QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + QtGui.QSizePolicy.Maximum)) + self.ControllerLayout = QtGui.QVBoxLayout(self.Controller) + self.ControllerLayout.setSpacing(0) + self.ControllerLayout.setMargin(0) + # Controller list view + self.PreviewListWidget = SlideList(self) + self.PreviewListWidget.setColumnCount(1) + self.PreviewListWidget.horizontalHeader().setVisible(False) + self.PreviewListWidget.setColumnWidth( + 0, self.Controller.width()) + self.PreviewListWidget.isLive = self.isLive + self.PreviewListWidget.setObjectName(u'PreviewListWidget') + self.PreviewListWidget.setSelectionBehavior(1) + self.PreviewListWidget.setEditTriggers( + QtGui.QAbstractItemView.NoEditTriggers) + self.PreviewListWidget.setHorizontalScrollBarPolicy( + QtCore.Qt.ScrollBarAlwaysOff) + self.PreviewListWidget.setAlternatingRowColors(True) + self.ControllerLayout.addWidget(self.PreviewListWidget) + # Build the full toolbar + self.Toolbar = OpenLPToolbar(self) + sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Fixed) + sizeToolbarPolicy.setHorizontalStretch(0) + sizeToolbarPolicy.setVerticalStretch(0) + sizeToolbarPolicy.setHeightForWidth( + self.Toolbar.sizePolicy().hasHeightForWidth()) + self.Toolbar.setSizePolicy(sizeToolbarPolicy) + self.Toolbar.addToolbarButton( + u'Previous Slide', u':/slides/slide_previous.png', + translate('OpenLP.SlideController', 'Move to previous'), + self.onSlideSelectedPrevious) + self.Toolbar.addToolbarButton( + u'Next Slide', u':/slides/slide_next.png', + translate('OpenLP.SlideController', 'Move to next'), + self.onSlideSelectedNext) + if self.isLive: + self.Toolbar.addToolbarSeparator(u'Close Separator') + self.HideMenu = QtGui.QToolButton(self.Toolbar) + self.HideMenu.setText(translate('OpenLP.SlideController', 'Hide')) + self.HideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) + self.Toolbar.addToolbarWidget(u'Hide Menu', self.HideMenu) + self.HideMenu.setMenu(QtGui.QMenu( + translate('OpenLP.SlideController', 'Hide'), self.Toolbar)) + self.BlankScreen = QtGui.QAction(QtGui.QIcon( + u':/slides/slide_blank.png'), u'Blank Screen', self.HideMenu) + self.BlankScreen.setText( + translate('OpenLP.SlideController', 'Blank Screen')) + self.BlankScreen.setCheckable(True) + QtCore.QObject.connect(self.BlankScreen, + QtCore.SIGNAL("triggered(bool)"), self.onBlankDisplay) + self.ThemeScreen = QtGui.QAction(QtGui.QIcon( + u':/slides/slide_theme.png'), u'Blank to Theme', self.HideMenu) + self.ThemeScreen.setText( + translate('OpenLP.SlideController', 'Blank to Theme')) + self.ThemeScreen.setCheckable(True) + QtCore.QObject.connect(self.ThemeScreen, + QtCore.SIGNAL("triggered(bool)"), self.onThemeDisplay) + if self.screens.display_count > 1: + self.DesktopScreen = QtGui.QAction(QtGui.QIcon( + u':/slides/slide_desktop.png'), u'Show Desktop', + self.HideMenu) + self.DesktopScreen.setText( + translate('OpenLP.SlideController', 'Show Desktop')) + self.DesktopScreen.setCheckable(True) + QtCore.QObject.connect(self.DesktopScreen, + QtCore.SIGNAL("triggered(bool)"), self.onHideDisplay) + self.HideMenu.setDefaultAction(self.BlankScreen) + self.HideMenu.menu().addAction(self.BlankScreen) + self.HideMenu.menu().addAction(self.ThemeScreen) + if self.screens.display_count > 1: + self.HideMenu.menu().addAction(self.DesktopScreen) + if not self.isLive: + self.Toolbar.addToolbarSeparator(u'Close Separator') + self.Toolbar.addToolbarButton( + u'Go Live', u':/general/general_live.png', + translate('OpenLP.SlideController', 'Move to live'), + self.onGoLive) + self.Toolbar.addToolbarSeparator(u'Close Separator') + self.Toolbar.addToolbarButton( + u'Edit Song', u':/general/general_edit.png', + translate('OpenLP.SlideController', 'Edit and re-preview Song'), + self.onEditSong) + if isLive: + self.Toolbar.addToolbarSeparator(u'Loop Separator') + self.Toolbar.addToolbarButton( + u'Start Loop', u':/media/media_time.png', + translate('OpenLP.SlideController', 'Start continuous loop'), + self.onStartLoop) + self.Toolbar.addToolbarButton( + u'Stop Loop', u':/media/media_stop.png', + translate('OpenLP.SlideController', 'Stop continuous loop'), + self.onStopLoop) + self.DelaySpinBox = QtGui.QSpinBox() + self.DelaySpinBox.setMinimum(1) + self.DelaySpinBox.setMaximum(180) + self.Toolbar.addToolbarWidget( + u'Image SpinBox', self.DelaySpinBox) + self.DelaySpinBox.setSuffix(translate('OpenLP.SlideController', + 's')) + self.DelaySpinBox.setToolTip(translate('OpenLP.SlideController', + 'Delay between slides in seconds')) + self.ControllerLayout.addWidget(self.Toolbar) + # Build a Media ToolBar + self.Mediabar = OpenLPToolbar(self) + self.Mediabar.addToolbarButton( + u'Media Start', u':/slides/media_playback_start.png', + translate('OpenLP.SlideController', 'Start playing media'), + self.onMediaPlay) + self.Mediabar.addToolbarButton( + u'Media Pause', u':/slides/media_playback_pause.png', + translate('OpenLP.SlideController', 'Start playing media'), + self.onMediaPause) + self.Mediabar.addToolbarButton( + u'Media Stop', u':/slides/media_playback_stop.png', + translate('OpenLP.SlideController', 'Start playing media'), + self.onMediaStop) + if not self.isLive: + self.seekSlider = Phonon.SeekSlider() + self.seekSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) + self.seekSlider.setObjectName(u'seekSlider') + self.Mediabar.addToolbarWidget( + u'Seek Slider', self.seekSlider) + self.volumeSlider = Phonon.VolumeSlider() + self.volumeSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) + self.volumeSlider.setObjectName(u'volumeSlider') + self.Mediabar.addToolbarWidget(u'Audio Volume', self.volumeSlider) + else: + self.volumeSlider = QtGui.QSlider(QtCore.Qt.Horizontal) + self.volumeSlider.setTickInterval(1) + self.volumeSlider.setTickPosition(QtGui.QSlider.TicksAbove) + self.volumeSlider.setMinimum(0) + self.volumeSlider.setMaximum(10) + self.volumeSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) + self.volumeSlider.setObjectName(u'volumeSlider') + self.Mediabar.addToolbarWidget(u'Audio Volume', self.volumeSlider) + self.ControllerLayout.addWidget(self.Mediabar) + # Build the Song Toolbar + if isLive: + self.SongMenu = QtGui.QToolButton(self.Toolbar) + self.SongMenu.setText(translate('OpenLP.SlideController', + 'Go to')) + self.SongMenu.setPopupMode(QtGui.QToolButton.InstantPopup) + self.Toolbar.addToolbarWidget(u'Song Menu', self.SongMenu) + self.SongMenu.setMenu(QtGui.QMenu( + translate('OpenLP.SlideController', 'Go to'), + self.Toolbar)) + self.Toolbar.makeWidgetsInvisible([u'Song Menu']) + # Screen preview area + self.PreviewFrame = QtGui.QFrame(self.Splitter) + self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 300, 225)) + self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy( + QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Label)) + self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel) + self.PreviewFrame.setFrameShadow(QtGui.QFrame.Sunken) + self.PreviewFrame.setObjectName(u'PreviewFrame') + self.grid = QtGui.QGridLayout(self.PreviewFrame) + self.grid.setMargin(8) + self.grid.setObjectName(u'grid') + self.SlideLayout = QtGui.QVBoxLayout() + self.SlideLayout.setSpacing(0) + self.SlideLayout.setMargin(0) + self.SlideLayout.setObjectName(u'SlideLayout') + self.mediaObject = Phonon.MediaObject(self) + self.video = Phonon.VideoWidget() + self.video.setVisible(False) + self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self.mediaObject) + Phonon.createPath(self.mediaObject, self.video) + Phonon.createPath(self.mediaObject, self.audio) + if not self.isLive: + self.video.setGeometry(QtCore.QRect(0, 0, 300, 225)) + self.video.setVisible(False) + self.SlideLayout.insertWidget(0, self.video) + # Actual preview screen + self.SlidePreview = QtGui.QLabel(self) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth( + self.SlidePreview.sizePolicy().hasHeightForWidth()) + self.SlidePreview.setSizePolicy(sizePolicy) + self.SlidePreview.setFixedSize( + QtCore.QSize(self.settingsmanager.slidecontroller_image, + self.settingsmanager.slidecontroller_image / self.ratio)) + self.SlidePreview.setFrameShape(QtGui.QFrame.Box) + self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain) + self.SlidePreview.setLineWidth(1) + self.SlidePreview.setScaledContents(True) + self.SlidePreview.setObjectName(u'SlidePreview') + self.SlideLayout.insertWidget(0, self.SlidePreview) + self.grid.addLayout(self.SlideLayout, 0, 0, 1, 1) + # Signals + QtCore.QObject.connect(self.PreviewListWidget, + QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected) + if not self.isLive: + if QtCore.QSettings().value(u'advanced/double click live', + QtCore.QVariant(False)).toBool(): + QtCore.QObject.connect(self.PreviewListWidget, + QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onGoLive) + if isLive: + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), + self.receiveSpinDelay) + if isLive: + self.Toolbar.makeWidgetsInvisible(self.loopList) + self.Toolbar.actions[u'Stop Loop'].setVisible(False) + else: + self.Toolbar.makeWidgetsInvisible(self.songEditList) + self.Mediabar.setVisible(False) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_stop_loop' % self.typePrefix), + self.onStopLoop) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_first' % self.typePrefix), + self.onSlideSelectedFirst) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_next' % self.typePrefix), + self.onSlideSelectedNext) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_previous' % self.typePrefix), + self.onSlideSelectedPrevious) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_next_noloop' % self.typePrefix), + self.onSlideSelectedNextNoloop) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_previous_noloop' % + self.typePrefix), + self.onSlideSelectedPreviousNoloop) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_last' % self.typePrefix), + self.onSlideSelectedLast) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_change' % self.typePrefix), + self.onSlideChange) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_set' % self.typePrefix), + self.onSlideSelectedIndex) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.typePrefix), + self.onSlideBlank) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix), + self.onSlideUnblank) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.typePrefix), + self.onTextRequest) + QtCore.QObject.connect(self.Splitter, + QtCore.SIGNAL(u'splitterMoved(int, int)'), self.trackSplitter) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'config_updated'), self.refreshServiceItem) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged) + if self.isLive: + QtCore.QObject.connect(self.volumeSlider, + QtCore.SIGNAL(u'sliderReleased()'), self.mediaVolume) + + def screenSizeChanged(self): + """ + Settings dialog has changed the screen size of adjust output and + screen previews + """ + log.debug(u'screenSizeChanged live = %s' % self.isLive) + # rebuild display as screen size changed + self.display = MainDisplay(self, self.screens, self.isLive) + self.display.alertTab = self.alertTab + self.ratio = float(self.screens.current[u'size'].width()) / \ + float(self.screens.current[u'size'].height()) + self.display.setup() + self.SlidePreview.setFixedSize( + QtCore.QSize(self.settingsmanager.slidecontroller_image, + self.settingsmanager.slidecontroller_image / self.ratio)) + + def widthChanged(self): + """ + Handle changes of width from the splitter between the live and preview + controller. Event only issues when changes have finished + """ + log.debug(u'widthChanged live = %s' % self.isLive) + width = self.parent.ControlSplitter.sizes()[self.split] + height = width * self.parent.RenderManager.screen_ratio + self.PreviewListWidget.setColumnWidth(0, width) + # Sort out image heights (Songs, bibles excluded) + if self.serviceItem and not self.serviceItem.is_text(): + for framenumber in range(len(self.serviceItem.get_frames())): + self.PreviewListWidget.setRowHeight(framenumber, height) + + def trackSplitter(self, tab, pos): + """ + Splitter between the slide list and the preview panel + """ + pass + + def onSongBarHandler(self): + request = unicode(self.sender().text()) + slideno = self.slideList[request] + if slideno > self.PreviewListWidget.rowCount(): + self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) + else: + self.PreviewListWidget.selectRow(slideno) + self.onSlideSelected() + + def receiveSpinDelay(self, value): + self.DelaySpinBox.setValue(int(value)) + + def enableToolBar(self, item): + """ + Allows the toolbars to be reconfigured based on Controller Type + and ServiceItem Type + """ + if self.isLive: + self.enableLiveToolBar(item) + else: + self.enablePreviewToolBar(item) + + def enableLiveToolBar(self, item): + """ + Allows the live toolbar to be customised + """ + self.Toolbar.setVisible(True) + self.Mediabar.setVisible(False) + self.Toolbar.makeWidgetsInvisible([u'Song Menu']) + self.Toolbar.makeWidgetsInvisible(self.loopList) + self.Toolbar.actions[u'Stop Loop'].setVisible(False) + if item.is_text(): + if QtCore.QSettings().value( + self.parent.songsSettingsSection + u'/show songbar', + QtCore.QVariant(True)).toBool() and len(self.slideList) > 0: + self.Toolbar.makeWidgetsVisible([u'Song Menu']) + if item.is_capable(ItemCapabilities.AllowsLoop) and \ + len(item.get_frames()) > 1: + self.Toolbar.makeWidgetsVisible(self.loopList) + if item.is_media(): + self.Toolbar.setVisible(False) + self.Mediabar.setVisible(True) + + def enablePreviewToolBar(self, item): + """ + Allows the Preview toolbar to be customised + """ + self.Toolbar.setVisible(True) + self.Mediabar.setVisible(False) + self.Toolbar.makeWidgetsInvisible(self.songEditList) + if item.is_capable(ItemCapabilities.AllowsEdit) and item.from_plugin: + self.Toolbar.makeWidgetsVisible(self.songEditList) + elif item.is_media(): + self.Toolbar.setVisible(False) + self.Mediabar.setVisible(True) + self.volumeSlider.setAudioOutput(self.audio) + + def refreshServiceItem(self): + """ + Method to update the service item if the screen has changed + """ + log.debug(u'refreshServiceItem live = %s' % self.isLive) + if self.serviceItem: + if self.serviceItem.is_text() or self.serviceItem.is_image(): + item = self.serviceItem + item.render() + self._processItem(item, self.selectedRow) + + def addServiceItem(self, item): + """ + Method to install the service item into the controller + Called by plugins + """ + log.debug(u'addServiceItem live = %s' % self.isLive) + item.render() + slideno = 0 + if self.songEdit: + slideno = self.selectedRow + self.songEdit = False + self._processItem(item, slideno) + + def replaceServiceManagerItem(self, item): + """ + Replacement item following a remote edit + """ + if item.__eq__(self.serviceItem): + self._processItem(item, self.PreviewListWidget.currentRow()) + + def addServiceManagerItem(self, item, slideno): + """ + Method to install the service item into the controller and + request the correct toolbar for the plugin. + Called by ServiceManager + """ + log.debug(u'addServiceManagerItem live = %s' % self.isLive) + # If service item is the same as the current on only change slide + if item.__eq__(self.serviceItem): + self.PreviewListWidget.selectRow(slideno) + self.onSlideSelected() + return + self._processItem(item, slideno) + + def _processItem(self, serviceItem, slideno): + """ + Loads a ServiceItem into the system from ServiceManager + Display the slide number passed + """ + log.debug(u'processManagerItem live = %s' % self.isLive) + self.onStopLoop() + # If old item was a command tell it to stop + if self.serviceItem: + if self.serviceItem.is_command(): + Receiver.send_message(u'%s_stop' % + self.serviceItem.name.lower(), [serviceItem, self.isLive]) + if self.serviceItem.is_media(): + self.onMediaStop() + if self.isLive: + blanked = self.BlankScreen.isChecked() + else: + blanked = False + Receiver.send_message(u'%s_start' % serviceItem.name.lower(), + [serviceItem, self.isLive, blanked, slideno]) + self.slideList = {} + width = self.parent.ControlSplitter.sizes()[self.split] + # Set pointing cursor when we have somthing to point at + self.PreviewListWidget.setCursor(QtCore.Qt.PointingHandCursor) + self.serviceItem = serviceItem + self.PreviewListWidget.clear() + self.PreviewListWidget.setRowCount(0) + self.PreviewListWidget.setColumnWidth(0, width) + if self.isLive: + self.SongMenu.menu().clear() + row = 0 + text = [] + for framenumber, frame in enumerate(self.serviceItem.get_frames()): + self.PreviewListWidget.setRowCount( + self.PreviewListWidget.rowCount() + 1) + item = QtGui.QTableWidgetItem() + slideHeight = 0 + if self.serviceItem.is_text(): + if frame[u'verseTag']: + bits = frame[u'verseTag'].split(u':') + tag = u'%s\n%s' % (bits[0][0], bits[1][0:] ) + tag1 = u'%s%s' % (bits[0][0], bits[1][0:] ) + row = tag + if self.isLive: + if tag1 not in self.slideList: + self.slideList[tag1] = framenumber + self.SongMenu.menu().addAction(tag1, + self.onSongBarHandler) + else: + row += 1 + item.setText(frame[u'text']) + else: + label = QtGui.QLabel() + label.setMargin(4) + pixmap = resize_image(frame[u'image'], + self.parent.RenderManager.width, + self.parent.RenderManager.height) + label.setScaledContents(True) + label.setPixmap(QtGui.QPixmap.fromImage(pixmap)) + self.PreviewListWidget.setCellWidget(framenumber, 0, label) + slideHeight = width * self.parent.RenderManager.screen_ratio + row += 1 + text.append(unicode(row)) + self.PreviewListWidget.setItem(framenumber, 0, item) + if slideHeight != 0: + self.PreviewListWidget.setRowHeight(framenumber, slideHeight) + self.PreviewListWidget.setVerticalHeaderLabels(text) + if self.serviceItem.is_text(): + self.PreviewListWidget.resizeRowsToContents() + self.PreviewListWidget.setColumnWidth(0, + self.PreviewListWidget.viewport().size().width()) + if slideno > self.PreviewListWidget.rowCount(): + self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) + else: + self.PreviewListWidget.selectRow(slideno) + self.enableToolBar(serviceItem) + # Pass to display for viewing + self.display.buildHtml(self.serviceItem) + if serviceItem.is_media(): + self.onMediaStart(serviceItem) + self.onSlideSelected() + self.PreviewListWidget.setFocus() + Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, + [serviceItem]) + + def onTextRequest(self): + """ + Return the text for the current item in controller + """ + data = [] + if self.serviceItem: + for framenumber, frame in enumerate(self.serviceItem.get_frames()): + dataItem = {} + if self.serviceItem.is_text(): + dataItem[u'tag'] = unicode(frame[u'verseTag']) + dataItem[u'text'] = unicode(frame[u'html']) + else: + dataItem[u'tag'] = unicode(framenumber) + dataItem[u'text'] = u'' + dataItem[u'selected'] = \ + (self.PreviewListWidget.currentRow() == framenumber) + data.append(dataItem) + Receiver.send_message(u'slidecontroller_%s_text_response' + % self.typePrefix, data) + + # Screen event methods + def onSlideSelectedFirst(self): + """ + Go to the first slide. + """ + if not self.serviceItem: + return + Receiver.send_message(u'%s_first' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + if self.serviceItem.is_command(): + self.updatePreview() + else: + self.PreviewListWidget.selectRow(0) + self.onSlideSelected() + + def onSlideSelectedIndex(self, message): + """ + Go to the requested slide + """ + index = int(message[0]) + if not self.serviceItem: + return + Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive, index]) + if self.serviceItem.is_command(): + self.updatePreview() + else: + self.PreviewListWidget.selectRow(index) + self.onSlideSelected() + + def mainDisplaySetBackground(self): + """ + Allow the main display to blank the main display at startup time + """ + log.debug(u'mainDisplaySetBackground live = %s' % self.isLive) + if not self.display.primary: + self.onHideDisplay(True) + + def onSlideBlank(self): + """ + Handle the slidecontroller blank event + """ + self.onBlankDisplay(True) + + def onSlideUnblank(self): + """ + Handle the slidecontroller unblank event + """ + self.onBlankDisplay(False) + + def onBlankDisplay(self, checked): + """ + Handle the blank screen button actions + """ + log.debug(u'onBlankDisplay %s' % checked) + self.HideMenu.setDefaultAction(self.BlankScreen) + self.BlankScreen.setChecked(checked) + self.ThemeScreen.setChecked(False) + if self.screens.display_count > 1: + self.DesktopScreen.setChecked(False) + QtCore.QSettings().setValue( + self.parent.generalSettingsSection + u'/screen blank', + QtCore.QVariant(checked)) + if checked: + Receiver.send_message(u'maindisplay_hide', HideMode.Blank) + else: + Receiver.send_message(u'maindisplay_show') + self.blankPlugin(checked) + + def onThemeDisplay(self, checked): + """ + Handle the Theme screen button + """ + log.debug(u'onThemeDisplay %s' % checked) + self.HideMenu.setDefaultAction(self.ThemeScreen) + self.BlankScreen.setChecked(False) + self.ThemeScreen.setChecked(checked) + if self.screens.display_count > 1: + self.DesktopScreen.setChecked(False) + if checked: + Receiver.send_message(u'maindisplay_hide', HideMode.Theme) + else: + Receiver.send_message(u'maindisplay_show') + self.blankPlugin(checked) + + def onHideDisplay(self, checked): + """ + Handle the Hide screen button + """ + log.debug(u'onHideDisplay %s' % checked) + self.HideMenu.setDefaultAction(self.DesktopScreen) + self.BlankScreen.setChecked(False) + self.ThemeScreen.setChecked(False) + if self.screens.display_count > 1: + self.DesktopScreen.setChecked(checked) + if checked: + Receiver.send_message(u'maindisplay_hide', HideMode.Screen) + else: + Receiver.send_message(u'maindisplay_show') + self.hidePlugin(checked) + + def blankPlugin(self, blank): + """ + Blank the display screen within a plugin if required. + """ + log.debug(u'blankPlugin %s ', blank) + if self.serviceItem is not None: + if blank: + Receiver.send_message(u'%s_blank' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + else: + Receiver.send_message(u'%s_unblank' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + + def hidePlugin(self, hide): + """ + Tell the plugin to hide the display screen. + """ + log.debug(u'hidePlugin %s ', hide) + if self.serviceItem is not None: + if hide: + Receiver.send_message(u'%s_hide' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + else: + Receiver.send_message(u'%s_unblank' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + + def onSlideSelected(self): + """ + Generate the preview when you click on a slide. + if this is the Live Controller also display on the screen + """ + row = self.PreviewListWidget.currentRow() + self.selectedRow = 0 + if row > -1 and row < self.PreviewListWidget.rowCount(): + Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive, row]) + if self.serviceItem.is_command() and self.isLive: + self.updatePreview() + else: + frame, raw_html = self.serviceItem.get_rendered_frame(row) + if self.serviceItem.is_text(): + frame = self.display.text(raw_html) + else: + self.display.image(frame) + if isinstance(frame, QtGui.QImage): + self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) + else: + self.SlidePreview.setPixmap(QtGui.QPixmap(frame)) + self.selectedRow = row + Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, + row) + + def onSlideChange(self, row): + """ + The slide has been changed. Update the slidecontroller accordingly + """ + self.PreviewListWidget.selectRow(row) + self.updatePreview() + Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, + row) + + def updatePreview(self): + if not self.screens.current[u'primary']: + # Grab now, but try again in a couple of seconds if slide change + # is slow + QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) + QtCore.QTimer.singleShot(2.5, self.grabMainDisplay) + else: + label = self.PreviewListWidget.cellWidget( + self.PreviewListWidget.currentRow(), 1) + if label: + self.SlidePreview.setPixmap(label.pixmap()) + + def grabMainDisplay(self): + winid = QtGui.QApplication.desktop().winId() + rect = self.screens.current[u'size'] + winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), + rect.y(), rect.width(), rect.height()) + self.SlidePreview.setPixmap(winimg) + + def onSlideSelectedNextNoloop(self): + self.onSlideSelectedNext(False) + + def onSlideSelectedNext(self, loop=True): + """ + Go to the next slide. + """ + if not self.serviceItem: + return + Receiver.send_message(u'%s_next' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + if self.serviceItem.is_command() and self.isLive: + self.updatePreview() + else: + row = self.PreviewListWidget.currentRow() + 1 + if row == self.PreviewListWidget.rowCount(): + if loop: + row = 0 + else: + Receiver.send_message('servicemanager_next_item') + return + self.PreviewListWidget.selectRow(row) + self.onSlideSelected() + + def onSlideSelectedPreviousNoloop(self): + self.onSlideSelectedPrevious(False) + + def onSlideSelectedPrevious(self, loop=True): + """ + Go to the previous slide. + """ + if not self.serviceItem: + return + Receiver.send_message(u'%s_previous' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + if self.serviceItem.is_command() and self.isLive: + self.updatePreview() + else: + row = self.PreviewListWidget.currentRow() - 1 + if row == -1: + if loop: + row = self.PreviewListWidget.rowCount() - 1 + else: + row = 0 + self.PreviewListWidget.selectRow(row) + self.onSlideSelected() + + def onSlideSelectedLast(self): + """ + Go to the last slide. + """ + if not self.serviceItem: + return + Receiver.send_message(u'%s_last' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + if self.serviceItem.is_command(): + self.updatePreview() + else: + self.PreviewListWidget.selectRow( + self.PreviewListWidget.rowCount() - 1) + self.onSlideSelected() + + def onStartLoop(self): + """ + Start the timer loop running and store the timer id + """ + if self.PreviewListWidget.rowCount() > 1: + self.timer_id = self.startTimer( + int(self.DelaySpinBox.value()) * 1000) + self.Toolbar.actions[u'Stop Loop'].setVisible(True) + self.Toolbar.actions[u'Start Loop'].setVisible(False) + + def onStopLoop(self): + """ + Stop the timer loop running + """ + if self.timer_id != 0: + self.killTimer(self.timer_id) + self.timer_id = 0 + self.Toolbar.actions[u'Start Loop'].setVisible(True) + self.Toolbar.actions[u'Stop Loop'].setVisible(False) + + def timerEvent(self, event): + """ + If the timer event is for this window select next slide + """ + if event.timerId() == self.timer_id: + self.onSlideSelectedNext() + + def onEditSong(self): + """ + From the preview display requires the service Item to be editied + """ + self.songEdit = True + Receiver.send_message(u'%s_edit' % self.serviceItem.name.lower(), + u'P:%s' % self.serviceItem.editId) + + def onGoLive(self): + """ + If preview copy slide item to live + """ + row = self.PreviewListWidget.currentRow() + if row > -1 and row < self.PreviewListWidget.rowCount(): + self.parent.LiveController.addServiceManagerItem( + self.serviceItem, row) + + def onMediaStart(self, item): + """ + Respond to the arrival of a media service item + """ + log.debug(u'SlideController onMediaStart') + if self.isLive: + file = os.path.join(item.get_frame_path(), item.get_frame_title()) + self.display.video(file, self.volume) + self.volumeSlider.setValue(self.volume) + else: + self.mediaObject.stop() + self.mediaObject.clearQueue() + file = os.path.join(item.get_frame_path(), item.get_frame_title()) + self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) + self.seekSlider.setMediaObject(self.mediaObject) + self.seekSlider.show() + self.onMediaPlay() + + def mediaVolume(self): + """ + Respond to the release of Volume Slider + """ + log.debug(u'SlideController mediaVolume') + self.volume = self.volumeSlider.value() + self.display.videoVolume(self.volume) + + def onMediaPause(self): + """ + Respond to the Pause from the media Toolbar + """ + log.debug(u'SlideController onMediaPause') + if self.isLive: + self.display.videoPause() + else: + self.mediaObject.pause() + + def onMediaPlay(self): + """ + Respond to the Play from the media Toolbar + """ + log.debug(u'SlideController onMediaPlay') + if self.isLive: + self.display.videoPlay() + else: + self.SlidePreview.hide() + self.video.show() + self.mediaObject.play() + + def onMediaStop(self): + """ + Respond to the Stop from the media Toolbar + """ + log.debug(u'SlideController onMediaStop') + if self.isLive: + self.display.videoStop() + else: + self.mediaObject.stop() + self.video.hide() + self.SlidePreview.clear() + self.SlidePreview.show() diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index e77b57430..e07329f87 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -1,132 +1,117 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import Plugin, build_icon, translate -from openlp.core.lib.db import Manager -from openlp.plugins.alerts.lib import AlertsManager, AlertsTab -from openlp.plugins.alerts.lib.db import init_schema -from openlp.plugins.alerts.forms import AlertForm - -log = logging.getLogger(__name__) - -class AlertsPlugin(Plugin): - log.info(u'Alerts Plugin loaded') - - def __init__(self, plugin_helpers): - self.set_plugin_translations() - Plugin.__init__(self, u'Alerts', u'1.9.2', plugin_helpers) - self.weight = -3 - self.icon = build_icon(u':/plugins/plugin_alerts.png') - self.alertsmanager = AlertsManager(self) - self.manager = Manager(u'alerts', init_schema) - self.alertForm = AlertForm(self) - - def getSettingsTab(self): - """ - Return the settings tab for the Alerts plugin - """ - self.alertsTab = AlertsTab(self) - return self.alertsTab - - def addToolsMenuItem(self, tools_menu): - """ - Give the alerts plugin the opportunity to add items to the - **Tools** menu. - - ``tools_menu`` - The actual **Tools** menu item, so that your actions can - use it as their parent. - """ - log.info(u'add tools menu') - self.toolsAlertItem = QtGui.QAction(tools_menu) - self.toolsAlertItem.setIcon(build_icon(u':/plugins/plugin_alerts.png')) - self.toolsAlertItem.setObjectName(u'toolsAlertItem') - self.toolsAlertItem.setText(translate('AlertsPlugin', '&Alert')) - self.toolsAlertItem.setStatusTip( - translate('AlertsPlugin', 'Show an alert message.')) - self.toolsAlertItem.setShortcut(u'F7') - self.serviceManager.parent.ToolsMenu.addAction(self.toolsAlertItem) - QtCore.QObject.connect(self.toolsAlertItem, - QtCore.SIGNAL(u'triggered()'), self.onAlertsTrigger) - self.toolsAlertItem.setVisible(False) - - def initialise(self): - log.info(u'Alerts Initialising') - Plugin.initialise(self) - self.toolsAlertItem.setVisible(True) - self.liveController.alertTab = self.alertsTab - - def finalise(self): - log.info(u'Alerts Finalising') - Plugin.finalise(self) - self.toolsAlertItem.setVisible(False) - - def toggleAlertsState(self): - self.alertsActive = not self.alertsActive - QtCore.QSettings().setValue(self.settingsSection + u'/active', - QtCore.QVariant(self.alertsActive)) - - def onAlertsTrigger(self): - self.alertForm.loadList() - self.alertForm.exec_() - - def about(self): - about_text = translate('AlertsPlugin', 'Alerts Plugin' - '
The alert plugin controls the displaying of nursery alerts ' - 'on the display screen') - return about_text - def set_plugin_translations(self): - """ - Called to define all translatable texts of the plugin - """ - self.name = u'Alerts' - self.name_lower = u'alerts' - self.text = {} - # for context menu -# elf.text['context_edit'] = translate('AlertsPlugin', '&Edit Song') -# elf.text['context_delete'] = translate('AlertsPlugin', '&Delete Song') -# elf.text['context_preview'] = translate('AlertsPlugin', '&Preview Song') -# elf.text['context_live'] = translate('AlertsPlugin', '&Show Live') -# # forHeaders in mediamanagerdock -# elf.text['import'] = translate('AlertsPlugin', 'Import a Song') -# elf.text['file'] = translate('AlertsPlugin', 'Load a new Song') -# elf.text['new'] = translate('AlertsPlugin', 'Add a new Song') -# elf.text['edit'] = translate('AlertsPlugin', 'Edit the selected Song') -# elf.text['delete'] = translate('AlertsPlugin', 'Delete the selected Song') -# elf.text['delete_more'] = translate('AlertsPlugin', 'Delete the selected Songs') -# elf.text['preview'] = translate('AlertsPlugin', 'Preview the selected Song') -# elf.text['preview_more'] = translate('AlertsPlugin', 'Preview the selected Songs') -# elf.text['live'] = translate('AlertsPlugin', 'Send the selected Song live') -# elf.text['live_more'] = translate('AlertsPlugin', 'Send the selected Songs live') -# elf.text['service'] = translate('AlertsPlugin', 'Add the selected Song to the service') -# elf.text['service_more'] = translate('AlertsPlugin', 'Add the selected Songs to the service') -# # for names in mediamanagerdock and pluginlist - self.text['name'] = translate('AlertsPlugin', 'Alert') - self.text['name_more'] = translate('AlertsPlugin', 'Alerts') +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import Plugin, StringType, build_icon, translate +from openlp.core.lib.db import Manager +from openlp.plugins.alerts.lib import AlertsManager, AlertsTab +from openlp.plugins.alerts.lib.db import init_schema +from openlp.plugins.alerts.forms import AlertForm + +log = logging.getLogger(__name__) + +class AlertsPlugin(Plugin): + log.info(u'Alerts Plugin loaded') + + def __init__(self, plugin_helpers): + self.set_plugin_strings() + Plugin.__init__(self, u'Alerts', u'1.9.2', plugin_helpers) + self.weight = -3 + self.icon = build_icon(u':/plugins/plugin_alerts.png') + self.alertsmanager = AlertsManager(self) + self.manager = Manager(u'alerts', init_schema) + self.alertForm = AlertForm(self) + + def getSettingsTab(self): + """ + Return the settings tab for the Alerts plugin + """ + self.alertsTab = AlertsTab(self) + return self.alertsTab + + def addToolsMenuItem(self, tools_menu): + """ + Give the alerts plugin the opportunity to add items to the + **Tools** menu. + + ``tools_menu`` + The actual **Tools** menu item, so that your actions can + use it as their parent. + """ + log.info(u'add tools menu') + self.toolsAlertItem = QtGui.QAction(tools_menu) + self.toolsAlertItem.setIcon(build_icon(u':/plugins/plugin_alerts.png')) + self.toolsAlertItem.setObjectName(u'toolsAlertItem') + self.toolsAlertItem.setText(translate('AlertsPlugin', '&Alert')) + self.toolsAlertItem.setStatusTip( + translate('AlertsPlugin', 'Show an alert message.')) + self.toolsAlertItem.setShortcut(u'F7') + self.serviceManager.parent.ToolsMenu.addAction(self.toolsAlertItem) + QtCore.QObject.connect(self.toolsAlertItem, + QtCore.SIGNAL(u'triggered()'), self.onAlertsTrigger) + self.toolsAlertItem.setVisible(False) + + def initialise(self): + log.info(u'Alerts Initialising') + Plugin.initialise(self) + self.toolsAlertItem.setVisible(True) + self.liveController.alertTab = self.alertsTab + + def finalise(self): + log.info(u'Alerts Finalising') + Plugin.finalise(self) + self.toolsAlertItem.setVisible(False) + + def toggleAlertsState(self): + self.alertsActive = not self.alertsActive + QtCore.QSettings().setValue(self.settingsSection + u'/active', + QtCore.QVariant(self.alertsActive)) + + def onAlertsTrigger(self): + self.alertForm.loadList() + self.alertForm.exec_() + + def about(self): + about_text = translate('AlertsPlugin', 'Alerts Plugin' + '
The alert plugin controls the displaying of nursery alerts ' + 'on the display screen') + return about_text + def set_plugin_strings(self): + """ + Called to define all translatable texts of the plugin + """ + self.name = u'Alerts' + self.name_lower = u'alerts' + + self.strings = {} + # for names in mediamanagerdock and pluginlist + self.strings[StringType.Name] = { + u'singular': translate('AlertsPlugin', 'Alert'), + u'plural': translate('AlertsPlugin', 'Alerts') + } diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 850516783..f706a50a3 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -1,147 +1,170 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import Plugin, build_icon, translate -from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem - -log = logging.getLogger(__name__) - -class BiblePlugin(Plugin): - log.info(u'Bible Plugin loaded') - - def __init__(self, plugin_helpers): - self.set_plugin_translations() - Plugin.__init__(self, u'Bibles', u'1.9.2', plugin_helpers) - self.weight = -9 - self.icon_path = u':/plugins/plugin_bibles.png' - self.icon = build_icon(self.icon_path) - self.manager = None - - def initialise(self): - log.info(u'bibles Initialising') - if self.manager is None: - self.manager = BibleManager(self) - Plugin.initialise(self) - self.importBibleItem.setVisible(True) - self.exportBibleItem.setVisible(True) - - def finalise(self): - log.info(u'Plugin Finalise') - Plugin.finalise(self) - self.importBibleItem.setVisible(False) - self.exportBibleItem.setVisible(False) - - def getSettingsTab(self): - return BiblesTab(self.name) - - def getMediaManagerItem(self): - # Create the BibleManagerItem object. - return BibleMediaItem(self, self.icon, self.name) - - def addImportMenuItem(self, import_menu): - self.importBibleItem = QtGui.QAction(import_menu) - self.importBibleItem.setObjectName(u'importBibleItem') - import_menu.addAction(self.importBibleItem) - self.importBibleItem.setText( - translate('BiblesPlugin', '&Bible')) - # signals and slots - QtCore.QObject.connect(self.importBibleItem, - QtCore.SIGNAL(u'triggered()'), self.onBibleImportClick) - self.importBibleItem.setVisible(False) - - def addExportMenuItem(self, export_menu): - self.exportBibleItem = QtGui.QAction(export_menu) - self.exportBibleItem.setObjectName(u'exportBibleItem') - export_menu.addAction(self.exportBibleItem) - self.exportBibleItem.setText(translate( - 'BiblesPlugin', '&Bible')) - self.exportBibleItem.setVisible(False) - - def onBibleImportClick(self): - if self.mediaItem: - self.mediaItem.onImportClick() - - def about(self): - about_text = translate('BiblesPlugin', 'Bible Plugin' - '
The Bible plugin provides the ability to display bible ' - 'verses from different sources during the service.') - return about_text - - 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. - """ - if self.settings_tab.bible_theme == theme: - return True - return False - - def renameTheme(self, oldTheme, newTheme): - """ - Rename the theme the bible plugin is using making the plugin use the - new name. - - ``oldTheme`` - The name of the theme the plugin should stop using. Unused for - this particular plugin. - - ``newTheme`` - The new name the plugin should now use. - """ - self.settings_tab.bible_theme = newTheme - def set_plugin_translations(self): - """ - Called to define all translatable texts of the plugin - """ - self.name = u'Bibles' - self.name_lower = u'bibles' - self.text = {} - #for context menu - self.text['context_edit'] = translate('BiblesPlugin', '&Edit Bible') - self.text['context_delete'] = translate('BiblesPlugin', '&Delete Bible') - self.text['context_preview'] = translate('BiblesPlugin', '&Preview Bible') - self.text['context_live'] = translate('BiblesPlugin', '&Show Live') - # forHeaders in mediamanagerdock - self.text['import'] = translate('BiblesPlugin', 'Import a Bible') - self.text['load'] = translate('BiblesPlugin', 'Load a new Bible') - self.text['new'] = translate('BiblesPlugin', 'Add a new Bible') - self.text['edit'] = translate('BiblesPlugin', 'Edit the selected Bible') - self.text['delete'] = translate('BiblesPlugin', 'Delete the selected Bible') - self.text['delete_more'] = translate('BiblesPlugin', 'Delete the selected Bibles') - self.text['preview'] = translate('BiblesPlugin', 'Preview the selected Bible') - self.text['preview_more'] = translate('BiblesPlugin', 'Preview the selected Bibles') - self.text['live'] = translate('BiblesPlugin', 'Send the selected Bible live') - self.text['live_more'] = translate('BiblesPlugin', 'Send the selected Bibles live') - self.text['service'] = translate('BiblesPlugin', 'Add the selected Verse to the service') - self.text['service_more'] = translate('BiblesPlugin', 'Add the selected Verses to the service') - # for names in mediamanagerdock and pluginlist - self.text['name'] = translate('BiblesPlugin', 'Bible') - self.text['name_more'] = translate('BiblesPlugin', 'Bibles') +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import Plugin, StringType, build_icon, translate +from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem + +log = logging.getLogger(__name__) + +class BiblePlugin(Plugin): + log.info(u'Bible Plugin loaded') + + def __init__(self, plugin_helpers): + self.set_plugin_strings() + Plugin.__init__(self, u'Bibles', u'1.9.2', plugin_helpers) + self.weight = -9 + self.icon_path = u':/plugins/plugin_bibles.png' + self.icon = build_icon(self.icon_path) + self.manager = None + + def initialise(self): + log.info(u'bibles Initialising') + if self.manager is None: + self.manager = BibleManager(self) + Plugin.initialise(self) + self.importBibleItem.setVisible(True) + self.exportBibleItem.setVisible(True) + + def finalise(self): + log.info(u'Plugin Finalise') + Plugin.finalise(self) + self.importBibleItem.setVisible(False) + self.exportBibleItem.setVisible(False) + + def getSettingsTab(self): + return BiblesTab(self.name) + + def getMediaManagerItem(self): + # Create the BibleManagerItem object. + return BibleMediaItem(self, self.icon, self.name) + + def addImportMenuItem(self, import_menu): + self.importBibleItem = QtGui.QAction(import_menu) + self.importBibleItem.setObjectName(u'importBibleItem') + import_menu.addAction(self.importBibleItem) + self.importBibleItem.setText( + translate('BiblesPlugin', '&Bible')) + # signals and slots + QtCore.QObject.connect(self.importBibleItem, + QtCore.SIGNAL(u'triggered()'), self.onBibleImportClick) + self.importBibleItem.setVisible(False) + + def addExportMenuItem(self, export_menu): + self.exportBibleItem = QtGui.QAction(export_menu) + self.exportBibleItem.setObjectName(u'exportBibleItem') + export_menu.addAction(self.exportBibleItem) + self.exportBibleItem.setText(translate( + 'BiblesPlugin', '&Bible')) + self.exportBibleItem.setVisible(False) + + def onBibleImportClick(self): + if self.mediaItem: + self.mediaItem.onImportClick() + + def about(self): + about_text = translate('BiblesPlugin', 'Bible Plugin' + '
The Bible plugin provides the ability to display bible ' + 'verses from different sources during the service.') + return about_text + + 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. + """ + if self.settings_tab.bible_theme == theme: + return True + return False + + def renameTheme(self, oldTheme, newTheme): + """ + Rename the theme the bible plugin is using making the plugin use the + new name. + + ``oldTheme`` + The name of the theme the plugin should stop using. Unused for + this particular plugin. + + ``newTheme`` + The new name the plugin should now use. + """ + self.settings_tab.bible_theme = newTheme + + def set_plugin_strings(self): + """ + Called to define all translatable texts of the plugin + """ + self.name = u'Bibles' + self.name_lower = u'Bibles' + + self.strings = {} + # for names in mediamanagerdock and pluginlist + self.strings[StringType.Name] = { + u'singular': translate('BiblesPlugin', 'Bible'), + u'plural': translate('BiblesPlugin', 'Bibles') + } + + # Middle Header Bar + ## Import Button ## + self.strings[StringType.Import] = { + u'title': translate('BiblesPlugin', 'Import'), + u'tooltip': translate('BiblesPlugin', 'Import a Bible') + } + ## New Button ## + self.strings[StringType.New] = { + u'title': translate('BiblesPlugin', 'Add'), + u'tooltip': translate('BiblesPlugin', 'Add a new Bible') + } + ## Edit Button ## + self.strings[StringType.Edit] = { + u'title': translate('BiblesPlugin', 'Edit'), + u'tooltip': translate('BiblesPlugin', 'Edit the selected Bible') + } + ## Delete Button ## + self.strings[StringType.Delete] = { + u'title': translate('BiblesPlugin', 'Delete'), + u'tooltip': translate('BiblesPlugin', 'Delete the selected Bible') + } + ## Preview ## + self.strings[StringType.Preview] = { + u'title': translate('BiblesPlugin', 'Preview'), + u'tooltip': translate('BiblesPlugin', 'Preview the selected Bible') + } + ## Live Button ## + self.strings[StringType.Live] = { + u'title': translate('BiblesPlugin', 'Live'), + u'tooltip': translate('BiblesPlugin', 'Send the selected Bible live') + } + ## Add to service Button ## + self.strings[StringType.Service] = { + u'title': translate('BiblesPlugin', 'Service'), + u'tooltip': translate('BiblesPlugin', 'Add the selected Bible to the service') + } diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index 007b8d560..e387369ee 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -1,127 +1,154 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging - -from forms import EditCustomForm - -from openlp.core.lib import Plugin, build_icon, translate -from openlp.core.lib.db import Manager -from openlp.plugins.custom.lib import CustomMediaItem, CustomTab -from openlp.plugins.custom.lib.db import CustomSlide, init_schema - -log = logging.getLogger(__name__) - -class CustomPlugin(Plugin): - """ - This plugin enables the user to create, edit and display - custom slide shows. Custom shows are divided into slides. - Each show is able to have it's own theme. - Custom shows are designed to replace the use of songs where - the songs plugin has become restrictive. Examples could be - Welcome slides, Bible Reading information, Orders of service. - """ - log.info(u'Custom Plugin loaded') - - def __init__(self, plugin_helpers): - self.set_plugin_translations() - Plugin.__init__(self, u'Custom', u'1.9.2', plugin_helpers) - self.weight = -5 - self.custommanager = Manager(u'custom', init_schema) - self.edit_custom_form = EditCustomForm(self.custommanager) - self.icon_path = u':/plugins/plugin_custom.png' - self.icon = build_icon(self.icon_path) - - def getSettingsTab(self): - return CustomTab(self.name) - - def getMediaManagerItem(self): - # Create the CustomManagerItem object - return CustomMediaItem(self, self.icon, self.name) - - def about(self): - about_text = translate('CustomPlugin', 'Custom Plugin' - '
The custom plugin provides the ability to set up custom ' - 'text slides that can be displayed on the screen the same way ' - 'songs are. This plugin provides greater freedom over the songs ' - 'plugin.') - return about_text - - def usesTheme(self, theme): - """ - Called to find out if the custom plugin is currently using a theme. - - Returns True if the theme is being used, otherwise returns False. - """ - if self.custommanager.get_all_objects(CustomSlide, - CustomSlide.theme_name == theme): - return True - return False - - def renameTheme(self, oldTheme, newTheme): - """ - Renames a theme the custom plugin is using making the plugin use the - new name. - - ``oldTheme`` - The name of the theme the plugin should stop using. - - ``newTheme`` - The new name the plugin should now use. - """ - customsUsingTheme = self.custommanager.get_all_objects(CustomSlide, - CustomSlide.theme_name == oldTheme) - for custom in customsUsingTheme: - custom.theme_name = newTheme - self.custommanager.save_object(custom) - def set_plugin_translations(self): - """ - Called to define all translatable texts of the plugin - """ - self.name = u'Custom' - self.name_lower = u'custom' - self.text = {} - #for context menu - self.text['context_edit'] = translate('CustomsPlugin', '&Edit Custom') - self.text['context_delete'] = translate('CustomsPlugin', '&Delete Custom') - self.text['context_preview'] = translate('CustomsPlugin', '&Preview Custom') - self.text['context_live'] = translate('CustomsPlugin', '&Show Live') - # forHeaders in mediamanagerdock - self.text['import'] = translate('CustomsPlugin', 'Import a Custom') - self.text['load'] = translate('CustomsPlugin', 'Load a new Custom') - self.text['new'] = translate('CustomsPlugin', 'Add a new Custom') - self.text['edit'] = translate('CustomsPlugin', 'Edit the selected Custom') - self.text['delete'] = translate('CustomsPlugin', 'Delete the selected Custom') - self.text['delete_more'] = translate('CustomsPlugin', 'Delete the selected Custom') - self.text['preview'] = translate('CustomsPlugin', 'Preview the selected Custom') - self.text['preview_more'] = translate('CustomsPlugin', 'Preview the selected Custom') - self.text['live'] = translate('CustomsPlugin', 'Send the selected Custom live') - self.text['live_more'] = translate('CustomsPlugin', 'Send the selected Custom live') - self.text['service'] = translate('CustomsPlugin', 'Add the selected Custom to the service') - self.text['service_more'] = translate('CustomsPlugin', 'Add the selected Custom to the service') - # for names in mediamanagerdock and pluginlist - self.text['name'] = translate('CustomsPlugin', 'Custom') - self.text['name_more'] = translate('CustomsPlugin', 'Custom') +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging + +from forms import EditCustomForm + +from openlp.core.lib import Plugin, StringType, build_icon, translate +from openlp.core.lib.db import Manager +from openlp.plugins.custom.lib import CustomMediaItem, CustomTab +from openlp.plugins.custom.lib.db import CustomSlide, init_schema + +log = logging.getLogger(__name__) + +class CustomPlugin(Plugin): + """ + This plugin enables the user to create, edit and display + custom slide shows. Custom shows are divided into slides. + Each show is able to have it's own theme. + Custom shows are designed to replace the use of Customs where + the Customs plugin has become restrictive. Examples could be + Welcome slides, Bible Reading information, Orders of service. + """ + log.info(u'Custom Plugin loaded') + + def __init__(self, plugin_helpers): + self.set_plugin_strings() + Plugin.__init__(self, u'Custom', u'1.9.2', plugin_helpers) + self.weight = -5 + self.custommanager = Manager(u'custom', init_schema) + self.edit_custom_form = EditCustomForm(self.custommanager) + self.icon_path = u':/plugins/plugin_custom.png' + self.icon = build_icon(self.icon_path) + + def getSettingsTab(self): + return CustomTab(self.name) + + def getMediaManagerItem(self): + # Create the CustomManagerItem object + return CustomMediaItem(self, self.icon, self.name) + + def about(self): + about_text = translate('CustomPlugin', 'Custom Plugin' + '
The custom plugin provides the ability to set up custom ' + 'text slides that can be displayed on the screen the same way ' + 'Customs are. This plugin provides greater freedom over the Customs ' + 'plugin.') + return about_text + + def usesTheme(self, theme): + """ + Called to find out if the custom plugin is currently using a theme. + + Returns True if the theme is being used, otherwise returns False. + """ + if self.custommanager.get_all_objects(CustomSlide, + CustomSlide.theme_name == theme): + return True + return False + + def renameTheme(self, oldTheme, newTheme): + """ + Renames a theme the custom plugin is using making the plugin use the + new name. + + ``oldTheme`` + The name of the theme the plugin should stop using. + + ``newTheme`` + The new name the plugin should now use. + """ + customsUsingTheme = self.custommanager.get_all_objects(CustomSlide, + CustomSlide.theme_name == oldTheme) + for custom in customsUsingTheme: + custom.theme_name = newTheme + self.custommanager.save_object(custom) + def set_plugin_strings(self): + """ + Called to define all translatable texts of the plugin + """ + self.name = u'Custom' + self.name_lower = u'custom' + + self.strings = {} + # for names in mediamanagerdock and pluginlist + self.strings[StringType.Name] = { + u'singular': translate('CustomsPlugin', 'Custom'), + u'plural': translate('CustomsPlugin', 'Customs') + } + + # Middle Header Bar + ## Import Button ## + self.strings[StringType.Import] = { + u'title': translate('CustomsPlugin', 'Import'), + u'tooltip': translate('CustomsPlugin', 'Import a Custom') + } + ## Load Button ## + self.strings[StringType.Load] = { + u'title': translate('CustomsPlugin', 'Load'), + u'tooltip': translate('CustomsPlugin', 'Load a new Custom') + } + ## New Button ## + self.strings[StringType.New] = { + u'title': translate('CustomsPlugin', 'Add'), + u'tooltip': translate('CustomsPlugin', 'Add a new Custom') + } + ## Edit Button ## + self.strings[StringType.Edit] = { + u'title': translate('CustomsPlugin', 'Edit'), + u'tooltip': translate('CustomsPlugin', 'Edit the selected Custom') + } + ## Delete Button ## + self.strings[StringType.Delete] = { + u'title': translate('CustomsPlugin', 'Delete'), + u'tooltip': translate('CustomsPlugin', 'Delete the selected Custom') + } + ## Preview ## + self.strings[StringType.Preview] = { + u'title': translate('CustomsPlugin', 'Preview'), + u'tooltip': translate('CustomsPlugin', 'Preview the selected Custom') + } + ## Live Button ## + self.strings[StringType.Live] = { + u'title': translate('CustomsPlugin', 'Live'), + u'tooltip': translate('CustomsPlugin', 'Send the selected Custom live') + } + ## Add to service Button ## + self.strings[StringType.Service] = { + u'title': translate('CustomsPlugin', 'Service'), + u'tooltip': translate('CustomsPlugin', 'Add the selected Custom to the service') + } diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index ee303689e..0f2f08e26 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -1,89 +1,111 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging - -from openlp.core.lib import Plugin, build_icon, translate -from openlp.plugins.images.lib import ImageMediaItem - -log = logging.getLogger(__name__) - -class ImagePlugin(Plugin): - log.info(u'Image Plugin loaded') - - def __init__(self, plugin_helpers): - self.set_plugin_translations() - Plugin.__init__(self, u'Images', u'1.9.2', plugin_helpers) - self.weight = -7 - self.icon_path = u':/plugins/plugin_images.png' - self.icon = build_icon(self.icon_path) - - def getMediaManagerItem(self): - # Create the MediaManagerItem object - return ImageMediaItem(self, self.icon, self.name) - - def about(self): - about_text = translate('ImagePlugin', 'Image Plugin' - '
The image plugin provides displaying of images.
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.') - return about_text - # rimach - def set_plugin_translations(self): - """ - Called to define all translatable texts of the plugin - """ - self.name = u'Images' - self.name_lower = u'images' - self.text = {} - #for context menu - self.text['context_edit'] = translate('ImagePlugin', '&Edit Image') - self.text['context_delete'] = translate('ImagePlugin', '&Delete Image') - self.text['context_preview'] = translate('ImagePlugin', '&Preview Image') - self.text['context_live'] = translate('ImagePlugin', '&Show Live') - # forHeaders in mediamanagerdock - self.text['import'] = translate('ImagePlugin', 'Import a Image') - self.text['load'] = translate('ImagePlugin', 'Load a new Image') - self.text['new'] = translate('ImagePlugin', 'Add a new Image') - self.text['edit'] = translate('ImagePlugin', 'Edit the selected Image') - self.text['delete'] = translate('ImagePlugin', 'Delete the selected Image') - self.text['delete_more'] = translate('ImagePlugin', 'Delete the selected Images') - self.text['preview'] = translate('ImagePlugin', 'Preview the selected Image') - self.text['preview_more'] = translate('ImagePlugin', 'Preview the selected Images') - self.text['live'] = translate('ImagePlugin', 'Send the selected Image live') - self.text['live_more'] = translate('ImagePlugin', 'Send the selected Images live') - self.text['service'] = translate('ImagePlugin', 'Add the selected Image to the service') - self.text['service_more'] = translate('ImagePlugin', 'Add the selected Images to the service') - # for names in mediamanagerdock and pluginlist - self.text['name'] = translate('ImagePlugin', 'Image') - self.text['name_more'] = translate('ImagePlugin', 'Images') +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging + +from openlp.core.lib import Plugin, StringType, build_icon, translate +from openlp.plugins.images.lib import ImageMediaItem + +log = logging.getLogger(__name__) + +class ImagePlugin(Plugin): + log.info(u'Image Plugin loaded') + + def __init__(self, plugin_helpers): + self.set_plugin_strings() + Plugin.__init__(self, u'Images', u'1.9.2', plugin_helpers) + self.weight = -7 + self.icon_path = u':/plugins/plugin_images.png' + self.icon = build_icon(self.icon_path) + + def getMediaManagerItem(self): + # Create the MediaManagerItem object + return ImageMediaItem(self, self.icon, self.name) + + def about(self): + about_text = translate('ImagePlugin', 'Image Plugin' + '
The image plugin provides displaying of images.
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 Images with the ' + 'selected image as a background instead of the background ' + 'provided by the theme.') + return about_text + # rimach + def set_plugin_strings(self): + """ + Called to define all translatable texts of the plugin + """ + self.name = u'Images' + self.name_lower = u'images' + + self.strings = {} + # for names in mediamanagerdock and pluginlist + self.strings[StringType.Name] = { + u'singular': translate('ImagePlugin', 'Image'), + u'plural': translate('ImagePlugin', 'Images') + } + + # Middle Header Bar + ## Load Button ## + self.strings[StringType.Load] = { + u'title': translate('ImagePlugin', 'Load'), + u'tooltip': translate('ImagePlugin', 'Load a new Image') + } + ## New Button ## + self.strings[StringType.New] = { + u'title': translate('ImagePlugin', 'Add'), + u'tooltip': translate('ImagePlugin', 'Add a new Image') + } + ## Edit Button ## + self.strings[StringType.Edit] = { + u'title': translate('ImagePlugin', 'Edit'), + u'tooltip': translate('ImagePlugin', 'Edit the selected Image') + } + ## Delete Button ## + self.strings[StringType.Delete] = { + u'title': translate('ImagePlugin', 'Delete'), + u'tooltip': translate('ImagePlugin', 'Delete the selected Image') + } + ## Preview ## + self.strings[StringType.Preview] = { + u'title': translate('ImagePlugin', 'Preview'), + u'tooltip': translate('ImagePlugin', 'Preview the selected Image') + } + ## Live Button ## + self.strings[StringType.Live] = { + u'title': translate('ImagePlugin', 'Live'), + u'tooltip': translate('ImagePlugin', 'Send the selected Image live') + } + ## Add to service Button ## + self.strings[StringType.Service] = { + u'title': translate('ImagePlugin', 'Service'), + u'tooltip': translate('ImagePlugin', 'Add the selected Image to the service') + } diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 7ff32b5b3..0ffa8cfbd 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -1,107 +1,129 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging - -from PyQt4.phonon import Phonon - -from openlp.core.lib import Plugin, build_icon, translate -from openlp.plugins.media.lib import MediaMediaItem - -log = logging.getLogger(__name__) - -class MediaPlugin(Plugin): - log.info(u'%s MediaPlugin loaded', __name__) - - def __init__(self, plugin_helpers): - self.set_plugin_translations() - Plugin.__init__(self, u'Media', u'1.9.2', plugin_helpers) - self.weight = -6 - self.icon_path = u':/plugins/plugin_media.png' - self.icon = build_icon(self.icon_path) - # passed with drag and drop messages - self.dnd_id = u'Media' - self.audio_list = u'' - self.video_list = u'' - for mimetype in Phonon.BackendCapabilities.availableMimeTypes(): - mimetype = unicode(mimetype) - type = mimetype.split(u'audio/x-') - self.audio_list, mimetype = self._addToList(self.audio_list, - type, mimetype) - type = mimetype.split(u'audio/') - self.audio_list, mimetype = self._addToList(self.audio_list, - type, mimetype) - type = mimetype.split(u'video/x-') - self.video_list, mimetype = self._addToList(self.video_list, - type, mimetype) - type = mimetype.split(u'video/') - self.video_list, mimetype = self._addToList(self.video_list, - type, mimetype) - - def _addToList(self, list, value, type): - if len(value) == 2: - if list.find(value[1]) == -1: - list += u'*.%s ' % value[1] - self.serviceManager.supportedSuffixes(value[1]) - type = u'' - return list, type - - def getMediaManagerItem(self): - # Create the MediaManagerItem object - return MediaMediaItem(self, self.icon, self.name) - - def about(self): - about_text = translate('MediaPlugin', 'Media Plugin' - '
The media plugin provides playback of audio and video.') - return about_text - def set_plugin_translations(self): - """ - Called to define all translatable texts of the plugin - """ - self.name = u'Media' - self.name_lower = u'media' - self.text = {} - #for context menu - self.text['context_edit'] = translate('MediaPlugin', '&Edit Media') - self.text['context_delete'] = translate('MediaPlugin', '&Delete Media') - self.text['context_preview'] = translate('MediaPlugin', '&Preview Media') - self.text['context_live'] = translate('MediaPlugin', '&Show Live') - # forHeaders in mediamanagerdock - self.text['import'] = translate('MediaPlugin', 'Import a Media') - self.text['load'] = translate('MediaPlugin', 'Load a new Media') - self.text['new'] = translate('MediaPlugin', 'Add a new Media') - self.text['edit'] = translate('MediaPlugin', 'Edit the selected Media') - self.text['delete'] = translate('MediaPlugin', 'Delete the selected Media') - self.text['delete_more'] = translate('MediaPlugin', 'Delete the selected Media') - self.text['preview'] = translate('MediaPlugin', 'Preview the selected Media') - self.text['preview_more'] = translate('MediaPlugin', 'Preview the selected Media') - self.text['live'] = translate('MediaPlugin', 'Send the selected Media live') - self.text['live_more'] = translate('MediaPlugin', 'Send the selected Media live') - self.text['service'] = translate('MediaPlugin', 'Add the selected Media to the service') - self.text['service_more'] = translate('MediaPlugin', 'Add the selected Media to the service') - # for names in mediamanagerdock and pluginlist - self.text['name'] = translate('MediaPlugin', 'Media') - self.text['name_more'] = translate('MediaPlugin', 'Media') +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging + +from PyQt4.phonon import Phonon + +from openlp.core.lib import Plugin, StringType, build_icon, translate +from openlp.plugins.media.lib import MediaMediaItem + +log = logging.getLogger(__name__) + +class MediaPlugin(Plugin): + log.info(u'%s MediaPlugin loaded', __name__) + + def __init__(self, plugin_helpers): + self.set_plugin_strings() + Plugin.__init__(self, u'Media', u'1.9.2', plugin_helpers) + self.weight = -6 + self.icon_path = u':/plugins/plugin_media.png' + self.icon = build_icon(self.icon_path) + # passed with drag and drop messages + self.dnd_id = u'Media' + self.audio_list = u'' + self.video_list = u'' + for mimetype in Phonon.BackendCapabilities.availableMimeTypes(): + mimetype = unicode(mimetype) + type = mimetype.split(u'audio/x-') + self.audio_list, mimetype = self._addToList(self.audio_list, + type, mimetype) + type = mimetype.split(u'audio/') + self.audio_list, mimetype = self._addToList(self.audio_list, + type, mimetype) + type = mimetype.split(u'video/x-') + self.video_list, mimetype = self._addToList(self.video_list, + type, mimetype) + type = mimetype.split(u'video/') + self.video_list, mimetype = self._addToList(self.video_list, + type, mimetype) + + def _addToList(self, list, value, type): + if len(value) == 2: + if list.find(value[1]) == -1: + list += u'*.%s ' % value[1] + self.serviceManager.supportedSuffixes(value[1]) + type = u'' + return list, type + + def getMediaManagerItem(self): + # Create the MediaManagerItem object + return MediaMediaItem(self, self.icon, self.name) + + def about(self): + about_text = translate('MediaPlugin', 'Media Plugin' + '
The media plugin provides playback of audio and video.') + return about_text + def set_plugin_strings(self): + """ + Called to define all translatable texts of the plugin + """ + self.name = u'Media' + self.name_lower = u'media' + + self.strings = {} + # for names in mediamanagerdock and pluginlist + self.strings[StringType.Name] = { + u'singular': translate('MediaPlugin', 'Media'), + u'plural': translate('MediaPlugin', 'Medias') + } + + # Middle Header Bar + ## Load Button ## + self.strings[StringType.Load] = { + u'title': translate('MediaPlugin', 'Load'), + u'tooltip': translate('MediaPlugin', 'Load a new Media') + } + ## New Button ## + self.strings[StringType.New] = { + u'title': translate('MediaPlugin', 'Add'), + u'tooltip': translate('MediaPlugin', 'Add a new Media') + } + ## Edit Button ## + self.strings[StringType.Edit] = { + u'title': translate('MediaPlugin', 'Edit'), + u'tooltip': translate('MediaPlugin', 'Edit the selected Media') + } + ## Delete Button ## + self.strings[StringType.Delete] = { + u'title': translate('MediaPlugin', 'Delete'), + u'tooltip': translate('MediaPlugin', 'Delete the selected Media') + } + ## Preview ## + self.strings[StringType.Preview] = { + u'title': translate('MediaPlugin', 'Preview'), + u'tooltip': translate('MediaPlugin', 'Preview the selected Media') + } + ## Live Button ## + self.strings[StringType.Live] = { + u'title': translate('MediaPlugin', 'Live'), + u'tooltip': translate('MediaPlugin', 'Send the selected Media live') + } + ## Add to service Button ## + self.strings[StringType.Service] = { + u'title': translate('MediaPlugin', 'Service'), + u'tooltip': translate('MediaPlugin', 'Add the selected Media to the service') + } diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 208c74349..e3df350d8 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -1,174 +1,187 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### -""" -The :mod:`presentationplugin` module provides the ability for OpenLP to display -presentations from a variety of document formats. -""" -import os -import logging - -from openlp.core.lib import Plugin, build_icon, translate -from openlp.core.utils import AppLocation -from openlp.plugins.presentations.lib import PresentationController, \ - PresentationMediaItem, PresentationTab - -log = logging.getLogger(__name__) - -class PresentationPlugin(Plugin): - """ - This plugin allowed a Presentation to be opened, controlled and displayed - on the output display. The plugin controls third party applications such - as OpenOffice.org Impress, Microsoft PowerPoint and the PowerPoint viewer - """ - log = logging.getLogger(u'PresentationPlugin') - - def __init__(self, plugin_helpers): - """ - PluginPresentation constructor. - """ - log.debug(u'Initialised') - self.controllers = {} - self.set_plugin_translations() - Plugin.__init__(self, u'Presentations', u'1.9.2', plugin_helpers) - self.weight = -8 - self.icon_path = u':/plugins/plugin_presentations.png' - self.icon = build_icon(self.icon_path) - - def getSettingsTab(self): - """ - Create the settings Tab - """ - return PresentationTab(self.name, self.controllers) - - def initialise(self): - """ - Initialise the plugin. Determine which controllers are enabled - are start their processes. - """ - log.info(u'Presentations Initialising') - Plugin.initialise(self) - self.insertToolboxItem() - for controller in self.controllers: - if self.controllers[controller].enabled(): - self.controllers[controller].start_process() - self.mediaItem.buildFileMaskString() - - def finalise(self): - """ - Finalise the plugin. Ask all the enabled presentation applications - to close down their applications and release resources. - """ - log.info(u'Plugin Finalise') - #Ask each controller to tidy up - for key in self.controllers: - controller = self.controllers[key] - if controller.enabled(): - controller.kill() - Plugin.finalise(self) - - def getMediaManagerItem(self): - """ - Create the Media Manager List - """ - return PresentationMediaItem( - self, self.icon, self.name, self.controllers) - - def registerControllers(self, controller): - """ - Register each presentation controller (Impress, PPT etc) and - store for later use - """ - self.controllers[controller.name] = controller - - def checkPreConditions(self): - """ - Check to see if we have any presentation software available - If Not do not install the plugin. - """ - log.debug(u'checkPreConditions') - controller_dir = os.path.join( - AppLocation.get_directory(AppLocation.PluginsDir), - u'presentations', u'lib') - for filename in os.listdir(controller_dir): - if filename.endswith(u'controller.py') and \ - not filename == 'presentationcontroller.py': - path = os.path.join(controller_dir, filename) - if os.path.isfile(path): - modulename = u'openlp.plugins.presentations.lib.' + \ - os.path.splitext(filename)[0] - log.debug(u'Importing controller %s', modulename) - try: - __import__(modulename, globals(), locals(), []) - except ImportError: - log.exception(u'Failed to import %s on path %s', - modulename, path) - controller_classes = PresentationController.__subclasses__() - for controller_class in controller_classes: - controller = controller_class(self) - self.registerControllers(controller) - if self.controllers: - return True - else: - return False - - def about(self): - """ - Return information about this plugin - """ - about_text = translate('PresentationPlugin', 'Presentation ' - 'Plugin
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.') - return about_text - def set_plugin_translations(self): - """ - Called to define all translatable texts of the plugin - """ - self.name = u'Presentations' - self.name_lower = u'presentations' - self.text = {} - #for context menu - self.text['context_edit'] = translate('PresentationPlugin', '&Edit Presentation') - self.text['context_delete'] = translate('PresentationPlugin', '&Delete Presentation') - self.text['context_preview'] = translate('PresentationPlugin', '&Preview Presentation') - self.text['context_live'] = translate('PresentationPlugin', '&Show Live') - # forHeaders in mediamanagerdock - self.text['import'] = translate('PresentationPlugin', 'Import a Presentation') - self.text['load'] = translate('PresentationPlugin', 'Load a new Presentation') - self.text['new'] = translate('PresentationPlugin', 'Add a new Presentation') - self.text['edit'] = translate('PresentationPlugin', 'Edit the selected Presentation') - self.text['delete'] = translate('PresentationPlugin', 'Delete the selected Presentation') - self.text['delete_more'] = translate('PresentationPlugin', 'Delete the selected Presentations') - self.text['preview'] = translate('PresentationPlugin', 'Preview the selected Presentation') - self.text['preview_more'] = translate('PresentationPlugin', 'Preview the selected Presentations') - self.text['live'] = translate('PresentationPlugin', 'Send the selected Presentation live') - self.text['live_more'] = translate('PresentationPlugin', 'Send the selected Presentations live') - self.text['service'] = translate('PresentationPlugin', 'Add the selected Presentation to the service') - self.text['service_more'] = translate('PresentationPlugin', 'Add the selected Presentations to the service') - # for names in mediamanagerdock and pluginlist - self.text['name'] = translate('PresentationPlugin', 'Presentation') - self.text['name_more'] = translate('PresentationPlugin', 'Presentations') +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### +""" +The :mod:`presentationplugin` module provides the ability for OpenLP to display +presentations from a variety of document formats. +""" +import os +import logging + +from openlp.core.lib import Plugin, StringType, build_icon, translate +from openlp.core.utils import AppLocation +from openlp.plugins.presentations.lib import PresentationController, \ + PresentationMediaItem, PresentationTab + +log = logging.getLogger(__name__) + +class PresentationPlugin(Plugin): + """ + This plugin allowed a Presentation to be opened, controlled and displayed + on the output display. The plugin controls third party applications such + as OpenOffice.org Impress, Microsoft PowerPoint and the PowerPoint viewer + """ + log = logging.getLogger(u'PresentationPlugin') + + def __init__(self, plugin_helpers): + """ + PluginPresentation constructor. + """ + log.debug(u'Initialised') + self.controllers = {} + self.set_plugin_strings() + Plugin.__init__(self, u'Presentations', u'1.9.2', plugin_helpers) + self.weight = -8 + self.icon_path = u':/plugins/plugin_presentations.png' + self.icon = build_icon(self.icon_path) + + def getSettingsTab(self): + """ + Create the settings Tab + """ + return PresentationTab(self.name, self.controllers) + + def initialise(self): + """ + Initialise the plugin. Determine which controllers are enabled + are start their processes. + """ + log.info(u'Presentations Initialising') + Plugin.initialise(self) + self.insertToolboxItem() + for controller in self.controllers: + if self.controllers[controller].enabled(): + self.controllers[controller].start_process() + self.mediaItem.buildFileMaskString() + + def finalise(self): + """ + Finalise the plugin. Ask all the enabled presentation applications + to close down their applications and release resources. + """ + log.info(u'Plugin Finalise') + #Ask each controller to tidy up + for key in self.controllers: + controller = self.controllers[key] + if controller.enabled(): + controller.kill() + Plugin.finalise(self) + + def getMediaManagerItem(self): + """ + Create the Media Manager List + """ + return PresentationMediaItem( + self, self.icon, self.name, self.controllers) + + def registerControllers(self, controller): + """ + Register each presentation controller (Impress, PPT etc) and + store for later use + """ + self.controllers[controller.name] = controller + + def checkPreConditions(self): + """ + Check to see if we have any presentation software available + If Not do not install the plugin. + """ + log.debug(u'checkPreConditions') + controller_dir = os.path.join( + AppLocation.get_directory(AppLocation.PluginsDir), + u'presentations', u'lib') + for filename in os.listdir(controller_dir): + if filename.endswith(u'controller.py') and \ + not filename == 'presentationcontroller.py': + path = os.path.join(controller_dir, filename) + if os.path.isfile(path): + modulename = u'openlp.plugins.presentations.lib.' + \ + os.path.splitext(filename)[0] + log.debug(u'Importing controller %s', modulename) + try: + __import__(modulename, globals(), locals(), []) + except ImportError: + log.exception(u'Failed to import %s on path %s', + modulename, path) + controller_classes = PresentationController.__subclasses__() + for controller_class in controller_classes: + controller = controller_class(self) + self.registerControllers(controller) + if self.controllers: + return True + else: + return False + + def about(self): + """ + Return information about this plugin + """ + about_text = translate('PresentationPlugin', 'Presentation ' + 'Plugin
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.') + return about_text + + def set_plugin_strings(self): + """ + Called to define all translatable texts of the plugin + """ + self.name = u'Presentations' + self.name_lower = u'presentations' + + self.strings = {} + # for names in mediamanagerdock and pluginlist + self.strings[StringType.Name] = { + u'singular': translate('PresentationPlugin', 'Presentation'), + u'plural': translate('PresentationPlugin', 'Presentations') + } + + # Middle Header Bar + ## Load Button ## + self.strings[StringType.Load] = { + u'title': translate('PresentationPlugin', 'Load'), + u'tooltip': translate('PresentationPlugin', 'Load a new Presentation') + } + ## Delete Button ## + self.strings[StringType.Delete] = { + u'title': translate('PresentationPlugin', 'Delete'), + u'tooltip': translate('PresentationPlugin', 'Delete the selected Presentation') + } + ## Preview ## + self.strings[StringType.Preview] = { + u'title': translate('PresentationPlugin', 'Preview'), + u'tooltip': translate('PresentationPlugin', 'Preview the selected Presentation') + } + ## Live Button ## + self.strings[StringType.Live] = { + u'title': translate('PresentationPlugin', 'Live'), + u'tooltip': translate('PresentationPlugin', 'Send the selected Presentation live') + } + ## Add to service Button ## + self.strings[StringType.Service] = { + u'title': translate('PresentationPlugin', 'Service'), + u'tooltip': translate('PresentationPlugin', 'Add the selected Presentation to the service') + } diff --git a/openlp/plugins/remotes/remoteplugin.py b/openlp/plugins/remotes/remoteplugin.py index d9566b57f..bf42c6d57 100644 --- a/openlp/plugins/remotes/remoteplugin.py +++ b/openlp/plugins/remotes/remoteplugin.py @@ -1,108 +1,93 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging - -from openlp.core.lib import Plugin, translate, build_icon -from openlp.plugins.remotes.lib import RemoteTab, HttpServer - -log = logging.getLogger(__name__) - -class RemotesPlugin(Plugin): - log.info(u'Remote Plugin loaded') - - def __init__(self, plugin_helpers): - """ - remotes constructor - """ - self.set_plugin_translations() - Plugin.__init__(self, u'Remotes', u'1.9.2', plugin_helpers) - self.icon = build_icon(u':/plugins/plugin_remote.png') - self.weight = -1 - self.server = None - - def initialise(self): - """ - Initialise the remotes plugin, and start the http server - """ - log.debug(u'initialise') - Plugin.initialise(self) - self.insertToolboxItem() - self.server = HttpServer(self) - - def finalise(self): - """ - Tidy up and close down the http server - """ - log.debug(u'finalise') - Plugin.finalise(self) - if self.server: - self.server.close() - - def getSettingsTab(self): - """ - Create the settings Tab - """ - return RemoteTab(self.name) - - def about(self): - """ - Information about this plugin - """ - about_text = translate('RemotePlugin', 'Remote Plugin' - '
The remote plugin provides the ability to send messages to ' - 'a running version of OpenLP on a different computer via a web ' - 'browser or through the remote API.') - return about_text - # rimach - def set_plugin_translations(self): - """ - Called to define all translatable texts of the plugin - """ - self.name = u'Remotes' - self.name_lower = u'remotes' - self.text = {} - #for context menu -# self.text['context_edit'] = translate('RemotePlugin', '&Edit Remotes') -# self.text['context_delete'] = translate('RemotePlugin', '&Delete Remotes') -# self.text['context_preview'] = translate('RemotePlugin', '&Preview Remotes') -# self.text['context_live'] = translate('RemotePlugin', '&Show Live') -# # forHeaders in mediamanagerdock -# self.text['import'] = translate('RemotePlugin', 'Import a Remotes') -# self.text['file'] = translate('RemotePlugin', 'Load a new Remotes') -# self.text['new'] = translate('RemotePlugin', 'Add a new Remotes') -# self.text['edit'] = translate('RemotePlugin', 'Edit the selected Remotes') -# self.text['delete'] = translate('RemotePlugin', 'Delete the selected Remotes') -# self.text['delete_more'] = translate('RemotePlugin', 'Delete the selected Remotes') -# self.text['preview'] = translate('RemotePlugin', 'Preview the selected Remotes') -# self.text['preview_more'] = translate('RemotePlugin', 'Preview the selected Remotes') -# self.text['live'] = translate('RemotePlugin', 'Send the selected Remotes live') -# self.text['live_more'] = translate('RemotePlugin', 'Send the selected Remotes live') -# self.text['service'] = translate('RemotePlugin', 'Add the selected Remotes to the service') -# self.text['service_more'] = translate('RemotePlugin', 'Add the selected Remotes to the service') -# # for names in mediamanagerdock and pluginlist - self.text['name'] = translate('RemotePlugin', 'Remote') - self.text['name_more'] = translate('RemotePlugin', 'Remotes') +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging + +from openlp.core.lib import Plugin, StringType, translate, build_icon +from openlp.plugins.remotes.lib import RemoteTab, HttpServer + +log = logging.getLogger(__name__) + +class RemotesPlugin(Plugin): + log.info(u'Remote Plugin loaded') + + def __init__(self, plugin_helpers): + """ + remotes constructor + """ + self.set_plugin_strings() + Plugin.__init__(self, u'Remotes', u'1.9.2', plugin_helpers) + self.icon = build_icon(u':/plugins/plugin_remote.png') + self.weight = -1 + self.server = None + + def initialise(self): + """ + Initialise the remotes plugin, and start the http server + """ + log.debug(u'initialise') + Plugin.initialise(self) + self.insertToolboxItem() + self.server = HttpServer(self) + + def finalise(self): + """ + Tidy up and close down the http server + """ + log.debug(u'finalise') + Plugin.finalise(self) + if self.server: + self.server.close() + + def getSettingsTab(self): + """ + Create the settings Tab + """ + return RemoteTab(self.name) + + def about(self): + """ + Information about this plugin + """ + about_text = translate('RemotePlugin', 'Remote Plugin' + '
The remote plugin provides the ability to send messages to ' + 'a running version of OpenLP on a different computer via a web ' + 'browser or through the remote API.') + return about_text + + def set_plugin_strings(self): + """ + Called to define all translatable texts of the plugin + """ + self.name = u'Remotes' + self.name_lower = u'remotes' + + self.strings = {} + # for names in mediamanagerdock and pluginlist + self.strings[StringType.Name] = { + u'singular': translate('RemotePlugin', 'Remote'), + u'plural': translate('RemotePlugin', 'Remotes') + } diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index ddbf8e955..839a42b8f 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -1,178 +1,196 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import Plugin, build_icon, translate -from openlp.core.lib.db import Manager -from openlp.plugins.songs.lib import SongMediaItem, SongsTab -from openlp.plugins.songs.lib.db import init_schema, Song -from openlp.plugins.songs.lib.importer import SongFormat - -log = logging.getLogger(__name__) - -class SongsPlugin(Plugin): - """ - This is the number 1 plugin, if importance were placed on any - plugins. This plugin enables the user to create, edit and display - songs. Songs are divided into verses, and the verse order can be - specified. Authors, topics and song books can be assigned to songs - as well. - """ - log.info(u'Song Plugin loaded') - - def __init__(self, plugin_helpers): - """ - Create and set up the Songs plugin. - """ - self.set_plugin_translations() - Plugin.__init__(self, u'Songs', u'1.9.2', plugin_helpers) - self.weight = -10 - self.manager = Manager(u'songs', init_schema) - self.icon_path = u':/plugins/plugin_songs.png' - self.icon = build_icon(self.icon_path) - - def getSettingsTab(self): - return SongsTab(self.name) - - def initialise(self): - log.info(u'Songs Initialising') - Plugin.initialise(self) - self.mediaItem.displayResultsSong( - self.manager.get_all_objects(Song, order_by_ref=Song.title)) - - def getMediaManagerItem(self): - """ - Create the MediaManagerItem object, which is displaed in the - Media Manager. - """ - return SongMediaItem(self, self.icon, self.name) - - def addImportMenuItem(self, import_menu): - """ - Give the Songs plugin the opportunity to add items to the - **Import** menu. - - ``import_menu`` - The actual **Import** menu item, so that your actions can - use it as their parent. - """ - # Main song import menu item - will eventually be the only one - self.SongImportItem = QtGui.QAction(import_menu) - self.SongImportItem.setObjectName(u'SongImportItem') - self.SongImportItem.setText(translate( - 'SongsPlugin', '&Song')) - self.SongImportItem.setToolTip(translate('SongsPlugin', - 'Import songs using the import wizard.')) - import_menu.addAction(self.SongImportItem) - # Signals and slots - QtCore.QObject.connect(self.SongImportItem, - QtCore.SIGNAL(u'triggered()'), self.onSongImportItemClicked) - - def addExportMenuItem(self, export_menu): - """ - Give the Songs plugin the opportunity to add items to the - **Export** menu. - - ``export_menu`` - The actual **Export** menu item, so that your actions can - use it as their parent. - """ - # No menu items for now. - pass - - def onSongImportItemClicked(self): - if self.mediaItem: - self.mediaItem.onImportClick() - - def about(self): - about_text = translate('SongsPlugin', 'Songs Plugin' - '
The songs plugin provides the ability to display and ' - 'manage songs.') - return about_text - - def usesTheme(self, theme): - """ - Called to find out if the song plugin is currently using a theme. - - Returns True if the theme is being used, otherwise returns False. - """ - if self.manager.get_all_objects(Song, Song.theme_name == theme): - return True - return False - - def renameTheme(self, oldTheme, newTheme): - """ - Renames a theme the song plugin is using making the plugin use the new - name. - - ``oldTheme`` - The name of the theme the plugin should stop using. - - ``newTheme`` - The new name the plugin should now use. - """ - songsUsingTheme = self.manager.get_all_objects(Song, - Song.theme_name == oldTheme) - for song in songsUsingTheme: - song.theme_name = newTheme - self.custommanager.save_object(song) - - def importSongs(self, format, **kwargs): - class_ = SongFormat.get_class(format) - importer = class_(self.manager, **kwargs) - importer.register(self.mediaItem.import_wizard) - return importer - def set_plugin_translations(self): - """ - Called to define all translatable texts of the plugin - """ - self.name = u'Songs' - self.name_lower = u'songs' - self.text = {} - #for context menu - self.text['context_edit'] = translate('SongsPlugin', '&Edit Song') - self.text['context_delete'] = translate('SongsPlugin', '&Delete Song') - self.text['context_preview'] = translate('SongsPlugin', '&Preview Song') - self.text['context_live'] = translate('SongsPlugin', '&Show Live') - # forHeaders in mediamanagerdock - self.text['import'] = translate('SongsPlugin', 'Import a Song') - self.text['load'] = translate('SongsPlugin', 'Load a new Song') - self.text['new'] = translate('SongsPlugin', 'Add a new Song') - self.text['edit'] = translate('SongsPlugin', 'Edit the selected Song') - self.text['delete'] = translate('SongsPlugin', 'Delete the selected Song') - self.text['delete_more'] = translate('SongsPlugin', 'Delete the selected Songs') - self.text['preview'] = translate('SongsPlugin', 'Preview the selected Song') - self.text['preview_more'] = translate('SongsPlugin', 'Preview the selected Songs') - self.text['live'] = translate('SongsPlugin', 'Send the selected Song live') - self.text['live_more'] = translate('SongsPlugin', 'Send the selected Songs live') - self.text['service'] = translate('SongsPlugin', 'Add the selected Song to the service') - self.text['service_more'] = translate('SongsPlugin', 'Add the selected Songs to the service') - # for names in mediamanagerdock and pluginlist - self.text['name'] = translate('SongsPlugin', 'Song') - self.text['name_more'] = translate('SongsPlugin', 'Songs') +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import Plugin, StringType, build_icon, translate +from openlp.core.lib.db import Manager +from openlp.plugins.songs.lib import SongMediaItem, SongsTab +from openlp.plugins.songs.lib.db import init_schema, Song +from openlp.plugins.songs.lib.importer import SongFormat + +log = logging.getLogger(__name__) + +class SongsPlugin(Plugin): + """ + This is the number 1 plugin, if importance were placed on any + plugins. This plugin enables the user to create, edit and display + songs. Songs are divided into verses, and the verse order can be + specified. Authors, topics and song books can be assigned to songs + as well. + """ + log.info(u'Song Plugin loaded') + + def __init__(self, plugin_helpers): + """ + Create and set up the Songs plugin. + """ + self.set_plugin_strings() + Plugin.__init__(self, u'Songs', u'1.9.2', plugin_helpers) + self.weight = -10 + self.manager = Manager(u'songs', init_schema) + self.icon_path = u':/plugins/plugin_songs.png' + self.icon = build_icon(self.icon_path) + + def getSettingsTab(self): + return SongsTab(self.name) + + def initialise(self): + log.info(u'Songs Initialising') + Plugin.initialise(self) + self.mediaItem.displayResultsSong( + self.manager.get_all_objects(Song, order_by_ref=Song.title)) + + def getMediaManagerItem(self): + """ + Create the MediaManagerItem object, which is displaed in the + Media Manager. + """ + return SongMediaItem(self, self.icon, self.name) + + def addImportMenuItem(self, import_menu): + """ + Give the Songs plugin the opportunity to add items to the + **Import** menu. + + ``import_menu`` + The actual **Import** menu item, so that your actions can + use it as their parent. + """ + # Main song import menu item - will eventually be the only one + self.SongImportItem = QtGui.QAction(import_menu) + self.SongImportItem.setObjectName(u'SongImportItem') + self.SongImportItem.setText(translate( + 'SongsPlugin', '&Song')) + self.SongImportItem.setToolTip(translate('SongsPlugin', + 'Import songs using the import wizard.')) + import_menu.addAction(self.SongImportItem) + # Signals and slots + QtCore.QObject.connect(self.SongImportItem, + QtCore.SIGNAL(u'triggered()'), self.onSongImportItemClicked) + + def addExportMenuItem(self, export_menu): + """ + Give the Songs plugin the opportunity to add items to the + **Export** menu. + + ``export_menu`` + The actual **Export** menu item, so that your actions can + use it as their parent. + """ + # No menu items for now. + pass + + def onSongImportItemClicked(self): + if self.mediaItem: + self.mediaItem.onImportClick() + + def about(self): + about_text = translate('SongsPlugin', 'Songs Plugin' + '
The songs plugin provides the ability to display and ' + 'manage songs.') + return about_text + + def usesTheme(self, theme): + """ + Called to find out if the song plugin is currently using a theme. + + Returns True if the theme is being used, otherwise returns False. + """ + if self.manager.get_all_objects(Song, Song.theme_name == theme): + return True + return False + + def renameTheme(self, oldTheme, newTheme): + """ + Renames a theme the song plugin is using making the plugin use the new + name. + + ``oldTheme`` + The name of the theme the plugin should stop using. + + ``newTheme`` + The new name the plugin should now use. + """ + songsUsingTheme = self.manager.get_all_objects(Song, + Song.theme_name == oldTheme) + for song in songsUsingTheme: + song.theme_name = newTheme + self.custommanager.save_object(song) + + def importSongs(self, format, **kwargs): + class_ = SongFormat.get_class(format) + importer = class_(self.manager, **kwargs) + importer.register(self.mediaItem.import_wizard) + return importer + + def set_plugin_strings(self): + """ + Called to define all translatable texts of the plugin + """ + self.name = u'Songs' + self.name_lower = u'songs' + + self.strings = {} + # for names in mediamanagerdock and pluginlist + self.strings[StringType.Name] = { + u'singular': translate('SongsPlugin', 'Song'), + u'plural': translate('SongsPlugin', 'Songs') + } + + # Middle Header Bar + ## New Button ## + self.strings[StringType.New] = { + u'title': translate('SongsPlugin', 'Add'), + u'tooltip': translate('SongsPlugin', 'Add a new Song') + } + ## Edit Button ## + self.strings[StringType.Edit] = { + u'title': translate('SongsPlugin', 'Edit'), + u'tooltip': translate('SongsPlugin', 'Edit the selected Song') + } + ## Delete Button ## + self.strings[StringType.Delete] = { + u'title': translate('SongsPlugin', 'Delete'), + u'tooltip': translate('SongsPlugin', 'Delete the selected Song') + } + ## Preview ## + self.strings[StringType.Preview] = { + u'title': translate('SongsPlugin', 'Preview'), + u'tooltip': translate('SongsPlugin', 'Preview the selected Song') + } + ## Live Button ## + self.strings[StringType.Live] = { + u'title': translate('SongsPlugin', 'Live'), + u'tooltip': translate('SongsPlugin', 'Send the selected Song live') + } + ## Add to service Button ## + self.strings[StringType.Service] = { + u'title': translate('SongsPlugin', 'Service'), + u'tooltip': translate('SongsPlugin', 'Add the selected Song to the service') + } diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index 73d0d21d4..ac9007e6e 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -1,194 +1,179 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging -from datetime import datetime - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import Plugin, Receiver, build_icon, translate -from openlp.core.lib.db import Manager -from openlp.plugins.songusage.forms import SongUsageDetailForm, \ - SongUsageDeleteForm -from openlp.plugins.songusage.lib.db import init_schema, SongUsageItem - -log = logging.getLogger(__name__) - -class SongUsagePlugin(Plugin): - log.info(u'SongUsage Plugin loaded') - - def __init__(self, plugin_helpers): - self.set_plugin_translations() - Plugin.__init__(self, u'SongUsage', u'1.9.2', plugin_helpers) - self.weight = -4 - self.icon = build_icon(u':/plugins/plugin_songusage.png') - self.songusagemanager = None - self.songusageActive = False - - def addToolsMenuItem(self, tools_menu): - """ - Give the SongUsage plugin the opportunity to add items to the - **Tools** menu. - - ``tools_menu`` - The actual **Tools** menu item, so that your actions can - use it as their parent. - """ - log.info(u'add tools menu') - self.toolsMenu = tools_menu - self.SongUsageMenu = QtGui.QMenu(tools_menu) - self.SongUsageMenu.setObjectName(u'SongUsageMenu') - self.SongUsageMenu.setTitle(translate( - 'SongUsagePlugin', '&Song Usage Tracking')) - #SongUsage Delete - self.SongUsageDelete = QtGui.QAction(tools_menu) - self.SongUsageDelete.setText(translate('SongUsagePlugin', - '&Delete Tracking Data')) - self.SongUsageDelete.setStatusTip(translate('SongUsagePlugin', - 'Delete song usage data up to a specified date.')) - self.SongUsageDelete.setObjectName(u'SongUsageDelete') - #SongUsage Report - self.SongUsageReport = QtGui.QAction(tools_menu) - self.SongUsageReport.setText( - translate('SongUsagePlugin', '&Extract Tracking Data')) - self.SongUsageReport.setStatusTip( - translate('SongUsagePlugin', 'Generate a report on song usage.')) - self.SongUsageReport.setObjectName(u'SongUsageReport') - #SongUsage activation - self.SongUsageStatus = QtGui.QAction(tools_menu) - self.SongUsageStatus.setCheckable(True) - self.SongUsageStatus.setChecked(False) - self.SongUsageStatus.setText(translate( - 'SongUsagePlugin', 'Toggle Tracking')) - self.SongUsageStatus.setStatusTip(translate('SongUsagePlugin', - 'Toggle the tracking of song usage.')) - self.SongUsageStatus.setShortcut(u'F4') - self.SongUsageStatus.setObjectName(u'SongUsageStatus') - #Add Menus together - self.toolsMenu.addAction(self.SongUsageMenu.menuAction()) - self.SongUsageMenu.addAction(self.SongUsageStatus) - self.SongUsageMenu.addSeparator() - self.SongUsageMenu.addAction(self.SongUsageDelete) - self.SongUsageMenu.addAction(self.SongUsageReport) - # Signals and slots - QtCore.QObject.connect(self.SongUsageStatus, - QtCore.SIGNAL(u'visibilityChanged(bool)'), - self.SongUsageStatus.setChecked) - QtCore.QObject.connect(self.SongUsageStatus, - QtCore.SIGNAL(u'triggered(bool)'), - self.toggleSongUsageState) - QtCore.QObject.connect(self.SongUsageDelete, - QtCore.SIGNAL(u'triggered()'), self.onSongUsageDelete) - QtCore.QObject.connect(self.SongUsageReport, - QtCore.SIGNAL(u'triggered()'), self.onSongUsageReport) - self.SongUsageMenu.menuAction().setVisible(False) - - def initialise(self): - log.info(u'SongUsage Initialising') - Plugin.initialise(self) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_live_started'), - self.onReceiveSongUsage) - self.SongUsageActive = QtCore.QSettings().value( - self.settingsSection + u'/active', - QtCore.QVariant(False)).toBool() - self.SongUsageStatus.setChecked(self.SongUsageActive) - if self.songusagemanager is None: - self.songusagemanager = Manager(u'songusage', init_schema) - self.SongUsagedeleteform = SongUsageDeleteForm(self.songusagemanager, - self.formparent) - self.SongUsagedetailform = SongUsageDetailForm(self, self.formparent) - self.SongUsageMenu.menuAction().setVisible(True) - - def finalise(self): - log.info(u'Plugin Finalise') - self.SongUsageMenu.menuAction().setVisible(False) - #stop any events being processed - self.SongUsageActive = False - - def toggleSongUsageState(self): - self.SongUsageActive = not self.SongUsageActive - QtCore.QSettings().setValue(self.settingsSection + u'/active', - QtCore.QVariant(self.SongUsageActive)) - - def onReceiveSongUsage(self, item): - """ - Song Usage for live song from SlideController - """ - audit = item[0].audit - if self.SongUsageActive and audit: - song_usage_item = SongUsageItem() - song_usage_item.usagedate = datetime.today() - song_usage_item.usagetime = datetime.now().time() - song_usage_item.title = audit[0] - song_usage_item.copyright = audit[2] - song_usage_item.ccl_number = audit[3] - song_usage_item.authors = u'' - for author in audit[1]: - song_usage_item.authors += author + u' ' - self.songusagemanager.save_object(song_usage_item) - - def onSongUsageDelete(self): - self.SongUsagedeleteform.exec_() - - def onSongUsageReport(self): - self.SongUsagedetailform.initialise() - self.SongUsagedetailform.exec_() - - def about(self): - about_text = translate('SongUsagePlugin', 'SongUsage Plugin' - '
This plugin tracks the usage of songs in ' - 'services.') - return about_text - - def set_plugin_translations(self): - """ - Called to define all translatable texts of the plugin - """ - self.name = u'SongUsage' - self.name_lower = u'songusage' - self.text = {} -# #for context menu -# self.text['context_edit'] = translate('SongUsagePlugin', '&Edit SongUsage') -# self.text['context_delete'] = translate('SongUsagePlugin', '&Delete SongUsage') -# self.text['context_preview'] = translate('SongUsagePlugin', '&Preview SongUsage') -# self.text['context_live'] = translate('SongUsagePlugin', '&Show Live') -# # forHeaders in mediamanagerdock -# self.text['import'] = translate('SongUsagePlugin', 'Import a SongUsage') -# self.text['file'] = translate('SongUsagePlugin', 'Load a new SongUsage') -# self.text['new'] = translate('SongUsagePlugin', 'Add a new SongUsage') -# self.text['edit'] = translate('SongUsagePlugin', 'Edit the selected SongUsage') -# self.text['delete'] = translate('SongUsagePlugin', 'Delete the selected SongUsage') -# self.text['delete_more'] = translate('SongUsagePlugin', 'Delete the selected Songs') -# self.text['preview'] = translate('SongUsagePlugin', 'Preview the selected SongUsage') -# self.text['preview_more'] = translate('SongUsagePlugin', 'Preview the selected Songs') -# self.text['live'] = translate('SongUsagePlugin', 'Send the selected SongUsage live') -# self.text['live_more'] = translate('SongUsagePlugin', 'Send the selected Songs live') -# self.text['service'] = translate('SongUsagePlugin', 'Add the selected SongUsage to the service') -# self.text['service_more'] = translate('SongUsagePlugin', 'Add the selected Songs to the service') - # for names in mediamanagerdock and pluginlist - self.text['name'] = translate('SongUsagePlugin', 'SongUsage') - self.text['name_more'] = translate('SongUsagePlugin', 'Songs') +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # +# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard, Frode Woldsund # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging +from datetime import datetime + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import Plugin, StringType, Receiver, build_icon, translate +from openlp.core.lib.db import Manager +from openlp.plugins.songusage.forms import SongUsageDetailForm, \ + SongUsageDeleteForm +from openlp.plugins.songusage.lib.db import init_schema, SongUsageItem + +log = logging.getLogger(__name__) + +class SongUsagePlugin(Plugin): + log.info(u'SongUsage Plugin loaded') + + def __init__(self, plugin_helpers): + self.set_plugin_strings() + Plugin.__init__(self, u'SongUsage', u'1.9.2', plugin_helpers) + self.weight = -4 + self.icon = build_icon(u':/plugins/plugin_songusage.png') + self.songusagemanager = None + self.songusageActive = False + + def addToolsMenuItem(self, tools_menu): + """ + Give the SongUsage plugin the opportunity to add items to the + **Tools** menu. + + ``tools_menu`` + The actual **Tools** menu item, so that your actions can + use it as their parent. + """ + log.info(u'add tools menu') + self.toolsMenu = tools_menu + self.SongUsageMenu = QtGui.QMenu(tools_menu) + self.SongUsageMenu.setObjectName(u'SongUsageMenu') + self.SongUsageMenu.setTitle(translate( + 'SongUsagePlugin', '&Song Usage Tracking')) + #SongUsage Delete + self.SongUsageDelete = QtGui.QAction(tools_menu) + self.SongUsageDelete.setText(translate('SongUsagePlugin', + '&Delete Tracking Data')) + self.SongUsageDelete.setStatusTip(translate('SongUsagePlugin', + 'Delete song usage data up to a specified date.')) + self.SongUsageDelete.setObjectName(u'SongUsageDelete') + #SongUsage Report + self.SongUsageReport = QtGui.QAction(tools_menu) + self.SongUsageReport.setText( + translate('SongUsagePlugin', '&Extract Tracking Data')) + self.SongUsageReport.setStatusTip( + translate('SongUsagePlugin', 'Generate a report on song usage.')) + self.SongUsageReport.setObjectName(u'SongUsageReport') + #SongUsage activation + self.SongUsageStatus = QtGui.QAction(tools_menu) + self.SongUsageStatus.setCheckable(True) + self.SongUsageStatus.setChecked(False) + self.SongUsageStatus.setText(translate( + 'SongUsagePlugin', 'Toggle Tracking')) + self.SongUsageStatus.setStatusTip(translate('SongUsagePlugin', + 'Toggle the tracking of song usage.')) + self.SongUsageStatus.setShortcut(u'F4') + self.SongUsageStatus.setObjectName(u'SongUsageStatus') + #Add Menus together + self.toolsMenu.addAction(self.SongUsageMenu.menuAction()) + self.SongUsageMenu.addAction(self.SongUsageStatus) + self.SongUsageMenu.addSeparator() + self.SongUsageMenu.addAction(self.SongUsageDelete) + self.SongUsageMenu.addAction(self.SongUsageReport) + # Signals and slots + QtCore.QObject.connect(self.SongUsageStatus, + QtCore.SIGNAL(u'visibilityChanged(bool)'), + self.SongUsageStatus.setChecked) + QtCore.QObject.connect(self.SongUsageStatus, + QtCore.SIGNAL(u'triggered(bool)'), + self.toggleSongUsageState) + QtCore.QObject.connect(self.SongUsageDelete, + QtCore.SIGNAL(u'triggered()'), self.onSongUsageDelete) + QtCore.QObject.connect(self.SongUsageReport, + QtCore.SIGNAL(u'triggered()'), self.onSongUsageReport) + self.SongUsageMenu.menuAction().setVisible(False) + + def initialise(self): + log.info(u'SongUsage Initialising') + Plugin.initialise(self) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_live_started'), + self.onReceiveSongUsage) + self.SongUsageActive = QtCore.QSettings().value( + self.settingsSection + u'/active', + QtCore.QVariant(False)).toBool() + self.SongUsageStatus.setChecked(self.SongUsageActive) + if self.songusagemanager is None: + self.songusagemanager = Manager(u'songusage', init_schema) + self.SongUsagedeleteform = SongUsageDeleteForm(self.songusagemanager, + self.formparent) + self.SongUsagedetailform = SongUsageDetailForm(self, self.formparent) + self.SongUsageMenu.menuAction().setVisible(True) + + def finalise(self): + log.info(u'Plugin Finalise') + self.SongUsageMenu.menuAction().setVisible(False) + #stop any events being processed + self.SongUsageActive = False + + def toggleSongUsageState(self): + self.SongUsageActive = not self.SongUsageActive + QtCore.QSettings().setValue(self.settingsSection + u'/active', + QtCore.QVariant(self.SongUsageActive)) + + def onReceiveSongUsage(self, item): + """ + Song Usage for live song from SlideController + """ + audit = item[0].audit + if self.SongUsageActive and audit: + song_usage_item = SongUsageItem() + song_usage_item.usagedate = datetime.today() + song_usage_item.usagetime = datetime.now().time() + song_usage_item.title = audit[0] + song_usage_item.copyright = audit[2] + song_usage_item.ccl_number = audit[3] + song_usage_item.authors = u'' + for author in audit[1]: + song_usage_item.authors += author + u' ' + self.songusagemanager.save_object(song_usage_item) + + def onSongUsageDelete(self): + self.SongUsagedeleteform.exec_() + + def onSongUsageReport(self): + self.SongUsagedetailform.initialise() + self.SongUsagedetailform.exec_() + + def about(self): + about_text = translate('SongUsagePlugin', 'SongUsage Plugin' + '
This plugin tracks the usage of songs in ' + 'services.') + return about_text + + def set_plugin_strings(self): + """ + Called to define all translatable texts of the plugin + """ + self.name = u'SongUsage' + self.name_lower = u'songusage' + + self.strings = {} + # for names in mediamanagerdock and pluginlist + self.strings[StringType.Name] = { + u'singular': translate('SongUsagePlugin', 'SongUsage'), + u'plural': translate('SongUsagePlugin', 'SongUsage') + } diff --git a/resources/i18n/openlp_af.ts b/resources/i18n/openlp_af.ts index fc20ab5b7..57c62f996 100644 --- a/resources/i18n/openlp_af.ts +++ b/resources/i18n/openlp_af.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts Waarskuwings @@ -184,96 +184,86 @@ <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display bible verses from different sources during the service. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - &Vertoon Regstreeks - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible Bybel - + Bibles Bybels + + + Import + Invoer + + + + Import a Bible + + + + + Add + Byvoeg + + + + Add a new Bible + + + + + Edit + Redigeer + + + + Edit the selected Bible + + + + + Delete + + + + + Delete the selected Bible + + + + + Preview + Voorskou + + + + Preview the selected Bible + + + + + Live + Regstreeks + + + + Send the selected Bible live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -664,97 +654,97 @@ Changes do not affect verses already in the service. Gevorderd - + Version: Weergawe: - + Dual: Dubbel: - + Search type: - + Find: Vind: - + Search Soek - + Results: &Resultate: - + Book: Boek: - + Chapter: Hoofstuk: - + Verse: Vers: - + From: Vanaf: - + To: Aan: - + Verse Search Soek Vers - + Text Search Teks Soektog - + Clear - + Keep Behou - + No Book Found Geeb Boek Gevind nie - + No matching book could be found in this Bible. Geen bypassende boek kon in dié Bybel gevind word nie. - + etc - + Bible not fully loaded. @@ -771,7 +761,7 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. @@ -796,102 +786,102 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides Redigeer Aangepaste Skyfies - + Move slide up one position. - + Move slide down one position. - + &Title: - + Add New Voeg Nuwe By - + Add a new slide at bottom. - + Edit Redigeer - + Edit the selected slide. - + Edit All Redigeer Alles - + Edit all the slides at once. - + Save Stoor - + Save the slide currently being edited. - + Delete - + Delete the selected slide. - + Clear - + Clear edit area Maak skoon die redigeer area - + Split Slide - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -936,69 +926,94 @@ Changes do not affect verses already in the service. CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - &Show Live - &Vertoon Regstreeks - - - - Import a Custom + Custom - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom + + Customs - Delete the selected Custom + Import + Invoer + + + + Import a Custom - - Preview the selected Custom - - - - - Send the selected Custom live + + Load - Add the selected Custom to the service + Load a new Custom - - Custom + + Add + Byvoeg + + + + Add a new Custom + + + + + Edit + Redigeer + + + + Edit the selected Custom + + + + + Delete + + + + + Delete the selected Custom + + + + + Preview + Voorskou + + + + Preview the selected Custom + + + + + Live + Regstreeks + + + + Send the selected Custom live + + + + + Service + + + + + Add the selected Custom to the service @@ -1006,99 +1021,89 @@ Changes do not affect verses already in the service. 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image + <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 Images with the selected image as a background instead of the background provided by the theme. - &Show Live - &Vertoon Regstreeks - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - Image Beeld - + Images Beelde + + + Load + + + + + Load a new Image + + + + + Add + Byvoeg + + + + Add a new Image + + + + + Edit + Redigeer + + + + Edit the selected Image + + + + + Delete + + + + + Delete the selected Image + + + + + Preview + Voorskou + + + + Preview the selected Image + + + + + Live + Regstreeks + + + + Send the selected Image live + + + + + Service + + + + + Add the selected Image to the service + + ImagePlugin.MediaItem @@ -1155,70 +1160,85 @@ Changes do not affect verses already in the service. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - &Show Live - &Vertoon Regstreeks + Media + Media - - Import a Media - - - - - Load a new Media - - - - - Add a new Media - - - - - Edit the selected Media + + Medias + Load + + + + + Load a new Media + + + + + Add + Byvoeg + + + + Add a new Media + + + + + Edit + Redigeer + + + + Edit the selected Media + + + + + Delete + + + + Delete the selected Media - + + Preview + Voorskou + + + Preview the selected Media - + + Live + Regstreeks + + + Send the selected Media live - - Add the selected Media to the service + + Service - - Media - Media + + Add the selected Media to the service + @@ -1809,6 +1829,19 @@ This General Public License does not permit incorporating your program into prop + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2368,117 +2401,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - + No Items Selected - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - - - - + &Edit %s - + &Delete %s - + &Preview %s - + &Show Live &Vertoon Regstreeks - + &Add to Service &Voeg by Diens - + &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. - + No items selected - + You must select one or more items - + No Service Item Selected - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. @@ -2486,57 +2484,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List Inprop Lys - + Plugin Details Inprop Besonderhede - + Version: Weergawe: - + TextLabel TeksEtiket - + About: Aangaande: - + Status: Status: - + Active Aktief - + Inactive Onaktief - + %s (Inactive) - + %s (Active) - + %s (Disabled) @@ -2772,70 +2770,70 @@ The content encoding is not UTF-8. Voorskou - + Move to previous Beweeg na vorige - + Move to next Verskuif na volgende - + Hide - + Move to live Verskuif na regstreekse skerm - + Edit and re-preview Song Redigeer en sien weer 'n voorskou van die Lied - + Start continuous loop Begin aaneenlopende lus - + Stop continuous loop Stop deurlopende lus - + s s - + Delay between slides in seconds Vertraging in sekondes tussen skyfies - + Start playing media Begin media speel - - Go to Verse - Gaan na Vers + + Go to + OpenLP.SpellTextEdit - + Spelling Suggestions - + Formatting Tags @@ -3075,95 +3073,65 @@ The content encoding is not UTF-8. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - &Vertoon Regstreeks - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - + Presentation Aanbieding - + Presentations Aanbiedinge + + + Load + + + + + Load a new Presentation + + + + + Delete + + + + + Delete the selected Presentation + + + + + Preview + Voorskou + + + + Preview the selected Presentation + + + + + Live + Regstreeks + + + + Send the selected Presentation live + + + + + Service + + + + + Add the selected Presentation to the service + + PresentationPlugin.MediaItem @@ -3239,12 +3207,12 @@ The content encoding is not UTF-8. - + Remote - + Remotes Afstandbehere @@ -3315,15 +3283,10 @@ The content encoding is not UTF-8. - + SongUsage - - - Songs - Liedere - SongUsagePlugin.SongUsageDeleteForm @@ -3388,96 +3351,76 @@ The content encoding is not UTF-8. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - &Show Live - &Vertoon Regstreeks - - - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song - - - - - Delete the selected Songs - - - - - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live - - - - - Add the selected Song to the service - - - - - Add the selected Songs to the service - - - - Song Lied - + Songs Liedere + + + Add + Byvoeg + + + + Add a new Song + + + + + Edit + Redigeer + + + + Edit the selected Song + + + + + Delete + + + + + Delete the selected Song + + + + + Preview + Voorskou + + + + Preview the selected Song + + + + + Live + Regstreeks + + + + Send the selected Song live + + + + + Service + + + + + Add the selected Song to the service + + SongsPlugin.AuthorsForm @@ -3675,7 +3618,7 @@ The content encoding is not UTF-8. - + Error Fout @@ -3720,42 +3663,42 @@ The content encoding is not UTF-8. - + You need to type in a song title. - + You need to type in at least one verse. - + Warning - + You have not added any authors for this song. Do you want to add an author now? - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - + Add Book - + This song book does not exist, do you want to add it? @@ -3763,17 +3706,17 @@ The content encoding is not UTF-8. SongsPlugin.EditVerseForm - + Edit Verse Redigeer Vers - + &Verse type: - + &Insert @@ -3781,127 +3724,127 @@ The content encoding is not UTF-8. SongsPlugin.ImportWizardForm - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No OpenLyrics Files Selected - + You need to add at least one OpenLyrics song file to import from. - + No OpenSong Files Selected - + You need to add at least one OpenSong song file to import from. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No CCLI Files Selected - + You need to add at least one CCLI file to import from. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select CCLI Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files - + Starting import... Invoer begin... @@ -4015,6 +3958,16 @@ The content encoding is not UTF-8. %p% + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4089,7 +4042,7 @@ The content encoding is not UTF-8. - + CCLI Licence: CCLI Lisensie: @@ -4125,12 +4078,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImport - + copyright - + © @@ -4138,12 +4091,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImportForm - + Finished import. Invoer voltooi. - + Your song import failed. diff --git a/resources/i18n/openlp_de.ts b/resources/i18n/openlp_de.ts index 08b0e5cfe..144ea4862 100644 --- a/resources/i18n/openlp_de.ts +++ b/resources/i18n/openlp_de.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts Hinweise @@ -184,96 +184,86 @@ <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display bible verses from different sources during the service. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - &Zeige Live - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible Bibel - + Bibles Bibeln + + + Import + Import + + + + Import a Bible + + + + + Add + Hinzufügen + + + + Add a new Bible + + + + + Edit + Bearbeiten + + + + Edit the selected Bible + + + + + Delete + Löschen + + + + Delete the selected Bible + + + + + Preview + Vorschau + + + + Preview the selected Bible + + + + + Live + Live + + + + Send the selected Bible live + + + + + Service + Ablauf + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -664,97 +654,97 @@ Changes do not affect verses already in the service. Erweitert - + Version: Version: - + Dual: Parallel: - + Find: Suchen: - + Search Suche - + Results: Ergebnisse: - + Book: Buch: - + Chapter: Kapitel: - + Verse: Vers: - + From: Von: - + To: Bis: - + Verse Search Stelle suchen - + Text Search Textsuche - + Clear - + Keep Behalten - + No Book Found Kein Buch gefunden - + No matching book could be found in this Bible. Das Buch wurde in dieser Bibelausgabe nicht gefunden. - + etc - + Search type: - + Bible not fully loaded. @@ -771,8 +761,8 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. - + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. + @@ -796,62 +786,62 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides Sonderfolien bearbeiten - + &Title: - + Add New Neues anfügen - + Edit Bearbeiten - + Edit All - + Save Speichern - + Delete Löschen - + Clear - + Clear edit area Aufräumen des Bearbeiten Bereiches - + Split Slide - + The&me: - + &Credits: @@ -866,37 +856,37 @@ Changes do not affect verses already in the service. Fehler - + Move slide down one position. - + Add a new slide at bottom. - + Edit the selected slide. - + Edit all the slides at once. - + Save the slide currently being edited. - + Delete the selected slide. - + Split a slide into two by inserting a slide splitter. @@ -916,7 +906,7 @@ Changes do not affect verses already in the service. - + Move slide up one position. @@ -936,169 +926,184 @@ Changes do not affect verses already in the service. CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - &Show Live - &Zeige Live + Custom + Sonderfolien - - Import a Custom - - - - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom + + Customs + Import + Import + + + + Import a Custom + + + + + Load + Laden + + + + Load a new Custom + + + + + Add + Hinzufügen + + + + Add a new Custom + + + + + Edit + Bearbeiten + + + + Edit the selected Custom + + + + + Delete + Löschen + + + Delete the selected Custom - + + Preview + Vorschau + + + Preview the selected Custom - + + Live + Live + + + Send the selected Custom live - - Add the selected Custom to the service - + + Service + Ablauf - - Custom - Sonderfolien + + Add the selected Custom to the service + 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image + <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 Images with the selected image as a background instead of the background provided by the theme. - &Show Live - &Zeige Live - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - Image Bild - + Images + + + Load + Laden + + + + Load a new Image + + + + + Add + Hinzufügen + + + + Add a new Image + + + + + Edit + Bearbeiten + + + + Edit the selected Image + + + + + Delete + Löschen + + + + Delete the selected Image + + + + + Preview + Vorschau + + + + Preview the selected Image + + + + + Live + Live + + + + Send the selected Image live + + + + + Service + Ablauf + + + + Add the selected Image to the service + + ImagePlugin.MediaItem @@ -1155,70 +1160,85 @@ Changes do not affect verses already in the service. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - &Show Live - &Zeige Live + Media + Medien - - Import a Media - - - - - Load a new Media - - - - - Add a new Media - - - - - Edit the selected Media + + Medias + Load + Laden + + + + Load a new Media + + + + + Add + Hinzufügen + + + + Add a new Media + + + + + Edit + Bearbeiten + + + + Edit the selected Media + + + + + Delete + Löschen + + + Delete the selected Media - + + Preview + Vorschau + + + Preview the selected Media - + + Live + Live + + + Send the selected Media live - - Add the selected Media to the service - + + Service + Ablauf - - Media - Medien + + Add the selected Media to the service + @@ -1809,6 +1829,19 @@ This General Public License does not permit incorporating your program into prop + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2368,117 +2401,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - + No Items Selected - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - - - - + &Edit %s - + &Delete %s - + &Preview %s - + &Show Live &Zeige Live - + &Add to Service &Zum Ablauf hinzufügen - + &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. - + No items selected - + You must select one or more items Sie müssen mindestens ein Element markieren - + No Service Item Selected - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. @@ -2486,57 +2484,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List Plugin-Liste - + Plugin Details Plugin-Details - + Version: Version: - + TextLabel Text Beschriftung - + About: Über: - + Status: Status: - + Active Aktiv - + Inactive Inaktiv - + %s (Inactive) %s (Inaktiv) - + %s (Active) %s (Aktiv) - + %s (Disabled) %s (Deaktiviert) @@ -2772,70 +2770,70 @@ The content encoding is not UTF-8. Vorschau - + Move to previous Vorherige Folie anzeigen - + Move to next Verschiebe zum Nächsten - + Hide - + Move to live Verschieben zur Live Ansicht - + Edit and re-preview Song Lied bearbeiten und wieder anzeigen - + Start continuous loop Endlosschleife starten - + Stop continuous loop Endlosschleife beenden - + s s - + Delay between slides in seconds Pause zwischen den Folien in Sekunden - + Start playing media Abspielen - - Go to Verse - Springe zu + + Go to + OpenLP.SpellTextEdit - + Spelling Suggestions - + Formatting Tags @@ -3075,95 +3073,65 @@ The content encoding is not UTF-8. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - &Zeige Live - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - + Presentation Präsentation - + Presentations Präsentationen + + + Load + Laden + + + + Load a new Presentation + + + + + Delete + Löschen + + + + Delete the selected Presentation + + + + + Preview + Vorschau + + + + Preview the selected Presentation + + + + + Live + Live + + + + Send the selected Presentation live + + + + + Service + Ablauf + + + + Add the selected Presentation to the service + + PresentationPlugin.MediaItem @@ -3239,12 +3207,12 @@ The content encoding is not UTF-8. - + Remote - + Remotes Fernprojektion @@ -3315,15 +3283,10 @@ The content encoding is not UTF-8. - + SongUsage - - - Songs - Lieder - SongUsagePlugin.SongUsageDeleteForm @@ -3388,96 +3351,76 @@ The content encoding is not UTF-8. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - &Show Live - &Zeige Live - - - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song - - - - - Delete the selected Songs - - - - - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live - - - - - Add the selected Song to the service - - - - - Add the selected Songs to the service - - - - Song Lied - + Songs Lieder + + + Add + Hinzufügen + + + + Add a new Song + Füge ein neues Lied hinzu + + + + Edit + Bearbeiten + + + + Edit the selected Song + Bearbeite das akuelle Lied + + + + Delete + Löschen + + + + Delete the selected Song + Markiertes Lied löschen + + + + Preview + Vorschau + + + + Preview the selected Song + Vorschau des markierten Liedes + + + + Live + Live + + + + Send the selected Song live + Markiertes Lied vorführen + + + + Service + Ablauf + + + + Add the selected Song to the service + Markierten Titel zum Ablauf hinzufügen + SongsPlugin.AuthorsForm @@ -3675,47 +3618,47 @@ The content encoding is not UTF-8. - + Add Book - + This song book does not exist, do you want to add it? - + Error Fehler - + You need to type in a song title. - + You need to type in at least one verse. - + Warning - + You have not added any authors for this song. Do you want to add an author now? - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? @@ -3763,17 +3706,17 @@ The content encoding is not UTF-8. SongsPlugin.EditVerseForm - + Edit Verse Bearbeite Vers - + &Verse type: - + &Insert @@ -3781,37 +3724,37 @@ The content encoding is not UTF-8. SongsPlugin.ImportWizardForm - + No OpenLyrics Files Selected - + You need to add at least one OpenLyrics song file to import from. - + No OpenSong Files Selected - + You need to add at least one OpenSong song file to import from. - + No CCLI Files Selected - + You need to add at least one CCLI file to import from. - + Starting import... Starte import ... @@ -3896,92 +3839,92 @@ The content encoding is not UTF-8. - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select CCLI Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files @@ -4015,6 +3958,16 @@ The content encoding is not UTF-8. Generic Document/Presentation + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4074,7 +4027,7 @@ The content encoding is not UTF-8. - + CCLI Licence: CCLI-Lizenz: @@ -4125,12 +4078,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImport - + copyright - + © @@ -4138,12 +4091,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImportForm - + Finished import. Importvorgang abgeschlossen. - + Your song import failed. diff --git a/resources/i18n/openlp_en.ts b/resources/i18n/openlp_en.ts index 4fac40d62..da8da1006 100644 --- a/resources/i18n/openlp_en.ts +++ b/resources/i18n/openlp_en.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts @@ -184,96 +184,86 @@ <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display bible verses from different sources during the service. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible - + Bibles + + + Import + + + + + Import a Bible + + + + + Add + + + + + Add a new Bible + + + + + Edit + + + + + Edit the selected Bible + + + + + Delete + + + + + Delete the selected Bible + + + + + Preview + + + + + Preview the selected Bible + + + + + Live + + + + + Send the selected Bible live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -664,97 +654,97 @@ Changes do not affect verses already in the service. - + Version: - + Dual: - + Search type: - + Find: - + Search - + Results: - + Book: - + Chapter: - + Verse: - + From: - + To: - + Verse Search - + Text Search - + Clear - + Keep - + No Book Found - + No matching book could be found in this Bible. - + etc - + Bible not fully loaded. @@ -771,7 +761,7 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. @@ -796,102 +786,102 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides - + Move slide up one position. - + Move slide down one position. - + &Title: - + Add New - + Add a new slide at bottom. - + Edit - + Edit the selected slide. - + Edit All - + Edit all the slides at once. - + Save - + Save the slide currently being edited. - + Delete - + Delete the selected slide. - + Clear - + Clear edit area - + Split Slide - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -936,69 +926,94 @@ Changes do not affect verses already in the service. CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - &Show Live + Custom - - Import a Custom - - - - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom + + Customs - Delete the selected Custom + Import - - Preview the selected Custom + + Import a Custom - - Send the selected Custom live + + Load - Add the selected Custom to the service + Load a new Custom - - Custom + + Add + + + + + Add a new Custom + + + + + Edit + + + + + Edit the selected Custom + + + + + Delete + + + + + Delete the selected Custom + + + + + Preview + + + + + Preview the selected Custom + + + + + Live + + + + + Send the selected Custom live + + + + + Service + + + + + Add the selected Custom to the service @@ -1006,99 +1021,89 @@ Changes do not affect verses already in the service. 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image + <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 Images with the selected image as a background instead of the background provided by the theme. - &Show Live - - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - Image - + Images + + + Load + + + + + Load a new Image + + + + + Add + + + + + Add a new Image + + + + + Edit + + + + + Edit the selected Image + + + + + Delete + + + + + Delete the selected Image + + + + + Preview + + + + + Preview the selected Image + + + + + Live + + + + + Send the selected Image live + + + + + Service + + + + + Add the selected Image to the service + + ImagePlugin.MediaItem @@ -1155,69 +1160,84 @@ Changes do not affect verses already in the service. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - &Show Live + Media - - Import a Media - - - - - Load a new Media - - - - - Add a new Media - - - - - Edit the selected Media + + Medias - Delete the selected Media + Load - - Preview the selected Media + + Load a new Media - - Send the selected Media live + + Add - Add the selected Media to the service + Add a new Media - - Media + + Edit + + + + + Edit the selected Media + + + + + Delete + + + + + Delete the selected Media + + + + + Preview + + + + + Preview the selected Media + + + + + Live + + + + + Send the selected Media live + + + + + Service + + + + + Add the selected Media to the service @@ -1809,6 +1829,19 @@ This General Public License does not permit incorporating your program into prop + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2368,117 +2401,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - + No Items Selected - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - - - - + &Edit %s - + &Delete %s - + &Preview %s - + &Show Live - + &Add to Service - + &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. - + No items selected - + You must select one or more items - + No Service Item Selected - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. @@ -2486,57 +2484,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List - + Plugin Details - + Version: - + TextLabel - + About: - + Status: - + Active - + Inactive - + %s (Inactive) - + %s (Active) - + %s (Disabled) @@ -2772,70 +2770,70 @@ The content encoding is not UTF-8. - + Move to previous - + Move to next - + Hide - + Move to live - + Edit and re-preview Song - + Start continuous loop - + Stop continuous loop - + s - + Delay between slides in seconds - + Start playing media - - Go to Verse + + Go to OpenLP.SpellTextEdit - + Spelling Suggestions - + Formatting Tags @@ -3075,95 +3073,65 @@ The content encoding is not UTF-8. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - + Presentation - + Presentations + + + Load + + + + + Load a new Presentation + + + + + Delete + + + + + Delete the selected Presentation + + + + + Preview + + + + + Preview the selected Presentation + + + + + Live + + + + + Send the selected Presentation live + + + + + Service + + + + + Add the selected Presentation to the service + + PresentationPlugin.MediaItem @@ -3239,12 +3207,12 @@ The content encoding is not UTF-8. - + Remote - + Remotes @@ -3315,15 +3283,10 @@ The content encoding is not UTF-8. - + SongUsage - - - Songs - - SongUsagePlugin.SongUsageDeleteForm @@ -3388,96 +3351,76 @@ The content encoding is not UTF-8. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - &Show Live - - - - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song - - - - - Delete the selected Songs - - - - - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live - - - - - Add the selected Song to the service - - - - - Add the selected Songs to the service - - - - Song - + Songs + + + Add + + + + + Add a new Song + + + + + Edit + + + + + Edit the selected Song + + + + + Delete + + + + + Delete the selected Song + + + + + Preview + + + + + Preview the selected Song + + + + + Live + + + + + Send the selected Song live + + + + + Service + + + + + Add the selected Song to the service + + SongsPlugin.AuthorsForm @@ -3675,7 +3618,7 @@ The content encoding is not UTF-8. - + Error @@ -3720,42 +3663,42 @@ The content encoding is not UTF-8. - + You need to type in a song title. - + You need to type in at least one verse. - + Warning - + You have not added any authors for this song. Do you want to add an author now? - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - + Add Book - + This song book does not exist, do you want to add it? @@ -3763,17 +3706,17 @@ The content encoding is not UTF-8. SongsPlugin.EditVerseForm - + Edit Verse - + &Verse type: - + &Insert @@ -3781,127 +3724,127 @@ The content encoding is not UTF-8. SongsPlugin.ImportWizardForm - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No OpenLyrics Files Selected - + You need to add at least one OpenLyrics song file to import from. - + No OpenSong Files Selected - + You need to add at least one OpenSong song file to import from. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No CCLI Files Selected - + You need to add at least one CCLI file to import from. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select CCLI Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files - + Starting import... @@ -4015,6 +3958,16 @@ The content encoding is not UTF-8. %p% + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4089,7 +4042,7 @@ The content encoding is not UTF-8. - + CCLI Licence: @@ -4125,12 +4078,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImport - + copyright - + © @@ -4138,12 +4091,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImportForm - + Finished import. - + Your song import failed. diff --git a/resources/i18n/openlp_en_GB.ts b/resources/i18n/openlp_en_GB.ts index 0a7b926bb..6f9616304 100644 --- a/resources/i18n/openlp_en_GB.ts +++ b/resources/i18n/openlp_en_GB.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts Alerts @@ -184,96 +184,86 @@ <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display bible verses from different sources during the service. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - &Show Live - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible Bible - + Bibles Bibles + + + Import + Import + + + + Import a Bible + + + + + Add + Add + + + + Add a new Bible + + + + + Edit + Edit + + + + Edit the selected Bible + + + + + Delete + Delete + + + + Delete the selected Bible + + + + + Preview + Preview + + + + Preview the selected Bible + + + + + Live + Live + + + + Send the selected Bible live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -664,97 +654,97 @@ Changes do not affect verses already in the service. Advanced - + Version: Version: - + Dual: Dual: - + Search type: - + Find: Find: - + Search Search - + Results: Results: - + Book: Book: - + Chapter: Chapter: - + Verse: Verse: - + From: From: - + To: To: - + Verse Search Verse Search - + Text Search Text Search - + Clear Clear - + Keep Keep - + No Book Found No Book Found - + No matching book could be found in this Bible. No matching book could be found in this Bible. - + etc - + Bible not fully loaded. @@ -771,7 +761,7 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. @@ -796,102 +786,102 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides Edit Custom Slides - + Move slide up one position. - + Move slide down one position. - + &Title: - + Add New Add New - + Add a new slide at bottom. - + Edit Edit - + Edit the selected slide. - + Edit All Edit All - + Edit all the slides at once. - + Save Save - + Save the slide currently being edited. - + Delete Delete - + Delete the selected slide. - + Clear Clear - + Clear edit area Clear edit area - + Split Slide - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -936,169 +926,184 @@ Changes do not affect verses already in the service. CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - &Show Live - &Show Live + Custom + Custom - - Import a Custom - - - - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom + + Customs - Delete the selected Custom + Import + Import + + + + Import a Custom - - Preview the selected Custom - - - - - Send the selected Custom live + + Load - Add the selected Custom to the service + Load a new Custom - - Custom - Custom + + Add + Add + + + + Add a new Custom + + + + + Edit + Edit + + + + Edit the selected Custom + + + + + Delete + Delete + + + + Delete the selected Custom + + + + + Preview + Preview + + + + Preview the selected Custom + + + + + Live + Live + + + + Send the selected Custom live + + + + + Service + + + + + Add the selected Custom to the service + 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image + <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 Images with the selected image as a background instead of the background provided by the theme. - &Show Live - &Show Live - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - Image Image - + Images Images + + + Load + + + + + Load a new Image + + + + + Add + Add + + + + Add a new Image + + + + + Edit + Edit + + + + Edit the selected Image + + + + + Delete + Delete + + + + Delete the selected Image + + + + + Preview + Preview + + + + Preview the selected Image + + + + + Live + Live + + + + Send the selected Image live + + + + + Service + + + + + Add the selected Image to the service + + ImagePlugin.MediaItem @@ -1155,70 +1160,85 @@ Changes do not affect verses already in the service. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - &Show Live - &Show Live + Media + Media - - Import a Media - - - - - Load a new Media - - - - - Add a new Media - - - - - Edit the selected Media + + Medias + Load + + + + + Load a new Media + + + + + Add + Add + + + + Add a new Media + + + + + Edit + Edit + + + + Edit the selected Media + + + + + Delete + Delete + + + Delete the selected Media - + + Preview + Preview + + + Preview the selected Media - + + Live + Live + + + Send the selected Media live - - Add the selected Media to the service + + Service - - Media - Media + + Add the selected Media to the service + @@ -1809,6 +1829,19 @@ This General Public License does not permit incorporating your program into prop + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2368,117 +2401,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - + No Items Selected - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - - - - + &Edit %s - + &Delete %s - + &Preview %s - + &Show Live &Show Live - + &Add to Service &Add to Service - + &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. - + No items selected - + You must select one or more items You must select one or more items - + No Service Item Selected - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. @@ -2486,57 +2484,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List Plugin List - + Plugin Details Plugin Details - + Version: Version: - + TextLabel TextLabel - + About: About: - + Status: Status: - + Active Active - + Inactive Inactive - + %s (Inactive) - + %s (Active) - + %s (Disabled) @@ -2772,70 +2770,70 @@ The content encoding is not UTF-8. Preview - + Move to previous Move to previous - + Move to next Move to next - + Hide - + Move to live Move to live - + Edit and re-preview Song Edit and re-preview Song - + Start continuous loop Start continuous loop - + Stop continuous loop Stop continuous loop - + s s - + Delay between slides in seconds Delay between slides in seconds - + Start playing media Start playing media - - Go to Verse - Go to Verse + + Go to + OpenLP.SpellTextEdit - + Spelling Suggestions - + Formatting Tags @@ -3075,95 +3073,65 @@ The content encoding is not UTF-8. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - &Show Live - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - + Presentation Presentation - + Presentations Presentations + + + Load + + + + + Load a new Presentation + + + + + Delete + Delete + + + + Delete the selected Presentation + + + + + Preview + Preview + + + + Preview the selected Presentation + + + + + Live + Live + + + + Send the selected Presentation live + + + + + Service + + + + + Add the selected Presentation to the service + + PresentationPlugin.MediaItem @@ -3239,12 +3207,12 @@ The content encoding is not UTF-8. - + Remote - + Remotes Remotes @@ -3315,15 +3283,10 @@ The content encoding is not UTF-8. - + SongUsage - - - Songs - Songs - SongUsagePlugin.SongUsageDeleteForm @@ -3388,96 +3351,76 @@ The content encoding is not UTF-8. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - &Show Live - &Show Live - - - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song - - - - - Delete the selected Songs - - - - - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live - - - - - Add the selected Song to the service - - - - - Add the selected Songs to the service - - - - Song Song - + Songs Songs + + + Add + Add + + + + Add a new Song + + + + + Edit + Edit + + + + Edit the selected Song + + + + + Delete + Delete + + + + Delete the selected Song + + + + + Preview + Preview + + + + Preview the selected Song + + + + + Live + Live + + + + Send the selected Song live + + + + + Service + + + + + Add the selected Song to the service + + SongsPlugin.AuthorsForm @@ -3675,7 +3618,7 @@ The content encoding is not UTF-8. - + Error Error @@ -3720,42 +3663,42 @@ The content encoding is not UTF-8. - + You need to type in a song title. - + You need to type in at least one verse. - + Warning - + You have not added any authors for this song. Do you want to add an author now? - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - + Add Book - + This song book does not exist, do you want to add it? @@ -3763,17 +3706,17 @@ The content encoding is not UTF-8. SongsPlugin.EditVerseForm - + Edit Verse Edit Verse - + &Verse type: - + &Insert @@ -3781,127 +3724,127 @@ The content encoding is not UTF-8. SongsPlugin.ImportWizardForm - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No OpenLyrics Files Selected - + You need to add at least one OpenLyrics song file to import from. - + No OpenSong Files Selected - + You need to add at least one OpenSong song file to import from. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No CCLI Files Selected - + You need to add at least one CCLI file to import from. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select CCLI Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files - + Starting import... Starting import... @@ -4015,6 +3958,16 @@ The content encoding is not UTF-8. %p% + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4089,7 +4042,7 @@ The content encoding is not UTF-8. - + CCLI Licence: CCLI Licence: @@ -4125,12 +4078,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImport - + copyright - + © @@ -4138,12 +4091,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImportForm - + Finished import. Finished import. - + Your song import failed. diff --git a/resources/i18n/openlp_en_ZA.ts b/resources/i18n/openlp_en_ZA.ts index 67a21d3ac..1f853c652 100644 --- a/resources/i18n/openlp_en_ZA.ts +++ b/resources/i18n/openlp_en_ZA.ts @@ -18,12 +18,12 @@ <strong>Alerts Plugin</strong><br />The alert plugin controls the displaying of nursery alerts on the display screen - + Alert - + Alerts Alerts @@ -184,96 +184,86 @@ <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. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - &Show Live - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible Bible - + Bibles Bibles + + + Import + + + + + Import a Bible + + + + + Add + + + + + Add a new Bible + + + + + Edit + Edit + + + + Edit the selected Bible + + + + + Delete + Delete + + + + Delete the selected Bible + + + + + Preview + Preview + + + + Preview the selected Bible + + + + + Live + Live + + + + Send the selected Bible live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -665,97 +655,97 @@ Changes do not affect verses already in the service. Advanced - + Version: Version: - + Dual: Dual: - + Search type: Search type: - + Find: Find: - + Search Search - + Results: Results: - + Book: Book: - + Chapter: Chapter: - + Verse: Verse: - + From: From: - + To: To: - + Verse Search Verse Search - + Text Search Text Search - + Clear Clear - + Keep Keep - + No Book Found No Book Found - + No matching book could be found in this Bible. No matching book could be found in this Bible. - + etc etc - + Bible not fully loaded. Bible not fully loaded. @@ -772,8 +762,8 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. + @@ -797,97 +787,97 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides Edit Custom Slides - + Move slide down one position. Move slide down one position. - + &Title: &Title: - + Add New Add New - + Add a new slide at bottom. Add a new slide at bottom. - + Edit Edit - + Edit the selected slide. Edit the selected slide. - + Edit All Edit All - + Edit all the slides at once. Edit all the slides at once. - + Save Save - + Save the slide currently being edited. Save the slide currently being edited. - + Delete Delete - + Delete the selected slide. Delete the selected slide. - + Clear Clear - + Clear edit area Clear edit area - + Split Slide Split Slide - + 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: @@ -917,7 +907,7 @@ Changes do not affect verses already in the service. You have one or more unsaved slides, please either save your slide(s) or clear your changes. - + Move slide up one position. Move slide up one position. @@ -937,169 +927,184 @@ Changes do not affect verses already in the service. CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - &Show Live - &Show Live + Custom + Custom - - Import a Custom - - - - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom + + Customs - Delete the selected Custom + Import - - Preview the selected Custom + + Import a Custom - - Send the selected Custom live + + Load - Add the selected Custom to the service + Load a new Custom - - Custom - Custom + + Add + + + + + Add a new Custom + + + + + Edit + Edit + + + + Edit the selected Custom + + + + + Delete + Delete + + + + Delete the selected Custom + + + + + Preview + Preview + + + + Preview the selected Custom + + + + + Live + Live + + + + Send the selected Custom live + + + + + Service + + + + + Add the selected Custom to the service + 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. - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image + <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 Images with the selected image as a background instead of the background provided by the theme. - &Show Live - &Show Live - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - Image Image - + Images + + + Load + + + + + Load a new Image + + + + + Add + + + + + Add a new Image + + + + + Edit + Edit + + + + Edit the selected Image + + + + + Delete + Delete + + + + Delete the selected Image + + + + + Preview + Preview + + + + Preview the selected Image + + + + + Live + Live + + + + Send the selected Image live + + + + + Service + + + + + Add the selected Image to the service + + ImagePlugin.MediaItem @@ -1156,70 +1161,85 @@ Changes do not affect verses already in the service. <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. - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - &Show Live - &Show Live + Media + Media - - Import a Media - - - - - Load a new Media - - - - - Add a new Media - - - - - Edit the selected Media + + Medias - Delete the selected Media + Load - - Preview the selected Media + + Load a new Media - - Send the selected Media live + + Add - Add the selected Media to the service + Add a new Media - - Media - Media + + Edit + Edit + + + + Edit the selected Media + + + + + Delete + Delete + + + + Delete the selected Media + + + + + Preview + Preview + + + + Preview the selected Media + + + + + Live + Live + + + + Send the selected Media live + + + + + Service + + + + + Add the selected Media to the service + @@ -1853,6 +1873,19 @@ This General Public License does not permit incorporating your program into prop Slide height is %s rows. + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2414,117 +2447,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - + No Items Selected No Items Selected - - Import %s - Import %s - - - - Load %s - Load %s - - - - New %s - New %s - - - - Edit %s - Edit %s - - - - Delete %s - Delete %s - - - - Preview %s - Preview %s - - - - Add %s to Service - Add %s to Service - - - + &Edit %s &Edit %s - + &Delete %s &Delete %s - + &Preview %s &Preview %s - + &Show Live &Show Live - + &Add to Service &Add to Service - + &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. - + No items selected No items selected - + You must select one or more items You must select one or more items - + No Service Item Selected No Service Item Selected - + 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. @@ -2532,57 +2530,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List Plugin List - + Plugin Details Plugin Details - + Version: Version: - + About: About: - + Status: Status: - + Active Active - + Inactive Inactive - + %s (Inactive) %s (Inactive) - + %s (Active) %s (Active) - + %s (Disabled) %s (Disabled) - + TextLabel @@ -2819,70 +2817,70 @@ The content encoding is not UTF-8. Preview - + Move to previous Move to previous - + Move to next Move to next - + Hide Hide - + Move to live Move to live - + Start continuous loop Start continuous loop - + Stop continuous loop Stop continuous loop - + s s - + Delay between slides in seconds Delay between slides in seconds - + Start playing media Start playing media - + Edit and re-preview Song - - Go to Verse + + Go to OpenLP.SpellTextEdit - + Spelling Suggestions Spelling Suggestions - + Formatting Tags Formatting Tags @@ -3123,95 +3121,65 @@ The content encoding is not UTF-8. <strong>Presentation Plugin</strong><br />The presentation plugin provides the ability to show presentations using a number of different programs. The choice of available presentation programs is available to the user in a drop down box. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - &Show Live - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - + Presentation Presentation - + Presentations Presentations + + + Load + + + + + Load a new Presentation + + + + + Delete + Delete + + + + Delete the selected Presentation + + + + + Preview + Preview + + + + Preview the selected Presentation + + + + + Live + Live + + + + Send the selected Presentation live + + + + + Service + + + + + Add the selected Presentation to the service + + PresentationPlugin.MediaItem @@ -3248,7 +3216,7 @@ The content encoding is not UTF-8. This type of presentation is not supported - + This type of presentation is not supported @@ -3287,12 +3255,12 @@ The content encoding is not UTF-8. <strong>Remote Plugin</strong><br />The remote plugin provides the ability to send messages to a running version of OpenLP on a different computer via a web browser or through the remote API. - + Remote - + Remotes Remotes @@ -3363,15 +3331,10 @@ The content encoding is not UTF-8. <strong>SongUsage Plugin</strong><br />This plugin tracks the usage of songs in services. - + SongUsage - - - Songs - - SongUsagePlugin.SongUsageDeleteForm @@ -3436,96 +3399,76 @@ The content encoding is not UTF-8. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - &Show Live - &Show Live - - - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song - - - - - Delete the selected Songs - - - - - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live - - - - - Add the selected Song to the service - - - - - Add the selected Songs to the service - - - - Song Song - + Songs + + + Add + + + + + Add a new Song + + + + + Edit + Edit + + + + Edit the selected Song + + + + + Delete + Delete + + + + Delete the selected Song + + + + + Preview + Preview + + + + Preview the selected Song + + + + + Live + Live + + + + Send the selected Song live + + + + + Service + + + + + Add the selected Song to the service + + SongsPlugin.AuthorsForm @@ -3680,127 +3623,127 @@ The content encoding is not UTF-8. Comments - + Comments Theme, Copyright Info && Comments - + Theme, Copyright Info && Comments Save && Preview - Save && Preview + Save && Preview 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? - + Error - Error + Error This author is already in the list. - + This author is already in the list. No Author Selected - + No Author Selected 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. No Topic Selected - + No Topic Selected 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. - + Warning - + Warning - + You have not added any authors for this song. Do you want to add an author now? - + You have not added any authors for this song. Do you want to add an author now? - + 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. - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - + 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? Alt&ernate title: - + Alt&ernate title: &Verse order: - + &Verse order: CCLI number: - CCLI number: + CCLI number: @@ -3811,17 +3754,17 @@ The content encoding is not UTF-8. SongsPlugin.EditVerseForm - + Edit Verse Edit Verse - + &Verse type: - + &Insert @@ -3829,37 +3772,37 @@ The content encoding is not UTF-8. SongsPlugin.ImportWizardForm - + No OpenLyrics Files Selected - + You need to add at least one OpenLyrics song file to import from. - + No OpenSong Files Selected - + You need to add at least one OpenSong song file to import from. - + No CCLI Files Selected - + You need to add at least one CCLI file to import from. - + Starting import... Starting import... @@ -3944,87 +3887,87 @@ The content encoding is not UTF-8. - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files @@ -4059,10 +4002,20 @@ The content encoding is not UTF-8. - + Select CCLI Files + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4122,7 +4075,7 @@ The content encoding is not UTF-8. You must select an item to delete. - + CCLI Licence: CCLI License: @@ -4173,12 +4126,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImport - + copyright - + © © @@ -4186,12 +4139,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImportForm - + Finished import. Finished import. - + Your song import failed. diff --git a/resources/i18n/openlp_es.ts b/resources/i18n/openlp_es.ts index 11358db65..543ddbcb8 100644 --- a/resources/i18n/openlp_es.ts +++ b/resources/i18n/openlp_es.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts Alertas @@ -184,96 +184,86 @@ <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display bible verses from different sources during the service. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - Mo&star En Vivo - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible Biblia - + Bibles Biblias + + + Import + Importar + + + + Import a Bible + + + + + Add + Agregar + + + + Add a new Bible + + + + + Edit + Editar + + + + Edit the selected Bible + + + + + Delete + Eliminar + + + + Delete the selected Bible + + + + + Preview + Vista Previa + + + + Preview the selected Bible + + + + + Live + En vivo + + + + Send the selected Bible live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -664,97 +654,97 @@ Changes do not affect verses already in the service. Avanzado - + Version: Versión: - + Dual: Paralela: - + Search type: - + Find: Encontrar: - + Search Buscar - + Results: Resultados: - + Book: Libro: - + Chapter: Capítulo: - + Verse: Versículo: - + From: Desde: - + To: Hasta: - + Verse Search Búsqueda de versículo - + Text Search Búsqueda de texto - + Clear Limpiar - + Keep Conservar - + No Book Found No se encontró el libro - + No matching book could be found in this Bible. No se encuentra un libro que concuerde, en esta Biblia. - + etc - + Bible not fully loaded. @@ -771,7 +761,7 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. @@ -796,102 +786,102 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides Editar Diapositivas Personalizadas - + Move slide up one position. - + Move slide down one position. - + &Title: - + Add New Agregar Nueva - + Add a new slide at bottom. - + Edit Editar - + Edit the selected slide. - + Edit All Editar Todo - + Edit all the slides at once. - + Save Guardar - + Save the slide currently being edited. - + Delete Eliminar - + Delete the selected slide. - + Clear Limpiar - + Clear edit area Limpiar el área de edición - + Split Slide - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -936,69 +926,94 @@ Changes do not affect verses already in the service. CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - &Show Live - Mo&star En Vivo - - - - Import a Custom + Custom - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom + + Customs - Delete the selected Custom + Import + Importar + + + + Import a Custom - - Preview the selected Custom - - - - - Send the selected Custom live + + Load - Add the selected Custom to the service + Load a new Custom - - Custom + + Add + Agregar + + + + Add a new Custom + + + + + Edit + Editar + + + + Edit the selected Custom + + + + + Delete + Eliminar + + + + Delete the selected Custom + + + + + Preview + Vista Previa + + + + Preview the selected Custom + + + + + Live + En vivo + + + + Send the selected Custom live + + + + + Service + + + + + Add the selected Custom to the service @@ -1006,99 +1021,89 @@ Changes do not affect verses already in the service. 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image + <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 Images with the selected image as a background instead of the background provided by the theme. - &Show Live - Mo&star En Vivo - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - Image Imagen - + Images Imágenes + + + Load + + + + + Load a new Image + + + + + Add + Agregar + + + + Add a new Image + + + + + Edit + Editar + + + + Edit the selected Image + + + + + Delete + Eliminar + + + + Delete the selected Image + + + + + Preview + Vista Previa + + + + Preview the selected Image + + + + + Live + En vivo + + + + Send the selected Image live + + + + + Service + + + + + Add the selected Image to the service + + ImagePlugin.MediaItem @@ -1155,70 +1160,85 @@ Changes do not affect verses already in the service. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - &Show Live - Mo&star En Vivo + Media + Medios - - Import a Media - - - - - Load a new Media - - - - - Add a new Media - - - - - Edit the selected Media + + Medias + Load + + + + + Load a new Media + + + + + Add + Agregar + + + + Add a new Media + + + + + Edit + Editar + + + + Edit the selected Media + + + + + Delete + Eliminar + + + Delete the selected Media - + + Preview + Vista Previa + + + Preview the selected Media - + + Live + En vivo + + + Send the selected Media live - - Add the selected Media to the service + + Service - - Media - Medios + + Add the selected Media to the service + @@ -1809,6 +1829,19 @@ This General Public License does not permit incorporating your program into prop + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2368,117 +2401,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - + No Items Selected - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - - - - + &Edit %s - + &Delete %s - + &Preview %s - + &Show Live Mo&star En Vivo - + &Add to Service &Agregar al Servicio - + &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. - + No items selected - + You must select one or more items Usted debe seleccionar uno o más elementos - + No Service Item Selected - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. @@ -2486,57 +2484,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List Lista de Plugins - + Plugin Details Detalles de Plugin - + Version: Versión: - + TextLabel TextLabel - + About: Acerca de: - + Status: Estado: - + Active Activo - + Inactive Inactivo - + %s (Inactive) - + %s (Active) - + %s (Disabled) @@ -2772,70 +2770,70 @@ The content encoding is not UTF-8. Vista Previa - + Move to previous Regresar al anterior - + Move to next Ir al siguiente - + Hide - + Move to live Proyectar en vivo - + Edit and re-preview Song Editar y re-visualizar Canción - + Start continuous loop Iniciar bucle continuo - + Stop continuous loop Detener el bucle - + s s - + Delay between slides in seconds Espera entre diapositivas en segundos - + Start playing media Iniciar la reproducción de medios - - Go to Verse - Ir al Verso + + Go to + OpenLP.SpellTextEdit - + Spelling Suggestions - + Formatting Tags @@ -3075,95 +3073,65 @@ The content encoding is not UTF-8. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - Mo&star En Vivo - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - + Presentation Presentación - + Presentations Presentaciones + + + Load + + + + + Load a new Presentation + + + + + Delete + Eliminar + + + + Delete the selected Presentation + + + + + Preview + Vista Previa + + + + Preview the selected Presentation + + + + + Live + En vivo + + + + Send the selected Presentation live + + + + + Service + + + + + Add the selected Presentation to the service + + PresentationPlugin.MediaItem @@ -3239,12 +3207,12 @@ The content encoding is not UTF-8. - + Remote - + Remotes Remotas @@ -3315,15 +3283,10 @@ The content encoding is not UTF-8. - + SongUsage - - - Songs - Canciones - SongUsagePlugin.SongUsageDeleteForm @@ -3388,96 +3351,76 @@ The content encoding is not UTF-8. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - &Show Live - Mo&star En Vivo - - - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song - - - - - Delete the selected Songs - - - - - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live - - - - - Add the selected Song to the service - - - - - Add the selected Songs to the service - - - - Song Canción - + Songs Canciones + + + Add + Agregar + + + + Add a new Song + + + + + Edit + Editar + + + + Edit the selected Song + + + + + Delete + Eliminar + + + + Delete the selected Song + + + + + Preview + Vista Previa + + + + Preview the selected Song + + + + + Live + En vivo + + + + Send the selected Song live + + + + + Service + + + + + Add the selected Song to the service + + SongsPlugin.AuthorsForm @@ -3675,7 +3618,7 @@ The content encoding is not UTF-8. - + Error Error @@ -3720,42 +3663,42 @@ The content encoding is not UTF-8. - + You need to type in a song title. - + You need to type in at least one verse. - + Warning - + You have not added any authors for this song. Do you want to add an author now? - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - + Add Book - + This song book does not exist, do you want to add it? @@ -3763,17 +3706,17 @@ The content encoding is not UTF-8. SongsPlugin.EditVerseForm - + Edit Verse Editar Verso - + &Verse type: - + &Insert @@ -3781,127 +3724,127 @@ The content encoding is not UTF-8. SongsPlugin.ImportWizardForm - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No OpenLyrics Files Selected - + You need to add at least one OpenLyrics song file to import from. - + No OpenSong Files Selected - + You need to add at least one OpenSong song file to import from. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No CCLI Files Selected - + You need to add at least one CCLI file to import from. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select CCLI Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files - + Starting import... Iniciando importación... @@ -4015,6 +3958,16 @@ The content encoding is not UTF-8. %p% + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4089,7 +4042,7 @@ The content encoding is not UTF-8. - + CCLI Licence: Licencia CCLI: @@ -4125,12 +4078,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImport - + copyright - + © @@ -4138,12 +4091,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImportForm - + Finished import. Importación finalizada. - + Your song import failed. diff --git a/resources/i18n/openlp_et.ts b/resources/i18n/openlp_et.ts index adc325c99..e7328bfc9 100644 --- a/resources/i18n/openlp_et.ts +++ b/resources/i18n/openlp_et.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts @@ -185,95 +185,85 @@ - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - - - &Show Live - - - - + Import a Bible - - Load a new Bible - - - - + Add a new Bible - + Edit the selected Bible - + Delete the selected Bible - - Delete the selected Bibles - - - - + Preview the selected Bible - - Preview the selected Bibles - - - - + Send the selected Bible live - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - + Bible - + Bibles + + + Import + + + + + Add + + + + + Edit + + + + + Delete + + + + + Preview + + + + + Live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -664,97 +654,97 @@ Changes do not affect verses already in the service. - + Version: Versioon: - + Dual: - + Find: - + Search - + Results: - + Book: - + Chapter: - + Verse: - + From: - + To: - + Verse Search - + Text Search - + Clear - + Keep - + No Book Found - + etc - + No matching book could be found in this Bible. - + Search type: - + Bible not fully loaded. @@ -771,7 +761,7 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. @@ -796,47 +786,47 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides Kohandatud slaidide muutmine - + Add New Uue lisamine - + Edit Muuda - + Edit All Kõigi muutmine - + Save Salvesta - + Delete Kustuta - + Clear Puhasta - + Clear edit area Muutmise ala puhastamine - + Split Slide Tükelda slaid @@ -851,52 +841,52 @@ Changes do not affect verses already in the service. Viga - + Move slide down one position. - + &Title: - + Add a new slide at bottom. - + Edit the selected slide. - + Edit all the slides at once. - + Save the slide currently being edited. - + Delete the selected slide. - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -916,7 +906,7 @@ Changes do not affect verses already in the service. - + Move slide up one position. @@ -937,168 +927,183 @@ Changes do not affect verses already in the service. CustomsPlugin - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - - - &Show Live - - - - + Import a Custom - + Load a new Custom - + Add a new Custom - + Edit the selected Custom - + Delete the selected Custom - + Preview the selected Custom - + Send the selected Custom live - + Add the selected Custom to the service - + Custom + + + Customs + + + + + Import + + + + + Load + + + + + Add + + + + + Edit + + + + + Delete + + + + + Preview + + + + + Live + + + + + Service + + 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image - - - - - &Show Live - - - - - Import a Image - - - - + Load a new Image - + Add a new Image - + Edit the selected Image - + Delete the selected Image - - Delete the selected Images - - - - + Preview the selected Image - - Preview the selected Images - - - - + Send the selected Image live - - Send the selected Images live - - - - + Add the selected Image to the service - - Add the selected Images to the service - - - - + Image Pilt - + Images + + + <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 Images with the selected image as a background instead of the background provided by the theme. + + + + + Load + + + + + Add + + + + + Edit + + + + + Delete + + + + + Preview + + + + + Live + + + + + Service + + ImagePlugin.MediaItem @@ -1156,70 +1161,85 @@ Changes do not affect verses already in the service. - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - - - &Show Live - - - - - Import a Media - - - - + Load a new Media - + Add a 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 - + Media + + + Medias + + + + + Load + + + + + Add + + + + + Edit + + + + + Delete + + + + + Preview + + + + + Live + + + + + Service + + MediaPlugin.MediaItem @@ -1815,6 +1835,19 @@ Built With + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2374,117 +2407,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - - - - + &Edit %s - + &Delete %s - + &Preview %s - + &Show Live &Kuva ekraanil - + &Add to Service &Lisa teenistusele - + &Add to selected Service Item &Lisa valitud teenistuse elemendile - + No Items Selected Ühtegi elementi pole valitud - + 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. Pead valima vähemalt ühe elemendi. - + No items selected Ühtegi elementi pole valitud - + You must select one or more items Pead valima vähemalt ühe elemendi - + No Service Item Selected Ühtegi teenistuse elementi pole valitud - + 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. @@ -2492,57 +2490,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List Pluginate loend - + Plugin Details Plugina andmed - + Version: Versioon: - + TextLabel TekstiPealdis - + About: Kirjeldus: - + Status: Olek: - + Active Aktiivne - + Inactive Pole aktiivne - + %s (Inactive) - + %s (Active) - + %s (Disabled) @@ -2778,70 +2776,70 @@ The content encoding is not UTF-8. Eelvaade - + Move to previous Eelmisele liikumine - + Move to next Liikumine järgmisele - + Hide - + Move to live Tõsta ekraanile - + Edit and re-preview Song Muuda ja kuva laulu eelvaade uuesti - + Start continuous loop Katkematu korduse alustamine - + Stop continuous loop Katkematu korduse lõpetamine - + s s - + Delay between slides in seconds Viivitus slaidide vahel sekundites - + Start playing media Meediaesituse alustamine - - Go to Verse - Liikumine salmile + + Go to + OpenLP.SpellTextEdit - + Spelling Suggestions - + Formatting Tags @@ -3081,95 +3079,65 @@ The content encoding is not UTF-8. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - - - - - Import a Presentation - - - - + Load a new Presentation - - Add a new Presentation - - - - - Edit the selected Presentation - - - - + Delete the selected Presentation - - Delete the selected Presentations - - - - + Preview the selected Presentation - - Preview the selected Presentations - - - - + Send the selected Presentation live - - Send the selected Presentations live - - - - + Add the selected Presentation to the service - - Add the selected Presentations to the service - - - - + Presentation - + Presentations + + + Load + + + + + Delete + + + + + Preview + + + + + Live + + + + + Service + + PresentationPlugin.MediaItem @@ -3245,12 +3213,12 @@ The content encoding is not UTF-8. - + Remote - + Remotes @@ -3321,15 +3289,10 @@ The content encoding is not UTF-8. - + SongUsage - - - Songs - - SongUsagePlugin.SongUsageDeleteForm @@ -3395,95 +3358,75 @@ The content encoding is not UTF-8. - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - - - &Show Live - - - - - Import a Song - - - - - Load a new Song - - - - + Add a new Song - + Edit the selected Song - + Delete the selected Song - - Delete the selected Songs - - - - + Preview the selected Song - - Preview the selected Songs - - - - + Send the selected Song live - - Send the selected Songs live - - - - + Add the selected Song to the service - - Add the selected Songs to the service - - - - + Song - + Songs + + + Add + + + + + Edit + + + + + Delete + + + + + Preview + + + + + Live + + + + + Service + + SongsPlugin.AuthorsForm @@ -3666,17 +3609,17 @@ The content encoding is not UTF-8. - + Add Book - + This song book does not exist, do you want to add it? - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. @@ -3696,32 +3639,32 @@ The content encoding is not UTF-8. - + Error Viga - + You need to type in a song title. - + You need to type in at least one verse. - + Warning - + You have not added any authors for this song. Do you want to add an author now? - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? @@ -3769,17 +3712,17 @@ The content encoding is not UTF-8. SongsPlugin.EditVerseForm - + Edit Verse - + &Verse type: - + &Insert @@ -3787,32 +3730,32 @@ The content encoding is not UTF-8. SongsPlugin.ImportWizardForm - + No OpenLyrics Files Selected - + You need to add at least one OpenLyrics song file to import from. - + No OpenSong Files Selected - + You need to add at least one OpenSong song file to import from. - + No CCLI Files Selected - + You need to add at least one CCLI file to import from. @@ -3897,92 +3840,92 @@ The content encoding is not UTF-8. - + Starting import... - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files @@ -4017,10 +3960,20 @@ The content encoding is not UTF-8. - + Select CCLI Files + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4065,7 +4018,7 @@ The content encoding is not UTF-8. - + CCLI Licence: @@ -4131,12 +4084,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImport - + copyright - + © @@ -4144,12 +4097,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImportForm - + Finished import. - + Your song import failed. diff --git a/resources/i18n/openlp_hu.ts b/resources/i18n/openlp_hu.ts index 09cbf481e..5d9cf2804 100644 --- a/resources/i18n/openlp_hu.ts +++ b/resources/i18n/openlp_hu.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts Figyelmeztetések @@ -184,96 +184,86 @@ <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display bible verses from different sources during the service. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - Egyenes &adásba - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible Biblia - + Bibles Bibliák + + + Import + Importálás + + + + Import a Bible + + + + + Add + Hozzáadás + + + + Add a new Bible + + + + + Edit + Szerkesztés + + + + Edit the selected Bible + + + + + Delete + Törlés + + + + Delete the selected Bible + + + + + Preview + Előnézet + + + + Preview the selected Bible + + + + + Live + Egyenes adás + + + + Send the selected Bible live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -664,97 +654,97 @@ Changes do not affect verses already in the service. Haladó - + Version: Verzió: - + Dual: Második: - + Search type: - + Find: Keresés: - + Search Keresés - + Results: Eredmények: - + Book: Könyv: - + Chapter: Fejezet: - + Verse: Vers: - + From: Innentől: - + To: Idáig: - + Verse Search Vers keresése - + Text Search Szöveg keresése - + Clear - + Keep Megtartása - + No Book Found Nincs ilyen könyv - + No matching book could be found in this Bible. Nem található ilyen könyv ebben a Bibliában. - + etc - + Bible not fully loaded. @@ -771,7 +761,7 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. @@ -796,102 +786,102 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides Egyedi diák szerkesztése - + Move slide up one position. - + Move slide down one position. - + &Title: - + Add New Új hozzáadása - + Add a new slide at bottom. - + Edit Szerkesztés - + Edit the selected slide. - + Edit All Összes szerkesztése - + Edit all the slides at once. - + Save Mentés - + Save the slide currently being edited. - + Delete Törlés - + Delete the selected slide. - + Clear - + Clear edit area Szerkesztő terület törlése - + Split Slide Dia kettéválasztása - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -936,169 +926,184 @@ Changes do not affect verses already in the service. CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - &Show Live - Egyenes &adásba + Custom + Egyedi - - Import a Custom - - - - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom + + Customs - Delete the selected Custom + Import + Importálás + + + + Import a Custom - - Preview the selected Custom - - - - - Send the selected Custom live + + Load - Add the selected Custom to the service + Load a new Custom - - Custom - Egyedi + + Add + Hozzáadás + + + + Add a new Custom + + + + + Edit + Szerkesztés + + + + Edit the selected Custom + + + + + Delete + Törlés + + + + Delete the selected Custom + + + + + Preview + Előnézet + + + + Preview the selected Custom + + + + + Live + Egyenes adás + + + + Send the selected Custom live + + + + + Service + + + + + Add the selected Custom to the service + 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image + <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 Images with the selected image as a background instead of the background provided by the theme. - &Show Live - Egyenes &adásba - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - Image Kép - + Images Képek + + + Load + + + + + Load a new Image + + + + + Add + Hozzáadás + + + + Add a new Image + + + + + Edit + Szerkesztés + + + + Edit the selected Image + + + + + Delete + Törlés + + + + Delete the selected Image + + + + + Preview + Előnézet + + + + Preview the selected Image + + + + + Live + Egyenes adás + + + + Send the selected Image live + + + + + Service + + + + + Add the selected Image to the service + + ImagePlugin.MediaItem @@ -1155,70 +1160,85 @@ Changes do not affect verses already in the service. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - &Show Live - Egyenes &adásba + Media + Média - - Import a Media - - - - - Load a new Media - - - - - Add a new Media - - - - - Edit the selected Media + + Medias + Load + + + + + Load a new Media + + + + + Add + Hozzáadás + + + + Add a new Media + + + + + Edit + Szerkesztés + + + + Edit the selected Media + + + + + Delete + Törlés + + + Delete the selected Media - + + Preview + Előnézet + + + Preview the selected Media - + + Live + Egyenes adás + + + Send the selected Media live - - Add the selected Media to the service + + Service - - Media - Média + + Add the selected Media to the service + @@ -1942,6 +1962,19 @@ A GNU General Public License nem engedi meg, hogy a program része legyen szelle + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2501,117 +2534,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - + No Items Selected Nincs kiválasztott elem - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - - - - + &Edit %s - + &Delete %s - + &Preview %s - + &Show Live Egyenes &adásba - + &Add to Service &Hozzáadás a szolgálathoz - + &Add to selected Service Item &Hozzáadás a kiválasztott szolgálat elemhez - + 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. Ki kell választani egy vagy több elemet. - + No items selected Nincs kiválasztott elem - + You must select one or more items Ki kell választani egy vagy több elemet - + No Service Item Selected Nincs kiválasztott szolgálat elem - + You must select an existing service item to add to. Ki kell választani egy szolgálati elemet, amihez hozzá szeretné adni. - + Invalid Service Item Érvénytelen szolgálat elem - + You must select a %s service item. @@ -2619,57 +2617,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List Bővítménylista - + Plugin Details Bővítmény részletei - + Version: Verzió: - + TextLabel Szövegcímke - + About: Névjegy: - + Status: Állapot: - + Active Aktív - + Inactive Inaktív - + %s (Inactive) - + %s (Active) - + %s (Disabled) @@ -2905,70 +2903,70 @@ The content encoding is not UTF-8. Előnézet - + Move to previous Mozgatás az előzőre - + Move to next Mozgatás a következőre - + Hide - + Move to live Mozgatás az egyenes adásban lévőre - + Edit and re-preview Song Dal szerkesztése, majd újra az előnézet megnyitása - + Start continuous loop Folyamatos vetítés indítása - + Stop continuous loop Folyamatos vetítés leállítása - + s mp - + Delay between slides in seconds Diák közötti késleltetés másodpercben - + Start playing media Médialejátszás indítása - - Go to Verse - Ugrás versszakra + + Go to + OpenLP.SpellTextEdit - + Spelling Suggestions - + Formatting Tags @@ -3208,95 +3206,65 @@ The content encoding is not UTF-8. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - Egyenes &adásba - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - + Presentation Bemutató - + Presentations Bemutatók + + + Load + + + + + Load a new Presentation + + + + + Delete + Törlés + + + + Delete the selected Presentation + + + + + Preview + Előnézet + + + + Preview the selected Presentation + + + + + Live + Egyenes adás + + + + Send the selected Presentation live + + + + + Service + + + + + Add the selected Presentation to the service + + PresentationPlugin.MediaItem @@ -3372,12 +3340,12 @@ The content encoding is not UTF-8. - + Remote - + Remotes Távvezérlés @@ -3448,15 +3416,10 @@ The content encoding is not UTF-8. - + SongUsage - - - Songs - Dalok - SongUsagePlugin.SongUsageDeleteForm @@ -3521,96 +3484,76 @@ The content encoding is not UTF-8. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - &Show Live - Egyenes &adásba - - - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song - - - - - Delete the selected Songs - - - - - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live - - - - - Add the selected Song to the service - - - - - Add the selected Songs to the service - - - - Song Dal - + Songs Dalok + + + Add + Hozzáadás + + + + Add a new Song + + + + + Edit + Szerkesztés + + + + Edit the selected Song + + + + + Delete + Törlés + + + + Delete the selected Song + + + + + Preview + Előnézet + + + + Preview the selected Song + + + + + Live + Egyenes adás + + + + Send the selected Song live + + + + + Service + + + + + Add the selected Song to the service + + SongsPlugin.AuthorsForm @@ -3808,7 +3751,7 @@ The content encoding is not UTF-8. - + Error Hiba @@ -3853,42 +3796,42 @@ The content encoding is not UTF-8. - + You need to type in a song title. - + You need to type in at least one verse. - + Warning - + You have not added any authors for this song. Do you want to add an author now? - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - + Add Book - + This song book does not exist, do you want to add it? @@ -3896,17 +3839,17 @@ The content encoding is not UTF-8. SongsPlugin.EditVerseForm - + Edit Verse Versszak szerkesztése - + &Verse type: - + &Insert @@ -3914,127 +3857,127 @@ The content encoding is not UTF-8. SongsPlugin.ImportWizardForm - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No OpenLyrics Files Selected Nincsenek kijelölt OpenLyrics fájlok - + You need to add at least one OpenLyrics song file to import from. Meg kell adni legalább egy OpenLyrics dal fájlt az importáláshoz. - + No OpenSong Files Selected Nincsenek kijelölt OpenSong fájlok - + You need to add at least one OpenSong song file to import from. Meg kell adni legalább egy OpenSong dal fájlt az importáláshoz. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No CCLI Files Selected Nincsenek kijelölt CCLI fájlok - + You need to add at least one CCLI file to import from. Meg kell adni legalább egy CCLI fájlt az importáláshoz. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select CCLI Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files - + Starting import... Importálás indítása... @@ -4148,6 +4091,16 @@ The content encoding is not UTF-8. %p% + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4222,7 +4175,7 @@ The content encoding is not UTF-8. - + CCLI Licence: CCLI licenc: @@ -4258,12 +4211,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImport - + copyright - + © @@ -4271,12 +4224,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImportForm - + Finished import. Az importálás befejeződött. - + Your song import failed. diff --git a/resources/i18n/openlp_ko.ts b/resources/i18n/openlp_ko.ts index 93accb132..e0905186f 100644 --- a/resources/i18n/openlp_ko.ts +++ b/resources/i18n/openlp_ko.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts @@ -184,96 +184,86 @@ <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display bible verses from different sources during the service. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible 성경 - + Bibles + + + Import + + + + + Import a Bible + + + + + Add + + + + + Add a new Bible + + + + + Edit + + + + + Edit the selected Bible + + + + + Delete + + + + + Delete the selected Bible + + + + + Preview + + + + + Preview the selected Bible + + + + + Live + + + + + Send the selected Bible live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -664,97 +654,97 @@ Changes do not affect verses already in the service. - + Version: - + Dual: - + Search type: - + Find: - + Search - + Results: - + Book: - + Chapter: - + Verse: - + From: - + To: - + Verse Search - + Text Search - + Clear - + Keep - + No Book Found - + No matching book could be found in this Bible. - + etc - + Bible not fully loaded. @@ -771,7 +761,7 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. @@ -796,102 +786,102 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides - + Move slide up one position. - + Move slide down one position. - + &Title: - + Add New - + Add a new slide at bottom. - + Edit - + Edit the selected slide. - + Edit All - + Edit all the slides at once. - + Save - + Save the slide currently being edited. - + Delete - + Delete the selected slide. - + Clear - + Clear edit area - + Split Slide - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -936,69 +926,94 @@ Changes do not affect verses already in the service. CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - &Show Live + Custom - - Import a Custom - - - - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom + + Customs - Delete the selected Custom + Import - - Preview the selected Custom + + Import a Custom - - Send the selected Custom live + + Load - Add the selected Custom to the service + Load a new Custom - - Custom + + Add + + + + + Add a new Custom + + + + + Edit + + + + + Edit the selected Custom + + + + + Delete + + + + + Delete the selected Custom + + + + + Preview + + + + + Preview the selected Custom + + + + + Live + + + + + Send the selected Custom live + + + + + Service + + + + + Add the selected Custom to the service @@ -1006,99 +1021,89 @@ Changes do not affect verses already in the service. 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image + <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 Images with the selected image as a background instead of the background provided by the theme. - &Show Live - - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - Image - + Images + + + Load + + + + + Load a new Image + + + + + Add + + + + + Add a new Image + + + + + Edit + + + + + Edit the selected Image + + + + + Delete + + + + + Delete the selected Image + + + + + Preview + + + + + Preview the selected Image + + + + + Live + + + + + Send the selected Image live + + + + + Service + + + + + Add the selected Image to the service + + ImagePlugin.MediaItem @@ -1155,69 +1160,84 @@ Changes do not affect verses already in the service. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - &Show Live + Media - - Import a Media - - - - - Load a new Media - - - - - Add a new Media - - - - - Edit the selected Media + + Medias - Delete the selected Media + Load - - Preview the selected Media + + Load a new Media - - Send the selected Media live + + Add - Add the selected Media to the service + Add a new Media - - Media + + Edit + + + + + Edit the selected Media + + + + + Delete + + + + + Delete the selected Media + + + + + Preview + + + + + Preview the selected Media + + + + + Live + + + + + Send the selected Media live + + + + + Service + + + + + Add the selected Media to the service @@ -1809,6 +1829,19 @@ This General Public License does not permit incorporating your program into prop + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2368,117 +2401,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - + No Items Selected - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - - - - + &Edit %s - + &Delete %s - + &Preview %s - + &Show Live - + &Add to Service - + &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. - + No items selected - + You must select one or more items - + No Service Item Selected - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. @@ -2486,57 +2484,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List - + Plugin Details - + Version: - + TextLabel - + About: - + Status: - + Active - + Inactive - + %s (Inactive) - + %s (Active) - + %s (Disabled) @@ -2772,70 +2770,70 @@ The content encoding is not UTF-8. - + Move to previous - + Move to next - + Hide - + Move to live - + Edit and re-preview Song - + Start continuous loop - + Stop continuous loop - + s - + Delay between slides in seconds - + Start playing media - - Go to Verse + + Go to OpenLP.SpellTextEdit - + Spelling Suggestions - + Formatting Tags @@ -3075,95 +3073,65 @@ The content encoding is not UTF-8. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - + Presentation - + Presentations + + + Load + + + + + Load a new Presentation + + + + + Delete + + + + + Delete the selected Presentation + + + + + Preview + + + + + Preview the selected Presentation + + + + + Live + + + + + Send the selected Presentation live + + + + + Service + + + + + Add the selected Presentation to the service + + PresentationPlugin.MediaItem @@ -3239,12 +3207,12 @@ The content encoding is not UTF-8. - + Remote - + Remotes @@ -3315,15 +3283,10 @@ The content encoding is not UTF-8. - + SongUsage - - - Songs - - SongUsagePlugin.SongUsageDeleteForm @@ -3388,96 +3351,76 @@ The content encoding is not UTF-8. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - &Show Live - - - - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song - - - - - Delete the selected Songs - - - - - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live - - - - - Add the selected Song to the service - - - - - Add the selected Songs to the service - - - - Song - + Songs + + + Add + + + + + Add a new Song + + + + + Edit + + + + + Edit the selected Song + + + + + Delete + + + + + Delete the selected Song + + + + + Preview + + + + + Preview the selected Song + + + + + Live + + + + + Send the selected Song live + + + + + Service + + + + + Add the selected Song to the service + + SongsPlugin.AuthorsForm @@ -3675,7 +3618,7 @@ The content encoding is not UTF-8. - + Error @@ -3720,42 +3663,42 @@ The content encoding is not UTF-8. - + You need to type in a song title. - + You need to type in at least one verse. - + Warning - + You have not added any authors for this song. Do you want to add an author now? - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - + Add Book - + This song book does not exist, do you want to add it? @@ -3763,17 +3706,17 @@ The content encoding is not UTF-8. SongsPlugin.EditVerseForm - + Edit Verse - + &Verse type: - + &Insert @@ -3781,127 +3724,127 @@ The content encoding is not UTF-8. SongsPlugin.ImportWizardForm - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No OpenLyrics Files Selected - + You need to add at least one OpenLyrics song file to import from. - + No OpenSong Files Selected - + You need to add at least one OpenSong song file to import from. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No CCLI Files Selected - + You need to add at least one CCLI file to import from. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select CCLI Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files - + Starting import... @@ -4015,6 +3958,16 @@ The content encoding is not UTF-8. %p% + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4089,7 +4042,7 @@ The content encoding is not UTF-8. - + CCLI Licence: @@ -4125,12 +4078,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImport - + copyright - + © @@ -4138,12 +4091,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImportForm - + Finished import. - + Your song import failed. diff --git a/resources/i18n/openlp_nb.ts b/resources/i18n/openlp_nb.ts index 80ff69b28..bf8d38b9c 100644 --- a/resources/i18n/openlp_nb.ts +++ b/resources/i18n/openlp_nb.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts @@ -184,96 +184,86 @@ <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display bible verses from different sources during the service. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible Bibel - + Bibles Bibler + + + Import + + + + + Import a Bible + + + + + Add + + + + + Add a new Bible + + + + + Edit + + + + + Edit the selected Bible + + + + + Delete + + + + + Delete the selected Bible + + + + + Preview + + + + + Preview the selected Bible + + + + + Live + Direkte + + + + Send the selected Bible live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -664,97 +654,97 @@ Changes do not affect verses already in the service. Avansert - + Version: - + Dual: Dobbel: - + Search type: - + Find: Finn: - + Search Søk - + Results: Resultat: - + Book: Bok: - + Chapter: Kapittel - + Verse: - + From: Fra: - + To: Til: - + Verse Search Søk i vers - + Text Search Tekstsøk - + Clear - + Keep Behold - + No Book Found Ingen bøker funnet - + No matching book could be found in this Bible. Finner ingen matchende bøker i denne Bibelen. - + etc - + Bible not fully loaded. @@ -771,7 +761,7 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. @@ -796,102 +786,102 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides Rediger egendefinerte lysbilder - + Move slide up one position. - + Move slide down one position. - + &Title: - + Add New Legg til Ny - + Add a new slide at bottom. - + Edit - + Edit the selected slide. - + Edit All - + Edit all the slides at once. - + Save Lagre - + Save the slide currently being edited. - + Delete - + Delete the selected slide. - + Clear - + Clear edit area - + Split Slide - + Split a slide into two by inserting a slide splitter. - + The&me: - + &Credits: @@ -936,69 +926,94 @@ Changes do not affect verses already in the service. CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - &Show Live + Custom - - Import a Custom - - - - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom + + Customs - Delete the selected Custom + Import - - Preview the selected Custom + + Import a Custom - - Send the selected Custom live + + Load - Add the selected Custom to the service + Load a new Custom - - Custom + + Add + + + + + Add a new Custom + + + + + Edit + + + + + Edit the selected Custom + + + + + Delete + + + + + Delete the selected Custom + + + + + Preview + + + + + Preview the selected Custom + + + + + Live + Direkte + + + + Send the selected Custom live + + + + + Service + + + + + Add the selected Custom to the service @@ -1006,99 +1021,89 @@ Changes do not affect verses already in the service. 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image + <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 Images with the selected image as a background instead of the background provided by the theme. - &Show Live - - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - Image - + Images + + + Load + + + + + Load a new Image + + + + + Add + + + + + Add a new Image + + + + + Edit + + + + + Edit the selected Image + + + + + Delete + + + + + Delete the selected Image + + + + + Preview + + + + + Preview the selected Image + + + + + Live + Direkte + + + + Send the selected Image live + + + + + Service + + + + + Add the selected Image to the service + + ImagePlugin.MediaItem @@ -1155,69 +1160,84 @@ Changes do not affect verses already in the service. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - &Show Live + Media - - Import a Media - - - - - Load a new Media - - - - - Add a new Media - - - - - Edit the selected Media + + Medias - Delete the selected Media + Load - - Preview the selected Media + + Load a new Media - - Send the selected Media live + + Add - Add the selected Media to the service + Add a new Media - - Media + + Edit + + + + + Edit the selected Media + + + + + Delete + + + + + Delete the selected Media + + + + + Preview + + + + + Preview the selected Media + + + + + Live + Direkte + + + + Send the selected Media live + + + + + Service + + + + + Add the selected Media to the service @@ -1809,6 +1829,19 @@ This General Public License does not permit incorporating your program into prop + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2368,117 +2401,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - + No Items Selected - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - - - - + &Edit %s - + &Delete %s - + &Preview %s - + &Show Live - + &Add to Service &Legg til i møteplan - + &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. - + No items selected - + You must select one or more items - + No Service Item Selected - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. @@ -2486,57 +2484,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List - + Plugin Details - + Version: - + TextLabel - + About: Om: - + Status: Status: - + Active Aktiv - + Inactive - + %s (Inactive) - + %s (Active) - + %s (Disabled) @@ -2772,70 +2770,70 @@ The content encoding is not UTF-8. - + Move to previous Flytt til forrige - + Move to next - + Hide - + Move to live - + Edit and re-preview Song Endre og forhåndsvis sang - + Start continuous loop Start kontinuerlig løkke - + Stop continuous loop - + s - + Delay between slides in seconds Forsinkelse mellom lysbilder i sekund - + Start playing media Start avspilling av media - - Go to Verse - Gå til vers + + Go to + OpenLP.SpellTextEdit - + Spelling Suggestions - + Formatting Tags @@ -3075,112 +3073,82 @@ The content encoding is not UTF-8. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - + Presentation Presentasjon - + Presentations + + + Load + + + + + Load a new Presentation + + + + + Delete + + + + + Delete the selected Presentation + + + + + Preview + + + + + Preview the selected Presentation + + + + + Live + Direkte + + + + Send the selected Presentation live + + + + + Service + + + + + Add the selected Presentation to the service + + PresentationPlugin.MediaItem Select Presentation(s) - Velg presentasjon(er) + Automatic - Automatisk + Present using: - Presenter ved hjelp av: + @@ -3223,7 +3191,7 @@ The content encoding is not UTF-8. Advanced - Avansert + @@ -3239,14 +3207,14 @@ The content encoding is not UTF-8. - + Remote - + Remotes - Fjernmeldinger + @@ -3254,7 +3222,7 @@ The content encoding is not UTF-8. Remotes - Fjernmeldinger + @@ -3315,15 +3283,10 @@ The content encoding is not UTF-8. - + SongUsage - - - Songs - Sanger - SongUsagePlugin.SongUsageDeleteForm @@ -3353,12 +3316,12 @@ The content encoding is not UTF-8. Select Date Range - Velg dato-område + to - til + @@ -3376,7 +3339,7 @@ The content encoding is not UTF-8. &Song - &Sang + @@ -3388,95 +3351,75 @@ The content encoding is not UTF-8. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - &Show Live + Song - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song + + Songs - Delete the selected Songs + Add - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live + Add a new Song - Add the selected Song to the service + Edit - Add the selected Songs to the service + Edit the selected Song - - Song - Sang + + Delete + - - Songs - Sanger + + Delete the selected Song + + + + + Preview + + + + + Preview the selected Song + + + + + Live + Direkte + + + + Send the selected Song live + + + + + Service + + + + + Add the selected Song to the service + @@ -3484,7 +3427,7 @@ The content encoding is not UTF-8. Author Maintenance - Behandle forfatterdata + @@ -3494,12 +3437,12 @@ The content encoding is not UTF-8. First name: - Fornavn: + Last name: - Etternavn: + @@ -3509,7 +3452,7 @@ The content encoding is not UTF-8. You need to type in the first name of the author. - Du må skrive inn forfatterens fornavn. + @@ -3527,7 +3470,7 @@ The content encoding is not UTF-8. Song Editor - Sangredigeringsverktøy + @@ -3557,7 +3500,7 @@ The content encoding is not UTF-8. &Edit - &Rediger + @@ -3572,7 +3515,7 @@ The content encoding is not UTF-8. Title && Lyrics - Tittel && Sangtekst + @@ -3587,7 +3530,7 @@ The content encoding is not UTF-8. &Remove - &Fjern + @@ -3597,7 +3540,7 @@ The content encoding is not UTF-8. Topic - Emne + @@ -3607,7 +3550,7 @@ The content encoding is not UTF-8. R&emove - &Fjern + @@ -3627,7 +3570,7 @@ The content encoding is not UTF-8. Theme - Tema + @@ -3637,7 +3580,7 @@ The content encoding is not UTF-8. Copyright Information - Copyright-informasjon + @@ -3675,7 +3618,7 @@ The content encoding is not UTF-8. - + Error @@ -3720,42 +3663,42 @@ The content encoding is not UTF-8. - + You need to type in a song title. - + You need to type in at least one verse. - + Warning - + You have not added any authors for this song. Do you want to add an author now? - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - + Add Book - + This song book does not exist, do you want to add it? @@ -3763,17 +3706,17 @@ The content encoding is not UTF-8. SongsPlugin.EditVerseForm - + Edit Verse - Rediger Vers + - + &Verse type: - + &Insert @@ -3781,127 +3724,127 @@ The content encoding is not UTF-8. SongsPlugin.ImportWizardForm - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No OpenLyrics Files Selected - + You need to add at least one OpenLyrics song file to import from. - + No OpenSong Files Selected - + You need to add at least one OpenSong song file to import from. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No CCLI Files Selected - + You need to add at least one CCLI file to import from. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select CCLI Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files - + Starting import... @@ -3923,7 +3866,7 @@ The content encoding is not UTF-8. Select Import Source - Velg importeringskilde + @@ -3933,12 +3876,12 @@ The content encoding is not UTF-8. Format: - Format: + OpenLP 2.0 - OpenLP 2.0 + @@ -3953,7 +3896,7 @@ The content encoding is not UTF-8. OpenSong - OpenSong + @@ -4008,13 +3951,23 @@ The content encoding is not UTF-8. Ready. - Klar. + %p% + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4026,17 +3979,17 @@ The content encoding is not UTF-8. Maintain the lists of authors, topics and books - Rediger liste over forfattere, emner og bøker. + Search: - Søk: + Type: - Type: + @@ -4046,12 +3999,12 @@ The content encoding is not UTF-8. Search - Søk + Titles - Titler + @@ -4089,9 +4042,9 @@ The content encoding is not UTF-8. - + CCLI Licence: - CCLI lisens: + @@ -4125,12 +4078,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImport - + copyright - + © @@ -4138,12 +4091,12 @@ The content encoding is not UTF-8. SongsPlugin.SongImportForm - + Finished import. - Import fullført. + - + Your song import failed. @@ -4163,7 +4116,7 @@ The content encoding is not UTF-8. Topics - Emne + @@ -4178,7 +4131,7 @@ The content encoding is not UTF-8. &Edit - &Rediger + @@ -4243,7 +4196,7 @@ The content encoding is not UTF-8. Are you sure you want to delete the selected author? - Er du sikker på at du vil slette den valgte forfatteren? + @@ -4253,12 +4206,12 @@ The content encoding is not UTF-8. No author selected! - Ingen forfatter er valgt! + Delete Topic - Slett emne + @@ -4278,12 +4231,12 @@ The content encoding is not UTF-8. Delete Book - Slett bok + Are you sure you want to delete the selected book? - Er du sikker på at du vil slette den merkede boken? + @@ -4293,7 +4246,7 @@ The content encoding is not UTF-8. No book selected! - Ingen bok er valgt! + @@ -4301,7 +4254,7 @@ The content encoding is not UTF-8. Songs - Sanger + @@ -4329,7 +4282,7 @@ The content encoding is not UTF-8. Topic name: - Emnenavn: + @@ -4339,7 +4292,7 @@ The content encoding is not UTF-8. You need to type in a topic name! - Skriv inn et emnenavn! + @@ -4347,7 +4300,7 @@ The content encoding is not UTF-8. Verse - Vers + @@ -4362,7 +4315,7 @@ The content encoding is not UTF-8. Pre-Chorus - Pre-Chorus + @@ -4377,7 +4330,7 @@ The content encoding is not UTF-8. Other - Annet + diff --git a/resources/i18n/openlp_pt_BR.ts b/resources/i18n/openlp_pt_BR.ts index c5a331423..c72283199 100644 --- a/resources/i18n/openlp_pt_BR.ts +++ b/resources/i18n/openlp_pt_BR.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts Alertas @@ -184,96 +184,86 @@ <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 />Este plugin permite exibir versículos bíblicos de diferentes fontes durante o culto. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - &Mostrar Ao Vivo - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible Bíblia - + Bibles Bíblias + + + Import + Importar + + + + Import a Bible + + + + + Add + Adicionar + + + + Add a new Bible + + + + + Edit + Editar + + + + Edit the selected Bible + + + + + Delete + Deletar + + + + Delete the selected Bible + + + + + Preview + + + + + Preview the selected Bible + + + + + Live + Ao Vivo + + + + Send the selected Bible live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -664,97 +654,97 @@ Changes do not affect verses already in the service. Avançado - + Version: Versão: - + Dual: Duplo: - + Search type: Tipo de busca: - + Find: Buscar: - + Search Buscar - + Results: Resultados: - + Book: Livro: - + Chapter: Capítulo: - + Verse: Versículo: - + From: De: - + To: Para: - + Verse Search Busca de Versículos - + Text Search Busca de Texto - + Clear Limpar - + Keep Manter - + No Book Found Nenhum Livro Encontrado - + No matching book could be found in this Bible. Nenhum livro foi encontrado nesta Bíblia - + etc - + Bible not fully loaded. @@ -771,7 +761,7 @@ Changes do not affect verses already in the service. CustomPlugin - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. + <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way Customs are. This plugin provides greater freedom over the Customs plugin. @@ -796,102 +786,102 @@ Changes do not affect verses already in the service. CustomPlugin.EditCustomForm - + Edit Custom Slides Editar Slides Customizados - + Move slide up one position. - + Move slide down one position. Mover slide uma posição para baixo. - + &Title: &Título: - + Add New Adicionar Novo - + Add a new slide at bottom. - + Edit Editar - + Edit the selected slide. Editar o slide selecionado. - + Edit All Editar Todos - + Edit all the slides at once. - + Save Salvar - + Save the slide currently being edited. - + Delete Deletar - + Delete the selected slide. - + Clear Limpar - + Clear edit area Limpar área de edição - + Split Slide - + Split a slide into two by inserting a slide splitter. Dividir um slide em dois, inserindo um divisor de slides. - + The&me: - + &Credits: &Créditos: @@ -936,169 +926,184 @@ Changes do not affect verses already in the service. CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - &Show Live - &Mostrar Ao Vivo + Custom + Customizado - - Import a Custom - - - - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom + + Customs - Delete the selected Custom + Import + Importar + + + + Import a Custom - - Preview the selected Custom - - - - - Send the selected Custom live + + Load - Add the selected Custom to the service + Load a new Custom - - Custom - Customizado + + Add + Adicionar + + + + Add a new Custom + + + + + Edit + Editar + + + + Edit the selected Custom + + + + + Delete + Deletar + + + + Delete the selected Custom + + + + + Preview + + + + + Preview the selected Custom + + + + + Live + Ao Vivo + + + + Send the selected Custom live + + + + + Service + + + + + Add the selected Custom to the service + 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image + <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 Images with the selected image as a background instead of the background provided by the theme. - &Show Live - &Mostrar Ao Vivo - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - Image Imagem - + Images Imagens + + + Load + + + + + Load a new Image + + + + + Add + Adicionar + + + + Add a new Image + + + + + Edit + Editar + + + + Edit the selected Image + + + + + Delete + Deletar + + + + Delete the selected Image + + + + + Preview + + + + + Preview the selected Image + + + + + Live + Ao Vivo + + + + Send the selected Image live + + + + + Service + + + + + Add the selected Image to the service + + ImagePlugin.MediaItem @@ -1155,70 +1160,85 @@ Changes do not affect verses already in the service. <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - &Show Live - &Mostrar Ao Vivo + Media + Mídia - - Import a Media - - - - - Load a new Media - - - - - Add a new Media - - - - - Edit the selected Media + + Medias + Load + + + + + Load a new Media + + + + + Add + Adicionar + + + + Add a new Media + + + + + Edit + Editar + + + + Edit the selected Media + + + + + Delete + Deletar + + + Delete the selected Media - + + Preview + + + + Preview the selected Media - + + Live + Ao Vivo + + + Send the selected Media live - - Add the selected Media to the service + + Service - - Media - Mídia + + Add the selected Media to the service + @@ -1846,6 +1866,19 @@ This General Public License does not permit incorporating your program into prop + + OpenLP.ExceptionDialog + + + Error Occured + + + + + 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.GeneralTab @@ -2405,117 +2438,82 @@ You can download the latest version from http://openlp.org/. OpenLP.MediaManagerItem - + No Items Selected - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - Adicionar %s ao Culto - - - + &Edit %s - + &Delete %s &Deletar %s - + &Preview %s - + &Show Live &Mostrar Ao Vivo - + &Add to Service &Adicionar ao Culto - + &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. Você precisa selecionar um ou mais itens. - + No items selected - + You must select one or more items Você precisa selecionar um ou mais itens - + No Service Item Selected - + You must select an existing service item to add to. - + Invalid Service Item - + You must select a %s service item. @@ -2523,57 +2521,57 @@ You can download the latest version from http://openlp.org/. OpenLP.PluginForm - + Plugin List Lista de Plugins - + Plugin Details Detalhes do Plugin - + Version: Versão: - + TextLabel TextLabel - + About: Sobre: - + Status: Status: - + Active Ativo - + Inactive Inativo - + %s (Inactive) %s (Inativo) - + %s (Active) - + %s (Disabled) @@ -2809,70 +2807,70 @@ The content encoding is not UTF-8. - + Move to previous Mover para o anterior - + Move to next Mover para o próximo - + Hide - + Move to live Mover para ao vivo - + Edit and re-preview Song Editar e pré-visualizar Música novamente - + Start continuous loop Iniciar repetição contínua - + Stop continuous loop Parar repetição contínua - + s s - + Delay between slides in seconds Intervalo entre slides em segundos - + Start playing media Iniciar a reprodução de mídia - - Go to Verse - Ir ao Versículo + + Go to + OpenLP.SpellTextEdit - + Spelling Suggestions - + Formatting Tags @@ -3113,95 +3111,65 @@ A codificação do conteúdo não é UTF-8. - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - &Mostrar Ao Vivo - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - + Presentation Apresentação - + Presentations Apresentações + + + Load + + + + + Load a new Presentation + + + + + Delete + Deletar + + + + Delete the selected Presentation + + + + + Preview + + + + + Preview the selected Presentation + + + + + Live + Ao Vivo + + + + Send the selected Presentation live + + + + + Service + + + + + Add the selected Presentation to the service + + PresentationPlugin.MediaItem @@ -3277,12 +3245,12 @@ A codificação do conteúdo não é UTF-8. - + Remote - + Remotes Remoto @@ -3353,15 +3321,10 @@ A codificação do conteúdo não é UTF-8. - + SongUsage - - - Songs - Músicas - SongUsagePlugin.SongUsageDeleteForm @@ -3426,96 +3389,76 @@ A codificação do conteúdo não é UTF-8. <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - &Show Live - &Mostrar Ao Vivo - - - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song - - - - - Delete the selected Songs - - - - - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live - - - - - Add the selected Song to the service - - - - - Add the selected Songs to the service - - - - Song Música - + Songs Músicas + + + Add + Adicionar + + + + Add a new Song + + + + + Edit + Editar + + + + Edit the selected Song + + + + + Delete + Deletar + + + + Delete the selected Song + + + + + Preview + + + + + Preview the selected Song + + + + + Live + Ao Vivo + + + + Send the selected Song live + + + + + Service + + + + + Add the selected Song to the service + + SongsPlugin.AuthorsForm @@ -3713,7 +3656,7 @@ A codificação do conteúdo não é UTF-8. Este autor não existe, deseja adicioná-lo? - + Error Erro @@ -3758,42 +3701,42 @@ A codificação do conteúdo não é UTF-8. Não há nenhum tópico válido selecionado. Selecione um tópico da lista, ou digite um novo tópico e clique em "Adicionar Tópico à Música" para adicionar o novo tópico. - + You need to type in a song title. - + You need to type in at least one verse. - + Warning - + You have not added any authors for this song. Do you want to add an author now? Você não adicionou nenhum autor a esta música. Deseja adicionar um agora? - + The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - + You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - + Add Book - + This song book does not exist, do you want to add it? Este hinário não existe, deseja adicioná-lo? @@ -3801,17 +3744,17 @@ A codificação do conteúdo não é UTF-8. SongsPlugin.EditVerseForm - + Edit Verse Editar Versículo - + &Verse type: Tipo de &Versículo: - + &Insert @@ -3819,127 +3762,127 @@ A codificação do conteúdo não é UTF-8. SongsPlugin.ImportWizardForm - + No OpenLP 2.0 Song Database Selected - + You need to select an OpenLP 2.0 song database file to import from. - + No openlp.org 1.x Song Database Selected - + You need to select an openlp.org 1.x song database file to import from. - + No OpenLyrics Files Selected - + You need to add at least one OpenLyrics song file to import from. - + No OpenSong Files Selected - + You need to add at least one OpenSong song file to import from. - + No Words of Worship Files Selected - + You need to add at least one Words of Worship file to import from. - + No CCLI Files Selected - + You need to add at least one CCLI file to import from. Você precisa adicionar ao menos um arquivo CCLI para importação. - + No Songs of Fellowship File Selected - + You need to add at least one Songs of Fellowship file to import from. - + No Document/Presentation Selected - + You need to add at least one document or presentation file to import from. - + Select OpenLP 2.0 Database File - + Select openlp.org 1.x Database File - + Select OpenLyrics Files - + Select Open Song Files - + Select Words of Worship Files - + Select CCLI Files - + Select Songs of Fellowship Files - + Select Document/Presentation Files - + Starting import... Iniciando importação... @@ -4053,6 +3996,16 @@ A codificação do conteúdo não é UTF-8. %p% + + + Importing "%s"... + + + + + Importing %s... + + SongsPlugin.MediaItem @@ -4127,7 +4080,7 @@ A codificação do conteúdo não é UTF-8. - + CCLI Licence: Licença CCLI: @@ -4163,12 +4116,12 @@ A codificação do conteúdo não é UTF-8. SongsPlugin.SongImport - + copyright - + © @@ -4176,12 +4129,12 @@ A codificação do conteúdo não é UTF-8. SongsPlugin.SongImportForm - + Finished import. Importação Finalizada. - + Your song import failed. diff --git a/resources/i18n/openlp_sv.ts b/resources/i18n/openlp_sv.ts index a34589a06..e4f003d8c 100644 --- a/resources/i18n/openlp_sv.ts +++ b/resources/i18n/openlp_sv.ts @@ -18,12 +18,12 @@ - + Alert - + Alerts Alarm @@ -184,96 +184,86 @@ <strong>Bible Plugin</strong><br />The Bible plugin provides the ability to display bible verses from different sources during the service. - - - &Edit Bible - - - - - &Delete Bible - - - - - &Preview Bible - - - &Show Live - &Visa Live - - - - Import a Bible - - - - - Load a new Bible - - - - - Add a new Bible - - - - - Edit the selected Bible - - - - - Delete the selected Bible - - - - - Delete the selected Bibles - - - - - Preview the selected Bible - - - - - Preview the selected Bibles - - - - - Send the selected Bible live - - - - - Send the selected Bibles live - - - - - Add the selected Verse to the service - - - - - Add the selected Verses to the service - - - - Bible Bibel - + Bibles Biblar + + + Import + Importera + + + + Import a Bible + + + + + Add + Lägg till + + + + Add a new Bible + + + + + Edit + Redigera + + + + Edit the selected Bible + + + + + Delete + Ta bort + + + + Delete the selected Bible + + + + + Preview + Förhandsgranska + + + + Preview the selected Bible + + + + + Live + Live + + + + Send the selected Bible live + + + + + Service + + + + + Add the selected Bible to the service + + BiblesPlugin.BibleDB @@ -402,3982 +392,4 @@ Changes do not affect verses already in the service. - This wizard will help you to import Bibles 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 importera biblar från en mängd olika format. Klicka på nästa-knappen nedan för att börja proceduren genom att välja ett format att importera från. - - - - Select Import Source - Välj importkälla - - - - Select the import format, and where to import from. - Välj format för import, och plats att importera från. - - - - Format: - Format: - - - - OSIS - OSIS - - - - CSV - CSV - - - - OpenSong - OpenSong - - - - Web Download - Webbnedladdning - - - - File location: - - - - - Books location: - - - - - Verse location: - - - - - Bible filename: - - - - - Location: - - - - - Crosswalk - Crosswalk - - - - BibleGateway - BibleGateway - - - - Bible: - Bibel: - - - - Download Options - Alternativ för nedladdning - - - - Server: - Server: - - - - Username: - Användarnamn: - - - - Password: - Lösenord: - - - - Proxy Server (Optional) - Proxyserver (Frivilligt) - - - - License Details - Licensdetaljer - - - - Set up the Bible's license details. - Skriv in Bibelns licensdetaljer. - - - - Version name: - - - - - Copyright: - Copyright: - - - - Permission: - Rättigheter: - - - - Importing - Importerar - - - - Please wait while your Bible is imported. - Vänligen vänta medan din Bibel importeras. - - - - Ready. - Redo. - - - - Invalid Bible Location - Felaktig bibelplacering - - - - You need to specify a file to import your Bible from. - Du måste ange en fil att importera dina Biblar från. - - - - Invalid Books File - Ogiltig bokfil - - - - You need to specify a file with books of the Bible to use in the import. - Du måste välja en fil med Bibelböcker att använda i importen. - - - - Invalid Verse File - Ogiltid versfil - - - - You need to specify a file of Bible verses to import. - Du måste specificera en fil med Bibelverser att importera. - - - - Invalid OpenSong Bible - Ogiltig OpenSong-bibel - - - - You need to specify an OpenSong Bible file to import. - Du måste ange en OpenSong Bibel-fil att importera. - - - - Empty Version Name - Tomt versionsnamn - - - - You need to specify a version name for your Bible. - Du måste ange ett versionsnamn för din Bibel. - - - - Empty Copyright - Tom copyright-information - - - - You need to set a copyright for your Bible! Bibles in the Public Domain need to be marked as such. - Du måste infoga copyright-information för din Bibel! Biblar i den publika domänen måste innehålla det. - - - - Bible Exists - Bibel existerar - - - - This Bible already exists! Please import a different Bible or first delete the existing one. - Bibeln existerar redan! Importera en annan BIbel eller ta bort den som finns. - - - - Open OSIS File - - - - - Open Books CSV File - - - - - Open Verses CSV File - - - - - Open OpenSong Bible - Öppna OpenSong Bibel - - - - Starting import... - Påbörjar import... - - - - Finished import. - Importen är färdig. - - - - Your Bible import failed. - Din Bibelimport misslyckades. - - - - BiblesPlugin.MediaItem - - - Quick - Snabb - - - - Advanced - Avancerat - - - - Version: - Version: - - - - Dual: - Dubbel: - - - - Search type: - - - - - Find: - Hitta: - - - - Search - Sök - - - - Results: - Resultat: - - - - Book: - Bok: - - - - Chapter: - Kapitel: - - - - Verse: - Vers: - - - - From: - Från: - - - - To: - Till: - - - - Verse Search - Sök vers - - - - Text Search - Textsökning - - - - Clear - - - - - Keep - Behåll - - - - No Book Found - Ingen bok hittades - - - - No matching book could be found in this Bible. - Ingen matchande bok kunde hittas i den här Bibeln. - - - - etc - - - - - Bible not fully loaded. - - - - - BiblesPlugin.Opensong - - - Importing - Importerar - - - - CustomPlugin - - - <strong>Custom Plugin</strong><br />The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin. - - - - - CustomPlugin.CustomTab - - - Custom - - - - - Custom Display - Anpassad Visning - - - - Display footer - - - - - CustomPlugin.EditCustomForm - - - Edit Custom Slides - Redigera anpassad bild - - - - Move slide up one position. - - - - - Move slide down one position. - - - - - &Title: - - - - - Add New - Lägg till ny - - - - Add a new slide at bottom. - - - - - Edit - Redigera - - - - Edit the selected slide. - - - - - Edit All - Redigera alla - - - - Edit all the slides at once. - - - - - Save - Spara - - - - Save the slide currently being edited. - - - - - Delete - Ta bort - - - - Delete the selected slide. - - - - - Clear - - - - - Clear edit area - Töm redigeringsområde - - - - Split Slide - - - - - Split a slide into two by inserting a slide splitter. - - - - - The&me: - - - - - &Credits: - - - - - Save && Preview - Spara && förhandsgranska - - - - Error - Fel - - - - You need to type in a title. - - - - - You need to add at least one slide - - - - - You have one or more unsaved slides, please either save your slide(s) or clear your changes. - - - - - CustomPlugin.MediaItem - - - You haven't selected an item to edit. - - - - - You haven't selected an item to delete. - - - - - CustomsPlugin - - - &Edit Custom - - - - - &Delete Custom - - - - - &Preview Custom - - - - - &Show Live - &Visa Live - - - - Import a Custom - - - - - Load a new Custom - - - - - Add a new Custom - - - - - Edit the selected Custom - - - - - Delete the selected Custom - - - - - Preview the selected Custom - - - - - Send the selected Custom live - - - - - Add the selected Custom to the service - - - - - Custom - - - - - 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. - - - - - &Edit Image - - - - - &Delete Image - - - - - &Preview Image - - - - - &Show Live - &Visa Live - - - - Import a Image - - - - - Load a new Image - - - - - Add a new Image - - - - - Edit the selected Image - - - - - Delete the selected Image - - - - - Delete the selected Images - - - - - Preview the selected Image - - - - - Preview the selected Images - - - - - Send the selected Image live - - - - - Send the selected Images live - - - - - Add the selected Image to the service - - - - - Add the selected Images to the service - - - - - Image - Bild - - - - Images - Bilder - - - - ImagePlugin.MediaItem - - - Select Image(s) - Välj bild(er) - - - - All Files - - - - - Replace Live Background - - - - - Replace Background - - - - - Reset Live Background - - - - - You must select an image to delete. - - - - - Image(s) - Bilder - - - - You must select an image to replace the background with. - - - - - You must select a media file to replace the background with. - - - - - MediaPlugin - - - <strong>Media Plugin</strong><br />The media plugin provides playback of audio and video. - - - - - &Edit Media - - - - - &Delete Media - - - - - &Preview Media - - - - - &Show Live - &Visa Live - - - - Import a Media - - - - - Load a new Media - - - - - Add a 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 - - - - - Media - Media - - - - MediaPlugin.MediaItem - - - Select Media - Välj media - - - - Replace Live Background - - - - - Replace Background - - - - - Media - Media - - - - You must select a media file to delete. - - - - - OpenLP - - - Image Files - - - - - OpenLP.AboutForm - - - About OpenLP - Om OpenLP - - - - OpenLP <version><revision> - Open Source Lyrics Projection - -OpenLP is free church presentation software, or lyrics projection software, used to display slides of songs, Bible verses, videos, images, and even presentations (if OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. - -Find out more about OpenLP: http://openlp.org/ - -OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - - - - - About - Om - - - - Project Lead - Raoul "superfly" Snyman - -Developers - Tim "TRB143" Bentley - Jonathan "gushie" Corwin - Michael "cocooncrash" Gorven - Scott "sguerrieri" Guerrieri - Raoul "superfly" Snyman - Martin "mijiti" Thompson - Jon "Meths" Tibble - -Contributors - Meinert "m2j" Jordan - Andreas "googol" Preikschat - Christian "crichter" Richter - Philip "Phill" Ridout - Maikel Stuivenberg - Carsten "catini" Tingaard - Frode "frodus" Woldsund - -Testers - Philip "Phill" Ridout - Wesley "wrst" Stout (lead) - -Packagers - Thomas "tabthorpe" Abthorpe (FreeBSD) - Tim "TRB143" Bentley (Fedora) - Michael "cocooncrash" Gorven (Ubuntu) - Matthias "matthub" Hub (Mac OS X) - Raoul "superfly" Snyman (Windows, Ubuntu) - -Built With - Python: http://www.python.org/ - Qt4: http://qt.nokia.com/ - PyQt4: http://www.riverbankcomputing.co.uk/software/pyqt/intro - Oxygen Icons: http://oxygen-icons.org/ - - - - - - Credits - Credits - - - - Copyright © 2004-2010 Raoul Snyman -Portions copyright © 2004-2010 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Carsten Tinggaard - -This program is 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. - - -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. - -<one line to give the program's name and a brief idea of what it does.> -Copyright (C) <year> <name of author> - -This program is 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. - -<signature of Ty Coon>, 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. - - - - - License - Licens - - - - Contribute - Bidra - - - - Close - Stäng - - - - build %s - - - - - OpenLP.AdvancedTab - - - Advanced - Avancerat - - - - UI Settings - - - - - Number of recent files to display: - - - - - Remember active media manager tab on startup - - - - - Double-click to send items straight to live (requires restart) - - - - - OpenLP.AmendThemeForm - - - Theme Maintenance - Temaunderhåll - - - - Theme &name: - - - - - Type: - Typ: - - - - Solid Color - Solid Färg - - - - Gradient - Stegvis - - - - Image - Bild - - - - Image: - Bild: - - - - Gradient: - - - - - Horizontal - Horisontellt - - - - Vertical - Vertikal - - - - Circular - Cirkulär - - - - &Background - - - - - Main Font - Huvudfont - - - - Font: - Font: - - - - Color: - - - - - Size: - Storlek: - - - - pt - pt - - - - Adjust line spacing: - - - - - Normal - Normal - - - - Bold - Fetstil - - - - Italics - Kursiv - - - - Bold/Italics - Fetstil/kursiv - - - - Style: - - - - - Display Location - Visa plats - - - - Use default location - - - - - X position: - - - - - Y position: - - - - - Width: - Bredd: - - - - Height: - Höjd: - - - - px - px - - - - &Main Font - - - - - Footer Font - Sidfot-font - - - - &Footer Font - - - - - Outline - Kontur - - - - Outline size: - - - - - Outline color: - - - - - Show outline: - - - - - Shadow - Skugga - - - - Shadow size: - - - - - Shadow color: - - - - - Show shadow: - - - - - Alignment - Justering - - - - Horizontal align: - - - - - Left - Vänster - - - - Right - Höger - - - - Center - Centrera - - - - Vertical align: - - - - - Top - Topp - - - - Middle - Mitten - - - - Bottom - - - - - Slide Transition - Bildövergång - - - - Transition active - - - - - &Other Options - - - - - Preview - Förhandsgranska - - - - All Files - - - - - Select Image - - - - - First color: - - - - - Second color: - - - - - Slide height is %s rows. - - - - - OpenLP.GeneralTab - - - General - Allmänt - - - - Monitors - Skärmar - - - - Select monitor for output display: - Välj skärm för utsignal: - - - - Display if a single screen - - - - - Application Startup - Programstart - - - - Show blank screen warning - Visa varning vid tom skärm - - - - Automatically open the last service - Öppna automatiskt den senaste planeringen - - - - Show the splash screen - Visa startbilden - - - - Application Settings - Programinställningar - - - - Prompt to save before starting a new service - - - - - Automatically preview next item in service - - - - - Slide loop delay: - - - - - sec - - - - - CCLI Details - CCLI-detaljer - - - - CCLI number: - - - - - SongSelect username: - - - - - SongSelect password: - - - - - Display Position - - - - - X - - - - - Y - - - - - Height - - - - - Width - - - - - Override display position - - - - - Screen - Skärm - - - - primary - primär - - - - OpenLP.LanguageManager - - - Language - - - - - Please restart OpenLP to use your new language setting. - - - - - OpenLP.MainWindow - - - OpenLP 2.0 - OpenLP 2.0 - - - - English - Engelska - - - - &File - &Fil - - - - &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 - Mötesplaneringshanterare - - - - Theme Manager - Temahanterare - - - - &New - &Ny - - - - New Service - - - - - Create a new service. - - - - - Ctrl+N - Ctrl+N - - - - &Open - &Öppna - - - - Open Service - - - - - Open an existing service. - - - - - Ctrl+O - Ctrl+O - - - - &Save - &Spara - - - - Save Service - - - - - Save the current service to disk. - - - - - Ctrl+S - Ctrl+S - - - - Save &As... - S&para som... - - - - Save Service As - Spara mötesplanering som... - - - - Save the current service under a new name. - - - - - Ctrl+Shift+S - - - - - E&xit - &Avsluta - - - - Quit OpenLP - Stäng OpenLP - - - - Alt+F4 - Alt+F4 - - - - &Theme - &Tema - - - - &Configure OpenLP... - - - - - &Media Manager - &Mediahanterare - - - - Toggle Media Manager - Växla mediahanterare - - - - Toggle the visibility of the media manager. - - - - - F8 - F8 - - - - &Theme Manager - &Temahanterare - - - - Toggle Theme Manager - Växla temahanteraren - - - - Toggle the visibility of the theme manager. - - - - - F10 - F10 - - - - &Service Manager - &Mötesplaneringshanterare - - - - Toggle Service Manager - Växla mötesplaneringshanterare - - - - Toggle the visibility of the service manager. - - - - - F9 - F9 - - - - &Preview Panel - &Förhandsgranskning - - - - Toggle Preview Panel - Växla förhandsgranskningspanel - - - - Toggle the visibility of the preview panel. - - - - - F11 - F11 - - - - &Live Panel - - - - - Toggle Live Panel - - - - - Toggle the visibility of the live panel. - - - - - F12 - F12 - - - - &Plugin List - &Pluginlista - - - - List the Plugins - Lista Plugin - - - - Alt+F7 - Alt+F7 - - - - &User Guide - &Användarguide - - - - &About - &Om - - - - More information about OpenLP - Mer information om OpenLP - - - - Ctrl+F1 - Ctrl+F1 - - - - &Online Help - &Online-hjälp - - - - &Web Site - &Webbsida - - - - &Auto Detect - - - - - 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 - &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-version uppdaterad - - - - OpenLP Main Display Blanked - OpenLP huvuddisplay tömd - - - - The Main Display has been blanked out - Huvuddisplayen har rensats - - - - Save Changes to Service? - - - - - Your service has changed. Do you want to save those changes? - - - - - Default Theme: %s - - - - - OpenLP.MediaManagerItem - - - No Items Selected - - - - - Import %s - - - - - Load %s - - - - - New %s - - - - - Edit %s - - - - - Delete %s - - - - - Preview %s - - - - - Add %s to Service - - - - - &Edit %s - - - - - &Delete %s - - - - - &Preview %s - - - - - &Show Live - &Visa Live - - - - &Add to Service - &Lägg till i mötesplanering - - - - &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. - - - - - No items selected - - - - - You must select one or more items - Du måste välja ett eller flera objekt - - - - No Service Item Selected - - - - - You must select an existing service item to add to. - - - - - Invalid Service Item - - - - - You must select a %s service item. - - - - - OpenLP.PluginForm - - - Plugin List - Pluginlista - - - - Plugin Details - Plugindetaljer - - - - Version: - Version: - - - - TextLabel - TextLabel - - - - About: - Om: - - - - Status: - Status: - - - - Active - Aktiv - - - - Inactive - Inaktiv - - - - %s (Inactive) - - - - - %s (Active) - - - - - %s (Disabled) - - - - - OpenLP.ServiceItemEditForm - - - Reorder Service Item - - - - - Up - - - - - Delete - Ta bort - - - - Down - - - - - OpenLP.ServiceManager - - - New Service - - - - - Create a new service - Skapa en ny mötesplanering - - - - Open Service - - - - - Load an existing service - Ladda en planering - - - - Save Service - - - - - Save this service - Spara denna mötesplanering - - - - Theme: - Tema: - - - - Select a theme for the service - Välj ett tema för planeringen - - - - Move to &top - Flytta till &toppen - - - - Move item to the top of the service. - - - - - Move &up - Flytta &upp - - - - Move item up one position in the service. - - - - - Move &down - Flytta &ner - - - - Move item down one position in the service. - - - - - Move to &bottom - Flytta längst &ner - - - - Move item to the end of the service. - - - - - &Delete From Service - &Ta bort från mötesplanering - - - - Delete the selected item from the service. - - - - - &Add New Item - - - - - &Add to Selected Item - - - - - &Edit Item - &Redigera objekt - - - - &Reorder Item - - - - - &Notes - &Anteckningar - - - - &Preview Verse - &Förhandsgranska Vers - - - - &Live Verse - &Live-vers - - - - &Change Item Theme - &Byt objektets tema - - - - Save Changes to Service? - - - - - Your service is unsaved, do you want to save those changes before creating a new one? - - - - - OpenLP Service Files (*.osz) - - - - - Your current service is unsaved, do you want to save the changes before opening a new one? - - - - - Error - Fel - - - - File is not a valid service. -The content encoding is not UTF-8. - - - - - File is not a valid service. - - - - - Missing Display Handler - - - - - Your item cannot be displayed as there is no handler to display it - - - - - OpenLP.ServiceNoteForm - - - Service Item Notes - Mötesanteckningar - - - - OpenLP.SettingsForm - - - Configure OpenLP - - - - - OpenLP.SlideController - - - Live - Live - - - - Preview - Förhandsgranska - - - - Move to previous - Flytta till föregående - - - - Move to next - Flytta till nästa - - - - Hide - - - - - Move to live - Flytta till live - - - - Edit and re-preview Song - Ändra och åter-förhandsgranska sång - - - - Start continuous loop - Börja oändlig loop - - - - Stop continuous loop - Stoppa upprepad loop - - - - s - s - - - - Delay between slides in seconds - Fördröjning mellan bilder, i sekunder - - - - Start playing media - Börja spela media - - - - Go to Verse - Hoppa till vers - - - - OpenLP.SpellTextEdit - - - Spelling Suggestions - - - - - Formatting Tags - - - - - OpenLP.ThemeManager - - - New Theme - Nytt Tema - - - - Create a new theme. - - - - - Edit Theme - Redigera tema - - - - Edit a theme. - - - - - Delete Theme - Ta bort tema - - - - Delete a theme. - - - - - Import Theme - Importera tema - - - - Import a theme. - - - - - Export Theme - Exportera tema - - - - Export a theme. - - - - - &Edit Theme - - - - - &Delete Theme - - - - - Set As &Global Default - - - - - E&xport Theme - - - - - %s (default) - - - - - You must select a theme to edit. - - - - - You must select a theme to delete. - - - - - Delete Confirmation - - - - - Delete theme? - - - - - Error - Fel - - - - You are unable to delete the default theme. - Du kan inte ta bort standardtemat. - - - - Theme %s is use in %s plugin. - - - - - Theme %s is use by the service manager. - - - - - You have not selected a theme. - Du har inte valt ett tema. - - - - Save Theme - (%s) - Spara tema - (%s) - - - - Theme Exported - - - - - Your theme has been successfully exported. - - - - - Theme Export Failed - - - - - Your theme could not be exported due to an error. - - - - - Select Theme Import File - Välj tema importfil - - - - Theme (*.*) - - - - - File is not a valid theme. -The content encoding is not UTF-8. - - - - - File is not a valid theme. - Filen är inte ett giltigt tema. - - - - Theme Exists - Temat finns - - - - A theme with this name already exists. Would you like to overwrite it? - - - - - OpenLP.ThemesTab - - - Themes - Teman - - - - 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. - Använd temat för varje sång i databasen indviduellt. Om en sång inte har ett associerat tema, använd planeringens schema. Om planeringen inte har ett tema, använd globala temat. - - - - &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. - Använd temat för mötesplaneringen, och ignorera sångernas indviduella teman. Om mötesplaneringen inte har ett tema använd då det globala temat. - - - - &Global Level - - - - - Use the global theme, overriding any themes associated with either the service or the songs. - Använd det globala temat, ignorerar teman associerade med mötesplaneringen eller sångerna. - - - - 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. - - - - - &Edit Presentation - - - - - &Delete Presentation - - - - - &Preview Presentation - - - - - &Show Live - &Visa Live - - - - Import a Presentation - - - - - Load a new Presentation - - - - - Add a new Presentation - - - - - Edit the selected Presentation - - - - - Delete the selected Presentation - - - - - Delete the selected Presentations - - - - - Preview the selected Presentation - - - - - Preview the selected Presentations - - - - - Send the selected Presentation live - - - - - Send the selected Presentations live - - - - - Add the selected Presentation to the service - - - - - Add the selected Presentations to the service - - - - - Presentation - Presentation - - - - Presentations - Presentationer - - - - PresentationPlugin.MediaItem - - - Select Presentation(s) - Välj presentation(er) - - - - Automatic - Automatisk - - - - Present using: - Presentera genom: - - - - File Exists - - - - - A presentation with that filename already exists. - En presentation med det namnet finns redan. - - - - Unsupported File - - - - - This type of presentation is not supported - - - - - You must select an item to delete. - - - - - PresentationPlugin.PresentationTab - - - Presentations - Presentationer - - - - Available Controllers - Tillgängliga Presentationsprogram - - - - Advanced - Avancerat - - - - Allow presentation application to be overriden - - - - - RemotePlugin - - - <strong>Remote Plugin</strong><br />The remote plugin provides the ability to send messages to a running version of OpenLP on a different computer via a web browser or through the remote API. - - - - - Remote - - - - - Remotes - Fjärrstyrningar - - - - RemotePlugin.RemoteTab - - - Remotes - Fjärrstyrningar - - - - Serve on IP address: - - - - - Port number: - - - - - Server Settings - - - - - 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 - - - - - Songs - Sånger - - - - SongUsagePlugin.SongUsageDeleteForm - - - Delete Song Usage Data - - - - - Delete Selected Song Usage Events? - Ta bort valda sånganvändningsdata? - - - - Are you sure you want to delete selected Song Usage data? - Vill du verkligen ta bort vald sånganvändningsdata? - - - - SongUsagePlugin.SongUsageDetailForm - - - Song Usage Extraction - Sånganvändningsutdrag - - - - Select Date Range - Välj datumspann - - - - to - till - - - - Report Location - Rapportera placering - - - - Output File Location - Utfil sökväg - - - - SongsPlugin - - - &Song - &Sång - - - - Import songs using the import wizard. - - - - - <strong>Songs Plugin</strong><br />The songs plugin provides the ability to display and manage songs. - - - - - &Edit Song - - - - - &Delete Song - - - - - &Preview Song - - - - - &Show Live - &Visa Live - - - - Import a Song - - - - - Load a new Song - - - - - Add a new Song - - - - - Edit the selected Song - - - - - Delete the selected Song - - - - - Delete the selected Songs - - - - - Preview the selected Song - - - - - Preview the selected Songs - - - - - Send the selected Song live - - - - - Send the selected Songs live - - - - - Add the selected Song to the service - - - - - Add the selected Songs to the service - - - - - Song - Sång - - - - Songs - Sånger - - - - SongsPlugin.AuthorsForm - - - Author Maintenance - Författare underhåll - - - - Display name: - Visningsnamn: - - - - First name: - Förnamn: - - - - Last name: - Efternamn: - - - - Error - Fel - - - - You need to type in the first name of the author. - Du måste ange låtskrivarens 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, would you like me to combine the first and last names for you? - - - - - SongsPlugin.EditSongForm - - - Song Editor - Sångredigerare - - - - &Title: - - - - - Alt&ernate title: - - - - - &Lyrics: - - - - - &Verse order: - - - - - &Add - - - - - &Edit - &Redigera - - - - Ed&it All - - - - - &Delete - - - - - Title && Lyrics - Titel && Sångtexter - - - - Authors - - - - - &Add to Song - &Lägg till i sång - - - - &Remove - &Ta bort - - - - &Manage Authors, Topics, Song Books - - - - - Topic - Ämne - - - - A&dd to Song - Lägg till i sång - - - - R&emove - Ta &bort - - - - Song Book - Sångbok - - - - Song No.: - - - - - Authors, Topics && Song Book - - - - - Theme - Tema - - - - New &Theme - - - - - Copyright Information - Copyright-information - - - - © - - - - - CCLI number: - - - - - Comments - Kommentarer - - - - Theme, Copyright Info && Comments - Tema, copyright-info && kommentarer - - - - Save && Preview - Spara && förhandsgranska - - - - Add Author - - - - - This author does not exist, do you want to add them? - - - - - Error - Fel - - - - This author is already in the list. - - - - - No Author Selected - - - - - 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. - - - - - No Topic Selected - - - - - 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. - - - - - Warning - - - - - You have not added any authors for this song. Do you want to add an author now? - - - - - The verse order is invalid. There is no verse corresponding to %s. Valid entries are %s. - - - - - You have not used %s anywhere in the verse order. Are you sure you want to save the song like this? - - - - - Add Book - - - - - This song book does not exist, do you want to add it? - - - - - SongsPlugin.EditVerseForm - - - Edit Verse - Redigera vers - - - - &Verse type: - - - - - &Insert - - - - - SongsPlugin.ImportWizardForm - - - No OpenLP 2.0 Song Database Selected - - - - - You need to select an OpenLP 2.0 song database file to import from. - - - - - No openlp.org 1.x Song Database Selected - - - - - You need to select an openlp.org 1.x song database file to import from. - - - - - No OpenLyrics Files Selected - - - - - You need to add at least one OpenLyrics song file to import from. - - - - - No OpenSong Files Selected - - - - - You need to add at least one OpenSong song file to import from. - - - - - No Words of Worship Files Selected - - - - - You need to add at least one Words of Worship file to import from. - - - - - No CCLI Files Selected - - - - - You need to add at least one CCLI file to import from. - - - - - No Songs of Fellowship File Selected - - - - - You need to add at least one Songs of Fellowship file to import from. - - - - - No Document/Presentation Selected - - - - - You need to add at least one document or presentation file to import from. - - - - - Select OpenLP 2.0 Database File - - - - - Select openlp.org 1.x Database File - - - - - Select OpenLyrics Files - - - - - Select Open Song Files - - - - - Select Words of Worship Files - - - - - Select CCLI Files - - - - - Select Songs of Fellowship Files - - - - - Select Document/Presentation Files - - - - - Starting import... - Påbörjar import... - - - - Song Import Wizard - - - - - Welcome to the 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. - - - - - Select Import Source - Välj importkälla - - - - Select the import format, and where to import from. - Välj format för import, och plats att importera från. - - - - Format: - Format: - - - - OpenLP 2.0 - OpenLP 2.0 - - - - openlp.org 1.x - - - - - OpenLyrics - - - - - OpenSong - OpenSong - - - - Words of Worship - - - - - CCLI/SongSelect - - - - - Songs of Fellowship - - - - - Generic Document/Presentation - - - - - Filename: - - - - - Browse... - - - - - Add Files... - - - - - Remove File(s) - - - - - Importing - Importerar - - - - Please wait while your songs are imported. - - - - - Ready. - Redo. - - - - %p% - - - - - SongsPlugin.MediaItem - - - Song Maintenance - Sångunderhåll - - - - Maintain the lists of authors, topics and books - Hantera listorna över författare, ämnen och böcker - - - - Search: - Sök: - - - - Type: - Typ: - - - - Clear - - - - - Search - Sök - - - - Titles - Titlar - - - - Lyrics - Sångtexter - - - - Authors - - - - - You must select an item to edit. - - - - - You must select an item to delete. - - - - - Are you sure you want to delete the selected song? - - - - - Are you sure you want to delete the %d selected songs? - - - - - Delete Song(s)? - - - - - CCLI Licence: - CCLI-licens: - - - - SongsPlugin.SongBookForm - - - Song Book Maintenance - - - - - &Name: - - - - - &Publisher: - - - - - Error - Fel - - - - You need to type in a name for the book. - - - - - SongsPlugin.SongImport - - - copyright - - - - - © - - - - - SongsPlugin.SongImportForm - - - Finished import. - Importen är färdig. - - - - Your song import failed. - - - - - SongsPlugin.SongMaintenanceForm - - - Song Maintenance - Sångunderhåll - - - - Authors - - - - - Topics - Ämnen - - - - Song Books - - - - - &Add - - - - - &Edit - &Redigera - - - - &Delete - - - - - Error - Fel - - - - 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 he already exists. - - - - - Could not save your modified topic, because it already exists. - - - - - Delete Author - Ta bort låtskrivare - - - - Are you sure you want to delete the selected author? - Är du säker på att du vill ta bort den valda låtskrivaren? - - - - This author cannot be deleted, they are currently assigned to at least one song. - - - - - No author selected! - Ingen författare vald! - - - - 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 valt ämne? - - - - This topic cannot be deleted, it is currently assigned to at least one song. - - - - - No topic selected! - Inget ämne valt! - - - - 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 vald bok? - - - - This book cannot be deleted, it is currently assigned to at least one song. - - - - - No book selected! - Ingen bok vald! - - - - SongsPlugin.SongsTab - - - Songs - Sånger - - - - Songs Mode - Sångläge - - - - Enable search as you type - - - - - Display verses on live tool bar - - - - - SongsPlugin.TopicsForm - - - Topic Maintenance - Ämnesunderhåll - - - - Topic name: - Ämnesnamn: - - - - Error - Fel - - - - You need to type in a topic name! - Du måste skriva in ett namn på ämnet! - - - - SongsPlugin.VerseType - - - Verse - Vers - - - - Chorus - Refräng - - - - Bridge - Brygga - - - - Pre-Chorus - Brygga - - - - Intro - Intro - - - - Ending - Ending - - - - Other - Övrigt - - - + This wizard will help you to import Bibles from a variety of formats. Click the next button below to start the process by selecting a format to import from. \ No newline at end of file diff --git a/resources/images/about-new.bmp b/resources/images/about-new.bmp old mode 100755 new mode 100644