diff --git a/documentation/api/source/core/lib.rst b/documentation/api/source/core/lib.rst index fa894875d..6be95de5f 100644 --- a/documentation/api/source/core/lib.rst +++ b/documentation/api/source/core/lib.rst @@ -13,7 +13,7 @@ Object Library :members: :mod:`ListWidgetWithDnD` ----------------------- +------------------------ .. autoclass:: openlp.core.lib.listwidgetwithdnd.ListWidgetWithDnD :members: diff --git a/documentation/api/source/plugins/songs.rst b/documentation/api/source/plugins/songs.rst index 1e86ce020..a9a3a8219 100644 --- a/documentation/api/source/plugins/songs.rst +++ b/documentation/api/source/plugins/songs.rst @@ -54,9 +54,6 @@ Helper Classes & Functions .. automodule:: openlp.plugins.songs.lib.mediaitem :members: -.. autoclass:: openlp.plugins.songs.lib.mediaitem.SongListView - :members: - .. automodule:: openlp.plugins.songs.lib.songimport :members: diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 80bf4a67b..ab4c8e26f 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -321,8 +321,6 @@ def check_directory_exists(dir): os.makedirs(dir) from listwidgetwithdnd import ListWidgetWithDnD -from theme import ThemeLevel, ThemeXML, BackgroundGradientType, \ - BackgroundType, HorizontalType, VerticalType from displaytags import DisplayTags from spelltextedit import SpellTextEdit from eventreceiver import Receiver diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index 34d583181..720b4b3f8 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -28,8 +28,8 @@ import logging from PyQt4 import QtWebKit -from openlp.core.lib import BackgroundType, BackgroundGradientType, \ - VerticalType +from openlp.core.lib.theme import BackgroundType, BackgroundGradientType, \ + VerticalType, HorizontalType log = logging.getLogger(__name__) @@ -531,13 +531,8 @@ def build_lyrics_format_css(theme, width, height): Height of the lyrics block """ - if theme.display_horizontal_align == 2: - align = u'center' - elif theme.display_horizontal_align == 1: - align = u'right' - else: - align = u'left' - valign = VerticalType.to_string(theme.display_vertical_align) + align = HorizontalType.Names[theme.display_horizontal_align] + valign = VerticalType.Names[theme.display_vertical_align] if theme.font_main_outline: left_margin = int(theme.font_main_outline_size) * 2 else: @@ -630,7 +625,7 @@ def build_alert_css(alertTab, width): """ if not alertTab: return u'' - align = VerticalType.to_string(alertTab.location) + align = VerticalType.Names[alertTab.location] alert = style % (width, align, alertTab.font_face, alertTab.font_size, alertTab.font_color, alertTab.bg_color) return alert diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index c2c2987c2..782e041a9 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -34,6 +34,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import context_menu_action, context_menu_separator, \ SettingsManager, OpenLPToolbar, ServiceItem, StringContent, build_icon, \ translate, Receiver, ListWidgetWithDnD +from openlp.core.lib.ui import UiStrings log = logging.getLogger(__name__) @@ -65,10 +66,11 @@ class MediaManagerItem(QtGui.QWidget): When creating a descendant class from this class for your plugin, the following member variables should be set. - ``self.OnNewPrompt`` + ``self.onNewPrompt`` + Defaults to *'Select Image(s)'*. - ``self.OnNewFileMasks`` + ``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. @@ -316,9 +318,9 @@ class MediaManagerItem(QtGui.QWidget): Add a file to the list widget to make it available for showing """ files = QtGui.QFileDialog.getOpenFileNames( - self, self.OnNewPrompt, + self, self.onNewPrompt, SettingsManager.get_last_dir(self.settingsSection), - self.OnNewFileMasks) + self.onNewFileMasks) log.info(u'New files(s) %s', unicode(files)) if files: Receiver.send_message(u'cursor_busy') @@ -415,8 +417,7 @@ class MediaManagerItem(QtGui.QWidget): 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'), + QtGui.QMessageBox.information(self, UiStrings.NISp, translate('OpenLP.MediaManagerItem', 'You must select one or more items to preview.')) else: @@ -432,8 +433,7 @@ class MediaManagerItem(QtGui.QWidget): item to the live slide controller. """ if not self.listView.selectedIndexes(): - QtGui.QMessageBox.information(self, - translate('OpenLP.MediaManagerItem', 'No Items Selected'), + QtGui.QMessageBox.information(self, UiStrings.NISp, translate('OpenLP.MediaManagerItem', 'You must select one or more items to send live.')) else: @@ -448,8 +448,7 @@ class MediaManagerItem(QtGui.QWidget): 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'), + QtGui.QMessageBox.information(self, UiStrings.NISp, translate('OpenLP.MediaManagerItem', 'You must select one or more items.')) else: @@ -475,17 +474,14 @@ class MediaManagerItem(QtGui.QWidget): 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'), + QtGui.QMessageBox.information(self, UiStrings.NISp, translate('OpenLP.MediaManagerItem', - 'You must select one or more items')) + 'You must select one or more items.')) else: log.debug(u'%s Add requested', self.plugin.name) serviceItem = self.parent.serviceManager.getServiceItem() if not serviceItem: - QtGui.QMessageBox.information(self, - translate('OpenLP.MediaManagerItem', - 'No Service Item Selected'), + QtGui.QMessageBox.information(self, UiStrings.NISs, translate('OpenLP.MediaManagerItem', 'You must select an existing service item to add to.')) elif self.plugin.name.lower() == serviceItem.name.lower(): diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index 730bb1a36..39f13c37e 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -144,6 +144,7 @@ class Plugin(QtCore.QObject): self.name = name self.textStrings = {} self.setPluginTextStrings() + self.nameStrings = self.textStrings[StringContent.Name] if version: self.version = version self.settingsSection = self.name.lower() diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index 860a52b60..7d579f7a4 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -28,7 +28,8 @@ import logging from PyQt4 import QtCore -from openlp.core.lib import Renderer, ThemeLevel, ServiceItem, ImageManager +from openlp.core.lib import Renderer, ServiceItem, ImageManager +from openlp.core.lib.theme import ThemeLevel from openlp.core.ui import MainDisplay log = logging.getLogger(__name__) @@ -173,14 +174,13 @@ class RenderManager(object): main_rect = None footer_rect = None if not theme.font_main_override: - main_rect = QtCore.QRect(10, 0, - self.width - 20, self.footer_start) + main_rect = QtCore.QRect(10, 0, self.width - 20, self.footer_start) else: main_rect = QtCore.QRect(theme.font_main_x, theme.font_main_y, theme.font_main_width - 1, theme.font_main_height - 1) if not theme.font_footer_override: - footer_rect = QtCore.QRect(10, self.footer_start, - self.width - 20, self.height - self.footer_start) + footer_rect = QtCore.QRect(10, self.footer_start, self.width - 20, + self.height - self.footer_start) else: footer_rect = QtCore.QRect(theme.font_footer_x, theme.font_footer_y, theme.font_footer_width - 1, @@ -215,7 +215,7 @@ class RenderManager(object): else: self.image_manager.del_image(theme_data.theme_name) footer = [] - footer.append(u'Arky Arky (Unknown)' ) + footer.append(u'Arky Arky (Unknown)') footer.append(u'Public Domain') footer.append(u'CCLI 123456') # build a service item to generate preview @@ -258,6 +258,6 @@ class RenderManager(object): self.height = screen.height() self.screen_ratio = float(self.height) / float(self.width) log.debug(u'calculate default %d, %d, %f', - self.width, self.height, self.screen_ratio ) + self.width, self.height, self.screen_ratio) # 90% is start of footer self.footer_start = int(self.height * 0.90) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index f9d690ba2..f5b606467 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -323,7 +323,7 @@ class ServiceItem(object): for text_image in serviceitem[u'serviceitem'][u'data']: filename = os.path.join(path, text_image[u'title']) self.add_from_command( - path, text_image[u'title'], text_image[u'image'] ) + path, text_image[u'title'], text_image[u'image']) self._new_item() def get_display_title(self): diff --git a/openlp/core/lib/theme.py b/openlp/core/lib/theme.py index 225e1335c..67ddde72d 100644 --- a/openlp/core/lib/theme.py +++ b/openlp/core/lib/theme.py @@ -33,7 +33,8 @@ import logging from xml.dom.minidom import Document from lxml import etree, objectify -from openlp.core.lib import str_to_bool +from openlp.core.lib import str_to_bool, translate +from openlp.core.lib.ui import UiStrings log = logging.getLogger(__name__) @@ -170,20 +171,14 @@ class HorizontalType(object): Type enumeration for horizontal alignment. """ Left = 0 - Center = 2 Right = 1 + Center = 2 - @staticmethod - def to_string(horizontal_type): - """ - Return a string representation of a horizontal type. - """ - if horizontal_type == HorizontalType.Right: - return u'right' - elif horizontal_type == HorizontalType.Center: - return u'center' - else: - return u'left' + Names = [u'left', u'right', u'center'] + TranslatedNames = [ + translate('OpenLP.ThemeWizard', 'Left'), + translate('OpenLP.ThemeWizard', 'Right'), + translate('OpenLP.ThemeWizard', 'Center')] class VerticalType(object): @@ -194,17 +189,8 @@ class VerticalType(object): Middle = 1 Bottom = 2 - @staticmethod - def to_string(vertical_type): - """ - Return a string representation of a vertical type. - """ - if vertical_type == VerticalType.Bottom: - return u'bottom' - elif vertical_type == VerticalType.Middle: - return u'middle' - else: - return u'top' + Names = [u'top', u'middle', u'bottom'] + TranslatedNames = [UiStrings.Top, UiStrings.Middle, UiStrings.Bottom] BOOLEAN_LIST = [u'bold', u'italics', u'override', u'outline', u'shadow', diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index a98e2fb7f..2cdda13ac 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -40,32 +40,59 @@ class UiStrings(object): """ # These strings should need a good reason to be retranslated elsewhere. # Should some/more/less of these have an & attached? + About = translate('OpenLP.Ui', 'About') Add = translate('OpenLP.Ui', '&Add') Advanced = translate('OpenLP.Ui', 'Advanced') AllFiles = translate('OpenLP.Ui', 'All Files') - Authors = translate('OpenLP.Ui', 'Authors') + Bottom = translate('OpenLP.Ui', 'Bottom') + Browse = translate('OpenLP.Ui', 'Browse...') + Cancel = translate('OpenLP.Ui', 'Cancel') + CCLINumberLabel = translate('OpenLP.Ui', 'CCLI number:') CreateService = translate('OpenLP.Ui', 'Create a new service.') Delete = translate('OpenLP.Ui', '&Delete') Edit = translate('OpenLP.Ui', '&Edit') + EmptyField = translate('OpenLP.Ui', 'Empty Field') Error = translate('OpenLP.Ui', 'Error') + Export = translate('OpenLP.Ui', 'Export') + FontSizePtUnit = translate('OpenLP.Ui', 'pt', + 'Abbreviated font pointsize unit') + Image = translate('OpenLP.Ui', 'Image') Import = translate('OpenLP.Ui', 'Import') LengthTime = unicode(translate('OpenLP.Ui', 'Length %s')) Live = translate('OpenLP.Ui', 'Live') + LiveBGError = translate('OpenLP.Ui', 'Live Background Error') + LivePanel = translate('OpenLP.Ui', 'Live Panel') Load = translate('OpenLP.Ui', 'Load') + Middle = translate('OpenLP.Ui', 'Middle') New = translate('OpenLP.Ui', 'New') NewService = translate('OpenLP.Ui', 'New Service') + NewTheme = translate('OpenLP.Ui', 'New Theme') + NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular') + NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural') + NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular') + NISp = translate('OpenLP.Ui', 'No Items Selected', 'Plural') + OLPV1 = translate('OpenLP.Ui', 'openlp.org 1.x') OLPV2 = translate('OpenLP.Ui', 'OpenLP 2.0') OpenService = translate('OpenLP.Ui', 'Open Service') Preview = translate('OpenLP.Ui', 'Preview') + PreviewPanel = translate('OpenLP.Ui', 'Preview Panel') + PrintServiceOrder = translate('OpenLP.Ui', 'Print Service Order') ReplaceBG = translate('OpenLP.Ui', 'Replace Background') ReplaceLiveBG = translate('OpenLP.Ui', 'Replace Live Background') ResetBG = translate('OpenLP.Ui', 'Reset Background') ResetLiveBG = translate('OpenLP.Ui', 'Reset Live Background') + S = translate('OpenLP.Ui', 's', 'The abbreviated unit for seconds') + SaveAndPreview = translate('OpenLP.Ui', 'Save && Preview') + Search = translate('OpenLP.Ui', 'Search') + SelectDelete = translate('OpenLP.Ui', 'You must select an item to delete.') + SelectEdit = translate('OpenLP.Ui', 'You must select an item to edit.') SaveService = translate('OpenLP.Ui', 'Save Service') Service = translate('OpenLP.Ui', 'Service') StartTimeCode = unicode(translate('OpenLP.Ui', 'Start %s')) - Theme = translate('OpenLP.Ui', 'Theme') - Themes = translate('OpenLP.Ui', 'Themes') + Theme = translate('OpenLP.Ui', 'Theme', 'Singular') + Themes = translate('OpenLP.Ui', 'Themes', 'Plural') + Top = translate('OpenLP.Ui', 'Top') + Version = translate('OpenLP.Ui', 'Version') def add_welcome_page(parent, image): """ @@ -278,8 +305,8 @@ def create_valign_combo(form, parent, layout): verticalLabel.setText(translate('OpenLP.Ui', '&Vertical Align:')) form.verticalComboBox = QtGui.QComboBox(parent) form.verticalComboBox.setObjectName(u'VerticalComboBox') - form.verticalComboBox.addItem(translate('OpenLP.Ui', 'Top')) - form.verticalComboBox.addItem(translate('OpenLP.Ui', 'Middle')) - form.verticalComboBox.addItem(translate('OpenLP.Ui', 'Bottom')) + form.verticalComboBox.addItem(UiStrings.Top) + form.verticalComboBox.addItem(UiStrings.Middle) + form.verticalComboBox.addItem(UiStrings.Bottom) verticalLabel.setBuddy(form.verticalComboBox) layout.addRow(verticalLabel, form.verticalComboBox) diff --git a/openlp/core/ui/aboutdialog.py b/openlp/core/ui/aboutdialog.py index bb09ab91f..19a61b3f8 100644 --- a/openlp/core/ui/aboutdialog.py +++ b/openlp/core/ui/aboutdialog.py @@ -27,6 +27,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, translate +from openlp.core.lib.ui import UiStrings class Ui_AboutDialog(object): def setupUi(self, aboutDialog): @@ -86,8 +87,7 @@ class Ui_AboutDialog(object): QtCore.QMetaObject.connectSlotsByName(aboutDialog) def retranslateUi(self, aboutDialog): - aboutDialog.setWindowTitle(translate('OpenLP.AboutForm', - 'About OpenLP')) + aboutDialog.setWindowTitle(u'%s OpenLP' % UiStrings.About) self.aboutTextEdit.setPlainText(translate('OpenLP.AboutForm', 'OpenLP - Open Source Lyrics ' 'Projection\n' @@ -105,8 +105,7 @@ class Ui_AboutDialog(object): 'consider contributing by using the button below.' )) self.aboutNotebook.setTabText( - self.aboutNotebook.indexOf(self.aboutTab), - translate('OpenLP.AboutForm', 'About')) + self.aboutNotebook.indexOf(self.aboutTab), UiStrings.About) self.creditsTextEdit.setPlainText(translate('OpenLP.AboutForm', 'Project Lead\n' ' Raoul "superfly" Snyman\n' diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index 918335b2e..39fec1f9d 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -135,7 +135,7 @@ class AdvancedTab(SettingsTab): # self.sharedCheckBox.setText( # translate('AdvancedTab', 'Enable a shared data location')) # self.sharedLabel.setText(translate('AdvancedTab', 'Store location:')) -# self.sharedPushButton.setText(translate('AdvancedTab', 'Browse...')) +# self.sharedPushButton.setText(UiStrings.Browse) # self.databaseGroupBox.setTitle(translate('AdvancedTab', 'Databases')) def load(self): diff --git a/openlp/core/ui/displaytagtab.py b/openlp/core/ui/displaytagtab.py index abf0ca44f..30c593d36 100644 --- a/openlp/core/ui/displaytagtab.py +++ b/openlp/core/ui/displaytagtab.py @@ -167,7 +167,7 @@ class DisplayTagTab(SettingsTab): self.deletePushButton.setText(UiStrings.Delete) self.defaultPushButton.setText( translate('OpenLP.DisplayTagTab', 'Default')) - self.newPushButton.setText(translate('OpenLP.DisplayTagTab', 'New')) + self.newPushButton.setText(UiStrings.New) self.tagTableWidget.horizontalHeaderItem(0)\ .setText(translate('OpenLP.DisplayTagTab', 'Description')) self.tagTableWidget.horizontalHeaderItem(1)\ diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index f0c1c9ab0..023bb6b36 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -35,24 +35,24 @@ from PyQt4 import Qt, QtCore, QtGui try: from PyQt4.phonon import Phonon - phonon_version = Phonon.phononVersion() + PHONON_VERSION = Phonon.phononVersion() except ImportError: - phonon_version = u'-' + PHONON_VERSION = u'-' try: import chardet - chardet_version = chardet.__version__ + CHARDET_VERSION = chardet.__version__ except ImportError: - chardet_version = u'-' + CHARDET_VERSION = u'-' try: import enchant - enchant_version = enchant.__version__ + ENCHANT_VERSION = enchant.__version__ except ImportError: - enchant_version = u'-' + ENCHANT_VERSION = u'-' try: import sqlite - sqlite_version = sqlite.version + SQLITE_VERSION = sqlite.version except ImportError: - sqlite_version = u'-' + SQLITE_VERSION = u'-' from openlp.core.lib import translate, SettingsManager from openlp.core.lib.mailto import mailto @@ -85,14 +85,14 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): 'Platform: %s\n')) % platform.platform() libraries = u'Python: %s\n' % platform.python_version() + \ u'Qt4: %s\n' % Qt.qVersion() + \ - u'Phonon: %s\n' % phonon_version + \ + u'Phonon: %s\n' % PHONON_VERSION + \ u'PyQt4: %s\n' % Qt.PYQT_VERSION_STR + \ u'SQLAlchemy: %s\n' % sqlalchemy.__version__ + \ u'BeautifulSoup: %s\n' % BeautifulSoup.__version__ + \ u'lxml: %s\n' % etree.__version__ + \ - u'Chardet: %s\n' % chardet_version + \ - u'PyEnchant: %s\n' % enchant_version + \ - u'PySQLite: %s\n' % sqlite_version + u'Chardet: %s\n' % CHARDET_VERSION + \ + u'PyEnchant: %s\n' % ENCHANT_VERSION + \ + u'PySQLite: %s\n' % SQLITE_VERSION if platform.system() == u'Linux': if os.environ.get(u'KDE_FULL_SESSION') == u'true': system = system + u'Desktop: KDE SC\n' @@ -170,7 +170,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): self.__buttonState(False) self.descriptionWordCount.setText( unicode(translate('OpenLP.ExceptionDialog', - 'Description characters to enter : %s')) % count ) + 'Description characters to enter : %s')) % count) def onAttachFileButtonPressed(self): files = QtGui.QFileDialog.getOpenFileName( diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 12353fed8..2b95088ab 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -28,6 +28,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, Receiver, translate +from openlp.core.lib.ui import UiStrings log = logging.getLogger(__name__) @@ -267,8 +268,7 @@ class GeneralTab(SettingsTab): translate('OpenLP.GeneralTab', ' sec')) self.ccliGroupBox.setTitle( translate('OpenLP.GeneralTab', 'CCLI Details')) - self.numberLabel.setText( - translate('OpenLP.GeneralTab', 'CCLI number:')) + self.numberLabel.setText(UiStrings.CCLINumberLabel) self.usernameLabel.setText( translate('OpenLP.GeneralTab', 'SongSelect username:')) self.passwordLabel.setText( diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index c691c006e..c41ad4b17 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -73,15 +73,15 @@ class Ui_MainWindow(object): # Set up the main container, which contains all the other form widgets. self.MainContent = QtGui.QWidget(mainWindow) self.MainContent.setObjectName(u'MainContent') - self.MainContentLayout = QtGui.QHBoxLayout(self.MainContent) - self.MainContentLayout.setSpacing(0) - self.MainContentLayout.setMargin(0) - self.MainContentLayout.setObjectName(u'MainContentLayout') + self.mainContentLayout = QtGui.QHBoxLayout(self.MainContent) + self.mainContentLayout.setSpacing(0) + self.mainContentLayout.setMargin(0) + self.mainContentLayout.setObjectName(u'mainContentLayout') mainWindow.setCentralWidget(self.MainContent) self.controlSplitter = QtGui.QSplitter(self.MainContent) self.controlSplitter.setOrientation(QtCore.Qt.Horizontal) self.controlSplitter.setObjectName(u'controlSplitter') - self.MainContentLayout.addWidget(self.controlSplitter) + self.mainContentLayout.addWidget(self.controlSplitter) # Create slide controllers self.previewController = SlideController(self, self.settingsmanager, self.screens) @@ -152,10 +152,10 @@ class Ui_MainWindow(object): u'themeManagerDock', u':/system/system_thememanager.png') self.themeManagerDock.setMinimumWidth( self.settingsmanager.mainwindow_right) - self.ThemeManagerContents = ThemeManager(mainWindow, + self.themeManagerContents = ThemeManager(mainWindow, self.themeManagerDock) - self.ThemeManagerContents.setObjectName(u'ThemeManagerContents') - self.themeManagerDock.setWidget(self.ThemeManagerContents) + self.themeManagerContents.setObjectName(u'themeManagerContents') + self.themeManagerDock.setWidget(self.themeManagerContents) mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.themeManagerDock) # Create the menu items @@ -256,8 +256,8 @@ class Ui_MainWindow(object): self.HelpOnlineHelpItem = base_action(mainWindow, u'HelpOnlineHelpItem') self.HelpOnlineHelpItem.setEnabled(False) mainWindow.actionList.add_action(self.HelpOnlineHelpItem, u'Help') - self.HelpWebSiteItem = base_action(mainWindow, u'HelpWebSiteItem') - mainWindow.actionList.add_action(self.HelpWebSiteItem, u'Help') + self.helpWebSiteItem = base_action(mainWindow, u'helpWebSiteItem') + mainWindow.actionList.add_action(self.helpWebSiteItem, u'Help') add_actions(self.FileImportMenu, (self.ImportThemeItem, self.ImportLanguageItem)) add_actions(self.FileExportMenu, @@ -281,7 +281,7 @@ class Ui_MainWindow(object): add_actions(self.ToolsMenu, (self.ToolsAddToolItem, None)) add_actions(self.ToolsMenu, (self.ToolsOpenDataFolder, None)) add_actions(self.HelpMenu, (self.HelpDocumentationItem, - self.HelpOnlineHelpItem, None, self.HelpWebSiteItem, + self.HelpOnlineHelpItem, None, self.helpWebSiteItem, self.HelpAboutItem)) add_actions(self.MenuBar, (self.FileMenu.menuAction(), self.viewMenu.menuAction(), self.ToolsMenu.menuAction(), @@ -340,8 +340,7 @@ class Ui_MainWindow(object): 'Save the current service under a new name.')) self.FileSaveAsItem.setShortcut( translate('OpenLP.MainWindow', 'Ctrl+Shift+S')) - self.printServiceOrderItem.setText( - translate('OpenLP.MainWindow', 'Print Service Order')) + self.printServiceOrderItem.setText(UiStrings.PrintServiceOrder) self.printServiceOrderItem.setStatusTip(translate('OpenLP.MainWindow', 'Print the current Service Order.')) self.printServiceOrderItem.setShortcut( @@ -419,7 +418,7 @@ class Ui_MainWindow(object): translate('OpenLP.MainWindow', 'Ctrl+F1')) self.HelpOnlineHelpItem.setText( translate('OpenLP.MainWindow', '&Online Help')) - self.HelpWebSiteItem.setText( + self.helpWebSiteItem.setText( translate('OpenLP.MainWindow', '&Web Site')) self.AutoLanguageItem.setText( translate('OpenLP.MainWindow', '&Auto Detect')) @@ -492,10 +491,10 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # Set up signals and slots QtCore.QObject.connect(self.ImportThemeItem, QtCore.SIGNAL(u'triggered()'), - self.ThemeManagerContents.onImportTheme) + self.themeManagerContents.onImportTheme) QtCore.QObject.connect(self.ExportThemeItem, QtCore.SIGNAL(u'triggered()'), - self.ThemeManagerContents.onExportTheme) + self.themeManagerContents.onExportTheme) QtCore.QObject.connect(self.ViewMediaManagerItem, QtCore.SIGNAL(u'triggered(bool)'), self.toggleMediaManager) QtCore.QObject.connect(self.ViewServiceManagerItem, @@ -515,7 +514,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.QObject.connect(self.themeManagerDock, QtCore.SIGNAL(u'visibilityChanged(bool)'), self.ViewThemeManagerItem.setChecked) - QtCore.QObject.connect(self.HelpWebSiteItem, + QtCore.QObject.connect(self.helpWebSiteItem, QtCore.SIGNAL(u'triggered()'), self.onHelpWebSiteClicked) QtCore.QObject.connect(self.HelpAboutItem, QtCore.SIGNAL(u'triggered()'), self.onHelpAboutItemClicked) @@ -574,7 +573,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # RenderManager needs to call ThemeManager and # ThemeManager needs to call RenderManager self.renderManager = RenderManager( - self.ThemeManagerContents, self.screens) + self.themeManagerContents, self.screens) # Define the media Dock Manager self.mediaDockManager = MediaDockManager(self.MediaToolBox) log.info(u'Load Plugins') @@ -608,7 +607,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.pluginManager.initialise_plugins() # Once all components are initialised load the Themes log.info(u'Load Themes') - self.ThemeManagerContents.loadThemes() + self.themeManagerContents.loadThemes() log.info(u'Load data from Settings') if QtCore.QSettings().value(u'advanced/save current plugin', QtCore.QVariant(False)).toBool(): diff --git a/openlp/core/ui/plugindialog.py b/openlp/core/ui/plugindialog.py index 74b2d36c0..84f897a65 100644 --- a/openlp/core/ui/plugindialog.py +++ b/openlp/core/ui/plugindialog.py @@ -25,7 +25,9 @@ ############################################################################### from PyQt4 import QtCore, QtGui + from openlp.core.lib import translate +from openlp.core.lib.ui import UiStrings class Ui_PluginViewDialog(object): def setupUi(self, pluginViewDialog): @@ -76,10 +78,8 @@ class Ui_PluginViewDialog(object): translate('OpenLP.PluginForm', 'Plugin List')) self.pluginInfoGroupBox.setTitle( translate('OpenLP.PluginForm', 'Plugin Details')) - self.versionLabel.setText( - translate('OpenLP.PluginForm', 'Version:')) - self.aboutLabel.setText( - translate('OpenLP.PluginForm', 'About:')) + self.versionLabel.setText(u'%s:' % UiStrings.Version) + self.aboutLabel.setText(u'%s:' % UiStrings.About) self.statusLabel.setText( translate('OpenLP.PluginForm', 'Status:')) self.statusComboBox.setItemText(0, diff --git a/openlp/core/ui/pluginform.py b/openlp/core/ui/pluginform.py index 6318a44a5..f8bfe4713 100644 --- a/openlp/core/ui/pluginform.py +++ b/openlp/core/ui/pluginform.py @@ -28,7 +28,7 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import PluginStatus, Receiver, StringContent, translate +from openlp.core.lib import PluginStatus, Receiver, translate from plugindialog import Ui_PluginViewDialog log = logging.getLogger(__name__) @@ -80,15 +80,14 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): # PluginStatus.Inactive status_text = unicode( translate('OpenLP.PluginForm', '%s (Inactive)')) - name_string = plugin.getString(StringContent.Name) - item.setText(status_text % name_string[u'singular']) + item.setText(status_text % plugin.nameStrings[u'singular']) # If the plugin has an icon, set it! if plugin.icon: item.setIcon(plugin.icon) self.pluginListWidget.addItem(item) pluginListWidth = max(pluginListWidth, self.fontMetrics().width( unicode(translate('OpenLP.PluginForm', '%s (Inactive)')) % - name_string[u'singular'])) + plugin.nameStrings[u'singular'])) self.pluginListWidget.setFixedWidth(pluginListWidth + self.pluginListWidget.iconSize().width() + 48) @@ -118,8 +117,7 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): self.pluginListWidget.currentItem().text().split(u' ')[0] self.activePlugin = None for plugin in self.parent.pluginManager.plugins: - name_string = plugin.getString(StringContent.Name) - if name_string[u'singular'] == plugin_name_singular: + if plugin.nameStrings[u'singular'] == plugin_name_singular: self.activePlugin = plugin break if self.activePlugin: @@ -147,6 +145,5 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): elif self.activePlugin.status == PluginStatus.Disabled: status_text = unicode( translate('OpenLP.PluginForm', '%s (Disabled)')) - name_string = self.activePlugin.getString(StringContent.Name) self.pluginListWidget.currentItem().setText( - status_text % name_string[u'singular']) + status_text % self.activePlugin.nameStrings[u'singular']) diff --git a/openlp/core/ui/printserviceorderdialog.py b/openlp/core/ui/printserviceorderdialog.py index f8db4d1c0..c27035fda 100644 --- a/openlp/core/ui/printserviceorderdialog.py +++ b/openlp/core/ui/printserviceorderdialog.py @@ -27,6 +27,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, translate, SpellTextEdit +from openlp.core.lib.ui import UiStrings class Ui_PrintServiceOrderDialog(object): def setupUi(self, printServiceOrderDialog): @@ -116,8 +117,7 @@ class Ui_PrintServiceOrderDialog(object): QtCore.QMetaObject.connectSlotsByName(printServiceOrderDialog) def retranslateUi(self, printServiceOrderDialog): - printServiceOrderDialog.setWindowTitle( - translate('OpenLP.PrintServiceOrderForm', 'Print Service Order')) + printServiceOrderDialog.setWindowTitle(UiStrings.PrintServiceOrder) self.previewLabel.setText( translate('OpenLP.ServiceManager', 'Preview:')) self.printSlideTextCheckBox.setText(translate( @@ -132,6 +132,6 @@ class Ui_PrintServiceOrderDialog(object): self.serviceTitleLineEdit.setText(translate('OpenLP.ServiceManager', 'Service Order Sheet')) self.printButton.setText(translate('OpenLP.ServiceManager', 'Print')) - self.cancelButton.setText(translate('OpenLP.ServiceManager', 'Cancel')) + self.cancelButton.setText(UiStrings.Cancel) self.customNotesLabel.setText( translate('OpenLP.ServiceManager', 'Custom Service Notes:')) diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py index 430426fd5..82238d738 100644 --- a/openlp/core/ui/screen.py +++ b/openlp/core/ui/screen.py @@ -71,7 +71,7 @@ class ScreenList(object): """ Set up the current screen dimensions """ - log.debug(u'set_current_display %s', number, ) + log.debug(u'set_current_display %s', number) if number + 1 > self.display_count: self.current = self.screen_list[0] self.override = copy.deepcopy(self.current) @@ -99,4 +99,4 @@ class ScreenList(object): user wants to use the correct screen attributes """ log.debug(u'reset_current_display') - self.set_current_display(self.current_display) \ No newline at end of file + self.set_current_display(self.current_display) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 623c2d641..5568ba431 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -33,8 +33,8 @@ log = logging.getLogger(__name__) from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, ServiceItem, context_menu_action, \ - Receiver, build_icon, ItemCapabilities, SettingsManager, translate, \ - ThemeLevel + Receiver, build_icon, ItemCapabilities, SettingsManager, translate +from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui.printserviceorderform import PrintServiceOrderForm @@ -107,8 +107,7 @@ class ServiceManager(QtGui.QWidget): translate('OpenLP.ServiceManager', 'Save this service'), self.saveFile) self.toolbar.addSeparator() - self.themeLabel = QtGui.QLabel(translate('OpenLP.ServiceManager', - 'Theme:'), self) + self.themeLabel = QtGui.QLabel(u'%s:' % UiStrings.Theme, self) self.themeLabel.setMargin(3) self.themeLabel.setObjectName(u'themeLabel') self.toolbar.addToolbarWidget(u'ThemeLabel', self.themeLabel) @@ -1062,8 +1061,8 @@ class ServiceManager(QtGui.QWidget): if self.serviceItems[item][u'service_item']\ .is_capable(ItemCapabilities.AllowsEdit): Receiver.send_message(u'%s_edit' % - self.serviceItems[item][u'service_item'].name.lower(), u'L:%s' % - self.serviceItems[item][u'service_item'].edit_id ) + self.serviceItems[item][u'service_item'].name.lower(), + u'L:%s' % self.serviceItems[item][u'service_item'].edit_id) def findServiceItem(self): """ diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 0de4bea7f..240bbf93c 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -101,7 +101,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): else: shortcutText = action.shortcut().toString() alternateText = u'' - actionItem = QtGui.QTreeWidgetItem([actionText, shortcutText, alternateText]) + actionItem = QtGui.QTreeWidgetItem( + [actionText, shortcutText, alternateText]) actionItem.setIcon(0, action.icon()) item.addChild(actionItem) item.setExpanded(True) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 9177e313f..2d3a7e61d 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -191,8 +191,7 @@ class SlideController(QtGui.QWidget): 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.setSuffix(UiStrings.S) self.delaySpinBox.setToolTip(translate('OpenLP.SlideController', 'Delay between slides in seconds')) else: @@ -606,7 +605,7 @@ class SlideController(QtGui.QWidget): # These tags are already translated. verse_def = frame[u'verseTag'] verse_def = u'%s%s' % (verse_def[0].upper(), verse_def[1:]) - two_line_def = u'%s\n%s' % (verse_def[0], verse_def[1:] ) + two_line_def = u'%s\n%s' % (verse_def[0], verse_def[1:]) row = two_line_def if self.isLive: if verse_def not in self.slideList: diff --git a/openlp/core/ui/starttimedialog.py b/openlp/core/ui/starttimedialog.py index 8dcc2c9ee..d87df71c4 100644 --- a/openlp/core/ui/starttimedialog.py +++ b/openlp/core/ui/starttimedialog.py @@ -27,7 +27,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import create_accept_reject_button_box +from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box class Ui_StartTimeDialog(object): def setupUi(self, StartTimeDialog): @@ -65,6 +65,6 @@ class Ui_StartTimeDialog(object): self.hourLabel.setText(translate('OpenLP.StartTimeForm', 'Hours:')) self.hourSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 'h')) self.minuteSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 'm')) - self.secondSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 's')) + self.secondSpinBox.setSuffix(UiStrings.S) self.minuteLabel.setText(translate('OpenLP.StartTimeForm', 'Minutes:')) self.secondLabel.setText(translate('OpenLP.StartTimeForm', 'Seconds:')) diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index ad9e80d66..17572f530 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -29,8 +29,8 @@ import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import translate, BackgroundType, BackgroundGradientType, \ - Receiver +from openlp.core.lib import Receiver, translate +from openlp.core.lib.theme import BackgroundType, BackgroundGradientType from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.utils import get_images_filter from themewizard import Ui_ThemeWizard @@ -204,7 +204,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): # Do not trigger on start up if self.currentPage != self.welcomePage: self.updateTheme() - frame = self.thememanager.generateImage(self.theme, True) + self.thememanager.generateImage(self.theme, True) def updateLinesText(self, lines): """ @@ -301,7 +301,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): 'Edit Theme - %s')) % self.theme.theme_name) self.next() else: - self.setWindowTitle(translate('OpenLP.ThemeWizard', 'New Theme')) + self.setWindowTitle(UiStrings.NewTheme) return QtGui.QWizard.exec_(self) def initializePage(self, id): diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 78c4596e3..378f5b365 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -32,10 +32,11 @@ import logging from xml.etree.ElementTree import ElementTree, XML from PyQt4 import QtCore, QtGui -from openlp.core.lib import OpenLPToolbar, ThemeXML, get_text_file_string, \ - build_icon, Receiver, SettingsManager, translate, check_item_selected, \ - BackgroundType, BackgroundGradientType, check_directory_exists, \ - VerticalType +from openlp.core.lib import OpenLPToolbar, get_text_file_string, build_icon, \ + Receiver, SettingsManager, translate, check_item_selected, \ + check_directory_exists +from openlp.core.lib.theme import ThemeXML, BackgroundType, VerticalType, \ + BackgroundGradientType from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.theme import Theme from openlp.core.ui import FileRenameForm, ThemeForm @@ -62,8 +63,7 @@ class ThemeManager(QtGui.QWidget): self.layout.setMargin(0) self.layout.setObjectName(u'layout') self.toolbar = OpenLPToolbar(self) - self.toolbar.addToolbarButton( - translate('OpenLP.ThemeManager', 'New Theme'), + self.toolbar.addToolbarButton(UiStrings.NewTheme, u':/themes/theme_new.png', translate('OpenLP.ThemeManager', 'Create a new theme.'), self.onAddTheme) diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index ba4ce5acb..6a3505e93 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -26,7 +26,8 @@ from PyQt4 import QtCore, QtGui -from openlp.core.lib import SettingsTab, Receiver, ThemeLevel, translate +from openlp.core.lib import SettingsTab, Receiver, translate +from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.ui import UiStrings class ThemesTab(SettingsTab): @@ -199,7 +200,7 @@ class ThemesTab(SettingsTab): """ Utility method to update the global theme preview image. """ - image = self.parent.ThemeManagerContents.getPreviewImage( + image = self.parent.themeManagerContents.getPreviewImage( self.global_theme) preview = QtGui.QPixmap(unicode(image)) if not preview.isNull(): diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py index 38dd9f1dc..a482e2703 100644 --- a/openlp/core/ui/themewizard.py +++ b/openlp/core/ui/themewizard.py @@ -27,7 +27,9 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate, build_icon -from openlp.core.lib.ui import add_welcome_page, create_valign_combo +from openlp.core.lib.theme import HorizontalType, BackgroundType, \ + BackgroundGradientType +from openlp.core.lib.ui import UiStrings, add_welcome_page, create_valign_combo class Ui_ThemeWizard(object): def setupUi(self, themeWizard): @@ -417,12 +419,12 @@ class Ui_ThemeWizard(object): 'according to the parameters below.')) self.backgroundLabel.setText( translate('OpenLP.ThemeWizard', 'Background type:')) - self.backgroundComboBox.setItemText(0, + self.backgroundComboBox.setItemText(BackgroundType.Solid, translate('OpenLP.ThemeWizard', 'Solid Color')) - self.backgroundComboBox.setItemText(1, + self.backgroundComboBox.setItemText(BackgroundType.Gradient, translate('OpenLP.ThemeWizard', 'Gradient')) - self.backgroundComboBox.setItemText(2, - translate('OpenLP.ThemeWizard', 'Image')) + self.backgroundComboBox.setItemText( + BackgroundType.Image, UiStrings.Image) self.colorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:')) self.gradientStartLabel.setText( translate(u'OpenLP.ThemeWizard', 'Starting color:')) @@ -430,17 +432,17 @@ class Ui_ThemeWizard(object): translate(u'OpenLP.ThemeWizard', 'Ending color:')) self.gradientTypeLabel.setText( translate('OpenLP.ThemeWizard', 'Gradient:')) - self.gradientComboBox.setItemText(0, + self.gradientComboBox.setItemText(BackgroundGradientType.Horizontal, translate('OpenLP.ThemeWizard', 'Horizontal')) - self.gradientComboBox.setItemText(1, + self.gradientComboBox.setItemText(BackgroundGradientType.Vertical, translate('OpenLP.ThemeWizard', 'Vertical')) - self.gradientComboBox.setItemText(2, + self.gradientComboBox.setItemText(BackgroundGradientType.Circular, translate('OpenLP.ThemeWizard', 'Circular')) - self.gradientComboBox.setItemText(3, + self.gradientComboBox.setItemText(BackgroundGradientType.LeftTop, translate('OpenLP.ThemeWizard', 'Top Left - Bottom Right')) - self.gradientComboBox.setItemText(4, + self.gradientComboBox.setItemText(BackgroundGradientType.LeftBottom, translate('OpenLP.ThemeWizard', 'Bottom Left - Top Right')) - self.imageLabel.setText(translate('OpenLP.ThemeWizard', 'Image:')) + self.imageLabel.setText(u'%s:' % UiStrings.Image) self.mainAreaPage.setTitle( translate('OpenLP.ThemeWizard', 'Main Area Font Details')) self.mainAreaPage.setSubTitle( @@ -449,17 +451,17 @@ class Ui_ThemeWizard(object): self.mainFontLabel.setText(translate('OpenLP.ThemeWizard', 'Font:')) self.mainColorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:')) self.mainSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) - self.mainSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt')) + self.mainSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit) self.lineSpacingLabel.setText( translate('OpenLP.ThemeWizard', 'Line Spacing:')) - self.lineSpacingSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt')) + self.lineSpacingSpinBox.setSuffix(UiStrings.FontSizePtUnit) self.outlineCheckBox.setText( translate('OpenLP.ThemeWizard', '&Outline:')) self.outlineSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) - self.outlineSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt')) + self.outlineSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit) self.shadowCheckBox.setText(translate('OpenLP.ThemeWizard', '&Shadow:')) self.shadowSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) - self.shadowSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt')) + self.shadowSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit) self.mainBoldCheckBox.setText(translate('OpenLP.ThemeWizard', 'Bold')) self.mainItalicsCheckBox.setText( translate('OpenLP.ThemeWizard', 'Italic')) @@ -471,7 +473,7 @@ class Ui_ThemeWizard(object): self.footerFontLabel.setText(translate('OpenLP.ThemeWizard', 'Font:')) self.footerColorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:')) self.footerSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) - self.footerSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt')) + self.footerSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit) self.alignmentPage.setTitle( translate('OpenLP.ThemeWizard', 'Text Formatting Details')) self.alignmentPage.setSubTitle( @@ -479,11 +481,11 @@ class Ui_ThemeWizard(object): 'formatting information to be defined')) self.horizontalLabel.setText( translate('OpenLP.ThemeWizard', 'Horizontal Align:')) - self.horizontalComboBox.setItemText(0, + self.horizontalComboBox.setItemText(HorizontalType.Left, translate('OpenLP.ThemeWizard', 'Left')) - self.horizontalComboBox.setItemText(1, + self.horizontalComboBox.setItemText(HorizontalType.Right, translate('OpenLP.ThemeWizard', 'Right')) - self.horizontalComboBox.setItemText(2, + self.horizontalComboBox.setItemText(HorizontalType.Center, translate('OpenLP.ThemeWizard', 'Center')) self.transitionsLabel.setText( translate('OpenLP.ThemeWizard', 'Transitions:')) diff --git a/openlp/core/ui/wizard.py b/openlp/core/ui/wizard.py index d3410ded9..2960607e4 100644 --- a/openlp/core/ui/wizard.py +++ b/openlp/core/ui/wizard.py @@ -31,11 +31,50 @@ import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import build_icon, Receiver, SettingsManager +from openlp.core.lib import build_icon, Receiver, SettingsManager, translate from openlp.core.lib.ui import UiStrings, add_welcome_page log = logging.getLogger(__name__) +class WizardStrings(object): + """ + Provide standard strings for wizards to use. + """ + # Applications/Formats we import from or export to. These get used in + # multiple places but do not need translating unless you find evidence of + # the writers translating their own product name. + CCLI = u'CCLI/SongSelect' + CSV = u'CSV' + EW = u'EasyWorship' + ES = u'EasiSlides' + OL = u'OpenLyrics' + OS = u'OpenSong' + OSIS = u'OSIS' + SB = u'SongBeamer' + SoF = u'Songs of Fellowship' + SSP = u'SongShow Plus' + WoW = u'Words of Worship' + # These strings should need a good reason to be retranslated elsewhere. + FinishedImport = translate('OpenLP.Ui', 'Finished import.') + FormatLabel = translate('OpenLP.Ui', 'Format:') + HeaderStyle = u'%s' + Importing = translate('OpenLP.Ui', 'Importing') + ImportingType = unicode(translate('OpenLP.Ui', 'Importing "%s"...')) + ImportSelect = translate('OpenLP.Ui', 'Select Import Source') + ImportSelectLong = unicode(translate('OpenLP.Ui', + 'Select the import format and the location to import from.')) + NoSqlite = translate('OpenLP.Ui', 'The openlp.org 1.x importer has been ' + 'disabled due to a missing Python module. If you want to use this ' + 'importer, you will need to install the "python-sqlite" ' + 'module.') + OpenTypeFile = unicode(translate('OpenLP.Ui', 'Open %s File')) + PercentSymbolFormat = unicode(translate('OpenLP.Ui', '%p%')) + Ready = translate('OpenLP.Ui', 'Ready.') + StartingImport = translate('OpenLP.Ui', 'Starting import...') + YouSpecifyFile = unicode(translate('OpenLP.Ui', 'You need to specify at ' + 'least one %s file to import from.', 'A file type e.g. OpenSong')) + + class OpenLPWizard(QtGui.QWizard): """ Generic OpenLP wizard to provide generic functionality and a unified look @@ -43,6 +82,7 @@ class OpenLPWizard(QtGui.QWizard): """ def __init__(self, parent, plugin, name, image): QtGui.QWizard.__init__(self, parent) + self.plugin = plugin self.setObjectName(name) self.openIcon = build_icon(u':/general/general_open.png') self.deleteIcon = build_icon(u':/general/general_delete.png') @@ -50,7 +90,6 @@ class OpenLPWizard(QtGui.QWizard): self.cancelButton = self.button(QtGui.QWizard.CancelButton) self.setupUi(image) self.registerFields() - self.plugin = plugin self.customInit() self.customSignals() QtCore.QObject.connect(self, QtCore.SIGNAL(u'currentIdChanged(int)'), diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py index 48a4527ed..ac7316df2 100644 --- a/openlp/plugins/alerts/lib/alertstab.py +++ b/openlp/plugins/alerts/lib/alertstab.py @@ -109,12 +109,10 @@ class AlertsTab(SettingsTab): translate('AlertsPlugin.AlertsTab', 'Background color:')) self.FontSizeLabel.setText( translate('AlertsPlugin.AlertsTab', 'Font size:')) - self.FontSizeSpinBox.setSuffix( - translate('AlertsPlugin.AlertsTab', 'pt')) + self.FontSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit) self.TimeoutLabel.setText( translate('AlertsPlugin.AlertsTab', 'Alert timeout:')) - self.TimeoutSpinBox.setSuffix( - translate('AlertsPlugin.AlertsTab', 's')) + self.TimeoutSpinBox.setSuffix(UiStrings.S) self.PreviewGroupBox.setTitle(UiStrings.Preview) self.FontPreview.setText(UiStrings.OLPV2) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 463c838c9..7ec8e1394 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -35,8 +35,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, translate from openlp.core.lib.db import delete_database -from openlp.core.lib.ui import critical_error_message_box -from openlp.core.ui.wizard import OpenLPWizard +from openlp.core.lib.ui import UiStrings, critical_error_message_box +from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.utils import AppLocation, string_is_unicode from openlp.plugins.bibles.lib.manager import BibleFormat @@ -51,18 +51,7 @@ class WebDownload(object): BibleGateway = 1 Bibleserver = 2 - Names = { - 0: u'Crosswalk', - 1: u'BibleGateway', - 2: u'Bibleserver' - } - - @classmethod - def get_name(cls, name): - """ - Get the web bible type name. - """ - return cls.Names[name] + Names = [u'Crosswalk', u'BibleGateway', u'Bibleserver'] class BibleImportForm(OpenLPWizard): @@ -363,32 +352,22 @@ class BibleImportForm(OpenLPWizard): """ self.setWindowTitle( translate('BiblesPlugin.ImportWizardForm', 'Bible Import Wizard')) - self.titleLabel.setText( - u'%s' % \ - translate('BiblesPlugin.ImportWizardForm', - 'Welcome to the Bible Import Wizard')) + self.titleLabel.setText(WizardStrings.HeaderStyle % + translate('OpenLP.Ui', 'Welcome to the Bible Import Wizard')) self.informationLabel.setText( translate('BiblesPlugin.ImportWizardForm', - '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.')) - self.selectPage.setTitle(translate('BiblesPlugin.ImportWizardForm', - 'Select Import Source')) - self.selectPage.setSubTitle( - translate('BiblesPlugin.ImportWizardForm', - 'Select the import format, and where to import from.')) - self.formatLabel.setText( - translate('BiblesPlugin.ImportWizardForm', 'Format:')) - self.formatComboBox.setItemText(0, - translate('BiblesPlugin.ImportWizardForm', 'OSIS')) - self.formatComboBox.setItemText(1, - translate('BiblesPlugin.ImportWizardForm', 'CSV')) - self.formatComboBox.setItemText(2, - translate('BiblesPlugin.ImportWizardForm', 'OpenSong')) - self.formatComboBox.setItemText(3, + '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.')) + self.selectPage.setTitle(WizardStrings.ImportSelect) + self.selectPage.setSubTitle(WizardStrings.ImportSelectLong) + self.formatLabel.setText(WizardStrings.FormatLabel) + self.formatComboBox.setItemText(BibleFormat.OSIS, WizardStrings.OSIS) + self.formatComboBox.setItemText(BibleFormat.CSV, WizardStrings.CSV) + self.formatComboBox.setItemText(BibleFormat.OpenSong, WizardStrings.OS) + self.formatComboBox.setItemText(BibleFormat.WebDownload, translate('BiblesPlugin.ImportWizardForm', 'Web Download')) - self.formatComboBox.setItemText(4, - translate('BiblesPlugin.ImportWizardForm', 'openlp.org 1.x')) + self.formatComboBox.setItemText(BibleFormat.OpenLP1, UiStrings.OLPV1) self.openlp1FileLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Bible file:')) self.osisFileLabel.setText( @@ -403,11 +382,11 @@ class BibleImportForm(OpenLPWizard): translate('BiblesPlugin.ImportWizardForm', 'Bible file:')) self.webSourceLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Location:')) - self.webSourceComboBox.setItemText(0, + self.webSourceComboBox.setItemText(WebDownload.Crosswalk, translate('BiblesPlugin.ImportWizardForm', 'Crosswalk')) - self.webSourceComboBox.setItemText(1, + self.webSourceComboBox.setItemText(WebDownload.BibleGateway, translate('BiblesPlugin.ImportWizardForm', 'BibleGateway')) - self.webSourceComboBox.setItemText(2, + self.webSourceComboBox.setItemText(WebDownload.Bibleserver, translate('BiblesPlugin.ImportWizardForm', 'Bibleserver')) self.webTranslationLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Bible:')) @@ -435,19 +414,13 @@ class BibleImportForm(OpenLPWizard): translate('BiblesPlugin.ImportWizardForm', 'Copyright:')) self.permissionsLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Permissions:')) - self.progressPage.setTitle( - translate('BiblesPlugin.ImportWizardForm', 'Importing')) + self.progressPage.setTitle(WizardStrings.Importing) self.progressPage.setSubTitle( translate('BiblesPlugin.ImportWizardForm', 'Please wait while your Bible is imported.')) - self.progressLabel.setText( - translate('BiblesPlugin.ImportWizardForm', 'Ready.')) + self.progressLabel.setText(WizardStrings.Ready) self.progressBar.setFormat(u'%p%') - self.openlp1DisabledLabel.setText( - translate('BiblesPlugin.ImportWizardForm', 'The openlp.org 1.x ' - 'importer has been disabled due to a missing Python module. If ' - 'you want to use this importer, you will need to install the ' - '"python-sqlite" module.')) + self.openlp1DisabledLabel.setText(WizardStrings.NoSqlite) # Align all QFormLayouts towards each other. labelWidth = max(self.formatLabel.minimumSizeHint().width(), self.osisFileLabel.minimumSizeHint().width(), @@ -468,37 +441,28 @@ class BibleImportForm(OpenLPWizard): elif self.currentPage() == self.selectPage: if self.field(u'source_format').toInt()[0] == BibleFormat.OSIS: if not self.field(u'osis_location').toString(): - critical_error_message_box( - translate('BiblesPlugin.ImportWizardForm', - 'Invalid Bible Location'), - translate('BiblesPlugin.ImportWizardForm', - 'You need to specify a file to import your ' - 'Bible from.')) + critical_error_message_box(UiStrings.NFSs, + WizardStrings.YouSpecifyFile % WizardStrings.OSIS) self.osisFileEdit.setFocus() return False elif self.field(u'source_format').toInt()[0] == BibleFormat.CSV: if not self.field(u'csv_testamentsfile').toString(): - answer = critical_error_message_box(translate( - 'BiblesPlugin.ImportWizardForm', 'No Testaments File'), + answer = critical_error_message_box(UiStrings.NFSs, translate('BiblesPlugin.ImportWizardForm', 'You have not specified a testaments file. Do you ' 'want to proceed with the import?'), question=True) if answer == QtGui.QMessageBox.No: self.csvTestamentsEdit.setFocus() return False - elif not self.field(u'csv_booksfile').toString(): - critical_error_message_box( - translate('BiblesPlugin.ImportWizardForm', - 'Invalid Books File'), + if not self.field(u'csv_booksfile').toString(): + critical_error_message_box(UiStrings.NFSs, translate('BiblesPlugin.ImportWizardForm', 'You need to specify a file with books of ' 'the Bible to use in the import.')) self.csvBooksEdit.setFocus() return False elif not self.field(u'csv_versefile').toString(): - critical_error_message_box( - translate('BiblesPlugin.ImportWizardForm', - 'Invalid Verse File'), + critical_error_message_box(UiStrings.NFSs, translate('BiblesPlugin.ImportWizardForm', 'You need to specify a file of Bible ' 'verses to import.')) @@ -507,22 +471,14 @@ class BibleImportForm(OpenLPWizard): elif self.field(u'source_format').toInt()[0] == \ BibleFormat.OpenSong: if not self.field(u'opensong_file').toString(): - critical_error_message_box( - translate('BiblesPlugin.ImportWizardForm', - 'Invalid OpenSong Bible'), - translate('BiblesPlugin.ImportWizardForm', - 'You need to specify an OpenSong Bible ' - 'file to import.')) + critical_error_message_box(UiStrings.NFSs, + WizardStrings.YouSpecifyFile % WizardStrings.OS) self.openSongFileEdit.setFocus() return False elif self.field(u'source_format').toInt()[0] == BibleFormat.OpenLP1: if not self.field(u'openlp1_location').toString(): - critical_error_message_box( - translate('BiblesPlugin.ImportWizardForm', - 'Invalid Bible Location'), - translate('BiblesPlugin.ImportWizardForm', - 'You need to specify a file to import your ' - 'Bible from.')) + critical_error_message_box(UiStrings.NFSs, + WizardStrings.YouSpecifyFile % UiStrings.OLPV1) self.openlp1FileEdit.setFocus() return False return True @@ -531,17 +487,13 @@ class BibleImportForm(OpenLPWizard): license_copyright = \ unicode(self.field(u'license_copyright').toString()) if not license_version: - critical_error_message_box( - translate('BiblesPlugin.ImportWizardForm', - 'Empty Version Name'), + critical_error_message_box(UiStrings.EmptyField, translate('BiblesPlugin.ImportWizardForm', 'You need to specify a version name for your Bible.')) self.versionNameEdit.setFocus() return False elif not license_copyright: - critical_error_message_box( - translate('BiblesPlugin.ImportWizardForm', - 'Empty Copyright'), + critical_error_message_box(UiStrings.EmptyField, translate('BiblesPlugin.ImportWizardForm', 'You need to set a copyright for your Bible. ' 'Bibles in the Public Domain need to be marked as such.')) @@ -576,24 +528,22 @@ class BibleImportForm(OpenLPWizard): """ Show the file open dialog for the OSIS file. """ - self.getFileName( - translate('BiblesPlugin.ImportWizardForm', 'Open OSIS File'), + self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.OSIS, self.osisFileEdit) def onCsvTestamentsBrowseButtonClicked(self): """ Show the file open dialog for the testaments CSV file. """ - self.getFileName(translate('BiblesPlugin.ImportWizardForm', - 'Open Testaments CSV File'), self.csvTestamentsEdit, u'%s (*.csv)' + self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.CSV, + self.csvTestamentsEdit, u'%s (*.csv)' % translate('BiblesPlugin.ImportWizardForm', 'CSV File')) def onCsvBooksBrowseButtonClicked(self): """ Show the file open dialog for the books CSV file. """ - self.getFileName( - translate('BiblesPlugin.ImportWizardForm', 'Open Books CSV File'), + self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.CSV, self.csvBooksEdit, u'%s (*.csv)' % translate('BiblesPlugin.ImportWizardForm', 'CSV File')) @@ -601,27 +551,24 @@ class BibleImportForm(OpenLPWizard): """ Show the file open dialog for the verses CSV file. """ - self.getFileName(translate('BiblesPlugin.ImportWizardForm', - 'Open Verses CSV File'), self.csvVersesEdit, u'%s (*.csv)' + self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.CSV, + self.csvVersesEdit, u'%s (*.csv)' % translate('BiblesPlugin.ImportWizardForm', 'CSV File')) def onOpenSongBrowseButtonClicked(self): """ Show the file open dialog for the OpenSong file. """ - self.getFileName( - translate('BiblesPlugin.ImportWizardForm', 'Open OpenSong Bible'), + self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.OS, self.openSongFileEdit) def onOpenlp1BrowseButtonClicked(self): """ Show the file open dialog for the openlp.org 1.x file. """ - self.getFileName( - translate('BiblesPlugin.ImportWizardForm', - 'Open openlp.org 1.x Bible'), self.openlp1FileEdit, - u'%s (*.bible)' % translate('BiblesPlugin.ImportWizardForm', - 'openlp.org 1.x bible')) + self.getFileName(WizardStrings.OpenTypeFile % UiStrings.OLPV1, + self.openlp1FileEdit, u'%s (*.bible)' % + translate('BiblesPlugin.ImportWizardForm', 'openlp.org 1.x bible')) def registerFields(self): """ @@ -722,7 +669,7 @@ class BibleImportForm(OpenLPWizard): self.web_bible_list[download_type][ver] = name.strip() except IOError: log.exception(u'%s resources missing' % - WebDownload.get_name(download_type)) + WebDownload.Names[download_type]) finally: if books_file: books_file.close() @@ -738,8 +685,7 @@ class BibleImportForm(OpenLPWizard): 'BiblesPlugin.ImportWizardForm', 'Starting Registering bible...')) else: - self.progressLabel.setText(translate( - 'BiblesPlugin.ImportWizardForm', 'Starting import...')) + self.progressLabel.setText(WizardStrings.StartingImport) Receiver.send_message(u'openlp_process_events') def performWizard(self): @@ -777,18 +723,10 @@ class BibleImportForm(OpenLPWizard): self.progressBar.setMaximum(1) download_location = self.field(u'web_location').toInt()[0] bible_version = unicode(self.webTranslationComboBox.currentText()) - if download_location == WebDownload.Crosswalk: - bible = \ - self.web_bible_list[WebDownload.Crosswalk][bible_version] - elif download_location == WebDownload.BibleGateway: - bible = \ - self.web_bible_list[WebDownload.BibleGateway][bible_version] - elif download_location == WebDownload.Bibleserver: - bible = \ - self.web_bible_list[WebDownload.Bibleserver][bible_version] + bible = self.web_bible_list[download_location][bible_version] importer = self.manager.import_bible( BibleFormat.WebDownload, name=license_version, - download_source=WebDownload.get_name(download_location), + download_source=WebDownload.Names[download_location], download_name=bible, proxy_server=unicode(self.field(u'proxy_server').toString()), proxy_username=\ @@ -811,8 +749,7 @@ class BibleImportForm(OpenLPWizard): 'bible. Please note, that verses will be downloaded on\n' 'demand and thus an internet connection is required.')) else: - self.progressLabel.setText(translate( - 'BiblesPlugin.ImportWizardForm', 'Finished import.')) + self.progressLabel.setText(WizardStrings.FinishedImport) else: self.progressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Your Bible import failed.')) diff --git a/openlp/plugins/bibles/lib/__init__.py b/openlp/plugins/bibles/lib/__init__.py index 314651ced..78cb6b645 100644 --- a/openlp/plugins/bibles/lib/__init__.py +++ b/openlp/plugins/bibles/lib/__init__.py @@ -32,6 +32,25 @@ import re log = logging.getLogger(__name__) +class LayoutStyle(object): + """ + An enumeration for bible screen layout styles. + """ + VersePerSlide = 0 + VersePerLine = 1 + Continuous = 2 + + +class DisplayStyle(object): + """ + An enumeration for bible text bracket display styles. + """ + NoBrackets = 0 + Round = 1 + Curly = 2 + Square = 3 + + def get_reference_match(match_type): """ Provides the regexes and matches to use while parsing strings for bible diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index f6bd27324..09e32ad8c 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -29,6 +29,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, SettingsTab, translate +from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle log = logging.getLogger(__name__) @@ -122,19 +123,19 @@ class BiblesTab(SettingsTab): translate('BiblesPlugin.BiblesTab', 'Display style:')) self.BibleThemeLabel.setText( translate('BiblesPlugin.BiblesTab', 'Bible theme:')) - self.LayoutStyleComboBox.setItemText(0, + self.LayoutStyleComboBox.setItemText(LayoutStyle.VersePerSlide, translate('BiblesPlugin.BiblesTab', 'Verse Per Slide')) - self.LayoutStyleComboBox.setItemText(1, + self.LayoutStyleComboBox.setItemText(LayoutStyle.VersePerLine, translate('BiblesPlugin.BiblesTab', 'Verse Per Line')) - self.LayoutStyleComboBox.setItemText(2, + self.LayoutStyleComboBox.setItemText(LayoutStyle.Continuous, translate('BiblesPlugin.BiblesTab', 'Continuous')) - self.DisplayStyleComboBox.setItemText(0, + self.DisplayStyleComboBox.setItemText(DisplayStyle.NoBrackets, translate('BiblesPlugin.BiblesTab', 'No Brackets')) - self.DisplayStyleComboBox.setItemText(1, + self.DisplayStyleComboBox.setItemText(DisplayStyle.Round, translate('BiblesPlugin.BiblesTab', '( And )')) - self.DisplayStyleComboBox.setItemText(2, + self.DisplayStyleComboBox.setItemText(DisplayStyle.Curly, translate('BiblesPlugin.BiblesTab', '{ And }')) - self.DisplayStyleComboBox.setItemText(3, + self.DisplayStyleComboBox.setItemText(DisplayStyle.Square, translate('BiblesPlugin.BiblesTab', '[ And ]')) self.ChangeNoteLabel.setText(translate('BiblesPlugin.BiblesTab', 'Note:\nChanges do not affect verses already in the service.')) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index a6ceba6ac..deae98fcb 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -34,7 +34,8 @@ from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings, add_widget_completer, \ media_item_combo_box, critical_error_message_box from openlp.plugins.bibles.forms import BibleImportForm -from openlp.plugins.bibles.lib import get_reference_match +from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ + get_reference_match log = logging.getLogger(__name__) @@ -56,6 +57,7 @@ class BibleMediaItem(MediaManagerItem): self.IconPath = u'songs/song' MediaManagerItem.__init__(self, parent, plugin, icon) # Place to store the search results for both bibles. + self.settings = self.parent.settings_tab self.search_results = {} self.second_search_results = {} QtCore.QObject.connect(Receiver.get_receiver(), @@ -235,18 +237,15 @@ class BibleMediaItem(MediaManagerItem): def retranslateUi(self): log.debug(u'retranslateUi') - self.quickVersionLabel.setText( - translate('BiblesPlugin.MediaItem', 'Version:')) + self.quickVersionLabel.setText(u'%s:' % UiStrings.Version) self.quickSecondLabel.setText( translate('BiblesPlugin.MediaItem', 'Second:')) self.quickSearchLabel.setText( translate('BiblesPlugin.MediaItem', 'Find:')) - self.quickSearchButton.setText( - translate('BiblesPlugin.MediaItem', 'Search')) + self.quickSearchButton.setText(UiStrings.Search) self.quickClearLabel.setText( translate('BiblesPlugin.MediaItem', 'Results:')) - self.advancedVersionLabel.setText( - translate('BiblesPlugin.MediaItem', 'Version:')) + self.advancedVersionLabel.setText(u'%s:' % UiStrings.Version) self.advancedSecondLabel.setText( translate('BiblesPlugin.MediaItem', 'Second:')) self.advancedBookLabel.setText( @@ -261,8 +260,7 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'To:')) self.advancedClearLabel.setText( translate('BiblesPlugin.MediaItem', 'Results:')) - self.advancedSearchButton.setText( - translate('BiblesPlugin.MediaItem', 'Search')) + self.advancedSearchButton.setText(UiStrings.Search) self.quickClearComboBox.addItem( translate('BiblesPlugin.MediaItem', 'Clear')) self.quickClearComboBox.addItem( @@ -670,12 +668,12 @@ class BibleMediaItem(MediaManagerItem): raw_slides.append(bible_text.rstrip()) bible_text = u'' # If we are 'Verse Per Slide' then create a new slide. - elif self.parent.settings_tab.layout_style == 0: + elif self.settings.layout_style == LayoutStyle.VersePerSlide: bible_text = u'%s %s' % (verse_text, text) raw_slides.append(bible_text.rstrip()) bible_text = u'' # If we are 'Verse Per Line' then force a new line. - elif self.parent.settings_tab.layout_style == 1: + elif self.settings.layout_style == LayoutStyle.VersePerLine: bible_text = u'%s %s %s\n' % (bible_text, verse_text, text) # We have to be 'Continuous'. else: @@ -693,7 +691,8 @@ class BibleMediaItem(MediaManagerItem): raw_slides.append(bible_text.lstrip()) bible_text = u'' # Service Item: Capabilities - if self.parent.settings_tab.layout_style == 2 and not second_bible: + if self.settings.layout_style == LayoutStyle.Continuous and \ + not second_bible: # Split the line but do not replace line breaks in renderer. service_item.add_capability(ItemCapabilities.NoLineBreaks) service_item.add_capability(ItemCapabilities.AllowsPreview) @@ -705,10 +704,10 @@ class BibleMediaItem(MediaManagerItem): else: service_item.title += u', ' + title # Service Item: Theme - if len(self.parent.settings_tab.bible_theme) == 0: + if len(self.settings.bible_theme) == 0: service_item.theme = None else: - service_item.theme = self.parent.settings_tab.bible_theme + service_item.theme = self.settings.bible_theme for slide in raw_slides: service_item.add_from_text(slide[:30], slide) if service_item.raw_footer: @@ -817,16 +816,15 @@ class BibleMediaItem(MediaManagerItem): The verse number (int). """ verse_separator = get_reference_match(u'sep_v_display') - if not self.parent.settings_tab.show_new_chapters or \ - old_chapter != chapter: + if not self.settings.show_new_chapters or old_chapter != chapter: verse_text = unicode(chapter) + verse_separator + unicode(verse) else: verse_text = unicode(verse) - if self.parent.settings_tab.display_style == 1: + if self.settings.display_style == DisplayStyle.Round: verse_text = u'{su}(' + verse_text + u'){/su}' - elif self.parent.settings_tab.display_style == 2: + elif self.settings.display_style == DisplayStyle.Curly: verse_text = u'{su}{' + verse_text + u'}{/su}' - elif self.parent.settings_tab.display_style == 3: + elif self.settings.display_style == DisplayStyle.Square: verse_text = u'{su}[' + verse_text + u']{/su}' else: verse_text = u'{su}' + verse_text + u'{/su}' diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 2df6b1677..73b7eb91a 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -29,7 +29,8 @@ import sqlite from PyQt4 import QtCore -from openlp.core.lib import Receiver, translate +from openlp.core.lib import Receiver +from openlp.core.ui.wizard import WizardStrings from openlp.plugins.bibles.lib.db import BibleDB log = logging.getLogger(__name__) @@ -73,8 +74,7 @@ class OpenLP1Bible(BibleDB): abbreviation = unicode(book[3], u'cp1252') self.create_book(name, abbreviation, testament_id) # Update the progess bar. - self.wizard.incrementProgressBar(unicode(translate( - 'BiblesPlugin.OpenLP1Import', 'Importing %s...')) % name) + self.wizard.incrementProgressBar(WizardStrings.ImportingType % name) # Import the verses for this book. cursor.execute(u'SELECT chapter, verse, text || \'\' AS text FROM ' 'verse WHERE book_id=%s' % book_id) diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 4a001987d..d21227090 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -69,7 +69,7 @@ class OSISBible(BibleDB): self.q1_regex = re.compile(r'') self.q2_regex = re.compile(r'') self.trans_regex = re.compile(r'(.*?)') - self.divineName_regex = re.compile( + self.divine_name_regex = re.compile( r'(.*?)') self.spaces_regex = re.compile(r'([ ]{2,})') filepath = os.path.join( @@ -161,7 +161,7 @@ class OSISBible(BibleDB): verse_text = self.q1_regex.sub(u'"', verse_text) verse_text = self.q2_regex.sub(u'\'', verse_text) verse_text = self.trans_regex.sub(u'', verse_text) - verse_text = self.divineName_regex.sub(u'', verse_text) + verse_text = self.divine_name_regex.sub(u'', verse_text) verse_text = verse_text.replace(u'', u'')\ .replace(u'', u'').replace(u'', u'')\ .replace(u'', u'').replace(u'', u'')\ diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index 65245fc8a..7894397db 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -51,7 +51,7 @@ class CustomPlugin(Plugin): CustomMediaItem, CustomTab) self.weight = -5 self.manager = Manager(u'custom', init_schema) - self.edit_custom_form = EditCustomForm(self.manager) + self.edit_custom_form = EditCustomForm(self) self.icon_path = u':/plugins/plugin_custom.png' self.icon = build_icon(self.icon_path) diff --git a/openlp/plugins/custom/forms/editcustomdialog.py b/openlp/plugins/custom/forms/editcustomdialog.py index 2e8a64a9d..8746d5548 100644 --- a/openlp/plugins/custom/forms/editcustomdialog.py +++ b/openlp/plugins/custom/forms/editcustomdialog.py @@ -124,5 +124,4 @@ class Ui_CustomEditDialog(object): translate('CustomPlugin.EditCustomForm', 'The&me:')) self.creditLabel.setText( translate('CustomPlugin.EditCustomForm', '&Credits:')) - self.previewButton.setText( - translate('CustomPlugin.EditCustomForm', 'Save && Preview')) + self.previewButton.setText(UiStrings.SaveAndPreview) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index b667cd529..a86b28489 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -42,14 +42,15 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): Class documentation goes here. """ log.info(u'Custom Editor loaded') - def __init__(self, manager, parent=None): + def __init__(self, parent): """ Constructor """ - QtGui.QDialog.__init__(self, parent) + QtGui.QDialog.__init__(self) + self.parent = parent + self.manager = self.parent.manager self.setupUi(self) # Create other objects and forms. - self.manager = manager self.editSlideForm = EditCustomSlideForm(self) # Connecting signals and slots QtCore.QObject.connect(self.previewButton, diff --git a/openlp/plugins/custom/forms/editcustomslideform.py b/openlp/plugins/custom/forms/editcustomslideform.py index c8b74a387..80141cfb3 100644 --- a/openlp/plugins/custom/forms/editcustomslideform.py +++ b/openlp/plugins/custom/forms/editcustomslideform.py @@ -71,5 +71,5 @@ class EditCustomSlideForm(QtGui.QDialog, Ui_CustomSlideEditDialog): """ if self.slideTextEdit.textCursor().columnNumber() != 0: self.slideTextEdit.insertPlainText(u'\n') - self.slideTextEdit.insertPlainText(u'[---]\n' ) - self.slideTextEdit.setFocus() \ No newline at end of file + self.slideTextEdit.insertPlainText(u'[---]\n') + self.slideTextEdit.setFocus() diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index c1da5bdfa..7ffdfd0b2 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -29,7 +29,8 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ - translate, check_item_selected + check_item_selected +from openlp.core.lib.ui import UiStrings from openlp.plugins.custom.lib import CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide @@ -54,7 +55,7 @@ class CustomMediaItem(MediaManagerItem): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'custom_edit'), self.onRemoteEdit) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'custom_edit_clear' ), self.onRemoteEditClear) + QtCore.SIGNAL(u'custom_edit_clear'), self.onRemoteEditClear) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'custom_load_list'), self.initialise) QtCore.QObject.connect(Receiver.get_receiver(), @@ -108,9 +109,7 @@ class CustomMediaItem(MediaManagerItem): """ Edit a custom item """ - if check_item_selected(self.listView, - translate('CustomPlugin.MediaItem', - 'You haven\'t selected an item to edit.')): + if check_item_selected(self.listView, UiStrings.SelectEdit): item = self.listView.currentItem() item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] self.parent.edit_custom_form.loadCustom(item_id, False) @@ -121,9 +120,7 @@ class CustomMediaItem(MediaManagerItem): """ Remove a custom item from the list and database """ - if check_item_selected(self.listView, - translate('CustomPlugin.MediaItem', - 'You haven\'t selected an item to delete.')): + if check_item_selected(self.listView, UiStrings.SelectDelete): row_list = [item.row() for item in self.listView.selectedIndexes()] row_list.sort(reverse=True) id_list = [(item.data(QtCore.Qt.UserRole)).toInt()[0] diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 5f95a239c..5aa34cc24 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -50,10 +50,10 @@ class ImageMediaItem(MediaManagerItem): QtCore.SIGNAL(u'live_theme_changed'), self.liveThemeChanged) def retranslateUi(self): - self.OnNewPrompt = translate('ImagePlugin.MediaItem', + self.onNewPrompt = translate('ImagePlugin.MediaItem', 'Select Image(s)') file_formats = get_images_filter() - self.OnNewFileMasks = u'%s;;%s (*.*) (*)' % (file_formats, + self.onNewFileMasks = u'%s;;%s (*.*) (*)' % (file_formats, UiStrings.AllFiles) self.replaceAction.setText(UiStrings.ReplaceBG) self.replaceAction.setToolTip(UiStrings.ReplaceLiveBG) @@ -125,8 +125,7 @@ class ImageMediaItem(MediaManagerItem): def generateSlideData(self, service_item, item=None, xmlVersion=False): items = self.listView.selectedIndexes() if items: - service_item.title = unicode( - translate('ImagePlugin.MediaItem', 'Images')) + service_item.title = unicode(self.plugin.nameStrings[u'plural']) service_item.add_capability(ItemCapabilities.AllowsMaintain) service_item.add_capability(ItemCapabilities.AllowsPreview) service_item.add_capability(ItemCapabilities.AllowsLoop) @@ -198,8 +197,7 @@ class ImageMediaItem(MediaManagerItem): self.parent.liveController.display.directImage(name, filename) self.resetAction.setVisible(True) else: - critical_error_message_box( - translate('ImagePlugin.MediaItem', 'Live Background Error'), + critical_error_message_box(UiStrings.LiveBGError, unicode(translate('ImagePlugin.MediaItem', 'There was a problem replacing your background, ' 'the image file "%s" no longer exists.')) % filename) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index cc126bbef..fd98cdefa 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -58,8 +58,8 @@ class MediaMediaItem(MediaManagerItem): self.videoStart) def retranslateUi(self): - self.OnNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media') - self.OnNewFileMasks = unicode(translate('MediaPlugin.MediaItem', + self.onNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media') + self.onNewFileMasks = unicode(translate('MediaPlugin.MediaItem', 'Videos (%s);;Audio (%s);;%s (*)')) % (self.parent.video_list, self.parent.audio_list, UiStrings.AllFiles) self.replaceAction.setText(UiStrings.ReplaceBG) @@ -112,8 +112,7 @@ class MediaMediaItem(MediaManagerItem): self.parent.liveController.display.video(filename, 0, True) self.resetAction.setVisible(True) else: - critical_error_message_box(translate('MediaPlugin.MediaItem', - 'Live Background Error'), + critical_error_message_box(UiStrings.LiveBGError, unicode(translate('MediaPlugin.MediaItem', 'There was a problem replacing your background, ' 'the media file "%s" no longer exists.')) % filename) @@ -125,20 +124,19 @@ class MediaMediaItem(MediaManagerItem): return False filename = unicode(item.data(QtCore.Qt.UserRole).toString()) if os.path.exists(filename): - self.MediaState = None + self.mediaState = None self.mediaObject.stop() self.mediaObject.clearQueue() self.mediaObject.setCurrentSource(Phonon.MediaSource(filename)) self.mediaObject.play() - service_item.title = unicode( - translate('MediaPlugin.MediaItem', 'Media')) + service_item.title = unicode(self.plugin.nameStrings[u'singular']) service_item.add_capability(ItemCapabilities.RequiresMedia) service_item.add_capability(ItemCapabilities.AllowsVarableStartTime) # force a nonexistent theme service_item.theme = -1 frame = u':/media/image_clapperboard.png' (path, name) = os.path.split(filename) - while not self.MediaState: + while not self.mediaState: Receiver.send_message(u'openlp_process_events') service_item.media_length = self.mediaLength service_item.add_from_command(path, name, frame) @@ -184,6 +182,6 @@ class MediaMediaItem(MediaManagerItem): Start the video at a predetermined point. """ if newState == Phonon.PlayingState: - self.MediaState = newState + self.mediaState = newState self.mediaLength = self.mediaObject.totalTime()/1000 self.mediaObject.stop() diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 0b6ab39cd..35db047e2 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -31,7 +31,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, build_icon, SettingsManager, \ translate, check_item_selected, Receiver, ItemCapabilities -from openlp.core.lib.ui import critical_error_message_box, media_item_combo_box +from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ + media_item_combo_box from openlp.plugins.presentations.lib import MessageListener log = logging.getLogger(__name__) @@ -59,7 +60,7 @@ class PresentationMediaItem(MediaManagerItem): """ The name of the plugin media displayed in UI """ - self.OnNewPrompt = translate('PresentationPlugin.MediaItem', + self.onNewPrompt = translate('PresentationPlugin.MediaItem', 'Select Presentation(s)') self.Automatic = translate('PresentationPlugin.MediaItem', 'Automatic') @@ -79,7 +80,7 @@ class PresentationMediaItem(MediaManagerItem): if fileType.find(type) == -1: fileType += u'*.%s ' % type self.parent.serviceManager.supportedSuffixes(type) - self.OnNewFileMasks = unicode(translate('PresentationPlugin.MediaItem', + self.onNewFileMasks = unicode(translate('PresentationPlugin.MediaItem', 'Presentations (%s)')) % fileType def requiredIcons(self): @@ -202,9 +203,7 @@ class PresentationMediaItem(MediaManagerItem): """ Remove a presentation item from the list """ - if check_item_selected(self.listView, - translate('PresentationPlugin.MediaItem', - 'You must select an item to delete.')): + if check_item_selected(self.listView, UiStrings.SelectDelete): items = self.listView.selectedIndexes() row_list = [item.row() for item in items] row_list.sort(reverse=True) diff --git a/openlp/plugins/presentations/lib/presentationtab.py b/openlp/plugins/presentations/lib/presentationtab.py index fdb66c511..8bcb7474a 100644 --- a/openlp/plugins/presentations/lib/presentationtab.py +++ b/openlp/plugins/presentations/lib/presentationtab.py @@ -85,7 +85,7 @@ class PresentationTab(SettingsTab): else: checkbox.setText( unicode(translate('PresentationPlugin.PresentationTab', - '%s (unvailable)')) % controller.name) + '%s (unavailable)')) % controller.name) self.AdvancedGroupBox.setTitle(UiStrings.Advanced) self.OverrideAppCheckBox.setText( translate('PresentationPlugin.PresentationTab', diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index 234d92283..bcc075574 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -28,6 +28,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, translate from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box +from openlp.plugins.songs.lib.ui import SongStrings class Ui_EditSongDialog(object): def setupUi(self, editSongDialog): @@ -265,21 +266,19 @@ class Ui_EditSongDialog(object): self.songTabWidget.setTabText( self.songTabWidget.indexOf(self.lyricsTab), translate('SongsPlugin.EditSongForm', 'Title && Lyrics')) - self.authorsGroupBox.setTitle(UiStrings.Authors) + self.authorsGroupBox.setTitle(SongStrings.Authors) self.authorAddButton.setText( translate('SongsPlugin.EditSongForm', '&Add to Song')) self.authorRemoveButton.setText( translate('SongsPlugin.EditSongForm', '&Remove')) self.maintenanceButton.setText(translate('SongsPlugin.EditSongForm', '&Manage Authors, Topics, Song Books')) - self.topicsGroupBox.setTitle( - translate('SongsPlugin.EditSongForm', 'Topic')) + self.topicsGroupBox.setTitle(SongStrings.Topic) self.topicAddButton.setText( translate('SongsPlugin.EditSongForm', 'A&dd to Song')) self.topicRemoveButton.setText( translate('SongsPlugin.EditSongForm', 'R&emove')) - self.songBookGroupBox.setTitle( - translate('SongsPlugin.EditSongForm', 'Song Book')) + self.songBookGroupBox.setTitle(SongStrings.SongBook) self.songBookNameLabel.setText(translate('SongsPlugin.EditSongForm', 'Book:')) self.songBookNumberLabel.setText(translate('SongsPlugin.EditSongForm', @@ -293,10 +292,8 @@ class Ui_EditSongDialog(object): translate('SongsPlugin.EditSongForm', 'New &Theme')) self.rightsGroupBox.setTitle( translate('SongsPlugin.EditSongForm', 'Copyright Information')) - self.copyrightInsertButton.setText( - translate('SongsPlugin.EditSongForm', '\xa9')) - self.CCLILabel.setText( - translate('SongsPlugin.EditSongForm', 'CCLI number:')) + self.copyrightInsertButton.setText(SongStrings.CopyrightSymbol) + self.CCLILabel.setText(UiStrings.CCLINumberLabel) self.commentsGroupBox.setTitle( translate('SongsPlugin.EditSongForm', 'Comments')) self.songTabWidget.setTabText( diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 77caf012e..c38ba14f0 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -30,10 +30,12 @@ import re from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, translate -from openlp.core.lib.ui import add_widget_completer, critical_error_message_box +from openlp.core.lib.ui import UiStrings, add_widget_completer, \ + critical_error_message_box from openlp.plugins.songs.forms import EditVerseForm from openlp.plugins.songs.lib import SongXML, VerseType from openlp.plugins.songs.lib.db import Book, Song, Author, Topic +from openlp.plugins.songs.lib.ui import SongStrings from editsongdialog import Ui_EditSongDialog log = logging.getLogger(__name__) @@ -94,8 +96,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): QtCore.SIGNAL(u'theme_update_list'), self.loadThemes) self.previewButton = QtGui.QPushButton() self.previewButton.setObjectName(u'previewButton') - self.previewButton.setText( - translate('SongsPlugin.EditSongForm', 'Save && Preview')) + self.previewButton.setText(UiStrings.SaveAndPreview) self.buttonBox.addButton( self.previewButton, QtGui.QDialogButtonBox.ActionRole) QtCore.QObject.connect(self.buttonBox, @@ -363,8 +364,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.__addAuthorToList(author) self.authorsComboBox.setCurrentIndex(0) else: - QtGui.QMessageBox.warning(self, - translate('SongsPlugin.EditSongForm', 'No Author Selected'), + QtGui.QMessageBox.warning(self, UiStrings.NISs, translate('SongsPlugin.EditSongForm', '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 ' @@ -423,8 +423,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.topicsListView.addItem(topic_item) self.topicsComboBox.setCurrentIndex(0) else: - QtGui.QMessageBox.warning(self, - translate('SongsPlugin.EditSongForm', 'No Topic Selected'), + QtGui.QMessageBox.warning(self, UiStrings.NISs, translate('SongsPlugin.EditSongForm', '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" ' @@ -650,7 +649,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): def onCopyrightInsertButtonTriggered(self): text = self.copyrightEdit.text() pos = self.copyrightEdit.cursorPosition() - sign = translate('SongsPlugin.EditSongForm', '\xa9') + sign = SongStrings.CopyrightSymbol text = text[:pos] + sign + text[pos:] self.copyrightEdit.setText(text) self.copyrightEdit.setFocus() diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index f331fbcb9..bcf6a8873 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -32,8 +32,8 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, Receiver, SettingsManager, translate -from openlp.core.lib.ui import critical_error_message_box -from openlp.core.ui.wizard import OpenLPWizard +from openlp.core.lib.ui import UiStrings, critical_error_message_box +from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.plugins.songs.lib.db import Song from openlp.plugins.songs.lib.openlyricsexport import OpenLyricsExport @@ -56,7 +56,6 @@ class SongExportForm(OpenLPWizard): ``plugin`` The songs plugin. """ - self.plugin = plugin OpenLPWizard.__init__(self, parent, plugin, u'songExportWizard', u':/wizards/wizard_exportsong.bmp') self.stop_export_flag = False @@ -165,10 +164,8 @@ class SongExportForm(OpenLPWizard): """ self.setWindowTitle( translate('SongsPlugin.ExportWizardForm', 'Song Export Wizard')) - self.titleLabel.setText( - u'%s' % - translate('SongsPlugin.ExportWizardForm', - 'Welcome to the Song Export Wizard')) + self.titleLabel.setText(WizardStrings.HeaderStyle % + translate('OpenLP.Ui', 'Welcome to the Song Export Wizard')) self.informationLabel.setText( translate('SongsPlugin.ExportWizardForm', 'This wizard will help to' ' export your songs to the open and free OpenLyrics worship song ' @@ -177,15 +174,14 @@ class SongExportForm(OpenLPWizard): translate('SongsPlugin.ExportWizardForm', 'Select Songs')) self.availableSongsPage.setSubTitle( translate('SongsPlugin.ExportWizardForm', - 'Check the songs, you want to export.')) - self.searchLabel.setText( - translate('SongsPlugin.ExportWizardForm', 'Search:')) + 'Check the songs you want to export.')) + self.searchLabel.setText(u'%s:' % UiStrings.Search) self.uncheckButton.setText( translate('SongsPlugin.ExportWizardForm', 'Uncheck All')) self.checkButton.setText( translate('SongsPlugin.ExportWizardForm', 'Check All')) self.exportSongPage.setTitle( - translate('SongsPlugin.ExportWizardForm', 'Select Directory')) + translate('SongsPlugin.ExportWizardForm', 'Select Directory')) self.exportSongPage.setSubTitle( translate('SongsPlugin.ExportWizardForm', 'Select the directory you want the songs to be saved.')) @@ -196,10 +192,8 @@ class SongExportForm(OpenLPWizard): self.progressPage.setSubTitle( translate('SongsPlugin.ExportWizardForm', 'Please wait while your songs are exported.')) - self.progressLabel.setText( - translate('SongsPlugin.ExportWizardForm', 'Ready.')) - self.progressBar.setFormat( - translate('SongsPlugin.ExportWizardForm', '%p%')) + self.progressLabel.setText(WizardStrings.Ready) + self.progressBar.setFormat(WizardStrings.PercentSymbolFormat) def validateCurrentPage(self): """ @@ -213,9 +207,7 @@ class SongExportForm(OpenLPWizard): self.availableListWidget) if item.checkState() ] if not items: - critical_error_message_box( - translate('SongsPlugin.ExportWizardForm', - 'No Song Selected'), + critical_error_message_box(UiStrings.NISp, translate('SongsPlugin.ExportWizardForm', 'You need to add at least one Song to export.')) return False diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index 59821d380..bc3e28a33 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -33,7 +33,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver, SettingsManager, translate from openlp.core.lib.ui import UiStrings, critical_error_message_box -from openlp.core.ui.wizard import OpenLPWizard +from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.plugins.songs.lib.importer import SongFormat log = logging.getLogger(__name__) @@ -215,63 +215,47 @@ class SongImportForm(OpenLPWizard): """ self.setWindowTitle( translate('SongsPlugin.ImportWizardForm', 'Song Import Wizard')) - self.titleLabel.setText( - u'%s' % \ - translate('SongsPlugin.ImportWizardForm', - 'Welcome to the Song Import Wizard')) + self.titleLabel.setText(WizardStrings.HeaderStyle % + translate('OpenLP.Ui', 'Welcome to the Song Import Wizard')) self.informationLabel.setText( translate('SongsPlugin.ImportWizardForm', 'This wizard will help you to import songs from a variety of ' 'formats. Click the next button below to start the process by ' 'selecting a format to import from.')) - self.sourcePage.setTitle( - translate('SongsPlugin.ImportWizardForm', 'Select Import Source')) - self.sourcePage.setSubTitle( - translate('SongsPlugin.ImportWizardForm', - 'Select the import format, and where to import from.')) - self.formatLabel.setText( - translate('SongsPlugin.ImportWizardForm', 'Format:')) - self.formatComboBox.setItemText(0, UiStrings.OLPV2) - self.formatComboBox.setItemText(1, - translate('SongsPlugin.ImportWizardForm', 'openlp.org 1.x')) - self.formatComboBox.setItemText(2, - translate('SongsPlugin.ImportWizardForm', 'OpenLyrics')) - self.formatComboBox.setItemText(3, - translate('SongsPlugin.ImportWizardForm', 'OpenSong')) - self.formatComboBox.setItemText(4, - translate('SongsPlugin.ImportWizardForm', 'Words of Worship')) - self.formatComboBox.setItemText(5, - translate('SongsPlugin.ImportWizardForm', 'CCLI/SongSelect')) - self.formatComboBox.setItemText(6, - translate('SongsPlugin.ImportWizardForm', 'Songs of Fellowship')) - self.formatComboBox.setItemText(7, + self.sourcePage.setTitle(WizardStrings.ImportSelect) + self.sourcePage.setSubTitle(WizardStrings.ImportSelectLong) + self.formatLabel.setText(WizardStrings.FormatLabel) + self.formatComboBox.setItemText(SongFormat.OpenLP2, UiStrings.OLPV2) + self.formatComboBox.setItemText(SongFormat.OpenLP1, UiStrings.OLPV1) + self.formatComboBox.setItemText( + SongFormat.OpenLyrics, WizardStrings.OL) + self.formatComboBox.setItemText(SongFormat.OpenSong, WizardStrings.OS) + self.formatComboBox.setItemText( + SongFormat.WordsOfWorship, WizardStrings.WoW) + self.formatComboBox.setItemText(SongFormat.CCLI, WizardStrings.CCLI) + self.formatComboBox.setItemText( + SongFormat.SongsOfFellowship, WizardStrings.SoF) + self.formatComboBox.setItemText(SongFormat.Generic, translate('SongsPlugin.ImportWizardForm', 'Generic Document/Presentation')) - self.formatComboBox.setItemText(8, - translate('SongsPlugin.ImportWizardForm', 'EasiSlides')) - self.formatComboBox.setItemText(9, - translate('SongsPlugin.ImportWizardForm', 'EasyWorship')) - self.formatComboBox.setItemText(10, - translate('SongsPlugin.ImportWizardForm', 'SongBeamer')) - self.formatComboBox.setItemText(11, - translate('SongsPlugin.ImportWizardForm', 'SongShow Plus')) - self.formatComboBox.setItemText(12, - translate('SongsPlugin.ImportWizardForm', 'Foilpresenter')) -# self.formatComboBox.setItemText(11, -# translate('SongsPlugin.ImportWizardForm', 'CSV')) + self.formatComboBox.setItemText( + SongFormat.EasiSlides, WizardStrings.ES) + self.formatComboBox.setItemText( + SongFormat.EasyWorship, WizardStrings.EW) + self.formatComboBox.setItemText( + SongFormat.SongBeamer, WizardStrings.SB) + self.formatComboBox.setItemText( + SongFormat.SongShowPlus, WizardStrings.SSP) + self.formatComboBox.setItemText( + SongFormat.FoilPresenter, WizardStrings.FP) +# self.formatComboBox.setItemText(SongFormat.CSV, WizardStrings.CSV) self.openLP2FilenameLabel.setText( translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.openLP2BrowseButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Browse...')) + self.openLP2BrowseButton.setText(UiStrings.Browse) self.openLP1FilenameLabel.setText( translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.openLP1BrowseButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Browse...')) - self.openLP1DisabledLabel.setText( - translate('SongsPlugin.ImportWizardForm', 'The openlp.org 1.x ' - 'importer has been disabled due to a missing Python module. If ' - 'you want to use this importer, you will need to install the ' - '"python-sqlite" module.')) + self.openLP1BrowseButton.setText(UiStrings.Browse) + self.openLP1DisabledLabel.setText(WizardStrings.NoSqlite) self.openLyricsAddButton.setText( translate('SongsPlugin.ImportWizardForm', 'Add Files...')) self.openLyricsRemoveButton.setText( @@ -311,12 +295,10 @@ class SongImportForm(OpenLPWizard): 'find OpenOffice.org on your computer.')) self.easiSlidesFilenameLabel.setText( translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.easiSlidesBrowseButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Browse...')) + self.easiSlidesBrowseButton.setText(UiStrings.Browse) self.ewFilenameLabel.setText( translate('SongsPlugin.ImportWizardForm', 'Filename:')) - self.ewBrowseButton.setText( - translate('SongsPlugin.ImportWizardForm', 'Browse...')) + self.ewBrowseButton.setText(UiStrings.Browse) self.songBeamerAddButton.setText( translate('SongsPlugin.ImportWizardForm', 'Add Files...')) self.songBeamerRemoveButton.setText( @@ -331,17 +313,13 @@ class SongImportForm(OpenLPWizard): translate('SongsPlugin.ImportWizardForm', 'Remove File(s)')) # self.csvFilenameLabel.setText( # translate('SongsPlugin.ImportWizardForm', 'Filename:')) -# self.csvBrowseButton.setText( -# translate('SongsPlugin.ImportWizardForm', 'Browse...')) - self.progressPage.setTitle( - translate('SongsPlugin.ImportWizardForm', 'Importing')) +# self.csvBrowseButton.setText(UiStrings.Browse) + self.progressPage.setTitle(WizardStrings.Importing) self.progressPage.setSubTitle( translate('SongsPlugin.ImportWizardForm', 'Please wait while your songs are imported.')) - self.progressLabel.setText( - translate('SongsPlugin.ImportWizardForm', 'Ready.')) - self.progressBar.setFormat( - translate('SongsPlugin.ImportWizardForm', '%p%')) + self.progressLabel.setText(WizardStrings.Ready) + self.progressBar.setFormat(WizardStrings.PercentSymbolFormat) # Align all QFormLayouts towards each other. width = max(self.formatLabel.minimumSizeHint().width(), self.openLP2FilenameLabel.minimumSizeHint().width()) @@ -358,122 +336,76 @@ class SongImportForm(OpenLPWizard): source_format = self.formatComboBox.currentIndex() if source_format == SongFormat.OpenLP2: if self.openLP2FilenameEdit.text().isEmpty(): - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No OpenLP 2.0 Song Database Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to select an OpenLP 2.0 song database ' - 'file to import from.')) + critical_error_message_box(UiStrings.NFSs, + WizardStrings.YouSpecifyFile % UiStrings.OLPV2) self.openLP2BrowseButton.setFocus() return False elif source_format == SongFormat.OpenLP1: if self.openLP1FilenameEdit.text().isEmpty(): - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No openlp.org 1.x Song Database Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to select an openlp.org 1.x song ' - 'database file to import from.')) + critical_error_message_box(UiStrings.NFSs, + WizardStrings.YouSpecifyFile % UiStrings.OLPV1) self.openLP1BrowseButton.setFocus() return False elif source_format == SongFormat.OpenLyrics: if self.openLyricsFileListWidget.count() == 0: - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No OpenLyrics Files Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to add at least one OpenLyrics ' - 'song file to import from.')) + critical_error_message_box(UiStrings.NFSp, + WizardStrings.YouSpecifyFile % WizardStrings.OL) self.openLyricsAddButton.setFocus() return False elif source_format == SongFormat.OpenSong: if self.openSongFileListWidget.count() == 0: - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No OpenSong Files Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to add at least one OpenSong ' - 'song file to import from.')) + critical_error_message_box(UiStrings.NFSp, + WizardStrings.YouSpecifyFile % WizardStrings.OS) self.openSongAddButton.setFocus() return False elif source_format == SongFormat.WordsOfWorship: if self.wordsOfWorshipFileListWidget.count() == 0: - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No Words of Worship Files Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to add at least one Words of Worship ' - 'file to import from.')) + critical_error_message_box(UiStrings.NFSp, + WizardStrings.YouSpecifyFile % WizardStrings.WoW) self.wordsOfWorshipAddButton.setFocus() return False elif source_format == SongFormat.CCLI: if self.ccliFileListWidget.count() == 0: - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No CCLI Files Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to add at least one CCLI file ' - 'to import from.')) + critical_error_message_box(UiStrings.NFSp, + WizardStrings.YouSpecifyFile % WizardStrings.CCLI) self.ccliAddButton.setFocus() return False elif source_format == SongFormat.SongsOfFellowship: if self.songsOfFellowshipFileListWidget.count() == 0: - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No Songs of Fellowship File Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to add at least one Songs of Fellowship ' - 'file to import from.')) + critical_error_message_box(UiStrings.NFSp, + WizardStrings.YouSpecifyFile % WizardStrings.SoF) self.songsOfFellowshipAddButton.setFocus() return False elif source_format == SongFormat.Generic: if self.genericFileListWidget.count() == 0: - critical_error_message_box( + critical_error_message_box(UiStrings.NFSp, translate('SongsPlugin.ImportWizardForm', - 'No Document/Presentation Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to add at least one document or ' + 'You need to specify at least one document or ' 'presentation file to import from.')) self.genericAddButton.setFocus() return False elif source_format == SongFormat.EasiSlides: if self.easiSlidesFilenameEdit.text().isEmpty(): - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No Easislides Songs file selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to select an xml song file exported from ' - 'EasiSlides, to import from.')) + critical_error_message_box(UiStrings.NFSp, + WizardStrings.YouSpecifyFile % WizardStrings.ES) self.easiSlidesBrowseButton.setFocus() return False elif source_format == SongFormat.EasyWorship: if self.ewFilenameEdit.text().isEmpty(): - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No EasyWorship Song Database Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to select an EasyWorship song database ' - 'file to import from.')) + critical_error_message_box(UiStrings.NFSs, + WizardStrings.YouSpecifyFile % WizardStrings.EW) self.ewBrowseButton.setFocus() return False elif source_format == SongFormat.SongBeamer: if self.songBeamerFileListWidget.count() == 0: - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No SongBeamer File Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to add at least one SongBeamer ' - 'file to import from.')) + critical_error_message_box(UiStrings.NFSp, + WizardStrings.YouSpecifyFile % WizardStrings.SB) self.songBeamerAddButton.setFocus() return False elif source_format == SongFormat.SongShowPlus: if self.songShowPlusFileListWidget.count() == 0: - critical_error_message_box( - translate('SongsPlugin.ImportWizardForm', - 'No SongShow Plus Files Selected'), - translate('SongsPlugin.ImportWizardForm', - 'You need to add at least one SongShow Plus ' - 'file to import from.')) + critical_error_message_box(UiStrings.NFSp, + WizardStrings.YouSpecifyFile % WizardStrings.SSP) self.wordsOfWorshipAddButton.setFocus() return False elif source_format == SongFormat.FoilPresenter: @@ -514,8 +446,7 @@ class SongImportForm(OpenLPWizard): filters) if filenames: listbox.addItems(filenames) - SettingsManager.set_last_dir( - self.plugin.settingsSection, + SettingsManager.set_last_dir(self.plugin.settingsSection, os.path.split(unicode(filenames[0]))[0], 1) def getListOfFiles(self, listbox): @@ -539,9 +470,7 @@ class SongImportForm(OpenLPWizard): """ Get OpenLP v2 song database file """ - self.getFileName( - translate('SongsPlugin.ImportWizardForm', - 'Select OpenLP 2.0 Database File'), + self.getFileName(WizardStrings.OpenTypeFile % UiStrings.OLPV2, self.openLP2FilenameEdit, u'%s (*.sqlite)' % (translate('SongsPlugin.ImportWizardForm', 'OpenLP 2.0 Databases')) @@ -551,9 +480,7 @@ class SongImportForm(OpenLPWizard): """ Get OpenLP v1 song database file """ - self.getFileName( - translate('SongsPlugin.ImportWizardForm', - 'Select openlp.org 1.x Database File'), + self.getFileName(WizardStrings.OpenTypeFile % UiStrings.OLPV1, self.openLP1FilenameEdit, u'%s (*.olp)' % translate('SongsPlugin.ImportWizardForm', 'openlp.org v1.x Databases') @@ -563,11 +490,8 @@ class SongImportForm(OpenLPWizard): """ Get OpenLyrics song database files """ - self.getFiles( - translate('SongsPlugin.ImportWizardForm', - 'Select OpenLyrics Files'), - self.openLyricsFileListWidget - ) + self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.OL, + self.openLyricsFileListWidget) def onOpenLyricsRemoveButtonClicked(self): """ @@ -579,10 +503,8 @@ class SongImportForm(OpenLPWizard): """ Get OpenSong song database files """ - self.getFiles( - translate('SongsPlugin.ImportWizardForm', 'Select Open Song Files'), - self.openSongFileListWidget - ) + self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.OS, + self.openSongFileListWidget) def onOpenSongRemoveButtonClicked(self): """ @@ -594,9 +516,7 @@ class SongImportForm(OpenLPWizard): """ Get Words of Worship song database files """ - self.getFiles( - translate('SongsPlugin.ImportWizardForm', - 'Select Words of Worship Files'), + self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.WoW, self.wordsOfWorshipFileListWidget, u'%s (*.wsg *.wow-song)' % translate('SongsPlugin.ImportWizardForm', 'Words Of Worship Song Files') @@ -612,11 +532,8 @@ class SongImportForm(OpenLPWizard): """ Get CCLI song database files """ - self.getFiles( - translate('SongsPlugin.ImportWizardForm', - 'Select CCLI Files'), - self.ccliFileListWidget - ) + self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.CCLI, + self.ccliFileListWidget) def onCCLIRemoveButtonClicked(self): """ @@ -628,9 +545,7 @@ class SongImportForm(OpenLPWizard): """ Get Songs of Fellowship song database files """ - self.getFiles( - translate('SongsPlugin.ImportWizardForm', - 'Select Songs of Fellowship Files'), + self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.SoF, self.songsOfFellowshipFileListWidget, u'%s (*.rtf)' % translate('SongsPlugin.ImportWizardForm', 'Songs Of Fellowship Song Files') @@ -659,29 +574,21 @@ class SongImportForm(OpenLPWizard): self.removeSelectedItems(self.genericFileListWidget) def onEasiSlidesBrowseButtonClicked(self): - self.getFileName( - translate('SongsPlugin.ImportWizardForm', - 'Select EasiSlides songfile'), - self.easiSlidesFilenameEdit - ) + self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.ES, + self.easiSlidesFilenameEdit) def onEWBrowseButtonClicked(self): """ Get EasyWorship song database files """ - self.getFileName( - translate('SongsPlugin.ImportWizardForm', - 'Select EasyWorship Database File'), - self.ewFilenameEdit - ) + self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.EW, + self.ewFilenameEdit) def onSongBeamerAddButtonClicked(self): """ Get SongBeamer song database files """ - self.getFiles( - translate('SongsPlugin.ImportWizardForm', - 'Select SongBeamer Files'), + self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.SB, self.songBeamerFileListWidget, u'%s (*.sng)' % translate('SongsPlugin.ImportWizardForm', 'SongBeamer Files') ) @@ -696,9 +603,7 @@ class SongImportForm(OpenLPWizard): """ Get SongShow Plus song database files """ - self.getFiles( - translate('SongsPlugin.ImportWizardForm', - 'Select SongShow Plus Files'), + self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.SSP, self.songShowPlusFileListWidget, u'%s (*.sbsong)' % translate('SongsPlugin.ImportWizardForm', 'SongShow Plus Song Files') @@ -762,8 +667,7 @@ class SongImportForm(OpenLPWizard): Perform pre import tasks """ OpenLPWizard.preWizard(self) - self.progressLabel.setText( - translate('SongsPlugin.ImportWizardForm', 'Starting import...')) + self.progressLabel.setText(WizardStrings.StartingImport) Receiver.send_message(u'openlp_process_events') def performWizard(self): @@ -812,7 +716,7 @@ class SongImportForm(OpenLPWizard): self.songsOfFellowshipFileListWidget) ) elif source_format == SongFormat.Generic: - # Import a generic document or presentatoin + # Import a generic document or presentation importer = self.plugin.importSongs(SongFormat.Generic, filenames=self.getListOfFiles(self.genericFileListWidget) ) @@ -834,8 +738,7 @@ class SongImportForm(OpenLPWizard): elif source_format == SongFormat.SongShowPlus: # Import ShongShow Plus songs importer = self.plugin.importSongs(SongFormat.SongShowPlus, - filenames=self.getListOfFiles( - self.songShowPlusFileListWidget) + filenames=self.getListOfFiles(self.songShowPlusFileListWidget) ) elif source_format == SongFormat.FoilPresenter: # Import Foilpresenter songs @@ -843,8 +746,7 @@ class SongImportForm(OpenLPWizard): filenames=self.getListOfFiles(self.foilPresenterFileListWidget) ) if importer.do_import(): - self.progressLabel.setText( - translate('SongsPlugin.SongImportForm', 'Finished import.')) + self.progressLabel.setText(WizardStrings.FinishedImport) else: self.progressLabel.setText( translate('SongsPlugin.SongImportForm', diff --git a/openlp/plugins/songs/forms/songmaintenancedialog.py b/openlp/plugins/songs/forms/songmaintenancedialog.py index 0fa3335dc..0316ab42b 100644 --- a/openlp/plugins/songs/forms/songmaintenancedialog.py +++ b/openlp/plugins/songs/forms/songmaintenancedialog.py @@ -26,8 +26,9 @@ from PyQt4 import QtCore, QtGui -from openlp.core.lib import build_icon, translate +from openlp.core.lib import build_icon from openlp.core.lib.ui import UiStrings +from openlp.plugins.songs.lib.ui import SongStrings class Ui_SongMaintenanceDialog(object): def setupUi(self, songMaintenanceDialog): @@ -144,14 +145,10 @@ class Ui_SongMaintenanceDialog(object): QtCore.QMetaObject.connectSlotsByName(songMaintenanceDialog) def retranslateUi(self, songMaintenanceDialog): - songMaintenanceDialog.setWindowTitle( - translate('SongsPlugin.SongMaintenanceForm', 'Song Maintenance')) - authorsString = UiStrings.Authors - topicsString = translate('SongsPlugin.SongMaintenanceForm', 'Topics') - booksString = translate('SongsPlugin.SongMaintenanceForm', 'Song Books') - self.listItemAuthors.setText(authorsString) - self.listItemTopics.setText(topicsString) - self.listItemBooks.setText(booksString) + songMaintenanceDialog.setWindowTitle(SongStrings.SongMaintenance) + self.listItemAuthors.setText(SongStrings.Authors) + self.listItemTopics.setText(SongStrings.Topics) + self.listItemBooks.setText(SongStrings.SongBooks) self.authorsAddButton.setText(UiStrings.Add) self.authorsEditButton.setText(UiStrings.Edit) self.authorsDeleteButton.setText(UiStrings.Delete) @@ -161,8 +158,8 @@ class Ui_SongMaintenanceDialog(object): self.booksAddButton.setText(UiStrings.Add) self.booksEditButton.setText(UiStrings.Edit) self.booksDeleteButton.setText(UiStrings.Delete) - typeListWidth = max(self.fontMetrics().width(authorsString), - self.fontMetrics().width(topicsString), - self.fontMetrics().width(booksString)) + typeListWidth = max(self.fontMetrics().width(SongStrings.Authors), + self.fontMetrics().width(SongStrings.Topics), + self.fontMetrics().width(SongStrings.SongBooks)) self.typeListWidget.setFixedWidth(typeListWidth + self.typeListWidget.iconSize().width() + 32) diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py index 1f693223c..7f9b8bec5 100644 --- a/openlp/plugins/songs/forms/songmaintenanceform.py +++ b/openlp/plugins/songs/forms/songmaintenanceform.py @@ -29,7 +29,7 @@ from PyQt4 import QtGui, QtCore from sqlalchemy.sql import and_ from openlp.core.lib import Receiver, translate -from openlp.core.lib.ui import critical_error_message_box +from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.plugins.songs.forms import AuthorsForm, TopicsForm, SongBookForm from openlp.plugins.songs.lib.db import Author, Book, Topic, Song from songmaintenancedialog import Ui_SongMaintenanceDialog @@ -103,19 +103,19 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): return -1 def _deleteItem(self, item_class, list_widget, reset_func, dlg_title, - del_text, err_text, sel_text): + del_text, err_text): item_id = self._getCurrentItemId(list_widget) if item_id != -1: item = self.manager.get_object(item_class, item_id) if item and len(item.songs) == 0: - if critical_error_message_box(title=dlg_title, message=del_text, - parent=self, question=True) == QtGui.QMessageBox.Yes: + if critical_error_message_box(dlg_title, del_text, self, + True) == QtGui.QMessageBox.Yes: self.manager.delete_object(item_class, item.id) reset_func() else: critical_error_message_box(dlg_title, err_text) else: - critical_error_message_box(dlg_title, sel_text) + critical_error_message_box(dlg_title, UiStrings.NISs) def resetAuthors(self): """ @@ -268,11 +268,9 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): temp_last_name = author.last_name temp_display_name = author.display_name if self.authorform.exec_(False): - author.first_name = unicode( - self.authorform.firstNameEdit.text()) + author.first_name = unicode(self.authorform.firstNameEdit.text()) author.last_name = unicode(self.authorform.lastNameEdit.text()) - author.display_name = unicode( - self.authorform.displayEdit.text()) + author.display_name = unicode(self.authorform.displayEdit.text()) if self.checkAuthor(author, True): if self.manager.save_object(author): self.resetAuthors() @@ -449,11 +447,9 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): self._deleteItem(Author, self.authorsListWidget, self.resetAuthors, translate('SongsPlugin.SongMaintenanceForm', 'Delete Author'), translate('SongsPlugin.SongMaintenanceForm', - 'Are you sure you want to delete the selected author?'), - translate('SongsPlugin.SongMaintenanceForm', - 'This author cannot be deleted, they are currently ' - 'assigned to at least one song.'), - translate('SongsPlugin.SongMaintenanceForm', 'No author selected!')) + 'Are you sure you want to delete the selected author?'), + translate('SongsPlugin.SongMaintenanceForm', 'This author cannot ' + 'be deleted, they are currently assigned to at least one song.')) def onTopicDeleteButtonClick(self): """ @@ -462,11 +458,9 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): self._deleteItem(Topic, self.topicsListWidget, self.resetTopics, translate('SongsPlugin.SongMaintenanceForm', 'Delete Topic'), translate('SongsPlugin.SongMaintenanceForm', - 'Are you sure you want to delete the selected topic?'), - translate('SongsPlugin.SongMaintenanceForm', - 'This topic cannot be deleted, it is currently ' - 'assigned to at least one song.'), - translate('SongsPlugin.SongMaintenanceForm', 'No topic selected!')) + 'Are you sure you want to delete the selected topic?'), + translate('SongsPlugin.SongMaintenanceForm', 'This topic cannot ' + 'be deleted, it is currently assigned to at least one song.')) def onBookDeleteButtonClick(self): """ @@ -475,11 +469,9 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): self._deleteItem(Book, self.booksListWidget, self.resetBooks, translate('SongsPlugin.SongMaintenanceForm', 'Delete Book'), translate('SongsPlugin.SongMaintenanceForm', - 'Are you sure you want to delete the selected book?'), - translate('SongsPlugin.SongMaintenanceForm', - 'This book cannot be deleted, it is currently ' - 'assigned to at least one song.'), - translate('SongsPlugin.SongMaintenanceForm', 'No book selected!')) + 'Are you sure you want to delete the selected book?'), + translate('SongsPlugin.SongMaintenanceForm', 'This book cannot be ' + 'deleted, it is currently assigned to at least one song.')) def onAuthorsListRowChanged(self, row): """ diff --git a/openlp/plugins/songs/lib/cclifileimport.py b/openlp/plugins/songs/lib/cclifileimport.py index 441391d02..ccd1dff9c 100644 --- a/openlp/plugins/songs/lib/cclifileimport.py +++ b/openlp/plugins/songs/lib/cclifileimport.py @@ -51,22 +51,17 @@ class CCLIFileImport(SongImport): ``filenames`` The files to be imported. """ - SongImport.__init__(self, manager) - if u'filenames' in kwargs: - self.filenames = kwargs[u'filenames'] - log.debug(self.filenames) - else: - raise KeyError(u'Keyword argument "filenames" not supplied.') + SongImport.__init__(self, manager, **kwargs) def do_import(self): """ Import either a .usr or a .txt SongSelect file """ log.debug(u'Starting CCLI File Import') - song_total = len(self.filenames) + song_total = len(self.import_source) self.import_wizard.progressBar.setMaximum(song_total) song_count = 1 - for filename in self.filenames: + for filename in self.import_source: self.import_wizard.incrementProgressBar(unicode(translate( 'SongsPlugin.CCLIFileImport', 'Importing song %d of %d')) % (song_count, song_total)) @@ -187,7 +182,7 @@ class CCLIFileImport(SongImport): if check_first_verse_line: if verse_lines[0].startswith(u'(PRE-CHORUS'): verse_type = u'P' - log.debug(u'USR verse PRE-CHORUS: %s', verse_lines[0] ) + log.debug(u'USR verse PRE-CHORUS: %s', verse_lines[0]) verse_text = verse_lines[1] elif verse_lines[0].startswith(u'(BRIDGE'): verse_type = u'B' diff --git a/openlp/plugins/songs/lib/easislidesimport.py b/openlp/plugins/songs/lib/easislidesimport.py index b31e50862..bdf263a4b 100644 --- a/openlp/plugins/songs/lib/easislidesimport.py +++ b/openlp/plugins/songs/lib/easislidesimport.py @@ -30,6 +30,7 @@ from lxml import etree, objectify import re from openlp.core.lib import translate +from openlp.core.ui.wizard import WizardStrings from openlp.plugins.songs.lib.songimport import SongImport log = logging.getLogger(__name__) @@ -45,33 +46,30 @@ class EasiSlidesImport(SongImport): """ Initialise the class. """ - SongImport.__init__(self, manager) - self.filename = kwargs[u'filename'] - self.song = None + SongImport.__init__(self, manager, **kwargs) self.commit = True def do_import(self): """ - Import either each of the files in self.filenames - each element of + Import either each of the files in self.import_sources - each element of which can be either a single opensong file, or a zipfile containing multiple opensong files. If `self.commit` is set False, the import will not be committed to the database (useful for test scripts). """ self.import_wizard.progressBar.setMaximum(1) - log.info(u'Importing EasiSlides XML file %s', self.filename) + log.info(u'Importing EasiSlides XML file %s', self.import_source) parser = etree.XMLParser(remove_blank_text=True) - file = etree.parse(self.filename, parser) + file = etree.parse(self.import_source, parser) xml = unicode(etree.tostring(file)) song_xml = objectify.fromstring(xml) self.import_wizard.incrementProgressBar( - unicode(translate('SongsPlugin.ImportWizardForm', - u'Importing %s...')) % os.path.split(self.filename)[-1]) + WizardStrings.ImportingType % os.path.split(self.import_source)[-1]) self.import_wizard.progressBar.setMaximum(len(song_xml.Item)) for song in song_xml.Item: self.import_wizard.incrementProgressBar( unicode(translate('SongsPlugin.ImportWizardForm', u'Importing %s, song %s...')) % - (os.path.split(self.filename)[-1], song.Title1)) + (os.path.split(self.import_source)[-1], song.Title1)) success = self._parse_song(song) if not success or self.stop_import_flag: return False diff --git a/openlp/plugins/songs/lib/ewimport.py b/openlp/plugins/songs/lib/ewimport.py index 312e3b759..c88238610 100644 --- a/openlp/plugins/songs/lib/ewimport.py +++ b/openlp/plugins/songs/lib/ewimport.py @@ -32,6 +32,7 @@ import os import struct from openlp.core.lib import translate +from openlp.core.ui.wizard import WizardStrings from openlp.plugins.songs.lib import retrieve_windows_encoding from songimport import SongImport @@ -134,8 +135,7 @@ class EasyWorshipSongImport(SongImport): ability to import EasyWorship song files. """ def __init__(self, manager, **kwargs): - self.import_source = kwargs[u'filename'] - SongImport.__init__(self, manager) + SongImport.__init__(self, manager, **kwargs) def do_import(self): # Open the DB and MB files if they exist @@ -231,8 +231,7 @@ class EasyWorshipSongImport(SongImport): title = self.get_field(fi_title) if title: self.import_wizard.incrementProgressBar( - unicode(translate('SongsPlugin.ImportWizardForm', - 'Importing "%s"...')) % title, 0) + WizardStrings.ImportingType % title, 0) self.title = title # Get remaining fields copy = self.get_field(fi_copy) diff --git a/openlp/plugins/songs/lib/foilpresenterimport.py b/openlp/plugins/songs/lib/foilpresenterimport.py new file mode 100644 index 000000000..919901694 --- /dev/null +++ b/openlp/plugins/songs/lib/foilpresenterimport.py @@ -0,0 +1,584 @@ + # -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, 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 XML of `Foilpresenter `_ songs is of the format:: + + + + 2004.6.18.18.44.37.0767 + 2011.1.21.8.53.5 + + Above all + + 1 + + + 0 + Notiz + 1.0 + + 0,0,0 + 255,255,255 + + + Standard + 0 + + + + 0 + Verdana + 14 + 0 + 0 + 0 + 1 + Above all powers, above all kings, + above all nature an all created things; + above all wisdom and all the ways of man, + You were here before the world began. + 1 + + + + Herr du bist maechtig.foil + + + Arial + 7 + 3 + 0 + 1 + 0 + Text und Musik: Lenny LeBlanc/Paul Baloche + + + + Feiert Jesus 3 + 10 + + + + Worship + + +""" + +import logging +import re +import os + +from lxml import etree, objectify + +from openlp.core.lib import translate +from openlp.plugins.songs.lib import VerseType +from openlp.plugins.songs.lib.songimport import SongImport +from openlp.plugins.songs.lib.db import Author, Book, Song, Topic +from openlp.plugins.songs.lib.xml import SongXML + +log = logging.getLogger(__name__) + +class FoilPresenterImport(SongImport): + """ + This provides the Openlyrics import. + """ + def __init__(self, master_manager, **kwargs): + """ + Initialise the import. + """ + log.debug(u'initialise FoilPresenterImport') + SongImport.__init__(self, master_manager) + self.master_manager = master_manager + self.FoilPresenter = FoilPresenter(master_manager) + if kwargs.has_key(u'filename'): + self.import_source = kwargs[u'filename'] + if kwargs.has_key(u'filenames'): + self.import_source = kwargs[u'filenames'] + + def do_import(self): + """ + Imports the songs. + """ + self.import_wizard.progressBar.setMaximum(len(self.import_source)) + for file_path in self.import_source: + if self.stop_import_flag: + return False + self.import_wizard.incrementProgressBar(unicode(translate( + 'SongsPlugin.FoilPresenterImport', 'Importing %s...')) % + os.path.basename(file_path)) + parser = etree.XMLParser(remove_blank_text=True) + parsed_file = etree.parse(file_path, parser) + xml = unicode(etree.tostring(parsed_file)) + if self.FoilPresenter.xml_to_song(xml) is None: + log.debug(u'File could not be imported: %s' % file_path) + # Importing this song failed! For now we stop import. + return False + return True + +class FoilPresenter(object): + """ + This class represents the converter for Foilpresenter XML from a song. + + As Foilpresenter has a rich set of different features, we cannot support + them all. The following features are supported by the :class:`Foilpresenter` + + OpenPL does not support styletype and font attributes like "align, font, + textsize, bold, italic, underline" + + ** + This property is currently not supported. + + ** + As OpenLP does only support one title, the first titlestring becomes + title, all other titlestrings will be alternate titles + + *<sprache>* + This property is not supported. + + *<ccliid>* + The *<ccliid>* property is fully supported. + + *<tonart>* + This property is currently not supported. + + *<valign>* + This property is not supported. + + *<notiz>* + The *<notiz>* property is fully supported. + + *<versionsinfo>* + This property is not supported. + + *<farben>* + This property is not supported. + + *<reihenfolge>* = verseOrder + OpenLP supports this property. + + *<strophen>* + Only the attributes *key* and *text* are supported. + + *<verkn>* + This property is not supported. + + *<verkn>* + This property is not supported. + + *<copyright>* + Only the attribute *text* is supported. => Done + + *<buch>* = songbooks + As OpenLP does only support one songbook, we cannot consider more than + one songbook. + + *<kategorien>* + This property is not supported. + + The tag *<author>* is not support by foilpresenter, mostly the author is + named in the <copyright> tag. We try to extract the authors from the + <copyright> tag. + + """ + def __init__(self, manager): + self.manager = manager + + def xml_to_song(self, xml): + """ + Create and save a song from Foilpresenter format xml to the database. + + ``xml`` + The XML to parse (unicode). + """ + # No xml get out of here. + if not xml: + return None + song = Song() + if xml[:5] == u'<?xml': + xml = xml[38:] + # Because "text" seems to be an reserverd word, we have to recompile it. + xml = re.compile(u'<text>').sub(u'<text_>', xml) + xml = re.compile(u'</text>').sub(u'</text_>', xml) + song_xml = objectify.fromstring(xml) + foilpresenterfolie = song_xml + self._process_copyright(foilpresenterfolie, song) + self._process_cclinumber(foilpresenterfolie, song) + self._process_titles(foilpresenterfolie, song) + # The verse order is processed with the lyrics! + self._process_lyrics(foilpresenterfolie, song) + self._process_comments(foilpresenterfolie, song) + self._process_authors(foilpresenterfolie, song) + self._process_songbooks(foilpresenterfolie, song) + self._process_topics(foilpresenterfolie, song) + self.manager.save_object(song) + return song.id + + def _child(self, element): + """ + This returns the text of an element as unicode string. + + ``element`` + The element. + """ + if element is not None: + return unicode(element) + return u'' + + def _process_authors(self, foilpresenterfolie, song): + """ + Adds the authors specified in the XML to the song. + + ``foilpresenterfolie`` + The property object (lxml.objectify.ObjectifiedElement). + + ``song`` + The song object. + """ + authors = [] + try: + copyright = self._child(foilpresenterfolie.copyright.text_) + except AttributeError: + copyright = None + if copyright: + strings = [] + author_temp = [] + if copyright.find(u"Copyright") != -1: + test = copyright.partition(u"Copyright") + copyright = test[0] + elif copyright.find(u"copyright") != -1: + test = copyright.partition(u"copyright") + copyright = test[0] + elif copyright.find(u"©") != -1: + test = copyright.partition(u"©") + copyright = test[0] + elif copyright.find(u"(c)") != -1: + test = copyright.partition(u"(c)") + copyright = test[0] + elif copyright.find(u"(C)") != -1: + test = copyright.partition(u"(C)") + copyright = test[0] + elif copyright.find(u"c)") != -1: + test = copyright.partition(u"c)") + copyright = test[0] + elif copyright.find(u"C)") != -1: + test = copyright.partition(u"C)") + copyright = test[0] + elif copyright.find(u"C:") != -1: + test = copyright.partition(u"C:") + copyright = test[0] + elif copyright.find(u"C,)") != -1: + test = copyright.partition(u"C,)") + copyright = test[0] + copyright = re.compile(u'\\n').sub(u' ', copyright) + copyright = re.compile(u'\(.*\)').sub(u'', copyright) + if copyright.find(u"Rechte") != -1: + test = copyright.partition(u"Rechte") + copyright = test[0] + markers = [u'Text +u\.?n?d? +Melodie[a-zA-Z0-9\,\. ]*:', + u'Text +u\.?n?d? +Musik', u"T & M", u'Melodie und Satz', + u'Text[a-zA-Z0-9\,\. ]*:', u'Melodie', u'Musik', u'Satz', + u'Weise', u'[dD]eutsch', u'[dD]t[\.\:]', u'Englisch', + u'[oO]riginal', u'Bearbeitung', u'[R|r]efrain'] + for marker in markers: + copyright = re.compile(marker).sub(u'<marker>', copyright) + copyright = re.compile(u'(?<=<marker>) *:').sub(u'', copyright) + i = 0 + x = 0 + while i != 1: + if copyright.find(u"<marker>") != -1: + test = copyright.partition(u"<marker>") + if (test[0].strip() != u"") & (x > 0): + strings.append(test[0]) + copyright = test[2] + x += 1 + elif x > 0: + strings.append(copyright) + i = 1 + else: + i = 1 + for author in strings: + test = re.split(u",(?=\D{2})|(?<=\D),|\/(?=\D{3,})|(?<=\D);", + author) + for test_temp in test: + author_temp.append(test_temp) + for author in author_temp: + author = re.compile( + u'^[\/,;\-\s]+|[\/,;\-\s]+$|\s*[0-9]{4}\s*[\-\/]?\s*([0-9]{4})?[\/,;\-\s]*$' + ).sub(u'', author) + author = re.compile( + u'[0-9]{1,2}\.\s?J(ahr)?h\.|um\s*$|vor\s*$').sub(u'', + author) + author = re.compile(u'[N|n]ach.*$').sub(u'', author) + author = author.strip() + if re.search( + u'\w+\.?\s+\w{3,}\s+[a|u]nd\s|\w+\.?\s+\w{3,}\s+&\s', + author, re.U) != None: + temp = re.split(u'\s[a|u]nd\s|\s&\s',author) + for temp_temp in temp: + temp_temp = temp_temp.strip() + authors.append(temp_temp) + elif (len(author) > 2): + authors.append(author) + if not authors: + # Add "Author unknown" (can be translated). + authors.append((unicode(translate('SongsPlugin.XML', + 'Author unknown')))) + for display_name in authors: + author = self.manager.get_object_filtered(Author, + Author.display_name == display_name) + if author is None: + # We need to create a new author, as the author does not exist. + author = Author.populate(display_name=display_name, + last_name=display_name.split(u' ')[-1], + first_name=u' '.join(display_name.split(u' ')[:-1])) + self.manager.save_object(author) + song.authors.append(author) + + def _process_cclinumber(self, foilpresenterfolie, song): + """ + Adds the CCLI number to the song. + + ``foilpresenterfolie`` + The property object (lxml.objectify.ObjectifiedElement). + + ``song`` + The song object. + """ + try: + song.ccli_number = self._child(foilpresenterfolie.ccliid) + except AttributeError: + song.ccli_number = u'' + + def _process_comments(self, foilpresenterfolie, song): + """ + Joins the comments specified in the XML and add it to the song. + + ``foilpresenterfolie`` + The property object (lxml.objectify.ObjectifiedElement). + + ``song`` + The song object. + """ + try: + song.comments = self._child(foilpresenterfolie.notiz) + except AttributeError: + song.comments = u'' + + def _process_copyright(self, foilpresenterfolie, song): + """ + Adds the copyright to the song. + + ``foilpresenterfolie`` + The property object (lxml.objectify.ObjectifiedElement). + + ``song`` + The song object. + """ + try: + song.copyright = self._child(foilpresenterfolie.copyright.text_) + except AttributeError: + song.copyright = u'' + + def _process_lyrics(self, foilpresenterfolie, song): + """ + Processes the verses and search_lyrics for the song. + + ``foilpresenterfolie`` + The foilpresenterfolie object (lxml.objectify.ObjectifiedElement). + + ``lyrics`` + The lyrics object (lxml.objectify.ObjectifiedElement). + + ``song`` + The song object. + """ + sxml = SongXML() + search_text = u'' + temp_verse_order = {} + temp_verse_order_backup = [] + temp_verse_sort= [] + temp_sortnr_backup = 1 + temp_sortnr_liste = [] + versenumber = {u"V":1, u"C": 1, u"B": 1, u"E": 1, u"O": 1, u"I": 1, + u"P": 1 } + for strophe in foilpresenterfolie.strophen.strophe: + text = self._child(strophe.text_) + verse_name = self._child(strophe.key) + children = strophe.getchildren() + sortnr = 0 + for child in children: + if child.tag == "sortnr": + verse_sortnr = self._child(strophe.sortnr) + sortnr = 1 + # In older Version there is no sortnr, but we need one + if sortnr == 0: + verse_sortnr = unicode(temp_sortnr_backup) + temp_sortnr_backup += 1 + # Foilpresenter allows e. g. "Ref" or "1", but we need "C1" or "V1". + temp_sortnr_liste.append(verse_sortnr) + temp_verse_name = re.compile(u'[0-9].*').sub(u'', verse_name) + temp_verse_name = temp_verse_name[:3].lower() + if temp_verse_name == u"ref": + verse_type = u'C' + elif temp_verse_name == u"r": + verse_type = u'C' + elif temp_verse_name == u"": + verse_type = u'V' + elif temp_verse_name == u"v": + verse_type = u'V' + elif temp_verse_name == u"bri": + verse_type = u'B' + elif temp_verse_name == u"cod": + verse_type = u'E' + elif temp_verse_name == u"sch": + verse_type = u'E' + elif temp_verse_name == u"pre": + verse_type = u'P' + elif temp_verse_name == u"int": + verse_type = u'I' + else: + verse_type = u"O" + verse_number = re.compile(u'[a-zA-Z.+-_ ]*').sub(u'', verse_name) + verse_part = re.compile(u'[0-9]*').sub(u'', verse_name[1:]) + # Foilpresenter allows e. g. "C", but we need "C1". + if not verse_number: + verse_number = unicode(versenumber[verse_type]) + versenumber[verse_type] += 1 + else: + # test if foilpresenter have the same versenumber two times with + # different parts raise the verse number + for value in temp_verse_order_backup: + if value == (u''.join((verse_type, verse_number))): + verse_number = unicode(int(verse_number) + 1) + verse_type_index = VerseType.from_tag(verse_type[0]) + verse_type = VerseType.Names[verse_type_index] + temp_verse_order[verse_sortnr] = (u''.join((verse_type[0], + verse_number))) + temp_verse_order_backup.append(u''.join((verse_type[0], + verse_number))) + sxml.add_verse_to_lyrics(verse_type, verse_number, text) + search_text = search_text + text + song.search_lyrics = search_text.lower() + song.lyrics = unicode(sxml.extract_xml(), u'utf-8') + # Process verse order + verse_order = [] + verse_strophenr = [] + for strophennummer in foilpresenterfolie.reihenfolge.strophennummer: + verse_strophenr.append(strophennummer) + # Currently we do not support different "parts"! + if u'0' in temp_verse_order: + for vers in temp_verse_order_backup: + verse_order.append(vers) + else: + for number in verse_strophenr: + numberx = temp_sortnr_liste[int(number)] + verse_order.append(temp_verse_order[unicode(numberx)]) + song.verse_order = u' '.join(verse_order) + + def _process_songbooks(self, foilpresenterfolie, song): + """ + Adds the song book and song number specified in the XML to the song. + + ``foilpresenterfolie`` + The property object (lxml.objectify.ObjectifiedElement). + + ``song`` + The song object. + """ + song.song_book_id = 0 + song.song_number = u'' + try: + for songbook in foilpresenterfolie.buch.bucheintrag: + bookname = self._child(songbook.name) + if bookname: + book = self.manager.get_object_filtered(Book, + Book.name == bookname) + if book is None: + # We need to create a book, because it does not exist. + book = Book.populate(name=bookname, publisher=u'') + self.manager.save_object(book) + song.song_book_id = book.id + try: + if self._child(songbook.nummer): + song.song_number = self._child(songbook.nummer) + except AttributeError: + pass + # We only support one song book, so take the first one. + break + except AttributeError: + pass + + def _process_titles(self, foilpresenterfolie, song): + """ + Processes the titles specified in the song's XML. + + ``foilpresenterfolie`` + The property object (lxml.objectify.ObjectifiedElement). + + ``song`` + The song object. + """ + for title in foilpresenterfolie.titel.titelstring: + if not song.title: + song.title = self._child(title) + song.search_title = unicode(song.title) + song.alternate_title = u'' + else: + song.alternate_title = self._child(title) + song.search_title += u'@' + song.alternate_title + song.search_title = re.sub(r'[\'"`,;:(){}?]+', u'', + unicode(song.search_title)).lower() + + def _process_topics(self, foilpresenterfolie, song): + """ + Adds the topics to the song. + + ``foilpresenterfolie`` + The property object (lxml.objectify.ObjectifiedElement). + + ``song`` + The song object. + """ + try: + for topictext in foilpresenterfolie.kategorien.name: + topictext = self._child(topictext) + if topictext: + topic = self.manager.get_object_filtered(Topic, + Topic.name == topictext) + if topic is None: + # We need to create a topic, because it does not exist. + topic = Topic.populate(name=topictext) + self.manager.save_object(topic) + song.topics.append(topic) + except AttributeError: + pass + + def _dump_xml(self, xml): + """ + Debugging aid to dump XML so that we can see what we have. + """ + return etree.tostring(xml, encoding=u'UTF-8', + xml_declaration=True, pretty_print=True) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index c7e9bae3b..0f3e97926 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -33,15 +33,26 @@ from sqlalchemy.sql import or_ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ translate, check_item_selected, PluginStatus +from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \ SongImportForm, SongExportForm from openlp.plugins.songs.lib import OpenLyrics, SongXML, VerseType from openlp.plugins.songs.lib.db import Author, Song -from openlp.core.lib.searchedit import SearchEdit +from openlp.plugins.songs.lib.ui import SongStrings log = logging.getLogger(__name__) +class SongSearch(object): + """ + An enumeration for song search methods. + """ + Entire = 1 + Titles = 2 + Lyrics = 3 + Authors = 4 + Themes = 5 + class SongMediaItem(MediaManagerItem): """ This is the custom media manager item for Songs. @@ -124,25 +135,23 @@ class SongMediaItem(MediaManagerItem): QtCore.QVariant(u'True')).toBool() def retranslateUi(self): - self.searchTextLabel.setText( - translate('SongsPlugin.MediaItem', 'Search:')) - self.searchTextButton.setText( - translate('SongsPlugin.MediaItem', 'Search')) - self.maintenanceAction.setText( - translate('SongsPlugin.MediaItem', 'Song Maintenance')) + self.searchTextLabel.setText(u'%s:' % UiStrings.Search) + self.searchTextButton.setText(UiStrings.Search) + self.maintenanceAction.setText(SongStrings.SongMaintenance) self.maintenanceAction.setToolTip(translate('SongsPlugin.MediaItem', 'Maintain the lists of authors, topics and books')) def initialise(self): self.searchTextEdit.setSearchTypes([ - (1, u':/songs/song_search_all.png', + (SongSearch.Entire, u':/songs/song_search_all.png', translate('SongsPlugin.MediaItem', 'Entire Song')), - (2, u':/songs/song_search_title.png', + (SongSearch.Titles, u':/songs/song_search_title.png', translate('SongsPlugin.MediaItem', 'Titles')), - (3, u':/songs/song_search_lyrics.png', + (SongSearch.Lyrics, u':/songs/song_search_lyrics.png', translate('SongsPlugin.MediaItem', 'Lyrics')), - (4, u':/songs/song_search_author.png', UiStrings.Authors), - (5, u':/slides/slide_theme.png', UiStrings.Themes) + (SongSearch.Authors, u':/songs/song_search_author.png', + SongStrings.Authors), + (SongSearch.Themes, u':/slides/slide_theme.png', UiStrings.Themes) ]) self.configUpdated() @@ -151,7 +160,7 @@ class SongMediaItem(MediaManagerItem): search_results = [] # search_type = self.searchTypeComboBox.currentIndex() search_type = self.searchTextEdit.currentSearchType() - if search_type == 1: + if search_type == SongSearch.Entire: log.debug(u'Entire Song Search') search_results = self.parent.manager.get_all_objects(Song, or_(Song.search_title.like(u'%' + self.whitespace.sub(u' ', @@ -159,25 +168,25 @@ class SongMediaItem(MediaManagerItem): Song.search_lyrics.like(u'%' + search_keywords.lower() + \ u'%')), Song.search_title.asc()) self.displayResultsSong(search_results) - if search_type == 2: + elif search_type == SongSearch.Titles: log.debug(u'Titles Search') search_results = self.parent.manager.get_all_objects(Song, Song.search_title.like(u'%' + self.whitespace.sub(u' ', search_keywords.lower()) + u'%'), Song.search_title.asc()) self.displayResultsSong(search_results) - elif search_type == 3: + elif search_type == SongSearch.Lyrics: log.debug(u'Lyrics Search') search_results = self.parent.manager.get_all_objects(Song, Song.search_lyrics.like(u'%' + search_keywords.lower() + u'%'), Song.search_lyrics.asc()) self.displayResultsSong(search_results) - elif search_type == 4: + elif search_type == SongSearch.Authors: log.debug(u'Authors Search') search_results = self.parent.manager.get_all_objects(Author, Author.display_name.like(u'%' + search_keywords + u'%'), Author.display_name.asc()) self.displayResultsAuthor(search_results) - elif search_type == 5: + elif search_type == SongSearch.Themes: log.debug(u'Theme Search') search_results = self.parent.manager.get_all_objects(Song, Song.theme_name == search_keywords, Song.search_lyrics.asc()) @@ -296,9 +305,7 @@ class SongMediaItem(MediaManagerItem): Edit a song """ log.debug(u'onEditClick') - if check_item_selected(self.listView, - translate('SongsPlugin.MediaItem', - 'You must select an item to edit.')): + if check_item_selected(self.listView, UiStrings.SelectEdit): self.editItem = self.listView.currentItem() item_id = (self.editItem.data(QtCore.Qt.UserRole)).toInt()[0] self.edit_song_form.loadSong(item_id, False) @@ -308,9 +315,7 @@ class SongMediaItem(MediaManagerItem): """ Remove a song from the list and database """ - if check_item_selected(self.listView, - translate('SongsPlugin.MediaItem', - 'You must select an item to delete.')): + if check_item_selected(self.listView, UiStrings.SelectDelete): items = self.listView.selectedIndexes() if QtGui.QMessageBox.question(self, translate('SongsPlugin.MediaItem', 'Delete Song(s)?'), diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index c3e1ca6b4..5e18c7ffa 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -32,7 +32,7 @@ import logging from chardet.universaldetector import UniversalDetector import sqlite -from openlp.core.lib import translate +from openlp.core.ui.wizard import WizardStrings from openlp.plugins.songs.lib import retrieve_windows_encoding from songimport import SongImport @@ -55,8 +55,7 @@ class OpenLP1SongImport(SongImport): ``filename`` The database providing the data to import. """ - SongImport.__init__(self, manager) - self.import_source = kwargs[u'filename'] + SongImport.__init__(self, manager, **kwargs) def do_import(self): """ @@ -103,8 +102,7 @@ class OpenLP1SongImport(SongImport): lyrics = song[2].replace(u'\r\n', u'\n') copyright = song[3] self.import_wizard.incrementProgressBar( - unicode(translate('SongsPlugin.ImportWizardForm', - 'Importing "%s"...')) % title) + WizardStrings.ImportingType % title) self.title = title verses = lyrics.split(u'\n\n') for verse in verses: diff --git a/openlp/plugins/songs/lib/olpimport.py b/openlp/plugins/songs/lib/olpimport.py index d2a00447f..b3f03b951 100644 --- a/openlp/plugins/songs/lib/olpimport.py +++ b/openlp/plugins/songs/lib/olpimport.py @@ -86,9 +86,8 @@ class OpenLPSongImport(SongImport): ``source_db`` The database providing the data to import. """ - SongImport.__init__(self, manager) - self.import_source = u'sqlite:///%s' % kwargs[u'filename'] - log.debug(self.import_source) + SongImport.__init__(self, manager, **kwargs) + self.import_source = u'sqlite:///%s' % self.import_source self.source_session = None def do_import(self): diff --git a/openlp/plugins/songs/lib/oooimport.py b/openlp/plugins/songs/lib/oooimport.py index 32315130a..863fec2b8 100644 --- a/openlp/plugins/songs/lib/oooimport.py +++ b/openlp/plugins/songs/lib/oooimport.py @@ -28,7 +28,6 @@ import os from PyQt4 import QtCore -from openlp.core.lib import Receiver from openlp.core.utils import get_uno_command, get_uno_instance from songimport import SongImport @@ -56,20 +55,15 @@ class OooImport(SongImport): Initialise the class. Requires a songmanager class which is passed to SongImport for writing song to disk """ - SongImport.__init__(self, master_manager) - self.song = None - self.master_manager = master_manager + SongImport.__init__(self, master_manager, **kwargs) self.document = None self.process_started = False - self.filenames = kwargs[u'filenames'] - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import) def do_import(self): self.stop_import_flag = False self.import_wizard.progressBar.setMaximum(0) self.start_ooo() - for filename in self.filenames: + for filename in self.import_source: if self.stop_import_flag: self.import_wizard.incrementProgressBar(u'Import cancelled', 0) return diff --git a/openlp/plugins/songs/lib/openlyricsexport.py b/openlp/plugins/songs/lib/openlyricsexport.py old mode 100755 new mode 100644 diff --git a/openlp/plugins/songs/lib/openlyricsimport.py b/openlp/plugins/songs/lib/openlyricsimport.py index 37407c75c..0396335b8 100644 --- a/openlp/plugins/songs/lib/openlyricsimport.py +++ b/openlp/plugins/songs/lib/openlyricsimport.py @@ -33,7 +33,7 @@ import os from lxml import etree -from openlp.core.lib import translate +from openlp.core.ui.wizard import WizardStrings from openlp.plugins.songs.lib.songimport import SongImport from openlp.plugins.songs.lib import OpenLyrics @@ -48,13 +48,8 @@ class OpenLyricsImport(SongImport): Initialise the import. """ log.debug(u'initialise OpenLyricsImport') - SongImport.__init__(self, master_manager) - self.master_manager = master_manager - self.openLyrics = OpenLyrics(master_manager) - if kwargs.has_key(u'filename'): - self.import_source = kwargs[u'filename'] - if kwargs.has_key(u'filenames'): - self.import_source = kwargs[u'filenames'] + SongImport.__init__(self, master_manager, **kwargs) + self.openLyrics = OpenLyrics(self.manager) def do_import(self): """ @@ -65,9 +60,8 @@ class OpenLyricsImport(SongImport): for file_path in self.import_source: if self.stop_import_flag: return False - self.import_wizard.incrementProgressBar(unicode(translate( - 'SongsPlugin.OpenLyricsImport', 'Importing %s...')) % - os.path.basename(file_path)) + self.import_wizard.incrementProgressBar( + WizardStrings.ImportingType % os.path.basename(file_path)) try: parsed_file = etree.parse(file_path, parser) xml = unicode(etree.tostring(parsed_file)) diff --git a/openlp/plugins/songs/lib/opensongimport.py b/openlp/plugins/songs/lib/opensongimport.py index 00fdbf044..5214a0a24 100644 --- a/openlp/plugins/songs/lib/opensongimport.py +++ b/openlp/plugins/songs/lib/opensongimport.py @@ -31,7 +31,7 @@ from lxml import objectify from lxml.etree import Error, LxmlError import re -from openlp.core.lib import translate +from openlp.core.ui.wizard import WizardStrings from openlp.plugins.songs.lib.songimport import SongImport log = logging.getLogger(__name__) @@ -105,21 +105,19 @@ class OpenSongImport(SongImport): """ Initialise the class. """ - SongImport.__init__(self, manager) - self.filenames = kwargs[u'filenames'] - self.song = None + SongImport.__init__(self, manager, **kwargs) self.commit = True def do_import(self): """ - Import either each of the files in self.filenames - each element of + Import either each of the files in self.import_source - each element of which can be either a single opensong file, or a zipfile containing multiple opensong files. If `self.commit` is set False, the import will not be committed to the database (useful for test scripts). """ success = True numfiles = 0 - for filename in self.filenames: + for filename in self.import_source: ext = os.path.splitext(filename)[1] if ext.lower() == u'.zip': z = ZipFile(filename, u'r') @@ -128,7 +126,7 @@ class OpenSongImport(SongImport): numfiles += 1 log.debug(u'Total number of files: %d', numfiles) self.import_wizard.progressBar.setMaximum(numfiles) - for filename in self.filenames: + for filename in self.import_source: if self.stop_import_flag: success = False break @@ -146,8 +144,7 @@ class OpenSongImport(SongImport): continue log.info(u'Zip importing %s', parts[-1]) self.import_wizard.incrementProgressBar( - unicode(translate('SongsPlugin.ImportWizardForm', - 'Importing %s...')) % parts[-1]) + WizardStrings.ImportingType % parts[-1]) songfile = z.open(song) if self.do_import_file(songfile) and self.commit and \ not self.stop_import_flag: @@ -159,8 +156,7 @@ class OpenSongImport(SongImport): # not a zipfile log.info(u'Direct import %s', filename) self.import_wizard.incrementProgressBar( - unicode(translate('SongsPlugin.ImportWizardForm', - 'Importing %s...')) % os.path.split(filename)[-1]) + WizardStrings.ImportingType % os.path.split(filename)[-1]) song_file = open(filename) if self.do_import_file(song_file) and self.commit and \ not self.stop_import_flag: diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index 47290bfbd..2adfb30b2 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -33,7 +33,7 @@ import logging import os import re -from openlp.core.lib import translate +from openlp.core.ui.wizard import WizardStrings from openlp.plugins.songs.lib.songimport import SongImport log = logging.getLogger(__name__) @@ -74,12 +74,7 @@ class SongBeamerImport(SongImport): ``master_manager`` The song manager for the running OpenLP installation. """ - SongImport.__init__(self, master_manager) - if kwargs.has_key(u'filename'): - self.import_source = kwargs[u'filename'] - if kwargs.has_key(u'filenames'): - self.import_source = kwargs[u'filenames'] - log.debug(self.import_source) + SongImport.__init__(self, master_manager, **kwargs) def do_import(self): """ @@ -96,7 +91,7 @@ class SongBeamerImport(SongImport): read_verses = False file_name = os.path.split(file)[1] self.import_wizard.incrementProgressBar( - u'Importing %s' % (file_name), 0) + WizardStrings.ImportingType % file_name, 0) if os.path.isfile(file): detect_file = open(file, u'r') details = chardet.detect(detect_file.read(2048)) @@ -134,9 +129,8 @@ class SongBeamerImport(SongImport): self.add_verse(self.current_verse, self.current_verse_type) if self.check_complete(): self.finish() - self.import_wizard.incrementProgressBar(unicode(translate( - 'SongsPlugin.SongBeamerImport', 'Importing %s...')) % - file_name) + self.import_wizard.incrementProgressBar( + WizardStrings.ImportingType % file_name) return True def replace_html_tags(self): diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index e0e078c43..b24b2699a 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -31,6 +31,7 @@ from PyQt4 import QtCore from openlp.core.lib import Receiver, translate from openlp.plugins.songs.lib import VerseType from openlp.plugins.songs.lib.db import Song, Author, Topic, Book, MediaFile +from openlp.plugins.songs.lib.ui import SongStrings from openlp.plugins.songs.lib.xml import SongXML log = logging.getLogger(__name__) @@ -43,7 +44,7 @@ class SongImport(QtCore.QObject): whether the authors etc already exist and add them or refer to them as necessary """ - def __init__(self, manager): + def __init__(self, manager, **kwargs): """ Initialise and create defaults for properties @@ -53,6 +54,14 @@ class SongImport(QtCore.QObject): """ self.manager = manager + if kwargs.has_key(u'filename'): + self.import_source = kwargs[u'filename'] + elif kwargs.has_key(u'filenames'): + self.import_source = kwargs[u'filenames'] + else: + raise KeyError(u'Keyword arguments "filename[s]" not supplied.') + log.debug(self.import_source) + self.song = None self.stop_import_flag = False self.set_defaults() QtCore.QObject.connect(Receiver.get_receiver(), @@ -82,8 +91,6 @@ class SongImport(QtCore.QObject): self.verse_counts = {} self.copyright_string = unicode(translate( 'SongsPlugin.SongImport', 'copyright')) - self.copyright_symbol = unicode(translate( - 'SongsPlugin.SongImport', '\xa9')) def stop_import(self): """ @@ -138,12 +145,12 @@ class SongImport(QtCore.QObject): def process_verse_text(self, text): lines = text.split(u'\n') if text.lower().find(self.copyright_string) >= 0 \ - or text.find(self.copyright_symbol) >= 0: + or text.find(SongStrings.CopyrightSymbol) >= 0: copyright_found = False for line in lines: if (copyright_found or line.lower().find(self.copyright_string) >= 0 or - line.find(self.copyright_symbol) >= 0): + line.find(SongStrings.CopyrightSymbol) >= 0): copyright_found = True self.add_copyright(line) else: @@ -263,9 +270,8 @@ class SongImport(QtCore.QObject): All fields have been set to this song. Write the song to disk. """ if not self.authors: - self.authors.append(unicode(translate('SongsPlugin.SongImport', - 'Author unknown'))) - log.info(u'commiting song %s to database', self.title) + self.authors.append(SongStrings.AuthorUnknownUnT) + log.info(u'committing song %s to database', self.title) song = Song() song.title = self.title song.alternate_title = self.alternate_title diff --git a/openlp/plugins/songs/lib/songshowplusimport.py b/openlp/plugins/songs/lib/songshowplusimport.py index 5df36a5b1..74040bcc0 100644 --- a/openlp/plugins/songs/lib/songshowplusimport.py +++ b/openlp/plugins/songs/lib/songshowplusimport.py @@ -31,6 +31,7 @@ import os import logging import struct +from openlp.core.ui.wizard import WizardStrings from openlp.plugins.songs.lib.songimport import SongImport TITLE = 1 @@ -92,12 +93,7 @@ class SongShowPlusImport(SongImport): ``master_manager`` The song manager for the running OpenLP installation. """ - SongImport.__init__(self, master_manager) - if kwargs.has_key(u'filename'): - self.import_source = kwargs[u'filename'] - if kwargs.has_key(u'filenames'): - self.import_source = kwargs[u'filenames'] - log.debug(self.import_source) + SongImport.__init__(self, master_manager, **kwargs) def do_import(self): """ @@ -112,7 +108,7 @@ class SongShowPlusImport(SongImport): otherList = {} file_name = os.path.split(file)[1] self.import_wizard.incrementProgressBar( - u'Importing %s' % (file_name), 0) + WizardStrings.ImportingType % file_name, 0) songData = open(file, 'rb') while (1): blockKey, = struct.unpack("I", songData.read(4)) @@ -178,11 +174,11 @@ class SongShowPlusImport(SongImport): songData.close() self.finish() self.import_wizard.incrementProgressBar( - u'Importing %s' % (file_name)) + WizardStrings.ImportingType % file_name) return True def toOpenLPVerseTag(self, verseName): - if verseName.find(" ") !=-1: + if verseName.find(" ") != -1: verseParts = verseName.split(" ") verseType = verseParts[0] verseNumber = verseParts[1] diff --git a/openlp/plugins/songs/lib/ui.py b/openlp/plugins/songs/lib/ui.py new file mode 100644 index 000000000..65f473e63 --- /dev/null +++ b/openlp/plugins/songs/lib/ui.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, 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:`openlp.plugins.songs.lib.ui` module provides standard UI components +for the songs plugin. +""" +from openlp.core.lib import translate + +class SongStrings(object): + """ + Provide standard strings for use throughout the songs plugin. + """ + # These strings should need a good reason to be retranslated elsewhere. + Author = translate('OpenLP.Ui', 'Author', 'Singular') + Authors = translate('OpenLP.Ui', 'Authors', 'Plural') + AuthorUnknown = translate('OpenLP.Ui', 'Author Unknown') # Used in the UI. + AuthorUnknownUnT = u'Author Unknown' # Used to populate the database. + CopyrightSymbol = translate('OpenLP.Ui', '\xa9', 'Copyright symbol.') + SongBook = translate('OpenLP.Ui', 'Song Book', 'Singular') + SongBooks = translate('OpenLP.Ui', 'Song Books', 'Plural') + SongMaintenance = translate('OpenLP.Ui', 'Song Maintenance') + Topic = translate('OpenLP.Ui', 'Topic', 'Singular') + Topics = translate('OpenLP.Ui', 'Topics', 'Plural') diff --git a/openlp/plugins/songs/lib/wowimport.py b/openlp/plugins/songs/lib/wowimport.py index b90a47de6..05c9704f6 100644 --- a/openlp/plugins/songs/lib/wowimport.py +++ b/openlp/plugins/songs/lib/wowimport.py @@ -30,6 +30,7 @@ Worship songs into the OpenLP database. import os import logging +from openlp.core.ui.wizard import WizardStrings from openlp.plugins.songs.lib.songimport import SongImport BLOCK_TYPES = (u'V', u'C', u'B') @@ -98,12 +99,7 @@ class WowImport(SongImport): ``master_manager`` The song manager for the running OpenLP installation. """ - SongImport.__init__(self, master_manager) - if kwargs.has_key(u'filename'): - self.import_source = kwargs[u'filename'] - if kwargs.has_key(u'filenames'): - self.import_source = kwargs[u'filenames'] - log.debug(self.import_source) + SongImport.__init__(self, master_manager, **kwargs) def do_import(self): """ @@ -116,7 +112,7 @@ class WowImport(SongImport): copyright = u'' file_name = os.path.split(file)[1] self.import_wizard.incrementProgressBar( - u'Importing %s' % (file_name), 0) + WizardStrings.ImportingType % file_name, 0) # Get the song title self.title = file_name.rpartition(u'.')[0] songData = open(file, 'rb') @@ -162,5 +158,5 @@ class WowImport(SongImport): songData.close() self.finish() self.import_wizard.incrementProgressBar( - u'Importing %s' % (file_name)) + WizardStrings.ImportingType % file_name) return True diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index e5c3963c0..231080831 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -66,9 +66,9 @@ import re from lxml import etree, objectify -from openlp.core.lib import translate from openlp.plugins.songs.lib import VerseType from openlp.plugins.songs.lib.db import Author, Book, Song, Topic +from openlp.plugins.songs.lib.ui import SongStrings log = logging.getLogger(__name__) @@ -377,9 +377,7 @@ class OpenLyrics(object): except AttributeError: pass if not authors: - # Add "Author unknown" (can be translated). - authors.append((unicode(translate('SongsPlugin.XML', - 'Author unknown')))) + authors.append(SongStrings.AuthorUnknownUnT) for display_name in authors: author = self.manager.get_object_filtered(Author, Author.display_name == display_name) diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 887ddb7b2..bf33cd56e 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -31,6 +31,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.db import Manager +from openlp.core.lib.ui import UiStrings from openlp.plugins.songs.lib import SongMediaItem, SongsTab, SongXML from openlp.plugins.songs.lib.db import init_schema, Song from openlp.plugins.songs.lib.importer import SongFormat @@ -137,8 +138,7 @@ class SongsPlugin(Plugin): """ maxSongs = self.manager.get_object_count(Song) progressDialog = QtGui.QProgressDialog( - translate('SongsPlugin', 'Reindexing songs...'), - translate('SongsPlugin', 'Cancel'), + translate('SongsPlugin', 'Reindexing songs...'), UiStrings.Cancel, 0, maxSongs + 1, self.formparent) progressDialog.setWindowModality(QtCore.Qt.WindowModal) songs = self.manager.get_all_objects(Song)