From b6304dfc4f199fdc350899b74eb3ac29980de151 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 12 Mar 2010 17:43:42 +0200 Subject: [PATCH 01/81] Added bibles documentation. --- documentation/source/plugins/bibles.rst | 92 +++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 documentation/source/plugins/bibles.rst diff --git a/documentation/source/plugins/bibles.rst b/documentation/source/plugins/bibles.rst new file mode 100644 index 000000000..d374c1e97 --- /dev/null +++ b/documentation/source/plugins/bibles.rst @@ -0,0 +1,92 @@ +.. _plugins-bibles: + +:mod:`bibles` Plugin +==================== + +.. automodule:: openlp.plugins.bibles + :members: + +:mod:`BiblePlugin` Class +------------------------- + +.. autoclass:: openlp.plugins.bibles.bibleplugin.BiblePlugin + :members: + +:mod:`forms` Submodule +---------------------- + +.. automodule:: openlp.plugins.bibles.forms + :members: + +:mod:`BibleImportWizard` +^^^^^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: openlp.plugins.bibles.forms.bibleimportwizard.Ui_BibleImportWizard + :members: + +.. autoclass:: openlp.plugins.bibles.forms.importwizardform.ImportWizardForm + :members: + +:mod:`lib` Submodule +-------------------- + +.. automodule:: openlp.plugins.bibles.lib + :members: + +:mod:`db` +^^^^^^^^^ + +.. automodule:: openlp.plugins.bibles.lib.db + :members: + +.. autoclass:: openlp.plugins.bibles.lib.db.BibleDB + :members: + +:mod:`csv` +^^^^^^^^^^ + +.. automodule:: openlp.plugins.bibles.lib.csv + :members: + +.. autoclass:: openlp.plugins.bibles.lib.csv.CSVBible + :members: + +:mod:`http` +^^^^^^^^^^^ + +.. automodule:: openlp.plugins.bibles.lib.http + :members: + +.. autoclass:: openlp.plugins.bibles.lib.http.HTTPBible + :members: + +:mod:`bibleOSISimpl` +^^^^^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.bibles.lib.bibleOSISimpl + :members: + +:mod:`biblestab` +^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.bibles.lib.biblestab + :members: + +:mod:`common` +^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.bibles.lib.common + :members: + +:mod:`manager` +^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.bibles.lib.manager + :members: + +:mod:`mediaitem` +^^^^^^^^^^^^^^^^ + +.. automodule:: openlp.plugins.bibles.lib.mediaitem + :members: + From 906aa26bf84f2e6f57cd5aae683ef5311687804c Mon Sep 17 00:00:00 2001 From: rimach Date: Wed, 31 Mar 2010 11:43:52 +0200 Subject: [PATCH 02/81] add language selection --- openlp.pyw | 12 + resources/i18n/openlp_en.ts | 10498 +++++++++++++++++++--------------- scripts/generate_pro.py | 102 + 3 files changed, 5930 insertions(+), 4682 deletions(-) create mode 100755 scripts/generate_pro.py diff --git a/openlp.pyw b/openlp.pyw index f1b627940..4cf86a10c 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -195,6 +195,18 @@ def main(): qInitResources() # Now create and actually run the application. app = OpenLP(qt_args) + lang_Path = AppLocation.get_directory(AppLocation.AppDir) + if hasattr(sys, u'frozen'): + lang_Path = os.path.join(lang_Path, u'..') + lang_Path = os.path.join(lang_Path, u'resources', u'i18n') + locale = QtCore.QLocale.system().name() + qtTranslator = QtCore.QTranslator() + if qtTranslator.load("openlp_" + locale, lang_Path): + app.installTranslator(qtTranslator) + appTranslator = QtCore.QTranslator() + if appTranslator.load("openlp_" + locale, lang_Path): + app.installTranslator(appTranslator) + sys.exit(app.run()) if __name__ == u'__main__': diff --git a/resources/i18n/openlp_en.ts b/resources/i18n/openlp_en.ts index 1660428e2..b92f28c37 100644 --- a/resources/i18n/openlp_en.ts +++ b/resources/i18n/openlp_en.ts @@ -1,4848 +1,5982 @@ - - - - BibleMediaItem + + + AboutDialog - - Quick - + + About OpenLP + - - - Ui_customEditDialog - - Delete selected slide - + + About + - - - BiblesTab - - ( and ) - - - - - RemoteTab - - - Remotes - - - - - Ui_EditSongDialog - - - &Remove - - - - - Ui_AmendThemeDialog - - - Shadow Size: - - - - - Ui_OpenSongExportDialog - - - Close - - - - - ThemeManager - - - Import Theme - - - - - Ui_AmendThemeDialog - - - Slide Transition - - - - - SongMaintenanceForm - - - Are you sure you want to delete the selected book? - - - - - ThemesTab - - - Theme level - - - - - BibleMediaItem - - - Bible - - - - - ServiceManager - - - Save Changes to Service? - - - - - SongUsagePlugin - - - &Delete recorded data - - - - - Ui_OpenLPExportDialog - - - Song Title - - - - - Ui_customEditDialog - - - Edit selected slide - - - - - SongMediaItem - - - CCLI Licence: - - - - - Ui_BibleImportWizard - - - Bible Import Wizard - - - - - Ui_customEditDialog - - - Edit All - - - - - SongMaintenanceForm - - - Couldn't save your author. - - - - - Ui_ServiceNoteEdit - - - Service Item Notes - - - - - Ui_customEditDialog - - - Add new slide at bottom - - - - - Clear - - - - - ThemesTab - - - Global theme - - - - - PresentationPlugin - - - <b>Presentation Plugin</b> <br> Delivers the ability to show presentations using a number of different programs. The choice of available presentation programs is available to the user in a drop down box. - - - - - SongUsagePlugin - - - Start/Stop live song usage recording - - - - - MainWindow - - - The Main Display has been blanked out - - - - - Ui_OpenSongExportDialog - - - Lyrics - - - - - Ui_AlertDialog - - - Display - - - - - SongMaintenanceForm - - - This author can't be deleted, they are currently assigned to at least one song. - - - - - Ui_customEditDialog - - - Delete - - - - - Ui_EditVerseDialog - - - Verse - - - - - Ui_OpenSongImportDialog - - - OpenSong Folder: - - - - - ThemeManager - - - Create a new theme - - - - - Ui_MainWindow - - - Open an existing service - - - - - SlideController - - - Move to previous - - - - - SongsPlugin - - - &Song - - - - - Ui_PluginViewDialog - - - Plugin Details - - - - - ImportWizardForm - - - You need to specify a file with books of the Bible to use in the import. - - - - - AlertsTab - - - Edit History: - - - - - Ui_MainWindow - - - &File - - - - - BiblesTab - - - verse per line - - - - - Ui_customEditDialog - - - Theme: - - - - - SongMaintenanceForm - - - Couldn't add your book. - - - - - Error - - - - - Ui_BibleImportWizard - - - Bible: - - - - - ThemeManager - - - Delete Theme - - - - - SplashScreen - - - Splash Screen - - - - - SongMediaItem - - - Song - - - - - Ui_OpenSongExportDialog - - - Song Title - - - - - Ui_AmendThemeDialog - - - Bottom - - - - - Ui_MainWindow - - - List the Plugins - - - - - SongMaintenanceForm - - - No author selected! - - - - - SongUsageDeleteForm - - - Delete Selected Song Usage Events? - - - - - SongUsagePlugin - - - <b>SongUsage Plugin</b><br>This plugin records the use of songs and when they have been used during a live service - - - - - Ui_customEditDialog - - - Move slide Up 1 - - - - - SongsPlugin - - - OpenSong - - - - - AlertsManager - - - Alert message created and delayed - - - - - Ui_EditSongDialog - - - Alternative Title: - - - - - ServiceManager - - - Open Service - - - - - BiblesTab - - - Display Style: - - - - - Ui_AmendThemeDialog - - - Image - - - - - EditSongForm - - - You need to enter a song title. - - - - - ThemeManager - - - Error - - - - - Ui_SongUsageDeleteDialog - - - Song Usage Delete - - - - - ImportWizardForm - - - Invalid Bible Location - - - - - BibleMediaItem - - - Book: - - - - - ThemeManager - - - Make Global - - - - - Ui_MainWindow - - - &Service Manager - - - - - Ui_OpenLPImportDialog - - - Author - - - - - Ui_AmendThemeDialog - - - Height: - - - - - ThemeManager - - - Delete a theme - - - - - Ui_BibleImportWizard - - - Crosswalk - - - - - SongBookForm - - - Error - - - - - Ui_AuthorsDialog - - - Last name: - - - - - ThemesTab - - - Use the global theme, overriding any themes associated with either the service or the songs. - - - - - Ui_customEditDialog - - - Title: - - - - - ImportWizardForm - - - You need to set a copyright for your Bible! Bibles in the Public Domain need to be marked as such. - - - - - SongMediaItem - - - Maintain the lists of authors, topics and books - - - - - Ui_AlertEditDialog - - - Save - - - - - EditCustomForm - - - You have unsaved data - - - - - Ui_AmendThemeDialog - - - Outline - - - - - BibleMediaItem - - - Text Search - - - - - Ui_BibleImportWizard - - - CSV - - - - - SongUsagePlugin - - - Delete song usage to specified date - - - - - Ui_SongUsageDetailDialog - - - Report Location - - - - - Ui_BibleImportWizard - - - OpenSong - - - - - Ui_MainWindow - - - Open Service - - - - - BibleMediaItem - - - Find: - - - - - ImageMediaItem - - - Select Image(s) - - - - - BibleMediaItem - - - Search Type: - - - - - Ui_MainWindow - - - Media Manager - - - - - Alt+F4 - - - - - MediaManagerItem - - - &Preview - - - - - GeneralTab - - - CCLI Details - - - - - BibleMediaItem - - - Bible not fully loaded - - - - - Ui_MainWindow - - - Toggle the visibility of the Preview Panel - - - - - ImportWizardForm - - - Bible Exists - - - - - Ui_MainWindow - - - &User Guide - - - - - AlertsTab - - - pt - - - - - Ui_MainWindow - - - Set the interface language to English - - - - - Ui_AmendThemeDialog - - - Main Font - - - - - ImportWizardForm - - - Empty Copyright - - - - - AuthorsForm - - - You need to type in the first name of the author. - - - - - SongsTab - - - Display Verses on Live Tool bar: - - - - - ServiceManager - - - Move to top - - - - - ImageMediaItem - - - Override background - - - - - Ui_SongMaintenanceDialog - - - Edit - - - - - Ui_OpenSongExportDialog - - - Select All - - - - - ThemesTab - - - Use the theme from each song in the database. If a song doesn't have a theme associated with it, then use the service's theme. If the service doesn't have a theme, then use the global theme. - - - - - PresentationMediaItem - - - Presentation - - - - - Ui_AmendThemeDialog - - - Solid Color - - - - - CustomTab - - - Custom - - - - - Ui_OpenLPImportDialog - - - Ready to import - - - - - MainWindow - - - OpenLP version %s has been updated to version %s - -You can obtain the latest version from http://openlp.org - - - - - Ui_BibleImportWizard - - - File Location: - - - - - SlideController - - - Go to Verse - - - - - SongMaintenanceForm - - - Couldn't add your topic. - - - - - Ui_MainWindow - - - &Import - - - - - Quit OpenLP - - - - - Ui_BibleImportWizard - - - 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. - - - - - Ui_OpenLPExportDialog - - - Title - - - - - ImportWizardForm - - - Empty Version Name - - - - - Ui_MainWindow - - - &Preview Panel - - - - - SlideController - - - Start continuous loop - - - - - GeneralTab - - - primary - - - - - Ui_EditSongDialog - - - Add a Theme - - - - - Ui_MainWindow - - - &New - - - - - Ui_customEditDialog - - - Credits: - - - - - Ui_EditSongDialog - - - R&emove - - - - - SlideController - - - Live - - - - - Ui_AmendThemeDialog - - - Font Main - - - - - BiblesTab - - - continuous - - - - - ThemeManager - - - File is not a valid theme. - - - - - GeneralTab - - - Application Startup - - - - - Ui_AmendThemeDialog - - - Use Default Location: - - - - - Ui_OpenSongImportDialog - - - Import - - - - - Ui_AmendThemeDialog - - - Other Options - - - - - Ui_EditSongDialog - - - Verse Order: - - - - - Ui_MainWindow - - - Default Theme: - - - - - Toggle Preview Panel - - - - - SongMediaItem - - - Lyrics - - - - - Ui_OpenLPImportDialog - - - Progress: - - - - - Ui_AmendThemeDialog - - - Shadow - - - - - GeneralTab - - - Select monitor for output display: - - - - - Ui_MainWindow - - - &Settings - - - - - EditSongForm - - - Invalid verse entry - values must be Numeric, I,B,C,T,P,E,O - - - - - Ui_AmendThemeDialog - - - Italics - - - - - ServiceManager - - - Create a new service - - - - - Ui_AmendThemeDialog - - - Background: - - - - - Ui_OpenLPImportDialog - - - openlp.org Song Importer - - - - - Ui_BibleImportWizard - - - Copyright: - - - - - ThemesTab - - - Service level - - - - - BiblesTab - - - [ and ] - - - - - Ui_BibleImportWizard - - - Verse Location: - - - - - MediaManagerItem - - - You must select one or more items - - - - - GeneralTab - - - Application Settings - - - - - ServiceManager - - - Save this service - - - - - ImportWizardForm - - - Open Books CSV file - - - - - GeneralTab - - - SongSelect Username: - - - - - Ui_AmendThemeDialog - - - X Position: - - - - - BibleMediaItem - - - No matching book could be found in this Bible. - - - - - Ui_BibleImportWizard - - - Server: - - - - - Ui_EditVerseDialog - - - Ending - - - - - CustomTab - - - Display Footer: - - - - - ImportWizardForm - - - Invalid OpenSong Bible - - - - - GeneralTab - - - CCLI Number: - - - - - Ui_AmendThemeDialog - - - Center - - - - - ServiceManager - - - Theme: - - - - - AlertEditForm - - - Please save or clear selected item - - - - - Ui_MainWindow - - - &Live - - - - - Ui_AmendThemeDialog - - - <Color2> - - - - - Ui_MainWindow - - - English - - - - - ImageMediaItem - - - You must select one or more items - - - - - Ui_AuthorsDialog - - - First name: - - - - - Ui_OpenLPExportDialog - - - Select openlp.org export filename: - - - - - Ui_BibleImportWizard - - - Permission: - - - - - Ui_OpenSongImportDialog - - - Close - - - - - Ui_SongUsageDetailDialog - - - Song Usage Extraction - - - - - Ui_AmendThemeDialog - - - Opaque - - - - - ImportWizardForm - - - Your Bible import failed. - - - - - SlideController - - - Start playing media - - - - - SongMediaItem - - - Type: - - - - - SongMaintenanceForm - - - This book can't be deleted, it is currently assigned to at least one song. - - - - - Ui_AboutDialog - - - Close - - - - - TopicsForm - - - You need to type in a topic name! - - - - - Ui_OpenSongExportDialog - - - Song Export List - - - - - BibleMediaItem - - - Dual: - - - - - ImageTab - - - sec - - - - - ServiceManager - - - Delete From Service - - - - - GeneralTab - - - Automatically open the last service - - - - - Ui_OpenLPImportDialog - - - Song Import List - - - - - Ui_OpenSongExportDialog - - - Author - - - - - Ui_AmendThemeDialog - - - Outline Color: - - - - - Ui_BibleImportWizard - - - Select Import Source - - - - - Ui_MainWindow - - - F9 - - - - - F8 - - - - - ServiceManager - - - &Change Item Theme - - - - - Ui_SongMaintenanceDialog - - - Topics - - - - - Ui_OpenLPImportDialog - - - Import File Song List - - - - - Ui_customEditDialog - - - Edit Custom Slides - - - - - Ui_BibleImportWizard - - - Set up the Bible's license details. - - - - - Ui_EditVerseDialog - - - Number - - - - - Ui_AmendThemeDialog - - - Alignment - - - - - SongMaintenanceForm - - - Delete Book - - - - - ThemeManager - - - Edit a theme - - - - - Ui_BibleImportWizard - - - BibleGateway - - - - - GeneralTab - - - Preview Next Song from Service Manager - - - - - Ui_EditSongDialog - - - Title && Lyrics - - - - - SongMaintenanceForm - - - No book selected! - - - - - SlideController - - - Move to live - - - - - Ui_EditVerseDialog - - - Other - - - - - Ui_EditSongDialog - - - Theme - - - - - ServiceManager - - - Save Service - - - - - Ui_SongUsageDetailDialog - - - Select Date Range - - - - - Ui_MainWindow - - - Save the current service to disk - - - - - BibleMediaItem - - - Chapter: - - - - - Search - - - - - PresentationTab - - - Available Controllers - - - - - Ui_MainWindow - - - Add &Tool... - - - - - TopicsForm - - - Error - - - - - RemoteTab - - - Remotes Receiver Port - - - - - Ui_MainWindow - - - &View - - - - - Ui_AmendThemeDialog - - - Normal - - - - - Ui_OpenLPExportDialog - - - Close - - - - - Ui_BibleImportWizard - - - Username: - - - - - ThemeManager - - - Edit Theme - - - - - SlideController - - - Preview - - - - - Ui_AlertDialog - - - Alert Message - - - - - ImportWizardForm - - - Finished import. - - - - - GeneralTab - - - Show blank screen warning - - - - - ImportWizardForm - - - You need to specify a file of Bible verses to import. - - - - - AlertsTab - - - Location: - - - - - Ui_EditSongDialog - - - Authors, Topics && Book - - - - - EditSongForm - - - You need to enter some verses. - - - - - Ui_BibleImportWizard - - - Download Options - - - - - BiblePlugin - - - <strong>Bible Plugin</strong><br />This plugin allows bible verses from different sources to be displayed on the screen during the service. - - - - - Ui_EditSongDialog - - - Copyright Information - - - - - Ui_MainWindow - - - &Export - - - - - Ui_AmendThemeDialog - - - Bold - - - - - SongsPlugin - - - Export songs in OpenLP 2.0 format - - - - - MediaManagerItem - - - Load a new - - - - - AlertEditForm - - - Missing data - - - - - SongsPlugin - - - <b>Song Plugin</b> <br>This plugin allows Songs to be managed and displayed.<br> - - - - - Ui_AmendThemeDialog - - - Footer Font - - - - - EditSongForm - - - Invalid verse entry - vX - - - - - ServiceManager - - - OpenLP Service Files (*.osz) - - - - - MediaManagerItem - - - Delete the selected item - - - - - Ui_OpenLPExportDialog - - - Export - - - - - Ui_BibleImportWizard - - - Location: - - - - - BibleMediaItem - - - Keep - - - - - SongUsagePlugin - - - Generate report on Song Usage - - - - - Ui_EditSongDialog - - - Topic - - - - - Ui_MainWindow - - - &Open - - - - - AuthorsForm - - - You haven't set a display name for the author, would you like me to combine the first and last names for you? - - - - - AmendThemeForm - - - Slide Height is %s rows - - - - - Ui_EditSongDialog - - - Lyrics: - - - - - Ui_AboutDialog - - - Project Lead - Raoul "superfly" Snyman - -Developers - Tim "TRB143" Bentley - Jonathan "gushie" Corwin - Michael "cocooncrash" Gorven - Scott "sguerrieri" Guerrieri - Raoul "superfly" Snyman - Maikel Stuivenberg - Martin "mijiti" Thompson - Jon "Meths" Tibble - Carsten "catini" Tingaard - -Testers - Wesley "wrst" Stout - - - - - SongMediaItem - - - Titles - - - - - Ui_OpenLPExportDialog - - - Lyrics - - - - - PresentationMediaItem - - - Present using: - - - - - SongMediaItem - - - Clear - - - - - ServiceManager - - - &Live Verse - - - - - Ui_OpenSongImportDialog - - - Progress: - - - - - Ui_MainWindow - - - Toggle Theme Manager - - - - - Ui_AlertDialog - - - Alert Text: - - - - - Ui_EditSongDialog - - - Edit - - - - - AlertsTab - - - Font Color: - - - - - Ui_AmendThemeDialog - - - Theme Maintenance - - - - - CustomTab - - - Custom Display - - - - - Ui_OpenSongExportDialog - - - Title - - - - - Ui_AmendThemeDialog - - - <Color1> - - - - - Ui_EditSongDialog - - - Authors - - - - - ThemeManager - - - Export Theme - - - - - ImageMediaItem - - - No items selected... - - - - - Ui_SongBookDialog - - - Name: - - - - - Ui_AuthorsDialog - - - Author Maintenance - - - - - Ui_AmendThemeDialog - - - Font Footer - - - - - BiblesTab - - - Verse Display - - - - - Ui_MainWindow - - - &Options - - - - - BibleMediaItem - - - Results: - - - - - Ui_OpenLPExportDialog - - - Full Song List - - - - - ServiceManager - - - Move to &top - - - - - SlideController - - - Move to last - - - - - Ui_OpenLPExportDialog - - - Progress: - - - - - Ui_SongMaintenanceDialog - - - Add - - - - - SongMaintenanceForm - - - Are you sure you want to delete the selected author? - - - - - SongUsagePlugin - - - Song Usage Status - - - - - BibleMediaItem - - - Verse Search - - - - - Ui_SongBookDialog - - - Edit Book - - - - - EditSongForm - - - Save && Preview - - - - - Ui_SongBookDialog - - - Publisher: - - - - - Ui_AmendThemeDialog - - - Font Weight: - - - - - Ui_BibleImportWizard - - - Bible Filename: - - - - - Ui_AmendThemeDialog - - - Transparent - - - - - SongMediaItem - - - Search - - - - - Ui_BibleImportWizard - - - Format: - - - - - Ui_AmendThemeDialog - - - Background - - - - - Ui_BibleImportWizard - - - Importing - - - - - Ui_customEditDialog - - - Edit all slides - - - - - SongsTab - - - Enable search as you type: - - - - - Ui_MainWindow - - - Ctrl+S - - - - - SongMediaItem - - - Authors - - - - - Ui_PluginViewDialog - - - Active - - - - - SongMaintenanceForm - - - Couldn't add your author. - - - - - Ui_MainWindow - - - Ctrl+O - - - - - Ctrl+N - - - - - Ui_AlertEditDialog - - - Edit - - - - - Ui_EditSongDialog - - - Song Editor - - - - - AlertsTab - - - Font - - - - - SlideController - - - Edit and re-preview Song - - - - - Delay between slides in seconds - - - - - MediaManagerItem - - - &Edit - - - - - Ui_AmendThemeDialog - - - Vertical - - - - - Width: - - - - - ThemesTab - - - Global level - - - - - ThemeManager - - - You are unable to delete the default theme. - - - - - BibleMediaItem - - - Version: - - - - - Ui_AboutDialog - - - OpenLP <version> build <revision> - Open Source Lyrics Projection + + OpenLP <version> - Open Source Lyrics Projection OpenLP is free church presentation software, or lyrics projection software, used to display slides of songs, Bible verses, videos, images, and even presentations (if OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. Find out more about OpenLP: http://openlp.org/ OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - + - - - SongsPlugin - - OpenLP 2.0 - + + Credits + - - - ServiceManager - - New Service - + + Project Lead + Raoul "superfly" Snyman + +Developers + Tim "TRB143" Bentley + Jonathan "gushie" Corwin + Scott "sguerrieri" Guerrieri + Raoul "superfly" Snyman + Maikel Stuivenberg + Martin "mijiti" Thompson + Carsten "catini" Tingaard + +Testers + Wesley "wrst" Stout + - - - Ui_TopicsDialog - - Topic name: - + + License + + + + + Copyright © 2004-2009 Raoul Snyman +Portions copyright © 2004-2009 Tim Bentley, Jonathan Corwin, Scott Guerrieri, Maikel Stuivenberg, Martin Thompson, Carsten Tinggaard, Jon Tibble + +This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See below for more details. + + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + +<one line to give the program's name and a brief idea of what it does.> +Copyright (C) <year> <name of author> + +This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. + +<signature of Ty Coon>, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. + - - - Ui_BibleImportWizard - - License Details - + + Contribute + - - - Ui_AboutDialog - - License - + + Close + - - - OpenSongBible - - Importing - + + &Contribute + - - - Ui_AmendThemeDialog + + + AboutForm - - Middle - + + build + - - - Ui_customEditDialog + + + AlertEditDialog - - Save - + + Maintain Alerts + - - + + + Save + + + + + Clear + + + + + Add + + + + + Edit + + + + + Delete + + + + AlertEditForm + + + AlertForm - - Item selected to Edit - + + Alert Message + - - - BibleMediaItem - - From: - + + Alert Text: + - - - Ui_AmendThemeDialog - - Shadow Color: - + + Display + - - - ServiceManager - - &Notes - + + Cancel + - - - Ui_MainWindow - - - E&xit - - - - - Ui_OpenLPImportDialog - - - Close - - - - - MainWindow - - - OpenLP Version Updated - - - - - Ui_customEditDialog - - - Replace edited slide - - - - - EditCustomForm - - - You need to enter a title - - - - - ThemeManager - - - Theme Exists - - - - - Ui_MainWindow - - - &Help - - - - - Ui_EditVerseDialog - - - Bridge - - - - - Ui_OpenSongExportDialog - - - OpenSong Song Exporter - - - - - Ui_AmendThemeDialog - - - Vertical Align: - - - - - Ui_EditVerseDialog - - - Pre-Chorus - - - - - Ui_AmendThemeDialog - - - Top - - - - - BiblesTab - - - Display Dual Bible Verses - - - - - Ui_MainWindow - - - Toggle Service Manager - - - - - Ui_EditSongDialog - - - Delete - - - - - MediaManagerItem - - - &Add to Service - - - - - AmendThemeForm - - - First Color: - - - - - ThemesTab - - - Song level - - - - - alertsPlugin - - - Show an alert message - - - - - Ui_MainWindow - - - Ctrl+F1 - - - - - SongMaintenanceForm - - - Couldn't save your topic. - - - - - Ui_MainWindow - - - Save the current service under a new name - - - - - Ui_OpenLPExportDialog - - - Remove Selected - - - - - ThemeManager - - - Delete theme - - - - - ImageTab - - - Image Settings - - - - - Ui_OpenSongImportDialog - - - OpenSong Song Importer - - - - - SongUsagePlugin - - - &Extract recorded data - - - - + + + AlertsManager + + AlertsTab - - Font Name: - - - - - Ui_MainWindow - - - &Web Site - - - - - MediaManagerItem - - - Send the selected item live - - - - - Ui_MainWindow - - - M&ode - + + pt + - - Translate the interface to your language - + + Location: + - - Service Manager - - - - - CustomMediaItem - - - Custom - - - - - Ui_BibleImportWizard - - - OSIS - - - - - SongsPlugin - - - openlp.org 1.0 - - - - - Ui_MainWindow - - - &Theme - - - - - Ui_EditVerseDialog - - - Edit Verse - - - - - Ui_MainWindow - - - &Language - - - - - ServiceManager - - - Move to end - + + Font Color: + - - Your service is unsaved, do you want to save those changes before creating a new one ? - - - - - Ui_OpenSongExportDialog - - - Remove Selected - - - - - SongMediaItem - - - Search: - - - - - MainWindow - - - Save Changes to Service? - + + Font + - - Your service has changed, do you want to save those changes? - + + Font Name: + - - - ServiceManager - - &Delete From Service - + + Preview + - - - Ui_EditSongDialog - - &Add to Song - + + Alerts + - - - Ui_MainWindow - - &About - + + Alert timeout: + - - - ImportWizardForm - - You need to specify a version name for your Bible. - + + openlp.org + - - - BiblesTab - - Only show new chapter numbers - + + Keep History: + - - - Ui_AlertEditDialog - - Delete - + + Background Color: + - - - EditCustomForm - - Error - + + s + - - - ThemesTab - - Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. - + + Bottom + - - - AlertEditForm - - Item selected to Add - + + Top + - - - Ui_AmendThemeDialog - - Right - + + Font Size: + - - - ThemeManager - - Save Theme - (%s) - + + Save + - - - MediaManagerItem - - Add the selected item(s) to the service - + + Clear + - - + + + Add + + + + + Edit + + + + + Delete + + + + + Item selected to Add + + + + + Missing data + + + + + AmendThemeDialog + + + Theme Maintance + + + + + Theme Name: + + + + + Background + + + + + Background: + + + + + Opaque + + + + + Transparent + + + + + Background Type: + + + + + Solid Color + + + + + Gradient + + + + + Image + + + + + <Color1> + + + + + <Color2> + + + + + Image: + + + + + Gradient : + + + + + Horizontal + + + + + Vertical + + + + + Circular + + + + + Font Main + + + + + Main Font + + + + + Font: + + + + + Font Color: + + + + + Size: + + + + + pt + + + + + Wrap Indentation + + + + + TextLabel + + + + + Display Location + + + + + Use Default Location: + + + + + X Position: + + + + + Y Position: + + + + + Width: + + + + + Height: + + + + + px + + + + + Font Footer + + + + + Footer Font + + + + + Other Options + + + + + Shadow && Outline + + + + + Outline Color: + + + + + Show Outline: + + + + + Shadow Color: + + + + + Show Shadow: + + + + + Alignment + + + + + Horizontal Align: + + + + + Left + + + + + Right + + + + + Center + + + + + Vertical Align: + + + + + Top + + + + + Middle + + + + + Bottom + + + + + Preview + + + + + AmendThemeForm + + + Slide Height is %s rows + + + + + First Color: + + + + + Second Color: + + + + + Background Color: + + + + + AuditDeleteDialog + + + Audit Delete + + + + + AuditDetailDialog + + + Audit Detail Extraction + + + + + Select Date Range + + + + + to + + + + + Report Location + + + + + AuthorsDialog + + + Author Maintenance + + + + + Display Name: + + + + + First Name: + + + + + Exit Screen + + + + + Last Name: + + + + AuthorsForm - - Error - + + You need to type in the first name of the author. + - - - Ui_AmendThemeDialog - - Font Color: - + + You haven't set a display name for the author, would you like me to combine the first and last names for you? + - - - Ui_OpenLPImportDialog - - Select openlp.org songfile to import: - + + Error + - - - Ui_SettingsDialog - - Settings - + + You need to type in the last name of the author. + - - - BiblesTab + + + BibleImportDialog - - Layout Style: - + + Bible Registration + - - - MediaManagerItem - - Edit the selected - + + Licence Details + - - - SlideController - - Move to next - + + Version Name: + - - - Ui_MainWindow - - &Plugin List - + + Copyright: + - - + + + Permission: + + + + + Import Progress + + + + + %p + + + + + Import + + + + + Cancel + + + + + Osis (Sword) Imports + + + + + OSIS Bible + + + + + Bible Name: + + + + + File Location: + + + + + CSV File Imports + + + + + CVS Bible + + + + + Books Location: + + + + + Verse Location: + + + + + Web Downloads + + + + + Download Options + + + + + Location: + + + + + Crosswalk + + + + + Bible: + + + + + NIV + + + + + KJV + + + + + Proxy Settings (Optional) + + + + + Proxy Address: + + + + + Username: + + + + + Password: + + + + + BibleMediaItem + + + Quick + + + + + Bible + + + + + Book: + + + + + Text Search + + + + + Find: + + + + + Search Type: + + + + + Bible not fully loaded + + + + + No matching book could be found in this Bible. + + + + + Dual: + + + + + Chapter: + + + + + Search + + + + + Keep + + + + + Results: + + + + + Verse Search + + + + + Version: + + + + + From: + + + + + No Book Found + + + + + Advanced + + + + + To: + + + + + Clear + + + + + Verse: + + + + BiblePlugin - - &Bible - + + <strong>Bible Plugin</strong><br />This plugin allows bible verses from different sources to be displayed on the screen during the service. + - - - Ui_BibleImportWizard - - - Web Download - - - - - Ui_AmendThemeDialog - - - Horizontal - - - - - ImportWizardForm - - - Open OSIS file - - - - - Ui_AmendThemeDialog - - - Circular - - - - - PresentationMediaItem - - - Automatic - - - - - SongMaintenanceForm - - - Couldn't save your book. - - - - - Ui_AmendThemeDialog - - - pt - - - - - SongMaintenanceForm - - - Delete Topic - - - - - Ui_OpenLPImportDialog - - - Lyrics - - - - + + BiblesTab - - No brackets - - - - - Ui_AlertEditDialog - - - Maintain Alerts - - - - - Ui_AmendThemeDialog - - - px - - - - - ServiceManager - - - Select a theme for the service - - - - - ThemesTab - - - Themes - - - - - Ui_PluginViewDialog - - - Status: - - - - - Ui_EditSongDialog - - - CCLI Number: - - - - - ImportWizardForm - - - This Bible already exists! Please import a different Bible or first delete the existing one. - - - - - Ui_MainWindow - - - &Translate - - - - - BiblesTab - - - Bibles - - - - - Ui_SongMaintenanceDialog - - - Authors - - - - - SongUsageDetailForm - - - Output File Location - - - - - BiblesTab - - - { and } - - - - - GeneralTab - - - Prompt to save Service before starting New - - - - - ImportWizardForm - - - Starting import... - - - - - BiblesTab - - - Note: -Changes don't affect verses already in the service - - - - - Ui_EditVerseDialog - - - Intro - - - - - ServiceManager - - - Move up order - - - - - PresentationTab - - - available - - - - - ThemeManager - - - default - - - - - SongMaintenanceForm - - - Delete Author - - - - - Ui_AmendThemeDialog - - - Display Location - - - - - Ui_PluginViewDialog - - - Version: - - - - - Ui_AlertEditDialog - - - Add - - - - - GeneralTab - - - General - - - - - Ui_AmendThemeDialog - - - Y Position: - - - - - ServiceManager - - - Move down order - - - - - BiblesTab - - - verse per slide - - - - - Ui_AmendThemeDialog - - - Show Shadow: - - - - - AlertsTab - - - Preview - - - - - alertsPlugin - - - <b>Alerts Plugin</b><br>This plugin controls the displaying of alerts on the presentations screen - - - - - GeneralTab - - - Show the splash screen - - - - - Ui_MainWindow - - - New Service - - - - - SlideController - - - Move to first - - - - - Ui_MainWindow - - - &Online Help - - - - - SlideController - - - Blank Screen - - - - - Ui_MainWindow - - - Save Service - + + ( and ) + - - Save &As... - + + verse per line + - - Toggle the visibility of the Media Manager - - - - - BibleMediaItem - - - No Book Found - - - - - Ui_EditSongDialog - - - Add - - - - - alertsPlugin - - - &Alert - - - - - BibleMediaItem - - - Advanced - - - - - ImageMediaItem - - - Image(s) - - - - - Ui_MainWindow - - - F11 - + + Display Style: + - - F10 - + + continuous + - - F12 - + + [ and ] + - - + + + Verse Display + + + + + Display Dual Bible Verses + + + + + Only show new chapter numbers + + + + + Layout Style: + + + + + No brackets + + + + + Bibles + + + + + { and } + + + + + Note: +Changes don't affect verses already in the service + + + + + verse per slide + + + + + Bible Theme: + + + + + CustomMediaItem + + + Custom + + + + CustomPlugin - - <b>Custom Plugin</b><br>This plugin allows slides to be displayed on the screen in the same way songs are. This plugin provides greater freedom over the songs plugin.<br> - + + <b>Custom Plugin</b><br>This plugin allows slides to be displayed on the screen in the same way songs are. This plugin provides greater freedom over the songs plugin.<br> + - - - Ui_MainWindow + + + CustomTab - - Alt+F7 - + + Custom + - - Add an application to the list of tools - + + Display Footer: + - - - MediaPlugin - - <b>Media Plugin</b><br>This plugin allows the playing of audio and video media - + + Custom Display + - - - ServiceManager - - - Move &down - - - - - BiblesTab - - - Bible Theme: - - - - - SongsPlugin - - - Export songs in openlp.org 1.0 format - - - - - Ui_MainWindow - - - Theme Manager - - - - - AlertsTab - - - Alerts - - - - - Ui_customEditDialog - - - Move slide down 1 - - - - - Ui_AmendThemeDialog - - - Font: - - - - - ServiceManager - - - Load an existing service - - - - - Ui_MainWindow - - - Toggle the visibility of the Theme Manager - - - - - PresentationTab - - - Presentations - - - - - SplashScreen - - - Starting - - - - - ImageTab - - - Slide Loop Delay: - - - - - SlideController - - - Verse - - - - - AlertsTab - - - Alert timeout: - - - - - Ui_MainWindow - - - &Preview Pane - - - - - MediaManagerItem - - - Add a new - - - - - ThemeManager - - - Select Theme Import File - - - - - New Theme - - - - - MediaMediaItem - - - Media - - - - - Ui_AmendThemeDialog - - - Preview - - - - - Outline Size: - - - - - Ui_OpenSongExportDialog - - - Progress: - - - - - AmendThemeForm - - - Second Color: - - - - - Ui_EditSongDialog - - - Theme, Copyright Info && Comments - - - - - Ui_AboutDialog - - - Credits - - - - - BibleMediaItem - - - To: - - - - - Ui_EditSongDialog - - - Song Book - - - - - Ui_OpenLPExportDialog - - - Author - - - - - Ui_AmendThemeDialog - - - Wrap Indentation - - - - - ThemeManager - - - Import a theme - - - - - ImageMediaItem - - - Image - - - - - BibleMediaItem - - - Clear - - - - - Ui_MainWindow - - - Save Service As - - - - - Ui_AlertDialog - - - Cancel - - - - - Ui_OpenLPImportDialog - - - Import - - - - - Ui_EditVerseDialog - - - Chorus - - - - - Ui_EditSongDialog - - - Edit All - - - - - AuthorsForm - - - You need to type in the last name of the author. - - - - - SongsTab - - - Songs Mode - - - - - Ui_AmendThemeDialog - - - Left - - - - - RemotesPlugin - - - <b>Remote Plugin</b><br>This plugin provides the ability to send messages to a running version of openlp on a different computer.<br>The Primary use for this would be to send alerts from a creche - - - - - ImageTab - - - Images - - - - - BibleMediaItem - - - Verse: - - - - - Ui_OpenLPExportDialog - - - openlp.org Song Exporter - - - - - Song Export List - - - - - ThemeManager - - - Export theme - - - - - Ui_SongMaintenanceDialog - - - Delete - - - - - Ui_AmendThemeDialog - - - Theme Name: - - - - - Ui_AboutDialog - - - About OpenLP - - - - - Ui_MainWindow - - - Toggle the visibility of the Service Manager - - - - - PresentationMediaItem - - - A presentation with that filename already exists. - - - - - ImageMediaItem - - - Allow the background of live slide to be overridden - - - - - SongUsageDeleteForm - - - Are you sure you want to delete selected Song Usage data? - - - - - AlertsTab - - - openlp.org - - - - - ImportWizardForm - - - Invalid Books File - - - - - Ui_OpenLPImportDialog - - - Song Title - - - - - MediaManagerItem - - - &Show Live - - - - - AlertsTab - - - Keep History: - - - - - Ui_AmendThemeDialog - - - Image: - - - - - ImportWizardForm - - - Open Verses CSV file - - - - - Ui_customEditDialog - - - Set Theme for Slides - - - - - Ui_MainWindow - - - More information about OpenLP - - - - - AlertsTab - - - Background Color: - - - - - SongMaintenanceForm - - - No topic selected! - - - - - Ui_MainWindow - - - &Media Manager - - - - - &Tools - - - - - AmendThemeForm - - - Background Color: - - - - - Ui_EditSongDialog - - - A&dd to Song - - - - - Title: - - - - - GeneralTab - - - Screen - - - - - SongMaintenanceForm - - - This topic can't be deleted, it is currently assigned to at least one song. - - - - - AlertsTab - - - s - - - - - Ui_AlertEditDialog - - - Clear - - - - - Ui_BibleImportWizard - - - Please wait while your Bible is imported. - - - - - MediaManagerItem - - - No items selected... - - - - - Ui_OpenLPImportDialog - - - Select All - - - - - Ui_BibleImportWizard - - - Select the import format, and where to import from. - - - - - Ui_OpenLPImportDialog - - - Title - - - - - Ui_OpenSongExportDialog - - - Select OpenSong song folder: - - - - - Ui_MainWindow - - - Toggle Media Manager - - - - - SongUsagePlugin - - - &Song Usage - - - - - GeneralTab - - - Monitors - - - - + + EditCustomForm - - You need to enter a slide - - - - - ThemeManager - - - You have not selected a theme. - - - - - Ui_EditVerseDialog - - - Verse Type - - - - - ImportWizardForm - - - You need to specify a file to import your Bible from. - - - - - Ui_EditSongDialog - - - Comments - - - - - AlertsTab - - - Bottom - - - - - Ui_MainWindow - - - Create a new Service - - - - - AlertsTab - - - Top - - - - - ServiceManager - - - &Preview Verse - - - - - Ui_PluginViewDialog - - - TextLabel - - - - - AlertsTab - - - Font Size: - - - - - Ui_PluginViewDialog - - - About: - + + You have unsaved data + - - Inactive - - - - - Ui_OpenSongExportDialog - - - Ready to export - + + You need to enter a title + - - Export - - - - - Ui_PluginViewDialog - - - Plugin List - - - - - Ui_AmendThemeDialog - - - Transition Active: - - - - - Ui_BibleImportWizard - - - Proxy Server (Optional) - - - - - Ui_EditSongDialog - - - &Manage Authors, Topics, Books - - - - - Ui_OpenLPExportDialog - - - Ready to export - - - - - ImageMediaItem - - - Images (*.jpg *.jpeg *.gif *.png *.bmp);; All files (*) - - - - - EditCustomForm - - - Save && Preview - - - - - Ui_OpenLPExportDialog - - - Select All - - - - - Ui_SongUsageDetailDialog - - - to - - - - - Ui_AmendThemeDialog - - - Size: - - - - - MainWindow - - - OpenLP Main Display Blanked - - - - - Ui_OpenLPImportDialog - - - Remove Selected - - - - - ServiceManager - - - Move &up - - - - - ImportWizardForm - - - You need to specify an OpenSong Bible file to import. - - - - - PresentationMediaItem - - - Select Presentation(s) - + + Error + - - File exists - - - - - Ui_OpenSongImportDialog - - - Ready to import - - - - - SlideController - - - Stop continuous loop - + + You need to enter a slide + - - s - + + Save && Preview + - - - ImagePlugin + + + EditSongDialog - - <b>Image Plugin</b><br>Allows images of all types to be displayed. If a number of images are selected together and presented on the live controller it is possible to turn them into a timed loop.<br<br>From the plugin if the <i>Override background</i> is chosen and an image is selected any songs which are rendered will use the selected image from the background instead of the one provied by the theme.<br> - + + Song Editor + - - - SongMediaItem - - Song Maintenance - + + Title && Lyrics + - - - Ui_customEditDialog - - Edit - + + Title: + - - - Ui_AmendThemeDialog - - Gradient : - + + Alternative Title: + - - - ImportWizardForm - - Invalid Verse File - + + Lyrics: + - - + + + Verse Order: + + + + + Add + + + + + Edit + + + + + Edit All + + + + + Delete + + + + + Authors, Topics && Book + + + + + Authors + + + + + &Add to Song + + + + + &Remove + + + + + &Manage Authors, Topics, Books + + + + + Topic + + + + + A&dd to Song + + + + + R&emove + + + + + Song Book + + + + + Theme, Copyright Info && Comments + + + + + Theme + + + + + Add a Theme + + + + + Copyright Information + + + + + © + + + + + CCLI Number: + + + + + Comments + + + + EditSongForm - - Error - - - - - Ui_customEditDialog - - - Add New - - - - - Ui_AuthorsDialog - - - Display name: - - - - - SongMaintenanceForm - - - Are you sure you want to delete the selected topic? - - - - - Ui_AmendThemeDialog - - - Bold/Italics - - - - - Ui_SongMaintenanceDialog - - - Song Maintenance - - - - - Ui_BibleImportWizard - - - Welcome to the Bible Import Wizard - - - - - SongsTab - - - Songs - - - - - Ui_BibleImportWizard - - - Password: - - - - - Ui_MainWindow - - - &Theme Manager - - - - - MediaManagerItem - - - Preview the selected item - - - - - Ui_BibleImportWizard - - - Version Name: - - - - - Ui_AboutDialog - - - About - - - - - MediaMediaItem - - - Select Media - - - - - Ui_AmendThemeDialog - - - Horizontal Align: - - - - - ServiceManager - - - &Edit Item - - - - - Ui_AmendThemeDialog - - - Background Type: - - - - - Ui_MainWindow - - - &Save - + + You need to enter a song title. + - - OpenLP 2.0 - - - - - ThemeManager - - - A theme with this name already exists, would you like to overwrite it? - + + Invalid verse entry - values must be Numeric, I,B,C,T,P,E,O + - - Export a theme - - - - - AmendThemeForm - - - Open file - - - - - Ui_TopicsDialog - - - Topic Maintenance - - - - - Ui_customEditDialog - - - Clear edit area - - - - - Ui_AmendThemeDialog - - - Show Outline: - + + You need to enter some verses. + - - Gradient - + + Invalid verse entry - vX + - - - SongBookForm - - You need to type in a book name! - + + Save && Preview + - - - ImportWizardForm - - Open OpenSong Bible - + + Error + - - - Ui_MainWindow - - Look && &Feel - + + bcitped + - - - Ui_BibleImportWizard - - Ready. - + + v + - - - Ui_SongMaintenanceDialog + + + EditVerseDialog - - Books/Hymnals - + + Edit Verse + - - - Ui_AboutDialog - - Contribute - + + Verse Type + - - - ServiceManager - - Move to &bottom - + + Intro + - - - Ui_BibleImportWizard - - Books Location: - + + Verse + - - - Ui_OpenSongExportDialog - - Full Song List - + + Pre-Chorus + - - + + + Chorus + + + + + Bridge + + + + + Ending + + + + + Other + + + + + Number + + + + + EditVerseForm + + + Intro + + + + + Ending + + + + + Other + + + + + Pre-Chorus + + + + + Bridge + + + + + Chorus + + + + + Verse + + + + GeneralTab - - SongSelect Password: - + + CCLI Details + - + + + primary + + + + + Application Startup + + + + + Select monitor for output display: + + + + + Application Settings + + + + + SongSelect Username: + + + + + CCLI Number: + + + + + Automatically open the last service + + + + + Preview Next Song from Service Manager + + + + + Show blank screen warning + + + + + Prompt to save Service before starting New + + + + + General + + + + + Show the splash screen + + + + + Screen + + + + + Monitors + + + + + SongSelect Password: + + + + + ImageMediaItem + + + Select Image(s) + + + + + Image(s) + + + + + Image + + + + + Images (*.jpg *.jpeg *.gif *.png *.bmp);; All files (*) + + + + + Replace Live Background + + + + + No item selected + + + + + You must select one item + + + + + ImagePlugin + + + <b>Image Plugin</b><br>Allows images of all types to be displayed. If a number of images are selected together and presented on the live controller it is possible to turn them into a timed loop.<br<br>From the plugin if the <i>Override background</i> is chosen and an image is selected any songs which are rendered will use the selected image from the background instead of the one provied by the theme.<br> + + + + + ImageTab + + + sec + + + + + Image Settings + + + + + Slide Loop Delay: + + + + + Images + + + + + ImportWizardForm + + + You need to specify a file with books of the Bible to use in the import. + + + + + Invalid Bible Location + + + + + You need to set a copyright for your Bible! Bibles in the Public Domain need to be marked as such. + + + + + Bible Exists + + + + + Empty Copyright + + + + + Empty Version Name + + + + + Invalid OpenSong Bible + + + + + Your Bible import failed. + + + + + Finished import. + + + + + You need to specify a file of Bible verses to import. + + + + + You need to specify a version name for your Bible. + + + + + This Bible already exists! Please import a different Bible or first delete the existing one. + + + + + Starting import... + + + + + Invalid Books File + + + + + You need to specify a file to import your Bible from. + + + + + You need to specify an OpenSong Bible file to import. + + + + + Invalid Verse File + + + + + Open OpenSong Bible + + + + + Open OSIS File + + + + + Open Books CSV File + + + + + Open Verses CSV File + + + + + MainWindow + + + The Main Display has been blanked out + + + + + OpenLP Version Updated + + + + + Save Changes to Service? + + + + + Your service has changed, do you want to save those changes? + + + + + OpenLP Main Display Blanked + + + + + openlp.org 2.0 + + + + + &File + + + + + &Import + + + + + &Song + + + + + &Export + + + + + &Options + + + + + &View + + + + + M&ode + + + + + &Language + + + + + &Tools + + + + + &Help + + + + + Media Manager + + + + + Songs + + + + + Add a new song + + + + + New Song + + + + + Edit the current song + + + + + Edit Song + + + + + Delete the currently selected song(s) + + + + + Delete Song + + + + + Preview the selected song + + + + + Send to Preview + + + + + Send the selected song to live + + + + + Send to Live + + + + + Add the currently selected song(s) to the service + + + + + Add to Service + + + + + Bible Verses + + + + + Preview selected verse(s) + + + + + Send selected verse(s) to live + + + + + Add selected verse(s) to service + + + + + Version: + + + + + Reference: + + + + + Search + + + + + Custom Slides + + + + + Add a new custom slide + + + + + New Custom Slide + + + + + Edit selected slide + + + + + Edit Custom Slide + + + + + Delete selected slide(s) + + + + + Delete Custom Slide + + + + + Preview selected slide + + + + + Preview Custom Slide + + + + + Send selected slide to live + + + + + Send Live + + + + + Add selected slide(s) to service + + + + + Add To Service + + + + + Presentations + + + + + Load a presentation + + + + + Load Video + + + + + Remove selected presentation(s) + + + + + RI + + + + + Send selected presentation to live + + + + + Add selected presentation(s) to service + + + + + Videos + + + + + Load a video + + + + + Delete the selected video(s) + + + + + Send the selected video to live + + + + + Add selected video(s) to service + + + + + Images + + + + + Load image(s) + + + + + Load Image + + + + + Remove selected image(s) + + + + + Delete Image + + + + + Send selected image to live + + + + + Add selected image(s) to service + + + + + Service Manager + + + + + Move selected item(s) to the top + + + + + Move To Top + + + + + Move selected item(s) up one position + + + + + Move Up + + + + + Move selected item(s) down one position + + + + + Move Down + + + + + Move selected item(s) to the bottom + + + + + Move To Bottom + + + + + Create new service + + + + + New Service + + + + + Open an existing service + + + + + Open Service + + + + + Save current service + + + + + Save Service + + + + + Theme Manager + + + + + Create a new theme + + + + + New Theme + + + + + Edit selected theme + + + + + Edit Theme + + + + + Delete selected theme(s) + + + + + Delete Theme + + + + + Import theme(s) + + + + + Import Theme + + + + + Export selected theme(s) + + + + + Export Theme + + + + + &New + + + + + Create a new Service + + + + + Ctrl+N + + + + + &Open + + + + + Ctrl+O + + + + + &Save + + + + + Save the current service to disk + + + + + Ctrl+S + + + + + Save &As... + + + + + Save Service As + + + + + Save the current service under a new name + + + + + F12 + + + + + E&xit + + + + + Quit OpenLP 2.0 + + + + + Alt+F4 + + + + + &Bible + + + + + &Theme + + + + + Look && &Feel + + + + + &Settings + + + + + &Media Manager + + + + + Toggle Media Manager + + + + + Toggle the visibility of the Media Manager + + + + + F8 + + + + + &Theme Manager + + + + + Toggle Theme Manager + + + + + Toggle the visibility of the Theme Manager + + + + + F10 + + + + + &Service Manager + + + + + Toggle Service Manager + + + + + Toggle the visibility of the Service Manager + + + + + F9 + + + + + &Alert + + + + + Show an alert message + + + + + F7 + + + + + &User Guide + + + + + &About + + + + + More information about OpenLP + + + + + Ctrl+F1 + + + + + &Online Help + + + + + &Web Site + + + + + OpenSong + + + + + openlp.org 1.0 + + + + + Export songs in openlp.org 1.0 format + + + + + OpenLP 2.0 + + + + + Export songs in OpenLP 2.0 format + + + + + &Translate + + + + + Translate the interface to your language + + + + + English + + + + + Set the interface language to English + + + + + &Add Tool... + + + + + Add an application to the list of tools + + + + + &Preview Pane + + + + + &Live + + + + + Version %s of OpenLP is now available for download (you are currently running version %s). +You can download the latest version from http://openlp.org + + + + + MediaManagerItem + + + &Preview + + + + + You must select one or more items + + + + + Load a new + + + + + Delete the selected item + + + + + &Edit + + + + + &Add to Service + + + + + Send the selected item live + + + + + Add the selected item(s) to the service + + + + + Edit the selected + + + + + Add a new + + + + + &Show Live + + + + + Preview the selected item + + + + + Import a + + + + + &Delete + + + + + &Add to selected Service Item + + + + + No Items Selected + + + + + You must select one or more items. + + + + + No items selected + + + + + No Service Item Selected + + + + + You must select a existing service item to add to. + + + + + Invalid Service Item + + + + + MediaMediaItem + + + Media + + + + + Select Media + + + + + Videos (%s);;Audio (%s);;All files (*) + + + + + MediaPlugin + + + <b>Media Plugin</b><br>This plugin allows the playing of audio and video media + + + + + OpenLPExportDialog + + + openlp.org Song Exporter + + + + + Select openlp.org export filename: + + + + + Full Song List + + + + + Song Title + + + + + Author + + + + + Select All + + + + + Lyrics + + + + + Title + + + + + Song Export List + + + + + Remove Selected + + + + + Progress: + + + + + Ready to export + + + + + Export + + + + + Close + + + + + OpenLPImportDialog + + + openlp.org Song Importer + + + + + Select openlp.org songfile to import: + + + + + Import File Song List + + + + + Song Title + + + + + Author + + + + + Select All + + + + + Lyrics + + + + + Title + + + + + Song Import List + + + + + Remove Selected + + + + + Progress: + + + + + Ready to import + + + + + Import + + + + + Close + + + + + OpenSongBible + + + Importing + + + + + OpenSongExportDialog + + + OpenSong Song Exporter + + + + + Select OpenSong song folder: + + + + + Full Song List + + + + + Song Title + + + + + Author + + + + + Select All + + + + + Lyrics + + + + + Title + + + + + Song Export List + + + + + Remove Selected + + + + + Progress: + + + + + Ready to export + + + + + Export + + + + + Close + + + + + OpenSongImportDialog + + + OpenSong Song Importer + + + + + OpenSong Folder: + + + + + Progress: + + + + + Ready to import + + + + + Import + + + + + Close + + + + + PluginViewDialog + + + Plugin list + + + + + Plugin Details + + + + + Version: + + + + + TextLabel + + + + + About: + + + + + Status: + + + + + Disabled + + + + + Inactive + + + + + Active + + + + + PresentationMediaItem + + + Presentation + + + + + Present using: + + + + + Automatic + + + + + A presentation with that filename already exists. + + + + + Select Presentation(s) + + + + + File exists + + + + + Presentations (%s) + + + + + PresentationPlugin + + + <b>Presentation Plugin</b> <br> Delivers the ability to show presentations using a number of different programs. The choice of available presentation programs is available to the user in a drop down box. + + + + + PresentationTab + + + Available Controllers + + + + + available + + + + + Presentations + + + + + RemoteTab + + + Remotes + + + + + Remotes Receiver Port + + + + + RemotesPlugin + + + <b>Remote Plugin</b><br>This plugin provides the ability to send messages to a running version of openlp on a different computer.<br>The Primary use for this would be to send alerts from a creche + + + + + ServiceItemEditDialog + + + Service Item Maintenance + + + + + Up + + + + + Delete + + + + + Down + + + + + ServiceManager + + + Save Changes to Service? + + + + + Open Service + + + + + Move to top + + + + + Create a new service + + + + + Save this service + + + + + Theme: + + + + + Delete From Service + + + + + Save Service + + + + + &Live Verse + + + + + Move to &top + + + + + New Service + + + + + &Notes + + + + + Move to end + + + + + Your service is unsaved, do you want to save those changes before creating a new one ? + + + + + &Delete From Service + + + + + Move up order + + + + + Move down order + + + + + Move &down + + + + + Load an existing service + + + + + &Preview Verse + + + + + Move &up + + + + + &Edit Item + + + + + Move to &bottom + + + + + &Maintain Item + + + + + ServiceNoteEdit + + + Service Item Notes + + + + + SettingsDialog + + + Settings + + + + + General + + + + + Monitors + + + + + Select monitor for output display: + + + + + Monitor 1 on X11 Windowing System + + + + + Monitor 2 on X11 Windowing System + + + + + Blank Screen + + + + + Show warning on startup + + + + + Auto Open Last Service + + + + + Automatically open the last service at startup + + + + + CCLI Details + + + + + CCLI Number: + + + + + SongSelect Username: + + + + + SongSelect Password: + + + + + Themes + + + + + Global theme + + + + + African Sunset + + + + + Snowy Mountains + + + + + Wilderness + + + + + Theme level + + + + + Song level + + + + + Use the theme from each song in the database. If a song doesn't have a theme associated with it, then use the service's theme. If the service doesn't have a theme, then use the global theme. + + + + + Service level + + + + + Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. + + + + + Global level + + + + + Use the global theme, overriding any themes associated with either the service or the songs. + + + + + Alerts + + + + + Font + + + + + Font Name: + + + + + Font Color: + + + + + Background Color: + + + + + Display length: + + + + + s + + + + + Preview + + + + + SlideController + + + Move to previous + + + + + Go to Verse + + + + + Start continuous loop + + + + + Live + + + + + Start playing media + + + + + Move to live + + + + + Preview + + + + + Move to last + + + + + Edit and re-preview Song + + + + + Delay between slides in seconds + + + + + Move to next + + + + + Move to first + + + + + Blank Screen + + + + + Verse + + + + + Stop continuous loop + + + + + s + + + + + Theme Screen + + + + + Hide Screen + + + + + SongBookDialog + + + Book Song Maintenance + + + + + Name: + + + + + Publisher: + + + + + SongBookForm + + + Error + + + + + You need to type in a book name! + + + + + SongExportDialog + + + Dialog + + + + + Available Songs + + + + + Select All + + + + + Select Songs + + + + + Deselect Songs + + + + + Selected Songs + + + + + OpenLyric Format + + + + + Text File + + + + + SongMaintenanceDialog + + + Song Maintenance + + + + + New Row + + + + + Types + + + + + +Authors + + + + + +Topics + + + + + +Books/Hymnals + + + + + Add + + + + + Edit + + + + + Delete + + + + + SongMaintenanceForm + + + Are you sure you want to delete the selected book? + + + + + Couldn't save your author. + + + + + This author can't be deleted, they are currently assigned to at least one song. + + + + + Couldn't add your book. + + + + + Error + + + + + No author selected! + + + + + Couldn't add your topic. + + + + + This book can't be deleted, it is currently assigned to at least one song. + + + + + Delete Book + + + + + No book selected! + + + + + Are you sure you want to delete the selected author? + + + + + Couldn't add your author. + + + + + Couldn't save your topic. + + + + + Couldn't save your book. + + + + + Delete Topic + + + + + Delete Author + + + + + No topic selected! + + + + + This topic can't be deleted, it is currently assigned to at least one song. + + + + + Are you sure you want to delete the selected topic? + + + + + SongMediaItem + + + CCLI Licence: + + + + + Song + + + + + Maintain the lists of authors, topics and books + + + + + Lyrics + + + + + Type: + + + + + Titles + + + + + Clear + + + + + Search + + + + + Authors + + + + + Search: + + + + + Song Maintenance + + + + + %s (%s) + + + + + SongUsageDeleteForm + + + Delete Selected Song Usage Events? + + + + + Are you sure you want to delete selected Song Usage data? + + + + + SongUsageDetailForm + + + Output File Location + + + + + SongUsagePlugin + + + <b>SongUsage Plugin</b><br>This plugin records the use of songs and when they have been used during a live service + + + + + SongsPlugin + + + <b>Song Plugin</b> <br>This plugin allows Songs to be managed and displayed.<br> + + + + + SongsTab + + + Display Verses on Live Tool bar: + + + + + Enable search as you type: + + + + + Songs Mode + + + + + Songs + + + + + SplashScreen + + + Splash Screen + + + + + ThemeManager + + + Import Theme + + + + + Create a new theme + + + + + Delete Theme + + + + + Error + + + + + Make Global + + + + + Delete a theme + + + + + File is not a valid theme. + + + + + Edit a theme + + + + + Edit Theme + + + + + Export Theme + + + + + You are unable to delete the default theme. + + + + + Theme Exists + + + + + Delete theme + + + + + Save Theme - (%s) + + + + + default + + + + + Select Theme Import File + + + + + New Theme + + + + + Import a theme + + + + + Export theme + + + + + You have not selected a theme. + + + + + A theme with this name already exists, would you like to overwrite it? + + + + + Export a theme + + + + + Theme %s is use in %s plugin + + + + + Theme %s is use by Service Manager + + + + + ThemeWizard + + + Theme Wizard + + + + + Welcome + + + + + Welcome to the Theme Wizard. This wizard will guide you through the process of creating a new theme. + + + + + Theme Name + + + + + Choose a name for your theme + + + + + Theme Name: + + + + + Select Background + + + + + Select a background type and configure your background + + + + + ThemesTab + + + Theme level + + + + + Global theme + + + + + Use the global theme, overriding any themes associated with either the service or the songs. + + + + + Use the theme from each song in the database. If a song doesn't have a theme associated with it, then use the service's theme. If the service doesn't have a theme, then use the global theme. + + + + + Service level + + + + + Global level + + + + + Song level + + + + + Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. + + + + + Themes + + + + + TopicsDialog + + + Topic Maintenance + + + + + Topic Name: + + + + + TopicsForm + + + You need to type in a topic name! + + + + + Error + + + + + Ui_AboutDialog + + + Close + + + + + License + + + + + Credits + + + + + About OpenLP + + + + + About + + + + + Contribute + + + + + OpenLP <version><revision> - Open Source Lyrics Projection + +OpenLP is free church presentation software, or lyrics projection software, used to display slides of songs, Bible verses, videos, images, and even presentations (if OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. + +Find out more about OpenLP: http://openlp.org/ + +OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. + + + + + Project Lead + Raoul "superfly" Snyman + +Developers + Tim "TRB143" Bentley + Jonathan "gushie" Corwin + Michael "cocooncrash" Gorven + Scott "sguerrieri" Guerrieri + Raoul "superfly" Snyman + Martin "mijiti" Thompson + Jon "Meths" Tibble + +Contributors + Meinert "m2j" Jordan + Christian "crichter" Richter + Maikel Stuivenberg + Carsten "catini" Tingaard + +Testers + Philip "Phill" Ridout + Wesley "wrst" Stout (lead) + +Packagers + Thomas "tabthorpe" Abthorpe (FreeBSD) + Tim "TRB143" Bentley (Fedora) + Michael "cocooncrash" Gorven (Ubuntu) + Matthias "matthub" Hub (Mac OS X) + Raoul "superfly" Snyman (Windows) + + + + + + Copyright + + + + + Ui_AlertDialog + + + Display + + + + + Alert Message + + + + + Alert Text: + + + + + Cancel + + + + + Ui_AlertEditDialog + + + Ui_AmendThemeDialog + + + Shadow Size: + + + + + Slide Transition + + + + + Bottom + + + + + Image + + + + + Height: + + + + + Outline + + + + + Main Font + + + + + Solid Color + + + + + Font Main + + + + + Use Default Location: + + + + + Other Options + + + + + Shadow + + + + + Italics + + + + + Background: + + + + + X Position: + + + + + Center + + + + + <Color2> + + + + + Opaque + + + + + Outline Color: + + + + + Alignment + + + + + Normal + + + + + Bold + + + + + Footer Font + + + + + Theme Maintenance + + + + + <Color1> + + + + + Font Footer + + + + + Font Weight: + + + + + Transparent + + + + + Background + + + + + Vertical + + + + + Width: + + + + + Middle + + + + + Shadow Color: + + + + + Vertical Align: + + + + + Top + + + + + Right + + + + + Font Color: + + + + + Horizontal + + + + + Circular + + + + + pt + + + + + px + + + + + Display Location + + + + + Y Position: + + + + + Show Shadow: + + + + + Font: + + + + + Preview + + + + + Outline Size: + + + + + Wrap Indentation + + + + + Left + + + + + Theme Name: + + + + + Image: + + + + + Transition Active: + + + + + Size: + + + + + Gradient : + + + + + Bold/Italics + + + + + Horizontal Align: + + + + + Background Type: + + + + + Show Outline: + + + + + Gradient + + + + + Ui_AuthorsDialog + + + Last name: + + + + + First name: + + + + + Author Maintenance + + + + + Display name: + + + + + Ui_BibleImportWizard + + + Bible Import Wizard + + + + + Bible: + + + + + Crosswalk + + + + + CSV + + + + + OpenSong + + + + + File Location: + + + + + 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. + + + + + Copyright: + + + + + Verse Location: + + + + + Server: + + + + + Permission: + + + + + Select Import Source + + + + + Set up the Bible's license details. + + + + + BibleGateway + + + + + Username: + + + + + Download Options + + + + + Location: + + + + + Bible Filename: + + + + + Format: + + + + + Importing + + + + + License Details + + + + + OSIS + + + + + Web Download + + + + + Please wait while your Bible is imported. + + + + + Select the import format, and where to import from. + + + + + Proxy Server (Optional) + + + + + Welcome to the Bible Import Wizard + + + + + Password: + + + + + Version Name: + + + + + Ready. + + + + + Books Location: + + + + + Ui_EditSongDialog + + + &Remove + + + + + Alternative Title: + + + + + Add a Theme + + + + + R&emove + + + + + Verse Order: + + + + + Title && Lyrics + + + + + Theme + + + + + Authors, Topics && Book + + + + + Copyright Information + + + + + Topic + + + + + Lyrics: + + + + + Edit + + + + + Authors + + + + + Song Editor + + + + + Delete + + + + + &Add to Song + + + + + CCLI Number: + + + + + Add + + + + + Theme, Copyright Info && Comments + + + + + Song Book + + + + + Edit All + + + + + A&dd to Song + + + + + Title: + + + + + Comments + + + + + &Manage Authors, Topics, Books + + + + + Ui_EditVerseDialog + + + Verse + + + + + Ending + + + + + Number + + + + + Other + + + + + Bridge + + + + + Pre-Chorus + + + + + Edit Verse + + + + + Intro + + + + + Chorus + + + + + Verse Type + + + + + Ui_MainWindow + + + Open an existing service + + + + + &File + + + + + List the Plugins + + + + + &Service Manager + + + + + Open Service + + + + + Media Manager + + + + + Alt+F4 + + + + + Toggle the visibility of the Preview Panel + + + + + &User Guide + + + + + Set the interface language to English + + + + + &Import + + + + + Quit OpenLP + + + + + &Preview Panel + + + + + &New + + + + + Default Theme: + + + + + Toggle Preview Panel + + + + + &Settings + + + + + &Live + + + + + English + + + + + F9 + + + + + F8 + + + + + Save the current service to disk + + + + + Add &Tool... + + + + + &View + + + + + &Export + + + + + &Open + + + + + Toggle Theme Manager + + + + + &Options + + + + + Ctrl+S + + + + + Ctrl+O + + + + + Ctrl+N + + + + + E&xit + + + + + &Help + + + + + Toggle Service Manager + + + + + Ctrl+F1 + + + + + Save the current service under a new name + + + + + &Web Site + + + + + M&ode + + + + + Translate the interface to your language + + + + + Service Manager + + + + + &Theme + + + + + &Language + + + + + &About + + + + + &Plugin List + + + + + &Translate + + + + + New Service + + + + + &Online Help + + + + + Save Service + + + + + Save &As... + + + + + Toggle the visibility of the Media Manager + + + + + F11 + + + + + F10 + + + + + F12 + + + + + Alt+F7 + + + + + Add an application to the list of tools + + + + + Theme Manager + + + + + Toggle the visibility of the Theme Manager + + + + + &Preview Pane + + + + + Save Service As + + + + + Toggle the visibility of the Service Manager + + + + + More information about OpenLP + + + + + &Media Manager + + + + + &Tools + + + + + Toggle Media Manager + + + + + Create a new Service + + + + + &Theme Manager + + + + + &Save + + + + + OpenLP 2.0 + + + + + Look && &Feel + + + + + Ui_OpenLPExportDialog + + + Song Title + + + + + Title + + + + + Select openlp.org export filename: + + + + + Close + + + + + Export + + + + + Lyrics + + + + + Full Song List + + + + + Progress: + + + + + Remove Selected + + + + + Author + + + + + openlp.org Song Exporter + + + + + Song Export List + + + + + Ready to export + + + + + Select All + + + + + Ui_OpenLPImportDialog + + + Author + + + + + Ready to import + + + + + Progress: + + + + + openlp.org Song Importer + + + + + Song Import List + + + + + Import File Song List + + + + + Close + + + + + Select openlp.org songfile to import: + + + + + Lyrics + + + + + Import + + + + + Song Title + + + + + Select All + + + + + Title + + + + + Remove Selected + + + + + Ui_OpenSongExportDialog + + + Close + + + + + Lyrics + + + + + Song Title + + + + + Select All + + + + + Song Export List + + + + + Author + + + + + Title + + + + + OpenSong Song Exporter + + + + + Remove Selected + + + + + Progress: + + + + + Select OpenSong song folder: + + + + + Ready to export + + + + + Export + + + + + Full Song List + + + + + Ui_OpenSongImportDialog + + + OpenSong Folder: + + + + + Import + + + + + Close + + + + + Progress: + + + + + OpenSong Song Importer + + + + + Ready to import + + + + + Ui_PluginViewDialog + + + Plugin Details + + + + + Active + + + + + Status: + + + + + Version: + + + + + TextLabel + + + + + About: + + + + + Inactive + + + + + Plugin List + + + + + Ui_ServiceItemEditDialog + + + Service Item Maintenance + + + + + Up + + + + + Delete + + + + + Down + + + + + Ui_ServiceNoteEdit + + + Service Item Notes + + + + + Ui_SettingsDialog + + + Settings + + + + + Ui_SongBookDialog + + + Name: + + + + + Edit Book + + + + + Publisher: + + + + + Ui_SongMaintenanceDialog + + + Edit + + + + + Topics + + + + + Add + + + + + Authors + + + + + Delete + + + + + Song Maintenance + + + + + Books/Hymnals + + + + + Ui_SongUsageDeleteDialog + + + Song Usage Delete + + + + + Ui_SongUsageDetailDialog + + + Report Location + + + + + Song Usage Extraction + + + + + Select Date Range + + + + + to + + + + + Ui_TopicsDialog + + + Topic name: + + + + + Topic Maintenance + + + + + Ui_customEditDialog + + + Delete selected slide + + + + + Edit selected slide + + + + + Edit All + + + + + Add new slide at bottom + + + + + Clear + + + + + Delete + + + + + Theme: + + + + + Move slide Up 1 + + + + + Title: + + + + + Credits: + + + + + Edit Custom Slides + + + + + Edit all slides + + + + + Save + + + + + Replace edited slide + + + + + Move slide down 1 + + + + + Set Theme for Slides + + + + + Edit + + + + + Add New + + + + + Clear edit area + + + + + Wizard + + + Bible Import Wizard + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body > +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Welcome to the Bible Import Wizard</span></p></body></html> + + + + + 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. + + + + + Select Import Source + + + + + Select the import format, and where to import from. + + + + + Format: + + + + + OSIS + + + + + CSV + + + + + OpenSong + + + + + Web Download + + + + + Bible Name: + + + + + File Location: + + + + + Books Location: + + + + + Verse Location: + + + + + Bible Filename: + + + + + Download Options + + + + + Location: + + + + + Crosswalk + + + + + Bible: + + + + + English Standard Version + + + + + King James Version + + + + + New International Version + + + + + Proxy Server (Optional) + + + + + Server: + + + + + Username: + + + + + Password: + + + + + License Details + + + + + Set up the Bible's license details. + + + + + Version Name: + + + + + Copyright: + + + + + Permission: + + + + + Importing + + + + + Please wait while your Bible is imported. + + + + + Ready. + + + + + %p + + + + + alertsPlugin + + + Show an alert message + + + + + <b>Alerts Plugin</b><br>This plugin controls the displaying of alerts on the presentations screen + + + + + &Alert + + + + + customEditDialog + + + Edit Custom Slides + + + + + Title: + + + + + Add New + + + + + Edit + + + + + Edit All + + + + + Save + + + + + Delete + + + + + Clear + + + + + Theme: + + + + + Credits: + + + + + export_menu + + + &Bible + + + + + &Song + + + + + OpenSong + + + + + openlp.org 1.0 + + + + + OpenLP 2.0 + + + + + import_menu + + + &Bible + + + + + &Song + + + + + OpenSong + + + + + openlp.org 1.0 + + + + + Export songs in openlp.org 1.0 format + + + + + OpenLP 2.0 + + + + + Export songs in OpenLP 2.0 format + + + + + self.splash_screen + + + Starting + + + + + Splash Screen + + + + + tools_menu + + + &Song Usage + + + + + &Delete recorded data + + + + + Delete song usage to specified date + + + + + &Extract recorded data + + + + + Generate report on Song Usage + + + + + Song Usage Status + + + + + Start/Stop live song usage recording + + + diff --git a/scripts/generate_pro.py b/scripts/generate_pro.py new file mode 100755 index 000000000..6d0a371d4 --- /dev/null +++ b/scripts/generate_pro.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # +# Thompson, Jon Tibble, Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See 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 # +############################################################################### +# Short description +# Steps for creating languages: +# 1. create an empty ts file for the wished translation in ./resources/i18n folder +# 2. go to scripts folder and start: +# python generate_pro.py +# 3. go to main folder and start: +# pylupdate4 openlp.pro +# 4. do all the translation stuff at the related *.ts files (install first qt3-dev-tools) +# 5. at main folder start: +# lrelease -verbose openlp.pro +############################################################################### + +import os + +ignore_pathes = ["./scripts", "./openlp/core/test"] +ignore_files = ["setup.py"] + +def write_file(filename, stringlist): + content = u'' + for line in stringlist: + content = u'%s%s\n' % (content, line) + file = open(filename, u'w') + file.write(content.encode('utf8')) + file.close() + +def main(): + stringlist = [] + start_dir = os.path.join(u'..') + for root, dirs, files in os.walk(start_dir): + for file in files: + path = "%s" % root + path = path.replace("\\","/") + path = path.replace("..",".") + + if file.startswith(u'hook-') or file.startswith(u'test_'): + continue + + cond = False + for search in ignore_pathes: + if path.startswith(search): + cond = True + if cond == True: + continue + cond = False + for search in ignore_files: + if search == file: + cond = True + if cond == True: + continue + + if file.endswith(u'.ui'): + line = "%s/%s" % (path, file) + print u'Parsing "%s"' % line + stringlist.append("FORMS += %s" % line) + elif file.endswith(u'.py'): + line = "%s/%s" % (path, file) + print u'Parsing "%s"' % line + stringlist.append("SOURCES += %s" % line) + elif file.endswith(u'.pyw'): + line = "%s/%s" % (path, file) + print u'Parsing "%s"' % line + stringlist.append("SOURCES += %s" % line) + elif file.endswith(u'.ts'): + line = "%s/%s" % (path, file) + print u'Parsing "%s"' % line + stringlist.append("TRANSLATIONS += %s" % line) + + print u'Generating PRO file...', + stringlist.sort() + write_file(os.path.join(start_dir, u'openlp.pro'), stringlist) + print u'done.' + +if __name__ == u'__main__': + if os.path.split(os.path.abspath(u'.'))[1] != u'scripts': + print u'You need to run this script from the scripts directory.' + else: + main() From 3eadf1c7d5ab1c7c4ead0e01bf9a5670ae3f1e0c Mon Sep 17 00:00:00 2001 From: rimach Date: Fri, 2 Apr 2010 00:03:29 +0200 Subject: [PATCH 03/81] Head --- resources/i18n/openlp_en.ts | 5626 ++++++++++------------------------- scripts/generate_pro.py | 10 +- 2 files changed, 1549 insertions(+), 4087 deletions(-) diff --git a/resources/i18n/openlp_en.ts b/resources/i18n/openlp_en.ts index b92f28c37..425c8cbb6 100644 --- a/resources/i18n/openlp_en.ts +++ b/resources/i18n/openlp_en.ts @@ -1,207 +1,5 @@ - - AboutDialog - - - About OpenLP - - - - - About - - - - - OpenLP <version> - Open Source Lyrics Projection - -OpenLP is free church presentation software, or lyrics projection software, used to display slides of songs, Bible verses, videos, images, and even presentations (if OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. - -Find out more about OpenLP: http://openlp.org/ - -OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - - - - - Credits - - - - - Project Lead - Raoul "superfly" Snyman - -Developers - Tim "TRB143" Bentley - Jonathan "gushie" Corwin - Scott "sguerrieri" Guerrieri - Raoul "superfly" Snyman - Maikel Stuivenberg - Martin "mijiti" Thompson - Carsten "catini" Tingaard - -Testers - Wesley "wrst" Stout - - - - - License - - - - - Copyright © 2004-2009 Raoul Snyman -Portions copyright © 2004-2009 Tim Bentley, Jonathan Corwin, Scott Guerrieri, Maikel Stuivenberg, Martin Thompson, Carsten Tinggaard, Jon Tibble - -This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See below for more details. - - -GNU GENERAL PUBLIC LICENSE -Version 2, June 1991 - -Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble - -The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. - -To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. - -For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. - -We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. - -Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. - -Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. - -The precise terms and conditions for copying, distribution and modification follow. - -GNU GENERAL PUBLIC LICENSE -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. - -1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. - -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - -a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. - -b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. - -c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - -3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: - -a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, - -b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, - -c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - -If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - -4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - -5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. - -6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - -7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - -8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - -9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - -10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - -NO WARRANTY - -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - -<one line to give the program's name and a brief idea of what it does.> -Copyright (C) <year> <name of author> - -This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this when it starts in an interactive mode: - -Gnomovision version 69, Copyright (C) year name of author -Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. -This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: - -Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. - -<signature of Ty Coon>, 1 April 1989 -Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. - - - - - Contribute - - - - - Close - - - - - &Contribute - - - AboutForm @@ -210,83 +8,11 @@ This General Public License does not permit incorporating your program into prop - - AlertEditDialog - - - Maintain Alerts - - - - - Save - - - - - Clear - - - - - Add - - - - - Edit - - - - - Delete - - - - - AlertEditForm - - - AlertForm - - - Alert Message - - - - - Alert Text: - - - - - Display - - - - - Cancel - - - - - AlertsManager - AlertsTab - - pt - - - - - Location: - - - - - Font Color: + + Alerts @@ -300,28 +26,8 @@ This General Public License does not permit incorporating your program into prop - - Preview - - - - - Alerts - - - - - Alert timeout: - - - - - openlp.org - - - - - Keep History: + + Font Color: @@ -329,14 +35,44 @@ This General Public License does not permit incorporating your program into prop Background Color: + + + Font Size: + + + + + pt + + + + + Alert timeout: + + s - - Bottom + + Location: + + + + + Keep History: + + + + + Preview + + + + + openlp.org @@ -345,8 +81,8 @@ This General Public License does not permit incorporating your program into prop - - Font Size: + + Bottom @@ -385,264 +121,11 @@ This General Public License does not permit incorporating your program into prop - - AmendThemeDialog - - - Theme Maintance - - - - - Theme Name: - - - - - Background - - - - - Background: - - - - - Opaque - - - - - Transparent - - - - - Background Type: - - - - - Solid Color - - - - - Gradient - - - - - Image - - - - - <Color1> - - - - - <Color2> - - - - - Image: - - - - - Gradient : - - - - - Horizontal - - - - - Vertical - - - - - Circular - - - - - Font Main - - - - - Main Font - - - - - Font: - - - - - Font Color: - - - - - Size: - - - - - pt - - - - - Wrap Indentation - - - - - TextLabel - - - - - Display Location - - - - - Use Default Location: - - - - - X Position: - - - - - Y Position: - - - - - Width: - - - - - Height: - - - - - px - - - - - Font Footer - - - - - Footer Font - - - - - Other Options - - - - - Shadow && Outline - - - - - Outline Color: - - - - - Show Outline: - - - - - Shadow Color: - - - - - Show Shadow: - - - - - Alignment - - - - - Horizontal Align: - - - - - Left - - - - - Right - - - - - Center - - - - - Vertical Align: - - - - - Top - - - - - Middle - - - - - Bottom - - - - - Preview - - - AmendThemeForm - - Slide Height is %s rows + + Background Color: @@ -656,321 +139,44 @@ This General Public License does not permit incorporating your program into prop - - Background Color: - - - - - AuditDeleteDialog - - - Audit Delete - - - - - AuditDetailDialog - - - Audit Detail Extraction - - - - - Select Date Range - - - - - to - - - - - Report Location - - - - - AuthorsDialog - - - Author Maintenance - - - - - Display Name: - - - - - First Name: - - - - - Exit Screen - - - - - Last Name: + + Slide Height is %s rows AuthorsForm - - - You need to type in the first name of the author. - - - - - You haven't set a display name for the author, would you like me to combine the first and last names for you? - - Error + + + You need to type in the first name of the author. + + You need to type in the last name of the author. - - - BibleImportDialog - - Bible Registration - - - - - Licence Details - - - - - Version Name: - - - - - Copyright: - - - - - Permission: - - - - - Import Progress - - - - - %p - - - - - Import - - - - - Cancel - - - - - Osis (Sword) Imports - - - - - OSIS Bible - - - - - Bible Name: - - - - - File Location: - - - - - CSV File Imports - - - - - CVS Bible - - - - - Books Location: - - - - - Verse Location: - - - - - Web Downloads - - - - - Download Options - - - - - Location: - - - - - Crosswalk - - - - - Bible: - - - - - NIV - - - - - KJV - - - - - Proxy Settings (Optional) - - - - - Proxy Address: - - - - - Username: - - - - - Password: + + You haven't set a display name for the author, would you like me to combine the first and last names for you? BibleMediaItem - - - Quick - - Bible - - Book: - - - - - Text Search - - - - - Find: - - - - - Search Type: - - - - - Bible not fully loaded - - - - - No matching book could be found in this Bible. - - - - - Dual: - - - - - Chapter: - - - - - Search - - - - - Keep - - - - - Results: - - - - - Verse Search - - - - - Version: - - - - - From: - - - - - No Book Found + + Quick @@ -978,19 +184,94 @@ This General Public License does not permit incorporating your program into prop Advanced + + + Version: + + + + + Dual: + + + + + Search Type: + + + + + Find: + + + + + Search + + + + + Results: + + + + + Book: + + + + + Chapter: + + + + + Verse: + + + + + From: + + To: + + + Verse Search + + + + + Text Search + + Clear - - Verse: + + Keep + + + + + No Book Found + + + + + No matching book could be found in this Bible. + + + + + Bible not fully loaded @@ -1005,28 +286,8 @@ This General Public License does not permit incorporating your program into prop BiblesTab - - ( and ) - - - - - verse per line - - - - - Display Style: - - - - - continuous - - - - - [ and ] + + Bibles @@ -1034,11 +295,6 @@ This General Public License does not permit incorporating your program into prop Verse Display - - - Display Dual Bible Verses - - Only show new chapter numbers @@ -1049,14 +305,39 @@ This General Public License does not permit incorporating your program into prop Layout Style: + + + Display Style: + + + + + Bible Theme: + + + + + verse per slide + + + + + verse per line + + + + + continuous + + No brackets - - Bibles + + ( and ) @@ -1064,6 +345,11 @@ This General Public License does not permit incorporating your program into prop { and } + + + [ and ] + + Note: @@ -1071,13 +357,8 @@ Changes don't affect verses already in the service - - verse per slide - - - - - Bible Theme: + + Display Dual Bible Verses @@ -1105,26 +386,21 @@ Changes don't affect verses already in the service - - Display Footer: + + Custom Display - - Custom Display + + Display Footer: EditCustomForm - - You have unsaved data - - - - - You need to enter a title + + Save && Preview @@ -1132,180 +408,37 @@ Changes don't affect verses already in the service Error + + + You need to enter a title + + You need to enter a slide - - Save && Preview - - - - - EditSongDialog - - - Song Editor - - - - - Title && Lyrics - - - - - Title: - - - - - Alternative Title: - - - - - Lyrics: - - - - - Verse Order: - - - - - Add - - - - - Edit - - - - - Edit All - - - - - Delete - - - - - Authors, Topics && Book - - - - - Authors - - - - - &Add to Song - - - - - &Remove - - - - - &Manage Authors, Topics, Books - - - - - Topic - - - - - A&dd to Song - - - - - R&emove - - - - - Song Book - - - - - Theme, Copyright Info && Comments - - - - - Theme - - - - - Add a Theme - - - - - Copyright Information - - - - - © - - - - - CCLI Number: - - - - - Comments + + You have unsaved data EditSongForm - - - You need to enter a song title. - - - - - Invalid verse entry - values must be Numeric, I,B,C,T,P,E,O - - - - - You need to enter some verses. - - - - - Invalid verse entry - vX - - Save && Preview - - Error + + You need to enter a song title. + + + + + You need to enter some verses. @@ -1318,57 +451,19 @@ Changes don't affect verses already in the service v - - - EditVerseDialog - - Edit Verse + + Invalid verse entry - vX - - Verse Type + + Invalid verse entry - values must be Numeric, I,B,C,T,P,E,O - - Intro - - - - - Verse - - - - - Pre-Chorus - - - - - Chorus - - - - - Bridge - - - - - Ending - - - - - Other - - - - - Number + + Error @@ -1412,104 +507,99 @@ Changes don't affect verses already in the service GeneralTab - - - CCLI Details - - - - - primary - - - - - Application Startup - - - - - Select monitor for output display: - - - - - Application Settings - - - - - SongSelect Username: - - - - - CCLI Number: - - - - - Automatically open the last service - - - - - Preview Next Song from Service Manager - - - - - Show blank screen warning - - - - - Prompt to save Service before starting New - - General - - - Show the splash screen - - - - - Screen - - Monitors + + + Select monitor for output display: + + + + + Application Startup + + + + + Show blank screen warning + + + + + Automatically open the last service + + + + + Show the splash screen + + + + + Application Settings + + + + + Prompt to save Service before starting New + + + + + Preview Next Song from Service Manager + + + + + CCLI Details + + + + + CCLI Number: + + + + + SongSelect Username: + + SongSelect Password: + + + Screen + + + + + primary + + ImageMediaItem - - - Select Image(s) - - - - - Image(s) - - Image + + + Select Image(s) + + Images (*.jpg *.jpeg *.gif *.png *.bmp);; All files (*) @@ -1520,6 +610,11 @@ Changes don't affect verses already in the service Replace Live Background + + + Image(s) + + No item selected @@ -1542,8 +637,8 @@ Changes don't affect verses already in the service ImageTab - - sec + + Images @@ -1557,21 +652,66 @@ Changes don't affect verses already in the service - - Images + + sec ImportWizardForm + + + Invalid Bible Location + + + + + You need to specify a file to import your Bible from. + + + + + Invalid Books File + + You need to specify a file with books of the Bible to use in the import. - - Invalid Bible Location + + Invalid Verse File + + + + + You need to specify a file of Bible verses to import. + + + + + Invalid OpenSong Bible + + + + + You need to specify an OpenSong Bible file to import. + + + + + Empty Version Name + + + + + You need to specify a version name for your Bible. + + + + + Empty Copyright @@ -1584,76 +724,11 @@ Changes don't affect verses already in the service Bible Exists - - - Empty Copyright - - - - - Empty Version Name - - - - - Invalid OpenSong Bible - - - - - Your Bible import failed. - - - - - Finished import. - - - - - You need to specify a file of Bible verses to import. - - - - - You need to specify a version name for your Bible. - - This Bible already exists! Please import a different Bible or first delete the existing one. - - - Starting import... - - - - - Invalid Books File - - - - - You need to specify a file to import your Bible from. - - - - - You need to specify an OpenSong Bible file to import. - - - - - Invalid Verse File - - - - - Open OpenSong Bible - - Open OSIS File @@ -1669,12 +744,34 @@ Changes don't affect verses already in the service Open Verses CSV File + + + Open OpenSong Bible + + + + + Starting import... + + + + + Finished import. + + + + + Your Bible import failed. + + MainWindow - - The Main Display has been blanked out + + Version %s of OpenLP is now available for download (you are currently running version %s). + +You can download the latest version from http://openlp.org @@ -1682,6 +779,16 @@ Changes don't affect verses already in the service OpenLP Version Updated + + + OpenLP Main Display Blanked + + + + + The Main Display has been blanked out + + Save Changes to Service? @@ -1692,744 +799,12 @@ Changes don't affect verses already in the service Your service has changed, do you want to save those changes? - - - OpenLP Main Display Blanked - - - - - openlp.org 2.0 - - - - - &File - - - - - &Import - - - - - &Song - - - - - &Export - - - - - &Options - - - - - &View - - - - - M&ode - - - - - &Language - - - - - &Tools - - - - - &Help - - - - - Media Manager - - - - - Songs - - - - - Add a new song - - - - - New Song - - - - - Edit the current song - - - - - Edit Song - - - - - Delete the currently selected song(s) - - - - - Delete Song - - - - - Preview the selected song - - - - - Send to Preview - - - - - Send the selected song to live - - - - - Send to Live - - - - - Add the currently selected song(s) to the service - - - - - Add to Service - - - - - Bible Verses - - - - - Preview selected verse(s) - - - - - Send selected verse(s) to live - - - - - Add selected verse(s) to service - - - - - Version: - - - - - Reference: - - - - - Search - - - - - Custom Slides - - - - - Add a new custom slide - - - - - New Custom Slide - - - - - Edit selected slide - - - - - Edit Custom Slide - - - - - Delete selected slide(s) - - - - - Delete Custom Slide - - - - - Preview selected slide - - - - - Preview Custom Slide - - - - - Send selected slide to live - - - - - Send Live - - - - - Add selected slide(s) to service - - - - - Add To Service - - - - - Presentations - - - - - Load a presentation - - - - - Load Video - - - - - Remove selected presentation(s) - - - - - RI - - - - - Send selected presentation to live - - - - - Add selected presentation(s) to service - - - - - Videos - - - - - Load a video - - - - - Delete the selected video(s) - - - - - Send the selected video to live - - - - - Add selected video(s) to service - - - - - Images - - - - - Load image(s) - - - - - Load Image - - - - - Remove selected image(s) - - - - - Delete Image - - - - - Send selected image to live - - - - - Add selected image(s) to service - - - - - Service Manager - - - - - Move selected item(s) to the top - - - - - Move To Top - - - - - Move selected item(s) up one position - - - - - Move Up - - - - - Move selected item(s) down one position - - - - - Move Down - - - - - Move selected item(s) to the bottom - - - - - Move To Bottom - - - - - Create new service - - - - - New Service - - - - - Open an existing service - - - - - Open Service - - - - - Save current service - - - - - Save Service - - - - - Theme Manager - - - - - Create a new theme - - - - - New Theme - - - - - Edit selected theme - - - - - Edit Theme - - - - - Delete selected theme(s) - - - - - Delete Theme - - - - - Import theme(s) - - - - - Import Theme - - - - - Export selected theme(s) - - - - - Export Theme - - - - - &New - - - - - Create a new Service - - - - - Ctrl+N - - - - - &Open - - - - - Ctrl+O - - - - - &Save - - - - - Save the current service to disk - - - - - Ctrl+S - - - - - Save &As... - - - - - Save Service As - - - - - Save the current service under a new name - - - - - F12 - - - - - E&xit - - - - - Quit OpenLP 2.0 - - - - - Alt+F4 - - - - - &Bible - - - - - &Theme - - - - - Look && &Feel - - - - - &Settings - - - - - &Media Manager - - - - - Toggle Media Manager - - - - - Toggle the visibility of the Media Manager - - - - - F8 - - - - - &Theme Manager - - - - - Toggle Theme Manager - - - - - Toggle the visibility of the Theme Manager - - - - - F10 - - - - - &Service Manager - - - - - Toggle Service Manager - - - - - Toggle the visibility of the Service Manager - - - - - F9 - - - - - &Alert - - - - - Show an alert message - - - - - F7 - - - - - &User Guide - - - - - &About - - - - - More information about OpenLP - - - - - Ctrl+F1 - - - - - &Online Help - - - - - &Web Site - - - - - OpenSong - - - - - openlp.org 1.0 - - - - - Export songs in openlp.org 1.0 format - - - - - OpenLP 2.0 - - - - - Export songs in OpenLP 2.0 format - - - - - &Translate - - - - - Translate the interface to your language - - - - - English - - - - - Set the interface language to English - - - - - &Add Tool... - - - - - Add an application to the list of tools - - - - - &Preview Pane - - - - - &Live - - - - - Version %s of OpenLP is now available for download (you are currently running version %s). - -You can download the latest version from http://openlp.org - - MediaManagerItem - - &Preview - - - - - You must select one or more items + + Import a @@ -2437,19 +812,24 @@ You can download the latest version from http://openlp.org Load a new + + + Add a new + + + + + Edit the selected + + Delete the selected item - - &Edit - - - - - &Add to Service + + Preview the selected item @@ -2463,13 +843,18 @@ You can download the latest version from http://openlp.org - - Edit the selected + + &Edit - - Add a new + + &Delete + + + + + &Preview @@ -2478,18 +863,8 @@ You can download the latest version from http://openlp.org - - Preview the selected item - - - - - Import a - - - - - &Delete + + &Add to Service @@ -2512,6 +887,11 @@ You can download the latest version from http://openlp.org No items selected + + + You must select one or more items + + No Service Item Selected @@ -2554,152 +934,6 @@ You can download the latest version from http://openlp.org - - OpenLPExportDialog - - - openlp.org Song Exporter - - - - - Select openlp.org export filename: - - - - - Full Song List - - - - - Song Title - - - - - Author - - - - - Select All - - - - - Lyrics - - - - - Title - - - - - Song Export List - - - - - Remove Selected - - - - - Progress: - - - - - Ready to export - - - - - Export - - - - - Close - - - - - OpenLPImportDialog - - - openlp.org Song Importer - - - - - Select openlp.org songfile to import: - - - - - Import File Song List - - - - - Song Title - - - - - Author - - - - - Select All - - - - - Lyrics - - - - - Title - - - - - Song Import List - - - - - Remove Selected - - - - - Progress: - - - - - Ready to import - - - - - Import - - - - - Close - - - OpenSongBible @@ -2708,160 +942,6 @@ You can download the latest version from http://openlp.org - - OpenSongExportDialog - - - OpenSong Song Exporter - - - - - Select OpenSong song folder: - - - - - Full Song List - - - - - Song Title - - - - - Author - - - - - Select All - - - - - Lyrics - - - - - Title - - - - - Song Export List - - - - - Remove Selected - - - - - Progress: - - - - - Ready to export - - - - - Export - - - - - Close - - - - - OpenSongImportDialog - - - OpenSong Song Importer - - - - - OpenSong Folder: - - - - - Progress: - - - - - Ready to import - - - - - Import - - - - - Close - - - - - PluginViewDialog - - - Plugin list - - - - - Plugin Details - - - - - Version: - - - - - TextLabel - - - - - About: - - - - - Status: - - - - - Disabled - - - - - Inactive - - - - - Active - - - PresentationMediaItem @@ -2870,8 +950,8 @@ You can download the latest version from http://openlp.org - - Present using: + + Select Presentation(s) @@ -2880,13 +960,13 @@ You can download the latest version from http://openlp.org - - A presentation with that filename already exists. + + Presentations (%s) - - Select Presentation(s) + + Present using: @@ -2895,8 +975,8 @@ You can download the latest version from http://openlp.org - - Presentations (%s) + + A presentation with that filename already exists. @@ -2910,6 +990,11 @@ You can download the latest version from http://openlp.org PresentationTab + + + Presentations + + Available Controllers @@ -2920,11 +1005,6 @@ You can download the latest version from http://openlp.org available - - - Presentations - - RemoteTab @@ -2947,34 +1027,16 @@ You can download the latest version from http://openlp.org - - ServiceItemEditDialog - - - Service Item Maintenance - - - - - Up - - - - - Delete - - - - - Down - - - ServiceManager - - Save Changes to Service? + + New Service + + + + + Create a new service @@ -2983,13 +1045,13 @@ You can download the latest version from http://openlp.org - - Move to top + + Load an existing service - - Create a new service + + Save Service @@ -3002,49 +1064,19 @@ You can download the latest version from http://openlp.org Theme: - - - Delete From Service - - - - - Save Service - - - - - &Live Verse - - Move to &top - - New Service + + Move to top - - &Notes - - - - - Move to end - - - - - Your service is unsaved, do you want to save those changes before creating a new one ? - - - - - &Delete From Service + + Move &up @@ -3052,34 +1084,14 @@ You can download the latest version from http://openlp.org Move up order - - - Move down order - - Move &down - - Load an existing service - - - - - &Preview Verse - - - - - Move &up - - - - - &Edit Item + + Move down order @@ -3087,243 +1099,77 @@ You can download the latest version from http://openlp.org Move to &bottom + + + Move to end + + + + + &Delete From Service + + + + + Delete From Service + + + + + &Edit Item + + &Maintain Item - - - ServiceNoteEdit - - Service Item Notes - - - - - SettingsDialog - - - Settings + + &Notes - - General + + &Preview Verse - - Monitors + + &Live Verse - - Select monitor for output display: + + Save Changes to Service? - - Monitor 1 on X11 Windowing System - - - - - Monitor 2 on X11 Windowing System - - - - - Blank Screen - - - - - Show warning on startup - - - - - Auto Open Last Service - - - - - Automatically open the last service at startup - - - - - CCLI Details - - - - - CCLI Number: - - - - - SongSelect Username: - - - - - SongSelect Password: - - - - - Themes - - - - - Global theme - - - - - African Sunset - - - - - Snowy Mountains - - - - - Wilderness - - - - - Theme level - - - - - Song level - - - - - Use the theme from each song in the database. If a song doesn't have a theme associated with it, then use the service's theme. If the service doesn't have a theme, then use the global theme. - - - - - Service level - - - - - Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. - - - - - Global level - - - - - Use the global theme, overriding any themes associated with either the service or the songs. - - - - - Alerts - - - - - Font - - - - - Font Name: - - - - - Font Color: - - - - - Background Color: - - - - - Display length: - - - - - s - - - - - Preview + + Your service is unsaved, do you want to save those changes before creating a new one ? SlideController - - - Move to previous - - - - - Go to Verse - - - - - Start continuous loop - - Live - - - Start playing media - - - - - Move to live - - Preview - - Move to last + + Move to first - - Edit and re-preview Song - - - - - Delay between slides in seconds + + Move to previous @@ -3332,8 +1178,8 @@ You can download the latest version from http://openlp.org - - Move to first + + Move to last @@ -3342,8 +1188,28 @@ You can download the latest version from http://openlp.org - - Verse + + Theme Screen + + + + + Hide Screen + + + + + Move to live + + + + + Edit and re-preview Song + + + + + Start continuous loop @@ -3357,31 +1223,23 @@ You can download the latest version from http://openlp.org - - Theme Screen + + Delay between slides in seconds - - Hide Screen - - - - - SongBookDialog - - - Book Song Maintenance + + Start playing media - - Name: + + Go to Verse - - Publisher: + + Verse @@ -3398,130 +1256,16 @@ You can download the latest version from http://openlp.org - - SongExportDialog - - - Dialog - - - - - Available Songs - - - - - Select All - - - - - Select Songs - - - - - Deselect Songs - - - - - Selected Songs - - - - - OpenLyric Format - - - - - Text File - - - - - SongMaintenanceDialog - - - Song Maintenance - - - - - New Row - - - - - Types - - - - - -Authors - - - - - -Topics - - - - - -Books/Hymnals - - - - - Add - - - - - Edit - - - - - Delete - - - SongMaintenanceForm - - - Are you sure you want to delete the selected book? - - - - - Couldn't save your author. - - - - - This author can't be deleted, they are currently assigned to at least one song. - - - - - Couldn't add your book. - - Error - - No author selected! + + Couldn't add your author. @@ -3530,28 +1274,13 @@ Books/Hymnals - - This book can't be deleted, it is currently assigned to at least one song. + + Couldn't add your book. - - Delete Book - - - - - No book selected! - - - - - Are you sure you want to delete the selected author? - - - - - Couldn't add your author. + + Couldn't save your author. @@ -3564,19 +1293,34 @@ Books/Hymnals Couldn't save your book. - - - Delete Topic - - Delete Author + + + Are you sure you want to delete the selected author? + + + + + This author can't be deleted, they are currently assigned to at least one song. + + + + + No author selected! + + - No topic selected! + Delete Topic + + + + + Are you sure you want to delete the selected topic? @@ -3586,20 +1330,40 @@ Books/Hymnals - Are you sure you want to delete the selected topic? + No topic selected! + + + + + Delete Book + + + + + Are you sure you want to delete the selected book? + + + + + This book can't be deleted, it is currently assigned to at least one song. + + + + + No book selected! SongMediaItem - - CCLI Licence: + + Song - - Song + + Song Maintenance @@ -3608,8 +1372,8 @@ Books/Hymnals - - Lyrics + + Search: @@ -3617,11 +1381,6 @@ Books/Hymnals Type: - - - Titles - - Clear @@ -3632,26 +1391,31 @@ Books/Hymnals Search + + + Titles + + + + + Lyrics + + Authors - - - Search: - - - - - Song Maintenance - - %s (%s) + + + CCLI Licence: + + SongUsageDeleteForm @@ -3693,13 +1457,8 @@ Books/Hymnals SongsTab - - Display Verses on Live Tool bar: - - - - - Enable search as you type: + + Songs @@ -3708,24 +1467,21 @@ Books/Hymnals - - Songs + + Enable search as you type: - - - SplashScreen - - Splash Screen + + Display Verses on Live Tool bar: ThemeManager - - Import Theme + + New Theme @@ -3734,28 +1490,8 @@ Books/Hymnals - - Delete Theme - - - - - Error - - - - - Make Global - - - - - Delete a theme - - - - - File is not a valid theme. + + Edit Theme @@ -3764,48 +1500,18 @@ Books/Hymnals - - Edit Theme + + Delete Theme - - Export Theme + + Delete a theme - - You are unable to delete the default theme. - - - - - Theme Exists - - - - - Delete theme - - - - - Save Theme - (%s) - - - - - default - - - - - Select Theme Import File - - - - - New Theme + + Import Theme @@ -3814,18 +1520,8 @@ Books/Hymnals - - Export theme - - - - - You have not selected a theme. - - - - - A theme with this name already exists, would you like to overwrite it? + + Export Theme @@ -3833,6 +1529,36 @@ Books/Hymnals Export a theme + + + Delete theme + + + + + Make Global + + + + + Export theme + + + + + default + + + + + Error + + + + + You are unable to delete the default theme. + + Theme %s is use in %s plugin @@ -3843,55 +1569,42 @@ Books/Hymnals Theme %s is use by Service Manager - - - ThemeWizard - - Theme Wizard + + You have not selected a theme. - - Welcome + + Save Theme - (%s) - - Welcome to the Theme Wizard. This wizard will guide you through the process of creating a new theme. + + Select Theme Import File - - Theme Name + + File is not a valid theme. - - Choose a name for your theme + + Theme Exists - - Theme Name: - - - - - Select Background - - - - - Select a background type and configure your background + + A theme with this name already exists, would you like to overwrite it? ThemesTab - - Theme level + + Themes @@ -3900,8 +1613,13 @@ Books/Hymnals - - Use the global theme, overriding any themes associated with either the service or the songs. + + Theme level + + + + + Song level @@ -3914,37 +1632,19 @@ Books/Hymnals Service level - - - Global level - - - - - Song level - - Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. - - Themes - - - - - TopicsDialog - - - Topic Maintenance + + Global level - - Topic Name: + + Use the global theme, overriding any themes associated with either the service or the songs. @@ -3952,47 +1652,22 @@ Books/Hymnals TopicsForm - You need to type in a topic name! + Error - Error + You need to type in a topic name! Ui_AboutDialog - - - Close - - - - - License - - - - - Credits - - About OpenLP - - - About - - - - - Contribute - - OpenLP <version><revision> - Open Source Lyrics Projection @@ -4004,6 +1679,11 @@ Find out more about OpenLP: http://openlp.org/ OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. + + + About + + Project Lead @@ -4037,19 +1717,34 @@ Packagers + + + Credits + + Copyright + + + License + + + + + Contribute + + + + + Close + + Ui_AlertDialog - - - Display - - Alert Message @@ -4060,80 +1755,27 @@ Packagers Alert Text: + + + Display + + Cancel - - Ui_AlertEditDialog - Ui_AmendThemeDialog - - Shadow Size: + + Theme Maintenance - - Slide Transition - - - - - Bottom - - - - - Image - - - - - Height: - - - - - Outline - - - - - Main Font - - - - - Solid Color - - - - - Font Main - - - - - Use Default Location: - - - - - Other Options - - - - - Shadow - - - - - Italics + + Theme Name: @@ -4142,13 +1784,38 @@ Packagers - - X Position: + + Opaque - - Center + + Transparent + + + + + Background Type: + + + + + Solid Color + + + + + Gradient + + + + + Image + + + + + <Color1> @@ -4157,18 +1824,63 @@ Packagers - - Opaque + + Image: - - Outline Color: + + Gradient : - - Alignment + + Horizontal + + + + + Vertical + + + + + Circular + + + + + Background + + + + + Main Font + + + + + Font: + + + + + Font Color: + + + + + Size: + + + + + pt + + + + + Wrap Indentation @@ -4182,23 +1894,13 @@ Packagers - - Footer Font + + Italics - - Theme Maintenance - - - - - <Color1> - - - - - Font Footer + + Bold/Italics @@ -4207,18 +1909,23 @@ Packagers - - Transparent + + Display Location - - Background + + Use Default Location: - - Vertical + + X Position: + + + + + Y Position: @@ -4227,8 +1934,58 @@ Packagers - - Middle + + Height: + + + + + px + + + + + Font Main + + + + + Footer Font + + + + + Font Footer + + + + + Outline + + + + + Outline Size: + + + + + Outline Color: + + + + + Show Outline: + + + + + Shadow + + + + + Shadow Size: @@ -4236,6 +1993,36 @@ Packagers Shadow Color: + + + Show Shadow: + + + + + Alignment + + + + + Horizontal Align: + + + + + Left + + + + + Right + + + + + Center + + Vertical Align: @@ -4247,83 +2034,18 @@ Packagers - - Right + + Middle - - Font Color: + + Bottom - - Horizontal - - - - - Circular - - - - - pt - - - - - px - - - - - Display Location - - - - - Y Position: - - - - - Show Shadow: - - - - - Font: - - - - - Preview - - - - - Outline Size: - - - - - Wrap Indentation - - - - - Left - - - - - Theme Name: - - - - - Image: + + Slide Transition @@ -4332,53 +2054,18 @@ Packagers - - Size: + + Other Options - - Gradient : - - - - - Bold/Italics - - - - - Horizontal Align: - - - - - Background Type: - - - - - Show Outline: - - - - - Gradient + + Preview Ui_AuthorsDialog - - - Last name: - - - - - First name: - - Author Maintenance @@ -4389,6 +2076,16 @@ Packagers Display name: + + + First name: + + + + + Last name: + + Ui_BibleImportWizard @@ -4398,13 +2095,33 @@ Packagers - - Bible: + + Welcome to the Bible Import Wizard - - Crosswalk + + 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. + + + + + Select Import Source + + + + + Select the import format, and where to import from. + + + + + Format: + + + + + OSIS @@ -4417,19 +2134,19 @@ Packagers OpenSong + + + Web Download + + File Location: - - 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. - - - - - Copyright: + + Books Location: @@ -4438,38 +2155,8 @@ Packagers - - Server: - - - - - Permission: - - - - - Select Import Source - - - - - Set up the Bible's license details. - - - - - BibleGateway - - - - - Username: - - - - - Download Options + + Bible Filename: @@ -4478,53 +2165,33 @@ Packagers - - Bible Filename: + + Crosswalk - - Format: + + BibleGateway - - Importing + + Bible: - - License Details + + Download Options - - OSIS + + Server: - - Web Download - - - - - Please wait while your Bible is imported. - - - - - Select the import format, and where to import from. - - - - - Proxy Server (Optional) - - - - - Welcome to the Bible Import Wizard + + Username: @@ -4532,142 +2199,117 @@ Packagers Password: + + + Proxy Server (Optional) + + + + + License Details + + + + + Set up the Bible's license details. + + Version Name: + + + Copyright: + + + + + Permission: + + + + + Importing + + + + + Please wait while your Bible is imported. + + Ready. - - - Books Location: - - Ui_EditSongDialog - - - &Remove - - - - - Alternative Title: - - - - - Add a Theme - - - - - R&emove - - - - - Verse Order: - - - - - Title && Lyrics - - - - - Theme - - - - - Authors, Topics && Book - - - - - Copyright Information - - - - - Topic - - - - - Lyrics: - - - - - Edit - - - - - Authors - - Song Editor - - - Delete - - - - - &Add to Song - - - - - CCLI Number: - - - - - Add - - - - - Theme, Copyright Info && Comments - - - - - Song Book - - - - - Edit All - - - - - A&dd to Song - - Title: - - Comments + + Alternative Title: + + + + + Lyrics: + + + + + Verse Order: + + + + + Add + + + + + Edit + + + + + Edit All + + + + + Delete + + + + + Title && Lyrics + + + + + Authors + + + + + &Add to Song + + + + + &Remove @@ -4675,130 +2317,120 @@ Packagers &Manage Authors, Topics, Books + + + Topic + + + + + A&dd to Song + + + + + R&emove + + + + + Song Book + + + + + Authors, Topics && Book + + + + + Theme + + + + + Add a Theme + + + + + Copyright Information + + + + + CCLI Number: + + + + + Comments + + + + + Theme, Copyright Info && Comments + + Ui_EditVerseDialog - - - Verse - - - - - Ending - - - - - Number - - - - - Other - - - - - Bridge - - - - - Pre-Chorus - - Edit Verse + + + Verse Type + + Intro + + + Verse + + + + + Pre-Chorus + + Chorus - - Verse Type + + Bridge + + + + + Ending + + + + + Other + + + + + Number Ui_MainWindow - - Open an existing service - - - - - &File - - - - - List the Plugins - - - - - &Service Manager - - - - - Open Service - - - - - Media Manager - - - - - Alt+F4 - - - - - Toggle the visibility of the Preview Panel - - - - - &User Guide - - - - - Set the interface language to English - - - - - &Import - - - - - Quit OpenLP - - - - - &Preview Panel - - - - - &New + + OpenLP 2.0 @@ -4807,48 +2439,13 @@ Packagers - - Toggle Preview Panel + + &File - - &Settings - - - - - &Live - - - - - English - - - - - F9 - - - - - F8 - - - - - Save the current service to disk - - - - - Add &Tool... - - - - - &View + + &Import @@ -4856,64 +2453,14 @@ Packagers &Export - - - &Open - - - - - Toggle Theme Manager - - &Options - - Ctrl+S - - - - - Ctrl+O - - - - - Ctrl+N - - - - - E&xit - - - - - &Help - - - - - Toggle Service Manager - - - - - Ctrl+F1 - - - - - Save the current service under a new name - - - - - &Web Site + + &View @@ -4922,8 +2469,18 @@ Packagers - - Translate the interface to your language + + &Tools + + + + + &Help + + + + + Media Manager @@ -4931,6 +2488,106 @@ Packagers Service Manager + + + Theme Manager + + + + + &New + + + + + New Service + + + + + Create a new Service + + + + + Ctrl+N + + + + + &Open + + + + + Open Service + + + + + Open an existing service + + + + + Ctrl+O + + + + + &Save + + + + + Save Service + + + + + Save the current service to disk + + + + + Ctrl+S + + + + + Save &As... + + + + + Save Service As + + + + + Save the current service under a new name + + + + + F12 + + + + + E&xit + + + + + Quit OpenLP + + + + + Alt+F4 + + &Theme @@ -4942,98 +2599,13 @@ Packagers - - &About + + Look && &Feel - - &Plugin List - - - - - &Translate - - - - - New Service - - - - - &Online Help - - - - - Save Service - - - - - Save &As... - - - - - Toggle the visibility of the Media Manager - - - - - F11 - - - - - F10 - - - - - F12 - - - - - Alt+F7 - - - - - Add an application to the list of tools - - - - - Theme Manager - - - - - Toggle the visibility of the Theme Manager - - - - - &Preview Pane - - - - - Save Service As - - - - - Toggle the visibility of the Service Manager - - - - - More information about OpenLP + + &Settings @@ -5041,19 +2613,19 @@ Packagers &Media Manager - - - &Tools - - Toggle Media Manager - - Create a new Service + + Toggle the visibility of the Media Manager + + + + + F8 @@ -5062,31 +2634,151 @@ Packagers - - &Save + + Toggle Theme Manager - - OpenLP 2.0 + + Toggle the visibility of the Theme Manager - - Look && &Feel + + F10 + + + + + &Service Manager + + + + + Toggle Service Manager + + + + + Toggle the visibility of the Service Manager + + + + + F9 + + + + + &Preview Panel + + + + + Toggle Preview Panel + + + + + Toggle the visibility of the Preview Panel + + + + + F11 + + + + + &Plugin List + + + + + List the Plugins + + + + + Alt+F7 + + + + + &User Guide + + + + + &About + + + + + More information about OpenLP + + + + + Ctrl+F1 + + + + + &Online Help + + + + + &Web Site + + + + + &Translate + + + + + Translate the interface to your language + + + + + English + + + + + Set the interface language to English + + + + + Add &Tool... + + + + + Add an application to the list of tools + + + + + &Preview Pane + + + + + &Live Ui_OpenLPExportDialog - - Song Title - - - - - Title + + openlp.org Song Exporter @@ -5094,34 +2786,14 @@ Packagers Select openlp.org export filename: - - - Close - - - - - Export - - - - - Lyrics - - Full Song List - - Progress: - - - - - Remove Selected + + Song Title @@ -5130,8 +2802,18 @@ Packagers - - openlp.org Song Exporter + + Select All + + + + + Lyrics + + + + + Title @@ -5139,67 +2821,47 @@ Packagers Song Export List + + + Remove Selected + + + + + Progress: + + Ready to export - - Select All + + Export + + + + + Close Ui_OpenLPImportDialog - - - Author - - - - - Ready to import - - - - - Progress: - - openlp.org Song Importer - - - Song Import List - - - - - Import File Song List - - - - - Close - - Select openlp.org songfile to import: - - Lyrics - - - - - Import + + Import File Song List @@ -5207,32 +2869,72 @@ Packagers Song Title + + + Author + + Select All + + + Lyrics + + Title + + + Song Import List + + Remove Selected + + + Progress: + + + + + Ready to import + + + + + Import + + + + + Close + + Ui_OpenSongExportDialog - - Close + + OpenSong Song Exporter - - Lyrics + + Select OpenSong song folder: + + + + + Full Song List @@ -5240,19 +2942,19 @@ Packagers Song Title + + + Author + + Select All - - Song Export List - - - - - Author + + Lyrics @@ -5261,8 +2963,8 @@ Packagers - - OpenSong Song Exporter + + Song Export List @@ -5275,11 +2977,6 @@ Packagers Progress: - - - Select OpenSong song folder: - - Ready to export @@ -5291,18 +2988,33 @@ Packagers - - Full Song List + + Close Ui_OpenSongImportDialog + + + OpenSong Song Importer + + OpenSong Folder: + + + Progress: + + + + + Ready to import + + Import @@ -5313,39 +3025,19 @@ Packagers Close - - - Progress: - - - - - OpenSong Song Importer - - - - - Ready to import - - Ui_PluginViewDialog + + + Plugin List + + Plugin Details - - - Active - - - - - Status: - - Version: @@ -5362,13 +3054,18 @@ Packagers - - Inactive + + Status: - - Plugin List + + Active + + + + + Inactive @@ -5414,13 +3111,13 @@ Packagers Ui_SongBookDialog - - Name: + + Edit Book - - Edit Book + + Name: @@ -5432,18 +3129,8 @@ Packagers Ui_SongMaintenanceDialog - - Edit - - - - - Topics - - - - - Add + + Song Maintenance @@ -5452,13 +3139,8 @@ Packagers - - Delete - - - - - Song Maintenance + + Topics @@ -5466,6 +3148,21 @@ Packagers Books/Hymnals + + + Add + + + + + Edit + + + + + Delete + + Ui_SongUsageDeleteDialog @@ -5477,11 +3174,6 @@ Packagers Ui_SongUsageDetailDialog - - - Report Location - - Song Usage Extraction @@ -5497,25 +3189,60 @@ Packagers to + + + Report Location + + Ui_TopicsDialog - - Topic name: + + Topic Maintenance - - Topic Maintenance + + Topic name: Ui_customEditDialog - - Delete selected slide + + Move slide Up 1 + + + + + Move slide down 1 + + + + + Edit Custom Slides + + + + + Title: + + + + + Add New + + + + + Add new slide at bottom + + + + + Edit @@ -5528,46 +3255,6 @@ Packagers Edit All - - - Add new slide at bottom - - - - - Clear - - - - - Delete - - - - - Theme: - - - - - Move slide Up 1 - - - - - Title: - - - - - Credits: - - - - - Edit Custom Slides - - Edit all slides @@ -5584,8 +3271,28 @@ Packagers - - Move slide down 1 + + Delete + + + + + Delete selected slide + + + + + Clear + + + + + Clear edit area + + + + + Theme: @@ -5594,205 +3301,18 @@ Packagers - - Edit - - - - - Add New - - - - - Clear edit area - - - - - Wizard - - - Bible Import Wizard - - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body > -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Welcome to the Bible Import Wizard</span></p></body></html> - - - - - 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. - - - - - Select Import Source - - - - - Select the import format, and where to import from. - - - - - Format: - - - - - OSIS - - - - - CSV - - - - - OpenSong - - - - - Web Download - - - - - Bible Name: - - - - - File Location: - - - - - Books Location: - - - - - Verse Location: - - - - - Bible Filename: - - - - - Download Options - - - - - Location: - - - - - Crosswalk - - - - - Bible: - - - - - English Standard Version - - - - - King James Version - - - - - New International Version - - - - - Proxy Server (Optional) - - - - - Server: - - - - - Username: - - - - - Password: - - - - - License Details - - - - - Set up the Bible's license details. - - - - - Version Name: - - - - - Copyright: - - - - - Permission: - - - - - Importing - - - - - Please wait while your Bible is imported. - - - - - Ready. - - - - - %p + + Credits: alertsPlugin + + + &Alert + + Show an alert message @@ -5803,64 +3323,6 @@ p, li { white-space: pre-wrap; } <b>Alerts Plugin</b><br>This plugin controls the displaying of alerts on the presentations screen - - - &Alert - - - - - customEditDialog - - - Edit Custom Slides - - - - - Title: - - - - - Add New - - - - - Edit - - - - - Edit All - - - - - Save - - - - - Delete - - - - - Clear - - - - - Theme: - - - - - Credits: - - export_menu diff --git a/scripts/generate_pro.py b/scripts/generate_pro.py index 6d0a371d4..3b3cff17f 100755 --- a/scripts/generate_pro.py +++ b/scripts/generate_pro.py @@ -73,11 +73,11 @@ def main(): if cond == True: continue - if file.endswith(u'.ui'): - line = "%s/%s" % (path, file) - print u'Parsing "%s"' % line - stringlist.append("FORMS += %s" % line) - elif file.endswith(u'.py'): +# if file.endswith(u'.ui'): +# line = "%s/%s" % (path, file) +# print u'Parsing "%s"' % line +# stringlist.append("FORMS += %s" % line) + if file.endswith(u'.py'): line = "%s/%s" % (path, file) print u'Parsing "%s"' % line stringlist.append("SOURCES += %s" % line) From 395677281474f817743ff7d61ca8944c23db1977 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 2 Apr 2010 01:48:03 +0200 Subject: [PATCH 04/81] Made a start on the Song Import Wizard. --- resources/forms/songimportwizard.ui | 177 +++++++++++++++++++++++++ resources/images/openlp-2.qrc | 1 + resources/images/wizard_importsong.bmp | Bin 0 -> 172254 bytes 3 files changed, 178 insertions(+) create mode 100644 resources/forms/songimportwizard.ui create mode 100644 resources/images/wizard_importsong.bmp diff --git a/resources/forms/songimportwizard.ui b/resources/forms/songimportwizard.ui new file mode 100644 index 000000000..45ebdf6b7 --- /dev/null +++ b/resources/forms/songimportwizard.ui @@ -0,0 +1,177 @@ + + + SongImportWizard + + + + 0 + 0 + 550 + 386 + + + + + 166 + 386 + + + + Song Import Wizard + + + true + + + QWizard::ModernStyle + + + QWizard::NoBackButtonOnLastPage|QWizard::NoBackButtonOnStartPage + + + + + 8 + + + 0 + + + + + + 163 + 0 + + + + + 163 + 16777215 + + + + + + + :/wizards/wizard_importsong.bmp + + + + + + + 8 + + + + + <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> +<html><head><meta name="qrichtext" content="1" /><style type="text/css"> +p, li { white-space: pre-wrap; } +</style></head><body > +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Welcome to the Bible Import Wizard</span></p></body></html> + + + + + + + Qt::Vertical + + + QSizePolicy::Fixed + + + + 20 + 40 + + + + + + + + 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. + + + true + + + 10 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + Select Import Source + + + Select the import format, and where to import from. + + + + 8 + + + 20 + + + + + + + Format: + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + + + + + + diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index 98de90f09..49309b8d5 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -67,6 +67,7 @@ export_move_to_list.png + wizard_importsong.bmp wizard_importbible.bmp diff --git a/resources/images/wizard_importsong.bmp b/resources/images/wizard_importsong.bmp new file mode 100644 index 0000000000000000000000000000000000000000..948422dcc4d845b05342bcd6dcf732a286aba486 GIT binary patch literal 172254 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%0D7|v^>o33f~x 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 literal 0 HcmV?d00001 From 21b6bedcb42a26fd5997fb626ae89792b43d9f56 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 2 Apr 2010 14:23:40 +0200 Subject: [PATCH 05/81] First go at the Song Import Wizard. --- openlp/plugins/songs/forms/__init__.py | 10 +- openlp/plugins/songs/forms/songimportform.py | 327 ++++++++++++++++++ .../plugins/songs/forms/songimportwizard.py | 213 ++++++++++++ openlp/plugins/songs/lib/mediaitem.py | 26 +- openlp/plugins/songs/songsplugin.py | 193 ++++++----- resources/forms/songimportwizard.ui | 179 +++++++++- 6 files changed, 835 insertions(+), 113 deletions(-) create mode 100644 openlp/plugins/songs/forms/songimportform.py create mode 100644 openlp/plugins/songs/forms/songimportwizard.py diff --git a/openlp/plugins/songs/forms/__init__.py b/openlp/plugins/songs/forms/__init__.py index f850a3adb..1073b6866 100644 --- a/openlp/plugins/songs/forms/__init__.py +++ b/openlp/plugins/songs/forms/__init__.py @@ -30,7 +30,9 @@ from editverseform import EditVerseForm from editsongform import EditSongForm from songmaintenanceform import SongMaintenanceForm -from openlpexportform import OpenLPExportForm -from openlpimportform import OpenLPImportForm -from opensongexportform import OpenSongExportForm -from opensongimportform import OpenSongImportForm +#from openlpexportform import OpenLPExportForm +#from openlpimportform import OpenLPImportForm +#from opensongexportform import OpenSongExportForm +#from opensongimportform import OpenSongImportForm + +from songimportform import ImportWizardForm diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py new file mode 100644 index 000000000..5477e1d17 --- /dev/null +++ b/openlp/plugins/songs/forms/songimportform.py @@ -0,0 +1,327 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # +# Thompson, Jon Tibble, Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import csv +import logging +import os +import os.path + +from PyQt4 import QtCore, QtGui + +from songimportwizard import Ui_SongImportWizard +#from openlp.core.lib import Receiver +#from openlp.core.utils import AppLocation, variant_to_unicode +#from openlp.plugins.bibles.lib.manager import BibleFormat + +log = logging.getLogger(__name__) + +class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard): + """ + This is the Bible Import Wizard, which allows easy importing of Bibles + into OpenLP from other formats like OSIS, CSV and OpenSong. + """ + log.info(u'BibleImportForm loaded') + + def __init__(self, parent, config, manager, songsplugin): + """ + Instantiate the wizard, and run any extra setup we need to. + + ``parent`` + The QWidget-derived parent of the wizard. + + ``config`` + The configuration object for storing and retrieving settings. + + ``manager`` + The Bible manager. + + ``bibleplugin`` + The Bible plugin. + """ + QtGui.QWizard.__init__(self, parent) + self.setupUi(self) + #self.registerFields() + self.finishButton = self.button(QtGui.QWizard.FinishButton) + self.cancelButton = self.button(QtGui.QWizard.CancelButton) + self.manager = manager + self.config = config + self.songsplugin = songsplugin + #self.manager.set_process_dialog(self) + #self.web_bible_list = {} + #self.loadWebBibles() + #QtCore.QObject.connect(self.LocationComboBox, +# QtCore.SIGNAL(u'currentIndexChanged(int)'), +# self.onLocationComboBoxChanged) +# QtCore.QObject.connect(self.OsisFileButton, +# QtCore.SIGNAL(u'clicked()'), +# self.onOsisFileButtonClicked) +# QtCore.QObject.connect(self.BooksFileButton, +# QtCore.SIGNAL(u'clicked()'), +# self.onBooksFileButtonClicked) +# QtCore.QObject.connect(self.CsvVersesFileButton, +# QtCore.SIGNAL(u'clicked()'), +# self.onCsvVersesFileButtonClicked) +# QtCore.QObject.connect(self.OpenSongBrowseButton, +# QtCore.SIGNAL(u'clicked()'), +# self.onOpenSongBrowseButtonClicked) + QtCore.QObject.connect(self.cancelButton, + QtCore.SIGNAL(u'clicked(bool)'), + self.onCancelButtonClicked) +# QtCore.QObject.connect(self, +# QtCore.SIGNAL(u'currentIdChanged(int)'), +# self.onCurrentIdChanged) + + def exec_(self): + """ + Run the wizard. + """ + #self.setDefaults() + return QtGui.QWizard.exec_(self) + + def validateCurrentPage(self): + """ + Validate the current page before moving on to the next page. + """ + return True +# if self.currentId() == 0: +# # Welcome page +# return True +# elif self.currentId() == 1: +# # Select page +# if self.field(u'source_format').toInt()[0] == BibleFormat.OSIS: +# if self.field(u'osis_location').toString() == u'': +# QtGui.QMessageBox.critical(self, +# self.trUtf8('Invalid Bible Location'), +# self.trUtf8('You need to specify a file to import your ' +# 'Bible from.'), +# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) +# self.OSISLocationEdit.setFocus() +# return False +# elif self.field(u'source_format').toInt()[0] == BibleFormat.CSV: +# if self.field(u'csv_booksfile').toString() == u'': +# QtGui.QMessageBox.critical(self, +# self.trUtf8('Invalid Books File'), +# self.trUtf8('You need to specify a file with books of ' +# 'the Bible to use in the import.'), +# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) +# self.BooksLocationEdit.setFocus() +# return False +# elif self.field(u'csv_versefile').toString() == u'': +# QtGui.QMessageBox.critical(self, +# self.trUtf8('Invalid Verse File'), +# self.trUtf8('You need to specify a file of Bible ' +# 'verses to import.'), +# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) +# self.CsvVerseLocationEdit.setFocus() +# return False +# elif self.field(u'source_format').toInt()[0] == BibleFormat.OpenSong: +# if self.field(u'opensong_file').toString() == u'': +# QtGui.QMessageBox.critical(self, +# self.trUtf8('Invalid OpenSong Bible'), +# self.trUtf8('You need to specify an OpenSong Bible ' +# 'file to import.'), +# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) +# self.OpenSongFileEdit.setFocus() +# return False +# return True +# elif self.currentId() == 2: +# # License details +# license_version = variant_to_unicode(self.field(u'license_version')) +# license_copyright = variant_to_unicode(self.field(u'license_copyright')) +# if license_version == u'': +# QtGui.QMessageBox.critical(self, +# self.trUtf8('Empty Version Name'), +# self.trUtf8('You need to specify a version name for your ' +# 'Bible.'), +# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) +# self.VersionNameEdit.setFocus() +# return False +# elif license_copyright == u'': +# QtGui.QMessageBox.critical(self, +# self.trUtf8('Empty Copyright'), +# self.trUtf8('You need to set a copyright for your Bible! ' +# 'Bibles in the Public Domain need to be marked as ' +# 'such.'), +# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) +# self.CopyrightEdit.setFocus() +# return False +# elif self.manager.exists(license_version): +# QtGui.QMessageBox.critical(self, +# self.trUtf8('Bible Exists'), +# self.trUtf8('This Bible already exists! Please import ' +# 'a different Bible or first delete the existing one.'), +# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) +# self.VersionNameEdit.setFocus() +# return False +# return True +# if self.currentId() == 3: +# # Progress page +# return True + + def onCancelButtonClicked(self, checked): + """ + Stop the import on pressing the cancel button. + """ + log.debug('Cancel button pressed!') + if self.currentId() == 3: + Receiver.send_message(u'openlpstopimport') + +# def onCurrentIdChanged(self, id): +# if id == 3: +# self.preImport() +# self.performImport() +# self.postImport() +# +# def registerFields(self): +# self.SelectPage.registerField( +# u'source_format', self.FormatComboBox) +# self.SelectPage.registerField( +# u'osis_location', self.OSISLocationEdit) +# self.SelectPage.registerField( +# u'csv_booksfile', self.BooksLocationEdit) +# self.SelectPage.registerField( +# u'csv_versefile', self.CsvVerseLocationEdit) +# self.SelectPage.registerField( +# u'opensong_file', self.OpenSongFileEdit) +# self.SelectPage.registerField( +# u'web_location', self.LocationComboBox) +# self.SelectPage.registerField( +# u'web_biblename', self.BibleComboBox) +# self.SelectPage.registerField( +# u'proxy_server', self.AddressEdit) +# self.SelectPage.registerField( +# u'proxy_username', self.UsernameEdit) +# self.SelectPage.registerField( +# u'proxy_password', self.PasswordEdit) +# self.LicenseDetailsPage.registerField( +# u'license_version', self.VersionNameEdit) +# self.LicenseDetailsPage.registerField( +# u'license_copyright', self.CopyrightEdit) +# self.LicenseDetailsPage.registerField( +# u'license_permission', self.PermissionEdit) +# +# def setDefaults(self): +# self.setField(u'source_format', QtCore.QVariant(0)) +# self.setField(u'osis_location', QtCore.QVariant('')) +# self.setField(u'csv_booksfile', QtCore.QVariant('')) +# self.setField(u'csv_versefile', QtCore.QVariant('')) +# self.setField(u'opensong_file', QtCore.QVariant('')) +# self.setField(u'web_location', QtCore.QVariant(WebDownload.Crosswalk)) +# self.setField(u'web_biblename', QtCore.QVariant(self.BibleComboBox)) +# self.setField(u'proxy_server', +# QtCore.QVariant(self.config.get_config(u'proxy address', ''))) +# self.setField(u'proxy_username', +# QtCore.QVariant(self.config.get_config(u'proxy username',''))) +# self.setField(u'proxy_password', +# QtCore.QVariant(self.config.get_config(u'proxy password',''))) +# self.setField(u'license_version', QtCore.QVariant(self.VersionNameEdit)) +# self.setField(u'license_copyright', QtCore.QVariant(self.CopyrightEdit)) +# self.setField(u'license_permission', QtCore.QVariant(self.PermissionEdit)) +# self.onLocationComboBoxChanged(WebDownload.Crosswalk) + + + def getFileName(self, title, editbox): + filename = QtGui.QFileDialog.getOpenFileName(self, title, + self.config.get_last_dir(1)) + if filename: + editbox.setText(filename) + self.config.set_last_dir(filename, 1) + + def incrementProgressBar(self, status_text): + log.debug(u'IncrementBar %s', status_text) + self.ImportProgressLabel.setText(status_text) + self.ImportProgressBar.setValue(self.ImportProgressBar.value() + 1) + Receiver.send_message(u'process_events') + + def preImport(self): + self.finishButton.setVisible(False) + self.ImportProgressBar.setMinimum(0) + self.ImportProgressBar.setMaximum(1188) + self.ImportProgressBar.setValue(0) + self.ImportProgressLabel.setText(self.trUtf8('Starting import...')) + Receiver.send_message(u'process_events') + + def performImport(self): + pass +# bible_type = self.field(u'source_format').toInt()[0] +# license_version = variant_to_unicode(self.field(u'license_version')) +# license_copyright = variant_to_unicode(self.field(u'license_copyright')) +# license_permission = variant_to_unicode(self.field(u'license_permission')) +# importer = None +# if bible_type == BibleFormat.OSIS: +# # Import an OSIS bible +# importer = self.manager.import_bible(BibleFormat.OSIS, +# name=license_version, +# filename=variant_to_unicode(self.field(u'osis_location')) +# ) +# elif bible_type == BibleFormat.CSV: +# # Import a CSV bible +# importer = self.manager.import_bible(BibleFormat.CSV, +# name=license_version, +# booksfile=variant_to_unicode(self.field(u'csv_booksfile')), +# versefile=variant_to_unicode(self.field(u'csv_versefile')) +# ) +# elif bible_type == BibleFormat.OpenSong: +# # Import an OpenSong bible +# importer = self.manager.import_bible(BibleFormat.OpenSong, +# name=license_version, +# filename=variant_to_unicode(self.field(u'opensong_file')) +# ) +# elif bible_type == BibleFormat.WebDownload: +# # Import a bible from the web +# self.ImportProgressBar.setMaximum(1) +# download_location = self.field(u'web_location').toInt()[0] +# bible_version = self.BibleComboBox.currentText() +# if not isinstance(bible_version, unicode): +# bible_version = unicode(bible_version, u'utf8') +# 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] +# importer = self.manager.import_bible( +# BibleFormat.WebDownload, +# name=license_version, +# download_source=WebDownload.get_name(download_location), +# download_name=bible, +# proxy_server=variant_to_unicode(self.field(u'proxy_server')), +# proxy_username=variant_to_unicode(self.field(u'proxy_username')), +# proxy_password=variant_to_unicode(self.field(u'proxy_password')) +# ) +# success = importer.do_import() +# if success: +# self.manager.save_meta_data(license_version, license_version, +# license_copyright, license_permission) +# self.manager.reload_bibles() +# self.ImportProgressLabel.setText(self.trUtf8('Finished import.')) +# else: +# self.ImportProgressLabel.setText( +# self.trUtf8('Your Bible import failed.')) +# importer.delete() + + def postImport(self): + self.ImportProgressBar.setValue(self.ImportProgressBar.maximum()) + self.finishButton.setVisible(True) + self.cancelButton.setVisible(False) + Receiver.send_message(u'process_events') diff --git a/openlp/plugins/songs/forms/songimportwizard.py b/openlp/plugins/songs/forms/songimportwizard.py new file mode 100644 index 000000000..112191557 --- /dev/null +++ b/openlp/plugins/songs/forms/songimportwizard.py @@ -0,0 +1,213 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # +# Thompson, Jon Tibble, Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +from PyQt4 import QtCore, QtGui + +class Ui_SongImportWizard(object): + def setupUi(self, SongImportWizard): + SongImportWizard.setObjectName(u'SongImportWizard') + SongImportWizard.resize(550, 386) + SongImportWizard.setMinimumSize(QtCore.QSize(166, 386)) + SongImportWizard.setModal(True) + SongImportWizard.setWizardStyle(QtGui.QWizard.ModernStyle) + SongImportWizard.setOptions(QtGui.QWizard.NoBackButtonOnLastPage | + QtGui.QWizard.NoBackButtonOnStartPage) + self.WelcomePage = QtGui.QWizardPage() + self.WelcomePage.setObjectName(u'WelcomePage') + self.WelcomeLayout = QtGui.QHBoxLayout(self.WelcomePage) + self.WelcomeLayout.setSpacing(8) + self.WelcomeLayout.setMargin(0) + self.WelcomeLayout.setObjectName(u'WelcomeLayout') + self.ImportSongImage = QtGui.QLabel(self.WelcomePage) + self.ImportSongImage.setMinimumSize(QtCore.QSize(163, 0)) + self.ImportSongImage.setMaximumSize(QtCore.QSize(163, 16777215)) + self.ImportSongImage.setPixmap( + QtGui.QPixmap(u':/wizards/wizard_importsong.bmp')) + self.ImportSongImage.setObjectName(u'ImportSongImage') + self.WelcomeLayout.addWidget(self.ImportSongImage) + self.WelcomeTextLayout = QtGui.QVBoxLayout() + self.WelcomeTextLayout.setSpacing(8) + self.WelcomeTextLayout.setObjectName(u'WelcomeTextLayout') + self.TitleLabel = QtGui.QLabel(self.WelcomePage) + self.TitleLabel.setObjectName(u'TitleLabel') + self.WelcomeTextLayout.addWidget(self.TitleLabel) + self.WelcomeTopSpacer = QtGui.QSpacerItem(20, 40, + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + self.WelcomeTextLayout.addItem(self.WelcomeTopSpacer) + self.InformationLabel = QtGui.QLabel(self.WelcomePage) + self.InformationLabel.setWordWrap(True) + self.InformationLabel.setMargin(10) + self.InformationLabel.setObjectName(u'InformationLabel') + self.WelcomeTextLayout.addWidget(self.InformationLabel) + self.WelcomeBottomSpacer = QtGui.QSpacerItem(20, 40, + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.WelcomeTextLayout.addItem(self.WelcomeBottomSpacer) + self.WelcomeLayout.addLayout(self.WelcomeTextLayout) + SongImportWizard.addPage(self.WelcomePage) + self.SourcePage = QtGui.QWizardPage() + self.SourcePage.setObjectName(u'SourcePage') + self.SourceLayout = QtGui.QVBoxLayout(self.SourcePage) + self.SourceLayout.setSpacing(8) + self.SourceLayout.setMargin(20) + self.SourceLayout.setObjectName(u'SourceLayout') + self.FormatLayout = QtGui.QHBoxLayout() + self.FormatLayout.setSpacing(8) + self.FormatLayout.setObjectName(u'FormatLayout') + self.FormatLabel = QtGui.QLabel(self.SourcePage) + self.FormatLabel.setObjectName(u'FormatLabel') + self.FormatLayout.addWidget(self.FormatLabel) + self.FormatComboBox = QtGui.QComboBox(self.SourcePage) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.FormatComboBox.sizePolicy().hasHeightForWidth()) + self.FormatComboBox.setSizePolicy(sizePolicy) + self.FormatComboBox.setObjectName(u'FormatComboBox') + self.FormatComboBox.addItem(u'') + self.FormatComboBox.addItem(u'') + self.FormatLayout.addWidget(self.FormatComboBox) + self.FormatSpacer = QtGui.QSpacerItem(40, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.FormatLayout.addItem(self.FormatSpacer) + self.SourceLayout.addLayout(self.FormatLayout) + self.FormatStackedWidget = QtGui.QStackedWidget(self.SourcePage) + self.FormatStackedWidget.setObjectName(u'FormatStackedWidget') + self.OpenSongFilePage = QtGui.QWidget() + self.OpenSongFilePage.setObjectName(u'OpenSongFilePage') + self.OpenSongFileLayout = QtGui.QFormLayout(self.OpenSongFilePage) + self.OpenSongFileLayout.setMargin(0) + self.OpenSongFileLayout.setSpacing(8) + self.OpenSongFileLayout.setObjectName(u'OpenSongFileLayout') + self.OpenSongFileLabel = QtGui.QLabel(self.OpenSongFilePage) + self.OpenSongFileLabel.setObjectName(u'OpenSongFileLabel') + self.OpenSongFileLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.OpenSongFileLabel) + self.OpenSongFilenameLayout = QtGui.QHBoxLayout() + self.OpenSongFilenameLayout.setSpacing(8) + self.OpenSongFilenameLayout.setObjectName(u'OpenSongFilenameLayout') + self.OpenSongFilenameLineEdit = QtGui.QLineEdit(self.OpenSongFilePage) + self.OpenSongFilenameLineEdit.setObjectName(u'OpenSongFilenameLineEdit') + self.OpenSongFilenameLayout.addWidget(self.OpenSongFilenameLineEdit) + self.OpenSongFilenameButton = QtGui.QToolButton(self.OpenSongFilePage) + icon = QtGui.QIcon() + icon.addPixmap(QtGui.QPixmap(u':/imports/import_load.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.OpenSongFilenameButton.setIcon(icon) + self.OpenSongFilenameButton.setObjectName(u'OpenSongFilenameButton') + self.OpenSongFilenameLayout.addWidget(self.OpenSongFilenameButton) + self.OpenSongFileLayout.setLayout(0, + QtGui.QFormLayout.FieldRole, self.OpenSongFilenameLayout) + self.FormatStackedWidget.addWidget(self.OpenSongFilePage) + self.OpenSongDirectoryPage = QtGui.QWidget() + self.OpenSongDirectoryPage.setObjectName(u'OpenSongDirectoryPage') + self.OpenSongDirectoryLayout = QtGui.QFormLayout(self.OpenSongDirectoryPage) + self.OpenSongDirectoryLayout.setMargin(0) + self.OpenSongDirectoryLayout.setSpacing(8) + self.OpenSongDirectoryLayout.setObjectName(u'OpenSongDirectoryLayout') + self.OpenSongDirectoryLabel = QtGui.QLabel(self.OpenSongDirectoryPage) + self.OpenSongDirectoryLabel.setObjectName(u'OpenSongDirectoryLabel') + self.OpenSongDirectoryLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.OpenSongDirectoryLabel) + self.OpenSongDirLayout = QtGui.QHBoxLayout() + self.OpenSongDirLayout.setSpacing(8) + self.OpenSongDirLayout.setObjectName(u'OpenSongDirLayout') + self.OpenSongDirectoryLineEdit = QtGui.QLineEdit(self.OpenSongDirectoryPage) + self.OpenSongDirectoryLineEdit.setObjectName(u'OpenSongDirectoryLineEdit') + self.OpenSongDirLayout.addWidget(self.OpenSongDirectoryLineEdit) + self.OpenSongDirectoryButton = QtGui.QToolButton(self.OpenSongDirectoryPage) + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(u':/exports/export_load.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.OpenSongDirectoryButton.setIcon(icon1) + self.OpenSongDirectoryButton.setObjectName(u'OpenSongDirectoryButton') + self.OpenSongDirLayout.addWidget(self.OpenSongDirectoryButton) + self.OpenSongDirectoryLayout.setLayout(0, + QtGui.QFormLayout.FieldRole, self.OpenSongDirLayout) + self.FormatStackedWidget.addWidget(self.OpenSongDirectoryPage) + self.SourceLayout.addWidget(self.FormatStackedWidget) + SongImportWizard.addPage(self.SourcePage) + self.ImportPage = QtGui.QWizardPage() + self.ImportPage.setObjectName(u'ImportPage') + self.ImportLayout = QtGui.QVBoxLayout(self.ImportPage) + self.ImportLayout.setSpacing(8) + self.ImportLayout.setMargin(50) + self.ImportLayout.setObjectName(u'ImportLayout') + self.ImportProgressLabel = QtGui.QLabel(self.ImportPage) + self.ImportProgressLabel.setObjectName(u'ImportProgressLabel') + self.ImportLayout.addWidget(self.ImportProgressLabel) + self.ImportProgressBar = QtGui.QProgressBar(self.ImportPage) + self.ImportProgressBar.setProperty(u'value', 0) + self.ImportProgressBar.setInvertedAppearance(False) + self.ImportProgressBar.setObjectName(u'ImportProgressBar') + self.ImportLayout.addWidget(self.ImportProgressBar) + SongImportWizard.addPage(self.ImportPage) + self.OpenSongFileLabel.setBuddy(self.OpenSongFilenameLineEdit) + + self.retranslateUi(SongImportWizard) + self.FormatStackedWidget.setCurrentIndex(0) + QtCore.QObject.connect( + self.FormatComboBox, + QtCore.SIGNAL(u'currentIndexChanged(int)'), + self.FormatStackedWidget.setCurrentIndex + ) + QtCore.QMetaObject.connectSlotsByName(SongImportWizard) + + def retranslateUi(self, SongImportWizard): + SongImportWizard.setWindowTitle(self.trUtf8('Song Import Wizard')) + self.TitleLabel.setText(self.trUtf8( + '\n' + '\n' + ' \n' + ' \n' + ' \n' + ' \n' + ' \n' + '

\n' + ' \n' + ' Welcome to the Song Import Wizard\n' + ' \n' + '

\n' + ' \n' + '' + )) + self.InformationLabel.setText(self.trUtf8('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(self.trUtf8('Select Import Source')) + self.SourcePage.setSubTitle(self.trUtf8('Select the import format, ' + 'and where to import from.')) + self.FormatLabel.setText(self.trUtf8('Format:')) + self.FormatComboBox.setItemText(0, self.trUtf8('OpenSong (Single File)')) + self.FormatComboBox.setItemText(1, self.trUtf8('OpenSong (Directory of Files)')) + self.OpenSongFileLabel.setText(self.trUtf8('Filename:')) + self.OpenSongDirectoryLabel.setText(self.trUtf8('Directory:')) + self.ImportPage.setTitle(self.trUtf8('Importing')) + self.ImportPage.setSubTitle(self.trUtf8('Please wait while your songs ' + 'are imported.')) + self.ImportProgressLabel.setText(self.trUtf8('Ready.')) + self.ImportProgressBar.setFormat(self.trUtf8('%p%')) + diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 9ac8ec977..5e57ee9f3 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -29,7 +29,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, SongXMLParser, \ BaseListWithDnD, Receiver, str_to_bool -from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm +from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \ + ImportWizardForm log = logging.getLogger(__name__) @@ -51,9 +52,9 @@ class SongMediaItem(MediaManagerItem): self.ListViewWithDnD_class = SongListView self.servicePath = None MediaManagerItem.__init__(self, parent, icon, title) - self.edit_song_form = EditSongForm(self.parent.songmanager, self) + self.edit_song_form = EditSongForm(self.parent.manager, self) self.song_maintenance_form = SongMaintenanceForm( - self.parent.songmanager, self) + self.parent.manager, self) # Holds information about whether the edit is remotly triggered and # which Song is required. self.remoteSong = -1 @@ -154,17 +155,17 @@ class SongMediaItem(MediaManagerItem): search_type = self.SearchTypeComboBox.currentIndex() if search_type == 0: log.debug(u'Titles Search') - search_results = self.parent.songmanager.search_song_title( + search_results = self.parent.manager.search_song_title( search_keywords) self.displayResultsSong(search_results) elif search_type == 1: log.debug(u'Lyrics Search') - search_results = self.parent.songmanager.search_song_lyrics( + search_results = self.parent.manager.search_song_lyrics( search_keywords) self.displayResultsSong(search_results) elif search_type == 2: log.debug(u'Authors Search') - search_results = self.parent.songmanager.get_song_from_author( + search_results = self.parent.manager.get_song_from_author( search_keywords) self.displayResultsAuthor(search_results) #Called to redisplay the song list screen edith from a search @@ -226,6 +227,11 @@ class SongMediaItem(MediaManagerItem): if len(text) > search_length: self.onSearchTextButtonClick() + def onImportClick(self): + songimportform = ImportWizardForm(self, self.parent.config, + self.parent.manager, self.parent) + songimportform.exec_() + def onNewClick(self): self.edit_song_form.newSong() self.edit_song_form.exec_() @@ -256,7 +262,7 @@ class SongMediaItem(MediaManagerItem): type of display is required. """ fields = songid.split(u':') - valid = self.parent.songmanager.get_song(fields[1]) + valid = self.parent.manager.get_song(fields[1]) if valid: self.remoteSong = fields[1] self.remoteTriggered = fields[0] @@ -274,7 +280,7 @@ class SongMediaItem(MediaManagerItem): item = self.ListView.currentItem() if item: item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.parent.songmanager.delete_song(item_id) + self.parent.manager.delete_song(item_id) row = self.ListView.row(item) self.ListView.takeItem(row) @@ -291,7 +297,7 @@ class SongMediaItem(MediaManagerItem): else: item_id = self.remoteSong service_item.auto_preview_allowed = True - song = self.parent.songmanager.get_song(item_id) + song = self.parent.manager.get_song(item_id) service_item.theme = song.theme_name service_item.edit_enabled = True service_item.editId = item_id @@ -345,4 +351,4 @@ class SongMediaItem(MediaManagerItem): service_item.audit = [ song.title, author_audit, song.copyright, song.ccli_number ] - return True \ No newline at end of file + return True diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 152392443..be98aae76 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -29,8 +29,9 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, build_icon, PluginStatus from openlp.plugins.songs.lib import SongManager, SongMediaItem, SongsTab -from openlp.plugins.songs.forms import OpenLPImportForm, OpenSongExportForm, \ - OpenSongImportForm, OpenLPExportForm +#from openlp.plugins.songs.forms import ImportWizardForm +#OpenLPImportForm, OpenSongExportForm, \ +# OpenSongImportForm, OpenLPExportForm log = logging.getLogger(__name__) @@ -50,11 +51,12 @@ class SongsPlugin(Plugin): """ Plugin.__init__(self, u'Songs', u'1.9.1', plugin_helpers) self.weight = -10 - self.songmanager = SongManager(self.config) - self.openlp_import_form = OpenLPImportForm() - self.opensong_import_form = OpenSongImportForm() - self.openlp_export_form = OpenLPExportForm() - self.opensong_export_form = OpenSongExportForm() + self.manager = SongManager(self.config) + #self.openlp_import_form = OpenLPImportForm() + #self.opensong_import_form = OpenSongImportForm() + #self.openlp_export_form = OpenLPExportForm() + #self.opensong_export_form = OpenSongExportForm() + #self.import_wizard = ImportWizardForm() self.icon = build_icon(u':/media/media_song.png') self.status = PluginStatus.Active @@ -67,16 +69,16 @@ class SongsPlugin(Plugin): # self.songmanager = SongManager(self.config) Plugin.initialise(self) self.insert_toolbox_item() - self.ImportSongMenu.menuAction().setVisible(True) - self.ExportSongMenu.menuAction().setVisible(True) - self.media_item.displayResultsSong(self.songmanager.get_songs()) + #self.ImportSongMenu.menuAction().setVisible(True) + #self.ExportSongMenu.menuAction().setVisible(True) + self.media_item.displayResultsSong(self.manager.get_songs()) def finalise(self): log.info(u'Plugin Finalise') Plugin.finalise(self) self.remove_toolbox_item() - self.ImportSongMenu.menuAction().setVisible(False) - self.ExportSongMenu.menuAction().setVisible(False) + #self.ImportSongMenu.menuAction().setVisible(False) + #self.ExportSongMenu.menuAction().setVisible(False) def get_media_manager_item(self): """ @@ -94,86 +96,99 @@ class SongsPlugin(Plugin): The actual **Import** menu item, so that your actions can use it as their parent. """ - self.ImportSongMenu = QtGui.QMenu(import_menu) - self.ImportSongMenu.setObjectName(u'ImportSongMenu') - self.ImportOpenSongItem = QtGui.QAction(import_menu) - self.ImportOpenSongItem.setObjectName(u'ImportOpenSongItem') - self.ImportOpenlp1Item = QtGui.QAction(import_menu) - self.ImportOpenlp1Item.setObjectName(u'ImportOpenlp1Item') - self.ImportOpenlp2Item = QtGui.QAction(import_menu) - self.ImportOpenlp2Item.setObjectName(u'ImportOpenlp2Item') - # Add to menus - self.ImportSongMenu.addAction(self.ImportOpenlp1Item) - self.ImportSongMenu.addAction(self.ImportOpenlp2Item) - self.ImportSongMenu.addAction(self.ImportOpenSongItem) - import_menu.addAction(self.ImportSongMenu.menuAction()) - # Translations... - self.ImportSongMenu.setTitle(import_menu.trUtf8('&Song')) - self.ImportOpenSongItem.setText(import_menu.trUtf8('OpenSong')) - self.ImportOpenlp1Item.setText(import_menu.trUtf8('openlp.org 1.0')) - self.ImportOpenlp1Item.setToolTip( - import_menu.trUtf8('Export songs in openlp.org 1.0 format')) - self.ImportOpenlp1Item.setStatusTip( - import_menu.trUtf8('Export songs in openlp.org 1.0 format')) - self.ImportOpenlp2Item.setText(import_menu.trUtf8('OpenLP 2.0')) - self.ImportOpenlp2Item.setToolTip( - import_menu.trUtf8('Export songs in OpenLP 2.0 format')) - self.ImportOpenlp2Item.setStatusTip( - import_menu.trUtf8('Export songs in OpenLP 2.0 format')) - # Signals and slots - QtCore.QObject.connect(self.ImportOpenlp1Item, - QtCore.SIGNAL(u'triggered()'), self.onImportOpenlp1ItemClick) - QtCore.QObject.connect(self.ImportOpenlp2Item, - QtCore.SIGNAL(u'triggered()'), self.onImportOpenlp1ItemClick) - QtCore.QObject.connect(self.ImportOpenSongItem, - QtCore.SIGNAL(u'triggered()'), self.onImportOpenSongItemClick) - self.ImportSongMenu.menuAction().setVisible(False) + self.SongImportItem = QtGui.QAction(import_menu) + self.SongImportItem.setObjectName(u'SongImportItem') + self.SongImportItem.setText(import_menu.trUtf8('&Song')) + self.SongImportItem.setToolTip( + import_menu.trUtf8('Import songs using the import wizard.')) + import_menu.addAction(self.SongImportItem) + QtCore.QObject.connect(self.SongImportItem, + QtCore.SIGNAL(u'triggered()'), self.onSongImportItemClicked) - def add_export_menu_item(self, export_menu): - """ - Give the Songs plugin the opportunity to add items to the - **Export** menu. +# self.ImportSongMenu = QtGui.QMenu(import_menu) +# self.ImportSongMenu.setObjectName(u'ImportSongMenu') +# self.ImportOpenSongItem = QtGui.QAction(import_menu) +# self.ImportOpenSongItem.setObjectName(u'ImportOpenSongItem') +# self.ImportOpenlp1Item = QtGui.QAction(import_menu) +# self.ImportOpenlp1Item.setObjectName(u'ImportOpenlp1Item') +# self.ImportOpenlp2Item = QtGui.QAction(import_menu) +# self.ImportOpenlp2Item.setObjectName(u'ImportOpenlp2Item') +# # Add to menus +# self.ImportSongMenu.addAction(self.ImportOpenlp1Item) +# self.ImportSongMenu.addAction(self.ImportOpenlp2Item) +# self.ImportSongMenu.addAction(self.ImportOpenSongItem) +# import_menu.addAction(self.ImportSongMenu.menuAction()) +# # Translations... +# self.ImportSongMenu.setTitle(import_menu.trUtf8('&Song')) +# self.ImportOpenSongItem.setText(import_menu.trUtf8('OpenSong')) +# self.ImportOpenlp1Item.setText(import_menu.trUtf8('openlp.org 1.0')) +# self.ImportOpenlp1Item.setToolTip( +# import_menu.trUtf8('Export songs in openlp.org 1.0 format')) +# self.ImportOpenlp1Item.setStatusTip( +# import_menu.trUtf8('Export songs in openlp.org 1.0 format')) +# self.ImportOpenlp2Item.setText(import_menu.trUtf8('OpenLP 2.0')) +# self.ImportOpenlp2Item.setToolTip( +# import_menu.trUtf8('Export songs in OpenLP 2.0 format')) +# self.ImportOpenlp2Item.setStatusTip( +# import_menu.trUtf8('Export songs in OpenLP 2.0 format')) +# # Signals and slots +# QtCore.QObject.connect(self.ImportOpenlp1Item, +# QtCore.SIGNAL(u'triggered()'), self.onImportOpenlp1ItemClick) +# QtCore.QObject.connect(self.ImportOpenlp2Item, +# QtCore.SIGNAL(u'triggered()'), self.onImportOpenlp1ItemClick) +# QtCore.QObject.connect(self.ImportOpenSongItem, +# QtCore.SIGNAL(u'triggered()'), self.onImportOpenSongItemClick) +# self.ImportSongMenu.menuAction().setVisible(False) - ``export_menu`` - The actual **Export** menu item, so that your actions can - use it as their parent. - """ - self.ExportSongMenu = QtGui.QMenu(export_menu) - self.ExportSongMenu.setObjectName(u'ExportSongMenu') - self.ExportOpenSongItem = QtGui.QAction(export_menu) - self.ExportOpenSongItem.setObjectName(u'ExportOpenSongItem') - self.ExportOpenlp1Item = QtGui.QAction(export_menu) - self.ExportOpenlp1Item.setObjectName(u'ExportOpenlp1Item') - self.ExportOpenlp2Item = QtGui.QAction(export_menu) - self.ExportOpenlp2Item.setObjectName(u'ExportOpenlp2Item') - # Add to menus - self.ExportSongMenu.addAction(self.ExportOpenlp1Item) - self.ExportSongMenu.addAction(self.ExportOpenlp2Item) - self.ExportSongMenu.addAction(self.ExportOpenSongItem) - export_menu.addAction(self.ExportSongMenu.menuAction()) - # Translations... - self.ExportSongMenu.setTitle(export_menu.trUtf8('&Song')) - self.ExportOpenSongItem.setText(export_menu.trUtf8('OpenSong')) - self.ExportOpenlp1Item.setText(export_menu.trUtf8('openlp.org 1.0')) - self.ExportOpenlp2Item.setText(export_menu.trUtf8('OpenLP 2.0')) - # Signals and slots - QtCore.QObject.connect(self.ExportOpenlp1Item, - QtCore.SIGNAL(u'triggered()'), self.onExportOpenlp1ItemClicked) - QtCore.QObject.connect(self.ExportOpenSongItem, - QtCore.SIGNAL(u'triggered()'), self.onExportOpenSongItemClicked) - self.ExportSongMenu.menuAction().setVisible(False) +# def add_export_menu_item(self, export_menu): +# """ +# Give the Songs plugin the opportunity to add items to the +# **Export** menu. +# +# ``export_menu`` +# The actual **Export** menu item, so that your actions can +# use it as their parent. +# """ +# self.ExportSongMenu = QtGui.QMenu(export_menu) +# self.ExportSongMenu.setObjectName(u'ExportSongMenu') +# self.ExportOpenSongItem = QtGui.QAction(export_menu) +# self.ExportOpenSongItem.setObjectName(u'ExportOpenSongItem') +# self.ExportOpenlp1Item = QtGui.QAction(export_menu) +# self.ExportOpenlp1Item.setObjectName(u'ExportOpenlp1Item') +# self.ExportOpenlp2Item = QtGui.QAction(export_menu) +# self.ExportOpenlp2Item.setObjectName(u'ExportOpenlp2Item') +# # Add to menus +# self.ExportSongMenu.addAction(self.ExportOpenlp1Item) +# self.ExportSongMenu.addAction(self.ExportOpenlp2Item) +# self.ExportSongMenu.addAction(self.ExportOpenSongItem) +# export_menu.addAction(self.ExportSongMenu.menuAction()) +# # Translations... +# self.ExportSongMenu.setTitle(export_menu.trUtf8('&Song')) +# self.ExportOpenSongItem.setText(export_menu.trUtf8('OpenSong')) +# self.ExportOpenlp1Item.setText(export_menu.trUtf8('openlp.org 1.0')) +# self.ExportOpenlp2Item.setText(export_menu.trUtf8('OpenLP 2.0')) +# # Signals and slots +# QtCore.QObject.connect(self.ExportOpenlp1Item, +# QtCore.SIGNAL(u'triggered()'), self.onExportOpenlp1ItemClicked) +# QtCore.QObject.connect(self.ExportOpenSongItem, +# QtCore.SIGNAL(u'triggered()'), self.onExportOpenSongItemClicked) +# self.ExportSongMenu.menuAction().setVisible(False) - def onImportOpenlp1ItemClick(self): - self.openlp_import_form.show() + def onSongImportItemClicked(self): + if self.media_item: + self.media_item.onImportClick() - def onImportOpenSongItemClick(self): - self.opensong_import_form.show() - - def onExportOpenlp1ItemClicked(self): - self.openlp_export_form.show() - - def onExportOpenSongItemClicked(self): - self.opensong_export_form.show() +# def onImportOpenlp1ItemClick(self): +# self.openlp_import_form.show() +# +# def onImportOpenSongItemClick(self): +# self.opensong_import_form.show() +# +# def onExportOpenlp1ItemClicked(self): +# self.openlp_export_form.show() +# +# def onExportOpenSongItemClicked(self): +# self.opensong_export_form.show() def about(self): about_text = self.trUtf8('Song Plugin
This plugin allows ' @@ -181,6 +196,6 @@ class SongsPlugin(Plugin): return about_text def can_delete_theme(self, theme): - if len(self.songmanager.get_songs_for_theme(theme)) == 0: + if len(self.manager.get_songs_for_theme(theme)) == 0: return True return False diff --git a/resources/forms/songimportwizard.ui b/resources/forms/songimportwizard.ui index 45ebdf6b7..1495d88c0 100644 --- a/resources/forms/songimportwizard.ui +++ b/resources/forms/songimportwizard.ui @@ -69,8 +69,8 @@ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> <html><head><meta name="qrichtext" content="1" /><style type="text/css"> p, li { white-space: pre-wrap; } -</style></head><body > -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Welcome to the Bible Import Wizard</span></p></body></html> +</style></head><body style=" font-family:'Lucida Grande'; font-size:10pt; font-weight:400; font-style:normal;"> +<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:14pt; font-weight:600;">Welcome to the Song Import Wizard</span></p></body></html> @@ -93,7 +93,7 @@ p, li { white-space: pre-wrap; } - 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. + 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. true @@ -135,7 +135,10 @@ p, li { white-space: pre-wrap; } 20 - + + + 8 + @@ -144,10 +147,27 @@ p, li { white-space: pre-wrap; } - + + + + 0 + 0 + + + + + OpenSong (Single File) + + + + + OpenSong (Directory of Files) + + + - + Qt::Horizontal @@ -162,9 +182,131 @@ p, li { white-space: pre-wrap; } - - - + + + 0 + + + + + 8 + + + 8 + + + 0 + + + + + Filename: + + + OpenSongFilenameLineEdit + + + + + + + 8 + + + + + + + + + + + + :/imports/import_load.png:/imports/import_load.png + + + + + + + + + + + 8 + + + 8 + + + 0 + + + + + Directory: + + + + + + + 8 + + + + + + + + + + + + :/exports/export_load.png:/exports/export_load.png + + + + + + + + + + + + + + Importing + + + Please wait while your songs are imported. + + + + 8 + + + 50 + + + + + Ready. + + + + + + + 0 + + + false + + + %p + @@ -173,5 +315,22 @@ p, li { white-space: pre-wrap; } - + + + FormatComboBox + currentIndexChanged(int) + FormatStackedWidget + setCurrentIndex(int) + + + 122 + 92 + + + 274 + 222 + + + + From 20636bf655c72f7a0dcf7ef2c63f39e7d01fb2f5 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 2 Apr 2010 22:03:51 +0200 Subject: [PATCH 06/81] Wizard works, though not functional. --- .../plugins/bibles/forms/bibleimportwizard.py | 8 +- openlp/plugins/songs/forms/songimportform.py | 51 ++--- .../plugins/songs/forms/songimportwizard.py | 212 +++++++++++------- openlp/plugins/songs/lib/manager.py | 46 +++- resources/forms/songimportwizard.ui | 201 ++++++++++++++--- 5 files changed, 368 insertions(+), 150 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportwizard.py b/openlp/plugins/bibles/forms/bibleimportwizard.py index 7b42ed26d..d32b9dc4e 100644 --- a/openlp/plugins/bibles/forms/bibleimportwizard.py +++ b/openlp/plugins/bibles/forms/bibleimportwizard.py @@ -32,8 +32,8 @@ class Ui_BibleImportWizard(object): BibleImportWizard.setModal(True) BibleImportWizard.setWizardStyle(QtGui.QWizard.ModernStyle) BibleImportWizard.setOptions( - QtGui.QWizard.IndependentPages | \ - QtGui.QWizard.NoBackButtonOnStartPage | \ + QtGui.QWizard.IndependentPages | + QtGui.QWizard.NoBackButtonOnStartPage | QtGui.QWizard.NoBackButtonOnLastPage) self.WelcomePage = QtGui.QWizardPage() self.WelcomePage.setPixmap(QtGui.QWizard.WatermarkPixmap, @@ -309,8 +309,8 @@ class Ui_BibleImportWizard(object): def retranslateUi(self, BibleImportWizard): BibleImportWizard.setWindowTitle(self.trUtf8('Bible Import Wizard')) self.TitleLabel.setText( - u'' + \ - self.trUtf8('Welcome to the Bible Import Wizard') + u'') + u'%s' % \ + self.trUtf8('Welcome to the Bible Import Wizard')) self.InformationLabel.setText( self.trUtf8('This wizard will help you to import Bibles from a ' 'variety of formats. Click the next button below to start the ' diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index 5477e1d17..fc652a1e7 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -193,39 +193,41 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard): # self.preImport() # self.performImport() # self.postImport() -# -# def registerFields(self): -# self.SelectPage.registerField( + + def registerFields(self): + pass +# self.SourcePage.registerField( # u'source_format', self.FormatComboBox) -# self.SelectPage.registerField( -# u'osis_location', self.OSISLocationEdit) -# self.SelectPage.registerField( -# u'csv_booksfile', self.BooksLocationEdit) -# self.SelectPage.registerField( +# self.SourcePage.registerField( +# u'openlyrics_filename', self.OpenLyricsFilenameEdit) +# self.SourcePage.registerField( +# u'openlyrics_directory', self.OpenLyricsDirectoryEdit) +# self.SourcePage.registerField( +# u'opensong_filename', self.OpenSongFilenameEdit) +# self.SourcePage.registerField( +# u'opensong_directory', self.OpenSongDirectoryEdit) +# self.SourcePage.registerField( # u'csv_versefile', self.CsvVerseLocationEdit) -# self.SelectPage.registerField( +# self.SourcePage.registerField( # u'opensong_file', self.OpenSongFileEdit) -# self.SelectPage.registerField( +# self.SourcePage.registerField( # u'web_location', self.LocationComboBox) -# self.SelectPage.registerField( +# self.SourcePage.registerField( # u'web_biblename', self.BibleComboBox) -# self.SelectPage.registerField( +# self.SourcePage.registerField( # u'proxy_server', self.AddressEdit) -# self.SelectPage.registerField( +# self.SourcePage.registerField( # u'proxy_username', self.UsernameEdit) -# self.SelectPage.registerField( +# self.SourcePage.registerField( # u'proxy_password', self.PasswordEdit) -# self.LicenseDetailsPage.registerField( -# u'license_version', self.VersionNameEdit) -# self.LicenseDetailsPage.registerField( -# u'license_copyright', self.CopyrightEdit) -# self.LicenseDetailsPage.registerField( -# u'license_permission', self.PermissionEdit) -# -# def setDefaults(self): + + def setDefaults(self): + pass # self.setField(u'source_format', QtCore.QVariant(0)) -# self.setField(u'osis_location', QtCore.QVariant('')) -# self.setField(u'csv_booksfile', QtCore.QVariant('')) +# self.setField(u'openlyrics_filename', QtCore.QVariant('')) +# self.setField(u'openlyrics_directory', QtCore.QVariant('')) +# self.setField(u'opensong_filename', QtCore.QVariant('')) +# self.setField(u'opensong_directory', QtCore.QVariant('')) # self.setField(u'csv_versefile', QtCore.QVariant('')) # self.setField(u'opensong_file', QtCore.QVariant('')) # self.setField(u'web_location', QtCore.QVariant(WebDownload.Crosswalk)) @@ -241,7 +243,6 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard): # self.setField(u'license_permission', QtCore.QVariant(self.PermissionEdit)) # self.onLocationComboBoxChanged(WebDownload.Crosswalk) - def getFileName(self, title, editbox): filename = QtGui.QFileDialog.getOpenFileName(self, title, self.config.get_last_dir(1)) diff --git a/openlp/plugins/songs/forms/songimportwizard.py b/openlp/plugins/songs/forms/songimportwizard.py index 112191557..d0c8d9d92 100644 --- a/openlp/plugins/songs/forms/songimportwizard.py +++ b/openlp/plugins/songs/forms/songimportwizard.py @@ -29,24 +29,20 @@ class Ui_SongImportWizard(object): def setupUi(self, SongImportWizard): SongImportWizard.setObjectName(u'SongImportWizard') SongImportWizard.resize(550, 386) - SongImportWizard.setMinimumSize(QtCore.QSize(166, 386)) SongImportWizard.setModal(True) SongImportWizard.setWizardStyle(QtGui.QWizard.ModernStyle) - SongImportWizard.setOptions(QtGui.QWizard.NoBackButtonOnLastPage | - QtGui.QWizard.NoBackButtonOnStartPage) + SongImportWizard.setOptions( + QtGui.QWizard.IndependentPages | + QtGui.QWizard.NoBackButtonOnStartPage | + QtGui.QWizard.NoBackButtonOnLastPage) self.WelcomePage = QtGui.QWizardPage() self.WelcomePage.setObjectName(u'WelcomePage') + self.WelcomePage.setPixmap(QtGui.QWizard.WatermarkPixmap, + QtGui.QPixmap(u':/wizards/wizard_importsong.bmp')) self.WelcomeLayout = QtGui.QHBoxLayout(self.WelcomePage) self.WelcomeLayout.setSpacing(8) self.WelcomeLayout.setMargin(0) self.WelcomeLayout.setObjectName(u'WelcomeLayout') - self.ImportSongImage = QtGui.QLabel(self.WelcomePage) - self.ImportSongImage.setMinimumSize(QtCore.QSize(163, 0)) - self.ImportSongImage.setMaximumSize(QtCore.QSize(163, 16777215)) - self.ImportSongImage.setPixmap( - QtGui.QPixmap(u':/wizards/wizard_importsong.bmp')) - self.ImportSongImage.setObjectName(u'ImportSongImage') - self.WelcomeLayout.addWidget(self.ImportSongImage) self.WelcomeTextLayout = QtGui.QVBoxLayout() self.WelcomeTextLayout.setSpacing(8) self.WelcomeTextLayout.setObjectName(u'WelcomeTextLayout') @@ -79,15 +75,18 @@ class Ui_SongImportWizard(object): self.FormatLabel.setObjectName(u'FormatLabel') self.FormatLayout.addWidget(self.FormatLabel) self.FormatComboBox = QtGui.QComboBox(self.SourcePage) - sizePolicy = QtGui.QSizePolicy( - QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, + QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.FormatComboBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.FormatComboBox.sizePolicy().hasHeightForWidth()) self.FormatComboBox.setSizePolicy(sizePolicy) self.FormatComboBox.setObjectName(u'FormatComboBox') self.FormatComboBox.addItem(u'') self.FormatComboBox.addItem(u'') + self.FormatComboBox.addItem(u'') + self.FormatComboBox.addItem(u'') self.FormatLayout.addWidget(self.FormatComboBox) self.FormatSpacer = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) @@ -95,58 +94,108 @@ class Ui_SongImportWizard(object): self.SourceLayout.addLayout(self.FormatLayout) self.FormatStackedWidget = QtGui.QStackedWidget(self.SourcePage) self.FormatStackedWidget.setObjectName(u'FormatStackedWidget') - self.OpenSongFilePage = QtGui.QWidget() - self.OpenSongFilePage.setObjectName(u'OpenSongFilePage') - self.OpenSongFileLayout = QtGui.QFormLayout(self.OpenSongFilePage) - self.OpenSongFileLayout.setMargin(0) - self.OpenSongFileLayout.setSpacing(8) - self.OpenSongFileLayout.setObjectName(u'OpenSongFileLayout') - self.OpenSongFileLabel = QtGui.QLabel(self.OpenSongFilePage) - self.OpenSongFileLabel.setObjectName(u'OpenSongFileLabel') - self.OpenSongFileLayout.setWidget(0, - QtGui.QFormLayout.LabelRole, self.OpenSongFileLabel) - self.OpenSongFilenameLayout = QtGui.QHBoxLayout() - self.OpenSongFilenameLayout.setSpacing(8) - self.OpenSongFilenameLayout.setObjectName(u'OpenSongFilenameLayout') - self.OpenSongFilenameLineEdit = QtGui.QLineEdit(self.OpenSongFilePage) - self.OpenSongFilenameLineEdit.setObjectName(u'OpenSongFilenameLineEdit') - self.OpenSongFilenameLayout.addWidget(self.OpenSongFilenameLineEdit) - self.OpenSongFilenameButton = QtGui.QToolButton(self.OpenSongFilePage) - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(u':/imports/import_load.png'), + self.OpenLyricsPage = QtGui.QWidget() + self.OpenLyricsPage.setObjectName(u'OpenLyricsPage') + self.OpenLyricsLayout = QtGui.QVBoxLayout(self.OpenLyricsPage) + self.OpenLyricsLayout.setSpacing(8) + self.OpenLyricsLayout.setMargin(0) + self.OpenLyricsLayout.setObjectName(u'OpenLyricsLayout') + self.OpenLyricsFileListWidget = QtGui.QListWidget(self.OpenLyricsPage) + self.OpenLyricsFileListWidget.setObjectName(u'OpenLyricsFileListWidget') + self.OpenLyricsLayout.addWidget(self.OpenLyricsFileListWidget) + self.OpenLyricsButtonLayout = QtGui.QHBoxLayout() + self.OpenLyricsButtonLayout.setSpacing(8) + self.OpenLyricsButtonLayout.setObjectName(u'OpenLyricsButtonLayout') + self.OpenLyricsAddButton = QtGui.QPushButton(self.OpenLyricsPage) + self.OpenIcon = QtGui.QIcon() + self.OpenIcon.addPixmap(QtGui.QPixmap(u':/general/general_open.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.OpenSongFilenameButton.setIcon(icon) - self.OpenSongFilenameButton.setObjectName(u'OpenSongFilenameButton') - self.OpenSongFilenameLayout.addWidget(self.OpenSongFilenameButton) - self.OpenSongFileLayout.setLayout(0, - QtGui.QFormLayout.FieldRole, self.OpenSongFilenameLayout) - self.FormatStackedWidget.addWidget(self.OpenSongFilePage) - self.OpenSongDirectoryPage = QtGui.QWidget() - self.OpenSongDirectoryPage.setObjectName(u'OpenSongDirectoryPage') - self.OpenSongDirectoryLayout = QtGui.QFormLayout(self.OpenSongDirectoryPage) - self.OpenSongDirectoryLayout.setMargin(0) - self.OpenSongDirectoryLayout.setSpacing(8) - self.OpenSongDirectoryLayout.setObjectName(u'OpenSongDirectoryLayout') - self.OpenSongDirectoryLabel = QtGui.QLabel(self.OpenSongDirectoryPage) - self.OpenSongDirectoryLabel.setObjectName(u'OpenSongDirectoryLabel') - self.OpenSongDirectoryLayout.setWidget(0, - QtGui.QFormLayout.LabelRole, self.OpenSongDirectoryLabel) - self.OpenSongDirLayout = QtGui.QHBoxLayout() - self.OpenSongDirLayout.setSpacing(8) - self.OpenSongDirLayout.setObjectName(u'OpenSongDirLayout') - self.OpenSongDirectoryLineEdit = QtGui.QLineEdit(self.OpenSongDirectoryPage) - self.OpenSongDirectoryLineEdit.setObjectName(u'OpenSongDirectoryLineEdit') - self.OpenSongDirLayout.addWidget(self.OpenSongDirectoryLineEdit) - self.OpenSongDirectoryButton = QtGui.QToolButton(self.OpenSongDirectoryPage) - icon1 = QtGui.QIcon() - icon1.addPixmap(QtGui.QPixmap(u':/exports/export_load.png'), + self.DeleteIcon = QtGui.QIcon() + self.DeleteIcon.addPixmap(QtGui.QPixmap(u':/general/general_delete.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.OpenSongDirectoryButton.setIcon(icon1) - self.OpenSongDirectoryButton.setObjectName(u'OpenSongDirectoryButton') - self.OpenSongDirLayout.addWidget(self.OpenSongDirectoryButton) - self.OpenSongDirectoryLayout.setLayout(0, - QtGui.QFormLayout.FieldRole, self.OpenSongDirLayout) - self.FormatStackedWidget.addWidget(self.OpenSongDirectoryPage) + self.OpenLyricsAddButton.setIcon(self.OpenIcon) + self.OpenLyricsAddButton.setObjectName(u'OpenLyricsAddButton') + self.OpenLyricsButtonLayout.addWidget(self.OpenLyricsAddButton) + self.OpenLyricsButtonSpacer = QtGui.QSpacerItem(40, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.OpenLyricsButtonLayout.addItem(self.OpenLyricsButtonSpacer) + self.OpenLyricsRemoveButton = QtGui.QPushButton(self.OpenLyricsPage) + self.OpenLyricsRemoveButton.setIcon(self.DeleteIcon) + self.OpenLyricsRemoveButton.setObjectName(u'OpenLyricsRemoveButton') + self.OpenLyricsButtonLayout.addWidget(self.OpenLyricsRemoveButton) + self.OpenLyricsLayout.addLayout(self.OpenLyricsButtonLayout) + self.FormatStackedWidget.addWidget(self.OpenLyricsPage) + self.OpenSongPage = QtGui.QWidget() + self.OpenSongPage.setObjectName(u'OpenSongPage') + self.OpenSongLayout = QtGui.QVBoxLayout(self.OpenSongPage) + self.OpenSongLayout.setSpacing(8) + self.OpenSongLayout.setMargin(0) + self.OpenSongLayout.setObjectName(u'OpenSongLayout') + self.OpenSongFileListWidget = QtGui.QListWidget(self.OpenSongPage) + self.OpenSongFileListWidget.setObjectName(u'OpenSongFileListWidget') + self.OpenSongLayout.addWidget(self.OpenSongFileListWidget) + self.OpenSongButtonLayout = QtGui.QHBoxLayout() + self.OpenSongButtonLayout.setSpacing(8) + self.OpenSongButtonLayout.setObjectName(u'OpenSongButtonLayout') + self.OpenSongAddButton = QtGui.QPushButton(self.OpenSongPage) + self.OpenSongAddButton.setIcon(self.OpenIcon) + self.OpenSongAddButton.setObjectName(u'OpenSongAddButton') + self.OpenSongButtonLayout.addWidget(self.OpenSongAddButton) + self.OpenSongButtonSpacer = QtGui.QSpacerItem(40, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.OpenSongButtonLayout.addItem(self.OpenSongButtonSpacer) + self.OpenSongRemoveButton = QtGui.QPushButton(self.OpenSongPage) + self.OpenSongRemoveButton.setIcon(self.DeleteIcon) + self.OpenSongRemoveButton.setObjectName(u'OpenSongRemoveButton') + self.OpenSongButtonLayout.addWidget(self.OpenSongRemoveButton) + self.OpenSongLayout.addLayout(self.OpenSongButtonLayout) + self.FormatStackedWidget.addWidget(self.OpenSongPage) + self.CCLIPage = QtGui.QWidget() + self.CCLIPage.setObjectName(u'CCLIPage') + self.CCLILayout = QtGui.QVBoxLayout(self.CCLIPage) + self.CCLILayout.setSpacing(8) + self.CCLILayout.setMargin(0) + self.CCLILayout.setObjectName(u'CCLILayout') + self.CCLIFileListWidget = QtGui.QListWidget(self.CCLIPage) + self.CCLIFileListWidget.setObjectName(u'CCLIFileListWidget') + self.CCLILayout.addWidget(self.CCLIFileListWidget) + self.CCLIButtonLayout = QtGui.QHBoxLayout() + self.CCLIButtonLayout.setSpacing(8) + self.CCLIButtonLayout.setObjectName(u'CCLIButtonLayout') + self.CCLIAddButton = QtGui.QPushButton(self.CCLIPage) + self.CCLIAddButton.setIcon(self.OpenIcon) + self.CCLIAddButton.setObjectName(u'CCLIAddButton') + self.CCLIButtonLayout.addWidget(self.CCLIAddButton) + self.CCLIButtonSpacer = QtGui.QSpacerItem(40, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.CCLIButtonLayout.addItem(self.CCLIButtonSpacer) + self.CCLIRemoveButton = QtGui.QPushButton(self.CCLIPage) + self.CCLIRemoveButton.setIcon(self.DeleteIcon) + self.CCLIRemoveButton.setObjectName(u'CCLIRemoveButton') + self.CCLIButtonLayout.addWidget(self.CCLIRemoveButton) + self.CCLILayout.addLayout(self.CCLIButtonLayout) + self.FormatStackedWidget.addWidget(self.CCLIPage) + self.CSVPage = QtGui.QWidget() + self.CSVPage.setObjectName(u'CSVPage') + self.CSVLayout = QtGui.QFormLayout(self.CSVPage) + self.CSVLayout.setMargin(0) + self.CSVLayout.setSpacing(8) + self.CSVLayout.setObjectName(u'CSVLayout') + self.CSVFilenameLabel = QtGui.QLabel(self.CSVPage) + self.CSVFilenameLabel.setObjectName(u'CSVFilenameLabel') + self.CSVLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.CSVFilenameLabel) + self.CSVFileLayout = QtGui.QHBoxLayout() + self.CSVFileLayout.setSpacing(8) + self.CSVFileLayout.setObjectName(u'CSVFileLayout') + self.CSVFilenameEdit = QtGui.QLineEdit(self.CSVPage) + self.CSVFilenameEdit.setObjectName(u'CSVFilenameEdit') + self.CSVFileLayout.addWidget(self.CSVFilenameEdit) + self.CSVBrowseButton = QtGui.QToolButton(self.CSVPage) + self.CSVBrowseButton.setIcon(self.OpenIcon) + self.CSVBrowseButton.setObjectName(u'CSVBrowseButton') + self.CSVFileLayout.addWidget(self.CSVBrowseButton) + self.CSVLayout.setLayout(0, QtGui.QFormLayout.FieldRole, self.CSVFileLayout) + self.FormatStackedWidget.addWidget(self.CSVPage) self.SourceLayout.addWidget(self.FormatStackedWidget) SongImportWizard.addPage(self.SourcePage) self.ImportPage = QtGui.QWizardPage() @@ -164,7 +213,6 @@ class Ui_SongImportWizard(object): self.ImportProgressBar.setObjectName(u'ImportProgressBar') self.ImportLayout.addWidget(self.ImportProgressBar) SongImportWizard.addPage(self.ImportPage) - self.OpenSongFileLabel.setBuddy(self.OpenSongFilenameLineEdit) self.retranslateUi(SongImportWizard) self.FormatStackedWidget.setCurrentIndex(0) @@ -177,23 +225,9 @@ class Ui_SongImportWizard(object): def retranslateUi(self, SongImportWizard): SongImportWizard.setWindowTitle(self.trUtf8('Song Import Wizard')) - self.TitleLabel.setText(self.trUtf8( - '\n' - '\n' - ' \n' - ' \n' - ' \n' - ' \n' - ' \n' - '

\n' - ' \n' - ' Welcome to the Song Import Wizard\n' - ' \n' - '

\n' - ' \n' - '' - )) + self.TitleLabel.setText( + '%s' % \ + self.trUtf8('Welcome to the Song Import Wizard')) self.InformationLabel.setText(self.trUtf8('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.')) @@ -201,10 +235,18 @@ class Ui_SongImportWizard(object): self.SourcePage.setSubTitle(self.trUtf8('Select the import format, ' 'and where to import from.')) self.FormatLabel.setText(self.trUtf8('Format:')) - self.FormatComboBox.setItemText(0, self.trUtf8('OpenSong (Single File)')) - self.FormatComboBox.setItemText(1, self.trUtf8('OpenSong (Directory of Files)')) - self.OpenSongFileLabel.setText(self.trUtf8('Filename:')) - self.OpenSongDirectoryLabel.setText(self.trUtf8('Directory:')) + self.FormatComboBox.setItemText(0, self.trUtf8('OpenLyrics')) + self.FormatComboBox.setItemText(1, self.trUtf8('OpenSong')) + self.FormatComboBox.setItemText(2, self.trUtf8('CCLI')) + self.FormatComboBox.setItemText(3, self.trUtf8('CSV')) + self.OpenLyricsAddButton.setText(self.trUtf8('Add Files...')) + self.OpenLyricsRemoveButton.setText(self.trUtf8('Remove File(s)')) + self.OpenSongAddButton.setText(self.trUtf8('Add Files...')) + self.OpenSongRemoveButton.setText(self.trUtf8('Remove File(s)')) + self.CCLIAddButton.setText(self.trUtf8('Add Files...')) + self.CCLIRemoveButton.setText(self.trUtf8('Remove File(s)')) + self.CSVFilenameLabel.setText(self.trUtf8('Filename:')) + self.CSVBrowseButton.setText(self.trUtf8('Browse...')) self.ImportPage.setTitle(self.trUtf8('Importing')) self.ImportPage.setSubTitle(self.trUtf8('Please wait while your songs ' 'are imported.')) diff --git a/openlp/plugins/songs/lib/manager.py b/openlp/plugins/songs/lib/manager.py index 87f0e6132..c49b31d86 100644 --- a/openlp/plugins/songs/lib/manager.py +++ b/openlp/plugins/songs/lib/manager.py @@ -30,7 +30,51 @@ from openlp.plugins.songs.lib.models import init_models, metadata, Song, \ log = logging.getLogger(__name__) -class SongManager(): +class SongFormat(object): + """ + This is a special enumeration class that holds the various types of songs, + plus a few helper functions to facilitate generic handling of song types + for importing. + """ + Unknown = -1 + OpenLyrics = 0 + OpenSongFile = 1 + OpenSongDirectory = 2 + CSV = 3 + + @staticmethod + def get_class(id): + """ + Return the appropriate imeplementation class. + + ``id`` + The Bible format. + """ + if id == BibleFormat.OSIS: + return OSISBible + elif id == BibleFormat.CSV: + return CSVBible + elif id == BibleFormat.OpenSong: + return OpenSongBible + elif id == BibleFormat.WebDownload: + return HTTPBible + else: + return None + + @staticmethod + def list(): + """ + Return a list of the supported Bible formats. + """ + return [ + BibleFormat.OSIS, + BibleFormat.CSV, + BibleFormat.OpenSong, + BibleFormat.WebDownload + ] + + +class SongManager(object): """ The Song Manager provides a central location for all database code. This class takes care of connecting to the database and running all the queries. diff --git a/resources/forms/songimportwizard.ui b/resources/forms/songimportwizard.ui index 1495d88c0..6679efb38 100644 --- a/resources/forms/songimportwizard.ui +++ b/resources/forms/songimportwizard.ui @@ -156,12 +156,22 @@ p, li { white-space: pre-wrap; } - OpenSong (Single File) + OpenLyrics - OpenSong (Directory of Files) + OpenSong + + + + + CCLI + + + + + CSV
@@ -184,45 +194,56 @@ p, li { white-space: pre-wrap; } - 0 + 3 - - - - 8 - - + + + 8 0 - - - - Filename: - - - OpenSongFilenameLineEdit - - + + - - + + 8 - - - - + - + Add Files... - :/imports/import_load.png:/imports/import_load.png + :/general/general_open.png:/general/general_open.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Remove File(s) + + + + :/general/general_delete.png:/general/general_delete.png @@ -230,8 +251,118 @@ p, li { white-space: pre-wrap; } - - + + + + 8 + + + 0 + + + + + + + + 8 + + + + + Add Files... + + + + :/general/general_open.png:/general/general_open.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Remove File(s) + + + + :/general/general_delete.png:/general/general_delete.png + + + + + + + + + + + 8 + + + 0 + + + + + + + + 8 + + + + + Add Files... + + + + :/general/general_open.png:/general/general_open.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Remove File(s) + + + + :/general/general_delete.png:/general/general_delete.png + + + + + + + + + 8 @@ -242,28 +373,28 @@ p, li { white-space: pre-wrap; } 0 - + - Directory: + Filename: - + 8 - + - + - + Browse... - :/exports/export_load.png:/exports/export_load.png + :/general/general_open.png:/general/general_open.png From f955c8d096c46d8506969d99eeafb999908d53af Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 3 Apr 2010 02:13:07 +0200 Subject: [PATCH 07/81] Added a SongXML class to read the lyrics of songs. --- .../plugins/bibles/forms/importwizardform.py | 2 +- openlp/plugins/bibles/lib/csvbible.py | 2 +- openlp/plugins/bibles/lib/opensong.py | 2 +- openlp/plugins/bibles/lib/osis.py | 2 +- openlp/plugins/songs/forms/songimportform.py | 206 ++++++------------ openlp/plugins/songs/lib/manager.py | 38 ++-- openlp/plugins/songs/lib/xml.py | 138 ++++++++++++ 7 files changed, 227 insertions(+), 163 deletions(-) create mode 100644 openlp/plugins/songs/lib/xml.py diff --git a/openlp/plugins/bibles/forms/importwizardform.py b/openlp/plugins/bibles/forms/importwizardform.py index a717a4f44..fd012955f 100644 --- a/openlp/plugins/bibles/forms/importwizardform.py +++ b/openlp/plugins/bibles/forms/importwizardform.py @@ -240,7 +240,7 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard): """ log.debug('Cancel button pressed!') if self.currentId() == 3: - Receiver.send_message(u'openlpstopimport') + Receiver.send_message(u'openlp_stop_bible_import') def onCurrentIdChanged(self, id): if id == 3: diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 2f40e4b96..0b8795a1d 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -52,7 +52,7 @@ class CSVBible(BibleDB): raise KeyError(u'You have to supply a file to import verses from.') self.versesfile = kwargs[u'versesfile'] QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'openlpstopimport'), self.stop_import) + QtCore.SIGNAL(u'openlp_stop_bible_import'), self.stop_import) def stop_import(self): """ diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 2f7e3e451..3ace72197 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -49,7 +49,7 @@ class OpenSongBible(BibleDB): raise KeyError(u'You have to supply a file name to import from.') self.filename = kwargs['filename'] QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'openlpstopimport'), self.stop_import) + QtCore.SIGNAL(u'openlp_stop_bible_import'), self.stop_import) def stop_import(self): """ diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 4416bb2c6..53107215c 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -84,7 +84,7 @@ class OSISBible(BibleDB): if fbibles: fbibles.close() QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'openlpstopimport'), self.stop_import) + QtCore.SIGNAL(u'openlp_stop_bible_import'), self.stop_import) def stop_import(self): """ diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index fc652a1e7..5d75abc17 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 songimportwizard import Ui_SongImportWizard #from openlp.core.lib import Receiver #from openlp.core.utils import AppLocation, variant_to_unicode -#from openlp.plugins.bibles.lib.manager import BibleFormat +from openlp.plugins.songs.lib.manager import SongFormat log = logging.getLogger(__name__) @@ -62,18 +62,13 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard): """ QtGui.QWizard.__init__(self, parent) self.setupUi(self) - #self.registerFields() + self.registerFields() self.finishButton = self.button(QtGui.QWizard.FinishButton) self.cancelButton = self.button(QtGui.QWizard.CancelButton) self.manager = manager self.config = config self.songsplugin = songsplugin #self.manager.set_process_dialog(self) - #self.web_bible_list = {} - #self.loadWebBibles() - #QtCore.QObject.connect(self.LocationComboBox, -# QtCore.SIGNAL(u'currentIndexChanged(int)'), -# self.onLocationComboBoxChanged) # QtCore.QObject.connect(self.OsisFileButton, # QtCore.SIGNAL(u'clicked()'), # self.onOsisFileButtonClicked) @@ -89,96 +84,67 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard): QtCore.QObject.connect(self.cancelButton, QtCore.SIGNAL(u'clicked(bool)'), self.onCancelButtonClicked) -# QtCore.QObject.connect(self, -# QtCore.SIGNAL(u'currentIdChanged(int)'), -# self.onCurrentIdChanged) + QtCore.QObject.connect(self, + QtCore.SIGNAL(u'currentIdChanged(int)'), + self.onCurrentIdChanged) def exec_(self): """ Run the wizard. """ - #self.setDefaults() + self.setDefaults() return QtGui.QWizard.exec_(self) def validateCurrentPage(self): """ Validate the current page before moving on to the next page. """ - return True -# if self.currentId() == 0: -# # Welcome page -# return True -# elif self.currentId() == 1: -# # Select page -# if self.field(u'source_format').toInt()[0] == BibleFormat.OSIS: -# if self.field(u'osis_location').toString() == u'': -# QtGui.QMessageBox.critical(self, -# self.trUtf8('Invalid Bible Location'), -# self.trUtf8('You need to specify a file to import your ' -# 'Bible from.'), -# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) -# self.OSISLocationEdit.setFocus() -# return False -# elif self.field(u'source_format').toInt()[0] == BibleFormat.CSV: -# if self.field(u'csv_booksfile').toString() == u'': -# QtGui.QMessageBox.critical(self, -# self.trUtf8('Invalid Books File'), -# self.trUtf8('You need to specify a file with books of ' -# 'the Bible to use in the import.'), -# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) -# self.BooksLocationEdit.setFocus() -# return False -# elif self.field(u'csv_versefile').toString() == u'': -# QtGui.QMessageBox.critical(self, -# self.trUtf8('Invalid Verse File'), -# self.trUtf8('You need to specify a file of Bible ' -# 'verses to import.'), -# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) -# self.CsvVerseLocationEdit.setFocus() -# return False -# elif self.field(u'source_format').toInt()[0] == BibleFormat.OpenSong: -# if self.field(u'opensong_file').toString() == u'': -# QtGui.QMessageBox.critical(self, -# self.trUtf8('Invalid OpenSong Bible'), -# self.trUtf8('You need to specify an OpenSong Bible ' -# 'file to import.'), -# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) -# self.OpenSongFileEdit.setFocus() -# return False -# return True -# elif self.currentId() == 2: -# # License details -# license_version = variant_to_unicode(self.field(u'license_version')) -# license_copyright = variant_to_unicode(self.field(u'license_copyright')) -# if license_version == u'': -# QtGui.QMessageBox.critical(self, -# self.trUtf8('Empty Version Name'), -# self.trUtf8('You need to specify a version name for your ' -# 'Bible.'), -# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) -# self.VersionNameEdit.setFocus() -# return False -# elif license_copyright == u'': -# QtGui.QMessageBox.critical(self, -# self.trUtf8('Empty Copyright'), -# self.trUtf8('You need to set a copyright for your Bible! ' -# 'Bibles in the Public Domain need to be marked as ' -# 'such.'), -# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) -# self.CopyrightEdit.setFocus() -# return False -# elif self.manager.exists(license_version): -# QtGui.QMessageBox.critical(self, -# self.trUtf8('Bible Exists'), -# self.trUtf8('This Bible already exists! Please import ' -# 'a different Bible or first delete the existing one.'), -# QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) -# self.VersionNameEdit.setFocus() -# return False -# return True -# if self.currentId() == 3: -# # Progress page -# return True + if self.currentId() == 0: + # Welcome page + return True + elif self.currentId() == 1: + # Select page + source_format = self.field(u'source_format').toInt()[0] + if source_format == SongFormat.OpenLyrics: + if self.OpenLyricsFileListWidget.count() == 0: + QtGui.QMessageBox.critical(self, + self.trUtf8('No OpenLyrics Files Selected'), + self.trUtf8('You need to add at least one OpenLyrics ' + 'song file to import from.'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.OpenLyricsAddButton.setFocus() + return False + elif source_format == SongFormat.OpenSong: + if self.OpenSongFileListWidget.count() == 0: + QtGui.QMessageBox.critical(self, + self.trUtf8('No OpenSong Files Selected'), + self.trUtf8('You need to add at least one OpenSong ' + 'song file to import from.'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.OpenSongAddButton.setFocus() + return False + elif source_format == SongFormat.CCLI: + if self.CCLIFileListWidget.count() == 0: + QtGui.QMessageBox.critical(self, + self.trUtf8('No CCLI Files Selected'), + self.trUtf8('You need to add at least one CCLI file ' + 'to import from.'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.CCLIAddButton.setFocus() + return False + elif source_format == SongFormat.CSV: + if self.CSVFilenameEdit.text().isEmpty(): + QtGui.QMessageBox.critical(self, + self.trUtf8('No CSV File Selected'), + self.trUtf8('You need to specify a CSV file to import ' + 'from.'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.CSVFilenameEdit.setFocus() + return False + return True + elif self.currentId() == 2: + # Progress page + return True def onCancelButtonClicked(self, checked): """ @@ -186,62 +152,23 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard): """ log.debug('Cancel button pressed!') if self.currentId() == 3: - Receiver.send_message(u'openlpstopimport') + Receiver.send_message(u'openlp_stop_song_import') -# def onCurrentIdChanged(self, id): -# if id == 3: -# self.preImport() -# self.performImport() -# self.postImport() + def onCurrentIdChanged(self, id): + if id == 3: + self.preImport() + self.performImport() + self.postImport() def registerFields(self): - pass -# self.SourcePage.registerField( -# u'source_format', self.FormatComboBox) -# self.SourcePage.registerField( -# u'openlyrics_filename', self.OpenLyricsFilenameEdit) -# self.SourcePage.registerField( -# u'openlyrics_directory', self.OpenLyricsDirectoryEdit) -# self.SourcePage.registerField( -# u'opensong_filename', self.OpenSongFilenameEdit) -# self.SourcePage.registerField( -# u'opensong_directory', self.OpenSongDirectoryEdit) -# self.SourcePage.registerField( -# u'csv_versefile', self.CsvVerseLocationEdit) -# self.SourcePage.registerField( -# u'opensong_file', self.OpenSongFileEdit) -# self.SourcePage.registerField( -# u'web_location', self.LocationComboBox) -# self.SourcePage.registerField( -# u'web_biblename', self.BibleComboBox) -# self.SourcePage.registerField( -# u'proxy_server', self.AddressEdit) -# self.SourcePage.registerField( -# u'proxy_username', self.UsernameEdit) -# self.SourcePage.registerField( -# u'proxy_password', self.PasswordEdit) + self.SourcePage.registerField(u'source_format', self.FormatComboBox) def setDefaults(self): - pass -# self.setField(u'source_format', QtCore.QVariant(0)) -# self.setField(u'openlyrics_filename', QtCore.QVariant('')) -# self.setField(u'openlyrics_directory', QtCore.QVariant('')) -# self.setField(u'opensong_filename', QtCore.QVariant('')) -# self.setField(u'opensong_directory', QtCore.QVariant('')) -# self.setField(u'csv_versefile', QtCore.QVariant('')) -# self.setField(u'opensong_file', QtCore.QVariant('')) -# self.setField(u'web_location', QtCore.QVariant(WebDownload.Crosswalk)) -# self.setField(u'web_biblename', QtCore.QVariant(self.BibleComboBox)) -# self.setField(u'proxy_server', -# QtCore.QVariant(self.config.get_config(u'proxy address', ''))) -# self.setField(u'proxy_username', -# QtCore.QVariant(self.config.get_config(u'proxy username',''))) -# self.setField(u'proxy_password', -# QtCore.QVariant(self.config.get_config(u'proxy password',''))) -# self.setField(u'license_version', QtCore.QVariant(self.VersionNameEdit)) -# self.setField(u'license_copyright', QtCore.QVariant(self.CopyrightEdit)) -# self.setField(u'license_permission', QtCore.QVariant(self.PermissionEdit)) -# self.onLocationComboBoxChanged(WebDownload.Crosswalk) + self.setField(u'source_format', QtCore.QVariant(0)) + self.OpenLyricsFileListWidget.clear() + self.OpenSongFileListWidget.clear() + self.CCLIFileListWidget.clear() + self.CSVFilenameEdit.setText(u'') def getFileName(self, title, editbox): filename = QtGui.QFileDialog.getOpenFileName(self, title, @@ -266,10 +193,7 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard): def performImport(self): pass -# bible_type = self.field(u'source_format').toInt()[0] -# license_version = variant_to_unicode(self.field(u'license_version')) -# license_copyright = variant_to_unicode(self.field(u'license_copyright')) -# license_permission = variant_to_unicode(self.field(u'license_permission')) +# source_format = self.field(u'source_format').toInt()[0] # importer = None # if bible_type == BibleFormat.OSIS: # # Import an OSIS bible diff --git a/openlp/plugins/songs/lib/manager.py b/openlp/plugins/songs/lib/manager.py index c49b31d86..73e1c1f05 100644 --- a/openlp/plugins/songs/lib/manager.py +++ b/openlp/plugins/songs/lib/manager.py @@ -27,6 +27,8 @@ import logging from openlp.plugins.songs.lib.models import init_models, metadata, Song, \ Author, Topic, Book +#from openlp.plugins.songs.lib import OpenLyricsSong, OpenSongSong, CCLISong, \ +# CSVSong log = logging.getLogger(__name__) @@ -38,8 +40,8 @@ class SongFormat(object): """ Unknown = -1 OpenLyrics = 0 - OpenSongFile = 1 - OpenSongDirectory = 2 + OpenSong = 1 + CCLI = 2 CSV = 3 @staticmethod @@ -48,29 +50,29 @@ class SongFormat(object): Return the appropriate imeplementation class. ``id`` - The Bible format. + The song format. """ - if id == BibleFormat.OSIS: - return OSISBible - elif id == BibleFormat.CSV: - return CSVBible - elif id == BibleFormat.OpenSong: - return OpenSongBible - elif id == BibleFormat.WebDownload: - return HTTPBible - else: - return None +# if id == SongFormat.OpenLyrics: +# return OpenLyricsSong +# elif id == SongFormat.OpenSong: +# return OpenSongSong +# elif id == SongFormat.CCLI: +# return CCLISong +# elif id == SongFormat.CSV: +# return CSVSong +# else: + return None @staticmethod def list(): """ - Return a list of the supported Bible formats. + Return a list of the supported song formats. """ return [ - BibleFormat.OSIS, - BibleFormat.CSV, - BibleFormat.OpenSong, - BibleFormat.WebDownload + SongFormat.OpenLyrics, + SongFormat.OpenSong, + SongFormat.CCLI, + SongFormat.CSV ] diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py new file mode 100644 index 000000000..f1010bbf5 --- /dev/null +++ b/openlp/plugins/songs/lib/xml.py @@ -0,0 +1,138 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # +# Thompson, Jon Tibble, Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +from lxml import objectify + +class SongXML(object): + """ + This class represents the XML in the ``lyrics`` field of a song. + + The basic XML looks like this:: + + + + + + + + + + """ + def __init__(self, song=None): + if song: + if song.lyrics.startswith(u'' % \ + (verse[u'type'], verse[u'label'], verse[u'text']) + lyrics_output = lyrics_output + \ + u'%s' % \ + (lyrics[u'language'], verse_output) + song_output = u'' + \ + u'%s' % lyrics_output + return song_output + From 646d8a658ce157f3fd2b1ccba5ec5d1929f230c5 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 3 Apr 2010 18:43:29 +0200 Subject: [PATCH 08/81] A few changes. --- openlp/plugins/songs/lib/xml.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index f1010bbf5..51fbad6b0 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -25,7 +25,7 @@ from lxml import objectify -class SongXML(object): +class LyricsXML(object): """ This class represents the XML in the ``lyrics`` field of a song. @@ -47,7 +47,7 @@ class SongXML(object): else: self.extract(song.lyrics) else: - self.lyrics = [] + self.languages = [] def parse(self, xml): """ @@ -58,20 +58,20 @@ class SongXML(object): The XML to parse. """ try: - self.lyrics = [] + self.languages = [] song = objectify.fromstring(xml) for lyrics in song.lyrics: - lyrlang = { + language = { u'language': lyrics.attrib[u'language'], u'verses': [] } for verse in lyrics.verse: - lyrlang[u'verses'].append({ + language[u'verses'].append({ u'type': verse.attrib[u'type'], u'label': verse.attrib[u'label'], u'text': unicode(verse.text) }) - self.lyrics.append(lyrlang) + self.lyrics.append(language) return True except: return False @@ -87,11 +87,11 @@ class SongXML(object): """ text = text.replace('\r\n', '\n') verses = text.split('\n\n') - self.lyrics = [{u'language': u'en', u'verses': []}] + self.languages = [{u'language': u'en', u'verses': []}] counter = 0 for verse in verses: counter = counter + 1 - self.lyrics[0][u'verses'].append({ + self.languages[0][u'verses'].append({ u'type': u'verse', u'label': unicode(counter), u'text': verse @@ -123,15 +123,15 @@ class SongXML(object): Build up the XML for the verse structure. """ lyrics_output = u'' - for lyrics in self.lyrics: + for language in self.languages: verse_output = u'' - for verse in lyrics[u'verses']: + for verse in language[u'verses']: verse_output = verse_output + \ u'' % \ (verse[u'type'], verse[u'label'], verse[u'text']) lyrics_output = lyrics_output + \ u'%s' % \ - (lyrics[u'language'], verse_output) + (language[u'language'], verse_output) song_output = u'' + \ u'%s' % lyrics_output return song_output From 513b7a10b72445cab37329d428c5943ca46b0159 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 4 Apr 2010 01:00:05 +0200 Subject: [PATCH 09/81] Reworked the verse dialog. --- openlp/plugins/songs/forms/editsongform.py | 9 +- openlp/plugins/songs/forms/editversedialog.py | 153 +++++------ openlp/plugins/songs/forms/editverseform.py | 225 ++++++++-------- openlp/plugins/songs/lib/mediaitem.py | 5 +- resources/forms/editversedialog.ui | 248 +++++++----------- 5 files changed, 285 insertions(+), 355 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index a369e46a1..636ac754a 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -41,7 +41,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): """ log.info(u'%s EditSongForm loaded', __name__) - def __init__(self, songmanager, parent=None): + def __init__(self, parent, songmanager): """ Constructor """ @@ -106,7 +106,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): QtCore.SIGNAL(u'clicked(QAbstractButton*)'), self.onPreview) # Create other objects and forms self.songmanager = songmanager - self.verse_form = EditVerseForm() + self.verse_form = EditVerseForm(self) self.initialise() self.AuthorsListView.setSortingEnabled(False) self.AuthorsListView.setAlternatingRowColors(True) @@ -317,7 +317,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.VerseDeleteButton.setEnabled(True) def onVerseAddButtonClicked(self): - self.verse_form.setVerse(u'', self.VerseListWidget.count() + 1, True) + self.verse_form.setVerse(u'', True) if self.verse_form.exec_(): afterText, verse, subVerse = self.verse_form.getVerse() data = u'%s:%s' %(verse, subVerse) @@ -331,8 +331,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): if item: tempText = item.text() verseId = unicode((item.data(QtCore.Qt.UserRole)).toString()) - self.verse_form.setVerse(tempText, \ - self.VerseListWidget.count(), True, verseId) + self.verse_form.setVerse(tempText, True, verseId) if self.verse_form.exec_(): afterText, verse, subVerse = self.verse_form.getVerse() data = u'%s:%s' %(verse, subVerse) diff --git a/openlp/plugins/songs/forms/editversedialog.py b/openlp/plugins/songs/forms/editversedialog.py index 7829e2c27..b8b83b614 100644 --- a/openlp/plugins/songs/forms/editversedialog.py +++ b/openlp/plugins/songs/forms/editversedialog.py @@ -28,102 +28,75 @@ from PyQt4 import QtCore, QtGui class Ui_EditVerseDialog(object): def setupUi(self, EditVerseDialog): EditVerseDialog.setObjectName(u'EditVerseDialog') - EditVerseDialog.resize(500, 521) + EditVerseDialog.resize(474, 442) EditVerseDialog.setModal(True) - self.layoutWidget = QtGui.QWidget(EditVerseDialog) - self.layoutWidget.setGeometry(QtCore.QRect(11, 1, 471, 491)) - self.layoutWidget.setObjectName(u'layoutWidget') - self.verticalLayout_3 = QtGui.QVBoxLayout(self.layoutWidget) - self.verticalLayout_3.setObjectName(u'verticalLayout_3') - self.horizontalLayout = QtGui.QHBoxLayout() - self.horizontalLayout.setObjectName(u'horizontalLayout') - self.verticalLayout = QtGui.QVBoxLayout() - self.verticalLayout.setObjectName(u'verticalLayout') - self.VerseTypeLabel = QtGui.QLabel(self.layoutWidget) - self.VerseTypeLabel.setTextFormat(QtCore.Qt.PlainText) - self.VerseTypeLabel.setAlignment(QtCore.Qt.AlignCenter) - self.VerseTypeLabel.setObjectName(u'VerseTypeLabel') - self.verticalLayout.addWidget(self.VerseTypeLabel) - self.VerseListComboBox = QtGui.QComboBox(self.layoutWidget) - self.VerseListComboBox.setObjectName(u'VerseListComboBox') - self.VerseListComboBox.addItem(u'') - self.VerseListComboBox.addItem(u'') - self.VerseListComboBox.addItem(u'') - self.VerseListComboBox.addItem(u'') - self.VerseListComboBox.addItem(u'') - self.VerseListComboBox.addItem(u'') - self.VerseListComboBox.addItem(u'') - self.verticalLayout.addWidget(self.VerseListComboBox) - self.horizontalLayout.addLayout(self.verticalLayout) - self.verticalLayout_2 = QtGui.QVBoxLayout() - self.verticalLayout_2.setObjectName(u'verticalLayout_2') - self.VerseNumberLabel = QtGui.QLabel(self.layoutWidget) - self.VerseNumberLabel.setAlignment(QtCore.Qt.AlignCenter) - self.VerseNumberLabel.setObjectName(u'VerseNumberLabel') - self.verticalLayout_2.addWidget(self.VerseNumberLabel) - self.SubVerseListComboBox = QtGui.QComboBox(self.layoutWidget) - self.SubVerseListComboBox.setObjectName(u'SubVerseListComboBox') - self.verticalLayout_2.addWidget(self.SubVerseListComboBox) - self.horizontalLayout.addLayout(self.verticalLayout_2) - self.verticalLayout_3.addLayout(self.horizontalLayout) - self.VerseTextEdit = QtGui.QTextEdit(self.layoutWidget) - self.VerseTextEdit.setAcceptRichText(False) + self.EditVerseLayout = QtGui.QVBoxLayout(EditVerseDialog) + self.EditVerseLayout.setSpacing(8) + self.EditVerseLayout.setMargin(8) + self.EditVerseLayout.setObjectName(u'EditVerseLayout') + self.VerseTextEdit = QtGui.QPlainTextEdit(EditVerseDialog) self.VerseTextEdit.setObjectName(u'VerseTextEdit') - self.verticalLayout_3.addWidget(self.VerseTextEdit) - self.horizontalLayout_2 = QtGui.QHBoxLayout() - self.horizontalLayout_2.setObjectName(u'horizontalLayout_2') - self.addBridge = QtGui.QPushButton(self.layoutWidget) - self.addBridge.setObjectName(u'addBridge') - self.horizontalLayout_2.addWidget(self.addBridge) - self.addVerse = QtGui.QPushButton(self.layoutWidget) - self.addVerse.setObjectName(u'addVerse') - self.horizontalLayout_2.addWidget(self.addVerse) - self.addChorus = QtGui.QPushButton(self.layoutWidget) - self.addChorus.setObjectName(u'addChorus') - self.horizontalLayout_2.addWidget(self.addChorus) - self.verticalLayout_3.addLayout(self.horizontalLayout_2) - self.horizontalLayout_3 = QtGui.QHBoxLayout() - self.horizontalLayout_3.setObjectName(u'horizontalLayout_3') - self.addPreChorus = QtGui.QPushButton(self.layoutWidget) - self.addPreChorus.setObjectName(u'addPreChorus') - self.horizontalLayout_3.addWidget(self.addPreChorus) - self.addIntro = QtGui.QPushButton(self.layoutWidget) - self.addIntro.setObjectName(u'addIntro') - self.horizontalLayout_3.addWidget(self.addIntro) - self.addOther = QtGui.QPushButton(self.layoutWidget) - self.addOther.setObjectName(u'addOther') - self.horizontalLayout_3.addWidget(self.addOther) - self.addEnding = QtGui.QPushButton(self.layoutWidget) - self.addEnding.setObjectName(u'addEnding') - self.horizontalLayout_3.addWidget(self.addEnding) - self.verticalLayout_3.addLayout(self.horizontalLayout_3) - self.ButtonBox = QtGui.QDialogButtonBox(self.layoutWidget) - self.ButtonBox.setOrientation(QtCore.Qt.Horizontal) - self.ButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) - self.ButtonBox.setObjectName(u'ButtonBox') - self.verticalLayout_3.addWidget(self.ButtonBox) + self.EditVerseLayout.addWidget(self.VerseTextEdit) + self.VerseTypeLayout = QtGui.QHBoxLayout() + self.VerseTypeLayout.setSpacing(8) + self.VerseTypeLayout.setObjectName(u'VerseTypeLayout') + self.VerseTypeLabel = QtGui.QLabel(EditVerseDialog) + self.VerseTypeLabel.setObjectName(u'VerseTypeLabel') + self.VerseTypeLayout.addWidget(self.VerseTypeLabel) + self.VerseTypeComboBox = QtGui.QComboBox(EditVerseDialog) + self.VerseTypeComboBox.setObjectName(u'VerseTypeComboBox') + self.VerseTypeComboBox.addItem(u'') + self.VerseTypeComboBox.addItem(u'') + self.VerseTypeComboBox.addItem(u'') + self.VerseTypeComboBox.addItem(u'') + self.VerseTypeComboBox.addItem(u'') + self.VerseTypeComboBox.addItem(u'') + self.VerseTypeComboBox.addItem(u'') + self.VerseTypeLayout.addWidget(self.VerseTypeComboBox) + self.VerseNumberBox = QtGui.QSpinBox(EditVerseDialog) + self.VerseNumberBox.setMinimum(1) + self.VerseNumberBox.setObjectName(u'VerseNumberBox') + self.VerseTypeLayout.addWidget(self.VerseNumberBox) + self.InsertButton = QtGui.QPushButton(EditVerseDialog) + self.AddIcon = QtGui.QIcon() + self.AddIcon.addPixmap(QtGui.QPixmap(u':/general/general_add.png'), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.InsertButton.setIcon(self.AddIcon) + self.InsertButton.setObjectName(u'InsertButton') + self.VerseTypeLayout.addWidget(self.InsertButton) + self.VerseTypeSpacer = QtGui.QSpacerItem(40, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.VerseTypeLayout.addItem(self.VerseTypeSpacer) + self.EditVerseLayout.addLayout(self.VerseTypeLayout) + self.EditButtonBox = QtGui.QDialogButtonBox(EditVerseDialog) + self.EditButtonBox.setOrientation(QtCore.Qt.Horizontal) + self.EditButtonBox.setStandardButtons( + QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Save) + self.EditButtonBox.setObjectName(u'EditButtonBox') + self.EditVerseLayout.addWidget(self.EditButtonBox) self.retranslateUi(EditVerseDialog) - QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'accepted()'), EditVerseDialog.accept) - QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'rejected()'), EditVerseDialog.reject) + QtCore.QObject.connect( + self.EditButtonBox, + QtCore.SIGNAL(u'accepted()'), + EditVerseDialog.accept + ) + QtCore.QObject.connect( + self.EditButtonBox, + QtCore.SIGNAL(u'rejected()'), + EditVerseDialog.reject + ) QtCore.QMetaObject.connectSlotsByName(EditVerseDialog) def retranslateUi(self, EditVerseDialog): EditVerseDialog.setWindowTitle(self.trUtf8('Edit Verse')) - self.VerseTypeLabel.setText(self.trUtf8('Verse Type')) - self.VerseListComboBox.setItemText(0, self.trUtf8('Intro')) - self.VerseListComboBox.setItemText(1, self.trUtf8('Verse')) - self.VerseListComboBox.setItemText(2, self.trUtf8('Pre-Chorus')) - self.VerseListComboBox.setItemText(3, self.trUtf8('Chorus')) - self.VerseListComboBox.setItemText(4, self.trUtf8('Bridge')) - self.VerseListComboBox.setItemText(5, self.trUtf8('Ending')) - self.VerseListComboBox.setItemText(6, self.trUtf8('Other')) - self.VerseNumberLabel.setText(self.trUtf8('Number')) - self.addBridge.setText(self.trUtf8('Bridge')) - self.addVerse.setText(self.trUtf8('Verse')) - self.addChorus.setText(self.trUtf8('Chorus')) - self.addPreChorus.setText(self.trUtf8('Pre-Chorus')) - self.addIntro.setText(self.trUtf8('Intro')) - self.addOther.setText(self.trUtf8('Other')) - self.addEnding.setText(self.trUtf8('Ending')) + self.VerseTypeLabel.setText(self.trUtf8('Verse Type:')) + self.VerseTypeComboBox.setItemText(0, self.trUtf8('Verse')) + self.VerseTypeComboBox.setItemText(1, self.trUtf8('Chorus')) + self.VerseTypeComboBox.setItemText(2, self.trUtf8('Bridge')) + self.VerseTypeComboBox.setItemText(3, self.trUtf8('Pre-Chorus')) + self.VerseTypeComboBox.setItemText(4, self.trUtf8('Intro')) + self.VerseTypeComboBox.setItemText(5, self.trUtf8('Ending')) + self.VerseTypeComboBox.setItemText(6, self.trUtf8('Other')) + self.InsertButton.setText(self.trUtf8('Insert')) diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index 2666c146e..44590d430 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -23,9 +23,60 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +import re +import logging + from PyQt4 import QtCore, QtGui + from editversedialog import Ui_EditVerseDialog +log = logging.getLogger(__name__) + +class VerseType(object): + Verse = 0 + Chorus = 1 + Bridge = 2 + PreChorus = 3 + Intro = 4 + Ending = 5 + Other = 6 + + @staticmethod + def to_string(verse_type): + if verse_type == VerseType.Verse: + return u'Verse' + elif verse_type == VerseType.Chorus: + return u'Chorus' + elif verse_type == VerseType.Bridge: + return u'Bridge' + elif verse_type == VerseType.PreChorus: + return u'Pre-Chorus' + elif verse_type == VerseType.Intro: + return u'Intro' + elif verse_type == VerseType.Ending: + return u'Ending' + elif verse_type == VerseType.Other: + return u'Other' + + @staticmethod + def from_string(verse_type): + verse_type = verse_type.lower() + if verse_type == u'verse': + return VerseType.Verse + elif verse_type == u'chorus': + return VerseType.Chorus + elif verse_type == u'bridge': + return VerseType.Bridge + elif verse_type == u'pre-chorus': + return VerseType.PreChorus + elif verse_type == u'intro': + return VerseType.Intro + elif verse_type == u'ending': + return VerseType.Ending + elif verse_type == u'other': + return VerseType.Other + + class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): """ This is the form that is used to edit the verses of the song. @@ -36,127 +87,91 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): """ QtGui.QDialog.__init__(self, parent) self.setupUi(self) - QtCore.QObject.connect(self.addVerse, - QtCore.SIGNAL(u'clicked()'), self.onAddVerse) - QtCore.QObject.connect(self.addChorus, - QtCore.SIGNAL(u'clicked()'), self.onAddChorus) - QtCore.QObject.connect(self.addBridge, - QtCore.SIGNAL(u'clicked()'), self.onAddBridge) - QtCore.QObject.connect(self.addIntro, - QtCore.SIGNAL(u'clicked()'), self.onAddIntro) - QtCore.QObject.connect(self.addOther, - QtCore.SIGNAL(u'clicked()'), self.onAddOther) - QtCore.QObject.connect(self.addPreChorus, - QtCore.SIGNAL(u'clicked()'), self.onAddPreChorus) - QtCore.QObject.connect(self.addEnding, - QtCore.SIGNAL(u'clicked()'), self.onAddEnding) - QtCore.QObject.connect(self.VerseListComboBox, - QtCore.SIGNAL(u'activated(int)'), self.onVerseComboChanged) + QtCore.QObject.connect( + self.InsertButton, + QtCore.SIGNAL(u'clicked()'), + self.onInsertButtonClicked + ) + QtCore.QObject.connect( + self.VerseTextEdit, + QtCore.SIGNAL(u'cursorPositionChanged()'), + self.onCursorPositionChanged + ) +# QtCore.QObject.connect(self.VerseListComboBox, +# QtCore.SIGNAL(u'activated(int)'), self.onVerseComboChanged) + self.verse_regex = re.compile(r'---\[([-\w]+):([\d]+)\]---') - def startNewLine(self): + def insertVerse(self, title, num=1): if self.VerseTextEdit.textCursor().columnNumber() != 0: self.VerseTextEdit.insertPlainText(u'\n') - - def onAddIntro(self): - self.startNewLine() - self.VerseTextEdit.insertPlainText(u'---[%s:1]---\n' - % self.trUtf8('Intro')) + self.VerseTextEdit.insertPlainText(u'---[%s:%s]---\n' % (title, num)) self.VerseTextEdit.setFocus() - def onAddEnding(self): - self.startNewLine() - self.VerseTextEdit.insertPlainText(u'---[%s:1]---\n' - % self.trUtf8('Ending')) - self.VerseTextEdit.setFocus() + def onInsertButtonClicked(self): + if self.VerseTextEdit.textCursor().columnNumber() != 0: + self.VerseTextEdit.insertPlainText(u'\n') + verse_type = self.VerseTypeComboBox.currentIndex() + if verse_type == VerseType.Verse: + self.insertVerse('Verse', self.VerseNumberBox.value()) + elif verse_type == VerseType.Chorus: + self.insertVerse('Chorus', self.VerseNumberBox.value()) + elif verse_type == VerseType.Bridge: + self.insertVerse('Bridge') + elif verse_type == VerseType.PreChorus: + self.insertVerse('Pre-Chorus') + elif verse_type == VerseType.Intro: + self.insertVerse('Intro') + elif verse_type == VerseType.Ending: + self.insertVerse('Ending') + elif verse_type == VerseType.Other: + self.insertVerse('Other') - def onAddOther(self): - self.startNewLine() - self.VerseTextEdit.insertPlainText(u'---[%s:1]---\n' - % self.trUtf8('Other')) - self.VerseTextEdit.setFocus() + def onCursorPositionChanged(self): + position = self.VerseTextEdit.textCursor().position() + text = unicode(self.VerseTextEdit.toPlainText()) + if not text: + return + if text.rfind(u'[', 0, position) > text.rfind(u']', 0, position) and \ + text.find(u']', position) < text.find(u'[', position): + return + position = text.rfind(u'---[', 0, position) + if position == -1: + return + text = text[position:] + position = text.find(u']---') + if position == -1: + return + text = text[:position + 4] + match = self.verse_regex.match(text) + if match: + verse_type = match.group(1) + verse_number = int(match.group(2)) + self.VerseTypeComboBox.setCurrentIndex(VerseType.from_string(verse_type)) + self.VerseNumberBox.setValue(verse_number) - def onAddPreChorus(self): - self.startNewLine() - self.VerseTextEdit.insertPlainText(u'---[%s:1]---\n' - % self.trUtf8('Pre-Chorus')) - self.VerseTextEdit.setFocus() - - def onAddBridge(self): - self.startNewLine() - self.VerseTextEdit.insertPlainText(u'---[%s:1]---\n' - % self.trUtf8('Bridge')) - self.VerseTextEdit.setFocus() - - def onAddChorus(self): - self.startNewLine() - self.VerseTextEdit.insertPlainText(u'---[%s:1]---\n' - % self.trUtf8('Chorus')) - self.VerseTextEdit.setFocus() - - def onAddVerse(self): - self.startNewLine() - count = self.VerseTextEdit.toPlainText().\ - count(u'---[%s' % self.trUtf8('Verse')) - self.VerseTextEdit.insertPlainText(u'---[%s:%s]---\n' - % (self.trUtf8('Verse'), count + 1)) - self.VerseTextEdit.setFocus() - - def setVerse(self, text, verseCount=0, single=False, tag=u'Verse:1'): - posVerse = 0 - posSub = 0 - if len(text) == 0 and not single: - text = u'---[%s:1]---\n' % self.trUtf8('Verse') + def setVerse(self, text, single=False, tag=u'Verse:1'): if single: - id = tag.split(u':') - posVerse = self.VerseListComboBox.findText(id[0], QtCore.Qt.MatchExactly) - posSub = self.SubVerseListComboBox.findText(id[1], QtCore.Qt.MatchExactly) - if posVerse == -1: - posVerse = 0 - if posSub == -1: - posSub = 0 - self.VerseListComboBox.setEnabled(True) - self.SubVerseListComboBox.setEnabled(True) - self.SubVerseListComboBox.clear() - for i in range(1, verseCount + 1): - self.SubVerseListComboBox.addItem(u'%s'% i) - self.addBridge.setEnabled(False) - self.addChorus.setEnabled(False) - self.addVerse.setEnabled(False) - self.addIntro.setEnabled(False) - self.addPreChorus.setEnabled(False) - self.addOther.setEnabled(False) - self.addEnding.setEnabled(False) + verse_type, verse_number = tag.split(u':') + self.VerseTypeComboBox.setCurrentIndex(VerseType.from_string(verse_type)) + self.VerseNumberBox.setValue(int(verse_number)) + self.InsertButton.setVisible(False) else: - self.VerseListComboBox.setEnabled(False) - self.SubVerseListComboBox.setEnabled(False) - self.addBridge.setEnabled(True) - self.addChorus.setEnabled(True) - self.addVerse.setEnabled(True) - self.addIntro.setEnabled(True) - self.addPreChorus.setEnabled(True) - self.addOther.setEnabled(True) - self.addEnding.setEnabled(True) - self.VerseListComboBox.setCurrentIndex(posVerse) - self.SubVerseListComboBox.setCurrentIndex(posSub) + if not text: + text = u'---[Verse:1]---\n' + self.VerseTypeComboBox.setCurrentIndex(0) + self.VerseNumberBox.setValue(1) + self.InsertButton.setVisible(True) self.VerseTextEdit.setPlainText(text) self.VerseTextEdit.setFocus(QtCore.Qt.OtherFocusReason) - self.onVerseComboChanged(0) - self.VerseTextEdit.moveCursor(QtGui.QTextCursor.Down) def getVerse(self): - return self.VerseTextEdit.toPlainText(), \ - unicode(self.VerseListComboBox.currentText()), \ - unicode(self.SubVerseListComboBox.currentText()) + return self.VerseTextEdit.toPlainText(), \ + VerseType.to_string(self.VerseTypeComboBox.currentIndex()), \ + unicode(self.VerseNumberBox.value()) def getVerseAll(self): text = self.VerseTextEdit.toPlainText() if not text.startsWith(u'---['): - text = u'---[%s:1]---\n%s' % (self.trUtf8('Verse'), text) + text = u'---[Verse:1]---\n%s' % text return text - def onVerseComboChanged(self, id): - if unicode(self.VerseListComboBox.currentText()) == self.trUtf8('Verse'): - self.SubVerseListComboBox.setEnabled(True) - else: - self.SubVerseListComboBox.setEnabled(False) - self.SubVerseListComboBox.setCurrentIndex(0) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 5e57ee9f3..e6f163ef6 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -52,7 +52,7 @@ class SongMediaItem(MediaManagerItem): self.ListViewWithDnD_class = SongListView self.servicePath = None MediaManagerItem.__init__(self, parent, icon, title) - self.edit_song_form = EditSongForm(self.parent.manager, self) + self.edit_song_form = EditSongForm(self, self.parent.manager) self.song_maintenance_form = SongMaintenanceForm( self.parent.manager, self) # Holds information about whether the edit is remotly triggered and @@ -305,8 +305,7 @@ class SongMediaItem(MediaManagerItem): songXML = SongXMLParser(song.lyrics) verseList = songXML.get_verses() #no verse list or only 1 space (in error) - if song.verse_order is None or \ - song.verse_order == u'' or song.verse_order == u' ': + if not song.verse_order or not song.verse_order.strip(): for verse in verseList: service_item.add_from_text(verse[1][:30], unicode(verse[1])) else: diff --git a/resources/forms/editversedialog.ui b/resources/forms/editversedialog.ui index e0917f44d..d2f178159 100644 --- a/resources/forms/editversedialog.ui +++ b/resources/forms/editversedialog.ui @@ -6,8 +6,8 @@ 0 0 - 500 - 521 + 474 + 442 @@ -16,174 +16,118 @@ true - - - - 11 - 1 - 471 - 491 - + + + 8 - - - - - - - - - Verse Type - - - Qt::PlainText - - - Qt::AlignCenter - - - - - - - - Intro - - - - - Verse - - - - - Pre-Chorus - - - - - Chorus - - - - - Bridge - - - - - Ending - - - - - Other - - - - - - - - - - - - Number - - - Qt::AlignCenter - - - - - - - - - - - - - - false - - - - - - - - - Bridge - - - - - + + 8 + + + + + false + + + + + + + 8 + + + + + Verse Type: + + + + + + Verse - - - - + + Chorus - - - - - - - - + + + + Bridge + + + Pre-Chorus - - - - + + Intro - - - - - - Other - - - - - + + Ending - - - -
- - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Save - - - - - + + + + Other + + + + + + + + + + + Insert + + + + :/general/general_add.png:/general/general_add.png + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Save + + + + - + + + - ButtonBox + EditButtonBox accepted() EditVerseDialog accept() @@ -199,7 +143,7 @@ - ButtonBox + EditButtonBox rejected() EditVerseDialog reject() From ea64675d65950b2e4064748dfa7faf389653fdf2 Mon Sep 17 00:00:00 2001 From: rimach Date: Sat, 17 Apr 2010 00:06:28 +0200 Subject: [PATCH 10/81] update i18n implementation --- openlp.pyw | 17 +- openlp/core/lib/toolbar.py | 11 +- openlp/core/ui/mainwindow.py | 213 +- openlp/core/utils/__init__.py | 3 +- openlp/core/utils/languagemanager.py | 106 + resources/i18n/openlp_af.qm | Bin 0 -> 34261 bytes resources/i18n/openlp_de.qm | Bin 0 -> 36265 bytes resources/i18n/openlp_en.ts | 3478 ----------------- resources/i18n/openlp_en_GB.qm | Bin 0 -> 31723 bytes resources/i18n/openlp_en_ZA.qm | Bin 0 -> 22938 bytes resources/i18n/openlp_es.qm | Bin 0 -> 14546 bytes resources/i18n/openlp_hu.qm | Bin 0 -> 35270 bytes resources/i18n/openlp_ko.qm | Bin 0 -> 462 bytes resources/i18n/openlp_nb.qm | Bin 0 -> 20852 bytes resources/i18n/openlp_pt_BR.qm | Bin 0 -> 35931 bytes resources/i18n/openlp_sv.qm | Bin 0 -> 37049 bytes .../{generate_pro.py => translation_utils.py} | 85 +- 17 files changed, 323 insertions(+), 3590 deletions(-) create mode 100644 openlp/core/utils/languagemanager.py create mode 100644 resources/i18n/openlp_af.qm create mode 100644 resources/i18n/openlp_de.qm delete mode 100644 resources/i18n/openlp_en.ts create mode 100644 resources/i18n/openlp_en_GB.qm create mode 100644 resources/i18n/openlp_en_ZA.qm create mode 100644 resources/i18n/openlp_es.qm create mode 100644 resources/i18n/openlp_hu.qm create mode 100644 resources/i18n/openlp_ko.qm create mode 100644 resources/i18n/openlp_nb.qm create mode 100644 resources/i18n/openlp_pt_BR.qm create mode 100644 resources/i18n/openlp_sv.qm rename scripts/{generate_pro.py => translation_utils.py} (62%) diff --git a/openlp.pyw b/openlp.pyw index d95987e23..23c056c02 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -37,7 +37,7 @@ log = logging.getLogger() from openlp.core.lib import Receiver, str_to_bool from openlp.core.resources import qInitResources from openlp.core.ui import MainWindow, SplashScreen, ScreenList -from openlp.core.utils import AppLocation, ConfigHelper +from openlp.core.utils import AppLocation, ConfigHelper, LanguageManager application_stylesheet = u""" QMainWindow::separator @@ -193,17 +193,10 @@ def main(): qInitResources() # Now create and actually run the application. app = OpenLP(qt_args) - lang_Path = AppLocation.get_directory(AppLocation.AppDir) - if hasattr(sys, u'frozen'): - lang_Path = os.path.join(lang_Path, u'..') - lang_Path = os.path.join(lang_Path, u'resources', u'i18n') - locale = QtCore.QLocale.system().name() - qtTranslator = QtCore.QTranslator() - if qtTranslator.load("openlp_" + locale, lang_Path): - app.installTranslator(qtTranslator) - appTranslator = QtCore.QTranslator() - if appTranslator.load("openlp_" + locale, lang_Path): - app.installTranslator(appTranslator) + #i18n Set Language + language = LanguageManager.getLanguage() + appTranslator = LanguageManager.getTranslator(language) + app.installTranslator(appTranslator) sys.exit(app.run()) diff --git a/openlp/core/lib/toolbar.py b/openlp/core/lib/toolbar.py index e50459943..7b5d86d54 100644 --- a/openlp/core/lib/toolbar.py +++ b/openlp/core/lib/toolbar.py @@ -117,10 +117,13 @@ class OpenLPToolbar(QtGui.QToolBar): The title of the icon to search for. """ title = QtCore.QString(title) - if self.icons[title]: - return self.icons[title] - else: - log.error(u'getIconFromTitle - no icon for %s' % title) + try: + if self.icons[title]: + return self.icons[title] + else: + log.error(u'getIconFromTitle - no icon for %s' % title) + return QtGui.QIcon() + except: return QtGui.QIcon() def makeWidgetsInvisible(self, widgets): diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 864d3a0ac..99021deb4 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -33,7 +33,7 @@ from openlp.core.ui import AboutForm, SettingsForm, \ PluginForm, MediaDockManager, VideoDisplay from openlp.core.lib import RenderManager, PluginConfig, build_icon, \ OpenLPDockWidget, SettingsManager, PluginManager, Receiver, str_to_bool -from openlp.core.utils import check_latest_version, AppLocation +from openlp.core.utils import check_latest_version, AppLocation, LanguageManager, ConfigHelper log = logging.getLogger(__name__) @@ -190,19 +190,19 @@ class Ui_MainWindow(object): self.ThemeManagerDock.setVisible(self.settingsmanager.showThemeManager) # Create the menu items self.FileNewItem = QtGui.QAction(MainWindow) - #self.FileNewItem.setIcon( - # self.ServiceManagerContents.Toolbar.getIconFromTitle( - # u'New Service')) + self.FileNewItem.setIcon( + self.ServiceManagerContents.Toolbar.getIconFromTitle( + MainWindow.trUtf8('New Service'))) self.FileNewItem.setObjectName(u'FileNewItem') self.FileOpenItem = QtGui.QAction(MainWindow) - #self.FileOpenItem.setIcon( - # self.ServiceManagerContents.Toolbar.getIconFromTitle( - # u'Open Service')) + self.FileOpenItem.setIcon( + self.ServiceManagerContents.Toolbar.getIconFromTitle( + MainWindow.trUtf8('Open Service'))) self.FileOpenItem.setObjectName(u'FileOpenItem') self.FileSaveItem = QtGui.QAction(MainWindow) - #self.FileSaveItem.setIcon( - # self.ServiceManagerContents.Toolbar.getIconFromTitle( - # u'Save Service')) + self.FileSaveItem.setIcon( + self.ServiceManagerContents.Toolbar.getIconFromTitle( + MainWindow.trUtf8('Save Service'))) self.FileSaveItem.setObjectName(u'FileSaveItem') self.FileSaveAsItem = QtGui.QAction(MainWindow) self.FileSaveAsItem.setObjectName(u'FileSaveAsItem') @@ -257,10 +257,26 @@ class Ui_MainWindow(object): self.HelpOnlineHelpItem.setObjectName(u'HelpOnlineHelpItem') self.HelpWebSiteItem = QtGui.QAction(MainWindow) self.HelpWebSiteItem.setObjectName(u'HelpWebSiteItem') - self.LanguageTranslateItem = QtGui.QAction(MainWindow) - self.LanguageTranslateItem.setObjectName(u'LanguageTranslateItem') - self.LanguageEnglishItem = QtGui.QAction(MainWindow) - self.LanguageEnglishItem.setObjectName(u'LanguageEnglishItem') + #i18n Language Items + self.AutoLanguageItem = QtGui.QAction(MainWindow) + self.AutoLanguageItem.setObjectName(u'AutoLanguageItem') + self.AutoLanguageItem.setCheckable(True) + self.LanguageGroup = QtGui.QActionGroup(MainWindow) + qmList = LanguageManager.getQmList() + savedLanguage = LanguageManager.getLanguage() + self.LanguageItem = {} + for key in qmList.keys(): + self.LanguageItem[key] = QtGui.QAction(MainWindow) + self.LanguageItem[key].setObjectName(key) + self.LanguageItem[key].setCheckable(True) + if LanguageManager.__AutoLanguage__ == True: + self.AutoLanguageItem.setChecked(True) + self.LanguageGroup.setEnabled(False) + else: + self.AutoLanguageItem.setChecked(False) + self.LanguageGroup.setEnabled(True) + if qmList[key] == savedLanguage: + self.LanguageItem[key].setChecked(True) self.ToolsAddToolItem = QtGui.QAction(MainWindow) AddToolIcon = build_icon(u':/tools/tools_add.png') self.ToolsAddToolItem.setIcon(AddToolIcon) @@ -295,9 +311,12 @@ class Ui_MainWindow(object): self.OptionsViewMenu.addAction(self.ViewThemeManagerItem) self.OptionsViewMenu.addSeparator() self.OptionsViewMenu.addAction(self.action_Preview_Panel) - self.OptionsLanguageMenu.addAction(self.LanguageEnglishItem) + #i18n add Language Actions + self.OptionsLanguageMenu.addAction(self.AutoLanguageItem) self.OptionsLanguageMenu.addSeparator() - self.OptionsLanguageMenu.addAction(self.LanguageTranslateItem) + for item in sorted(self.LanguageItem): + self.LanguageGroup.addAction(self.LanguageItem[item]) + self.OptionsLanguageMenu.addAction(self.LanguageItem[item]) self.OptionsMenu.addAction(self.OptionsLanguageMenu.menuAction()) self.OptionsMenu.addAction(self.OptionsViewMenu.menuAction()) self.OptionsMenu.addSeparator() @@ -335,95 +354,98 @@ class Ui_MainWindow(object): """ Set up the translation system """ - MainWindow.mainTitle = self.trUtf8('OpenLP 2.0') - MainWindow.defaultThemeText = self.trUtf8( + MainWindow.mainTitle = MainWindow.trUtf8('OpenLP 2.0') + MainWindow.language = MainWindow.trUtf8('English') + MainWindow.defaultThemeText = MainWindow.trUtf8( 'Default Theme: ') MainWindow.setWindowTitle(MainWindow.mainTitle) - self.FileMenu.setTitle(self.trUtf8('&File')) - self.FileImportMenu.setTitle(self.trUtf8('&Import')) - self.FileExportMenu.setTitle(self.trUtf8('&Export')) - self.OptionsMenu.setTitle(self.trUtf8('&Options')) - self.OptionsViewMenu.setTitle(self.trUtf8('&View')) - self.ViewModeMenu.setTitle(self.trUtf8('M&ode')) - self.OptionsLanguageMenu.setTitle(self.trUtf8( + self.FileMenu.setTitle(MainWindow.trUtf8('&File')) + self.FileImportMenu.setTitle(MainWindow.trUtf8('&Import')) + self.FileExportMenu.setTitle(MainWindow.trUtf8('&Export')) + self.OptionsMenu.setTitle(MainWindow.trUtf8('&Options')) + self.OptionsViewMenu.setTitle(MainWindow.trUtf8('&View')) + self.ViewModeMenu.setTitle(MainWindow.trUtf8('M&ode')) + self.OptionsLanguageMenu.setTitle(MainWindow.trUtf8( u'&Language')) - self.ToolsMenu.setTitle(self.trUtf8('&Tools')) - self.HelpMenu.setTitle(self.trUtf8('&Help')) + self.ToolsMenu.setTitle(MainWindow.trUtf8('&Tools')) + self.HelpMenu.setTitle(MainWindow.trUtf8('&Help')) self.MediaManagerDock.setWindowTitle( - self.trUtf8('Media Manager')) + MainWindow.trUtf8('Media Manager')) self.ServiceManagerDock.setWindowTitle( - self.trUtf8('Service Manager')) + MainWindow.trUtf8('Service Manager')) self.ThemeManagerDock.setWindowTitle( - self.trUtf8('Theme Manager')) - self.FileNewItem.setText(self.trUtf8('&New')) - self.FileNewItem.setToolTip(self.trUtf8('New Service')) - self.FileNewItem.setStatusTip(self.trUtf8('Create a new Service')) - self.FileNewItem.setShortcut(self.trUtf8('Ctrl+N')) - self.FileOpenItem.setText(self.trUtf8('&Open')) - self.FileOpenItem.setToolTip(self.trUtf8('Open Service')) - self.FileOpenItem.setStatusTip(self.trUtf8('Open an existing service')) - self.FileOpenItem.setShortcut(self.trUtf8('Ctrl+O')) - self.FileSaveItem.setText(self.trUtf8('&Save')) - self.FileSaveItem.setToolTip(self.trUtf8('Save Service')) + MainWindow.trUtf8('Theme Manager')) + self.FileNewItem.setText(MainWindow.trUtf8('&New')) + self.FileNewItem.setToolTip(MainWindow.trUtf8('New Service')) + self.FileNewItem.setStatusTip(MainWindow.trUtf8('Create a new Service')) + self.FileNewItem.setShortcut(MainWindow.trUtf8('Ctrl+N')) + self.FileOpenItem.setText(MainWindow.trUtf8('&Open')) + self.FileOpenItem.setToolTip(MainWindow.trUtf8('Open Service')) + self.FileOpenItem.setStatusTip(MainWindow.trUtf8('Open an existing service')) + self.FileOpenItem.setShortcut(MainWindow.trUtf8('Ctrl+O')) + self.FileSaveItem.setText(MainWindow.trUtf8('&Save')) + self.FileSaveItem.setToolTip(MainWindow.trUtf8('Save Service')) self.FileSaveItem.setStatusTip( - self.trUtf8('Save the current service to disk')) - self.FileSaveItem.setShortcut(self.trUtf8('Ctrl+S')) - self.FileSaveAsItem.setText(self.trUtf8('Save &As...')) - self.FileSaveAsItem.setToolTip(self.trUtf8('Save Service As')) + MainWindow.trUtf8('Save the current service to disk')) + self.FileSaveItem.setShortcut(MainWindow.trUtf8('Ctrl+S')) + self.FileSaveAsItem.setText(MainWindow.trUtf8('Save &As...')) + self.FileSaveAsItem.setToolTip(MainWindow.trUtf8('Save Service As')) self.FileSaveAsItem.setStatusTip( - self.trUtf8('Save the current service under a new name')) - self.FileSaveAsItem.setShortcut(self.trUtf8('F12')) - self.FileExitItem.setText(self.trUtf8('E&xit')) - self.FileExitItem.setStatusTip(self.trUtf8('Quit OpenLP')) - self.FileExitItem.setShortcut(self.trUtf8('Alt+F4')) - self.ImportThemeItem.setText(self.trUtf8('&Theme')) - self.ImportLanguageItem.setText(self.trUtf8('&Language')) - self.ExportThemeItem.setText(self.trUtf8('&Theme')) - self.ExportLanguageItem.setText(self.trUtf8('&Language')) - self.actionLook_Feel.setText(self.trUtf8('Look && &Feel')) - self.OptionsSettingsItem.setText(self.trUtf8('&Settings')) - self.ViewMediaManagerItem.setText(self.trUtf8('&Media Manager')) - self.ViewMediaManagerItem.setToolTip(self.trUtf8('Toggle Media Manager')) + MainWindow.trUtf8('Save the current service under a new name')) + self.FileSaveAsItem.setShortcut(MainWindow.trUtf8('F12')) + self.FileExitItem.setText(MainWindow.trUtf8('E&xit')) + self.FileExitItem.setStatusTip(MainWindow.trUtf8('Quit OpenLP')) + self.FileExitItem.setShortcut(MainWindow.trUtf8('Alt+F4')) + self.ImportThemeItem.setText(MainWindow.trUtf8('&Theme')) + self.ImportLanguageItem.setText(MainWindow.trUtf8('&Language')) + self.ExportThemeItem.setText(MainWindow.trUtf8('&Theme')) + self.ExportLanguageItem.setText(MainWindow.trUtf8('&Language')) + self.actionLook_Feel.setText(MainWindow.trUtf8('Look && &Feel')) + self.OptionsSettingsItem.setText(MainWindow.trUtf8('&Settings')) + self.ViewMediaManagerItem.setText(MainWindow.trUtf8('&Media Manager')) + self.ViewMediaManagerItem.setToolTip(MainWindow.trUtf8('Toggle Media Manager')) self.ViewMediaManagerItem.setStatusTip( - self.trUtf8('Toggle the visibility of the Media Manager')) - self.ViewMediaManagerItem.setShortcut(self.trUtf8('F8')) - self.ViewThemeManagerItem.setText(self.trUtf8('&Theme Manager')) - self.ViewThemeManagerItem.setToolTip(self.trUtf8('Toggle Theme Manager')) + MainWindow.trUtf8('Toggle the visibility of the Media Manager')) + self.ViewMediaManagerItem.setShortcut(MainWindow.trUtf8('F8')) + self.ViewThemeManagerItem.setText(MainWindow.trUtf8('&Theme Manager')) + self.ViewThemeManagerItem.setToolTip(MainWindow.trUtf8('Toggle Theme Manager')) self.ViewThemeManagerItem.setStatusTip( - self.trUtf8('Toggle the visibility of the Theme Manager')) - self.ViewThemeManagerItem.setShortcut(self.trUtf8('F10')) - self.ViewServiceManagerItem.setText(self.trUtf8('&Service Manager')) + MainWindow.trUtf8('Toggle the visibility of the Theme Manager')) + self.ViewThemeManagerItem.setShortcut(MainWindow.trUtf8('F10')) + self.ViewServiceManagerItem.setText(MainWindow.trUtf8('&Service Manager')) self.ViewServiceManagerItem.setToolTip( - self.trUtf8('Toggle Service Manager')) + MainWindow.trUtf8('Toggle Service Manager')) self.ViewServiceManagerItem.setStatusTip( - self.trUtf8('Toggle the visibility of the Service Manager')) - self.ViewServiceManagerItem.setShortcut(self.trUtf8('F9')) - self.action_Preview_Panel.setText(self.trUtf8('&Preview Panel')) - self.action_Preview_Panel.setToolTip(self.trUtf8('Toggle Preview Panel')) + MainWindow.trUtf8('Toggle the visibility of the Service Manager')) + self.ViewServiceManagerItem.setShortcut(MainWindow.trUtf8('F9')) + self.action_Preview_Panel.setText(MainWindow.trUtf8('&Preview Panel')) + self.action_Preview_Panel.setToolTip(MainWindow.trUtf8('Toggle Preview Panel')) self.action_Preview_Panel.setStatusTip( - self.trUtf8('Toggle the visibility of the Preview Panel')) - self.action_Preview_Panel.setShortcut(self.trUtf8('F11')) - self.PluginItem.setText(self.trUtf8('&Plugin List')) - self.PluginItem.setStatusTip(self.trUtf8('List the Plugins')) - self.PluginItem.setShortcut(self.trUtf8('Alt+F7')) - self.HelpDocumentationItem.setText(self.trUtf8('&User Guide')) - self.HelpAboutItem.setText(self.trUtf8('&About')) + MainWindow.trUtf8('Toggle the visibility of the Preview Panel')) + self.action_Preview_Panel.setShortcut(MainWindow.trUtf8('F11')) + self.PluginItem.setText(MainWindow.trUtf8('&Plugin List')) + self.PluginItem.setStatusTip(MainWindow.trUtf8('List the Plugins')) + self.PluginItem.setShortcut(MainWindow.trUtf8('Alt+F7')) + self.HelpDocumentationItem.setText(MainWindow.trUtf8('&User Guide')) + self.HelpAboutItem.setText(MainWindow.trUtf8('&About')) self.HelpAboutItem.setStatusTip( - self.trUtf8('More information about OpenLP')) - self.HelpAboutItem.setShortcut(self.trUtf8('Ctrl+F1')) - self.HelpOnlineHelpItem.setText(self.trUtf8('&Online Help')) - self.HelpWebSiteItem.setText(self.trUtf8('&Web Site')) - self.LanguageTranslateItem.setText(self.trUtf8('&Translate')) - self.LanguageTranslateItem.setStatusTip( - self.trUtf8('Translate the interface to your language')) - self.LanguageEnglishItem.setText(self.trUtf8('English')) - self.LanguageEnglishItem.setStatusTip( - self.trUtf8('Set the interface language to English')) - self.ToolsAddToolItem.setText(self.trUtf8('Add &Tool...')) + MainWindow.trUtf8('More information about OpenLP')) + self.HelpAboutItem.setShortcut(MainWindow.trUtf8('Ctrl+F1')) + self.HelpOnlineHelpItem.setText(MainWindow.trUtf8('&Online Help')) + self.HelpWebSiteItem.setText(MainWindow.trUtf8('&Web Site')) + #i18n + self.AutoLanguageItem.setText(MainWindow.trUtf8('&Auto Detect')) + self.AutoLanguageItem.setStatusTip( + MainWindow.trUtf8('Choose System language, if available')) + for item in self.LanguageItem: + self.LanguageItem[item].setText(self.LanguageItem[item].objectName()) + self.LanguageItem[item].setStatusTip( + MainWindow.trUtf8('Set the interface language to %1').arg(self.LanguageItem[item].objectName())) + self.ToolsAddToolItem.setText(MainWindow.trUtf8('Add &Tool...')) self.ToolsAddToolItem.setStatusTip( - self.trUtf8('Add an application to the list of tools')) - self.action_Preview_Panel.setText(self.trUtf8('&Preview Pane')) - self.ModeLiveItem.setText(self.trUtf8('&Live')) + MainWindow.trUtf8('Add an application to the list of tools')) + self.action_Preview_Panel.setText(MainWindow.trUtf8('&Preview Pane')) + self.ModeLiveItem.setText(MainWindow.trUtf8('&Live')) class MainWindow(QtGui.QMainWindow, Ui_MainWindow): @@ -511,6 +533,11 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.QObject.connect(self.FileSaveAsItem, QtCore.SIGNAL(u'triggered()'), self.ServiceManagerContents.onSaveService) + #i18n set signals for languages + QtCore.QObject.connect(self.AutoLanguageItem, + QtCore.SIGNAL(u'toggled(bool)'), + self.setAutoLanguage) + self.LanguageGroup.triggered.connect(LanguageManager.setLanguage) #warning cyclic dependency #RenderManager needs to call ThemeManager and #ThemeManager needs to call RenderManager @@ -552,6 +579,12 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): log.info(u'Load data from Settings') self.settingsForm.postSetUp() + #i18n + def setAutoLanguage(self, value): + self.LanguageGroup.setEnabled(not value) + LanguageManager.__AutoLanguage__ = value + LanguageManager.setLanguage(self.LanguageGroup.checkedAction()) + def versionCheck(self, version): """ Checks the version of the Application called from openlp.pyw diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index 12fc4a293..e4edd420a 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -151,5 +151,6 @@ def variant_to_unicode(variant): from registry import Registry from confighelper import ConfigHelper +from languagemanager import LanguageManager -__all__ = [u'Registry', u'ConfigHelper', u'AppLocation', u'check_latest_version'] +__all__ = [u'Registry', u'ConfigHelper', u'AppLocation', u'LanguageManager', u'check_latest_version'] diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py new file mode 100644 index 000000000..7f2b92fcf --- /dev/null +++ b/openlp/core/utils/languagemanager.py @@ -0,0 +1,106 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # +# Thompson, Jon Tibble, Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +import logging + +from PyQt4 import QtCore, QtGui +import os +from openlp.core.utils import AppLocation, ConfigHelper +#from openlp.core.ui import MainWindow +#import i18n_rc + +class LanguageManager(object): + """ + Helper for Language selection + """ + __qmList__ = None + __AutoLanguage__ = None + + @staticmethod + def getTranslator(language): + if LanguageManager.__AutoLanguage__ is True: + language = QtCore.QLocale.system().name() + lang_Path = AppLocation.get_directory(AppLocation.AppDir) + lang_Path = os.path.join(lang_Path, u'resources', u'i18n') + appTranslator = QtCore.QTranslator() + if appTranslator.load("openlp_" + language, lang_Path): + return appTranslator + + @staticmethod + def findQmFiles(): + trans_dir = AppLocation.get_directory(AppLocation.AppDir) + trans_dir = QtCore.QDir(os.path.join(trans_dir, u'resources', u'i18n')) + fileNames = trans_dir.entryList(QtCore.QStringList("*.qm"), + QtCore.QDir.Files, QtCore.QDir.Name) + for i in fileNames: + fileNames.replaceInStrings(i, trans_dir.filePath(i)) + return fileNames + + @staticmethod + def languageName(qmFile): + translator = QtCore.QTranslator() + translator.load(qmFile) + + return translator.translate(u'MainWindow', u'English') + + @staticmethod + def getLanguage(): + language = ConfigHelper.get_registry().get_value(u'general', u'language', u'[en]') + print "getLanguage %s" % language + regEx = QtCore.QRegExp("^\[(.*)\]") + if regEx.exactMatch(language): + LanguageManager.__AutoLanguage__ = True + language = regEx.cap(1) + return language + + @staticmethod + def setLanguage(action): + actionName = u'%s' % action.objectName() + qmList = LanguageManager.getQmList() + if LanguageManager.__AutoLanguage__ == True: + language = u'[%s]' % qmList[actionName] + else: + language = u'%s' % qmList[actionName] + print "setLanguage: %s" % language + ConfigHelper.set_config(u'general', u'language', language) + QtGui.QMessageBox.information(None, + u'Language', u'After restart new Language settings will be used.') + + @staticmethod + def initQmList(): + LanguageManager.__qmList__ = {} + qmFiles = LanguageManager.findQmFiles() + for i, qmf in enumerate(qmFiles): + regEx = QtCore.QRegExp("^.*openlp_(.*).qm") + if regEx.exactMatch(qmf): + langName = regEx.cap(1) + LanguageManager.__qmList__[u'%i %s' % (i, LanguageManager.languageName(qmf))] = langName + + @staticmethod + def getQmList(): + if LanguageManager.__qmList__ == None: + LanguageManager.initQmList() + return LanguageManager.__qmList__ + diff --git a/resources/i18n/openlp_af.qm b/resources/i18n/openlp_af.qm new file mode 100644 index 0000000000000000000000000000000000000000..58b2f37c46413f2353c6d2b8010ff92a8470e13f GIT binary patch literal 34261 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 Koqdfwo&OJYJqCsV literal 0 HcmV?d00001 diff --git a/resources/i18n/openlp_de.qm b/resources/i18n/openlp_de.qm new file mode 100644 index 0000000000000000000000000000000000000000..40563e3126991a2ae329f023b373dcd8bd04d246 GIT binary patch literal 36265 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 ZU%N#4BPb=^-O - - - AboutForm - - - build - - - - - AlertsTab - - - pt - - - - - Location: - - - - - Font Color: - - - - - Font - - - - - Font Name: - - - - - Preview - - - - - Alerts - - - - - Alert timeout: - - - - - openlp.org - - - - - Keep History: - - - - - Background Color: - - - - - s - - - - - Bottom - - - - - Top - - - - - Font Size: - - - - - Save - - - - - Clear - - - - - Add - - - - - Edit - - - - - Delete - - - - - Item selected to Add - - - - - Missing data - - - - - AmendThemeForm - - - Slide Height is %s rows - - - - - First Color: - - - - - Second Color: - - - - - Background Color: - - - - - AuthorsForm - - - You need to type in the first name of the author. - - - - - You haven't set a display name for the author, would you like me to combine the first and last names for you? - - - - - Error - - - - - You need to type in the last name of the author. - - - - - BibleMediaItem - - - Quick - - - - - Bible - - - - - Book: - - - - - Text Search - - - - - Find: - - - - - Search Type: - - - - - Bible not fully loaded - - - - - No matching book could be found in this Bible. - - - - - Dual: - - - - - Chapter: - - - - - Search - - - - - Keep - - - - - Results: - - - - - Verse Search - - - - - Version: - - - - - From: - - - - - No Book Found - - - - - Advanced - - - - - To: - - - - - Clear - - - - - Verse: - - - - - BiblePlugin - - - <strong>Bible Plugin</strong><br />This plugin allows bible verses from different sources to be displayed on the screen during the service. - - - - - BiblesTab - - - ( and ) - - - - - verse per line - - - - - Display Style: - - - - - continuous - - - - - [ and ] - - - - - Verse Display - - - - - Display Dual Bible Verses - - - - - Only show new chapter numbers - - - - - Layout Style: - - - - - No brackets - - - - - Bibles - - - - - { and } - - - - - Note: -Changes don't affect verses already in the service - - - - - verse per slide - - - - - Bible Theme: - - - - - CustomMediaItem - - - Custom - - - - - CustomPlugin - - - <b>Custom Plugin</b><br>This plugin allows slides to be displayed on the screen in the same way songs are. This plugin provides greater freedom over the songs plugin.<br> - - - - - CustomTab - - - Custom - - - - - Display Footer: - - - - - Custom Display - - - - - EditCustomForm - - - You have unsaved data - - - - - You need to enter a title - - - - - Error - - - - - You need to enter a slide - - - - - Save && Preview - - - - - EditSongForm - - - You need to enter a song title. - - - - - You need to enter some verses. - - - - - Save && Preview - - - - - Error - - - - - bitped - - - - - v - - - - - c - - - - - Invalid verse entry - Vx or Cx - - - - - Invalid verse entry, values must be I,B,T,P,E,O,Vx,Cx - - - - - EditVerseForm - - - Verse - - - - - Chrous - - - - - GeneralTab - - - CCLI Details - - - - - primary - - - - - Application Startup - - - - - Select monitor for output display: - - - - - Application Settings - - - - - SongSelect Username: - - - - - CCLI Number: - - - - - Automatically open the last service - - - - - Preview Next Song from Service Manager - - - - - Show blank screen warning - - - - - Prompt to save Service before starting New - - - - - General - - - - - Show the splash screen - - - - - Screen - - - - - Monitors - - - - - SongSelect Password: - - - - - Display if in single screen - - - - - ImageMediaItem - - - Select Image(s) - - - - - Image(s) - - - - - Image - - - - - Images (*.jpg *.jpeg *.gif *.png *.bmp);; All files (*) - - - - - Replace Live Background - - - - - No item selected - - - - - You must select one item - - - - - ImagePlugin - - - <b>Image Plugin</b><br>Allows images of all types to be displayed. If a number of images are selected together and presented on the live controller it is possible to turn them into a timed loop.<br<br>From the plugin if the <i>Override background</i> is chosen and an image is selected any songs which are rendered will use the selected image from the background instead of the one provied by the theme.<br> - - - - - ImageTab - - - sec - - - - - Image Settings - - - - - Slide Loop Delay: - - - - - Images - - - - - ImportWizardForm - - - You need to specify a file with books of the Bible to use in the import. - - - - - Invalid Bible Location - - - - - You need to set a copyright for your Bible! Bibles in the Public Domain need to be marked as such. - - - - - Bible Exists - - - - - Empty Copyright - - - - - Empty Version Name - - - - - Invalid OpenSong Bible - - - - - Your Bible import failed. - - - - - Finished import. - - - - - You need to specify a file of Bible verses to import. - - - - - You need to specify a version name for your Bible. - - - - - This Bible already exists! Please import a different Bible or first delete the existing one. - - - - - Starting import... - - - - - Invalid Books File - - - - - You need to specify a file to import your Bible from. - - - - - You need to specify an OpenSong Bible file to import. - - - - - Invalid Verse File - - - - - Open OpenSong Bible - - - - - Open OSIS File - - - - - Open Books CSV File - - - - - Open Verses CSV File - - - - - MainWindow - - - The Main Display has been blanked out - - - - - OpenLP Version Updated - - - - - Save Changes to Service? - - - - - Your service has changed, do you want to save those changes? - - - - - OpenLP Main Display Blanked - - - - - Version %s of OpenLP is now available for download (you are currently running version %s). - -You can download the latest version from http://openlp.org - - - - - MediaManagerItem - - - &Preview - - - - - You must select one or more items - - - - - Load a new - - - - - Delete the selected item - - - - - &Edit - - - - - &Add to Service - - - - - Send the selected item live - - - - - Add the selected item(s) to the service - - - - - Edit the selected - - - - - Add a new - - - - - &Show Live - - - - - Preview the selected item - - - - - Import a - - - - - &Delete - - - - - &Add to selected Service Item - - - - - No Items Selected - - - - - You must select one or more items. - - - - - No items selected - - - - - No Service Item Selected - - - - - You must select a existing service item to add to. - - - - - Invalid Service Item - - - - - MediaMediaItem - - - Media - - - - - Select Media - - - - - Videos (%s);;Audio (%s);;All files (*) - - - - - MediaPlugin - - - <b>Media Plugin</b><br>This plugin allows the playing of audio and video media - - - - - OpenSongBible - - - Importing - - - - - PresentationMediaItem - - - Presentation - - - - - Present using: - - - - - Automatic - - - - - A presentation with that filename already exists. - - - - - Select Presentation(s) - - - - - File exists - - - - - Presentations (%s) - - - - - PresentationPlugin - - - <b>Presentation Plugin</b> <br> Delivers the ability to show presentations using a number of different programs. The choice of available presentation programs is available to the user in a drop down box. - - - - - PresentationTab - - - Available Controllers - - - - - available - - - - - Presentations - - - - - RemoteTab - - - Remotes - - - - - Remotes Receiver Port - - - - - RemotesPlugin - - - <b>Remote Plugin</b><br>This plugin provides the ability to send messages to a running version of openlp on a different computer.<br>The Primary use for this would be to send alerts from a creche - - - - - ServiceManager - - - Save Changes to Service? - - - - - Open Service - - - - - Move to top - - - - - Create a new service - - - - - Save this service - - - - - Theme: - - - - - Delete From Service - - - - - Save Service - - - - - &Live Verse - - - - - Move to &top - - - - - New Service - - - - - &Notes - - - - - Move to end - - - - - Your service is unsaved, do you want to save those changes before creating a new one ? - - - - - &Delete From Service - - - - - Move up order - - - - - Move down order - - - - - Move &down - - - - - Load an existing service - - - - - &Preview Verse - - - - - Move &up - - - - - &Edit Item - - - - - Move to &bottom - - - - - &Maintain Item - - - - - SlideController - - - Move to previous - - - - - Go to Verse - - - - - Start continuous loop - - - - - Live - - - - - Start playing media - - - - - Move to live - - - - - Preview - - - - - Move to last - - - - - Edit and re-preview Song - - - - - Delay between slides in seconds - - - - - Move to next - - - - - Move to first - - - - - Blank Screen - - - - - Verse - - - - - Stop continuous loop - - - - - s - - - - - Theme Screen - - - - - Hide Screen - - - - - Chorus - - - - - SongBookForm - - - Error - - - - - You need to type in a book name! - - - - - SongMaintenanceForm - - - Are you sure you want to delete the selected book? - - - - - Couldn't save your author. - - - - - This author can't be deleted, they are currently assigned to at least one song. - - - - - Couldn't add your book. - - - - - Error - - - - - No author selected! - - - - - Couldn't add your topic. - - - - - This book can't be deleted, it is currently assigned to at least one song. - - - - - Delete Book - - - - - No book selected! - - - - - Are you sure you want to delete the selected author? - - - - - Couldn't add your author. - - - - - Couldn't save your topic. - - - - - Couldn't save your book. - - - - - Delete Topic - - - - - Delete Author - - - - - No topic selected! - - - - - This topic can't be deleted, it is currently assigned to at least one song. - - - - - Are you sure you want to delete the selected topic? - - - - - SongMediaItem - - - CCLI Licence: - - - - - Song - - - - - Maintain the lists of authors, topics and books - - - - - Lyrics - - - - - Type: - - - - - Titles - - - - - Clear - - - - - Search - - - - - Authors - - - - - Search: - - - - - Song Maintenance - - - - - %s (%s) - - - - - Delete song? - - - - - Delete %d song? - - - - - Delete Confirmation - - - - - SongUsageDeleteForm - - - Delete Selected Song Usage Events? - - - - - Are you sure you want to delete selected Song Usage data? - - - - - SongUsageDetailForm - - - Output File Location - - - - - SongUsagePlugin - - - <b>SongUsage Plugin</b><br>This plugin records the use of songs and when they have been used during a live service - - - - - SongsPlugin - - - <b>Song Plugin</b> <br>This plugin allows Songs to be managed and displayed.<br> - - - - - Open Songs of Fellowship file - - - - - SongsTab - - - Display Verses on Live Tool bar: - - - - - Enable search as you type: - - - - - Songs Mode - - - - - Songs - - - - - ThemeManager - - - Import Theme - - - - - Create a new theme - - - - - Delete Theme - - - - - Error - - - - - Make Global - - - - - Delete a theme - - - - - File is not a valid theme. - - - - - Edit a theme - - - - - Edit Theme - - - - - Export Theme - - - - - You are unable to delete the default theme. - - - - - Theme Exists - - - - - Delete theme - - - - - Save Theme - (%s) - - - - - default - - - - - Select Theme Import File - - - - - New Theme - - - - - Import a theme - - - - - Export theme - - - - - You have not selected a theme. - - - - - A theme with this name already exists, would you like to overwrite it? - - - - - Export a theme - - - - - Theme %s is use in %s plugin - - - - - Theme %s is use by Service Manager - - - - - ThemesTab - - - Theme level - - - - - Global theme - - - - - Use the global theme, overriding any themes associated with either the service or the songs. - - - - - Use the theme from each song in the database. If a song doesn't have a theme associated with it, then use the service's theme. If the service doesn't have a theme, then use the global theme. - - - - - Service level - - - - - Global level - - - - - Song level - - - - - Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. - - - - - Themes - - - - - TopicsForm - - - You need to type in a topic name! - - - - - Error - - - - - Ui_AboutDialog - - - Close - - - - - License - - - - - Credits - - - - - About OpenLP - - - - - About - - - - - Contribute - - - - - OpenLP <version><revision> - Open Source Lyrics Projection - -OpenLP is free church presentation software, or lyrics projection software, used to display slides of songs, Bible verses, videos, images, and even presentations (if OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. - -Find out more about OpenLP: http://openlp.org/ - -OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - - - - - Project Lead - Raoul "superfly" Snyman - -Developers - Tim "TRB143" Bentley - Jonathan "gushie" Corwin - Michael "cocooncrash" Gorven - Scott "sguerrieri" Guerrieri - Raoul "superfly" Snyman - Martin "mijiti" Thompson - Jon "Meths" Tibble - -Contributors - Meinert "m2j" Jordan - Christian "crichter" Richter - Maikel Stuivenberg - Carsten "catini" Tingaard - -Testers - Philip "Phill" Ridout - Wesley "wrst" Stout (lead) - -Packagers - Thomas "tabthorpe" Abthorpe (FreeBSD) - Tim "TRB143" Bentley (Fedora) - Michael "cocooncrash" Gorven (Ubuntu) - Matthias "matthub" Hub (Mac OS X) - Raoul "superfly" Snyman (Windows) - - - - - - Copyright - - - - - Ui_AlertDialog - - - Display - - - - - Alert Message - - - - - Alert Text: - - - - - Cancel - - - - - Ui_AmendThemeDialog - - - Shadow Size: - - - - - Slide Transition - - - - - Bottom - - - - - Image - - - - - Height: - - - - - Outline - - - - - Main Font - - - - - Solid Color - - - - - Font Main - - - - - Use Default Location: - - - - - Other Options - - - - - Shadow - - - - - Italics - - - - - Background: - - - - - X Position: - - - - - Center - - - - - <Color2> - - - - - Opaque - - - - - Outline Color: - - - - - Alignment - - - - - Normal - - - - - Bold - - - - - Footer Font - - - - - Theme Maintenance - - - - - <Color1> - - - - - Font Footer - - - - - Font Weight: - - - - - Transparent - - - - - Background - - - - - Vertical - - - - - Width: - - - - - Middle - - - - - Shadow Color: - - - - - Vertical Align: - - - - - Top - - - - - Right - - - - - Font Color: - - - - - Horizontal - - - - - Circular - - - - - pt - - - - - px - - - - - Display Location - - - - - Y Position: - - - - - Show Shadow: - - - - - Font: - - - - - Preview - - - - - Outline Size: - - - - - Wrap Indentation - - - - - Left - - - - - Theme Name: - - - - - Image: - - - - - Transition Active: - - - - - Size: - - - - - Gradient : - - - - - Bold/Italics - - - - - Horizontal Align: - - - - - Background Type: - - - - - Show Outline: - - - - - Gradient - - - - - Ui_AuthorsDialog - - - Last name: - - - - - First name: - - - - - Author Maintenance - - - - - Display name: - - - - - Ui_BibleImportWizard - - - Bible Import Wizard - - - - - Bible: - - - - - Crosswalk - - - - - CSV - - - - - OpenSong - - - - - File Location: - - - - - 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. - - - - - Copyright: - - - - - Verse Location: - - - - - Server: - - - - - Permission: - - - - - Select Import Source - - - - - Set up the Bible's license details. - - - - - BibleGateway - - - - - Username: - - - - - Download Options - - - - - Location: - - - - - Bible Filename: - - - - - Format: - - - - - Importing - - - - - License Details - - - - - OSIS - - - - - Web Download - - - - - Please wait while your Bible is imported. - - - - - Select the import format, and where to import from. - - - - - Proxy Server (Optional) - - - - - Welcome to the Bible Import Wizard - - - - - Password: - - - - - Version Name: - - - - - Ready. - - - - - Books Location: - - - - - Ui_EditSongDialog - - - &Remove - - - - - Alternative Title: - - - - - Add a Theme - - - - - R&emove - - - - - Verse Order: - - - - - Title && Lyrics - - - - - Theme - - - - - Authors, Topics && Book - - - - - Copyright Information - - - - - Topic - - - - - Lyrics: - - - - - Edit - - - - - Authors - - - - - Song Editor - - - - - Delete - - - - - &Add to Song - - - - - CCLI Number: - - - - - Add - - - - - Theme, Copyright Info && Comments - - - - - Song Book - - - - - Edit All - - - - - A&dd to Song - - - - - Title: - - - - - Comments - - - - - &Manage Authors, Topics, Books - - - - - Ui_EditVerseDialog - - - Verse - - - - - Ending - - - - - Number - - - - - Other - - - - - Bridge - - - - - Pre-Chorus - - - - - Edit Verse - - - - - Intro - - - - - Chorus - - - - - Verse Type - - - - - Ui_MainWindow - - - Open an existing service - - - - - &File - - - - - List the Plugins - - - - - &Service Manager - - - - - Open Service - - - - - Media Manager - - - - - Alt+F4 - - - - - Toggle the visibility of the Preview Panel - - - - - &User Guide - - - - - Set the interface language to English - - - - - &Import - - - - - Quit OpenLP - - - - - &Preview Panel - - - - - &New - - - - - Default Theme: - - - - - Toggle Preview Panel - - - - - &Settings - - - - - &Live - - - - - English - - - - - F9 - - - - - F8 - - - - - Save the current service to disk - - - - - Add &Tool... - - - - - &View - - - - - &Export - - - - - &Open - - - - - Toggle Theme Manager - - - - - &Options - - - - - Ctrl+S - - - - - Ctrl+O - - - - - Ctrl+N - - - - - E&xit - - - - - &Help - - - - - Toggle Service Manager - - - - - Ctrl+F1 - - - - - Save the current service under a new name - - - - - &Web Site - - - - - M&ode - - - - - Translate the interface to your language - - - - - Service Manager - - - - - &Theme - - - - - &Language - - - - - &About - - - - - &Plugin List - - - - - &Translate - - - - - New Service - - - - - &Online Help - - - - - Save Service - - - - - Save &As... - - - - - Toggle the visibility of the Media Manager - - - - - F11 - - - - - F10 - - - - - F12 - - - - - Alt+F7 - - - - - Add an application to the list of tools - - - - - Theme Manager - - - - - Toggle the visibility of the Theme Manager - - - - - &Preview Pane - - - - - Save Service As - - - - - Toggle the visibility of the Service Manager - - - - - More information about OpenLP - - - - - &Media Manager - - - - - &Tools - - - - - Toggle Media Manager - - - - - Create a new Service - - - - - &Theme Manager - - - - - &Save - - - - - OpenLP 2.0 - - - - - Look && &Feel - - - - - Ui_OpenLPExportDialog - - - Song Title - - - - - Title - - - - - Select openlp.org export filename: - - - - - Close - - - - - Export - - - - - Lyrics - - - - - Full Song List - - - - - Progress: - - - - - Remove Selected - - - - - Author - - - - - openlp.org Song Exporter - - - - - Song Export List - - - - - Ready to export - - - - - Select All - - - - - Ui_OpenLPImportDialog - - - Author - - - - - Ready to import - - - - - Progress: - - - - - openlp.org Song Importer - - - - - Song Import List - - - - - Import File Song List - - - - - Close - - - - - Select openlp.org songfile to import: - - - - - Lyrics - - - - - Import - - - - - Song Title - - - - - Select All - - - - - Title - - - - - Remove Selected - - - - - Ui_OpenSongExportDialog - - - Close - - - - - Lyrics - - - - - Song Title - - - - - Select All - - - - - Song Export List - - - - - Author - - - - - Title - - - - - OpenSong Song Exporter - - - - - Remove Selected - - - - - Progress: - - - - - Select OpenSong song folder: - - - - - Ready to export - - - - - Export - - - - - Full Song List - - - - - Ui_OpenSongImportDialog - - - OpenSong Folder: - - - - - Import - - - - - Close - - - - - Progress: - - - - - OpenSong Song Importer - - - - - Ready to import - - - - - Ui_PluginViewDialog - - - Plugin Details - - - - - Active - - - - - Status: - - - - - Version: - - - - - TextLabel - - - - - About: - - - - - Inactive - - - - - Plugin List - - - - - Ui_ServiceItemEditDialog - - - Service Item Maintenance - - - - - Up - - - - - Delete - - - - - Down - - - - - Ui_ServiceNoteEdit - - - Service Item Notes - - - - - Ui_SettingsDialog - - - Settings - - - - - Ui_SongBookDialog - - - Name: - - - - - Edit Book - - - - - Publisher: - - - - - Ui_SongMaintenanceDialog - - - Edit - - - - - Topics - - - - - Add - - - - - Authors - - - - - Delete - - - - - Song Maintenance - - - - - Books/Hymnals - - - - - Ui_SongUsageDeleteDialog - - - Song Usage Delete - - - - - Ui_SongUsageDetailDialog - - - Report Location - - - - - Song Usage Extraction - - - - - Select Date Range - - - - - to - - - - - Ui_TopicsDialog - - - Topic name: - - - - - Topic Maintenance - - - - - Ui_customEditDialog - - - Delete selected slide - - - - - Edit selected slide - - - - - Edit All - - - - - Add new slide at bottom - - - - - Clear - - - - - Delete - - - - - Theme: - - - - - Move slide Up 1 - - - - - Title: - - - - - Credits: - - - - - Edit Custom Slides - - - - - Edit all slides - - - - - Save - - - - - Replace edited slide - - - - - Move slide down 1 - - - - - Set Theme for Slides - - - - - Edit - - - - - Add New - - - - - Clear edit area - - - - - alertsPlugin - - - Show an alert message - - - - - <b>Alerts Plugin</b><br>This plugin controls the displaying of alerts on the presentations screen - - - - - &Alert - - - - - export_menu - - - &Bible - - - - - &Song - - - - - OpenSong - - - - - openlp.org 1.0 - - - - - OpenLP 2.0 - - - - - import_menu - - - &Bible - - - - - &Song - - - - - OpenSong - - - - - openlp.org 1.0 - - - - - Import songs in openlp.org 1.0 format - - - - - OpenLP 2.0 - - - - - Import songs in OpenLP 2.0 format - - - - - Songs of Fellowship - - - - - Import songs from the VOLS1_2.RTF, sof3words.rtf and sof4words.rtf supplied with the music books - - - - - self.ImportSongMenu - - - Import Error - - - - - Error importing Songs of Fellowship file. -OpenOffice.org must be installed and you must be using an unedited copy of the RTF included with the Songs of Fellowship Music Editions - - - - - self.splash_screen - - - Starting - - - - - Splash Screen - - - - - tools_menu - - - &Song Usage - - - - - &Delete recorded data - - - - - Delete song usage to specified date - - - - - &Extract recorded data - - - - - Generate report on Song Usage - - - - - Song Usage Status - - - - - Start/Stop live song usage recording - - - - diff --git a/resources/i18n/openlp_en_GB.qm b/resources/i18n/openlp_en_GB.qm new file mode 100644 index 0000000000000000000000000000000000000000..ba67f92d1960c5aacc9ce47122b14b490c06e614 GIT binary patch literal 31723 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 literal 0 HcmV?d00001 diff --git a/resources/i18n/openlp_en_ZA.qm b/resources/i18n/openlp_en_ZA.qm new file mode 100644 index 0000000000000000000000000000000000000000..f4c8ca5eafd0a08ce80cc88cf1fed7ed450319f7 GIT binary patch literal 22938 zcmcIs33%1TwV#{Z$#QdZ6C=imF2;C=$p8BH7Hn5dmvIOIz!T zb*o$Lvs!EGT5M~RpQlvxDkXo>s{zWCD$D@ZSa>YpnfQIY zQcX7jo}|=_?*Oh*YRNLdvn;$$sdbz2`*xLg&y#?UsOXi$0AEnipS%e8M-|-?RVos( z@E{9kTX?pLzTATR?tXLg8<)9Q?7a(w2G;wb1|Oip%$KQ;k|0c-_c%lo0^$=5AaiU+^BCV zrHd@ASH~TB1%6Mru*<^hEquQWeo7gYTi*V0X}Hqb~SIwCj9=JntuW2y{J^p{|NI|G(pY( z>vX_Y)v^(EE&7&PbjL3NuU04Q^$y@2YH{%dz!%iwN3T_?xJoVl$7g_ts+0bF1mG04 zqy+RRKEc9sExcbXS@|i_f2~d~K)uC(P$xePx)gt5V64W%8LI8g_mzsBqR#)%p@8ev z1?xbU*cIx^HCqAiQP+R#4}kBgTgITik|WjD@1VVsx#~Bot_OTZy*MQe_i^!=9#{s@?U}8+9^=a@&VsWH%3D`ZcA<}a&=$yDKa`rE- z0sNoHb$d<4@){i3{1y18?C8joQ}zQ~9(n$`Nq`qbUe3D#@b1X#=VG49UNW$}DDuGv ze^jb`R9+EyT$LY}SNZtGfM3r`K8SHuMDvD>{v7a_yx~7ae#QE{Nh`VmZ_it_3~PAr z`n)Ty|1sb>c{d$V3wTrBBRl#4pUnH@vOAO-6wCYj6Hfpho*(}{#y@CQe%Y3dfNSy( zn6nV@^8DoKp!cAA^N(-b4){v`f{`aEwNHNjQr5fAY5D0PmjYgt|HB^4|2|vuAK8KO z`+SxE@>5qRRau+=g}~YQe?6`lzkBlkzKQ9VMT@>{0Q@joUOQH)eG8)p-uM#W(&*4B z3jpto4m)Tw;CslIEPxggxH)=t*^dBEi(YrqF99!z z{AB4>8^Y-qWQwgI+az=?Sgx0Z!5rHueBspeNos9Pl zk6ZYGfd?LF;e0)J_9Gqgb8 zbvM$79$?||fJ|SmAFMbHaGidv>2H9y=x3|u06wkXeDFcQ9r~Rge5uqyds}$Cg&Qq= zxFBy3*4II=6;yPfo?-a~72DqfTu?A*GWd5`x?u1>z<0y0EI9i7TEK@3=H2@m;I@Lr zy%_(ne-td8e}q!Qs|!}P-Vb<8!Rl#{&%;kDIDHN9hi@#{P_!NJM+HB-ehc8k1&`lw zFyLzjjwrM6n1Wx`@1xX+MFrbG#=0KSU8uL82zYbhK}D|v{;qIb$6%!nt|>g`4vg#I zrotJ?3jsR{Pg8|}7g_jlVNVOz#lf!?uKoK$rAC$&o_$UiV140tFGKl}I}0y-cCAu} zv=m_gOBdtc#J z4ZEQB)xzJN^f}-^3t!n(r_`u1g>QZG1Yk$u_O}RcEXv#KZNL|cqMI)R{G>=1jZ
    ME7qq%zK+?yc-ieK zzzG(fY2n?)?dM_M#=KCR*^m$TS@GJ_b|_W9fARVEqd)Zx7OpJ*K>@~Bzp?oCOBw)g zD!zU5HGoeSKXBfAfFBn>{p*-ghZPrZf9S`6Lt}?Wqk!qygvHkaULKpbc|G90u@$Z0 z*TY^0TnhL}Y;|L?Qe)$>(+5HRj~yP{a4*V_T@<^d{cON*$G&$t=y3Q`v8(Ty4)}iT z=6e!KjZ4ICc?kU&w;}fPBFxXY%VQ6G^a9}Hv4<{f0sMXJ>1OcpxX)w1+6;I^GWPr# z_W;f;$xnh_M=URi%I|YZqCbVrcEmL$1=9$hwQy%itoLc9jvQRlbt&ZCk%yOjV>{qc zCzo8<__k8x4=lOyT#SGG_>voc4>>x%)xv8ne5vH#?aw3qvywkWo>1!ORVD8%!nlsU zu;hc%8v$P^`E+JlsfLD7P;JEl@b0J5+wkm%4#KC|!#jk!~I^bjR zYa*`!eqrE*;qhyBJfzfwN%7kzVE!g7iQidJFk@%Jf zVNLw03xGfI==l53qTY!omkw#f`ki!qY4gqoz_UtMH?V z>9-`FT6!4ZV~JPy-wybf#A{E3uNsd^Y}YTjeje9?Bc<&{YRBOc{%c%=9Imi$pH41y_1J_n=UQ;csBU2>He~h?|TmL&k!Cn z_Qi@)QPrr%Yrv}_?&s0`dA0r7qcRX^DmJ+z)tgDTv@Tc3EzJ12;h$&n=b4gQpeCy} z)rN$on{2{V)vOjFVa9iCLW}BFJ-PKSSr*Jk0WTq~QfdVf)@>GyA~izILDE{y4UJ8j zf=WBsF!nZ*RH0_8R@JV$R1%}@2FxJyCofw3>F8#AKf}aUC>Nt*Vf(4m+uAeD-Ce7u zwYPS3uL42(#oP~=#G2jO-jzvpwRWvY4O}2thu_7QTWkl8#~4$pM|0a{lV+jMXQ&jC z>YuPlb3xvjsu@X5+ig-a1`ezo5@VYd#z3J!5^1ywNjEnMR=t|5de8w9uvI=&>P)ns zRv97dDx`B}deK(9TESjnzb8d&)FR1Xc2dm(^;e(@7GoO?nj1ok*n-3iW{!v>@Q>*0 zP$z3lYwj2YF@~&0Bmz-$`{*Tl6v1B7OSB!=+*o>v&C>WPQYD@`v!}Z^b82U*s}D1Y zZD%%CIB^kL7JkEqR4|hux{wR~oerw>;8!ok!QKmn*h(dMVQx>VYu3E!(wxT#*v{@* zEt)&t9MqYrGq*v_O|hU34fJgxW~f!I66!Xif1HFq(iJ;rL9S9$(Bb8F0yq>i!9c;L zT2N}#0+jE>2*FbrVKY8CUn@{oO115Bq}Y)E-|Lv!$;t7kwTE?R?)Igzm_H`Xt-qJp zjWMht`@s)j6Q{~hT2(KHk&u;}YHM$unMrkmG2kc2#>-CZ<{Dt(GR*em<=uUL$Kh27 zl=ct@WQ*P6XAx!q{3^?K984DD^-}`l@wzz;ywM7RfI{$eNZ+eLG9v^!0PBR!x$qCe z_j(RHYbn7qviowHjuT6o=~y?ttX3+U+?QG1-J5Rg?j`x*R_PC`jG}mIUpmv>xogBy zC$o2hMoLZT?q0KNv_V;Neb?BfEvr+VsoAYvt*cVK{f{L$K+3i*s3edcP9Zz$Mxjin zBwiV_iCq1%q=o5bcB1~-0hWaeDH~DKpX4P%53*V$F4-iBBcLeV+Rorx5*?wWr!-50 z8`{yWl&aJ8LP>$DoB|!_5!3=uJ{mS4iq%~3UD>|OL8(qujWNTKWfSM3-PK6!)%0rF z%7WU2;s@&$;%Bv{!%I+(RVSk7eYWqAO892RLj6TK)hnavmIjj|$$GhR@gF0Dzsxp2 zAC*w`tU=R6QOO{Xj;!`s&%UU_pzds}L1cUPvjy8{Lx zn7JQJKd}NDQEV$voK_iRuBOLO>MmDP(NoS|A6N_XsOdzMtU<`)K#cYmdXqKaTa@ft zPYrQ8)2N(k31$cCqhjI&&qD=J!j$T2l zME5y$ozid`pVmNx2Urlss%etdBiur=I3-2q@+}vSvtiuOZ7hY&Xh|5~TBDtfeS);w zpy^o_)In+nGH7K=(LQxEnJsb?1_nR39oQ_P3R%jv#0vU=MhXKJu5dv$)|=xg zBNGD?8X}b5N*hp{QNl7;iNkyxeh20tlAK)ZF ziVU*r=}=k5&%?nuik>#jj}&y4?x0o}+Bw9G5hux>CKZ z9kQ3_`Ngh_Xb)u&mRT!$wFZsSPU}PSZJH+^QUggGBrV73WQN%!^`RIyhdd-8YyPb9K2u7k^tkR`2iaRc{5Q1nIu?>5|}LFq%h?( zRffR}w$6Ik+6s`Fm0!RRx}`=C6{+OumOX-Tnh18UTurA7Kv%b1;go#siH z<(H|LU{0-(lSHJs$(2n)dZg1lG?OA{+7^uk7eGM~&Lk;JK5;s?P559MW-*CXYOKPw zl54~z(xCf-+8N@wiY>#!I)jZScE9B05Ru)VL@d;IMlf zH9CTmMybN62Yqr8+^z-NP)|U!X`X`$N=_D#!v+tJN(J>~5%iQal;)&g zE?+nW?lC3sC{tGgmrP7Pa=OfkWnpH`lUUp7utW@u3x~9VGFrMAwo-h1CForO?`xjv z+G4@=+J!E07%MRs9r#D}WXXe$f8WA)H(CmEu8SphyGjjbFvTa|UmP@sb7)qaXjyrXVL3%&ktZ?LlZ5NqL#;61tLM430&eTh)Cd`S@K{H%I5aO69dNGY>g3$|J zatD$}VNWzpGngSK`6woT-%I9fQ;modYoKjEqaJowB5Z*7UqT0x{h0w&kf&Axof?{gZ5H|yJ{M!) zkQ9o;IQKSEVIqY^1Vf8*OK2~-8paaEv+F2V5;w10RSlW}Nm6=PXkY6LPvecDT_BEH z&A25&pOjOpE5dCSg*f#a4L_QjwC2b!+=_5ZLi>=RPf}H-GA>sVgr*vG0`xKvHul(o zap#LOW%gM!M9L-ylsYMteR#uQss1qs63}~6B8&R{wxPX>DrMx^E=7zU0bJ6z7EDKQ zCqiP;HOey)ryWB^0rF)Bj$H1Cg4-wO&8X9i3$sI~W0LMQsBO(KF)!Kk4`@b>*kfkHkb{Z9)Ek8mMIISWN$cWf8`o6oLZ*Z zqg2%BBMCC$n9R+wgpsm-R^=4uQ`U(Lu< z$*vLiMo`Opb%;Zkp{ZUy+$B-(1;&7gRmm>L-i6Yb3xpGs)(m2mtP1#xxm_cVQp|MV ze2tNVi>R>4u+*d>(8u_uxZ5@VL_q{v(7#An`?wNQHN&mupm?f zZ9O5K#3&^gIwX+^R8LAXxOgCZKeIOXPy(&a#C(_q?K~3TDa|lt+eKVWLCeNi^GrF- z_+>%ZI-v5U1|tj85aD4?`1sZrBZf#6EdJhEl=T$~+2Uxd*qhF{vzjB}WR z84%Mgm2$5Oa1<7 zcqfQrWKYlpF@`${X=Fcjf-!Wc7w98QYsREYW!wW$fp7sBw`d09h_k{u^mUIvuWZU3 z__ZM)^MSB-sfuS{-fk0xL(5MWBI;ex=rreIb^KQ>zC_Qh2hs9^G{W}W zxs+U(O_m|68CEX^#s*Fxe1^^TZc*qPPQeL;W-PuG&OK+zlF;a=SE**`zU`zx*x(!) z*7nG&8RIVnD$qPnbJ&Ge*pXma&A@-j7KCAVCr&xDZJL({ z1d;xvaNH2ldw{TSxkcdagQM$3k9dSgil;TN8wf%zjE1Z(1D#uSZrZ8i*i)*16vEvE zDO86-p1%!z#DlOFHjI%YDg(bv7^w?A;bjIXSQA!Hwk6Lgpn2Ot5RbDG+cMoawBXe^(bwgYS1tC|V@1>q6 z4N-~kMut@Ht5~b|QQZF)a3+wPnin{v7{hT`x8V)gyqb49B&!-$lsQWX)U!#U~*m%3S_W#_5m5VF(es{SvtZQ1LnZrg;X2)$PE!S z8xJ;kkVMR1t;6luMP(4C-pv8kV|u_kM&WF=rr(|$9@$cJcNev*t4SbhV=B{>f$ zwrQHTq@(~h_r7HIr6-pVw>Vv(QA+bN711N(Ma)v1B(cI6ctxs^c>HB_6b)xuWxlJ$ zkUVIE1=Oe1<)7ElD5ZX(F+{TZk~L@y!xRA?1Hq|4*5JF7%``I2Y2b1h7~7_CL!nP1 zGibrFfTM_CnnoCxit#3}6x$E#a;g@F^01%59=Te>qjck{)4Yc!6tBXm7CYhsJ^TgB zD{B3s_(l_NuL;WX0j+zIjJ%y~nUl}6H{jVyi+*l4MqWghaYarV<5DE8zRsVbI#MK4%57AXEW$A@OI#um+vHlhCxWypyJu+30c!b zFYCK`Bxmu7YRFPxy8`Rd)y-Vu(B^3a`RL_fog^tDArV*QTH=X|S-~dq%hkYj=C}X< zA6LaYnL^wLatJk0FcvM>T@%G8F@@yrg43w>O$qL^2O@;o+WEPTq;;CtNo5ELtds?y zANPOIjGFgLC8NgQsh|a?dVTj5FQ5t{O(e=l7wPQrOwuc+>6$*_sE>yp~bUJdO; zrR%Gbf1lSrDC;I_UbB_43`Ub?|H3WnY&1@vok$zaJGg?>02xmGNOpCykNtEm2J#4% zj&IE`^ee#yUa4fMNHVS(W74sJn_}uU?)Aw+W?vEPuGv6Qi}@QUXAHQ*h_vPnVQGj5 zg=Vurl^NW$`*9{f$3Fg0!@WTZnevxNTs(XmpU z=1p!Xd_8Q(w3L z8b6(}J;Q83JGxGKg%&lhntP*UVRvPbd_)V+L<)1>d`__Di{|}wDVzX_s6fn;Sgm`6uo=N?@3yag*t+i?AYoR>jBquOhuMFgy`XEF zcjcvUg%`Wzn6N?f0=;C`=4?-VX=^qhzK4jn?WIt;=Nz-wEQB+&Pd|AXzkhU{lf_Ml z#I_-8$3wQ%0+58FmFIl)DDXDFWL3$Dh8c8-$m~bxz?c{QcU?q#DCS;}iEp5>&A@RZ zp|S`8E0hliNWB%-77X65;Hv_52<%-b3l9z0{%}U^SuC1r1_9Os8KcA-1cLI%td-`T9Rz-YD=ENM_E)%_}jc;!1o_)p$&mTU*82DrL2jc$Y7HB zaD-Ga7&9N_1LvNg4}q^r2+~lIlR+6_6to$K*$wmQ2|=!ht-v6cU^qO9&&>>{g1VCW z*oNnUnfY3UZD%^rj9=Vw2YJJpUswm4Pg)3aZRoVgH{yZ@#w=6@{ipfn~C@N`9Ovs&H!E9PI!!b=k$iz$QYbqM@o>%jU41#8+LTQXy)jQ-r@LsAnepvI$*jOYZ%%+8iEmVmPvj6$MjH&Hdgjjn0PbIpU|eD6b=`B~sVAk-5K)f8iO zH1)W4{#_Rm%$j9qNiGhAkOOstw}QJa6;mYI%SVE3>_9W)xu%9Qv;74W)Y067`hwBN2{0iEg!f*Ao>d^VyVMo- zv+^kzL7@Z*mJS{b^PLz$N`xY|F=2Q(Ml$#S3a#3pJ#0jDV9~1~nlH>qfd=Sa%2?xq za(C$*uh4k%8G}6Jg@@tjh0oJSCDqWHA=4H;@EsC-y++U~!45fB#>j4X*2dOjYT-O` z$6{oGVY~*-S8oK3c2)R*$v0#2@^eNJCxyZ9zm-Jh)kM|G~W4Qk7SY^j17~< zTu>N$?5Fvhk08~8{^4;3<)$%r+_gZy{Ue1~m#;{CCp7hi*nyhQ14YK*0n9-P&pOFp zL_UjECBiJ+-)MXpD?g5LNq}?hcRZAazm&qmMe?^6pWnd$Z>vl2d4>9cq$>3jb*KGC zaG!cq;mIWYy(FJXZ4>yR!b3;$_mzbnh!pW_q&$MBk0PTZN8r=;Co;t$MUHddd>C28 z?~#)usmSSp)Nh*akxdaiwS}imiE|(RDEe35YOygaK zX{k(Wdxs6`E@_u%P2|lPz7^8a-P67zZ8KFo^ae$-JRTuNiz>^G(pLKp@W6*Wci~^? z_k4hoWE(2>o^&cD8yESM;V*U8!Y&u(Slm3b$ztHy5eW8w$jzQ72oaZxBIP+uDDX&)vD`mceQ+Vf4_6@fByfOOhRhzSF^H9NceV)iej!$&wwQxoV4pI~{!5!4E79k8!Zw!Hu%~ z_*cN2Z#a05blv|1zCR(S@4gxE6*=?0;{e~2v+6-#_%jR53;(#<@l0 zv!!PO{$=R!4>kdIg^oBZ4|qwaz3z6vCqiph&jftm!rD2ZzO!%~wdaSv_RE_9Zwu}E z6V9pjx1nFpKSZQ%Waz~gP6S*Wdi9D3VBWzyM~r#$T72I#BJn8bsh>aMs5`LF`YT5K z?QxKU`d^Otk71Q=3zO`S7KCAWsdqhA+$B0QghD?*YCLzUBd(Tf^HH#zs5X5#Dwk z_!>JiynWHn0rTOVX~;?JS_dBv|ET(h_`WB6&$WMsSVzM5wt$}agz&xhoC7%5!Oh_Z ze+8M2-yHtqY2au4HB)sl=4l*f!ka-y<7@{rCi(}g*LbB#+;<(|y=LBJ;Cth{=EQBc ziyYMCV5@`YJ9v}ny8f%^f54nQ8|Qb>KbW5Lb^^X`VbihZhU4dnG+k(J{ub_G(>@DF z9%OE5{hi3jN#@pzdI0Y-_dkjCM?UW0@6Ash$tEK>cR(-bq>tld>tDn5>Xu!`bJb0#qYpb7~K3e49i)xOneHHM#H76ym z0sMWjVW!207~i0pW%1Ms8B zoe#xC4sVM5T`l%;_{PYdl`8;mi9EZD@cGD#n;!z)Utg8DULu-N83b@b0BU>EI)$a>|Pe*<~TKCX@ z0X`FLoQ-=mu_`*@V%+D6i=)e?|1;qKL{F^+-chmWiVZoyInnD+fqp)!5WV4qLjivi z-SG(abJTm$2jakMKE}cB=+jsKJHB5X{g3C--~4z(_12XlM?cmuq4VDW_cqL2eW}Q# z84Vjc8vw6s_|xpW0Pl*;=)4i|e`8nNjdPlOOzi&s%K#V09_-JHO!<0j_wQN(e;j-I z+!=sR#$F1)EiyG6`pX$1CGJ6dEFnl?#R64DKnge<||g07Q5ds;HG zUNMr=i(z-Y?3U>Oy3QpzG(Q%0%X9!gfwj|ieVA|8u@FR&{BHiO0mmY3y{TLwzbd&- z49$8aykN%y479X-EE#m%xll*Uk~X*#+*b|@_v`ZHNlu9%>D*dMzJgDAY%B!~{5A9( zbb|5V!24+GmtI9}1_uLNFmx>xu~F>in*Hs;+t99BjOpT{hK`3eHG`2!Of(713={0TZvi*hjbh0u6 z02)!|XR{lJMjJ)6rO9-rkjf-8>r+ExH>}!_>Psz6W|BRrT;;v^8;r^#2uTuG90Jbk z6<^ecaX}%0E9wq7fNJQOYICieqW2zJ15T>LTp@3&i5HmQp7IJ;80yvKUD)kEPo zuIx>Brxs*0gI$bY#0bB0qO|LEOJVU15Y0Rkfz_@_5L2MAQj5cR*VSXVo&9La z`^qM_*B<>A_Qh=Yj}W@I1_x!4T@6t$@_L(+nd6 z9hi`XI@mQv(xR%oamscHhO2Qikw1c-SbM5VY%gd#e7 zBR0taeONY+g~1p^CyvH8?3kVFLA*!fDVUA?SR%^}0~ke}1s-P6$X)j+H;c?F4s63f za)Xo6GLVsseB4@8v@{X^O3Q)XkLk$BykT&psMPHim9}LQ22igi&_+G&orLOH{~nY| zH3O^9GnXk2Xu*MJuoO4Ig%dC@{rJ`ko+JRtgaZ09Xw4c1Zf>2`*qpV&)+Vl0)E+n{ zDIL5X!&(g^JRLA=7&1)5N_$TOXRR|GQBdop$b{w=|^3xpCUV=ygvad$mhW+8s7Rn zpf0PN>4iRGhCt7z6^vg8vICbBi&?gnI#HI4%`i>eCQTF53p&X(NC6e5-T7eNAg_jX zkeQFrfsV@$nYyz^~0R-?pQHth6n|8oMCoIQDdNj`?Dr8Z~86jzYOuFk_~3GSp!F*bAmEGfbd4YRja>FsG(nhdKv< z%B<93vGiLbeR`*xs_nBF1HlG`Bgl+hm83#*$MlUb`l@uFy~FWy65+pJ75%gOM;|-PBM!QEOkC>V@vvIfr{wJR-US^pW;PWu0`=%J3F>-l?BmC* z%y3r1^BtzrIPk#urI)G_z9}|FRRz-L#9j=utV#=;i!Oy>(p8&VWw+`Ya+DUFJGZKf z2FtqlRWx~9yRkZL2puQJ5!Q{R)blcC z(N8DQnj=a)?RYTlVNcR}E!)@xVM(|EE6^4Y()FP^w@yr{sj-`&0XooCKEW^@?x>>I+owa4hS_m#W(;ZF zyH*}pd}S)PIlbPGy_q&IM>NI8SV;y+XJ|q`!%H1_85ZW+b&@iCGe`%t1hVovqPb*+ zgkC^jMblOy+s7-8^t}!kH8B2VH?sQL-K2447QDC7CB|~!gWf&70t|0l*&RHQQod0sQj5xq zRlGL*V=O?)p-`3w+8>T_yy2H94>Qw%ANp8L*AJb0qXqtnWG zFqE2rd4k`)`4R~IDb2JVHdnA5X3=J`!49|cbxNrhM<&#k+C&ZgC(cD&>%^0OQjfUT z@a@hqvr9Q_O;s}lh#R56CJi6<6sb|0srqSmL5<;CpLVS(F@8J@l4J=gcj?G7hJz%Y zzjVh)A`h}8?lF8q)ae(ip`ujV?2ZkMtU01+BtaSXNiCy!J2xRcOwX`oAS1vre2>&g z4=d9LB_X}xbETq90a|%%)vm-2@G%VEHg(YSlEX}tUrCU)2pkB;&3q2kp~seyy;7pWNU_6aOr8w=%Z3jki&IE@DST@ zHq?ZkL&SG@U7;!9n)6CB|IWvG?c7x1wppRzOw_&{z#H!i3f*8T5=y3*G`2!#Ew`0e zvWOallrl3-s(E)<51>m^ACzD8B|uc4*05Ya(Z=AmSY6}q`E+c7bp(nKK_WFFTkt#C zu&6*A`8MFCiao9EWhN`-!dZo&1DRSS3oR1@2|L3A1xJy0I0=}vVn)xfazPQ64QkBR zD>HeB)XH`ZYG&(}Q-kwTkkwwkC<1ispo=x@W?5{?Zu;fiv*l*tZj`YP2AIQGec;xD1IyV#)#dws9y`baG9vgEVA(=;cq zmFHG`+90C5(=cd;l}<|CG^B#5LU?68T|{Sv(%@S=Ci5s^NyE}89XPklhoUm3w|I<- z;J}!30jMcvSqv+ybebQ^TxkD!#b|+R`>&95QB%v_gkt6JsRP@xl=5-Yd#z+J$*s|e zx4le05|a+Sm)IqVbkNzZr6Kq}_??>Ot!Y^PrNpxAfFTX}m^Z8j(`K8R52nk?l_v|v z6m@z9Jy%Ixufht{@K^;kW;%35G1ckOPUC9dY`ACt{m>paUCL62lQ^ZXmn>Y<$s0Ae z@ZU>Y4Qtu7YgPrDJsgLbMQ}O+pNIUKr83sg`>PLT3|T98;9;hSHVK!J&nihgL6uv5 zhM+F{1@D2?cRKTbmdPBSQEV+qW$B}Y4kddOd)^OEt~?dwIZgIF{4}GlwJDJ-*zh$! z)s}U$cvgIV@hyv0ht%%YR#-_N?AgzrHthjx<5+U&*jlN`!jWWHk*H|xI5Y-(_O_L3 zhf*u9-h@h)-De=gHY{w^>AEV&JxSvdbd6{{hm)%*lODs0NnIc!XMtbj=Q)PuliJ9H z2wBB{8~j4pS$bf(h*i1a{Bx^e zB_}&WQy`00Zg>Pe&~P6ACK0|4Ae6mmv^J7DM&S~2O}xYdmebm87RMYol=Re?5RvMEPGXsGGoKX7CJeqi;Kj% zstCi%SVgsOq0Dtr5Wskp%4)~JcQW7o9xMyMcQV%4>IBo_2m3MeR+WpO57-3~OX`9Q z%W`#Siw@eEDBpqDWM*~PEgdV&3tq&f5ZGDcgwdqtP|F$ zC&>zs=;h6=#FOcC!0h>Hk_wNpEGgC@i3;YT#Gy2-I#$%_g9f+0(^rfRAt|kfg~~c~ zlM%Jopsne4Q+Uc!B>7i_vlr#SWhRY z@_8hA!+L3*=vWvftD~vl{2O){Ifo-mAE#oF42;D)jBOS)k#<_<{f3RvZuE?OApJqq*nLDk1@~`tX^))r+UwumfzHy z%x_qeU!O~*GSX1`;4D$^Jx;4`8##k56?U|aM2n@bE1kN~HOeTo4t&FibMDo76xez@ z;^_5SP|Rh#(e*mi!-)iH(t=zq32=lnwc+)nTX|$>ij_UH#>?wcC9*2JDZSp7J=X_o zpe?UhYVU~Rt4xJ*ZixhZ&PFY^aHYpuWA2YCrS>4q<}udWHJ|mA`F^Fd>(csLd!l*@ zqnGDW`BbKmETpp;zraK4bib5HN|h6dW!XZCOG%?8!M-QyJR{4N(?+QeJ|#&!xR%P( F{{i+YlWPC~ literal 0 HcmV?d00001 diff --git a/resources/i18n/openlp_hu.qm b/resources/i18n/openlp_hu.qm new file mode 100644 index 0000000000000000000000000000000000000000..c6632c745835ec60cfe298ae528ff8d11cc9f320 GIT binary patch literal 35270 zcmb__34E2s)%V=wPL`XSn}`S$kp={0Ga@2js%*0F5I_XC3*3Z27EA(4tbVOp_o{Wl zrB>_bUU8|oYh7NoE_Lgtwpy(gseMZom&W2N)%yMa=gjlm=ebKjzc2pe+-K&@e$JUQ zXU@zV{@|)!FMM*%09~L40kH+qc zx)l76vBQwAu&1#jo&g+f?6hrwM;m)3zZ)IA#Mqms;rll8y>ov8_^{dU!}9>YHV1r# zI!F7Op)5B#!wh|OAYh{z`q2o$ADdy!H@e9Tt9uOa5i^YWM*n1nF~4Z1Lfg{}dj;*W zLrwLM&jg(4;Lps6-}C#o=CDil2mH60bmddV6pb>|&PKh9mOJ=>!s5Nnv`tT=?-!YA z@1Z`$O=kL+s88`ZW=85CfY+Is!%hdh-@$DPOUlj6(U%)jGStDN96aB_#~u8anf1Uf zV@eZdc2O1J5C@ZH_EjtJeU5{h9emBf|4|s*&%qfEHk&!o4r5|JHgi&h*O)n*Vt|jE zd2ieV_>P%B<_*A46qa>2^Os*_OxZxQ;QV&LNoK((0{}Og1z$`7+-zze{tWQnX3?<8 z#>6YlqVYcg9Ag%pf$@s}$Sk?@zW^^aNA2}@z+27I(s6(A={aZ23T=45l0qe}BwHVKe8_cz5 zZUubD+(Y${fkJ`a%0RsgCgq=z_{*HA89AvKDR3DQ4l%piK~t2F){L^B?kkZ8M$-< zzaNNPv)7S;??<-$`*px?BF|3xo-sYEBd@$X0WcZ)L&5ccXGPvV8};mYn}csgcI@~o zzP~6aDL{LAB?@{xbs^yK1yv8DpL+Kw=r{adfNKi|B-R7oSTOJ=3-~r5@b~ReF!pow z_r41XCai1$++48a1jxWXdlg)M?M;BI3$6nBnLd{m+<53vz&8tSA^+`X3vL~L8DLex zt>nM`W;obZux0xid|yy-@9i%GZYj8L4f`2AJ1WLJ$b0~(^0Lq`Ih6aD@TZvcK6 z?LTRuF#{(@2kgHE@YLwY64ZC#z0nhD&>sWeil#QCj2U!IbYo)&;2Y77yU{O$K8<$V z2Y7&up8h=29nd#=MhnK{fEj>S0G<%N;I0*bCpmbVgKtMKy5u~B{}b>jV+NN+FL^5t zI3Rl2r#}Fk6W#R4v4D*ZUKqV{#-sSYDSG8D)OYZs(W@%{H{e^*YnFlUhEztcYd}6j zj&QIcdRr0Vhx{md`-T4j{0-nYfUieyzo-!K!|3MWHyJauz`?-|E^+XD2cL*;z8&=# z`bUMs3ZwTtjs70iJNiIJ0`REl(|2Qj8Fo$d#i{7uVGl)L*?{&Bdq?5$9?`8W|1@U! zq0#NN==b5v96T%9`RdQ`eM5BTQOf||v5^yR#B@Kz7M_ZJIdCZ;+H>Gq8)be6{>Z_H zZTw@#zh%pB#&}dGY}Fm0pXx*H=n<$#^%^@a`47Nz?YJ`_H>y9j<8L2m%t1Zvgo|zf z9O2*z4qoZtt9IT%jO#%=?Bbnh$B1rr$)!I8TyKvVi~b#Pfn9at!+_V>RL8Y|Z`!(Z z?lb1#LR(*V9pE4be`;5cLiq>3W6wVYbUL!aUN&YN-~fB|`TS1VpPvK0X5^0?yu)5o z^B%r`Yp*?}-k3xB**l*?`wkiFU=k4haL5LG_dN_h-@*F;8UCETzXk0&eE_(5*$?8j z4*+%+t)7he{;(cJC$2@lhs`QFg?xBeW6_xMXXhN7pgKLGG52VZt@SJCfA>|@Li_9@!->0bdy6x(f(J3pu| zj&EEHcxCbaC2s@%uDJRx^w;6B;!%yg0f!X-;7)$m6;H3a0Pu?9>DPAv-e0`N6a#*s z@Q9wp>lQ&?95K51q%V=*5iP~1{kR$M=Hk<1oyLq?P<+m%$Zy=u#TUGEk}>1UiZ6Ht za$@{o2Nybcdhx|$w|z#owtn|eyg_1BCCe6{3}iWi{MA5`+l zg{arGMGjtB^7I3~j)iV*=G8d3Cblv;7vJXt9tU`HZ1vPqz$arTc85MQ@6FgL_aXoJ zrLl8w|8KxivGec7IM1IGySU*rz;&^oU54>l@Ko%od#3>YBX;w>31b#k#BO~Q^aJzonsQCk}O-4?=8u~#-=d~1)5{mnq$ z*Pd2p9z*}tK2%m%g>kHXrz|S*UzSC0yT+JBy~~Ow6E1e}7iF>5=kfh=*_7X{2i#FM z>)C^iSsW{y_q|5I+Opd39}n1EcI+_po>6wg*;fPJTz11dalq#l9=(r)$+G*ly<*JKmy|s>=V`!C%HF@NpE1jd%KjF4 z25?r{-}B@Qirry`SUzo_M_D za=;Jcm1DvG$M%i)I~9C->`&wU&M7eFxT*0&uKXJCjQE6C(Z9z%7oR)gO=FJ#etba* z$~}IRgD1upu5QKmwegeR1K#n!k6$`(nlUF7#V;G*8?YgM)q_(2H^r}x{0Z>)4*n;8 z^;eG?lk6G)#kQ*fN5?mhLw_ZYj^9;*{F5CH{wDtGqd&m+r}2kBLAzEQ6n`W_xG?_Q z`M_V%7XR=iU$CkmSUV%zm-^c1KQcpnmGH`7XZ&qoOk8NfHx-Y{0jWj@OI*! z^=S8+j}rF|Yd2=?-ib#Fe+YPZ;_>%T?%Mjqlg~W{cxK|c<3NvVKTEtCMShJV5^wFh z4KSJb)AQh?#s?GczKi~7+?wdDSO&PO!c2bHn5H8t`cJ|*Hq})Op&V$suHvxQAt#z% zteE`(%5Cmfv1A7NrFmh+CH+xu^Qje^PdgOw+KRh&4F!Cu;@*p+fS*@9d0}s3TEAO}8A=I6;0TTrz( zKkkx`Zf3e^F&+4Ct4W$w__r-P+i5p;h1+d$!|_vAHMG~ZG}ljVNH(_AvsL-iq$7*W zk*3xxLBRC0q=X_f)f{X_AYjIXK)}Ham>38c$$&``5H~ZV+6|`O)F62IPzjD9r<7?l zUzx`2_AEa^a1v=8(`r&otPwI$_}sX~l{v`#$*i$7R7pT35^hK4Yt2rx0l!+Uf$d77 zs?0=0B+WWgWmcdD?U56KwjCC?4uss6Ej34g|FVAteayM9iu#%wW62&p8Bp zknVdJIu6^MWJ7a%syW%bGUbopZjz%Ne!V8;Y3LsoNyWRHIY6j4?dX?Q{0ka0NlUYx zi=KptMnomiX(U7-A$pj0Q!g_GX*VK=X6dFXpb4Dh{qU~gdN?O~Wa1*tobbPxm0v$TXtbizfu z{zioB$r40JUy`chsgu{Ww6-7LlxkiN5dpKQB=&LAL2)FTi+&(`fD~X*70jWU7rH0~ zv-CO$E+wZ%A*lw0H=^s?(D_N0*8|i&Z(XW+_WUVQuus}B%zoSaEUma1i5e)+yQ+kx z$yX9pyP8YgP(RkPL*QBrbCnR0ij5Z5-qJ=a3Hz8yKwcpYBVr?Zr5(-hKMnQ|SdH|(finrL?5>1G2yT^( z+DwXFRxznzMPq7CYE?sWMtiCWvFU@(#nCv-bXf01=X7)*SEE|G zImzZ^eX2EA3(}3M1V?ZVqP78!V3%XhM%vp;C@xD|5tNjobi)kWER!(AJSM?LiQE)( z{ly8Q)2y=G?vbD(lm^}thMCcX+65T~dqF`Y%S|B(=q456geSsZITt%c5;+`YP+P5+ z8JE;UZJ-L&qjO}ts8SuMoal4dSdwIeb0+IR!u61Zl!$GpI`j|AJt#>sId2k?GeVr~ zMqe8tJ)v_{LQ_Z38hkNDvWp?R?Lz1%1N&MM2-yz24I+-45KYnJPhghYUV=8xP0yZ! zL5Y@M2@$0e-9dTJF@{=;eKX0Z#K}qwJGRhVy>#l|ZdO?Cr%7P%fT}{(G)*wb44Z9& zGyyGQSFrP`%{02MXa;Llp()#;|tgiXa)Yu&#16=}^%x~I0K1J6Tn@o_ zC|Z`JTH8`i6kty>KXzqpW5cS{kuA;btu2jMYC1M4d z7ceR0BYHVDuBCdFBD0%BnsO<}aTGUECNtal+S#F~X0#{GIG|oV|NG0F^q~V$~ zExO1Mlu#|`NuO%45idD*10yseK??PuU0@^m8N2fmIb9}QR1($YT22X`ec@^Ko_J)x zdO|+TCMw9e(Jxu{#d=ruqgts@y(FX2VI3&6#?li&5Qhqfwn?d6H;|Y;mSZcJNh_+p z5&c8A0ZG&y0%!-SO2SaW!9-{2O(4-#W-*#7dTF44oUB545~%MgU5rH2bFWIcg7ZX2 zJF4fa*Op!i>AFjwd2?f+e-Pe^>Pf$_!EkAiM58gqvCb<|d(KSxN)Iz)KTBT-$zXsZ zKd*yloB7B{#goT_FQa+ZE9d(hroriZMa3@?W05%b-1wtn)lnA#|S>H(F1R!Vy)5gRcNCegkQ#B=C7 z(Lo;Jf*RqABQ+QdLqr1*+32t)%`md0X13kZZAX$+iC)l(0btoAV*+#03n;5 z$w^=VI1ova-p~w=G_$czVN)6)1*m7NG&QEm(z{5IddccfC-)AS%sHup&MX~|1ce%g zmk(>X745AdtCUSkHK$sWjbgc{Us8T_>qo~?;8u(iWlpQ57n7u#3Ng!p;-Ik*b_rXU zk7K#IQ00TFNGtwh>)S2ep_pN0GiEhq3bxuaAgcDPLclc?6VFx@*ns5TR8QLwCpW4Q zL0;u(XNs;QR^e4>6D#aZlWMG7jT|U!xCZcKFa`)C%k~HJ4GX^wz!{Est_`?4$gi4s zC4|$frHgjeAO}!%1ncV2Tv*xha%>CK*_$0Qm6d$;tVb_#t-|4CuLfJ1rw1*)*Mtsc zn&;7AZXO!bzspPGQWwI`c+tCB!G?BZvsT zbCQrNY({sTkQN&Zsimu(BpbmE5+ouahx^x)^Ari%*UGf?&in33Rlk_;FRe&DIpv9T z6REKdtWNccUFRge%mbV!JVj!yrH`Q0YMD%0xti02j8>tMZ8G36 z3#0x`wrnutEgcZ0klE%*45%u?t;=+=dde<#t20r9Y!&Tjh64ZbLcf z1TK$)TC<0fElHBpomSeB3H&7`lm3}2Ry0JlWez%}R*j`or6AKTI~U!OHrdk8Qlk1I zYAPC&XX+M5OhM#!Lx3?TnZp)Ax@hLYL>4Zh55{*bx@`w4LS3m{7=ddhS`+BnDd`75 z&XMW36dvM69Pw7%Rj7Dq#f>Qh|5>`g3VIx~wm)B6dc?ZmSqRoeca5ck ztOQpDu~82dh-rRUYw1HPs3Y@AS8vtD=IAC#9q54jWpuoi#NGXMmM#NEdiLisZkQg` z(7dYUBxC81+ckQaIJ?GAXV=#w0JKmgCp8gvhDuQS|4O;N%u(p;6+k0layjLUf0nMn zf-)367K%c*X3lQRl}mB@5lf;KW+95=I+GrPukt20j>_LQAW-MrJ%`B@SrWO=mCQzzm4+Htf* zjHLqsYD1#dWdcEb)v+PxNqHqSJ1Rbd*i^;-z0f~fUp83TM2MX|P6`qu5 zW{o0GXi{mm^v9O$MuJ)+d!Ni2YI~7QTIqBALaR7 zj`S<=f1{<#zZ5YSMxyl2N^ZR{>2_aqkx%0!E#clgOJz9iM!_=#k})>}b8QXk0why# zbXp!dkc2eDC|i?_SSGExTzYMlUsYzHlrD;kdIM>2tIFGS(@>BzEx&&QSQ3X|FrHWM=T0J`CR6vf` zx~T?34&nY0bw-}OaQ#Z%i|i9#M5!5pGEh7YK-?Ud4VH&BBw=M(nuxbsOn1hL(Onb0S7=Nk2o@>Fdl{^qb$#ZWCf35@D(n&R!Er! z!+(VhUSTs05030EMc71^JB9UwxsRVV529;uBt=RHMqr9%#8VQ{S0-xJfJp!uOH0c` zEQ09qI2R(6J#JWVwnd^#q>I*Pd%y9ti(qIc0s~~2w1HsS#_N$QXw&jcj9_<@bs-l3 z+fkfw8zOfpQw~R^w}R@zbBoS%SzF4M=V~O+{vwB{RjhN`0(F0yDmW91-fDUH##MJA zYUGSc9L4NSE*{Lu#W;cm)djjT8WCOud zME-F1qd`VST_pnB{XE*_nijxC7A|UY#=26 z%8h5NBolQz@VAzbMVsZpD~aTe(G-z586H%YXR-vPI}oy5(z+BjIK`DerRCu+iS8Yk z%R?Ki*s|ftFG14UlhwS%nV2g>)P>Vw`EV_dj7cQzM$S(G?d3ij=NM*6cE~om^Ng7! zoFwvwTTqVZ3p1zXc{V{W zajJcd<L&z6Vp1dVxnBeFYT#glrjzB#lc%L9B8y)4UMqdIh6K0zzA z|Dg(@_xYu(&?*c#4bvPKE)g&UI2|a3q&F#b@yxXW$w=+iNg$q~duUvl(VF3=0n77* zl0&xu={p}-j#j2i9nTkbg`dy8W6#rNP(>HzSwGX>{(8q-8L*c)(C8zagp?XD1=pzJ zNOfpEddD*$ljSlEsj38en>xB8qw>ei9u;z)y#>sHLzYrR9HNyLbtZ1KJaZ|*C9+J! z#)jqbO9`r$amd`~p$5u%UB}nAd9f8ZuPF(4@AJ+hor2m67SDF%2PkRc= zY+)w0qz#rR&tt)xl_?e|ib$|btcq=RZ|TOyc+yMASi?i4Qp{wx{X#_}on=Nh?k;=l zXEzwxWo?=xc~GNaz0qwrzA80P8O5qsTb^Z=z|l^Wa2jK$bF+=irfyZ){mGEn$5L3_w0=6IhqP!1DdBh zxD*q?WeMj4`b3PkJfJIO#z7t8j)3YxZsWYJ1jl?zUhxoc7}NSeF_%~-7aS56Jo@u)M~+?^Y)XGJ!T zbgOn}9YN3pjutz_T6CBbcGAs(0ppy9v&VuM^F=sP;~=sG9*zO#N|K_1hAPfJo*75y zPEO9Wk1!^4^N8n|C7bRd8@TEvrI1#5w1&rEFlqYMl`?*1_{HVM`idJDxpBnHU4s=U-JfDz%b6q#qz3p|L z{+2`&oFGa{Ux)XBmCwQh%6)rE19BBLts2V%8mIu)VWhA;PQyygMt->md8Z$l8Y*@DI{;GO^}Mpree2&*bXn;G3i)tI;y)ltgYicn8; z;q0HZyj;PRt}9{EDEV^`lBiA%{;|A!LC|_*|B5I|o9Vfga}O_O5TtIHkm$WZVSN(v zfzO8JZ4DC1#p^ueL9${_9C|sj%4d9V|mL% z{zT!OuKc*cY-Y)P>ANvl-X9?)4EL+0D~RAKiH4vCX|PjCEw7u9Wd6pf;}~BlHdR%7 zBW$o(dWTrvOCbpcgE7^B>QP#5_tT{16&8|Y6o_KaRCdnAo2#)x0w(BW@wlwR<(6lWo#0VCIsC%IQ^xW-kNhdp(bb}jc=Iqtqd1D8nreH$WWW4YdO^BA-io9jilJa3uX3ZF z-Kp-VXhg5~XYWv!+G~BDs-+*6w`c>sXwdI8;Qq`GgVJ!;rI%loyC3r;a z>!A`F5*<=KC&rvS=ItqxDUAbMhvw2pIDO@?EFhF>XYec}wSCW9O?K5ms-O~F%_4=U zCj&*OztLoQUyDRm(%2S^qBsiLvUr0_e#~scaDIFg>ayyNUR2xCDnRNZkjs{L#7IeV zMYRr&lgf4W5;X?4m$bly>NoCf%5d6K6^R9K!-rEcFP)K$XNt~9g78R2UBsCgEt%O{ z&(s4rnegD8+BsLE0I<8|4K|W#e<#tzB#VqP1qZUV#kl51kh_}5c?XUl^?{bi*^IHCUhi7;(wM9 zHkPb_P-?Wip+^$s+Mv&*Sec)Z8M%yJGF&9F%B|uLLp`4t{YZAB^E#DeJ0_%=9@7VI z2y!i^Or`eDrJ^UFIf$#F#)>(@7ULQrL9P+f3zM6-*jAM!zcR-=h$IvGR%LJ%+UOha zEH5b%#7b0xnoz44Y@vBt-diM5)#eZA6&+5F)$R)CMMsjbe~$G7$Bj;pTy)Ty%iE9y zxhe;;E;i_wq^LbB1@#!8+C=98Erea{bEu{$)w3kCAu6QdM}=@Tz0ng^(plceB*oNV zw)S|K(mZ3v@w4;>pW4cSrWF#b(eg4U$%I~S-c+FLbC#(F(N5pOw$}32CrLma4h;m* zIcae|$2Jsl2QsdP66E1|DKahheO=e`CMiiadXJ_L&uP-n%JK>-$)GQ2lO*hGZ>S{u zmHuH|W%71XG*B7$=i zlKI>uZK1T>^K}6)>5}Y+`bw{-c6qKDnF6cR@&PVg z-a=a)WO>shtNWeedcmXOysJ!*=zv4&q1L1_i9*0*<&5(!;q89jZ?-3SpfHEn1BK-{ z9cXz&n&gxS^Aq)!%-ss!nwAeYmmxAAzV##0XOL26now~{R)HHWZ)TIS&gw#^>soi? zETua(BpA+AI^}x1c_buyJtswI@_4w~c{51~N0l&x@`^auc=Z=|Bw~4IoJ3T*J)bJ* z%;KERKFnuYLDpZ*|WnQI_<*KJnJgvyh;VH^3D5R}wq4GtW?6L+l zVabJz7IqJ!Y-D}aw9N@xC5xv9)3JkwMV>-wg7op!2O1pp)|Ome#JnL;#+A39AVV-e z_qn)!rB^mCZm_(H(B(WCMK)qa(84orZn3
    + (Click service item to go live.)

    + (Click verse to display.)

    OpenLP website diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 8808f880d..89cc6f191 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -152,43 +152,59 @@ class HttpConnection(object): log.debug(u'received: ' + data) words = data.split(u' ') html = None + mimetype = None if words[0] == u'GET': url = urlparse.urlparse(words[1]) params = self.load_params(url.query) folders = url.path.split(u'/') if folders[1] == u'': - html = self.serve_file(u'') + mimetype, html = self.serve_file(u'') elif folders[1] == u'files': - html = self.serve_file(folders[2]) + mimetype, html = self.serve_file(folders[2]) elif folders[1] == u'send': html = self.process_event(folders[2], params) elif folders[1] == u'request': if self.process_request(folders[2], params): return if html: - html = self.get_200_ok() + html + u'\n' + if mimetype: + self.socket.write(self.get_200_ok(mimetype)) + else: + self.socket.write(self.get_200_ok()) + self.socket.write(html) else: - html = self.get_404_not_found() - self.socket.write(html) + self.socket.write(self.get_404_not_found()) self.close() def serve_file(self, filename): """ - Send a file to the socket. For now, just .html files + Send a file to the socket. For now, just a subset of file types and must be top level inside the html folder. If subfolders requested return 404, easier for security for the present. Ultimately for i18n, this could first look for xx/file.html before falling back to file.html... where xx is the language, e.g. 'en' """ - log.debug(u'serve file request %s' % filename) + log.debug(u'serve file request %s' % filename) if not filename: filename = u'index.html' if os.path.basename(filename) != filename: return None (fileroot, ext) = os.path.splitext(filename) - if ext != u'.html': - return None + if ext == u'.html': + mimetype = u'text/html' + elif ext == u'.css': + mimetype = u'text/css' + elif ext == u'.js': + mimetype = u'application/x-javascript' + elif ext == u'.jpg': + mimetype = u'image/jpeg' + elif ext == u'.gif': + mimetype = u'image/gif' + elif ext == u'.png': + mimetype = u'image/png' + else: + return (None, None) path = os.path.join(self.parent.html_dir, filename) try: f = open(path, u'rb') @@ -198,8 +214,8 @@ class HttpConnection(object): log.debug(u'Opened %s' % path) html = f.read() f.close() - return html - + return (mimetype, html) + def load_params(self, query): """ Decode the query string parameters sent from the browser @@ -270,13 +286,12 @@ class HttpConnection(object): self.socket.write(html) self.close() - def get_200_ok(self): + def get_200_ok(self, mimetype='text/html; charset="utf-8"'): """ Successful request. Send OK headers. Assume html for now. """ return u'HTTP/1.1 200 OK\r\n' + \ - u'Content-Type: text/html; charset="utf-8"\r\n' + \ - u'\r\n' + u'Content-Type: %s\r\n\r\n' % mimetype def get_404_not_found(self): """ From e0bfaf07bc57a949ee4bfaae71d527b48b27f937 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 4 May 2010 21:01:45 +0100 Subject: [PATCH 21/81] Cleanup and finish bits --- openlp/core/lib/serviceitem.py | 1 + openlp/core/ui/generaltab.py | 3 +- openlp/core/ui/servicemanager.py | 81 +++++++++++-------- .../presentations/presentationplugin.py | 1 + 4 files changed, 52 insertions(+), 34 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 2f6d973e2..764875f4f 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -81,6 +81,7 @@ class ServiceItem(object): self.notes = u'' self.from_plugin = False self.capabilities = [] + self.isValid = True def add_capability(self, capability): self.capabilities.append(capability) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index ac4f92336..cef241aea 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -44,7 +44,8 @@ class GeneralTab(SettingsTab): settings = QtCore.QSettings() settings.beginGroup(self.settingsSection) self.MonitorNumber = settings.value(u'monitor', - QtCore.QVariant(self.screens.monitor_number)).toInt()[0] + QtCore.QVariant(self.screens.display_count - 1)).toInt()[0] + print self.MonitorNumber, self.screens.monitor_number, self.screens.display_count, self.screens.screen_list self.screens.set_current_display(self.MonitorNumber) self.screens.monitor_number = self.MonitorNumber self.DisplayOnMonitor = settings.value( diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 03cdbcecc..e13e72794 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -326,7 +326,7 @@ class ServiceManager(QtGui.QWidget): Called by a signal to select a specific item """ self.setItem(int(message[0])) - + def setItem(self, index): """ Makes a specific item in the service live @@ -495,19 +495,22 @@ class ServiceManager(QtGui.QWidget): for itemcount, item in enumerate(self.serviceItems): serviceitem = item[u'service_item'] treewidgetitem = QtGui.QTreeWidgetItem(self.ServiceManagerList) - if serviceitem.notes: - icon = QtGui.QImage(serviceitem.icon) - icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, - QtCore.Qt.SmoothTransformation) - overlay = QtGui.QImage(':/services/service_item_notes.png') - overlay = overlay.scaled(80, 80, QtCore.Qt.KeepAspectRatio, - QtCore.Qt.SmoothTransformation) - painter = QtGui.QPainter(icon) - painter.drawImage(0, 0, overlay) - painter.end() - treewidgetitem.setIcon(0, build_icon(icon)) + if serviceitem.isValid: + if serviceitem.notes: + icon = QtGui.QImage(serviceitem.icon) + icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, + QtCore.Qt.SmoothTransformation) + overlay = QtGui.QImage(':/services/service_item_notes.png') + overlay = overlay.scaled(80, 80, QtCore.Qt.KeepAspectRatio, + QtCore.Qt.SmoothTransformation) + painter = QtGui.QPainter(icon) + painter.drawImage(0, 0, overlay) + painter.end() + treewidgetitem.setIcon(0, build_icon(icon)) + else: + treewidgetitem.setIcon(0, serviceitem.iconic_representation) else: - treewidgetitem.setIcon(0, serviceitem.iconic_representation) + treewidgetitem.setIcon(0, build_icon(u':/general/general_delete.png')) treewidgetitem.setText(0, serviceitem.title) treewidgetitem.setToolTip(0, serviceitem.notes) treewidgetitem.setData(0, QtCore.Qt.UserRole, @@ -651,8 +654,8 @@ class ServiceManager(QtGui.QWidget): serviceitem = ServiceItem() serviceitem.RenderManager = self.parent.RenderManager serviceitem.set_from_service(item, self.servicePath) - if self.validateItem(serviceitem): - self.addServiceItem(serviceitem) + self.validateItem(serviceitem) + self.addServiceItem(serviceitem) try: if os.path.isfile(p_file): os.remove(p_file) @@ -671,12 +674,15 @@ class ServiceManager(QtGui.QWidget): self.parent.serviceChanged(True, self.serviceName) def validateItem(self, serviceItem): -# print "---" -# print serviceItem.name -# print serviceItem.title -# print serviceItem.service_item_path -# print serviceItem.service_item_type - return True + """ + Validates the service item and if the suffix matches an accepted + one it allows the item to be displayed + """ + print serviceItem.title + if serviceItem.is_command(): + type = serviceItem._raw_frames[0][u'title'].split(u'.')[1] + if type not in ['odp']: + serviceItem.isValid = False def cleanUp(self): """ @@ -778,17 +784,26 @@ class ServiceManager(QtGui.QWidget): Send the current item to the Live slide controller """ item, count = self.findServiceItem() - self.parent.LiveController.addServiceManagerItem( - self.serviceItems[item][u'service_item'], count) - if QtCore.QSettings().value( - self.parent.generalSettingsSection + u'/auto preview', - QtCore.QVariant(False)).toBool(): - item += 1 - if self.serviceItems and item < len(self.serviceItems) and \ - self.serviceItems[item][u'service_item'].is_capable( - ItemCapabilities.AllowsPreview): - self.parent.PreviewController.addServiceManagerItem( - self.serviceItems[item][u'service_item'], 0) + if self.serviceItems[item][u'service_item'].isValid: + self.parent.LiveController.addServiceManagerItem( + self.serviceItems[item][u'service_item'], count) + if QtCore.QSettings().value( + self.parent.generalSettingsSection + u'/auto preview', + QtCore.QVariant(False)).toBool(): + item += 1 + if self.serviceItems and item < len(self.serviceItems) and \ + self.serviceItems[item][u'service_item'].is_capable( + ItemCapabilities.AllowsPreview): + self.parent.PreviewController.addServiceManagerItem( + self.serviceItems[item][u'service_item'], 0) + else: + QtGui.QMessageBox.critical(self, + self.trUtf8('Missing Display Handler?'), + self.trUtf8('Your item cannot be display as ' + 'there is no handler to display it?'), + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Ok), + QtGui.QMessageBox.Ok) def remoteEdit(self): """ @@ -920,7 +935,7 @@ class ServiceManager(QtGui.QWidget): return item.data(0, QtCore.Qt.UserRole).toInt()[0] else: return parentitem.data(0, QtCore.Qt.UserRole).toInt()[0] - + def listRequest(self, message=None): data = [] curindex, count = self.findServiceItem() diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index dd1a5259b..9a8a5a182 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -53,6 +53,7 @@ class PresentationPlugin(Plugin): log.info(u'Presentations Initialising') Plugin.initialise(self) self.insert_toolbox_item() + presentation_types = [] for controller in self.controllers: if self.controllers[controller].enabled: self.controllers[controller].start_process() From a8f2cd2e1f76240aac70bcbe20a0465367aa2d9c Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Tue, 4 May 2010 22:19:40 +0100 Subject: [PATCH 22/81] Import fixes --- openlp/plugins/remotes/remoteplugin.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openlp/plugins/remotes/remoteplugin.py b/openlp/plugins/remotes/remoteplugin.py index 2c632d90d..bc1679fc9 100644 --- a/openlp/plugins/remotes/remoteplugin.py +++ b/openlp/plugins/remotes/remoteplugin.py @@ -25,9 +25,7 @@ import logging -from PyQt4 import QtNetwork, QtCore - -from openlp.core.lib import Plugin, Receiver +from openlp.core.lib import Plugin from openlp.plugins.remotes.lib import RemoteTab, HttpServer log = logging.getLogger(__name__) From 4f8d0589286507f4402869bcbdd82df4fa35038c Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Tue, 4 May 2010 22:49:02 +0100 Subject: [PATCH 23/81] rename get to send and allow webpages to be served from subfolders --- openlp/plugins/remotes/lib/httpserver.py | 33 ++++++++++++------------ 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 89cc6f191..b66f0e215 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -160,7 +160,7 @@ class HttpConnection(object): if folders[1] == u'': mimetype, html = self.serve_file(u'') elif folders[1] == u'files': - mimetype, html = self.serve_file(folders[2]) + mimetype, html = self.serve_file(os.sep.join(folders[2:])) elif folders[1] == u'send': html = self.process_event(folders[2], params) elif folders[1] == u'request': @@ -168,12 +168,12 @@ class HttpConnection(object): return if html: if mimetype: - self.socket.write(self.get_200_ok(mimetype)) + self.send_200_ok(mimetype) else: - self.socket.write(self.get_200_ok()) + self.send_200_ok() self.socket.write(html) else: - self.socket.write(self.get_404_not_found()) + self.send_404_not_found() self.close() def serve_file(self, filename): @@ -188,7 +188,8 @@ class HttpConnection(object): log.debug(u'serve file request %s' % filename) if not filename: filename = u'index.html' - if os.path.basename(filename) != filename: + path = os.path.normpath(os.path.join(self.parent.html_dir, filename)) + if not path.startswith(self.parent.html_dir): return None (fileroot, ext) = os.path.splitext(filename) if ext == u'.html': @@ -205,7 +206,6 @@ class HttpConnection(object): mimetype = u'image/png' else: return (None, None) - path = os.path.join(self.parent.html_dir, filename) try: f = open(path, u'rb') except: @@ -282,31 +282,31 @@ class HttpConnection(object): return self.timer.stop() html = json.dumps(data) - html = self.get_200_ok() + html + u'\n' + self.send_200_ok() self.socket.write(html) self.close() - def get_200_ok(self, mimetype='text/html; charset="utf-8"'): + def send_200_ok(self, mimetype='text/html; charset="utf-8"'): """ Successful request. Send OK headers. Assume html for now. """ - return u'HTTP/1.1 200 OK\r\n' + \ - u'Content-Type: %s\r\n\r\n' % mimetype + self.socket.write(u'HTTP/1.1 200 OK\r\n' + \ + u'Content-Type: %s\r\n\r\n' % mimetype) - def get_404_not_found(self): + def send_404_not_found(self): """ Invalid url. Say so """ - return u'HTTP/1.1 404 Not Found\r\n'+ \ + self.socket.write(u'HTTP/1.1 404 Not Found\r\n'+ \ u'Content-Type: text/html; charset="utf-8"\r\n' + \ - u'\r\n' + u'\r\n') - def get_408_timeout(self): + def send_408_timeout(self): """ A _request hasn't returned anything in the timeout period. Return timeout """ - return u'HTTP/1.1 408 Request Timeout\r\n' + self.socket.write(u'HTTP/1.1 408 Request Timeout\r\n') def timeout(self): """ @@ -314,8 +314,7 @@ class HttpConnection(object): """ if not self.socket: return - html = self.get_408_timeout() - self.socket.write(html) + html = self.send_408_timeout() self.close() def disconnected(self): From 66ec680e4ebd8ac0354361053ae73a7aaa597586 Mon Sep 17 00:00:00 2001 From: rimach Date: Wed, 5 May 2010 19:17:00 +0200 Subject: [PATCH 24/81] remove else from toolbar.py --- openlp/core/lib/toolbar.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/openlp/core/lib/toolbar.py b/openlp/core/lib/toolbar.py index 824199469..a1af42736 100644 --- a/openlp/core/lib/toolbar.py +++ b/openlp/core/lib/toolbar.py @@ -120,11 +120,8 @@ class OpenLPToolbar(QtGui.QToolBar): try: if self.icons[title]: return self.icons[title] - else: - log.error(u'getIconFromTitle - no icon for %s' % title) - return QtGui.QIcon() except: - log.exception(u'getIconFromTitle - title %s not found' % title) + log.exception(u'getIconFromTitle - no icon for %s' % title) return QtGui.QIcon() def makeWidgetsInvisible(self, widgets): From e1f97fc9b92f03933c6a34fe9134fb54bbe1aaa6 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 5 May 2010 18:35:11 +0100 Subject: [PATCH 25/81] Fix initial display --- openlp/core/ui/generaltab.py | 1 - openlp/plugins/media/mediaplugin.py | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index cef241aea..f55d81a70 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -45,7 +45,6 @@ class GeneralTab(SettingsTab): settings.beginGroup(self.settingsSection) self.MonitorNumber = settings.value(u'monitor', QtCore.QVariant(self.screens.display_count - 1)).toInt()[0] - print self.MonitorNumber, self.screens.monitor_number, self.screens.display_count, self.screens.screen_list self.screens.set_current_display(self.MonitorNumber) self.screens.monitor_number = self.MonitorNumber self.DisplayOnMonitor = settings.value( diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 1fb7d7405..b73e9e425 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -45,6 +45,7 @@ class MediaPlugin(Plugin): self.video_list = u'' for mimetype in Phonon.BackendCapabilities.availableMimeTypes(): mimetype = unicode(mimetype) + print mimetype type = mimetype.split(u'audio/x-') self.audio_list, mimetype = self._add_to_list(self.audio_list, type, mimetype) type = mimetype.split(u'audio/') From a8bbd540d45868ee4d53530938726496f6571e43 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 5 May 2010 19:07:57 +0100 Subject: [PATCH 26/81] service loading prefix check --- openlp/core/ui/servicemanager.py | 7 +++++-- openlp/plugins/media/mediaplugin.py | 3 ++- openlp/plugins/presentations/lib/mediaitem.py | 2 ++ 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index e13e72794..0e6cba605 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -101,6 +101,7 @@ class ServiceManager(QtGui.QWidget): self.parent = parent self.serviceItems = [] self.serviceName = u'' + self.suffixes = u'' self.droppos = 0 #is a new service and has not been saved self.isNew = True @@ -228,6 +229,9 @@ class ServiceManager(QtGui.QWidget): self.themeMenu = QtGui.QMenu(self.trUtf8(u'&Change Item Theme')) self.menu.addMenu(self.themeMenu) + def supportedSuffixes(self, suffix): + self.suffixes = u'%s %s' % (self.suffixes, suffix) + def contextMenu(self, point): item = self.ServiceManagerList.itemAt(point) if item is None: @@ -678,10 +682,9 @@ class ServiceManager(QtGui.QWidget): Validates the service item and if the suffix matches an accepted one it allows the item to be displayed """ - print serviceItem.title if serviceItem.is_command(): type = serviceItem._raw_frames[0][u'title'].split(u'.')[1] - if type not in ['odp']: + if type not in self.suffixes: serviceItem.isValid = False def cleanUp(self): diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index b73e9e425..dcefa20c1 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -45,7 +45,6 @@ class MediaPlugin(Plugin): self.video_list = u'' for mimetype in Phonon.BackendCapabilities.availableMimeTypes(): mimetype = unicode(mimetype) - print mimetype type = mimetype.split(u'audio/x-') self.audio_list, mimetype = self._add_to_list(self.audio_list, type, mimetype) type = mimetype.split(u'audio/') @@ -54,6 +53,8 @@ class MediaPlugin(Plugin): self.video_list, mimetype = self._add_to_list(self.video_list, type, mimetype) type = mimetype.split(u'video/') self.video_list, mimetype = self._add_to_list(self.video_list, type, mimetype) + self.service_manager.supportedSuffixes(self.audio_list) + self.service_manager.supportedSuffixes(self.video_list) def _add_to_list(self, list, value, type): if len(value) == 2: diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 9c654b198..3ae3136d5 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -75,6 +75,8 @@ class PresentationMediaItem(MediaManagerItem): if fileType.find(type) == -1: fileType += u'*%s ' % type self.OnNewFileMasks = self.trUtf8('Presentations (%s)' % fileType) + self.parent.service_manager.supportedSuffixes(fileType) + def requiredIcons(self): MediaManagerItem.requiredIcons(self) From 27a963a9c29cdbcba2d966b31a34ae69171d32b9 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 5 May 2010 20:14:48 +0100 Subject: [PATCH 27/81] Validate Service item viewer loading --- openlp/core/ui/mainwindow.py | 1 + openlp/core/ui/servicemanager.py | 6 ++++++ openlp/core/ui/slidecontroller.py | 20 +++++++++++-------- openlp/plugins/media/mediaplugin.py | 1 + openlp/plugins/presentations/lib/mediaitem.py | 1 + 5 files changed, 21 insertions(+), 8 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index df275dd20..6a79958bd 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -550,6 +550,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): log.info(u'Load data from Settings') self.settingsForm.postSetUp() + def versionCheck(self, version): """ Checks the version of the Application called from openlp.pyw diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 0e6cba605..f1a41899a 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -102,6 +102,7 @@ class ServiceManager(QtGui.QWidget): self.serviceItems = [] self.serviceName = u'' self.suffixes = u'' + self.viewers = u'' self.droppos = 0 #is a new service and has not been saved self.isNew = True @@ -232,6 +233,9 @@ class ServiceManager(QtGui.QWidget): def supportedSuffixes(self, suffix): self.suffixes = u'%s %s' % (self.suffixes, suffix) + def supportedViewers(self, viewer): + self.viewers = u'%s %s' % (self.viewers, viewer) + def contextMenu(self, point): item = self.ServiceManagerList.itemAt(point) if item is None: @@ -686,6 +690,8 @@ class ServiceManager(QtGui.QWidget): type = serviceItem._raw_frames[0][u'title'].split(u'.')[1] if type not in self.suffixes: serviceItem.isValid = False + if serviceItem.title not in self.viewers: + serviceItem.isValid = False def cleanUp(self): """ diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index c0d0d915f..d01babbfe 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -339,16 +339,16 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'slidecontroller_%s_change' % self.type_prefix), self.onSlideChange) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_set' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_set' % self.type_prefix), self.onSlideSelectedIndex) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.type_prefix), self.onSlideBlank) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.type_prefix), self.onSlideUnblank) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.type_prefix), self.onTextRequest) QtCore.QObject.connect(self.Splitter, QtCore.SIGNAL(u'splitterMoved(int, int)'), self.trackSplitter) @@ -486,6 +486,7 @@ class SlideController(QtGui.QWidget): Display the slide number passed """ log.debug(u'processManagerItem') + self.onStopLoop() #If old item was a command tell it to stop if self.serviceItem and self.serviceItem.is_command(): self.onMediaStop() @@ -589,8 +590,8 @@ class SlideController(QtGui.QWidget): data_item[u'selected'] = \ (self.PreviewListWidget.currentRow() == framenumber) data.append(data_item) - Receiver.send_message(u'slidecontroller_%s_text_response' - % self.type_prefix, data) + Receiver.send_message(u'slidecontroller_%s_text_response' + % self.type_prefix, data) #Screen event methods def onSlideSelectedFirst(self): @@ -614,7 +615,7 @@ class SlideController(QtGui.QWidget): index = int(message[0]) if not self.serviceItem: return - Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), + Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive, index]) if self.serviceItem.is_command(): self.updatePreview() @@ -827,7 +828,10 @@ class SlideController(QtGui.QWidget): """ Stop the timer loop running """ - self.killTimer(self.timer_id) + if self.timer_id != 0: + self.killTimer(self.timer_id) + self.timer_id = 0 + def timerEvent(self, event): """ diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index dcefa20c1..1b1d9b984 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -55,6 +55,7 @@ class MediaPlugin(Plugin): self.video_list, mimetype = self._add_to_list(self.video_list, type, mimetype) self.service_manager.supportedSuffixes(self.audio_list) self.service_manager.supportedSuffixes(self.video_list) + self.service_manager.supportedViewers(self.name) def _add_to_list(self, list, value, type): if len(value) == 2: diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 3ae3136d5..06a5e276d 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -71,6 +71,7 @@ class PresentationMediaItem(MediaManagerItem): if self.controllers[controller].enabled: types = self.controllers[controller].supports + \ self.controllers[controller].alsosupports + self.parent.service_manager.supportedViewers(controller) for type in types: if fileType.find(type) == -1: fileType += u'*%s ' % type From 0e7fb1c80c7bafe8c0ab5cb666a33cd2471071c4 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 5 May 2010 20:21:05 +0100 Subject: [PATCH 28/81] minor errors --- openlp/core/ui/mainwindow.py | 1 - openlp/plugins/presentations/presentationplugin.py | 1 - 2 files changed, 2 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 6a79958bd..df275dd20 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -550,7 +550,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): log.info(u'Load data from Settings') self.settingsForm.postSetUp() - def versionCheck(self, version): """ Checks the version of the Application called from openlp.pyw diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 9a8a5a182..dd1a5259b 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -53,7 +53,6 @@ class PresentationPlugin(Plugin): log.info(u'Presentations Initialising') Plugin.initialise(self) self.insert_toolbox_item() - presentation_types = [] for controller in self.controllers: if self.controllers[controller].enabled: self.controllers[controller].start_process() From 6f8e3f7ea2d571a7c9bfefbf946ed5520e31a8b9 Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Wed, 5 May 2010 20:57:20 +0100 Subject: [PATCH 29/81] Fixed a qt4.5ism --- openlp/core/lib/settingsmanager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/lib/settingsmanager.py b/openlp/core/lib/settingsmanager.py index de1401d56..d6b987db4 100644 --- a/openlp/core/lib/settingsmanager.py +++ b/openlp/core/lib/settingsmanager.py @@ -53,7 +53,7 @@ class SettingsManager(object): self.slidecontroller_image = self.slidecontroller - 50 self.showPreviewPanel = QtCore.QSettings().value( - u'user interface/preview panel', True).toBool() + u'user interface/preview panel', QtCore.QVariant(True)).toBool() def togglePreviewPanel(self, isVisible): QtCore.QSettings().setValue(u'user interface/preview panel', From 6c9c9848dbbd845b2f4b4080035895b49a5369a7 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 6 May 2010 17:49:12 +0100 Subject: [PATCH 30/81] Clean up fixes --- openlp/core/ui/servicemanager.py | 27 ++++++++++--------- openlp/core/ui/slidecontroller.py | 1 - openlp/plugins/media/mediaplugin.py | 4 +-- openlp/plugins/presentations/lib/mediaitem.py | 4 +-- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index f1a41899a..6778c402a 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -101,8 +101,7 @@ class ServiceManager(QtGui.QWidget): self.parent = parent self.serviceItems = [] self.serviceName = u'' - self.suffixes = u'' - self.viewers = u'' + self.suffixes = [] self.droppos = 0 #is a new service and has not been saved self.isNew = True @@ -231,10 +230,7 @@ class ServiceManager(QtGui.QWidget): self.menu.addMenu(self.themeMenu) def supportedSuffixes(self, suffix): - self.suffixes = u'%s %s' % (self.suffixes, suffix) - - def supportedViewers(self, viewer): - self.viewers = u'%s %s' % (self.viewers, viewer) + self.suffixes.append(suffix) def contextMenu(self, point): item = self.ServiceManagerList.itemAt(point) @@ -690,8 +686,6 @@ class ServiceManager(QtGui.QWidget): type = serviceItem._raw_frames[0][u'title'].split(u'.')[1] if type not in self.suffixes: serviceItem.isValid = False - if serviceItem.title not in self.viewers: - serviceItem.isValid = False def cleanUp(self): """ @@ -775,8 +769,17 @@ class ServiceManager(QtGui.QWidget): Send the current item to the Preview slide controller """ item, count = self.findServiceItem() - self.parent.PreviewController.addServiceManagerItem( - self.serviceItems[item][u'service_item'], count) + if self.serviceItems[item][u'service_item'].isValid: + self.parent.PreviewController.addServiceManagerItem( + self.serviceItems[item][u'service_item'], count) + else: + QtGui.QMessageBox.critical(self, + self.trUtf8('Missing Display Handler?'), + self.trUtf8('Your item cannot be displayed as ' + 'there is no handler to display it'), + QtGui.QMessageBox.StandardButtons( + QtGui.QMessageBox.Ok), + QtGui.QMessageBox.Ok) def getServiceItem(self): """ @@ -808,8 +811,8 @@ class ServiceManager(QtGui.QWidget): else: QtGui.QMessageBox.critical(self, self.trUtf8('Missing Display Handler?'), - self.trUtf8('Your item cannot be display as ' - 'there is no handler to display it?'), + self.trUtf8('Your item cannot be displayed as ' + 'there is no handler to display it'), QtGui.QMessageBox.StandardButtons( QtGui.QMessageBox.Ok), QtGui.QMessageBox.Ok) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 754a97f59..15502423b 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -846,7 +846,6 @@ class SlideController(QtGui.QWidget): self.killTimer(self.timer_id) self.timer_id = 0 - def timerEvent(self, event): """ If the timer event is for this window select next slide diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 1b1d9b984..bdf28c8a4 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -53,14 +53,12 @@ class MediaPlugin(Plugin): self.video_list, mimetype = self._add_to_list(self.video_list, type, mimetype) type = mimetype.split(u'video/') self.video_list, mimetype = self._add_to_list(self.video_list, type, mimetype) - self.service_manager.supportedSuffixes(self.audio_list) - self.service_manager.supportedSuffixes(self.video_list) - self.service_manager.supportedViewers(self.name) def _add_to_list(self, list, value, type): if len(value) == 2: if list.find(value[1]) == -1: list += u'*.%s ' % value[1] + self.service_manager.supportedSuffixes(value[1]) type = u'' return list, type diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 06a5e276d..51663ad26 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -71,13 +71,11 @@ class PresentationMediaItem(MediaManagerItem): if self.controllers[controller].enabled: types = self.controllers[controller].supports + \ self.controllers[controller].alsosupports - self.parent.service_manager.supportedViewers(controller) for type in types: if fileType.find(type) == -1: fileType += u'*%s ' % type + self.parent.service_manager.supportedSuffixes(type) self.OnNewFileMasks = self.trUtf8('Presentations (%s)' % fileType) - self.parent.service_manager.supportedSuffixes(fileType) - def requiredIcons(self): MediaManagerItem.requiredIcons(self) From 14912955aecf40e2f82ccca1a5b534b764e4f360 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 6 May 2010 17:51:57 +0100 Subject: [PATCH 31/81] Remove ? --- openlp/core/ui/servicemanager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 6778c402a..3a35a7a58 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -774,7 +774,7 @@ class ServiceManager(QtGui.QWidget): self.serviceItems[item][u'service_item'], count) else: QtGui.QMessageBox.critical(self, - self.trUtf8('Missing Display Handler?'), + self.trUtf8('Missing Display Handler'), self.trUtf8('Your item cannot be displayed as ' 'there is no handler to display it'), QtGui.QMessageBox.StandardButtons( @@ -810,7 +810,7 @@ class ServiceManager(QtGui.QWidget): self.serviceItems[item][u'service_item'], 0) else: QtGui.QMessageBox.critical(self, - self.trUtf8('Missing Display Handler?'), + self.trUtf8('Missing Display Handler'), self.trUtf8('Your item cannot be displayed as ' 'there is no handler to display it'), QtGui.QMessageBox.StandardButtons( From d04d75ad41d53edcf6b0a6146e45bb4f67abe69a Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Thu, 6 May 2010 21:41:42 +0100 Subject: [PATCH 32/81] More changes to suit pyqt4.4 --- openlp/plugins/songs/lib/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/manager.py b/openlp/plugins/songs/lib/manager.py index ff9231fe2..dc275cc98 100644 --- a/openlp/plugins/songs/lib/manager.py +++ b/openlp/plugins/songs/lib/manager.py @@ -50,7 +50,7 @@ class SongManager(): settings.beginGroup(u'songs') self.db_url = u'' db_type = unicode( - settings.value(u'songs/db type', u'sqlite').toString()) + settings.value(u'songs/db type', QtCore.QVariant(u'sqlite')).toString()) if db_type == u'sqlite': self.db_url = u'sqlite:///%s/songs.sqlite' % \ AppLocation.get_section_data_path(u'songs') From fa99ba64b1353853163928066ded394c6cc4922d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 7 May 2010 19:29:17 +0100 Subject: [PATCH 33/81] Fix names --- openlp/core/lib/serviceitem.py | 3 +-- openlp/core/ui/servicemanager.py | 10 +++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 764875f4f..a283885b2 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -81,7 +81,7 @@ class ServiceItem(object): self.notes = u'' self.from_plugin = False self.capabilities = [] - self.isValid = True + self.is_valid = True def add_capability(self, capability): self.capabilities.append(capability) @@ -336,4 +336,3 @@ class ServiceItem(object): Returns the title of the raw frame """ return self._raw_frames[row][u'path'] - diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 3a35a7a58..c5fa0b73c 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -499,7 +499,7 @@ class ServiceManager(QtGui.QWidget): for itemcount, item in enumerate(self.serviceItems): serviceitem = item[u'service_item'] treewidgetitem = QtGui.QTreeWidgetItem(self.ServiceManagerList) - if serviceitem.isValid: + if serviceitem.is_valid: if serviceitem.notes: icon = QtGui.QImage(serviceitem.icon) icon = icon.scaled(80, 80, QtCore.Qt.KeepAspectRatio, @@ -685,7 +685,7 @@ class ServiceManager(QtGui.QWidget): if serviceItem.is_command(): type = serviceItem._raw_frames[0][u'title'].split(u'.')[1] if type not in self.suffixes: - serviceItem.isValid = False + serviceItem.is_valid = False def cleanUp(self): """ @@ -769,7 +769,7 @@ class ServiceManager(QtGui.QWidget): Send the current item to the Preview slide controller """ item, count = self.findServiceItem() - if self.serviceItems[item][u'service_item'].isValid: + if self.serviceItems[item][u'service_item'].is_valid: self.parent.PreviewController.addServiceManagerItem( self.serviceItems[item][u'service_item'], count) else: @@ -796,7 +796,7 @@ class ServiceManager(QtGui.QWidget): Send the current item to the Live slide controller """ item, count = self.findServiceItem() - if self.serviceItems[item][u'service_item'].isValid: + if self.serviceItems[item][u'service_item'].is_valid: self.parent.LiveController.addServiceManagerItem( self.serviceItems[item][u'service_item'], count) if QtCore.QSettings().value( @@ -963,4 +963,4 @@ class ServiceManager(QtGui.QWidget): data_item[u'notes'] = unicode(service_item.notes) data_item[u'selected'] = (item == curitem) data.append(data_item) - Receiver.send_message(u'servicemanager_list_response', data) + Receiver.send_message(u'servicemanager_list_response', data) \ No newline at end of file From efa1e8c2d9b33f5711ea4893e1a2ef5de6f9f1d6 Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Fri, 7 May 2010 21:29:21 +0100 Subject: [PATCH 34/81] Quick fix to handle Bible config gets confused and returns None --- openlp.pyw | 2 +- openlp/plugins/bibles/lib/mediaitem.py | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 0c1227b6a..5fe962f82 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -169,7 +169,7 @@ def main(): filename = os.path.join(log_path, u'openlp.log') logfile = FileHandler(filename, u'w') logfile.setFormatter(logging.Formatter( - u'%(asctime)s %(name)-20s %(levelname)-8s %(message)s')) + u'%(asctime)s %(name)-55s %(levelname)-8s %(message)s')) log.addHandler(logfile) logging.addLevelName(15, u'Timer') # Parse command line options and deal with them. diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index e44c424a4..e84e732e7 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -337,13 +337,14 @@ class BibleMediaItem(MediaManagerItem): # load bibles into the combo boxes first = True for bible in bibles: - self.QuickVersionComboBox.addItem(bible) - self.QuickSecondBibleComboBox.addItem(bible) - self.AdvancedVersionComboBox.addItem(bible) - self.AdvancedSecondBibleComboBox.addItem(bible) - if first: - first = False - self.initialiseBible(bible) + if bible is not None: + self.QuickVersionComboBox.addItem(bible) + self.QuickSecondBibleComboBox.addItem(bible) + self.AdvancedVersionComboBox.addItem(bible) + self.AdvancedSecondBibleComboBox.addItem(bible) + if first: + first = False + self.initialiseBible(bible) def onListViewResize(self, width, height): self.SearchProgress.setGeometry(self.ListView.geometry().x(), From a8a7e675a410647cdcdbe5258396e9a86144e5ef Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Sun, 9 May 2010 21:02:38 +0100 Subject: [PATCH 35/81] Updated from review comments --- openlp/core/ui/maindisplay.py | 6 ++++-- openlp/plugins/bibles/lib/mediaitem.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index d67823908..4b2c4d268 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -118,7 +118,8 @@ class MainDisplay(DisplayWidget): DisplayWidget.__init__(self, parent) self.parent = parent self.setWindowTitle(u'OpenLP Display') - try: # WA_TranslucentBackground not available in QT4.4 + # WA_TranslucentBackground is not available in QT4.4 + try: self.setAttribute(QtCore.Qt.WA_TranslucentBackground) except AttributeError: pass @@ -344,7 +345,8 @@ class VideoDisplay(Phonon.VideoWidget): Phonon.createPath(self.mediaObject, self) Phonon.createPath(self.mediaObject, self.audioObject) flags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Dialog - try: # WindowsStaysOnBottomHint is not available in QT4.4 + # WindowsStaysOnBottomHint is not available in QT4.4 + try: flags = flags | QtCore.Qt.WindowStaysOnBottomHint except AttributeError: pass diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index e84e732e7..136f45633 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -337,7 +337,7 @@ class BibleMediaItem(MediaManagerItem): # load bibles into the combo boxes first = True for bible in bibles: - if bible is not None: + if bible: self.QuickVersionComboBox.addItem(bible) self.QuickSecondBibleComboBox.addItem(bible) self.AdvancedVersionComboBox.addItem(bible) From 2ee1c5ed9b54ccc8d9ab2ad7a79bac79f787c5e1 Mon Sep 17 00:00:00 2001 From: rimach Date: Mon, 10 May 2010 19:56:29 +0200 Subject: [PATCH 36/81] load correct settings for translation --- openlp/core/utils/languagemanager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py index 3f684b08f..521eab382 100644 --- a/openlp/core/utils/languagemanager.py +++ b/openlp/core/utils/languagemanager.py @@ -68,7 +68,8 @@ class LanguageManager(object): @staticmethod def get_language(): - language = unicode(QtCore.QSettings().value( + settings = QtCore.QSettings(u'OpenLP', u'OpenLP') + language = unicode(settings.value( u'general/language', QtCore.QVariant(u'[en]')).toString()) log.info(u'Language file: \'%s\' Loaded from conf file' % language) regEx = QtCore.QRegExp("^\[(.*)\]") From 51728db0b6f88e73cdb518aad09aabadf69a3eb5 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 10 May 2010 19:19:45 +0100 Subject: [PATCH 37/81] Add cache to renderer --- openlp/core/lib/serviceitem.py | 15 +++-- openlp/core/ui/slidecontroller.py | 101 +++++++++++++++++++++--------- 2 files changed, 82 insertions(+), 34 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index a283885b2..a25205c82 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -82,6 +82,7 @@ class ServiceItem(object): self.from_plugin = False self.capabilities = [] self.is_valid = True + self.cache = [] def add_capability(self, capability): self.capabilities.append(capability) @@ -107,6 +108,7 @@ class ServiceItem(object): """ log.debug(u'Render called') self._display_frames = [] + self.cache = [] if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides') if self.theme is None: @@ -125,6 +127,7 @@ class ServiceItem(object): lines += line + u'\n' self._display_frames.append({u'title': title, \ u'text': lines.rstrip(), u'verseTag': slide[u'verseTag'] }) + self.cache.insert(len(self._display_frames), None) log.log(15, u'Formatting took %4s' % (time.time() - before)) elif self.service_item_type == ServiceItemType.Image: for slide in self._raw_frames: @@ -149,11 +152,15 @@ class ServiceItem(object): self.RenderManager.set_override_theme(self.theme) format = self._display_frames[row][u'text'].split(u'\n') #if screen blank then do not display footer - if format[0]: - frame = self.RenderManager.generate_slide(format, - self.raw_footer) + if self.cache[row] is not None: + frame = self.cache[row] else: - frame = self.RenderManager.generate_slide(format,u'') + if format[0]: + frame = self.RenderManager.generate_slide(format, + self.raw_footer) + else: + frame = self.RenderManager.generate_slide(format,u'') + self.cache[row] = frame return frame def add_from_image(self, path, title, image): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 15502423b..4673df4e2 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -36,6 +36,30 @@ ItemCapabilities log = logging.getLogger(__name__) +class SlideThread(QtCore.QThread): + """ + A special Qt thread class to fetch the version of OpenLP from the website. + This is threaded so that it doesn't affect the loading time of OpenLP. + """ + def __init__(self, parent, isLive, count): + QtCore.QThread.__init__(self, parent) + self.isLive = isLive + self.count = count + + def run(self): + """ + Run the thread. + """ + time.sleep(1) + for i in range(0, self.count): + if self.isLive: + Receiver.send_message(u'live_slide_cache', i) + else: + Receiver.send_message(u'preview_slide_cache', i) +# for framenumber, frame in enumerate(self.serviceItem.get_frames()): +# self.serviceItem.get_rendered_frame(framenumber) + + class SlideList(QtGui.QTableWidget): """ Customised version of QTableWidget which can respond to keyboard @@ -44,7 +68,7 @@ class SlideList(QtGui.QTableWidget): def __init__(self, parent=None, name=None): QtGui.QTableWidget.__init__(self, parent.Controller) self.parent = parent - self.hotkey_map = { + self.hotkeyMap = { QtCore.Qt.Key_Return: 'servicemanager_next_item', QtCore.Qt.Key_Space: 'slidecontroller_live_next_noloop', QtCore.Qt.Key_Enter: 'slidecontroller_live_next_noloop', @@ -66,8 +90,8 @@ class SlideList(QtGui.QTableWidget): elif event.key() == QtCore.Qt.Key_PageDown: self.parent.onSlideSelectedLast() event.accept() - elif event.key() in self.hotkey_map and self.parent.isLive: - Receiver.send_message(self.hotkey_map[event.key()]) + elif event.key() in self.hotkeyMap and self.parent.isLive: + Receiver.send_message(self.hotkeyMap[event.key()]) event.accept() event.ignore() else: @@ -87,13 +111,13 @@ class SlideController(QtGui.QWidget): self.isLive = isLive self.parent = parent self.mainDisplay = self.parent.displayManager.mainDisplay - self.loop_list = [ + self.loopList = [ u'Start Loop', u'Stop Loop', u'Loop Separator', u'Image SpinBox' ] - self.song_edit_list = [ + self.songEditList = [ u'Edit Song', ] if isLive: @@ -115,11 +139,11 @@ class SlideController(QtGui.QWidget): if self.isLive: self.TypeLabel.setText(self.trUtf8('Live')) self.split = 1 - self.type_prefix = u'live' + self.typePrefix = u'live' else: self.TypeLabel.setText(self.trUtf8('Preview')) self.split = 0 - self.type_prefix = u'preview' + self.typePrefix = u'preview' self.TypeLabel.setStyleSheet(u'font-weight: bold; font-size: 12pt;') self.TypeLabel.setAlignment(QtCore.Qt.AlignCenter) self.PanelLayout.addWidget(self.TypeLabel) @@ -309,51 +333,57 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), self.receiveSpinDelay) if isLive: - self.Toolbar.makeWidgetsInvisible(self.loop_list) + self.Toolbar.makeWidgetsInvisible(self.loopList) else: - self.Toolbar.makeWidgetsInvisible(self.song_edit_list) + self.Toolbar.makeWidgetsInvisible(self.songEditList) self.Mediabar.setVisible(False) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_stop_loop' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_stop_loop' % self.typePrefix), self.onStopLoop) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_first' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_first' % self.typePrefix), self.onSlideSelectedFirst) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_next' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_next' % self.typePrefix), self.onSlideSelectedNext) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_previous' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_previous' % self.typePrefix), self.onSlideSelectedPrevious) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_next_noloop' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_next_noloop' % self.typePrefix), self.onSlideSelectedNextNoloop) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'slidecontroller_%s_previous_noloop' % - self.type_prefix), + self.typePrefix), self.onSlideSelectedPreviousNoloop) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_last' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_last' % self.typePrefix), self.onSlideSelectedLast) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_change' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_change' % self.typePrefix), self.onSlideChange) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_set' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_set' % self.typePrefix), self.onSlideSelectedIndex) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.typePrefix), self.onSlideBlank) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix), self.onSlideUnblank) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.type_prefix), + QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.typePrefix), self.onTextRequest) QtCore.QObject.connect(self.Splitter, QtCore.SIGNAL(u'splitterMoved(int, int)'), self.trackSplitter) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.refreshServiceItem) + if self.isLive: + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'live_slide_cache'), self.slideCache) + else: + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'preview_slide_cache'), self.slideCache) def widthChanged(self): """ @@ -404,16 +434,16 @@ class SlideController(QtGui.QWidget): self.Toolbar.setVisible(True) self.Mediabar.setVisible(False) self.Toolbar.makeWidgetsInvisible([u'Song Menu']) - self.Toolbar.makeWidgetsInvisible(self.loop_list) + self.Toolbar.makeWidgetsInvisible(self.loopList) if item.is_text(): - self.Toolbar.makeWidgetsInvisible(self.loop_list) + self.Toolbar.makeWidgetsInvisible(self.loopList) if QtCore.QSettings().value( self.parent.songsSettingsSection + u'/show songbar', QtCore.QVariant(True)).toBool() and len(self.slideList) > 0: self.Toolbar.makeWidgetsVisible([u'Song Menu']) if item.is_capable(ItemCapabilities.AllowsLoop) and \ len(item.get_frames()) > 1: - self.Toolbar.makeWidgetsVisible(self.loop_list) + self.Toolbar.makeWidgetsVisible(self.loopList) if item.is_media(): self.Toolbar.setVisible(False) self.Mediabar.setVisible(True) @@ -425,9 +455,9 @@ class SlideController(QtGui.QWidget): """ self.Toolbar.setVisible(True) self.Mediabar.setVisible(False) - self.Toolbar.makeWidgetsInvisible(self.song_edit_list) + self.Toolbar.makeWidgetsInvisible(self.songEditList) if item.is_capable(ItemCapabilities.AllowsEdit) and item.from_plugin: - self.Toolbar.makeWidgetsVisible(self.song_edit_list) + self.Toolbar.makeWidgetsVisible(self.songEditList) elif item.is_media(): self.Toolbar.setVisible(False) self.Mediabar.setVisible(True) @@ -569,8 +599,12 @@ class SlideController(QtGui.QWidget): self.enableToolBar(serviceItem) self.onSlideSelected() self.PreviewListWidget.setFocus() - Receiver.send_message(u'slidecontroller_%s_started' % self.type_prefix, + Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, [serviceItem]) + if self.serviceItem.is_text(): + st = SlideThread( + self, self.isLive, len(self.serviceItem.get_frames())) + st.start() log.log(15, u'Display Rendering took %4s' % (time.time() - before)) def onTextRequest(self): @@ -591,7 +625,7 @@ class SlideController(QtGui.QWidget): (self.PreviewListWidget.currentRow() == framenumber) data.append(data_item) Receiver.send_message(u'slidecontroller_%s_text_response' - % self.type_prefix, data) + % self.typePrefix, data) #Screen event methods def onSlideSelectedFirst(self): @@ -708,6 +742,13 @@ class SlideController(QtGui.QWidget): % self.serviceItem.name.lower(), [self.serviceItem, self.isLive]) + def slideCache(self, slide): + """ + Generate a slide cache item rendered and ready for use + in the background. + """ + self.serviceItem.get_rendered_frame(int(slide)) + def onSlideSelected(self): """ Generate the preview when you click on a slide. @@ -737,7 +778,7 @@ class SlideController(QtGui.QWidget): if self.isLive: self.mainDisplay.frameView(frame, True) self.selectedRow = row - Receiver.send_message(u'slidecontroller_%s_changed' % self.type_prefix, + Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, row) def onSlideChange(self, row): @@ -746,7 +787,7 @@ class SlideController(QtGui.QWidget): """ self.PreviewListWidget.selectRow(row) self.updatePreview() - Receiver.send_message(u'slidecontroller_%s_changed' % self.type_prefix, + Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, row) def updatePreview(self): From f7244c5e6e448c21e9fcd1b2c94074179e759c17 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 10 May 2010 19:29:51 +0100 Subject: [PATCH 38/81] Remove comments and simplify --- openlp/core/ui/slidecontroller.py | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 4673df4e2..37e0cf59a 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -38,12 +38,12 @@ log = logging.getLogger(__name__) class SlideThread(QtCore.QThread): """ - A special Qt thread class to fetch the version of OpenLP from the website. - This is threaded so that it doesn't affect the loading time of OpenLP. + A special Qt thread class to speed up the display of text based frames. + This is threaded so it loads the frames in background """ - def __init__(self, parent, isLive, count): + def __init__(self, parent, prefix, count): QtCore.QThread.__init__(self, parent) - self.isLive = isLive + self.prefix = prefix self.count = count def run(self): @@ -52,13 +52,7 @@ class SlideThread(QtCore.QThread): """ time.sleep(1) for i in range(0, self.count): - if self.isLive: - Receiver.send_message(u'live_slide_cache', i) - else: - Receiver.send_message(u'preview_slide_cache', i) -# for framenumber, frame in enumerate(self.serviceItem.get_frames()): -# self.serviceItem.get_rendered_frame(framenumber) - + Receiver.send_message(u'%s_slide_cache' % self.prefix, i) class SlideList(QtGui.QTableWidget): """ @@ -378,12 +372,8 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'splitterMoved(int, int)'), self.trackSplitter) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.refreshServiceItem) - if self.isLive: - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'live_slide_cache'), self.slideCache) - else: - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'preview_slide_cache'), self.slideCache) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'%s_slide_cache' % self.typePrefix), self.slideCache) def widthChanged(self): """ @@ -603,7 +593,7 @@ class SlideController(QtGui.QWidget): [serviceItem]) if self.serviceItem.is_text(): st = SlideThread( - self, self.isLive, len(self.serviceItem.get_frames())) + self, self.typePrefix, len(self.serviceItem.get_frames())) st.start() log.log(15, u'Display Rendering took %4s' % (time.time() - before)) From e0664a1e8864e96e2c7805ddc2c168f7b30ff4e8 Mon Sep 17 00:00:00 2001 From: rimach Date: Tue, 11 May 2010 21:00:21 +0200 Subject: [PATCH 39/81] bugfixing for i18n --- openlp/core/ui/mainwindow.py | 29 ++-- resources/i18n/openlp_en.ts | 272 ++++++++++++++++++----------------- 2 files changed, 154 insertions(+), 147 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index de8da9b66..4432eb9c0 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -260,15 +260,14 @@ class Ui_MainWindow(object): qmList = LanguageManager.get_qm_list() savedLanguage = LanguageManager.get_language() self.AutoLanguageItem.setChecked(LanguageManager.AutoLanguage) - self.LanguageItem = {} - for key in qmList.keys(): - self.LanguageItem[key] = QtGui.QAction(MainWindow) - self.LanguageItem[key].setObjectName(key) - self.LanguageItem[key].setCheckable(True) - self.LanguageItem[key].setDisabled(LanguageManager.AutoLanguage) + for key in sorted(qmList.keys()): + languageItem = QtGui.QAction(MainWindow) + languageItem.setObjectName(key) + languageItem.setCheckable(True) if qmList[key] == savedLanguage: - self.LanguageItem[key].setChecked(True) - add_actions(self.LanguageGroup, [self.LanguageItem[key]]) + languageItem.setChecked(True) + add_actions(self.LanguageGroup, [languageItem]) + self.LanguageGroup.setDisabled(LanguageManager.AutoLanguage) self.ToolsAddToolItem = QtGui.QAction(MainWindow) AddToolIcon = build_icon(u':/tools/tools_add.png') self.ToolsAddToolItem.setIcon(AddToolIcon) @@ -296,8 +295,7 @@ class Ui_MainWindow(object): self.ViewThemeManagerItem, None, self.action_Preview_Panel)) #i18n add Language Actions add_actions(self.OptionsLanguageMenu, (self.AutoLanguageItem, None)) - for item in sorted(self.LanguageItem): - add_actions(self.OptionsLanguageMenu, [self.LanguageItem[item]]) + add_actions(self.OptionsLanguageMenu, self.LanguageGroup.actions()) add_actions(self.OptionsMenu, (self.OptionsLanguageMenu.menuAction(), self.OptionsViewMenu.menuAction(), None, self.OptionsSettingsItem)) add_actions(self.ToolsMenu, @@ -417,10 +415,10 @@ class Ui_MainWindow(object): self.AutoLanguageItem.setText(translate('MainWindow', '&Auto Detect')) self.AutoLanguageItem.setStatusTip( translate('MainWindow', 'Choose System language, if available')) - for item in self.LanguageItem: - self.LanguageItem[item].setText(self.LanguageItem[item].objectName()) - self.LanguageItem[item].setStatusTip( - translate('MainWindow', 'Set the interface language to %1').arg(self.LanguageItem[item].objectName())) + for item in self.LanguageGroup.actions(): + item.setText(item.objectName()) + item.setStatusTip( + translate('MainWindow', 'Set the interface language to %1').arg(item.objectName())) self.ToolsAddToolItem.setText(translate('MainWindow', 'Add &Tool...')) self.ToolsAddToolItem.setStatusTip( translate('MainWindow', 'Add an application to the list of tools')) @@ -575,8 +573,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): #i18n def setAutoLanguage(self, value): - for action in self.LanguageGroup.actions(): - action.setDisabled(value) + self.LanguageGroup.setDisabled(value) LanguageManager.AutoLanguage = value LanguageManager.set_language(self.LanguageGroup.checkedAction()) diff --git a/resources/i18n/openlp_en.ts b/resources/i18n/openlp_en.ts index 41a956423..c3cb8a595 100644 --- a/resources/i18n/openlp_en.ts +++ b/resources/i18n/openlp_en.ts @@ -705,12 +705,12 @@ This General Public License does not permit incorporating your program into prop - + Bible not fully loaded - + No matching book could be found in this Bible. @@ -755,7 +755,7 @@ This General Public License does not permit incorporating your program into prop - + No Book Found @@ -1683,12 +1683,12 @@ Changes don't affect verses already in the service LanguageManager - + Language - + After restart new Language settings will be used. @@ -1696,379 +1696,379 @@ Changes don't affect verses already in the service MainWindow - + The Main Display has been blanked out - + OpenLP Version Updated - + Save Changes to Service? - + OpenLP Main Display Blanked - + New Service - + Open Service - + Save Service - + OpenLP 2.0 - + English - + Default Theme: - + &File - + &Import - + &Export - + &Options - + &View - + M&ode - + &Tools - + &Help - + Media Manager - + Service Manager - + Theme Manager - + &New - + Create a new Service - + Ctrl+N - + &Open - + Open an existing service - + Ctrl+O - + &Save - + Save the current service to disk - + Ctrl+S - + Save &As... - + Save Service As - + Save the current service under a new name - + F12 - + E&xit - + Quit OpenLP - + Alt+F4 - + &Theme - + &Language - + Look && &Feel - + &Settings - + &Media Manager - + Toggle Media Manager - + Toggle the visibility of the Media Manager - + F8 - + &Theme Manager - + Toggle Theme Manager - + Toggle the visibility of the Theme Manager - + F10 - + &Service Manager - + Toggle Service Manager - + Toggle the visibility of the Service Manager - + F9 - + &Preview Panel - + Toggle Preview Panel - + Toggle the visibility of the Preview Panel - + F11 - + &Plugin List - + List the Plugins - + Alt+F7 - + &User Guide - + &About - + More information about OpenLP - + Ctrl+F1 - + &Online Help - + &Web Site - + &Auto Detect - + Choose System language, if available - + Set the interface language to %1 - + Add &Tool... - + Add an application to the list of tools - + &Preview Pane - + &Live - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org - + Your service has changed. Do you want to save those changes? @@ -2217,7 +2217,7 @@ You can download the latest version from http://openlp.org MediaPlugin - + <b>Media Plugin</b><br>This plugin allows the playing of audio and video media @@ -2533,7 +2533,7 @@ You can download the latest version from http://openlp.org - + Present using: @@ -2543,7 +2543,7 @@ You can download the latest version from http://openlp.org - + A presentation with that filename already exists. @@ -2553,12 +2553,12 @@ You can download the latest version from http://openlp.org - + File exists - + Presentations (%s) @@ -2636,140 +2636,150 @@ You can download the latest version from http://openlp.org ServiceManager - + Save Changes to Service? - + Open Service - + Move to top - + Create a new service - + Save this service - + Theme: - + Delete From Service - + Save Service - + &Live Verse - + Move to &top - + New Service - + &Notes - + Move to end - + &Delete From Service - + Move up order - + Move down order - + Move &down - + Load an existing service - + &Preview Verse - + Move &up - + &Edit Item - + Move to &bottom - + &Maintain Item - + Your service is unsaved, do you want to save those changes before creating a new one? - + Your current service is unsaved, do you want to save the changes before opening a new one? - + &Add New Item - + &Add to Selected Item + + + Missing Display Handler + + + + + Your item cannot be displayed as there is no handler to display it + + ServiceNoteForm @@ -2790,97 +2800,97 @@ You can download the latest version from http://openlp.org SlideController - + Move to previous - + Go to Verse - + Start continuous loop - + Live - + Start playing media - + Move to live - + Preview - + Move to last - + Edit and re-preview Song - + Delay between slides in seconds - + Move to next - + Move to first - + Blank Screen - + Verse - + Stop continuous loop - + s - + Theme Screen - + Hide Screen - + Chorus From 294b0abfc0efaf2b5cccac910358c164e35662e5 Mon Sep 17 00:00:00 2001 From: rimach Date: Tue, 11 May 2010 23:05:08 +0200 Subject: [PATCH 40/81] remove unused imports, correct import order --- openlp/core/ui/aboutform.py | 1 - openlp/core/utils/languagemanager.py | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/aboutform.py b/openlp/core/ui/aboutform.py index cf051722b..c79324515 100644 --- a/openlp/core/ui/aboutform.py +++ b/openlp/core/ui/aboutform.py @@ -26,7 +26,6 @@ from PyQt4 import QtCore, QtGui from aboutdialog import Ui_AboutDialog -from openlp.core.lib import translate class AboutForm(QtGui.QDialog, Ui_AboutDialog): """ diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py index 521eab382..8be408d17 100644 --- a/openlp/core/utils/languagemanager.py +++ b/openlp/core/utils/languagemanager.py @@ -24,10 +24,9 @@ ############################################################################### import logging - -from logging import FileHandler -from PyQt4 import QtCore, QtGui import os + +from PyQt4 import QtCore, QtGui from openlp.core.utils import AppLocation from openlp.core.lib import translate From cd8377f03d3363ca92686d3d0851cb03f96fb392 Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Wed, 12 May 2010 21:43:48 +0100 Subject: [PATCH 41/81] Fixed crash when monitor= in OpenLP.conf --- openlp/core/ui/screen.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py index 19c4e01b5..69dd915d2 100644 --- a/openlp/core/ui/screen.py +++ b/openlp/core/ui/screen.py @@ -61,9 +61,10 @@ class ScreenList(object): """ Set up the current screen dimensions """ - log.debug(u'set_override_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) self.current_display = 0 else: self.current = self.screen_list[number] From eaef48e70858988bac4ea62dbcee72b64e0458c9 Mon Sep 17 00:00:00 2001 From: rimach Date: Wed, 12 May 2010 23:44:00 +0200 Subject: [PATCH 42/81] resolve merge proposal request --- resources/i18n/openlp_af.qm | Bin 31001 -> 30886 bytes resources/i18n/openlp_de.qm | Bin 33285 -> 31803 bytes resources/i18n/openlp_en.qm | Bin 0 -> 337 bytes resources/i18n/openlp_en.ts | 749 +++++++++++++++++++-------------- resources/i18n/openlp_en_GB.qm | Bin 28558 -> 29107 bytes resources/i18n/openlp_en_ZA.qm | Bin 21540 -> 19540 bytes resources/i18n/openlp_es.qm | Bin 14461 -> 14711 bytes resources/i18n/openlp_hu.qm | Bin 31896 -> 32687 bytes resources/i18n/openlp_nb.qm | Bin 20348 -> 17999 bytes resources/i18n/openlp_pt_BR.qm | Bin 32600 -> 32861 bytes resources/i18n/openlp_sv.qm | Bin 33919 -> 33820 bytes scripts/translation_utils.py | 3 +- 12 files changed, 441 insertions(+), 311 deletions(-) create mode 100644 resources/i18n/openlp_en.qm diff --git a/resources/i18n/openlp_af.qm b/resources/i18n/openlp_af.qm index 785a972497aa5db313b27fd1495c06f689483bd9..6048181b7aab574133e9e1dd1ee1a273dd0ae517 100644 GIT binary patch delta 5039 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 e$1i3K@-mrRiS!xx+XLL delta 5129 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 delta 6763 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 T3EHM{RZ^E(>+C0HP3Qjyu?D5- diff --git a/resources/i18n/openlp_en.qm b/resources/i18n/openlp_en.qm new file mode 100644 index 0000000000000000000000000000000000000000..6bd22c41dfd987e516ede9d5e79a545715d2ad8c GIT binary patch literal 337 rcmcE7ks@*G{hX<16=n7(EZlq7i2(>QL4-a71EUecbP#hC5FY{nJdg@w literal 0 HcmV?d00001 diff --git a/resources/i18n/openlp_en.ts b/resources/i18n/openlp_en.ts index c3cb8a595..a00e05646 100644 --- a/resources/i18n/openlp_en.ts +++ b/resources/i18n/openlp_en.ts @@ -2,11 +2,6 @@ AboutForm - - - build - - About OpenLP @@ -216,19 +211,14 @@ This General Public License does not permit incorporating your program into prop Close + + + build + + AlertForm - - - Item selected to Add - - - - - Missing data - - Alert Message @@ -274,6 +264,89 @@ This General Public License does not permit incorporating your program into prop &Close + + + Item selected to Add + + + + + Missing data + + + + + AlertsTab + + + pt + + + + + Location: + + + + + Font Color: + + + + + Font + + + + + Font Name: + + + + + Preview + + + + + Alerts + + + + + Alert timeout: + + + + + openlp.org + + + + + Background Color: + + + + + s + + + + + Bottom + + + + + Top + + + + + Font Size: + + AmendThemeForm @@ -685,8 +758,18 @@ This General Public License does not permit incorporating your program into prop - - Book: + + Clear + + + + + Search + + + + + To: @@ -694,21 +777,11 @@ This General Public License does not permit incorporating your program into prop Text Search - - - Find: - - Search Type: - - - Bible not fully loaded - - No matching book could be found in this Bible. @@ -725,8 +798,13 @@ This General Public License does not permit incorporating your program into prop - - Search + + Bible not fully loaded + + + + + No Book Found @@ -755,8 +833,13 @@ This General Public License does not permit incorporating your program into prop - - No Book Found + + Find: + + + + + Book: @@ -764,16 +847,6 @@ This General Public License does not permit incorporating your program into prop Advanced - - - To: - - - - - Clear - - Verse: @@ -816,13 +889,13 @@ This General Public License does not permit incorporating your program into prop - - Verse Display + + Display Dual Bible Verses - - Display Dual Bible Verses + + Bibles @@ -831,8 +904,8 @@ This General Public License does not permit incorporating your program into prop - - Layout Style: + + Verse Display @@ -840,11 +913,6 @@ This General Public License does not permit incorporating your program into prop No brackets - - - Bibles - - { and } @@ -866,6 +934,11 @@ Changes don't affect verses already in the service Bible Theme: + + + Layout Style: + + CustomMediaItem @@ -901,6 +974,14 @@ Changes don't affect verses already in the service + + DisplayTab + + + Displays + + + EditCustomForm @@ -923,11 +1004,6 @@ Changes don't affect verses already in the service Save && Preview - - - You have unsaved data, please save or clear - - Edit Custom Slides @@ -1028,6 +1104,11 @@ Changes don't affect verses already in the service Credits: + + + You have unsaved data, please save or clear + + EditSongForm @@ -1051,31 +1132,6 @@ Changes don't affect verses already in the service Error - - - bitped - - - - - v - - - - - c - - - - - Invalid verse entry - Vx or Cx - - - - - Invalid verse entry, values must be I,B,T,P,E,O,Vx,Cx - - Song Editor @@ -1201,19 +1257,34 @@ Changes don't affect verses already in the service Theme, Copyright Info && Comments + + + bitped + + + + + v + + + + + c + + + + + Invalid verse entry - Vx or Cx + + + + + Invalid verse entry, values must be I,B,T,P,E,O,Vx,Cx + + EditVerseForm - - - Verse - - - - - Chrous - - Edit Verse @@ -1229,6 +1300,11 @@ Changes don't affect verses already in the service Intro + + + Verse + + Pre-Chorus @@ -1259,6 +1335,11 @@ Changes don't affect verses already in the service Number + + + Chrous + + GeneralTab @@ -1267,6 +1348,11 @@ Changes don't affect verses already in the service CCLI Details + + + SongSelect Password: + + primary @@ -1337,11 +1423,6 @@ Changes don't affect verses already in the service Monitors - - - SongSelect Password: - - Display if a single screen @@ -1420,8 +1501,8 @@ Changes don't affect verses already in the service ImportWizardForm - - You need to specify a file with books of the Bible to use in the import. + + Bible Exists @@ -1434,11 +1515,6 @@ Changes don't affect verses already in the service You need to set a copyright for your Bible! Bibles in the Public Domain need to be marked as such. - - - Bible Exists - - Empty Copyright @@ -1464,16 +1540,6 @@ Changes don't affect verses already in the service Finished import. - - - You need to specify a file of Bible verses to import. - - - - - You need to specify a version name for your Bible. - - This Bible already exists! Please import a different Bible or first delete the existing one. @@ -1489,16 +1555,6 @@ Changes don't affect verses already in the service Invalid Books File - - - You need to specify a file to import your Bible from. - - - - - You need to specify an OpenSong Bible file to import. - - Invalid Verse File @@ -1509,21 +1565,6 @@ Changes don't affect verses already in the service Open OpenSong Bible - - - Open OSIS File - - - - - Open Books CSV File - - - - - Open Verses CSV File - - Bible Import Wizard @@ -1679,16 +1720,56 @@ Changes don't affect verses already in the service Ready. + + + You need to specify a file to import your Bible from. + + + + + You need to specify a file with books of the Bible to use in the import. + + + + + You need to specify a file of Bible verses to import. + + + + + You need to specify an OpenSong Bible file to import. + + + + + You need to specify a version name for your Bible. + + + + + Open OSIS File + + + + + Open Books CSV File + + + + + Open Verses CSV File + + LanguageManager - + Language - + After restart new Language settings will be used. @@ -1715,21 +1796,6 @@ Changes don't affect verses already in the service OpenLP Main Display Blanked - - - New Service - - - - - Open Service - - - - - Save Service - - OpenLP 2.0 @@ -1805,6 +1871,11 @@ Changes don't affect verses already in the service &New + + + New Service + + Create a new Service @@ -1820,6 +1891,11 @@ Changes don't affect verses already in the service &Open + + + Open Service + + Open an existing service @@ -1835,6 +1911,11 @@ Changes don't affect verses already in the service &Save + + + Save Service + + Save the current service to disk @@ -2090,11 +2171,6 @@ You can download the latest version from http://openlp.org Load a new - - - Delete the selected item - - &Edit @@ -2120,6 +2196,11 @@ You can download the latest version from http://openlp.org Edit the selected + + + Delete the selected item + + Add a new @@ -2171,26 +2252,26 @@ You can download the latest version from http://openlp.org - - Invalid Service Item + + You must select an existing service item to add to. - - You must select an existing service item to add to. + + Invalid Service Item MediaMediaItem - - Media + + Select Media - - Select Media + + Media @@ -2378,6 +2459,11 @@ You can download the latest version from http://openlp.org OpenSongExportForm + + + OpenSong Song Exporter + + Select OpenSong song folder: @@ -2443,11 +2529,6 @@ You can download the latest version from http://openlp.org Close - - - OpenSong Song Exporter - - OpenSongImportForm @@ -2538,8 +2619,8 @@ You can download the latest version from http://openlp.org - - Automatic + + Select Presentation(s) @@ -2548,13 +2629,13 @@ You can download the latest version from http://openlp.org - - Select Presentation(s) + + File exists - - File exists + + Automatic @@ -2635,6 +2716,11 @@ You can download the latest version from http://openlp.org ServiceManager + + + Save Service + + Save Changes to Service? @@ -2671,8 +2757,8 @@ You can download the latest version from http://openlp.org - - Save Service + + &Preview Verse @@ -2680,11 +2766,6 @@ You can download the latest version from http://openlp.org &Live Verse - - - Move to &top - - New Service @@ -2695,16 +2776,6 @@ You can download the latest version from http://openlp.org &Notes - - - Move to end - - - - - &Delete From Service - - Move up order @@ -2715,24 +2786,14 @@ You can download the latest version from http://openlp.org Move down order - - - Move &down - - Load an existing service - - &Preview Verse - - - - - Move &up + + Move to end @@ -2740,11 +2801,41 @@ You can download the latest version from http://openlp.org &Edit Item + + + Move to &top + + + + + Move &up + + + + + Move &down + + Move to &bottom + + + &Delete From Service + + + + + &Add New Item + + + + + &Add to Selected Item + + &Maintain Item @@ -2760,16 +2851,6 @@ You can download the latest version from http://openlp.org Your current service is unsaved, do you want to save the changes before opening a new one? - - - &Add New Item - - - - - &Add to Selected Item - - Missing Display Handler @@ -2804,6 +2885,16 @@ You can download the latest version from http://openlp.org Move to previous + + + Edit and re-preview Song + + + + + Delay between slides in seconds + + Go to Verse @@ -2829,24 +2920,14 @@ You can download the latest version from http://openlp.org Move to live - - - Preview - - Move to last - - Edit and re-preview Song - - - - - Delay between slides in seconds + + Verse @@ -2865,8 +2946,8 @@ You can download the latest version from http://openlp.org - - Verse + + Preview @@ -2925,26 +3006,6 @@ You can download the latest version from http://openlp.org SongMaintenanceForm - - - Are you sure you want to delete the selected book? - - - - - Couldn't save your author. - - - - - This author can't be deleted, they are currently assigned to at least one song. - - - - - Couldn't add your book. - - Error @@ -2956,13 +3017,13 @@ You can download the latest version from http://openlp.org - - Couldn't add your topic. + + Are you sure you want to delete the selected book? - - This book can't be deleted, it is currently assigned to at least one song. + + Delete Topic @@ -2980,26 +3041,6 @@ You can download the latest version from http://openlp.org Are you sure you want to delete the selected author? - - - Couldn't add your author. - - - - - Couldn't save your topic. - - - - - Couldn't save your book. - - - - - Delete Topic - - Delete Author @@ -3010,11 +3051,6 @@ You can download the latest version from http://openlp.org No topic selected! - - - This topic can't be deleted, it is currently assigned to at least one song. - - Are you sure you want to delete the selected topic? @@ -3055,6 +3091,51 @@ You can download the latest version from http://openlp.org Delete + + + Couldn't add your author. + + + + + Couldn't add your topic. + + + + + Couldn't add your book. + + + + + Couldn't save your author. + + + + + Couldn't save your topic. + + + + + Couldn't save your book. + + + + + This author can't be deleted, they are currently assigned to at least one song. + + + + + This topic can't be deleted, it is currently assigned to at least one song. + + + + + This book can't be deleted, it is currently assigned to at least one song. + + SongMediaItem @@ -3073,6 +3154,11 @@ You can download the latest version from http://openlp.org Maintain the lists of authors, topics and books + + + Titles + + Lyrics @@ -3083,11 +3169,6 @@ You can download the latest version from http://openlp.org Type: - - - Titles - - Clear @@ -3236,11 +3317,6 @@ You can download the latest version from http://openlp.org Delete a theme - - - File is not a valid theme. - - Edit a theme @@ -3256,11 +3332,6 @@ You can download the latest version from http://openlp.org Export Theme - - - You are unable to delete the default theme. - - Theme Exists @@ -3301,11 +3372,6 @@ You can download the latest version from http://openlp.org Export theme - - - You have not selected a theme. - - A theme with this name already exists, would you like to overwrite it? @@ -3316,6 +3382,11 @@ You can download the latest version from http://openlp.org Export a theme + + + You are unable to delete the default theme. + + Theme %s is use in %s plugin @@ -3326,6 +3397,16 @@ You can download the latest version from http://openlp.org Theme %s is use by Service Manager + + + You have not selected a theme. + + + + + File is not a valid theme. + + ThemesTab @@ -3340,8 +3421,8 @@ You can download the latest version from http://openlp.org - - Use the global theme, overriding any themes associated with either the service or the songs. + + Global level @@ -3355,8 +3436,8 @@ You can download the latest version from http://openlp.org - - Global level + + Use the global theme, overriding any themes associated with either the service or the songs. @@ -3365,13 +3446,13 @@ You can download the latest version from http://openlp.org - - Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. + + Themes - - Themes + + Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. @@ -3502,6 +3583,54 @@ You can download the latest version from http://openlp.org + + self + + + Amend Display Settings + + + + + Default Settings + + + + + X + + + + + 0 + + + + + Y + + + + + Height + + + + + Width + + + + + Amend Settings + + + + + Override Output Display + + + self.ImportSongMenu diff --git a/resources/i18n/openlp_en_GB.qm b/resources/i18n/openlp_en_GB.qm index b2dc819313cb2da8c1cc22fd27930256eea7d5ab..5a31382cf6d76e4b0ad2cc29f4110b0c77c2de18 100644 GIT binary patch delta 5016 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 E0H_MW82|tP diff --git a/resources/i18n/openlp_en_ZA.qm b/resources/i18n/openlp_en_ZA.qm index 58ee3e02cfc5dbcbb211fa5aa464ff1af936163f..344aec034fd47537dbabafa9656a5f1229f64c09 100644 GIT binary patch delta 3314 zcmZwJ3tUuH9tZIMow={Mb7uw!k%tc+0tyHS@+J%td@Cp@ArWHuMi3E8T*pl$&4WZjyRVS(37~p(=eR4QEhM> zah29`261~v!A0b>ZVg;b{qGgSCi3nMhIh#4GfyIoE%{pOYrM#J*2gf4e695~iK>O< zdl?q29)@4`SD>-!drr?H`%V4CU*)%~hh zdSw|JSN9aN=0M|lSLmxclg4k&Lb+J=uw?F&FVVkI@djhPjX&}Xx&h;)8*C2ld1SvQHkHu>X10kxLi zf;;J(%y!sJ&nF;TXp5!1u6#v1>(xlES=DbP?7v?)}i9)WM9@ zRTJsmnHlG>r1}X=&UD0@K99-s#?0w=Gb>JPgI_T_Y+oib$tK3~4ACh2GiTzQ;56p) zrI+AJ=Bj2F+{@f}2U9PfSAEXhzki#^;I0uh=zt+s<8Z1J7HC}SF%aW3jhkO5HcgPm zb2sjr7HOttV&|CN(`>5R4LddOh4>KJIBGubUSdWjO7loL1XpOfPM?N*wel8>)aHcN z)UXQP)b^j4LS!pyT^C_$ZHH*bCA7iu+R1~b!KK;^Ys0p!+Qn`aM0SjJXC9W)E?oO@ zH|pEvYOkKf(%DsMpY(WA`{URtDBsq0m6>tl1%VZxM#3!C#wQ3Cu>-5WfGwP#*z~}HDTT`Yb>Z@T7 z)S#ihPO9g%csH_3Au?!V8aJi$ylUEroF z%ZZ$Qxb$!g#5tCmwe}cH$xpKv$p>tPqKu}2X1x8dy; z;JN-0ynQTUr2ksp`DZL`e{&5VQS5_E3!ixGI(*Eh=3^uS?D&kN5IBsVHKPtD@^ePw zL>rLHFPe|%2UPM!VjHaE->+(bE&Qon-ms(Bfv&3K`3r%4hz8E)+a6-q3|uL2ZLh#O z!9%=({Xg)w5OoMWbqx?kyOzLYVIB!^iRwNfFBw7SdRkc8l>(m%EB?HY$jwDqt2o2E zLdnIYMD8PmlFJA__cWnA{5!ZZ1wJ7jykrRi*BO=$=23{A3N*?f; z7?6q=dG-@SU0q<37#21b7K`yE1<)eq4F8nKOB5Ho9fh;S2Ge=$f3GUBc^(?}`ba$g z*lV*)O*j@6%=VHfl_4=D__w$#IcYF?Cl^V?@$;cE+=cXVU{mP^Z7OVBr<-%Inrq{Y+X8gMKthGGU zMbGZv0f*}sR^VJ1I$LjUgZ}0El7x1mfGPUwcQDd`1^Q!cm*FP;znIfRfujD-RCF|O zsQ$j88s_UCk68?F=*>?i;$Rsj>32i{YhJ%;Lljr2aN?DnNgD3ccym5px(Qr}TdORL_%G;RhFiqap-3XV+2V$@U z!^`ClOsGG+#;j&q2&3_xedpm4V{zpJSZ+MjjhKjNG9F!m4n}@s zY|!Gwi_#jKZlay2!N#*0!(goOnoAqZH(o!7n24$~wzkfLttJ{-51*UH*P;HXXfM;$ zG3a4*lBu>FK^Xmp>13%htTCP0hzFuCnc52qV5jMh1}}cm&h&5sg6G9B)58xh!3EgV zFK$up>b>o8Y>*VYAUnTcaq^5T;_!E*KoMk5B~y0zKR2gmD)Z#P-`z;a&CfwC{ApE6 z{PfEsjIzCx=i!~v@d(v`R4e{sxe-gr_C++F^ zK0p?=O!U!jx!w$Z5_=K?idyJ4z7gBMCgnz=QTZlOuziFp<vfoxzeaHp=IT_CAaw r9m56_hdz5J3?{Qq!Ij;)*;mu9^#B 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 diff --git a/resources/i18n/openlp_es.qm b/resources/i18n/openlp_es.qm index f128095b841b2e9f42ae36617e70d4149e64142b..da03a2e0f0c8e6032763a3a0643b226baa14663b 100644 GIT binary patch delta 3800 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 delta 3407 zcmb7`30PIf701uz-TU^1F|vns*J zxF!~>gkTaC<(bxKm88VR1()PAt&LIhNu=7QQR|Z6()K@(F`p)2+spUvZ|0mcGiTZddOM{+ z!DLeU9wCylN!i3%O3FLWffW?6ayeK_kq`QVtz_qR9u~5n{uGR&;hUPkA(Y$l_bivXGTuK)!FM|i^;uTCf9dq8XTc2V z{0cp|KyasrUsEOer#);3;E*BRqem?^Xn5V@?f58ilHrdYZAXqk(54E>7*Axhsz#-? zfP++%t82kR)sn@(0GaCWgJocY>h4jTfU!*utNDV+6e>IBJHSQqvZ8h1+u%mSWGwnO<-0H9Xgy;U)e_9>S*pnM;h1NoV54IE4i0#Jsn~WotI&9; z3|)p0cqJ*%uBid13swq#DA=k@V6Q-bU&%>CEWN#znKQP6y#&jZbqPb!Z&Kd+)g~gJ zSiwokmZVGQmnqdR&jfENyPM#ERj=%Jx*PqKJq=utE;tW_=hjN)fcI>$PHEoE_2-nU zzeciIzi+2+l;9-6Dz$e3?0xIi)?wI~pPzc*swi-vdh*zKaGZKpiVZAP&;2ErZ&y24 zdSWMjjq3NR4-)wYtDCk(f&&F-3vN)K=<5slUQIXcd9YcNZmS^b5~4}pwiq0)DSxdH zT%@Tuxqv8Ow&sn*Yv3A9)lMJqJv+sb*otn!xkDzft({h>f zjy54-BvDYTHnpM*oT{A@*9q19$4@ zT5+91Ki02Z2M0p$={N67B?=4Czq8K_4%P3~Vkco6^~bWtfk*WxT%2wC)ARQc*?JmO zHU_2|WOsjxL4J1&`b!Mz6wXiD>9n;O3agOq;eiHc3)nTmQ1g`$yxq=j@q+UWtrAYC z+cu+a-)-=e(K8X(th>e-z6AHWdxkNi?>X?kajX`0J-h|S7{|>jL4To zGl4`Ap2p4lQ*r+z?8bTv21FDH))>DlqSUkO8hVH_XF_E$Xnj@lq0a&3trn zKO(yaF8CFESnSE>FOT7f?d9f+7iWVXSO%U&%>J{kmU!7z3SDUwR(Lh4Q9Xb?k1J8`j`NA-n$R$<1>++^RcsFYXckR zyVlDSc~amGRz4Lz3YL@C8u#))Q+KfN(~YfJj*|KL(;YlTc%HRKy7Ms#R8lQF>08Sh z{Z6nZ|GD-~&YagLx08Ato&y0wPVp1(*O7wH(P8+xG3(ytvMVHjNvtr?KL}OHJ+1li zxKomX^2D|TX0m{wurzPV#BxP66K@BVqLtK{mndHD={gv~z0KiOtTThoy?)9d<;NLw z*co$xYg|y41-x(szl(UXN{>Gdi z=U8>Lo_WP>XJ5yCB{i@^@yS_(kYD^sM`BELx2C$^Gu&^&r*I)!_{Z-j&&ntIZ_>6O z`*rNK0Y2=F0kUBaWcvx#h0Z*ZarvX4>Cbe*J*oxoZ@Gn?=r%o&6fTv#@bkydhR$P; e1S2U{N@OhqN?2|}qOVU!7nN;DXk#^rXa56muv_f_ diff --git a/resources/i18n/openlp_hu.qm b/resources/i18n/openlp_hu.qm index dc4e5fba2cea68f9dcbf919d865b7f5a71dc8173..4f2c11f7b907fec66b4f95bc9b7fe2bb9acc5f10 100644 GIT binary patch delta 5113 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 diff --git a/resources/i18n/openlp_pt_BR.qm b/resources/i18n/openlp_pt_BR.qm index 4e075ec643a21dc4ec44d3d0ca92d00bf5a9961a..2ad079b4b540d02c765d0bf9f4713ace83badbda 100644 GIT binary patch delta 5071 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 diff --git a/resources/i18n/openlp_sv.qm b/resources/i18n/openlp_sv.qm index f7b80c6ed111c71d6f3567f8f9774baba1a80b03..ae9d9fec046ede9221e918dc3627f03c775b508a 100644 GIT binary patch delta 5297 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 diff --git a/scripts/translation_utils.py b/scripts/translation_utils.py index 7a76a5566..0135efeb6 100755 --- a/scripts/translation_utils.py +++ b/scripts/translation_utils.py @@ -38,7 +38,8 @@ from PyQt4 import QtCore ignore_pathes = [u"./scripts", u"./openlp/core/test"] ignore_files = [u"setup.py"] translation_path = u"http://pootle.projecthq.biz/export/openlp/" -translations = [ u"af" +translations = [ u"en" + , u"af" , u"en_ZA" , u"en_GB" , u"de" From 23c3974afda45b633da4729a60a8de179e1906d7 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 15 May 2010 07:44:36 +0100 Subject: [PATCH 43/81] Display fixes --- openlp/core/lib/renderer.py | 7 +++++-- openlp/core/ui/slidecontroller.py | 29 +++++++++++++---------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index cfb0e2bc2..64e54e5fc 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -533,7 +533,10 @@ class Renderer(object): font = self.mainFont metrics = QtGui.QFontMetrics(font) w = metrics.width(line) - h = metrics.height() + int(self._theme.font_main_line_adjustment) + if footer: + h = metrics.height() + else: + h = metrics.height() + int(self._theme.font_main_line_adjustment) if draw: self.painter.setFont(font) if color is None: @@ -581,4 +584,4 @@ class Renderer(object): """ image.save(u'renderer.png', u'png') if image2: - image2.save(u'renderer2.png', u'png') \ No newline at end of file + image2.save(u'renderer2.png', u'png') diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 37e0cf59a..07ca6b845 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -114,10 +114,7 @@ class SlideController(QtGui.QWidget): self.songEditList = [ u'Edit Song', ] - if isLive: - self.labelWidth = 20 - else: - self.labelWidth = 0 + self.labelWidth = 20 self.timer_id = 0 self.songEdit = False self.selectedRow = 0 @@ -160,7 +157,7 @@ class SlideController(QtGui.QWidget): self.PreviewListWidget.setColumnCount(2) self.PreviewListWidget.horizontalHeader().setVisible(False) self.PreviewListWidget.verticalHeader().setVisible(False) - self.PreviewListWidget.setColumnWidth(1, self.labelWidth) + self.PreviewListWidget.setColumnWidth(0, self.labelWidth) self.PreviewListWidget.setColumnWidth( 1, self.Controller.width() - self.labelWidth) self.PreviewListWidget.isLive = self.isLive @@ -536,7 +533,7 @@ class SlideController(QtGui.QWidget): self.PreviewListWidget.rowCount() + 1) rowitem = QtGui.QTableWidgetItem() item = QtGui.QTableWidgetItem() - slide_height = 0 + slideHeight = 0 #It is a based Text Render if self.serviceItem.is_text(): if self.isLive and frame[u'verseTag'] is not None: @@ -569,14 +566,14 @@ class SlideController(QtGui.QWidget): label.setScaledContents(True) label.setPixmap(QtGui.QPixmap.fromImage(pixmap)) self.PreviewListWidget.setCellWidget(framenumber, 1, label) - slide_height = width * self.parent.RenderManager.screen_ratio + slideHeight = width * self.parent.RenderManager.screen_ratio row += 1 rowitem.setText(unicode(row)) rowitem.setTextAlignment(QtCore.Qt.AlignVCenter) self.PreviewListWidget.setItem(framenumber, 0, rowitem) self.PreviewListWidget.setItem(framenumber, 1, item) - if slide_height != 0: - self.PreviewListWidget.setRowHeight(framenumber, slide_height) + if slideHeight != 0: + self.PreviewListWidget.setRowHeight(framenumber, slideHeight) if self.serviceItem.is_text(): self.PreviewListWidget.resizeRowsToContents() self.PreviewListWidget.setColumnWidth(0, self.labelWidth) @@ -604,16 +601,16 @@ class SlideController(QtGui.QWidget): data = [] if self.serviceItem: for framenumber, frame in enumerate(self.serviceItem.get_frames()): - data_item = {} + dataItem = {} if self.serviceItem.is_text(): - data_item[u'tag'] = unicode(frame[u'verseTag']) - data_item[u'text'] = unicode(frame[u'text']) + dataItem[u'tag'] = unicode(frame[u'verseTag']) + dataItem[u'text'] = unicode(frame[u'text']) else: - data_item[u'tag'] = unicode(framenumber) - data_item[u'text'] = u'' - data_item[u'selected'] = \ + dataItem[u'tag'] = unicode(framenumber) + dataItem[u'text'] = u'' + dataItem[u'selected'] = \ (self.PreviewListWidget.currentRow() == framenumber) - data.append(data_item) + data.append(dataItem) Receiver.send_message(u'slidecontroller_%s_text_response' % self.typePrefix, data) From c5b12ffaf311c31f09cda701251c7b2f212d5704 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 15 May 2010 07:57:29 +0100 Subject: [PATCH 44/81] Screen size fix for Raoul --- openlp/core/ui/maindisplay.py | 8 +++++--- openlp/core/ui/mainwindow.py | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 4b2c4d268..b0278428a 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -116,10 +116,12 @@ class MainDisplay(DisplayWidget): """ log.debug(u'Initialisation started') DisplayWidget.__init__(self, parent) + self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint) + self.setWindowState(QtCore.Qt.WindowFullScreen) self.parent = parent self.setWindowTitle(u'OpenLP Display') # WA_TranslucentBackground is not available in QT4.4 - try: + try: self.setAttribute(QtCore.Qt.WA_TranslucentBackground) except AttributeError: pass @@ -346,12 +348,12 @@ class VideoDisplay(Phonon.VideoWidget): Phonon.createPath(self.mediaObject, self.audioObject) flags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Dialog # WindowsStaysOnBottomHint is not available in QT4.4 - try: + try: flags = flags | QtCore.Qt.WindowStaysOnBottomHint except AttributeError: pass self.setWindowFlags(flags) - + QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'maindisplay_hide'), self.mediaHide) QtCore.QObject.connect(Receiver.get_receiver(), diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index df275dd20..a367039e7 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -730,6 +730,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): def loadSettings(self): log.debug(u'Loading QSettings') + print self.geometry() settings = QtCore.QSettings() settings.beginGroup(self.generalSettingsSection) self.recentFiles = settings.value(u'recent files').toStringList() @@ -741,6 +742,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): settings.value(u'main window geometry').toByteArray()) self.restoreState(settings.value(u'main window state').toByteArray()) settings.endGroup() + print self.geometry() def saveSettings(self): log.debug(u'Saving QSettings') From bfb3143cfcc609d823c1d4a94126c601e62b6699 Mon Sep 17 00:00:00 2001 From: andreas Date: Sat, 15 May 2010 21:59:21 +0200 Subject: [PATCH 45/81] fix for empty slide in dual bible view --- openlp/plugins/bibles/lib/mediaitem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 136f45633..9f0a8e00d 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -519,7 +519,7 @@ class BibleMediaItem(MediaManagerItem): else: service_item.theme = self.parent.settings_tab.bible_theme #if we are verse per slide we have already been added - if self.parent.settings_tab.layout_style != 0: + if self.parent.settings_tab.layout_style != 0 and not bible2: raw_slides.append(bible_text) for slide in raw_slides: service_item.add_from_text(slide[:30], slide) From ac845a93ba58d29b61c58cf19898299d3e5273fd Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 16 May 2010 16:18:05 +0100 Subject: [PATCH 46/81] Fix screen issues - not sure how though --- openlp/core/ui/amendthemedialog.py | 1 + openlp/core/ui/mainwindow.py | 3 +-- openlp/core/ui/slidecontroller.py | 41 +++++++++++++----------------- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/openlp/core/ui/amendthemedialog.py b/openlp/core/ui/amendthemedialog.py index c713eb608..e63316f55 100644 --- a/openlp/core/ui/amendthemedialog.py +++ b/openlp/core/ui/amendthemedialog.py @@ -183,6 +183,7 @@ class Ui_AmendThemeDialog(object): self.MainFontLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.FontMainWrapLineAdjustmentLabel) self.FontMainLineAdjustmentSpinBox = QtGui.QSpinBox(self.FontMainGroupBox) self.FontMainLineAdjustmentSpinBox.setObjectName("FontMainLineAdjustmentSpinBox") + self.FontMainLineAdjustmentSpinBox.setMinimum(-99) self.MainFontLayout.setWidget(4, QtGui.QFormLayout.FieldRole, self.FontMainLineAdjustmentSpinBox) self.FontMainWrapIndentationLabel = QtGui.QLabel(self.FontMainGroupBox) self.FontMainWrapIndentationLabel.setObjectName("FontMainWrapIndentationLabel") diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index a367039e7..69b70c0fa 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 ############################################################################### @@ -730,7 +731,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): def loadSettings(self): log.debug(u'Loading QSettings') - print self.geometry() settings = QtCore.QSettings() settings.beginGroup(self.generalSettingsSection) self.recentFiles = settings.value(u'recent files').toStringList() @@ -742,7 +742,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): settings.value(u'main window geometry').toByteArray()) self.restoreState(settings.value(u'main window state').toByteArray()) settings.endGroup() - print self.geometry() def saveSettings(self): log.debug(u'Saving QSettings') diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 07ca6b845..a036c3d9e 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -114,7 +114,6 @@ class SlideController(QtGui.QWidget): self.songEditList = [ u'Edit Song', ] - self.labelWidth = 20 self.timer_id = 0 self.songEdit = False self.selectedRow = 0 @@ -154,12 +153,11 @@ class SlideController(QtGui.QWidget): self.ControllerLayout.setMargin(0) # Controller list view self.PreviewListWidget = SlideList(self) - self.PreviewListWidget.setColumnCount(2) + self.PreviewListWidget.setColumnCount(1) self.PreviewListWidget.horizontalHeader().setVisible(False) - self.PreviewListWidget.verticalHeader().setVisible(False) - self.PreviewListWidget.setColumnWidth(0, self.labelWidth) + #self.PreviewListWidget.verticalHeader().setVisible(False) self.PreviewListWidget.setColumnWidth( - 1, self.Controller.width() - self.labelWidth) + 0, self.Controller.width()) self.PreviewListWidget.isLive = self.isLive self.PreviewListWidget.setObjectName(u'PreviewListWidget') self.PreviewListWidget.setSelectionBehavior(1) @@ -379,8 +377,7 @@ class SlideController(QtGui.QWidget): """ width = self.parent.ControlSplitter.sizes()[self.split] height = width * self.parent.RenderManager.screen_ratio - self.PreviewListWidget.setColumnWidth(0, self.labelWidth) - self.PreviewListWidget.setColumnWidth(1, width - self.labelWidth) + self.PreviewListWidget.setColumnWidth(0, width) #Sort out image hights (Songs , bibles excluded) if self.serviceItem and not self.serviceItem.is_text(): for framenumber, frame in enumerate(self.serviceItem.get_frames()): @@ -523,20 +520,19 @@ class SlideController(QtGui.QWidget): self.serviceItem = serviceItem self.PreviewListWidget.clear() self.PreviewListWidget.setRowCount(0) - self.PreviewListWidget.setColumnWidth(0, self.labelWidth) - self.PreviewListWidget.setColumnWidth(1, width - self.labelWidth) + self.PreviewListWidget.setColumnWidth(0, width) if self.isLive: self.SongMenu.menu().clear() row = 0 + text = [] for framenumber, frame in enumerate(self.serviceItem.get_frames()): self.PreviewListWidget.setRowCount( self.PreviewListWidget.rowCount() + 1) - rowitem = QtGui.QTableWidgetItem() item = QtGui.QTableWidgetItem() slideHeight = 0 #It is a based Text Render if self.serviceItem.is_text(): - if self.isLive and frame[u'verseTag'] is not None: + if frame[u'verseTag'] is not None: #only load the slot once bits = frame[u'verseTag'].split(u':') tag = None @@ -550,10 +546,11 @@ class SlideController(QtGui.QWidget): tag = bits[0] tag1 = tag row = bits[0][0:1] - if tag1 not in self.slideList: - self.slideList[tag1] = framenumber - self.SongMenu.menu().addAction(self.trUtf8(u'%s'%tag1), - self.onSongBarHandler) + if self.isLive: + if tag1 not in self.slideList: + self.slideList[tag1] = framenumber + self.SongMenu.menu().addAction(self.trUtf8(u'%s'%tag1), + self.onSongBarHandler) else: row += 1 item.setText(frame[u'text']) @@ -565,20 +562,18 @@ class SlideController(QtGui.QWidget): self.parent.RenderManager.height) label.setScaledContents(True) label.setPixmap(QtGui.QPixmap.fromImage(pixmap)) - self.PreviewListWidget.setCellWidget(framenumber, 1, label) + self.PreviewListWidget.setCellWidget(framenumber, 0, label) slideHeight = width * self.parent.RenderManager.screen_ratio row += 1 - rowitem.setText(unicode(row)) - rowitem.setTextAlignment(QtCore.Qt.AlignVCenter) - self.PreviewListWidget.setItem(framenumber, 0, rowitem) - self.PreviewListWidget.setItem(framenumber, 1, item) + text.append(unicode(row)) + self.PreviewListWidget.setItem(framenumber, 0, item) if slideHeight != 0: self.PreviewListWidget.setRowHeight(framenumber, slideHeight) + self.PreviewListWidget.setVerticalHeaderLabels(text) if self.serviceItem.is_text(): self.PreviewListWidget.resizeRowsToContents() - self.PreviewListWidget.setColumnWidth(0, self.labelWidth) - self.PreviewListWidget.setColumnWidth(1, - self.PreviewListWidget.viewport().size().width() - self.labelWidth) + self.PreviewListWidget.setColumnWidth(0, + self.PreviewListWidget.viewport().size().width()) if slideno > self.PreviewListWidget.rowCount(): self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) else: From f78565f241c8c7dea5b726432b36f3d3d285cb2e Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 16 May 2010 16:39:58 +0100 Subject: [PATCH 47/81] Display clean up --- openlp/core/ui/displaytab.py | 94 ++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/openlp/core/ui/displaytab.py b/openlp/core/ui/displaytab.py index 38a0baa91..d3ef9205d 100644 --- a/openlp/core/ui/displaytab.py +++ b/openlp/core/ui/displaytab.py @@ -42,139 +42,139 @@ class DisplayTab(SettingsTab): self.tabTitleVisible = self.trUtf8('Displays') self.layoutWidget = QtGui.QWidget(self) self.layoutWidget.setGeometry(QtCore.QRect(0, 40, 241, 79)) - self.layoutWidget.setObjectName("layoutWidget") + self.layoutWidget.setObjectName(u'layoutWidget') self.verticalLayout = QtGui.QVBoxLayout(self.layoutWidget) - self.verticalLayout.setObjectName("verticalLayout") + self.verticalLayout.setObjectName(u'verticalLayout') self.CurrentGroupBox = QtGui.QGroupBox(self.layoutWidget) - self.CurrentGroupBox.setObjectName("CurrentGroupBox") + self.CurrentGroupBox.setObjectName(u'CurrentGroupBox') self.horizontalLayout = QtGui.QHBoxLayout(self.CurrentGroupBox) - self.horizontalLayout.setObjectName("horizontalLayout") + self.horizontalLayout.setObjectName(u'horizontalLayout') self.verticalLayout_6 = QtGui.QVBoxLayout() - self.verticalLayout_6.setObjectName("verticalLayout_6") + self.verticalLayout_6.setObjectName(u'verticalLayout_6') self.XLabel = QtGui.QLabel(self.CurrentGroupBox) self.XLabel.setAlignment(QtCore.Qt.AlignCenter) - self.XLabel.setObjectName("XLabel") + self.XLabel.setObjectName(u'XLabel') self.verticalLayout_6.addWidget(self.XLabel) self.Xpos = QtGui.QLabel(self.CurrentGroupBox) self.Xpos.setAlignment(QtCore.Qt.AlignCenter) - self.Xpos.setObjectName("Xpos") + self.Xpos.setObjectName(u'Xpos') self.verticalLayout_6.addWidget(self.Xpos) self.horizontalLayout.addLayout(self.verticalLayout_6) self.verticalLayout_7 = QtGui.QVBoxLayout() - self.verticalLayout_7.setObjectName("verticalLayout_7") + self.verticalLayout_7.setObjectName(u'verticalLayout_7') self.YLabel = QtGui.QLabel(self.CurrentGroupBox) self.YLabel.setAlignment(QtCore.Qt.AlignCenter) - self.YLabel.setObjectName("YLabel") + self.YLabel.setObjectName(u'YLabel') self.verticalLayout_7.addWidget(self.YLabel) self.Ypos = QtGui.QLabel(self.CurrentGroupBox) self.Ypos.setAlignment(QtCore.Qt.AlignCenter) - self.Ypos.setObjectName("Ypos") + self.Ypos.setObjectName(u'Ypos') self.verticalLayout_7.addWidget(self.Ypos) self.horizontalLayout.addLayout(self.verticalLayout_7) self.verticalLayout_9 = QtGui.QVBoxLayout() - self.verticalLayout_9.setObjectName("verticalLayout_9") + self.verticalLayout_9.setObjectName(u'verticalLayout_9') self.HeightLabel = QtGui.QLabel(self.CurrentGroupBox) self.HeightLabel.setMaximumSize(QtCore.QSize(100, 16777215)) self.HeightLabel.setAlignment(QtCore.Qt.AlignCenter) - self.HeightLabel.setObjectName("HeightLabel") + self.HeightLabel.setObjectName(u'HeightLabel') self.verticalLayout_9.addWidget(self.HeightLabel) self.Height = QtGui.QLabel(self.CurrentGroupBox) self.Height.setAlignment(QtCore.Qt.AlignCenter) - self.Height.setObjectName("Height") + self.Height.setObjectName(u'Height') self.verticalLayout_9.addWidget(self.Height) self.horizontalLayout.addLayout(self.verticalLayout_9) self.verticalLayout_8 = QtGui.QVBoxLayout() - self.verticalLayout_8.setObjectName("verticalLayout_8") + self.verticalLayout_8.setObjectName(u'verticalLayout_8') self.WidthLabel = QtGui.QLabel(self.CurrentGroupBox) self.WidthLabel.setAlignment(QtCore.Qt.AlignCenter) - self.WidthLabel.setObjectName("WidthLabel") + self.WidthLabel.setObjectName(u'WidthLabel') self.verticalLayout_8.addWidget(self.WidthLabel) self.Width = QtGui.QLabel(self.CurrentGroupBox) self.Width.setAlignment(QtCore.Qt.AlignCenter) - self.Width.setObjectName("Width") + self.Width.setObjectName(u'Width') self.verticalLayout_8.addWidget(self.Width) self.horizontalLayout.addLayout(self.verticalLayout_8) self.verticalLayout.addWidget(self.CurrentGroupBox) self.CurrentGroupBox_2 = QtGui.QGroupBox(self) self.CurrentGroupBox_2.setGeometry(QtCore.QRect(0, 130, 248, 87)) self.CurrentGroupBox_2.setMaximumSize(QtCore.QSize(500, 16777215)) - self.CurrentGroupBox_2.setObjectName("CurrentGroupBox_2") + self.CurrentGroupBox_2.setObjectName(u'CurrentGroupBox_2') self.horizontalLayout_2 = QtGui.QHBoxLayout(self.CurrentGroupBox_2) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") + self.horizontalLayout_2.setObjectName(u'horizontalLayout_2') self.verticalLayout_2 = QtGui.QVBoxLayout() - self.verticalLayout_2.setObjectName("verticalLayout_2") + self.verticalLayout_2.setObjectName(u'verticalLayout_2') self.XAmendLabel = QtGui.QLabel(self.CurrentGroupBox_2) self.XAmendLabel.setAlignment(QtCore.Qt.AlignCenter) - self.XAmendLabel.setObjectName("XAmendLabel") + self.XAmendLabel.setObjectName(u'XAmendLabel') self.verticalLayout_2.addWidget(self.XAmendLabel) self.XposEdit = QtGui.QLineEdit(self.CurrentGroupBox_2) self.XposEdit.setMaximumSize(QtCore.QSize(50, 16777215)) self.XposEdit.setMaxLength(4) - self.XposEdit.setObjectName("XposEdit") + self.XposEdit.setObjectName(u'XposEdit') self.verticalLayout_2.addWidget(self.XposEdit) self.horizontalLayout_2.addLayout(self.verticalLayout_2) self.verticalLayout_3 = QtGui.QVBoxLayout() - self.verticalLayout_3.setObjectName("verticalLayout_3") + self.verticalLayout_3.setObjectName(u'verticalLayout_3') self.YAmendLabel = QtGui.QLabel(self.CurrentGroupBox_2) self.YAmendLabel.setAlignment(QtCore.Qt.AlignCenter) - self.YAmendLabel.setObjectName("YAmendLabel") + self.YAmendLabel.setObjectName(u'YAmendLabel') self.verticalLayout_3.addWidget(self.YAmendLabel) self.YposEdit = QtGui.QLineEdit(self.CurrentGroupBox_2) self.YposEdit.setMaximumSize(QtCore.QSize(50, 16777215)) self.YposEdit.setMaxLength(4) - self.YposEdit.setObjectName("YposEdit") + self.YposEdit.setObjectName(u'YposEdit') self.verticalLayout_3.addWidget(self.YposEdit) self.horizontalLayout_2.addLayout(self.verticalLayout_3) self.verticalLayout_4 = QtGui.QVBoxLayout() - self.verticalLayout_4.setObjectName("verticalLayout_4") + self.verticalLayout_4.setObjectName(u'verticalLayout_4') self.HeightAmendLabel = QtGui.QLabel(self.CurrentGroupBox_2) self.HeightAmendLabel.setAlignment(QtCore.Qt.AlignCenter) - self.HeightAmendLabel.setObjectName("HeightAmendLabel") + self.HeightAmendLabel.setObjectName(u'HeightAmendLabel') self.verticalLayout_4.addWidget(self.HeightAmendLabel) self.HeightEdit = QtGui.QLineEdit(self.CurrentGroupBox_2) self.HeightEdit.setMaximumSize(QtCore.QSize(50, 16777215)) self.HeightEdit.setMaxLength(4) - self.HeightEdit.setObjectName("HeightEdit") + self.HeightEdit.setObjectName(u'HeightEdit') self.verticalLayout_4.addWidget(self.HeightEdit) self.horizontalLayout_2.addLayout(self.verticalLayout_4) self.verticalLayout_5 = QtGui.QVBoxLayout() self.verticalLayout_5.setSizeConstraint(QtGui.QLayout.SetMinimumSize) - self.verticalLayout_5.setObjectName("verticalLayout_5") + self.verticalLayout_5.setObjectName(u'verticalLayout_5') self.WidthAmendLabel = QtGui.QLabel(self.CurrentGroupBox_2) self.WidthAmendLabel.setMaximumSize(QtCore.QSize(100, 16777215)) self.WidthAmendLabel.setAlignment(QtCore.Qt.AlignCenter) - self.WidthAmendLabel.setObjectName("WidthAmendLabel") + self.WidthAmendLabel.setObjectName(u'WidthAmendLabel') self.verticalLayout_5.addWidget(self.WidthAmendLabel) self.WidthEdit = QtGui.QLineEdit(self.CurrentGroupBox_2) self.WidthEdit.setMaximumSize(QtCore.QSize(60, 16777215)) - self.WidthEdit.setObjectName("WidthEdit") + self.WidthEdit.setObjectName(u'WidthEdit') self.verticalLayout_5.addWidget(self.WidthEdit) self.horizontalLayout_2.addLayout(self.verticalLayout_5) self.OverrideCheckBox = QtGui.QCheckBox(self) self.OverrideCheckBox.setGeometry(QtCore.QRect(0, 10, 191, 23)) - self.OverrideCheckBox.setObjectName("OverrideCheckBox") + self.OverrideCheckBox.setObjectName(u'OverrideCheckBox') QtCore.QMetaObject.connectSlotsByName(self) QtCore.QObject.connect(self.OverrideCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onOverrideCheckBoxChanged) def retranslateUi(self): - self.setWindowTitle(QtGui.QApplication.translate("self", "Amend Display Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.CurrentGroupBox.setTitle(QtGui.QApplication.translate("self", "Default Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.XLabel.setText(QtGui.QApplication.translate("self", "X", None, QtGui.QApplication.UnicodeUTF8)) - self.Xpos.setText(QtGui.QApplication.translate("self", "0", None, QtGui.QApplication.UnicodeUTF8)) - self.YLabel.setText(QtGui.QApplication.translate("self", "Y", None, QtGui.QApplication.UnicodeUTF8)) - self.Ypos.setText(QtGui.QApplication.translate("self", "0", None, QtGui.QApplication.UnicodeUTF8)) - self.HeightLabel.setText(QtGui.QApplication.translate("self", "Height", None, QtGui.QApplication.UnicodeUTF8)) - self.Height.setText(QtGui.QApplication.translate("self", "0", None, QtGui.QApplication.UnicodeUTF8)) - self.WidthLabel.setText(QtGui.QApplication.translate("self", "Width", None, QtGui.QApplication.UnicodeUTF8)) - self.Width.setText(QtGui.QApplication.translate("self", "0", None, QtGui.QApplication.UnicodeUTF8)) - self.CurrentGroupBox_2.setTitle(QtGui.QApplication.translate("self", "Amend Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.XAmendLabel.setText(QtGui.QApplication.translate("self", "X", None, QtGui.QApplication.UnicodeUTF8)) - self.YAmendLabel.setText(QtGui.QApplication.translate("self", "Y", None, QtGui.QApplication.UnicodeUTF8)) - self.HeightAmendLabel.setText(QtGui.QApplication.translate("self", "Height", None, QtGui.QApplication.UnicodeUTF8)) - self.WidthAmendLabel.setText(QtGui.QApplication.translate("self", "Width", None, QtGui.QApplication.UnicodeUTF8)) - self.OverrideCheckBox.setText(QtGui.QApplication.translate("self", "Override Output Display", None, QtGui.QApplication.UnicodeUTF8)) + self.setWindowTitle( self.trUtf8(u'Amend Display Settings')) + self.CurrentGroupBox.setTitle( self.trUtf8(u'Default Settings')) + self.XLabel.setText(self.trUtf8(u'X')) + self.Xpos.setText(u'0') + self.YLabel.setText( self.trUtf8(u'Y')) + self.Ypos.setText(u'0') + self.HeightLabel.setText( self.trUtf8(u'Height')) + self.Height.setText(u'0') + self.WidthLabel.setText( self.trUtf8(u'Width')) + self.Width.setText(u'0') + self.CurrentGroupBox_2.setTitle( self.trUtf8(u'Amend Settings')) + self.XAmendLabel.setText( self.trUtf8(u'X')) + self.YAmendLabel.setText( self.trUtf8(u'Y')) + self.HeightAmendLabel.setText( self.trUtf8(u'Height')) + self.WidthAmendLabel.setText( self.trUtf8(u'Width')) + self.OverrideCheckBox.setText( self.trUtf8(u'Override Output Display')) def load(self): settings = QtCore.QSettings() From d86f0285c929d7aa0b4430782e15040cde48bb32 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 17 May 2010 19:39:28 +0100 Subject: [PATCH 48/81] Song Edit tableisation --- openlp/core/ui/mainwindow.py | 7 ++- openlp/core/ui/slidecontroller.py | 1 - openlp/plugins/songs/forms/editsongdialog.py | 8 ++- openlp/plugins/songs/forms/editsongform.py | 51 ++++++++++++++------ 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index cd73c2a9c..92c8fed94 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -1,5 +1,4 @@ # -*- coding: utf-8 -*- -# -*- coding: utf-8 -*- # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 ############################################################################### @@ -332,7 +331,7 @@ class Ui_MainWindow(object): """ MainWindow.mainTitle = translate('MainWindow', 'OpenLP 2.0') MainWindow.language = translate('MainWindow', 'English') - MainWindow.defaultThemeText = translate('MainWindow', + MainWindow.defaultThemeText = translate('MainWindow', 'Default Theme: ') MainWindow.setWindowTitle(MainWindow.mainTitle) self.FileMenu.setTitle(translate('MainWindow', '&File')) @@ -341,7 +340,7 @@ class Ui_MainWindow(object): self.OptionsMenu.setTitle(translate('MainWindow', '&Options')) self.OptionsViewMenu.setTitle(translate('MainWindow', '&View')) self.ViewModeMenu.setTitle(translate('MainWindow', 'M&ode')) - self.OptionsLanguageMenu.setTitle(translate('MainWindow', + self.OptionsLanguageMenu.setTitle(translate('MainWindow', u'&Language')) self.ToolsMenu.setTitle(translate('MainWindow', '&Tools')) self.HelpMenu.setTitle(translate('MainWindow', '&Help')) @@ -526,7 +525,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.SIGNAL(u'triggered()'), self.ServiceManagerContents.onSaveService) #i18n set signals for languages - QtCore.QObject.connect(self.AutoLanguageItem, + QtCore.QObject.connect(self.AutoLanguageItem, QtCore.SIGNAL(u'toggled(bool)'), self.setAutoLanguage) self.LanguageGroup.triggered.connect(LanguageManager.set_language) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index a036c3d9e..e614205fe 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -155,7 +155,6 @@ class SlideController(QtGui.QWidget): self.PreviewListWidget = SlideList(self) self.PreviewListWidget.setColumnCount(1) self.PreviewListWidget.horizontalHeader().setVisible(False) - #self.PreviewListWidget.verticalHeader().setVisible(False) self.PreviewListWidget.setColumnWidth( 0, self.Controller.width()) self.PreviewListWidget.isLive = self.isLive diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index 6d617072d..a6f2f5b56 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -70,8 +70,12 @@ class Ui_EditSongDialog(object): QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) self.LyricsLabel.setObjectName(u'LyricsLabel') self.LyricsTabLayout.addWidget(self.LyricsLabel, 2, 0, 1, 1) - self.VerseListWidget = QtGui.QListWidget(self.LyricsTab) - self.VerseListWidget.setSpacing(2) + self.VerseListWidget = QtGui.QTableWidget(self.LyricsTab) + self.VerseListWidget.setColumnCount(1) + self.VerseListWidget.horizontalHeader().setVisible(False) + self.VerseListWidget.setSelectionBehavior(1) + self.VerseListWidget.setEditTriggers( + QtGui.QAbstractItemView.NoEditTriggers) self.VerseListWidget.setAlternatingRowColors(True) self.VerseListWidget.setObjectName(u'VerseListWidget') self.LyricsTabLayout.addWidget(self.VerseListWidget, 2, 1, 1, 1) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 4c3f78e2f..acae55b74 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -77,7 +77,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): QtCore.QObject.connect(self.VerseDeleteButton, QtCore.SIGNAL(u'clicked()'), self.onVerseDeleteButtonClicked) QtCore.QObject.connect(self.VerseListWidget, - QtCore.SIGNAL(u'itemClicked(QListWidgetItem*)'), + QtCore.SIGNAL(u'itemClicked(QTableWidgetItem*)'), self.onVerseListViewPressed) QtCore.QObject.connect(self.SongbookCombo, QtCore.SIGNAL(u'activated(int)'), self.onSongBookComboChanged) @@ -182,6 +182,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.CommentsEdit.setText(u'') self.CCLNumberEdit.setText(u'') self.VerseListWidget.clear() + self.VerseListWidget.serRowCount(0) self.AuthorsListView.clear() self.TopicsListView.clear() self.TitleEditItem.setFocus(QtCore.Qt.OtherFocusReason) @@ -223,6 +224,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): else: self.CopyrightEditItem.setText(u'') self.VerseListWidget.clear() + self.VerseListWidget.setRowCount(0) if self.song.verse_order: self.VerseOrderEdit.setText(self.song.verse_order) else: @@ -236,21 +238,34 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): else: self.CCLNumberEdit.setText(u'') #lazy xml migration for now + self.VerseListWidget.clear() + self.VerseListWidget.setRowCount(0) + #can this be automated? + self.VerseListWidget.setColumnWidth(0, 400) + rowLabel = [] if self.song.lyrics.startswith(u' 1: @@ -343,7 +359,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): item = QtGui.QListWidgetItem(afterText) item.setData(QtCore.Qt.UserRole, QtCore.QVariant(data)) item.setText(afterText) - self.VerseListWidget.addItem(item) + self.VerseListWidget.setRowCount( + self.VerseListWidget.rowCount() + 1) + self.VerseListWidget.setItem(count, 0, item) def onVerseEditButtonClicked(self): item = self.VerseListWidget.currentItem() @@ -351,7 +369,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): tempText = item.text() verseId = unicode((item.data(QtCore.Qt.UserRole)).toString()) self.verse_form.setVerse( - tempText, self.VerseListWidget.count(), True, verseId) + tempText, self.VerseListWidget.rowCount(), True, verseId) if self.verse_form.exec_(): afterText, verse, subVerse = self.verse_form.getVerse() data = u'%s:%s' % (verse, subVerse) @@ -376,9 +394,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): def onVerseEditAllButtonClicked(self): verse_list = u'' - if self.VerseListWidget.count() > 0: - for row in range(0, self.VerseListWidget.count()): - item = self.VerseListWidget.item(row) + if self.VerseListWidget.rowCount() > 0: + for row in range(0, self.VerseListWidget.rowCount()): + item = self.VerseListWidget.item(row, 0) field = unicode((item.data(QtCore.Qt.UserRole)).toString()) verse_list += u'---[%s]---\n' % field verse_list += item.text() @@ -390,6 +408,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): verse_list = self.verse_form.getVerseAll() verse_list = unicode(verse_list.replace(u'\r\n', u'\n')) self.VerseListWidget.clear() + listRow = 0 for row in self.findVerseSplit.split(verse_list): for match in row.split(u'---['): for count, parts in enumerate(match.split(u']---\n')): @@ -403,11 +422,13 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): parts = parts.rstrip(u'\n') item = QtGui.QListWidgetItem(parts) item.setData(QtCore.Qt.UserRole, QtCore.QVariant(variant)) - self.VerseListWidget.addItem(item) + self.VerseListWidget.setItem(listRow, 0, item) self.VerseListWidget.repaint() def onVerseDeleteButtonClicked(self): - self.VerseListWidget.takeItem(self.VerseListWidget.currentRow()) + self.VerseListWidget.takeItem(self.VerseListWidget.currentRow(), 0) + self.VerseListWidget.setRowCount( + self.VerseListWidget.rowCount() - 1) self.VerseEditButton.setEnabled(False) self.VerseDeleteButton.setEnabled(False) @@ -422,7 +443,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.SongTabWidget.setCurrentIndex(0) self.TitleEditItem.setFocus() return False, self.trUtf8('You need to enter a song title.') - if self.VerseListWidget.count() == 0: + if self.VerseListWidget.rowCount() == 0: self.SongTabWidget.setCurrentIndex(0) self.VerseListWidget.setFocus() return False, self.trUtf8('You need to enter some verses.') @@ -521,7 +542,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): sxml.new_document() sxml.add_lyrics_to_song() text = u' ' - for i in range (0, self.VerseListWidget.count()): + for i in range (0, self.VerseListWidget.rowCount()): item = self.VerseListWidget.item(i) verseId = unicode((item.data(QtCore.Qt.UserRole)).toString()) bits = verseId.split(u':') From 0dfda8ff2791c7303c62b682d588f2919bfabde4 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 18 May 2010 20:29:40 +0100 Subject: [PATCH 49/81] Finish tagging the songs --- openlp/plugins/songs/forms/editsongform.py | 79 ++++++++++++++-------- 1 file changed, 52 insertions(+), 27 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index acae55b74..499d86571 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -47,6 +47,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): """ QtGui.QDialog.__init__(self, parent) self.parent = parent + #can this be automated? + self.width = 400 self.setupUi(self) # Connecting signals and slots QtCore.QObject.connect(self.AuthorAddButton, @@ -182,7 +184,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.CommentsEdit.setText(u'') self.CCLNumberEdit.setText(u'') self.VerseListWidget.clear() - self.VerseListWidget.serRowCount(0) + self.VerseListWidget.setRowCount(0) self.AuthorsListView.clear() self.TopicsListView.clear() self.TitleEditItem.setFocus(QtCore.Qt.OtherFocusReason) @@ -240,9 +242,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): #lazy xml migration for now self.VerseListWidget.clear() self.VerseListWidget.setRowCount(0) - #can this be automated? - self.VerseListWidget.setColumnWidth(0, 400) - rowLabel = [] + self.VerseListWidget.setColumnWidth(0, self.width) if self.song.lyrics.startswith(u' -1: @@ -294,7 +306,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): author_item = QtGui.QListWidgetItem(unicode(author.display_name)) author_item.setData(QtCore.Qt.UserRole, QtCore.QVariant(author.id)) self.AuthorsListView.addItem(author_item) - self.VerseListWidget.resizeRowsToContents() def onAuthorsListViewPressed(self): if self.AuthorsListView.count() > 1: @@ -352,16 +363,19 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.VerseDeleteButton.setEnabled(True) def onVerseAddButtonClicked(self): - self.verse_form.setVerse(u'', self.VerseListWidget.count() + 1, True) + self.verse_form.setVerse(u'', self.VerseListWidget.rowCount() + 1, True) if self.verse_form.exec_(): afterText, verse, subVerse = self.verse_form.getVerse() data = u'%s:%s' % (verse, subVerse) - item = QtGui.QListWidgetItem(afterText) + item = QtGui.QTableWidgetItem(afterText) item.setData(QtCore.Qt.UserRole, QtCore.QVariant(data)) item.setText(afterText) self.VerseListWidget.setRowCount( self.VerseListWidget.rowCount() + 1) - self.VerseListWidget.setItem(count, 0, item) + self.VerseListWidget.setItem(int(self.VerseListWidget.rowCount() - 1), 0, item) + self.VerseListWidget.setColumnWidth(0, self.width) + self.VerseListWidget.resizeRowsToContents() + self.tagRows() def onVerseEditButtonClicked(self): item = self.VerseListWidget.currentItem() @@ -379,18 +393,20 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): if len(tempText.split(u'\n')) != len(afterText.split(u'\n')): tempList = {} tempId = {} - for row in range(0, self.VerseListWidget.count()): - tempList[row] = self.VerseListWidget.item(row).text() - tempId[row] = self.VerseListWidget.item(row).\ + for row in range(0, self.VerseListWidget.rowCount()): + tempList[row] = self.VerseListWidget.item(row, 0).text() + tempId[row] = self.VerseListWidget.item(row, 0).\ data(QtCore.Qt.UserRole) self.VerseListWidget.clear() for row in range (0, len(tempList)): - item = QtGui.QListWidgetItem(tempList[row]) + item = QtGui.QTableWidgetItem(tempList[row], 0) item.setData(QtCore.Qt.UserRole, tempId[row]) - self.VerseListWidget.addItem(item) + self.VerseListWidget.setItem(row, 0, item) + self.VerseListWidget.resizeRowsToContents() self.VerseListWidget.repaint() self.VerseEditButton.setEnabled(False) self.VerseDeleteButton.setEnabled(False) + self.tagRows() def onVerseEditAllButtonClicked(self): verse_list = u'' @@ -408,7 +424,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): verse_list = self.verse_form.getVerseAll() verse_list = unicode(verse_list.replace(u'\r\n', u'\n')) self.VerseListWidget.clear() - listRow = 0 + self.VerseListWidget.setRowCount(0) for row in self.findVerseSplit.split(verse_list): for match in row.split(u'---['): for count, parts in enumerate(match.split(u']---\n')): @@ -420,15 +436,20 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): else: if parts.endswith(u'\n'): parts = parts.rstrip(u'\n') - item = QtGui.QListWidgetItem(parts) - item.setData(QtCore.Qt.UserRole, QtCore.QVariant(variant)) - self.VerseListWidget.setItem(listRow, 0, item) - self.VerseListWidget.repaint() + item = QtGui.QTableWidgetItem(parts) + item.setData( + QtCore.Qt.UserRole, QtCore.QVariant(variant)) + self.VerseListWidget.setRowCount( + self.VerseListWidget.rowCount() + 1) + self.VerseListWidget.setItem( + int(self.VerseListWidget.rowCount() - 1), 0, item) + self.VerseListWidget.setColumnWidth(0, self.width) + self.VerseListWidget.resizeRowsToContents() + self.VerseListWidget.repaint() + self.tagRows() def onVerseDeleteButtonClicked(self): - self.VerseListWidget.takeItem(self.VerseListWidget.currentRow(), 0) - self.VerseListWidget.setRowCount( - self.VerseListWidget.rowCount() - 1) + self.VerseListWidget.removeRow(self.VerseListWidget.currentRow()) self.VerseEditButton.setEnabled(False) self.VerseDeleteButton.setEnabled(False) @@ -448,7 +469,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.VerseListWidget.setFocus() return False, self.trUtf8('You need to enter some verses.') if self.AuthorsListView.count() == 0: - self.SongTabWidget.setCurrentIndex(2) + self.SongTabWidget.setCurrentIndex(1) self.AuthorsListView.setFocus() #split the verse list by space and mark lower case for testing taglist = unicode(self.trUtf8(' bitped')) @@ -501,6 +522,10 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.loadTopics() def onPreview(self, button): + """ + Save and Preview button pressed. + The Song is valid so as the plugin to add it to preview to see. + """ log.debug(u'onPreview') if button.text() == unicode(self.trUtf8('Save && Preview')) \ and self.saveSong(): @@ -543,11 +568,11 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): sxml.add_lyrics_to_song() text = u' ' for i in range (0, self.VerseListWidget.rowCount()): - item = self.VerseListWidget.item(i) + item = self.VerseListWidget.item(i, 0) verseId = unicode((item.data(QtCore.Qt.UserRole)).toString()) bits = verseId.split(u':') sxml.add_verse_to_lyrics(bits[0], bits[1], unicode(item.text())) - text = text + unicode(self.VerseListWidget.item(i).text()) + u' ' + text = text + unicode(self.VerseListWidget.item(i, 0).text()) + u' ' text = text.replace(u'\'', u'') text = text.replace(u',', u'') text = text.replace(u';', u'') From 304aed1c1e85d42b7b5b62fda33c5cfcbb28b5b5 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 18 May 2010 23:18:52 +0200 Subject: [PATCH 50/81] Fixed up problems with adding and removing songs from the service manager. --- openlp/plugins/songs/lib/mediaitem.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 1c2dad169..0a2d29b14 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -52,7 +52,7 @@ class SongMediaItem(MediaManagerItem): MediaManagerItem.__init__(self, parent, icon, title) self.edit_song_form = EditSongForm(self, self.parent.manager) self.singleServiceItem = False - #self.edit_song_form = EditSongForm(self.parent.songmanager, self) + #self.edit_song_form = EditSongForm(self.parent.manager, self) self.song_maintenance_form = SongMaintenanceForm( self.parent.manager, self) # Holds information about whether the edit is remotly triggered and @@ -293,7 +293,7 @@ class SongMediaItem(MediaManagerItem): return for item in items: item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.parent.songmanager.delete_song(item_id) + self.parent.manager.delete_song(item_id) self.onSearchTextButtonClick() def generateSlideData(self, service_item, item=None): @@ -314,7 +314,7 @@ class SongMediaItem(MediaManagerItem): service_item.add_capability(ItemCapabilities.AllowsEdit) service_item.add_capability(ItemCapabilities.AllowsPreview) service_item.add_capability(ItemCapabilities.AllowsLoop) - song = self.parent.songmanager.get_song(item_id) + song = self.parent.manager.get_song(item_id) service_item.theme = song.theme_name service_item.editId = item_id if song.lyrics.startswith(u' Date: Tue, 18 May 2010 23:32:58 +0200 Subject: [PATCH 51/81] Some other minor touchups. --- openlp/plugins/songs/songsplugin.py | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 2b3d66d8e..ef0aa0949 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -30,10 +30,10 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, build_icon, PluginStatus, Receiver from openlp.plugins.songs.lib import SongManager, SongMediaItem, SongsTab, \ SofImport, OooImport -from openlp.plugins.songs.forms import ImportWizardForm log = logging.getLogger(__name__) + class SongsPlugin(Plugin): """ This is the number 1 plugin, if importance were placed on any @@ -115,11 +115,14 @@ class SongsPlugin(Plugin): self.ImportOooItem = QtGui.QAction(import_menu) self.ImportOooItem.setObjectName(u'ImportOooItem') self.ImportOooItem.setText( - import_menu.trUtf8('Generic Document/Presentation Import (temp menu item)')) + import_menu.trUtf8('Generic Document/Presentation Import ' + '(temp menu item)')) self.ImportOooItem.setToolTip( - import_menu.trUtf8('Import songs from Word/Writer/Powerpoint/Impress')) + import_menu.trUtf8('Import songs from ' + 'Word/Writer/Powerpoint/Impress')) self.ImportOooItem.setStatusTip( - import_menu.trUtf8('Import songs from Word/Writer/Powerpoint/Impress')) + import_menu.trUtf8('Import songs from ' + 'Word/Writer/Powerpoint/Impress')) import_menu.addAction(self.ImportOooItem) # Signals and slots QtCore.QObject.connect(self.SongImportItem, @@ -151,16 +154,16 @@ class SongsPlugin(Plugin): u'', u'Songs of Fellowship file (*.rtf *.RTF)') try: for filename in filenames: - sofimport = SofImport(self.songmanager) + sofimport = SofImport(self.manager) sofimport.import_sof(unicode(filename)) except: log.exception('Could not import SoF file') QtGui.QMessageBox.critical(None, self.ImportSongMenu.trUtf8('Import Error'), self.ImportSongMenu.trUtf8('Error importing Songs of ' - + 'Fellowship file.\nOpenOffice.org must be installed' - + ' and you must be using an unedited copy of the RTF' - + ' included with the Songs of Fellowship Music Editions'), + 'Fellowship file.\nOpenOffice.org must be installed' + ' and you must be using an unedited copy of the RTF' + ' included with the Songs of Fellowship Music Editions'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok), QtGui.QMessageBox.Ok) Receiver.send_message(u'songs_load_list') @@ -169,13 +172,13 @@ class SongsPlugin(Plugin): filenames = QtGui.QFileDialog.getOpenFileNames( None, self.trUtf8('Open documents or presentations'), u'', u'All Files(*.*)') - oooimport = OooImport(self.songmanager) + oooimport = OooImport(self.manager) oooimport.import_docs(filenames) Receiver.send_message(u'songs_load_list') def about(self): - about_text = self.trUtf8('Song Plugin
    This plugin allows ' - 'Songs to be managed and displayed.') + about_text = self.trUtf8('Song Plugin
    ' + 'This plugin allows songs to be managed and displayed.') return about_text def can_delete_theme(self, theme): @@ -183,4 +186,3 @@ class SongsPlugin(Plugin): return True return False - From cd8f59c7d0e76ff7675ba57c8224a3bd93fdc33b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 20 May 2010 17:40:56 +0100 Subject: [PATCH 52/81] Remove extra blank line --- openlp/plugins/songs/forms/editsongform.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 499d86571..3d43e5766 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -296,7 +296,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): rowLabel.append(rowTag) self.VerseListWidget.setVerticalHeaderLabels(rowLabel) - def onAuthorAddButtonClicked(self): item = int(self.AuthorsSelectionComboItem.currentIndex()) if item > -1: From c8b6a3640d9de90ca1001e63234220c95e491240 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Thu, 20 May 2010 17:49:47 +0100 Subject: [PATCH 53/81] Import fixes --- openlp/plugins/songs/forms/songimportform.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index 3049ed6c5..ff6b416c6 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -23,10 +23,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -import csv import logging -import os -import os.path from PyQt4 import QtCore, QtGui From f7987501b94f9b93d24faa3c5833d833c4773023 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 23 May 2010 08:03:28 +0100 Subject: [PATCH 54/81] Stop memory growth, improve verse display --- openlp/core/ui/servicemanager.py | 6 +++++- openlp/core/ui/slidecontroller.py | 16 +++++++++------- openlp/plugins/songs/lib/mediaitem.py | 4 +++- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index c5fa0b73c..df127c85c 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -711,6 +711,10 @@ class ServiceManager(QtGui.QWidget): self.regenerateServiceItems() def regenerateServiceItems(self): + """ + Rebuild the service list as things have changed and a + repaint is the easiest way to do this. + """ #force reset of renderer as theme data has changed self.parent.RenderManager.themedata = None if self.serviceItems: @@ -963,4 +967,4 @@ class ServiceManager(QtGui.QWidget): data_item[u'notes'] = unicode(service_item.notes) data_item[u'selected'] = (item == curitem) data.append(data_item) - Receiver.send_message(u'servicemanager_list_response', data) \ No newline at end of file + Receiver.send_message(u'servicemanager_list_response', data) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index e614205fe..a2bd68e13 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -516,6 +516,9 @@ class SlideController(QtGui.QWidget): #Set pointing cursor when we have somthing to point at self.PreviewListWidget.setCursor(QtCore.Qt.PointingHandCursor) before = time.time() + #Clear the old serviceItem cache to release memory + if self.serviceItem: + self.serviceItem.cache = [] self.serviceItem = serviceItem self.PreviewListWidget.clear() self.PreviewListWidget.setRowCount(0) @@ -531,8 +534,7 @@ class SlideController(QtGui.QWidget): slideHeight = 0 #It is a based Text Render if self.serviceItem.is_text(): - if frame[u'verseTag'] is not None: - #only load the slot once + if frame[u'verseTag']: bits = frame[u'verseTag'].split(u':') tag = None #If verse handle verse number else tag only @@ -545,13 +547,13 @@ class SlideController(QtGui.QWidget): tag = bits[0] tag1 = tag row = bits[0][0:1] - if self.isLive: - if tag1 not in self.slideList: - self.slideList[tag1] = framenumber - self.SongMenu.menu().addAction(self.trUtf8(u'%s'%tag1), - self.onSongBarHandler) else: row += 1 + if self.isLive and frame[u'verseTag'] is not None: + if tag1 not in self.slideList: + self.slideList[tag1] = framenumber + self.SongMenu.menu().addAction(self.trUtf8(u'%s'%tag1), + self.onSongBarHandler) item.setText(frame[u'text']) else: label = QtGui.QLabel() diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 0a2d29b14..2bf72e9b9 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -323,7 +323,9 @@ class SongMediaItem(MediaManagerItem): #no verse list or only 1 space (in error) if not song.verse_order or not song.verse_order.strip(): for verse in verseList: - service_item.add_from_text(verse[1][:30], unicode(verse[1])) + verseTag = u'%s:%s' % (verse[0][u'type'], verse[0][u'label']) + service_item.add_from_text(\ + verse[1][:30], unicode(verse[1]), verseTag) else: #Loop through the verse list and expand the song accordingly. for order in song.verse_order.upper().split(u' '): From 98cc2d93ecc53520267c93b6654d07d529df6185 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 23 May 2010 17:49:34 +0200 Subject: [PATCH 55/81] Windows-related fixes: - Update Windows installer file to get version automatically. - Update version file (for Windows) - Update OpenLP.spec for PyInstaller/Windows build. --- OpenLP.spec | 2 +- openlp/.version | 2 +- resources/innosetup/OpenLP-2.0.iss | 63 +++++++++++++++++------------ resources/innosetup/OpenLP.reg | Bin 0 -> 1670 bytes scripts/openlp-1to2-converter.py | 2 +- 5 files changed, 40 insertions(+), 29 deletions(-) create mode 100644 resources/innosetup/OpenLP.reg diff --git a/OpenLP.spec b/OpenLP.spec index 366bdf31d..e4436dea2 100644 --- a/OpenLP.spec +++ b/OpenLP.spec @@ -1,6 +1,6 @@ # -*- mode: python -*- a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'openlp.pyw'], - pathex=['c:\\Documents and Settings\\raoul\\My Documents\\My Projects\\openlp\\pyinstaller']) + pathex=['C:\\Documents and Settings\\raoul\\My Documents\\My Projects\\openlp\\trunk']) pyz = PYZ(a.pure) exe = EXE(pyz, a.scripts, diff --git a/openlp/.version b/openlp/.version index f8e233b27..2007f03af 100644 --- a/openlp/.version +++ b/openlp/.version @@ -1 +1 @@ -1.9.0 +1.9.1-bzr821 diff --git a/resources/innosetup/OpenLP-2.0.iss b/resources/innosetup/OpenLP-2.0.iss index b826fa76f..e75f1076f 100644 --- a/resources/innosetup/OpenLP-2.0.iss +++ b/resources/innosetup/OpenLP-2.0.iss @@ -1,28 +1,33 @@ ; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! -#define MyAppName "OpenLP" -#define MyAppVerName "OpenLP 2.0" -#define MyAppPublisher "OpenLP Developers" -#define MyAppURL "http://openlp.org/" -#define MyAppExeName "OpenLP.exe" +#define AppName "OpenLP" +#define AppVerName "OpenLP 2.0" +#define AppPublisher "OpenLP Developers" +#define AppURL "http://openlp.org/" +#define AppExeName "OpenLP.exe" + +#define FileHandle FileOpen("..\..\dist\OpenLP\.version") +#define FileLine FileRead(FileHandle) +#define RealVersion FileLine +#expr FileClose(FileHandle) [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{AA7699FA-B2D2-43F4-8A70-D497D03C9485} -AppName={#MyAppName} -AppVerName={#MyAppVerName} -AppPublisher={#MyAppPublisher} -AppPublisherURL={#MyAppURL} -AppSupportURL={#MyAppURL} -AppUpdatesURL={#MyAppURL} -DefaultDirName={pf}\{#MyAppName} -DefaultGroupName=OpenLP 2.0 +AppName={#AppName} +AppVerName={#AppVerName} +AppPublisher={#AppPublisher} +AppPublisherURL={#AppURL} +AppSupportURL={#AppURL} +AppUpdatesURL={#AppURL} +DefaultDirName={pf}\{#AppName} +DefaultGroupName={#AppVerName} AllowNoIcons=true LicenseFile=LICENSE.txt -OutputBaseFilename=OpenLP-1.9.0-bzr739-setup +OutputBaseFilename=OpenLP-{#RealVersion}-setup Compression=lzma SolidCompression=true SetupIconFile=C:\Program Files\Inno Setup 5\Examples\Setup.ico @@ -57,20 +62,26 @@ Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:Ad Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons} [Files] -Source: ..\..\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion -Source: ..\..\dist\OpenLP\plugins\*; DestDir: {app}\plugins; Flags: ignoreversion recursesubdirs createallsubdirs -Source: ..\..\dist\OpenLP\Microsoft.VC90.CRT\*; DestDir: {app}\Microsoft.VC90.CRT; Flags: ignoreversion recursesubdirs createallsubdirs -Source: ..\..\dist\OpenLP\qt4_plugins\*; DestDir: {app}\qt4_plugins; Flags: ignoreversion recursesubdirs createallsubdirs -Source: ..\..\dist\OpenLP\eggs\*; DestDir: {app}\eggs; Flags: ignoreversion recursesubdirs createallsubdirs -Source: openlp.conf; DestDir: {userappdata}\openlp; Flags: ignoreversion onlyifdoesntexist +Source: ..\..\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] -Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName} -Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL} -Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe} -Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon -Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: quicklaunchicon +Name: {group}\{#AppName}; Filename: {app}\{#AppExeName} +Name: {group}\{cm:ProgramOnTheWeb,{#AppName}}; Filename: {#AppURL} +Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe} +Name: {commondesktop}\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: desktopicon +Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: quicklaunchicon [Run] -Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent +Filename: {app}\{#AppExeName}; Description: {cm:LaunchProgram,{#AppName}}; Flags: nowait postinstall skipifsilent + +[Registry] +Root: HKCU; SubKey: Software\OpenLP\OpenLP\alerts; ValueType: dword; ValueName: status; ValueData: $00000001 +Root: HKCU; SubKey: Software\OpenLP\OpenLP\bibles; ValueType: dword; ValueName: status; ValueData: $00000001 +Root: HKCU; SubKey: Software\OpenLP\OpenLP\custom; ValueType: dword; ValueName: status; ValueData: $00000001 +Root: HKCU; SubKey: Software\OpenLP\OpenLP\images; ValueType: dword; ValueName: status; ValueData: $00000001 +Root: HKCU; SubKey: Software\OpenLP\OpenLP\media; ValueType: dword; ValueName: status; ValueData: $00000001 +Root: HKCU; SubKey: Software\OpenLP\OpenLP\presentations; ValueType: dword; ValueName: status; ValueData: $00000001 +Root: HKCU; SubKey: Software\OpenLP\OpenLP\remotes; ValueType: dword; ValueName: status; ValueData: $00000001 +Root: HKCU; SubKey: Software\OpenLP\OpenLP\songs; ValueType: dword; ValueName: status; ValueData: $00000001 +Root: HKCU; SubKey: Software\OpenLP\OpenLP\songusage; ValueType: dword; ValueName: status; ValueData: $00000001 diff --git a/resources/innosetup/OpenLP.reg b/resources/innosetup/OpenLP.reg new file mode 100644 index 0000000000000000000000000000000000000000..503e718a201e3cfc34aad41d9a43f173fa11776d GIT binary patch literal 1670 zcmd6n-D<)>5QV?%g6|+cfY^)P2)!zTV5yR7MNE;XsRT?SW=rVH*Pfl|3lx=Q3A<;8 z3}?>#oPOtI6l^J}sb~|CvXiaCapXsqfxMYeDct5m{-eB^a3TCem!3|G2m6)`8R?$| zD_)o>UL^F!RCva_-Vw3xk}t)qNfa%WWz0c$!7CF!uNv)sv14VkH+`HGYO?5z8|EFeR?XJNFFbA=Q^)sM9-MBOI3=2iG{BnXV&$hZ2~M?x q&2?on?ZnTWH%559=l4&p&T~OlxDvBM-4~v27iNC1HS_V`jrRxQr4Dca literal 0 HcmV?d00001 diff --git a/scripts/openlp-1to2-converter.py b/scripts/openlp-1to2-converter.py index 8645fc2a4..f0c5a0975 100755 --- a/scripts/openlp-1to2-converter.py +++ b/scripts/openlp-1to2-converter.py @@ -97,7 +97,7 @@ create_statements = [ ] def prepare_string(dirty): - return dirty_chars.sub(u'', dirty.replace(u'\r\n', ' ').replace(u'\n', ' ')) + return dirty_chars.sub(u'', dirty.replace(u'\r\n', u' ').replace(u'\n', u' ')) def display_sql(sql, params): prepared_params = [] From 4351ae5ecbe40b0235527dfb75da0b7650af6ffd Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 24 May 2010 22:46:45 +0200 Subject: [PATCH 56/81] Added a build script. --- OpenLP.spec | 2 +- resources/pyinstaller/windows-copy-plugins.py | 130 ++++++++++++++++++ 2 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 resources/pyinstaller/windows-copy-plugins.py diff --git a/OpenLP.spec b/OpenLP.spec index e4436dea2..9569af6c1 100644 --- a/OpenLP.spec +++ b/OpenLP.spec @@ -1,6 +1,6 @@ # -*- mode: python -*- a = Analysis([os.path.join(HOMEPATH,'support\\_mountzlib.py'), os.path.join(HOMEPATH,'support\\useUnicode.py'), 'openlp.pyw'], - pathex=['C:\\Documents and Settings\\raoul\\My Documents\\My Projects\\openlp\\trunk']) + pathex=[os.path.abspath('.')]) pyz = PYZ(a.pure) exe = EXE(pyz, a.scripts, diff --git a/resources/pyinstaller/windows-copy-plugins.py b/resources/pyinstaller/windows-copy-plugins.py new file mode 100644 index 000000000..42592768a --- /dev/null +++ b/resources/pyinstaller/windows-copy-plugins.py @@ -0,0 +1,130 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # +# Thompson, Jon Tibble, Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### + +""" +Windows Build Script +-------------------- + +This script is used to build the Windows binary and the accompanying installer. + +For this script to work out of the box, it depends on being inside the +"resources/pyinstaller" directory in the OpenLP source tree, it depends on +OpenLP having it's own project directory which all the branches live in, and it +depends on PyInstaller being +""" + +import os +from shutil import copy +from subprocess import Popen, PIPE + +script_path = os.path.split(os.path.abspath(__file__))[0] +pyinstaller_path = os.path.abspath(os.path.join(script_path, u'..', u'..', u'..', u'..', u'pyinstaller')) +innosetup_path = os.path.join(os.getenv(u'PROGRAMFILES'), 'Inno Setup 5') +iss_path = os.path.abspath(os.path.join(script_path, u'..', u'innosetup')) +branch_path = os.path.abspath(os.path.join(script_path, u'..', u'..')) +source_path = os.path.join(branch_path, u'openlp') +dist_path = os.path.join(branch_path, u'dist', u'OpenLP') + + +def run_pyinstaller(): + print u'Running PyInstaller...' + os.chdir(branch_path) + pyinstaller = Popen((u'python', os.path.join(pyinstaller_path, u'Build.py'), + u'OpenLP.spec')) + code = pyinstaller.wait() + if code != 0: + raise Exception(u'Error running PyInstaller Build.py') + +def write_version_file(): + print u'Writing version file...' + os.chdir(branch_path) + bzr = Popen((u'bzr', u'tags', u'--sort', u'time'), stdout=PIPE) + output, error = bzr.communicate() + code = bzr.wait() + if code != 0: + raise Exception(u'Error running bzr tags') + lines = output.splitlines() + if len(lines) == 0: + tag = u'0.0.0' + revision = u'0' + else: + tag, revision = lines[-1].split() + bzr = Popen((u'bzr', u'log', u'--line', u'-r', u'-1'), stdout=PIPE) + output, error = bzr.communicate() + code = bzr.wait() + if code != 0: + raise Exception(u'Error running bzr log') + latest = output.split(u':')[0] + versionstring = latest == revision and tag or u'%s-bzr%s' % (tag, latest) + f = open(os.path.join(dist_path, u'.version'), u'w') + f.write(versionstring) + f.close() + +def copy_plugins(): + print u'Copying plugins...' + source = os.path.join(source_path, u'plugins') + dest = os.path.join(dist_path, u'plugins') + for root, dirs, files in os.walk(source): + for filename in files: + if not filename.endswith(u'.pyc'): + dest_path = os.path.join(dest, root[len(source)+1:]) + if not os.path.exists(dest_path): + os.makedirs(dest_path) + copy(os.path.join(root, filename), + os.path.join(dest_path, filename)) + +def copy_windows_files(): + print u'Copying extra files for Windows...' + copy(os.path.join(iss_path, u'OpenLP.ico'), os.path.join(dist_path, u'OpenLP.ico')) + copy(os.path.join(iss_path, u'LICENSE.txt'), os.path.join(dist_path, u'LICENSE.txt')) + +def run_innosetup(): + print u'Running Inno Setup...' + os.chdir(iss_path) + run_command = u'"%s" "%s"' % (os.path.join(innosetup_path, u'ISCC.exe'), + os.path.join(iss_path, u'OpenLP-2.0.iss')) + print run_command + innosetup = Popen(run_command) + code = innosetup.wait() + if code != 0: + raise Exception(u'Error running Inno Setup') + +def main(): + print "Script path:", script_path + print "PyInstaller path:", pyinstaller_path + print "Inno Setup path:", innosetup_path + print "ISS file path:", iss_path + print "Branch path:", branch_path + print "Source path:", source_path + print "\"dist\" path:", dist_path + run_pyinstaller() + write_version_file() + copy_plugins() + copy_windows_files() + run_innosetup() + print "Done." + +if __name__ == u'__main__': + main() From cd00c192b459fd111497addc4a4e930624bdcca9 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 24 May 2010 22:53:56 +0200 Subject: [PATCH 57/81] Rename builder script to a better name. --- .../pyinstaller/{windows-copy-plugins.py => windows-builder.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename resources/pyinstaller/{windows-copy-plugins.py => windows-builder.py} (100%) diff --git a/resources/pyinstaller/windows-copy-plugins.py b/resources/pyinstaller/windows-builder.py similarity index 100% rename from resources/pyinstaller/windows-copy-plugins.py rename to resources/pyinstaller/windows-builder.py From 122756eca589ef700f54b5337805d9550ad9f805 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Mon, 24 May 2010 23:37:20 +0100 Subject: [PATCH 58/81] Fix indentations --- .bzrignore | 1 + openlp/core/lib/serviceitem.py | 12 ++++----- openlp/core/theme/theme.py | 13 +++++---- openlp/core/ui/servicemanager.py | 27 ++++++++++--------- openlp/core/ui/slidecontroller.py | 5 ++-- .../presentations/lib/impresscontroller.py | 8 +++--- .../presentations/lib/pptviewcontroller.py | 2 +- .../lib/presentationcontroller.py | 2 +- 8 files changed, 38 insertions(+), 32 deletions(-) diff --git a/.bzrignore b/.bzrignore index 2314d48c5..5d27a95a4 100644 --- a/.bzrignore +++ b/.bzrignore @@ -15,3 +15,4 @@ OpenLP.egg-info build resources/innosetup/Output _eric4project +.pylint.d diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index a25205c82..841e91839 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -43,12 +43,12 @@ class ServiceItemType(object): Command = 3 class ItemCapabilities(object): - AllowsPreview = 1 - AllowsEdit = 2 - AllowsMaintain = 3 - RequiresMedia = 4 - AllowsLoop = 5 - AllowsAdditions = 6 + AllowsPreview = 1 + AllowsEdit = 2 + AllowsMaintain = 3 + RequiresMedia = 4 + AllowsLoop = 5 + AllowsAdditions = 6 class ServiceItem(object): """ diff --git a/openlp/core/theme/theme.py b/openlp/core/theme/theme.py index b01126564..b34510fb7 100644 --- a/openlp/core/theme/theme.py +++ b/openlp/core/theme/theme.py @@ -136,12 +136,15 @@ class Theme(object): except ValueError: val = t if (element.tag.find(u'Color') > 0 or - (element.tag.find(u'BackgroundParameter') == 0 and type(val) == type(0))): + (element.tag.find(u'BackgroundParameter') == 0 and + type(val) == type(0))): # convert to a wx.Colour - if not delphiColorChange: - val = QtGui.QColor(val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF) - else: - val = QtGui.QColor((val>>16)&0xFF, (val>>8)&0xFF, val&0xFF) + if not delphiColorChange: + val = QtGui.QColor( + val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF) + else: + val = QtGui.QColor( + (val>>16)&0xFF, (val>>8)&0xFF, val&0xFF) setattr(self, element.tag, val) def __str__(self): diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index df127c85c..548d04357 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -810,8 +810,8 @@ class ServiceManager(QtGui.QWidget): if self.serviceItems and item < len(self.serviceItems) and \ self.serviceItems[item][u'service_item'].is_capable( ItemCapabilities.AllowsPreview): - self.parent.PreviewController.addServiceManagerItem( - self.serviceItems[item][u'service_item'], 0) + self.parent.PreviewController.addServiceManagerItem( + self.serviceItems[item][u'service_item'], 0) else: QtGui.QMessageBox.critical(self, self.trUtf8('Missing Display Handler'), @@ -897,17 +897,18 @@ class ServiceManager(QtGui.QWidget): #we are over somthing so lets investigate pos = self._getParentItemData(item) - 1 serviceItem = self.serviceItems[pos] - if plugin == serviceItem[u'service_item'].name \ - and serviceItem[u'service_item'].is_capable(ItemCapabilities.AllowsAdditions): - action = self.dndMenu.exec_(QtGui.QCursor.pos()) - #New action required - if action == self.newAction: - self.droppos = self._getParentItemData(item) - #Append to existing action - if action == self.addToAction: - self.droppos = self._getParentItemData(item) - item.setSelected(True) - replace = True + if (plugin == serviceItem[u'service_item'].name and + serviceItem[u'service_item'].is_capable( + ItemCapabilities.AllowsAdditions)): + action = self.dndMenu.exec_(QtGui.QCursor.pos()) + #New action required + if action == self.newAction: + self.droppos = self._getParentItemData(item) + #Append to existing action + if action == self.addToAction: + self.droppos = self._getParentItemData(item) + item.setSelected(True) + replace = True else: self.droppos = self._getParentItemData(item) Receiver.send_message(u'%s_add_service_item' % plugin, replace) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index a2bd68e13..f9dd89daf 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -426,11 +426,12 @@ class SlideController(QtGui.QWidget): self.Toolbar.makeWidgetsVisible([u'Song Menu']) if item.is_capable(ItemCapabilities.AllowsLoop) and \ len(item.get_frames()) > 1: - self.Toolbar.makeWidgetsVisible(self.loopList) + self.Toolbar.makeWidgetsVisible(self.loopList) if item.is_media(): self.Toolbar.setVisible(False) self.Mediabar.setVisible(True) - #self.volumeSlider.setAudioOutput(self.mainDisplay.videoDisplay.audio) + #self.volumeSlider.setAudioOutput( + # self.mainDisplay.videoDisplay.audio) def enablePreviewToolBar(self, item): """ diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index a1a025c02..d79062a2a 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -354,10 +354,10 @@ class ImpressDocument(PresentationDocument): self.control.gotoSlideIndex(slideno-1) def next_step(self): - """ - Triggers the next effect of slide on the running presentation - """ - self.control.gotoNextEffect() + """ + Triggers the next effect of slide on the running presentation + """ + self.control.gotoNextEffect() def previous_step(self): """ diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index e45fac45f..b4102f5fe 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -73,7 +73,7 @@ class PptviewController(PresentationController): self.start_process() return self.process.CheckInstalled() except: - return False + return False def start_process(self): """ diff --git a/openlp/plugins/presentations/lib/presentationcontroller.py b/openlp/plugins/presentations/lib/presentationcontroller.py index f976aa4e7..c0eb7e5f1 100644 --- a/openlp/plugins/presentations/lib/presentationcontroller.py +++ b/openlp/plugins/presentations/lib/presentationcontroller.py @@ -151,7 +151,7 @@ class PresentationController(object): if doc is None: return if doc in self.docs: - self.docs.remove(doc) + self.docs.remove(doc) def close_presentation(self): pass From a1423dc966d936836f7090ea23bb97bc1c059129 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Tue, 25 May 2010 01:19:43 +0100 Subject: [PATCH 59/81] Fix reimport --- openlp/core/lib/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index ee18e98af..47a5c51cd 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -178,5 +178,4 @@ from songxmlhandler import SongXMLBuilder, SongXMLParser from themexmlhandler import ThemeXML from renderer import Renderer from rendermanager import RenderManager -from mediamanageritem import MediaManagerItem from baselistwithdnd import BaseListWithDnD From 14307fcc8a07e9f8a7e5127ae4980741558fe847 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Tue, 25 May 2010 01:48:42 +0100 Subject: [PATCH 60/81] Fix indentation --- openlp/plugins/custom/forms/editcustomform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 373c29794..83c21e7f3 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -211,8 +211,8 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): for row in range(0, self.VerseListView.count()): item = self.VerseListView.item(row) verse_list += item.text() - if row != self.VerseListView.count() - 1: - verse_list += u'\n[---]\n' + if row != self.VerseListView.count() - 1: + verse_list += u'\n[---]\n' self.editText(verse_list) def editText(self, text): From e9904754c26f89b950e136a24c66eb08204c53bf Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Tue, 25 May 2010 02:39:48 +0100 Subject: [PATCH 61/81] Remove code redefinitions --- openlp/migration/migratebibles.py | 16 ---------------- openlp/migration/migratesongs.py | 15 --------------- 2 files changed, 31 deletions(-) diff --git a/openlp/migration/migratebibles.py b/openlp/migration/migratebibles.py index cad6afc3f..168511a02 100644 --- a/openlp/migration/migratebibles.py +++ b/openlp/migration/migratebibles.py @@ -35,22 +35,6 @@ from openlp.core.lib import SettingsManager from openlp.core.utils import AppLocation from openlp.plugins.bibles.lib.models import * -class BaseModel(object): - """ - BaseModel provides a base object with a set of generic functions - """ - - @classmethod - def populate(cls, **kwargs): - """ - Creates an instance of a class and populates it, returning the instance - """ - me = cls() - keys = kwargs.keys() - for key in keys: - me.__setattr__(key, kwargs[key]) - return me - class TBibleMeta(BaseModel): """ Bible Meta Data diff --git a/openlp/migration/migratesongs.py b/openlp/migration/migratesongs.py index b43b1e68a..19b77adae 100644 --- a/openlp/migration/migratesongs.py +++ b/openlp/migration/migratesongs.py @@ -75,21 +75,6 @@ temp_authors_songs_table = Table(u'songauthors_temp', metadata, Column(u'authorid', types.Integer, primary_key=True), Column(u'songid', types.Integer) ) -class BaseModel(object): - """ - BaseModel provides a base object with a set of generic functions - """ - - @classmethod - def populate(cls, **kwargs): - """ - Creates an instance of a class and populates it, returning the instance - """ - me = cls() - keys = kwargs.keys() - for key in keys: - me.__setattr__(key, kwargs[key]) - return me class TAuthor(BaseModel): """ From f75a6fd73266e5f6bb0f19193ccca7a20d2d5414 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Tue, 25 May 2010 13:39:12 +0100 Subject: [PATCH 62/81] Whitespace --- openlp/core/lib/themexmlhandler.py | 2 +- openlp/core/lib/xmlrootclass.py | 1 + openlp/core/theme/theme.py | 8 ++++---- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/openlp/core/lib/themexmlhandler.py b/openlp/core/lib/themexmlhandler.py index a96cc7355..a5ff64c9d 100644 --- a/openlp/core/lib/themexmlhandler.py +++ b/openlp/core/lib/themexmlhandler.py @@ -30,7 +30,7 @@ from xml.etree.ElementTree import ElementTree, XML from openlp.core.lib import str_to_bool -blankthemexml=\ +blankthemexml = \ ''' BlankStyle diff --git a/openlp/core/lib/xmlrootclass.py b/openlp/core/lib/xmlrootclass.py index 78682c5a3..017d365c2 100644 --- a/openlp/core/lib/xmlrootclass.py +++ b/openlp/core/lib/xmlrootclass.py @@ -102,3 +102,4 @@ class XmlRootClass(object): if not attrib.startswith(u'_'): result += u'_%s_' % getattr(self, attrib) return result + diff --git a/openlp/core/theme/theme.py b/openlp/core/theme/theme.py index b34510fb7..501a7c33e 100644 --- a/openlp/core/theme/theme.py +++ b/openlp/core/theme/theme.py @@ -28,13 +28,13 @@ import types from xml.etree.ElementTree import ElementTree, XML from PyQt4 import QtGui -DelphiColors={"clRed":0xFF0000, +DelphiColors = {"clRed":0xFF0000, "clBlue":0x0000FF, "clYellow":0xFFFF00, - "clBlack":0x000000, - "clWhite":0xFFFFFF} + "clBlack":0x000000, + "clWhite":0xFFFFFF} -blankstylexml=\ +blankstylexml = \ ''' BlankStyle From a2448e36da33f413330859e38e04cdddd0bc7c4b Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Tue, 25 May 2010 15:20:05 +0100 Subject: [PATCH 63/81] Remove redundant code --- openlp/core/ui/thememanager.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 4b356f758..8701523d5 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -450,8 +450,6 @@ class ThemeManager(QtGui.QWidget): 'would you like to overwrite it?'), (QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.No) - else: - result == QtGui.QMessageBox.Yes if result == QtGui.QMessageBox.Yes: # Save the theme, overwriting the existing theme if necessary. outfile = None From c7d420d4b940e00d0d800689a14a028db89ee5f7 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Tue, 25 May 2010 15:30:34 +0100 Subject: [PATCH 64/81] Fix class defs and name redefinitions --- openlp/core/lib/eventreceiver.py | 2 +- openlp/migration/display.py | 2 +- openlp/migration/migratebibles.py | 3 +-- openlp/migration/migratefiles.py | 2 +- openlp/migration/migratesongs.py | 2 +- openlp/plugins/alerts/lib/manager.py | 11 ++++++----- openlp/plugins/custom/lib/manager.py | 2 +- openlp/plugins/songusage/lib/manager.py | 2 +- 8 files changed, 13 insertions(+), 13 deletions(-) diff --git a/openlp/core/lib/eventreceiver.py b/openlp/core/lib/eventreceiver.py index d21e3f167..76b19957c 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -230,7 +230,7 @@ class EventReceiver(QtCore.QObject): self.emit(QtCore.SIGNAL(event), msg) -class Receiver(): +class Receiver(object): """ Class to allow events to be passed from different parts of the system. This is a static wrapper around the ``EventReceiver`` class. As there is only diff --git a/openlp/migration/display.py b/openlp/migration/display.py index 8553f432a..abe991075 100644 --- a/openlp/migration/display.py +++ b/openlp/migration/display.py @@ -27,7 +27,7 @@ import logging log = logging.getLogger(__name__) -class Display(): +class Display(object): log.info(u'Display Class loaded') @staticmethod diff --git a/openlp/migration/migratebibles.py b/openlp/migration/migratebibles.py index 168511a02..17ded3a80 100644 --- a/openlp/migration/migratebibles.py +++ b/openlp/migration/migratebibles.py @@ -27,7 +27,6 @@ import os import sys import sqlite3 -from sqlalchemy import * from sqlalchemy import create_engine from sqlalchemy.orm import scoped_session, sessionmaker, mapper @@ -93,7 +92,7 @@ def init_models(url): autocommit=False, bind=engine)) return session -class MigrateBibles(): +class MigrateBibles(object): def __init__(self, display): self.display = display self.data_path = AppLocation.get_section_data_path(u'bibles') diff --git a/openlp/migration/migratefiles.py b/openlp/migration/migratefiles.py index ceca99718..91fff144d 100644 --- a/openlp/migration/migratefiles.py +++ b/openlp/migration/migratefiles.py @@ -25,7 +25,7 @@ from openlp.core.utils import AppLocation -class MigrateFiles(): +class MigrateFiles(object): def __init__(self, display): self.display = display diff --git a/openlp/migration/migratesongs.py b/openlp/migration/migratesongs.py index 19b77adae..f7624e98c 100644 --- a/openlp/migration/migratesongs.py +++ b/openlp/migration/migratesongs.py @@ -94,7 +94,7 @@ class TSongAuthor(BaseModel): """ pass -class MigrateSongs(): +class MigrateSongs(object): def __init__(self, display): self.display = display self.data_path = AppLocation.get_section_data_path(u'songs') diff --git a/openlp/plugins/alerts/lib/manager.py b/openlp/plugins/alerts/lib/manager.py index f82266f49..9d9c87fbb 100644 --- a/openlp/plugins/alerts/lib/manager.py +++ b/openlp/plugins/alerts/lib/manager.py @@ -32,7 +32,7 @@ from openlp.plugins.alerts.lib.models import init_models, metadata, AlertItem log = logging.getLogger(__name__) -class DBManager(): +class DBManager(object): """ The Song Manager provides a central location for all database code. This class takes care of connecting to the database and running all the queries. @@ -70,13 +70,13 @@ class DBManager(): """ return self.session.query(AlertItem).order_by(AlertItem.text).all() - def save_alert(self, AlertItem): + def save_alert(self, alert_item): """ Saves a Alert show to the database """ log.debug(u'Alert added') try: - self.session.add(AlertItem) + self.session.add(alert_item) self.session.commit() log.debug(u'Alert saved') return True @@ -99,9 +99,9 @@ class DBManager(): Delete a Alert show """ if id != 0: - AlertItem = self.get_alert(id) + alert_item = self.get_alert(id) try: - self.session.delete(AlertItem) + self.session.delete(alert_item) self.session.commit() return True except: @@ -110,3 +110,4 @@ class DBManager(): return False else: return True + diff --git a/openlp/plugins/custom/lib/manager.py b/openlp/plugins/custom/lib/manager.py index 9e781f560..b5e0e8411 100644 --- a/openlp/plugins/custom/lib/manager.py +++ b/openlp/plugins/custom/lib/manager.py @@ -32,7 +32,7 @@ from openlp.plugins.custom.lib.models import init_models, metadata, CustomSlide log = logging.getLogger(__name__) -class CustomManager(): +class CustomManager(object): """ The Song Manager provides a central location for all database code. This class takes care of connecting to the database and running all the queries. diff --git a/openlp/plugins/songusage/lib/manager.py b/openlp/plugins/songusage/lib/manager.py index e8816b552..cb8ea91bf 100644 --- a/openlp/plugins/songusage/lib/manager.py +++ b/openlp/plugins/songusage/lib/manager.py @@ -33,7 +33,7 @@ from openlp.plugins.songusage.lib.models import init_models, metadata, \ log = logging.getLogger(__name__) -class SongUsageManager(): +class SongUsageManager(object): """ The Song Manager provides a central location for all database code. This class takes care of connecting to the database and running all the queries. From 29cfcee29f7536fada79205987ffe1dd4ed6f115 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Tue, 25 May 2010 16:04:37 +0100 Subject: [PATCH 65/81] Fix undefined variables --- openlp/plugins/bibles/lib/csvbible.py | 4 +++- openlp/plugins/songs/lib/songxml.py | 9 ++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 46a65bc51..54775bd35 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -27,6 +27,8 @@ import logging import chardet import csv +from PyQt4 import QtCore + from openlp.core.lib import Receiver from db import BibleDB @@ -89,7 +91,7 @@ class CSVBible(BibleDB): verse_file = None try: book_ptr = None - verse_file = open(versesfile, 'r') + verse_file = open(self.versesfile, 'r') dialect = csv.Sniffer().sniff(verse_file.read(1024)) verse_file.seek(0) verse_reader = csv.reader(verse_file, dialect) diff --git a/openlp/plugins/songs/lib/songxml.py b/openlp/plugins/songs/lib/songxml.py index 2dc55ff7d..8789b379d 100644 --- a/openlp/plugins/songs/lib/songxml.py +++ b/openlp/plugins/songs/lib/songxml.py @@ -23,6 +23,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +import logging import sys import os @@ -32,6 +33,9 @@ sys.path.append(os.path.abspath(u'./../../../..')) from openlp.core.lib import XmlRootClass +log = logging.getLogger(__name__) + + class SongException(Exception): pass @@ -80,7 +84,6 @@ class _OpenSong(XmlRootClass): def _reset(self): """Reset all song attributes""" - global _blankOpenSongXml self._setFromXml(_blankOpenSongXml, 'song') def from_buffer(self, xmlContent): @@ -301,7 +304,7 @@ class Song(object): string = title for char in punctuation: string = string.replace(char, '') - return s + return string def set_title(self, title): """Set the song title @@ -403,7 +406,7 @@ class Song(object): if string_in is None: string_out = "" else: - string_out = unicode(s) + string_out = unicode(string_in) return string_out def _split_to_list(self, aString): From e29f3d30c0b37fe7b5e36eadab19bb035a7bf5e9 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Tue, 25 May 2010 16:35:34 +0100 Subject: [PATCH 66/81] Remove unnecessary semicolons --- openlp/plugins/songs/forms/editsongform.py | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index abc29ad27..144081c84 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -127,8 +127,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): authorsCompleter = QtGui.QCompleter( [author.display_name for author in authors], self.AuthorsSelectionComboItem) - authorsCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); - self.AuthorsSelectionComboItem.setCompleter(authorsCompleter); + authorsCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive) + self.AuthorsSelectionComboItem.setCompleter(authorsCompleter) self.AuthorsSelectionComboItem.clear() for author in authors: row = self.AuthorsSelectionComboItem.count() @@ -139,10 +139,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): def loadTopics(self): topics = self.songmanager.get_topics() topicsCompleter = QtGui.QCompleter( - [topic.name for topic in topics], - self.SongTopicCombo) - topicsCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); - self.SongTopicCombo.setCompleter(topicsCompleter); + [topic.name for topic in topics], self.SongTopicCombo) + topicsCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive) + self.SongTopicCombo.setCompleter(topicsCompleter) self.SongTopicCombo.clear() for topic in topics: row = self.SongTopicCombo.count() @@ -153,8 +152,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): books = self.songmanager.get_books() booksCompleter = QtGui.QCompleter( [book.name for book in books], self.SongbookCombo) - booksCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); - self.SongbookCombo.setCompleter(booksCompleter); + booksCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive) + self.SongbookCombo.setCompleter(booksCompleter) self.SongbookCombo.clear() self.SongbookCombo.addItem(u' ') for book in books: @@ -166,8 +165,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): themesCompleter = QtGui.QCompleter( [theme for theme in theme_list], self.ThemeSelectionComboItem) - themesCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); - self.ThemeSelectionComboItem.setCompleter(themesCompleter); + themesCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive) + self.ThemeSelectionComboItem.setCompleter(themesCompleter) self.ThemeSelectionComboItem.clear() self.ThemeSelectionComboItem.addItem(u' ') for theme in theme_list: From 871640c37458bd52f0fc6025a66672e1fc5a3083 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Tue, 25 May 2010 17:16:43 +0100 Subject: [PATCH 67/81] Whitespace --- openlp/core/lib/mediamanageritem.py | 2 +- openlp/core/lib/renderer.py | 2 +- openlp/core/lib/serviceitem.py | 2 +- openlp/core/lib/themexmlhandler.py | 7 +- openlp/core/ui/displaytab.py | 5 +- openlp/core/ui/mainwindow.py | 54 ++-- openlp/core/ui/thememanager.py | 6 +- openlp/plugins/alerts/lib/alertsmanager.py | 2 +- .../plugins/bibles/forms/bibleimportwizard.py | 2 +- openlp/plugins/images/lib/mediaitem.py | 2 +- openlp/plugins/media/lib/mediaitem.py | 2 +- openlp/plugins/presentations/lib/mediaitem.py | 2 +- .../songs/forms/songmaintenanceform.py | 17 +- openlp/plugins/songs/lib/sofimport.py | 304 ++++++++++++------ openlp/plugins/songs/lib/songimport.py | 5 +- .../songusage/forms/songusagedetailform.py | 3 +- 16 files changed, 264 insertions(+), 153 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 36cc738b8..b1429770a 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -367,7 +367,7 @@ class MediaManagerItem(QtGui.QWidget): def IconFromFile(self, file, thumb): icon = build_icon(unicode(file)) - pixmap = icon.pixmap(QtCore.QSize(88,50)) + pixmap = icon.pixmap(QtCore.QSize(88, 50)) ext = os.path.splitext(thumb)[1].lower() pixmap.save(thumb, ext[1:]) return icon diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 64e54e5fc..55c66a809 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -474,7 +474,7 @@ class Renderer(object): # draw a box around the text - debug only if self._debug: - self.painter.setPen(QtGui.QPen(QtGui.QColor(0,255,0))) + self.painter.setPen(QtGui.QPen(QtGui.QColor(0, 255, 0))) self.painter.drawRect(startx, starty, rightextent-startx, y-starty) brcorner = (rightextent, y) self.painter.end() diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 841e91839..f246d9b90 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -159,7 +159,7 @@ class ServiceItem(object): frame = self.RenderManager.generate_slide(format, self.raw_footer) else: - frame = self.RenderManager.generate_slide(format,u'') + frame = self.RenderManager.generate_slide(format, u'') self.cache[row] = frame return frame diff --git a/openlp/core/lib/themexmlhandler.py b/openlp/core/lib/themexmlhandler.py index a5ff64c9d..b3cfb0307 100644 --- a/openlp/core/lib/themexmlhandler.py +++ b/openlp/core/lib/themexmlhandler.py @@ -215,7 +215,7 @@ class ThemeXML(object): The height of the text block. """ background = self.theme_xml.createElement(u'font') - background.setAttribute(u'type',fonttype) + background.setAttribute(u'type', fonttype) self.theme.appendChild(background) #Create Font name element self.child_element(background, u'name', name) @@ -230,11 +230,12 @@ class ThemeXML(object): #Create indentation name element self.child_element(background, u'indentation', unicode(indentation)) #Create indentation name element - self.child_element(background, u'line_adjustment', unicode(line_adjustment)) + self.child_element( + background, u'line_adjustment', unicode(line_adjustment)) #Create Location element element = self.theme_xml.createElement(u'location') - element.setAttribute(u'override',override) + element.setAttribute(u'override', override) if override == u'True': element.setAttribute(u'x', xpos) element.setAttribute(u'y', ypos) diff --git a/openlp/core/ui/displaytab.py b/openlp/core/ui/displaytab.py index d3ef9205d..65a5b8044 100644 --- a/openlp/core/ui/displaytab.py +++ b/openlp/core/ui/displaytab.py @@ -222,8 +222,8 @@ class DisplayTab(SettingsTab): self.postSetUp() def postSetUp(self): - self.screens.override[u'size'] = QtCore.QRect(int(self.XposEdit.text()),\ - int(self.YposEdit.text()), int(self.WidthEdit.text()),\ + self.screens.override[u'size'] = QtCore.QRect(int(self.XposEdit.text()), + int(self.YposEdit.text()), int(self.WidthEdit.text()), int(self.HeightEdit.text())) if self.amend_display: self.screens.set_override_display() @@ -233,3 +233,4 @@ class DisplayTab(SettingsTab): if self.amend_display_start != self.amend_display: self.amend_display_start = self.amend_display Receiver.send_message(u'config_screen_changed') + diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 92c8fed94..9bbb6cfc2 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -352,11 +352,13 @@ class Ui_MainWindow(object): translate('MainWindow', 'Theme Manager')) self.FileNewItem.setText(translate('MainWindow', '&New')) self.FileNewItem.setToolTip(translate('MainWindow', 'New Service')) - self.FileNewItem.setStatusTip(translate('MainWindow', 'Create a new Service')) + self.FileNewItem.setStatusTip( + translate('MainWindow', 'Create a new Service')) self.FileNewItem.setShortcut(translate('MainWindow', 'Ctrl+N')) self.FileOpenItem.setText(translate('MainWindow', '&Open')) self.FileOpenItem.setToolTip(translate('MainWindow', 'Open Service')) - self.FileOpenItem.setStatusTip(translate('MainWindow', 'Open an existing service')) + self.FileOpenItem.setStatusTip( + translate('MainWindow', 'Open an existing service')) self.FileOpenItem.setShortcut(translate('MainWindow', 'Ctrl+O')) self.FileSaveItem.setText(translate('MainWindow', '&Save')) self.FileSaveItem.setToolTip(translate('MainWindow', 'Save Service')) @@ -364,9 +366,10 @@ class Ui_MainWindow(object): translate('MainWindow', 'Save the current service to disk')) self.FileSaveItem.setShortcut(translate('MainWindow', 'Ctrl+S')) self.FileSaveAsItem.setText(translate('MainWindow', 'Save &As...')) - self.FileSaveAsItem.setToolTip(translate('MainWindow', 'Save Service As')) - self.FileSaveAsItem.setStatusTip( - translate('MainWindow', 'Save the current service under a new name')) + self.FileSaveAsItem.setToolTip( + translate('MainWindow', 'Save Service As')) + self.FileSaveAsItem.setStatusTip(translate('MainWindow', + 'Save the current service under a new name')) self.FileSaveAsItem.setShortcut(translate('MainWindow', 'F12')) self.FileExitItem.setText(translate('MainWindow', 'E&xit')) self.FileExitItem.setStatusTip(translate('MainWindow', 'Quit OpenLP')) @@ -377,34 +380,40 @@ class Ui_MainWindow(object): self.ExportLanguageItem.setText(translate('MainWindow', '&Language')) self.actionLook_Feel.setText(translate('MainWindow', 'Look && &Feel')) self.OptionsSettingsItem.setText(translate('MainWindow', '&Settings')) - self.ViewMediaManagerItem.setText(translate('MainWindow', '&Media Manager')) + self.ViewMediaManagerItem.setText( + translate('MainWindow', '&Media Manager')) self.ViewMediaManagerItem.setToolTip( translate('MainWindow', 'Toggle Media Manager')) - self.ViewMediaManagerItem.setStatusTip( - translate('MainWindow', 'Toggle the visibility of the Media Manager')) + self.ViewMediaManagerItem.setStatusTip(translate('MainWindow', + 'Toggle the visibility of the Media Manager')) self.ViewMediaManagerItem.setShortcut(translate('MainWindow', 'F8')) - self.ViewThemeManagerItem.setText(translate('MainWindow', '&Theme Manager')) + self.ViewThemeManagerItem.setText( + translate('MainWindow', '&Theme Manager')) self.ViewThemeManagerItem.setToolTip( translate('MainWindow', 'Toggle Theme Manager')) - self.ViewThemeManagerItem.setStatusTip( - translate('MainWindow', 'Toggle the visibility of the Theme Manager')) + self.ViewThemeManagerItem.setStatusTip(translate('MainWindow', + 'Toggle the visibility of the Theme Manager')) self.ViewThemeManagerItem.setShortcut(translate('MainWindow', 'F10')) - self.ViewServiceManagerItem.setText(translate('MainWindow', '&Service Manager')) + self.ViewServiceManagerItem.setText( + translate('MainWindow', '&Service Manager')) self.ViewServiceManagerItem.setToolTip( translate('MainWindow', 'Toggle Service Manager')) - self.ViewServiceManagerItem.setStatusTip( - translate('MainWindow', 'Toggle the visibility of the Service Manager')) + self.ViewServiceManagerItem.setStatusTip(translate('MainWindow', + 'Toggle the visibility of the Service Manager')) self.ViewServiceManagerItem.setShortcut(translate('MainWindow', 'F9')) - self.action_Preview_Panel.setText(translate('MainWindow', '&Preview Panel')) + self.action_Preview_Panel.setText( + translate('MainWindow', '&Preview Panel')) self.action_Preview_Panel.setToolTip( translate('MainWindow', 'Toggle Preview Panel')) - self.action_Preview_Panel.setStatusTip( - translate('MainWindow', 'Toggle the visibility of the Preview Panel')) + self.action_Preview_Panel.setStatusTip(translate('MainWindow', + 'Toggle the visibility of the Preview Panel')) self.action_Preview_Panel.setShortcut(translate('MainWindow', 'F11')) self.PluginItem.setText(translate('MainWindow', '&Plugin List')) - self.PluginItem.setStatusTip(translate('MainWindow', 'List the Plugins')) + self.PluginItem.setStatusTip( + translate('MainWindow', 'List the Plugins')) self.PluginItem.setShortcut(translate('MainWindow', 'Alt+F7')) - self.HelpDocumentationItem.setText(translate('MainWindow', '&User Guide')) + self.HelpDocumentationItem.setText( + translate('MainWindow', '&User Guide')) self.HelpAboutItem.setText(translate('MainWindow', '&About')) self.HelpAboutItem.setStatusTip( translate('MainWindow', 'More information about OpenLP')) @@ -417,12 +426,13 @@ class Ui_MainWindow(object): translate('MainWindow', 'Choose System language, if available')) for item in self.LanguageGroup.actions(): item.setText(item.objectName()) - item.setStatusTip( - translate('MainWindow', 'Set the interface language to %1').arg(item.objectName())) + item.setStatusTip(translate('MainWindow', + 'Set the interface language to %1').arg(item.objectName())) self.ToolsAddToolItem.setText(translate('MainWindow', 'Add &Tool...')) self.ToolsAddToolItem.setStatusTip( translate('MainWindow', 'Add an application to the list of tools')) - self.action_Preview_Panel.setText(translate('MainWindow', '&Preview Pane')) + self.action_Preview_Panel.setText( + translate('MainWindow', '&Preview Pane')) self.ModeLiveItem.setText(translate('MainWindow', '&Live')) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 8701523d5..d908311b3 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -73,7 +73,7 @@ class ThemeManager(QtGui.QWidget): self.Layout.addWidget(self.Toolbar) self.ThemeListWidget = QtGui.QListWidget(self) self.ThemeListWidget.setAlternatingRowColors(True) - self.ThemeListWidget.setIconSize(QtCore.QSize(88,50)) + self.ThemeListWidget.setIconSize(QtCore.QSize(88, 50)) self.Layout.addWidget(self.ThemeListWidget) self.ThemeListWidget.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.ThemeListWidget.addAction( @@ -285,7 +285,7 @@ class ThemeManager(QtGui.QWidget): icon = build_icon(thumb) else: icon = build_icon(theme) - pixmap = icon.pixmap(QtCore.QSize(88,50)) + pixmap = icon.pixmap(QtCore.QSize(88, 50)) pixmap.save(thumb, u'png') item_name.setIcon(icon) item_name.setData(QtCore.Qt.UserRole, @@ -483,7 +483,7 @@ class ThemeManager(QtGui.QWidget): frame.save(samplepathname, u'png') thumb = os.path.join(self.thumbPath, u'%s.png' % name) icon = build_icon(frame) - pixmap = icon.pixmap(QtCore.QSize(88,50)) + pixmap = icon.pixmap(QtCore.QSize(88, 50)) pixmap.save(thumb, u'png') log.debug(u'Theme image written to %s', samplepathname) diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index 35be3b7c2..e1e693b45 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -67,7 +67,7 @@ class AlertsManager(QtCore.QObject): - self.alertHeight self.alertHeight = self.screen[u'size'].height() \ - self.alertScreenPosition - self.parent.maindisplay.setAlertSize(self.alertScreenPosition,\ + self.parent.maindisplay.setAlertSize(self.alertScreenPosition, self.alertHeight) def onAlertText(self, message): diff --git a/openlp/plugins/bibles/forms/bibleimportwizard.py b/openlp/plugins/bibles/forms/bibleimportwizard.py index 6340144a5..c2aa2dde4 100644 --- a/openlp/plugins/bibles/forms/bibleimportwizard.py +++ b/openlp/plugins/bibles/forms/bibleimportwizard.py @@ -277,7 +277,7 @@ class Ui_BibleImportWizard(object): self.CopyrightEdit) self.PermissionLabel = QtGui.QLabel(self.LicenseDetailsPage) self.PermissionLabel.setObjectName(u'PermissionLabel') - self.LicenseDetailsLayout.setWidget(2, QtGui.QFormLayout.LabelRole,\ + self.LicenseDetailsLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.PermissionLabel) self.PermissionEdit = QtGui.QLineEdit(self.LicenseDetailsPage) self.PermissionEdit.setObjectName(u'PermissionEdit') diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 02101d260..35151d86e 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -75,7 +75,7 @@ class ImageMediaItem(MediaManagerItem): self.ListView.clear() self.ListView.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) - self.ListView.setIconSize(QtCore.QSize(88,50)) + self.ListView.setIconSize(QtCore.QSize(88, 50)) self.servicePath = os.path.join( AppLocation.get_section_data_path(self.settingsSection), u'thumbnails') diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 3ba632239..05175632d 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -129,7 +129,7 @@ class MediaMediaItem(MediaManagerItem): def initialise(self): self.ListView.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) - self.ListView.setIconSize(QtCore.QSize(88,50)) + self.ListView.setIconSize(QtCore.QSize(88, 50)) self.loadList(SettingsManager.load_list( self.settingsSection, self.settingsSection)) diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 51663ad26..cf25a76d3 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -109,7 +109,7 @@ class PresentationMediaItem(MediaManagerItem): self.servicePath = os.path.join( AppLocation.get_section_data_path(self.settingsSection), u'thumbnails') - self.ListView.setIconSize(QtCore.QSize(88,50)) + self.ListView.setIconSize(QtCore.QSize(88, 50)) if not os.path.exists(self.servicePath): os.mkdir(self.servicePath) list = SettingsManager.load_list( diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py index 44ad517e1..e3979fa75 100644 --- a/openlp/plugins/songs/forms/songmaintenanceform.py +++ b/openlp/plugins/songs/forms/songmaintenanceform.py @@ -81,7 +81,7 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): return -1 def _deleteItem(self, list_widget, get_func, del_func, reset_func, - dlg_title, del_text, err_text, sel_text): + dlg_title, del_text, err_text, sel_text): item_id = self._getCurrentItemId(list_widget) if item_id != -1: item = get_func(item_id) @@ -93,11 +93,9 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): del_func(item.id) reset_func() else: - QtGui.QMessageBox.critical(self, dlg_title, err_text, - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + QtGui.QMessageBox.critical(self, dlg_title, err_text) else: - QtGui.QMessageBox.critical(self, dlg_title, sel_text, - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + QtGui.QMessageBox.critical(self, dlg_title, sel_text) def resetAuthors(self): self.AuthorsListWidget.clear() @@ -197,8 +195,7 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): else: QtGui.QMessageBox.critical( self, self.trUtf8('Error'), - self.trUtf8('Couldn\'t save your topic.'), - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.trUtf8('Couldn\'t save your topic.')) def onBookEditButtonClick(self): book_id = self._getCurrentItemId(self.BooksListWidget) @@ -208,14 +205,14 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): self.bookform.PublisherEdit.setText(book.publisher) if self.bookform.exec_(False): book.name = unicode(self.bookform.NameEdit.text(), u'utf-8') - book.publisher = unicode(self.bookform.PublisherEdit.text(), u'utf-8') + book.publisher = unicode( + self.bookform.PublisherEdit.text(), u'utf-8') if self.songmanager.save_book(book): self.resetBooks() else: QtGui.QMessageBox.critical( self, self.trUtf8('Error'), - self.trUtf8('Couldn\'t save your book.'), - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.trUtf8('Couldn\'t save your book.')) def onAuthorDeleteButtonClick(self): """ diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index 9d95cf6b5..8ba5c31cf 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -67,7 +67,7 @@ class SofImport(OooImport): Initialise the class. Requires a songmanager class which is passed to SongImport for writing song to disk """ - OooImport.__init__(self,songmanager) + OooImport.__init__(self, songmanager) def import_sof(self, filename): self.start_ooo() @@ -332,105 +332,205 @@ class SofImport(OooImport): Because someone at Kingsway forgot to check the 1+2 RTF file, some verses were not formatted correctly. """ - if song_number == 11: return 8 - if song_number == 18: return 5 - if song_number == 21: return 6 - if song_number == 23: return 4 - if song_number == 24: return 7 - if song_number == 27: return 4 - if song_number == 31: return 6 - if song_number == 49: return 4 - if song_number == 50: return 8 - if song_number == 70: return 4 - if song_number == 75: return 8 - if song_number == 79: return 6 - if song_number == 97: return 7 - if song_number == 107: return 4 - if song_number == 109: return 4 - if song_number == 133: return 4 - if song_number == 155: return 10 - if song_number == 156: return 8 - if song_number == 171: return 4 - if song_number == 188: return 7 - if song_number == 192: return 4 - if song_number == 208: return 8 - if song_number == 215: return 8 - if song_number == 220: return 4 - if song_number == 247: return 6 - if song_number == 248: return 6 - if song_number == 251: return 8 - if song_number == 295: return 8 - if song_number == 307: return 5 - if song_number == 314: return 6 - if song_number == 325: return 8 - if song_number == 386: return 6 - if song_number == 415: return 4 - if song_number == 426: return 4 - if song_number == 434: return 5 - if song_number == 437: return 4 - if song_number == 438: return 6 - if song_number == 456: return 8 - if song_number == 461: return 4 - if song_number == 469: return 4 - if song_number == 470: return 5 - if song_number == 476: return 6 - if song_number == 477: return 7 - if song_number == 480: return 8 - if song_number == 482: return 4 - if song_number == 512: return 4 - if song_number == 513: return 8 - if song_number == 518: return 5 - if song_number == 520: return 4 - if song_number == 523: return 6 - if song_number == 526: return 8 - if song_number == 527: return 4 - if song_number == 529: return 4 - if song_number == 537: return 4 - if song_number == 555: return 6 - if song_number == 581: return 4 - if song_number == 589: return 6 - if song_number == 590: return 4 - if song_number == 593: return 8 - if song_number == 596: return 4 - if song_number == 610: return 6 - if song_number == 611: return 6 - if song_number == 619: return 8 - if song_number == 645: return 5 - if song_number == 653: return 6 - if song_number == 683: return 7 - if song_number == 686: return 4 - if song_number == 697: return 8 - if song_number == 698: return 4 - if song_number == 704: return 6 - if song_number == 716: return 4 - if song_number == 717: return 6 - if song_number == 730: return 4 - if song_number == 731: return 8 - if song_number == 732: return 8 - if song_number == 738: return 4 - if song_number == 756: return 9 - if song_number == 815: return 6 - if song_number == 830: return 8 - if song_number == 831: return 4 - if song_number == 876: return 6 - if song_number == 877: return 6 - if song_number == 892: return 4 - if song_number == 894: return 6 - if song_number == 902: return 8 - if song_number == 905: return 8 - if song_number == 921: return 6 - if song_number == 940: return 7 - if song_number == 955: return 9 - if song_number == 968: return 8 - if song_number == 972: return 7 - if song_number == 974: return 4 - if song_number == 988: return 6 - if song_number == 991: return 5 - if song_number == 1002: return 8 - if song_number == 1024: return 8 - if song_number == 1044: return 9 - if song_number == 1088: return 6 - if song_number == 1117: return 6 - if song_number == 1119: return 7 + if song_number == 11: + return 8 + if song_number == 18: + return 5 + if song_number == 21: + return 6 + if song_number == 23: + return 4 + if song_number == 24: + return 7 + if song_number == 27: + return 4 + if song_number == 31: + return 6 + if song_number == 49: + return 4 + if song_number == 50: + return 8 + if song_number == 70: + return 4 + if song_number == 75: + return 8 + if song_number == 79: + return 6 + if song_number == 97: + return 7 + if song_number == 107: + return 4 + if song_number == 109: + return 4 + if song_number == 133: + return 4 + if song_number == 155: + return 10 + if song_number == 156: + return 8 + if song_number == 171: + return 4 + if song_number == 188: + return 7 + if song_number == 192: + return 4 + if song_number == 208: + return 8 + if song_number == 215: + return 8 + if song_number == 220: + return 4 + if song_number == 247: + return 6 + if song_number == 248: + return 6 + if song_number == 251: + return 8 + if song_number == 295: + return 8 + if song_number == 307: + return 5 + if song_number == 314: + return 6 + if song_number == 325: + return 8 + if song_number == 386: + return 6 + if song_number == 415: + return 4 + if song_number == 426: + return 4 + if song_number == 434: + return 5 + if song_number == 437: + return 4 + if song_number == 438: + return 6 + if song_number == 456: + return 8 + if song_number == 461: + return 4 + if song_number == 469: + return 4 + if song_number == 470: + return 5 + if song_number == 476: + return 6 + if song_number == 477: + return 7 + if song_number == 480: + return 8 + if song_number == 482: + return 4 + if song_number == 512: + return 4 + if song_number == 513: + return 8 + if song_number == 518: + return 5 + if song_number == 520: + return 4 + if song_number == 523: + return 6 + if song_number == 526: + return 8 + if song_number == 527: + return 4 + if song_number == 529: + return 4 + if song_number == 537: + return 4 + if song_number == 555: + return 6 + if song_number == 581: + return 4 + if song_number == 589: + return 6 + if song_number == 590: + return 4 + if song_number == 593: + return 8 + if song_number == 596: + return 4 + if song_number == 610: + return 6 + if song_number == 611: + return 6 + if song_number == 619: + return 8 + if song_number == 645: + return 5 + if song_number == 653: + return 6 + if song_number == 683: + return 7 + if song_number == 686: + return 4 + if song_number == 697: + return 8 + if song_number == 698: + return 4 + if song_number == 704: + return 6 + if song_number == 716: + return 4 + if song_number == 717: + return 6 + if song_number == 730: + return 4 + if song_number == 731: + return 8 + if song_number == 732: + return 8 + if song_number == 738: + return 4 + if song_number == 756: + return 9 + if song_number == 815: + return 6 + if song_number == 830: + return 8 + if song_number == 831: + return 4 + if song_number == 876: + return 6 + if song_number == 877: + return 6 + if song_number == 892: + return 4 + if song_number == 894: + return 6 + if song_number == 902: + return 8 + if song_number == 905: + return 8 + if song_number == 921: + return 6 + if song_number == 940: + return 7 + if song_number == 955: + return 9 + if song_number == 968: + return 8 + if song_number == 972: + return 7 + if song_number == 974: + return 4 + if song_number == 988: + return 6 + if song_number == 991: + return 5 + if song_number == 1002: + return 8 + if song_number == 1024: + return 8 + if song_number == 1044: + return 9 + if song_number == 1088: + return 6 + if song_number == 1117: + return 6 + if song_number == 1119: + return 7 return None - + diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index 5fe362842..58e3a4df7 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -122,8 +122,9 @@ class SongImport(object): or text.lower().find(self.copyright_symbol) >= 0: copyright_found = False for line in lines: - if copyright_found or line.lower().find(self.copyright_string) >= 0\ - or line.lower().find(self.copyright_symbol) >= 0: + if (copyright_found or + line.lower().find(self.copyright_string) >= 0 or + line.lower().find(self.copyright_symbol) >= 0): copyright_found = True self.add_copyright(line) else: diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index 31971f465..21d6d29c5 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -35,10 +35,11 @@ from songusagedetaildialog import Ui_SongUsageDetailDialog log = logging.getLogger(__name__) class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): - log.info(u'SongUsage Detail Form loaded') """ Class documentation goes here. """ + log.info(u'SongUsage Detail Form Loaded') + def __init__(self, parent=None): """ Constructor From 6b1a6a0638ff0e514adc341087273ec345a7cbbd Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 25 May 2010 19:12:21 +0200 Subject: [PATCH 68/81] More intelligent version checking. --- openlp/core/ui/mainwindow.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 92c8fed94..a4c683504 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -25,6 +25,7 @@ import logging import time +import re from PyQt4 import QtCore, QtGui @@ -60,6 +61,7 @@ class VersionThread(QtCore.QThread): QtCore.QThread.__init__(self, parent) self.parent = parent self.app_version = app_version + self.version_splitter = re.compile(r'([0-9]+).([0-9]+).([0-9]+)(?:-bzr([0-9]+))') def run(self): """ @@ -68,8 +70,29 @@ class VersionThread(QtCore.QThread): time.sleep(1) Receiver.send_message(u'maindisplay_blank_check') version = check_latest_version(self.app_version) - #new version has arrived - if version != self.app_version[u'full']: + remote_version = {} + local_version = {} + match = self.version_splitter.match(version) + if match: + remote_version[u'major'] = int(match.group(1)) + remote_version[u'minor'] = int(match.group(2)) + remote_version[u'release'] = int(match.group(3)) + if len(match.groups()) > 3: + remote_version[u'revision'] = int(match.group(4)) + match = self.version_splitter.match(self.app_version[u'full']) + if match: + local_version[u'major'] = int(match.group(1)) + local_version[u'minor'] = int(match.group(2)) + local_version[u'release'] = int(match.group(3)) + if len(match.groups()) > 3: + local_version[u'revision'] = int(match.group(4)) + if remote_version[u'major'] > local_version[u'major'] or \ + remote_version[u'minor'] > local_version[u'minor'] or \ + remote_version[u'release'] > local_version[u'release']: + Receiver.send_message(u'openlp_version_check', u'%s' % version) + elif remote_version.get(u'revision') and \ + local_version.get(u'revision') and \ + remote_version[u'revision'] > local_version[u'revision']: Receiver.send_message(u'openlp_version_check', u'%s' % version) class Ui_MainWindow(object): From 5b39ab942acf724bd9f596f7105989ff893527b6 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 25 May 2010 20:55:02 +0200 Subject: [PATCH 69/81] Indented everything to 4 spaces, as per Jon's recommendation. --- openlp/core/ui/mainwindow.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index a4c683504..48f0f6894 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -87,12 +87,12 @@ class VersionThread(QtCore.QThread): if len(match.groups()) > 3: local_version[u'revision'] = int(match.group(4)) if remote_version[u'major'] > local_version[u'major'] or \ - remote_version[u'minor'] > local_version[u'minor'] or \ - remote_version[u'release'] > local_version[u'release']: + remote_version[u'minor'] > local_version[u'minor'] or \ + remote_version[u'release'] > local_version[u'release']: Receiver.send_message(u'openlp_version_check', u'%s' % version) elif remote_version.get(u'revision') and \ - local_version.get(u'revision') and \ - remote_version[u'revision'] > local_version[u'revision']: + local_version.get(u'revision') and \ + remote_version[u'revision'] > local_version[u'revision']: Receiver.send_message(u'openlp_version_check', u'%s' % version) class Ui_MainWindow(object): From f0c03ad2cba40cd6f268811e828758c928f54c3e Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Wed, 26 May 2010 00:07:50 +0100 Subject: [PATCH 70/81] Cleanups --- openlp/core/lib/__init__.py | 9 ++++++++- openlp/core/theme/__init__.py | 2 +- openlp/core/utils/__init__.py | 3 ++- openlp/plugins/songs/lib/classes.py | 3 ++- 4 files changed, 13 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 47a5c51cd..e5f45b188 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -132,6 +132,9 @@ def contextMenu(base, icon, text): return action def contextMenuSeparator(base): + """ + Add a separator to a context menu + """ action = QtGui.QAction(u'', base) action.setSeparator(True) return action @@ -150,7 +153,8 @@ def resize_image(image, width, height): realw = preview.width() realh = preview.height() # and move it to the centre of the preview space - newImage = QtGui.QImage(width, height, QtGui.QImage.Format_ARGB32_Premultiplied) + newImage = QtGui.QImage( + width, height, QtGui.QImage.Format_ARGB32_Premultiplied) newImage.fill(QtCore.Qt.black) painter = QtGui.QPainter(newImage) painter.drawImage((width - realw) / 2, (height - realh) / 2, preview) @@ -158,6 +162,9 @@ def resize_image(image, width, height): class ThemeLevel(object): + """ + Provides an enumeration for the level a theme applies to + """ Global = 1 Service = 2 Song = 3 diff --git a/openlp/core/theme/__init__.py b/openlp/core/theme/__init__.py index 0975e977b..037392e8e 100644 --- a/openlp/core/theme/__init__.py +++ b/openlp/core/theme/__init__.py @@ -23,4 +23,4 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from theme import Theme +from openlp.core.theme.theme import Theme diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index 5df5d397a..8cbf7657a 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -186,4 +186,5 @@ def add_actions(target, actions): from languagemanager import LanguageManager -__all__ = [u'AppLocation', u'check_latest_version', u'add_actions', u'LanguageManager'] +__all__ = [u'AppLocation', u'check_latest_version', u'add_actions', + u'LanguageManager'] diff --git a/openlp/plugins/songs/lib/classes.py b/openlp/plugins/songs/lib/classes.py index 171bbdc48..115943814 100644 --- a/openlp/plugins/songs/lib/classes.py +++ b/openlp/plugins/songs/lib/classes.py @@ -50,7 +50,8 @@ class Book(BaseModel): Book model """ def __repr__(self): - return u'' % (str(self.id), self.name, self.publisher) + return u'' % ( + str(self.id), self.name, self.publisher) class Song(BaseModel): """ From e195f0ffb7b85d5ff281c5315e280b4aa8c48fbb Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Wed, 26 May 2010 00:47:26 +0100 Subject: [PATCH 71/81] Match method and overridden method arguments and cleanups --- openlp/plugins/bibles/lib/http.py | 12 ++++--- .../songs/forms/songmaintenanceform.py | 36 ++++++++++--------- openlp/plugins/songs/lib/mediaitem.py | 9 ++--- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 37d42f833..6cb7fe75b 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -418,12 +418,13 @@ class HTTPBible(BibleDB): Receiver.send_message(u'bibles_nobook') return [] db_book = self.create_book(book_details[u'name'], - book_details[u'abbreviation'], book_details[u'testament_id']) + book_details[u'abbreviation'], + book_details[u'testament_id']) book = db_book.name if BibleDB.get_verse_count(self, book, reference[1]) == 0: Receiver.send_message(u'bibles_showprogress') Receiver.send_message(u'openlp_process_events') - search_results = self.get_chapter(self.name, book, reference[1]) + search_results = self.get_chapter(book, reference[1]) if search_results and search_results.has_verselist(): ## We have found a book of the bible lets check to see ## if it was there. By reusing the returned book name @@ -433,18 +434,19 @@ class HTTPBible(BibleDB): Receiver.send_message(u'openlp_process_events') # check to see if book/chapter exists db_book = self.get_book(bookname) - self.create_chapter(db_book.id, search_results.get_chapter(), + self.create_chapter(db_book.id, + search_results.get_chapter(), search_results.get_verselist()) Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'bibles_hideprogress') Receiver.send_message(u'openlp_process_events') return BibleDB.get_verses(self, reference_list) - def get_chapter(self, version, book, chapter): + def get_chapter(self, book, chapter): """ Receive the request and call the relevant handler methods """ - log.debug(u'get_chapter %s, %s, %s', version, book, chapter) + log.debug(u'get_chapter %s, %s', book, chapter) log.debug(u'source = %s', self.download_source) try: if self.download_source.lower() == u'crosswalk': diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py index e3979fa75..1ea1d7f43 100644 --- a/openlp/plugins/songs/forms/songmaintenanceform.py +++ b/openlp/plugins/songs/forms/songmaintenanceform.py @@ -129,39 +129,41 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): self.authorform.setAutoDisplayName(True) if self.authorform.exec_(): author = Author.populate( - first_name=unicode(self.authorform.FirstNameEdit.text(), u'utf-8'), - last_name=unicode(self.authorform.LastNameEdit.text(), u'utf-8'), - display_name=unicode(self.authorform.DisplayEdit.text(), u'utf-8')) + first_name=unicode( + self.authorform.FirstNameEdit.text(), u'utf-8'), + last_name=unicode( + self.authorform.LastNameEdit.text(), u'utf-8'), + display_name=unicode( + self.authorform.DisplayEdit.text(), u'utf-8')) if self.songmanager.save_author(author): self.resetAuthors() else: QtGui.QMessageBox.critical( self, self.trUtf8('Error'), - self.trUtf8('Couldn\'t add your author.'), - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.trUtf8('Couldn\'t add your author.')) def onTopicAddButtonClick(self): if self.topicform.exec_(): - topic = Topic.populate(name=unicode(self.topicform.NameEdit.text(), u'utf-8')) + topic = Topic.populate( + name=unicode(self.topicform.NameEdit.text(), u'utf-8')) if self.songmanager.save_topic(topic): self.resetTopics() else: QtGui.QMessageBox.critical( self, self.trUtf8('Error'), - self.trUtf8('Couldn\'t add your topic.'), - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.trUtf8('Couldn\'t add your topic.')) def onBookAddButtonClick(self): if self.bookform.exec_(): - book = Book.populate(name=unicode(self.bookform.NameEdit.text(), u'utf-8'), + book = Book.populate( + name=unicode(self.bookform.NameEdit.text(), u'utf-8'), publisher=unicode(self.bookform.PublisherEdit.text(), u'utf-8')) if self.songmanager.save_book(book): self.resetBooks() else: QtGui.QMessageBox.critical( self, self.trUtf8('Error'), - self.trUtf8('Couldn\'t add your book.'), - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.trUtf8('Couldn\'t add your book.')) def onAuthorEditButtonClick(self): author_id = self._getCurrentItemId(self.AuthorsListWidget) @@ -172,16 +174,18 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): self.authorform.LastNameEdit.setText(author.last_name) self.authorform.DisplayEdit.setText(author.display_name) if self.authorform.exec_(False): - author.first_name = unicode(self.authorform.FirstNameEdit.text(), u'utf-8') - author.last_name = unicode(self.authorform.LastNameEdit.text(), u'utf-8') - author.display_name = unicode(self.authorform.DisplayEdit.text(), u'utf-8') + author.first_name = unicode( + self.authorform.FirstNameEdit.text(), u'utf-8') + author.last_name = unicode( + self.authorform.LastNameEdit.text(), u'utf-8') + author.display_name = unicode( + self.authorform.DisplayEdit.text(), u'utf-8') if self.songmanager.save_author(author): self.resetAuthors() else: QtGui.QMessageBox.critical( self, self.trUtf8('Error'), - self.trUtf8('Couldn\'t save your author.'), - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + self.trUtf8('Couldn\'t save your author.')) def onTopicEditButtonClick(self): topic_id = self._getCurrentItemId(self.TopicsListWidget) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 2bf72e9b9..6bcfa9f68 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -270,7 +270,7 @@ class SongMediaItem(MediaManagerItem): self.edit_song_form.loadSong(fields[1], (fields[0] == u'P')) self.edit_song_form.exec_() - def onEditClick(self, preview=False): + def onEditClick(self): item = self.ListView.currentItem() if item: item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] @@ -283,7 +283,8 @@ class SongMediaItem(MediaManagerItem): if len(items) == 1: del_message = self.trUtf8('Delete song?') else: - del_message = unicode(self.trUtf8('Delete %d songs?')) % len(items) + del_message = unicode( + self.trUtf8('Delete %d songs?')) % len(items) ans = QtGui.QMessageBox.question(self, self.trUtf8('Delete Confirmation'), del_message, QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok| @@ -323,7 +324,8 @@ class SongMediaItem(MediaManagerItem): #no verse list or only 1 space (in error) if not song.verse_order or not song.verse_order.strip(): for verse in verseList: - verseTag = u'%s:%s' % (verse[0][u'type'], verse[0][u'label']) + verseTag = u'%s:%s' % ( + verse[0][u'type'], verse[0][u'label']) service_item.add_from_text(\ verse[1][:30], unicode(verse[1]), verseTag) else: @@ -372,4 +374,3 @@ class SongMediaItem(MediaManagerItem): ] return True - From 15038a918490f6896140c405210d17b04f15f6a9 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Wed, 26 May 2010 16:52:33 +0100 Subject: [PATCH 72/81] More cleanups --- openlp/plugins/bibles/lib/common.py | 4 +- .../presentations/presentationplugin.py | 8 +-- openlp/plugins/remotes/lib/httpserver.py | 13 ++-- openlp/plugins/songs/lib/songimport.py | 4 +- openlp/plugins/songs/lib/songxml.py | 69 +++++++++---------- 5 files changed, 50 insertions(+), 48 deletions(-) diff --git a/openlp/plugins/bibles/lib/common.py b/openlp/plugins/bibles/lib/common.py index 48e55cb7e..94d83ce3d 100644 --- a/openlp/plugins/bibles/lib/common.py +++ b/openlp/plugins/bibles/lib/common.py @@ -257,8 +257,8 @@ def unescape(text): @param text The HTML (or XML) source text. @return The plain text, as a Unicode string, if necessary. """ - def fixup(m): - text = m.group(0) + def fixup(markup): + text = markup.group(0) if text[:2] == u'&#': # character reference try: diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index dd1a5259b..f57235c9b 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -95,10 +95,9 @@ class PresentationPlugin(Plugin): log.debug(u'Importing controller %s', modulename) try: __import__(modulename, globals(), locals(), []) - except ImportError, e: - log.error( - u'Failed to import %s on path %s for reason %s', - modulename, path, e.args[0]) + except ImportError: + log.exception(u'Failed to import %s on path %s', + modulename, path) controller_classes = PresentationController.__subclasses__() for controller_class in controller_classes: controller = controller_class(self) @@ -114,3 +113,4 @@ class PresentationPlugin(Plugin): 'programs. The choice of available presentation programs is ' 'available to the user in a drop down box.') return about_text + diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 3c87346cd..0ac21b924 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -206,14 +206,17 @@ class HttpConnection(object): mimetype = u'image/png' else: return (None, None) + file_handle = None try: - f = open(path, u'rb') - except: + file_handle = open(path, u'rb') + log.debug(u'Opened %s' % path) + html = file_handle.read() + except IOError: log.exception(u'Failed to open %s' % path) return None - log.debug(u'Opened %s' % path) - html = f.read() - f.close() + finally: + if file_handle: + file_handle.close() return (mimetype, html) def load_params(self, query): diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index 58e3a4df7..08f39954e 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -265,8 +265,8 @@ class SongImport(object): """ Remove punctuation from the string for searchable fields """ - for c in string.punctuation: - text = text.replace(c, u'') + for character in string.punctuation: + text = text.replace(character, u'') return text def finish(self): diff --git a/openlp/plugins/songs/lib/songxml.py b/openlp/plugins/songs/lib/songxml.py index 8789b379d..0979eb2b8 100644 --- a/openlp/plugins/songs/lib/songxml.py +++ b/openlp/plugins/songs/lib/songxml.py @@ -75,7 +75,7 @@ _blankOpenSongXml = \ ''' class _OpenSong(XmlRootClass): - """Class for import of OpenSogn""" + """Class for import of OpenSong""" def __init__(self, xmlContent = None): """Initialize from given xml content""" @@ -113,8 +113,7 @@ class _OpenSong(XmlRootClass): res.append(self.theme) if self.alttheme: res.append(self.alttheme) - s = u', u'.join(res) - return s + return u', u'.join(res) def _reorder_verse(self, tag, tmpVerse): """ @@ -123,28 +122,28 @@ class _OpenSong(XmlRootClass): tmpVerse -- list of strings """ res = [] - for c in '1234567890 ': + for digit in '1234567890 ': tagPending = True - for l in tmpVerse: - if l.startswith(c): + for line in tmpVerse: + if line.startswith(digit): if tagPending: tagPending = False - t = tag.strip(u'[]').lower() - if 'v' == t: + tagChar = tag.strip(u'[]').lower() + if 'v' == tagChar: newtag = "Verse" - elif 'c' == t: + elif 'c' == tagChar: newtag = "Chorus" - elif 'b' == t: + elif 'b' == tagChar: newtag = "Bridge" - elif 'p' == t: + elif 'p' == tagChar: newtag = "Pre-chorus" else: - newtag = t - s = (u'# %s %s' % (newtag, c)).rstrip() - res.append(s) - res.append(l[1:]) - if (len(l) == 0) and (not tagPending): - res.append(l) + newtag = tagChar + tagString = (u'# %s %s' % (newtag, digit)).rstrip() + res.append(tagString) + res.append(line[1:]) + if (len(line) == 0) and (not tagPending): + res.append(line) return res def get_lyrics(self): @@ -165,13 +164,13 @@ class _OpenSong(XmlRootClass): if line.startswith(u'['): tag = line else: - r = self._reorder_verse(tag, tmpVerse) - finalLyrics.extend(r) + reorderedVerse = self._reorder_verse(tag, tmpVerse) + finalLyrics.extend(reorderedVerse) tag = "" tmpVerse = [] # catch up final verse - r = self._reorder_verse(tag, tmpVerse) - finalLyrics.extend(r) + reorderedVerse = self._reorder_verse(tag, tmpVerse) + finalLyrics.extend(reorderedVerse) return finalLyrics @@ -344,36 +343,36 @@ class Song(object): sCopyright = "" sCcli = "" lastpart = 0 - n = 0 + lineCount = 0 metMisc = False lyrics = [] - for l in textList: - n += 1 + for line in textList: + lineCount += 1 if lastpart > 0: lastpart += 1 if lastpart == 2: - sCopyright = l[1:].strip() + sCopyright = line[1:].strip() if lastpart == 3: - sAuthor = l - elif l.startswith(u'CCLI Song'): - sCcli = l[13:].strip() + sAuthor = line + elif line.startswith(u'CCLI Song'): + sCcli = line[13:].strip() lastpart = 1 else: if metMisc: metMisc = False - if l.upper().startswith(u'(BRIDGE)'): + if line.upper().startswith(u'(BRIDGE)'): lyrics.append(u'# Bridge') # otherwise unknown misc keyword - elif l.startswith(u'Misc'): + elif line.startswith(u'Misc'): metMisc = True - elif l.startswith(u'Verse') or l.startswith(u'Chorus'): - lyrics.append(u'# %s'%l) + elif line.startswith(u'Verse') or line.startswith(u'Chorus'): + lyrics.append(u'# %s' % line) else: # should we remove multiple blank lines? - if n == 1: - sName = l + if lineCount == 1: + sName = line else: - lyrics.append(l) + lyrics.append(line) # split on known separators lst = sAuthor.split(u'/') if len(lst) < 2: From 48446a8312eb08a2317a91d47be00d09b0ac8747 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Wed, 26 May 2010 17:01:45 +0100 Subject: [PATCH 73/81] log.error checking --- openlp/core/lib/__init__.py | 2 +- openlp/core/lib/serviceitem.py | 12 ++++++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index e5f45b188..b243110dc 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -68,7 +68,7 @@ def get_text_file_string(text_file): file_handle = open(text_file, u'r') content_string = file_handle.read() except IOError: - log.error(u'Failed to open text file %s' % text_file) + log.exception(u'Failed to open text file %s' % text_file) finally: if file_handle: file_handle.close() diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index f246d9b90..9fe7ac060 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -125,8 +125,9 @@ class ServiceItem(object): if title == u'': title = line lines += line + u'\n' - self._display_frames.append({u'title': title, \ - u'text': lines.rstrip(), u'verseTag': slide[u'verseTag'] }) + self._display_frames.append({u'title': title, + u'text': lines.rstrip(), + u'verseTag': slide[u'verseTag'] }) self.cache.insert(len(self._display_frames), None) log.log(15, u'Formatting took %4s' % (time.time() - before)) elif self.service_item_type == ServiceItemType.Image: @@ -239,7 +240,8 @@ class ServiceItem(object): service_data.append(slide[u'title']) elif self.service_item_type == ServiceItemType.Command: for slide in self._raw_frames: - service_data.append({u'title':slide[u'title'], u'image':slide[u'image']}) + service_data.append( + {u'title':slide[u'title'], u'image':slide[u'image']}) return {u'header': service_header, u'data': service_data} def set_from_service(self, serviceitem, path=None): @@ -276,7 +278,8 @@ class ServiceItem(object): elif self.service_item_type == ServiceItemType.Command: 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'] ) + self.add_from_command( + path, text_image[u'title'], text_image[u'image'] ) def merge(self, other): """ @@ -343,3 +346,4 @@ class ServiceItem(object): Returns the title of the raw frame """ return self._raw_frames[row][u'path'] + From 407d887f2a6a6e2cd9d856ffac99a4e68bea17ff Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Wed, 26 May 2010 21:30:20 +0200 Subject: [PATCH 74/81] - Complete the help text. - Modify for running from the "scripts" directory. --- resources/pyinstaller/windows-builder.py | 50 ++++++++++++++++-------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/resources/pyinstaller/windows-builder.py b/resources/pyinstaller/windows-builder.py index 42592768a..42dd90bf4 100644 --- a/resources/pyinstaller/windows-builder.py +++ b/resources/pyinstaller/windows-builder.py @@ -28,11 +28,29 @@ Windows Build Script -------------------- This script is used to build the Windows binary and the accompanying installer. +For this script to work out of the box, it depends on a number of things: + +windows-builder.py + This script, of course. It should be in the "scripts" directory of OpenLP. + +Bazaar + You need the command line "bzr" client installed. + +OpenLP + A checkout of the latest code, in a branch directory, which is in a Bazaar + shared repository directory. This means your code should be in a directory + structure like this: "openlp\branch-name". + + You can + +PyInstaller + PyInstaller should be a checkout of trunk, and in a directory called, + "pyinstaller" on the same level as OpenLP's Bazaar shared repository + directory. + +Inno Setup 5 + Inno Setup should be installed into "C:\%PROGRAMFILES%\Inno Setup 5" -For this script to work out of the box, it depends on being inside the -"resources/pyinstaller" directory in the OpenLP source tree, it depends on -OpenLP having it's own project directory which all the branches live in, and it -depends on PyInstaller being """ import os @@ -40,12 +58,12 @@ from shutil import copy from subprocess import Popen, PIPE script_path = os.path.split(os.path.abspath(__file__))[0] -pyinstaller_path = os.path.abspath(os.path.join(script_path, u'..', u'..', u'..', u'..', u'pyinstaller')) -innosetup_path = os.path.join(os.getenv(u'PROGRAMFILES'), 'Inno Setup 5') -iss_path = os.path.abspath(os.path.join(script_path, u'..', u'innosetup')) -branch_path = os.path.abspath(os.path.join(script_path, u'..', u'..')) +branch_path = os.path.abspath(os.path.join(script_path, u'..')) source_path = os.path.join(branch_path, u'openlp') dist_path = os.path.join(branch_path, u'dist', u'OpenLP') +pyinstaller_path = os.path.abspath(os.path.join(branch_path, u'..', u'pyinstaller')) +innosetup_path = os.path.join(os.getenv(u'PROGRAMFILES'), 'Inno Setup 5') +iss_path = os.path.join(branch_path, u'resources', u'innosetup') def run_pyinstaller(): @@ -113,17 +131,17 @@ def run_innosetup(): def main(): print "Script path:", script_path - print "PyInstaller path:", pyinstaller_path - print "Inno Setup path:", innosetup_path - print "ISS file path:", iss_path print "Branch path:", branch_path print "Source path:", source_path print "\"dist\" path:", dist_path - run_pyinstaller() - write_version_file() - copy_plugins() - copy_windows_files() - run_innosetup() + print "PyInstaller path:", pyinstaller_path + print "Inno Setup path:", innosetup_path + print "ISS file path:", iss_path + #run_pyinstaller() + #write_version_file() + #copy_plugins() + #copy_windows_files() + #run_innosetup() print "Done." if __name__ == u'__main__': From eaa0bf05e260e00aae998ffd2290934eb15c0d2f Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Wed, 26 May 2010 21:31:19 +0200 Subject: [PATCH 75/81] Moved the windows-builder.py script to the scripts directory. --- {resources/pyinstaller => scripts}/windows-builder.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {resources/pyinstaller => scripts}/windows-builder.py (100%) diff --git a/resources/pyinstaller/windows-builder.py b/scripts/windows-builder.py similarity index 100% rename from resources/pyinstaller/windows-builder.py rename to scripts/windows-builder.py From 5e1c8883e468f10c5fbafef832d4f67d314f5f44 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Wed, 26 May 2010 22:26:21 +0200 Subject: [PATCH 76/81] Added some more documentation. --- scripts/windows-builder.py | 49 +++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 17 deletions(-) diff --git a/scripts/windows-builder.py b/scripts/windows-builder.py index 42dd90bf4..aeef8c663 100644 --- a/scripts/windows-builder.py +++ b/scripts/windows-builder.py @@ -30,8 +30,30 @@ Windows Build Script This script is used to build the Windows binary and the accompanying installer. For this script to work out of the box, it depends on a number of things: -windows-builder.py - This script, of course. It should be in the "scripts" directory of OpenLP. +Inno Setup 5 + Inno Setup should be installed into "C:\%PROGRAMFILES%\Inno Setup 5" + +UPX + This is used to compress DLLs and EXEs so that they take up less space, but + still function exactly the same. To install UPS, download it from + http://upx.sourceforge.net/, extract it into C:\%PROGRAMFILES%\UPX, and then + add that directory to your PATH environment variable. + +PyInstaller + PyInstaller should be a checkout of trunk, and in a directory called, + "pyinstaller" on the same level as OpenLP's Bazaar shared repository + directory. + + To install PyInstaller, first checkout trunk from Subversion. The easiest + way is to install TortoiseSVN and then checkout the following URL to a + directory called "pyinstaller":: + + http://svn.pyinstaller.org/trunk + + Once you've done that, open a command prompt (DOS shell), navigate to the + PyInstaller directory and run:: + + C:\Projects\pyinstaller>python Configure.py Bazaar You need the command line "bzr" client installed. @@ -41,15 +63,8 @@ OpenLP shared repository directory. This means your code should be in a directory structure like this: "openlp\branch-name". - You can - -PyInstaller - PyInstaller should be a checkout of trunk, and in a directory called, - "pyinstaller" on the same level as OpenLP's Bazaar shared repository - directory. - -Inno Setup 5 - Inno Setup should be installed into "C:\%PROGRAMFILES%\Inno Setup 5" +windows-builder.py + This script, of course. It should be in the "scripts" directory of OpenLP. """ @@ -61,7 +76,7 @@ script_path = os.path.split(os.path.abspath(__file__))[0] branch_path = os.path.abspath(os.path.join(script_path, u'..')) source_path = os.path.join(branch_path, u'openlp') dist_path = os.path.join(branch_path, u'dist', u'OpenLP') -pyinstaller_path = os.path.abspath(os.path.join(branch_path, u'..', u'pyinstaller')) +pyinstaller_path = os.path.abspath(os.path.join(branch_path, u'..', u'..', u'pyinstaller')) innosetup_path = os.path.join(os.getenv(u'PROGRAMFILES'), 'Inno Setup 5') iss_path = os.path.join(branch_path, u'resources', u'innosetup') @@ -137,11 +152,11 @@ def main(): print "PyInstaller path:", pyinstaller_path print "Inno Setup path:", innosetup_path print "ISS file path:", iss_path - #run_pyinstaller() - #write_version_file() - #copy_plugins() - #copy_windows_files() - #run_innosetup() + run_pyinstaller() + write_version_file() + copy_plugins() + copy_windows_files() + run_innosetup() print "Done." if __name__ == u'__main__': From a1273aefe50d718756807b407e0a6668a38ef392 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Wed, 26 May 2010 22:27:03 +0200 Subject: [PATCH 77/81] Fixed rst. --- scripts/windows-builder.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/windows-builder.py b/scripts/windows-builder.py index aeef8c663..54b31531e 100644 --- a/scripts/windows-builder.py +++ b/scripts/windows-builder.py @@ -48,12 +48,12 @@ PyInstaller way is to install TortoiseSVN and then checkout the following URL to a directory called "pyinstaller":: - http://svn.pyinstaller.org/trunk + http://svn.pyinstaller.org/trunk Once you've done that, open a command prompt (DOS shell), navigate to the PyInstaller directory and run:: - C:\Projects\pyinstaller>python Configure.py + C:\Projects\pyinstaller>python Configure.py Bazaar You need the command line "bzr" client installed. From dfd53e562839c5beb9993d085c613a503df2bf31 Mon Sep 17 00:00:00 2001 From: andreas Date: Thu, 27 May 2010 18:13:25 +0200 Subject: [PATCH 78/81] - footer now displays both bible versions/copyright information (dual bible view) - small fix --- openlp/plugins/bibles/lib/mediaitem.py | 28 ++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 9f0a8e00d..07186544c 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -463,7 +463,19 @@ class BibleMediaItem(MediaManagerItem): bible2_verses.extend(self.parent.manager.get_verses(bible2, scripture)) bible2_version = self.parent.manager.get_meta_data(bible2, u'Version') bible2_copyright = self.parent.manager.get_meta_data(bible2, u'Copyright') - bible2_permission = self.parent.manager.get_meta_data(bible2, u'Permission') + bible2_permission = self.parent.manager.get_meta_data(bible2, u'Permissions') + if bible2_version: + bible2_version = bible2_version.value + else: + bible2_version = u'' + if bible2_copyright: + bible2_copyright = bible2_copyright.value + else: + bible2_copyright = u'' + if bible2_permission: + bible2_permission = bible2_permission.value + else: + bible2_permission = u'' # Let's loop through the main lot, and assemble our verses for item in items: bitem = self.ListView.item(item.row()) @@ -487,13 +499,17 @@ class BibleMediaItem(MediaManagerItem): else: verse_text = self.formatVerse(old_chapter, chapter, verse, u'', u'') old_chapter = chapter - footer = u'%s (%s %s)' % (book, version, copyright) - #If not found add to footer + footer = u'%s' % (book) + #If not found add book to footer + if footer not in raw_footer: + raw_footer.append(footer) + footer = u'%s %s' % (version, copyright) + #If not found add version and copyright to footer if footer not in raw_footer: raw_footer.append(footer) if bible2: - footer = u'%s (%s %s)' % (book, version, copyright) - #If not found add to footer + footer = u'%s %s' % (bible2_version, bible2_copyright) + #If not found add second version and copyright to footer if footer not in raw_footer: raw_footer.append(footer) bible_text = u'%s %s \n\n %s %s' % \ @@ -580,7 +596,7 @@ class BibleMediaItem(MediaManagerItem): def displayResults(self, bible): version = self.parent.manager.get_meta_data(bible, u'Version') copyright = self.parent.manager.get_meta_data(bible, u'Copyright') - permission = self.parent.manager.get_meta_data(bible, u'Permission') + permission = self.parent.manager.get_meta_data(bible, u'Permissions') if not permission: permission = u'' else: From 039792104b9f4f6dfc82d49ac9ff1e371faa2769 Mon Sep 17 00:00:00 2001 From: andreas Date: Thu, 27 May 2010 18:58:00 +0200 Subject: [PATCH 79/81] - again changes done to the bible footer --- openlp/plugins/bibles/lib/mediaitem.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 07186544c..469d53640 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -499,16 +499,12 @@ class BibleMediaItem(MediaManagerItem): else: verse_text = self.formatVerse(old_chapter, chapter, verse, u'', u'') old_chapter = chapter - footer = u'%s' % (book) - #If not found add book to footer - if footer not in raw_footer: - raw_footer.append(footer) - footer = u'%s %s' % (version, copyright) - #If not found add version and copyright to footer + footer = u'%s (%s %s)' % (book, version, copyright) + #If not found add to footer if footer not in raw_footer: raw_footer.append(footer) if bible2: - footer = u'%s %s' % (bible2_version, bible2_copyright) + footer = u'%s (%s %s)' % (book, bible2_version, bible2_copyright) #If not found add second version and copyright to footer if footer not in raw_footer: raw_footer.append(footer) From 8287f4ea276792555c0aec8c4a718e7c93a4f548 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 27 May 2010 22:32:02 +0200 Subject: [PATCH 80/81] Further updated the Windows build script documentation. --- scripts/windows-builder.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/windows-builder.py b/scripts/windows-builder.py index 54b31531e..caf19f53d 100644 --- a/scripts/windows-builder.py +++ b/scripts/windows-builder.py @@ -50,6 +50,10 @@ PyInstaller http://svn.pyinstaller.org/trunk + Then you need to copy the two hook-*.py files from the "pyinstaller" + subdirectory in OpenLP's "resources" directory into PyInstaller's "hooks" + directory. + Once you've done that, open a command prompt (DOS shell), navigate to the PyInstaller directory and run:: From e2f39860ec1df108c674404266df698053700b16 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 27 May 2010 22:36:04 +0200 Subject: [PATCH 81/81] No longer need the lxml.objectify hook, this is in PyInstaller 1.4. --- resources/pyinstaller/hook-lxml.objectify.py | 1 - 1 file changed, 1 deletion(-) delete mode 100644 resources/pyinstaller/hook-lxml.objectify.py diff --git a/resources/pyinstaller/hook-lxml.objectify.py b/resources/pyinstaller/hook-lxml.objectify.py deleted file mode 100644 index 9d83432df..000000000 --- a/resources/pyinstaller/hook-lxml.objectify.py +++ /dev/null @@ -1 +0,0 @@ -hiddenimports = ['lxml.etree']

    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 IBd?$TFRNd&`Tzg` literal 0 HcmV?d00001 diff --git a/resources/i18n/openlp_ko.qm b/resources/i18n/openlp_ko.qm new file mode 100644 index 0000000000000000000000000000000000000000..5a91048541b8c6c29bfe0edd019360a8936f1ff9 GIT binary patch literal 462 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 H?Be|oD>Q=; literal 0 HcmV?d00001 diff --git a/resources/i18n/openlp_pt_BR.qm b/resources/i18n/openlp_pt_BR.qm new file mode 100644 index 0000000000000000000000000000000000000000..47d0b78c8865880e9961adf106de12ed8bbc3ff5 GIT binary patch literal 35931 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 literal 0 HcmV?d00001 diff --git a/resources/i18n/openlp_sv.qm b/resources/i18n/openlp_sv.qm new file mode 100644 index 0000000000000000000000000000000000000000..cd3485ece4368db4359f7bbd5bd3df2cf0ccf488 GIT binary patch literal 37049 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 De-u-% literal 0 HcmV?d00001 diff --git a/scripts/generate_pro.py b/scripts/translation_utils.py similarity index 62% rename from scripts/generate_pro.py rename to scripts/translation_utils.py index 3b3cff17f..edc61f5d6 100755 --- a/scripts/generate_pro.py +++ b/scripts/translation_utils.py @@ -36,10 +36,26 @@ ############################################################################### import os +from optparse import OptionParser +import urllib +from PyQt4 import QtCore ignore_pathes = ["./scripts", "./openlp/core/test"] ignore_files = ["setup.py"] - +translation_path = "http://pootle.projecthq.biz/export/openlp/" +translations = [ "af" + , "en_ZA" + , "en_GB" + , "de" + , "hu" + , "ko" + , "nb" + , "pt_BR" + , "es" + , "sv"] + + + def write_file(filename, stringlist): content = u'' for line in stringlist: @@ -49,6 +65,48 @@ def write_file(filename, stringlist): file.close() def main(): + # Set up command line options. + usage = u'Usage: %prog [options]' + parser = OptionParser(usage=usage) + parser.add_option("-d", "--download-ts", action="store_true", dest="download", + help="Load languages from Pootle Server") + parser.add_option("-p", "--prepare", action="store_true", dest="prepare", + help="preparation (generate pro file)") + parser.add_option("-u", "--update", action="store_true", dest="update", + help="update translation files") + parser.add_option("-g", "--generate", action="store_true", dest="generate", + help="generate qm files") + parser.add_option("-a", "--all", action="store_true", dest="all", + help="proceed all options") + + (options, args) = parser.parse_args() + qt_args = [] + if options.download: + downloadTranslations() + elif options.prepare: + preparation() + elif options.update: + update() + elif options.generate: + generate() + elif options.all: + all() + else: + pass + +def downloadTranslations(): + print "download()" + for language in translations: + filename = os.path.join('..','resources', 'i18n', "openlp_%s.ts" % language) + print filename + page = urllib.urlopen("%s%s.ts" % (translation_path, language)) + content = page.read().decode("utf8") + page.close() + file = open(filename, u'w') + file.write(content.encode('utf8')) + file.close() + +def preparation(): stringlist = [] start_dir = os.path.join(u'..') for root, dirs, files in os.walk(start_dir): @@ -73,10 +131,6 @@ def main(): if cond == True: continue -# if file.endswith(u'.ui'): -# line = "%s/%s" % (path, file) -# print u'Parsing "%s"' % line -# stringlist.append("FORMS += %s" % line) if file.endswith(u'.py'): line = "%s/%s" % (path, file) print u'Parsing "%s"' % line @@ -95,6 +149,27 @@ def main(): write_file(os.path.join(start_dir, u'openlp.pro'), stringlist) print u'done.' + +def update(): + print "update()" + updateProcess = QtCore.QProcess() + updateProcess.start("pylupdate4 -noobsolete ../openlp.pro") + updateProcess.waitForFinished(60000) + +def generate(): + print "generate()" + generateProcess = QtCore.QProcess() + generateProcess.start("lrelease ../openlp.pro") + generateProcess.waitForFinished(60000) + +def all(): + print "all()" + downloadTranslations() + preparation() + update() + generate() + + if __name__ == u'__main__': if os.path.split(os.path.abspath(u'.'))[1] != u'scripts': print u'You need to run this script from the scripts directory.' From fe66e37a5755eae87d268d3183ea608858f5af4f Mon Sep 17 00:00:00 2001 From: rimach Date: Mon, 19 Apr 2010 21:12:34 +0200 Subject: [PATCH 11/81] corrections --- openlp.pyw | 6 +- openlp/core/ui/mainwindow.py | 14 +- openlp/core/utils/languagemanager.py | 50 +- resources/i18n/openlp_en.ts | 4848 ++++++++++++++++++++++++++ 4 files changed, 4884 insertions(+), 34 deletions(-) create mode 100644 resources/i18n/openlp_en.ts diff --git a/openlp.pyw b/openlp.pyw index 23c056c02..0dd2b62a8 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -194,8 +194,8 @@ def main(): # Now create and actually run the application. app = OpenLP(qt_args) #i18n Set Language - language = LanguageManager.getLanguage() - appTranslator = LanguageManager.getTranslator(language) + language = LanguageManager.get_language() + appTranslator = LanguageManager.get_translator(language) app.installTranslator(appTranslator) sys.exit(app.run()) @@ -204,4 +204,4 @@ if __name__ == u'__main__': """ Instantiate and run the application. """ - main() + main() \ No newline at end of file diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 99021deb4..c52c62fcd 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -262,14 +262,14 @@ class Ui_MainWindow(object): self.AutoLanguageItem.setObjectName(u'AutoLanguageItem') self.AutoLanguageItem.setCheckable(True) self.LanguageGroup = QtGui.QActionGroup(MainWindow) - qmList = LanguageManager.getQmList() - savedLanguage = LanguageManager.getLanguage() + qmList = LanguageManager.get_qm_list() + savedLanguage = LanguageManager.get_language() self.LanguageItem = {} for key in qmList.keys(): self.LanguageItem[key] = QtGui.QAction(MainWindow) self.LanguageItem[key].setObjectName(key) self.LanguageItem[key].setCheckable(True) - if LanguageManager.__AutoLanguage__ == True: + if LanguageManager.AutoLanguage: self.AutoLanguageItem.setChecked(True) self.LanguageGroup.setEnabled(False) else: @@ -537,7 +537,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.QObject.connect(self.AutoLanguageItem, QtCore.SIGNAL(u'toggled(bool)'), self.setAutoLanguage) - self.LanguageGroup.triggered.connect(LanguageManager.setLanguage) + self.LanguageGroup.triggered.connect(LanguageManager.set_language) #warning cyclic dependency #RenderManager needs to call ThemeManager and #ThemeManager needs to call RenderManager @@ -582,8 +582,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): #i18n def setAutoLanguage(self, value): self.LanguageGroup.setEnabled(not value) - LanguageManager.__AutoLanguage__ = value - LanguageManager.setLanguage(self.LanguageGroup.checkedAction()) + LanguageManager.AutoLanguage = value + LanguageManager.set_language(self.LanguageGroup.checkedAction()) def versionCheck(self, version): """ @@ -743,4 +743,4 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): def togglePreviewPanel(self): previewBool = self.PreviewController.Panel.isVisible() self.PreviewController.Panel.setVisible(not previewBool) - self.settingsmanager.togglePreviewPanel(not previewBool) + self.settingsmanager.togglePreviewPanel(not previewBool) \ No newline at end of file diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py index 7f2b92fcf..81e885070 100644 --- a/openlp/core/utils/languagemanager.py +++ b/openlp/core/utils/languagemanager.py @@ -25,22 +25,23 @@ import logging +from logging import FileHandler from PyQt4 import QtCore, QtGui import os from openlp.core.utils import AppLocation, ConfigHelper -#from openlp.core.ui import MainWindow -#import i18n_rc + +log = logging.getLogger() class LanguageManager(object): """ Helper for Language selection """ __qmList__ = None - __AutoLanguage__ = None + AutoLanguage = False @staticmethod - def getTranslator(language): - if LanguageManager.__AutoLanguage__ is True: + def get_translator(language): + if LanguageManager.AutoLanguage : language = QtCore.QLocale.system().name() lang_Path = AppLocation.get_directory(AppLocation.AppDir) lang_Path = os.path.join(lang_Path, u'resources', u'i18n') @@ -49,7 +50,7 @@ class LanguageManager(object): return appTranslator @staticmethod - def findQmFiles(): + def find_qm_files(): trans_dir = AppLocation.get_directory(AppLocation.AppDir) trans_dir = QtCore.QDir(os.path.join(trans_dir, u'resources', u'i18n')) fileNames = trans_dir.entryList(QtCore.QStringList("*.qm"), @@ -59,48 +60,49 @@ class LanguageManager(object): return fileNames @staticmethod - def languageName(qmFile): + def language_name(qmFile): translator = QtCore.QTranslator() translator.load(qmFile) - return translator.translate(u'MainWindow', u'English') @staticmethod - def getLanguage(): - language = ConfigHelper.get_registry().get_value(u'general', u'language', u'[en]') - print "getLanguage %s" % language + def get_language(): + language = ConfigHelper.get_registry().get_value(u'general', + u'language', u'[en]') + log.info(u'Language file: \'%s\' Loaded from conf file' % language) regEx = QtCore.QRegExp("^\[(.*)\]") if regEx.exactMatch(language): - LanguageManager.__AutoLanguage__ = True + LanguageManager.AutoLanguage = True language = regEx.cap(1) return language @staticmethod - def setLanguage(action): + def set_language(action): actionName = u'%s' % action.objectName() - qmList = LanguageManager.getQmList() - if LanguageManager.__AutoLanguage__ == True: + qmList = LanguageManager.get_qm_list() + if LanguageManager.AutoLanguage : language = u'[%s]' % qmList[actionName] else: language = u'%s' % qmList[actionName] - print "setLanguage: %s" % language + log.info(u'Language file: \'%s\' written to conf file' % language) ConfigHelper.set_config(u'general', u'language', language) QtGui.QMessageBox.information(None, - u'Language', u'After restart new Language settings will be used.') + u'Language', + u'After restart new Language settings will be used.') @staticmethod - def initQmList(): + def init_qm_list(): LanguageManager.__qmList__ = {} - qmFiles = LanguageManager.findQmFiles() + qmFiles = LanguageManager.find_qm_files() for i, qmf in enumerate(qmFiles): regEx = QtCore.QRegExp("^.*openlp_(.*).qm") if regEx.exactMatch(qmf): langName = regEx.cap(1) - LanguageManager.__qmList__[u'%i %s' % (i, LanguageManager.languageName(qmf))] = langName + LanguageManager.__qmList__[u'%i %s' % (i, + LanguageManager.language_name(qmf))] = langName @staticmethod - def getQmList(): + def get_qm_list(): if LanguageManager.__qmList__ == None: - LanguageManager.initQmList() - return LanguageManager.__qmList__ - + LanguageManager.init_qm_list() + return LanguageManager.__qmList__ \ No newline at end of file diff --git a/resources/i18n/openlp_en.ts b/resources/i18n/openlp_en.ts new file mode 100644 index 000000000..1660428e2 --- /dev/null +++ b/resources/i18n/openlp_en.ts @@ -0,0 +1,4848 @@ + + + + + BibleMediaItem + + + Quick + + + + + Ui_customEditDialog + + + Delete selected slide + + + + + BiblesTab + + + ( and ) + + + + + RemoteTab + + + Remotes + + + + + Ui_EditSongDialog + + + &Remove + + + + + Ui_AmendThemeDialog + + + Shadow Size: + + + + + Ui_OpenSongExportDialog + + + Close + + + + + ThemeManager + + + Import Theme + + + + + Ui_AmendThemeDialog + + + Slide Transition + + + + + SongMaintenanceForm + + + Are you sure you want to delete the selected book? + + + + + ThemesTab + + + Theme level + + + + + BibleMediaItem + + + Bible + + + + + ServiceManager + + + Save Changes to Service? + + + + + SongUsagePlugin + + + &Delete recorded data + + + + + Ui_OpenLPExportDialog + + + Song Title + + + + + Ui_customEditDialog + + + Edit selected slide + + + + + SongMediaItem + + + CCLI Licence: + + + + + Ui_BibleImportWizard + + + Bible Import Wizard + + + + + Ui_customEditDialog + + + Edit All + + + + + SongMaintenanceForm + + + Couldn't save your author. + + + + + Ui_ServiceNoteEdit + + + Service Item Notes + + + + + Ui_customEditDialog + + + Add new slide at bottom + + + + + Clear + + + + + ThemesTab + + + Global theme + + + + + PresentationPlugin + + + <b>Presentation Plugin</b> <br> Delivers the ability to show presentations using a number of different programs. The choice of available presentation programs is available to the user in a drop down box. + + + + + SongUsagePlugin + + + Start/Stop live song usage recording + + + + + MainWindow + + + The Main Display has been blanked out + + + + + Ui_OpenSongExportDialog + + + Lyrics + + + + + Ui_AlertDialog + + + Display + + + + + SongMaintenanceForm + + + This author can't be deleted, they are currently assigned to at least one song. + + + + + Ui_customEditDialog + + + Delete + + + + + Ui_EditVerseDialog + + + Verse + + + + + Ui_OpenSongImportDialog + + + OpenSong Folder: + + + + + ThemeManager + + + Create a new theme + + + + + Ui_MainWindow + + + Open an existing service + + + + + SlideController + + + Move to previous + + + + + SongsPlugin + + + &Song + + + + + Ui_PluginViewDialog + + + Plugin Details + + + + + ImportWizardForm + + + You need to specify a file with books of the Bible to use in the import. + + + + + AlertsTab + + + Edit History: + + + + + Ui_MainWindow + + + &File + + + + + BiblesTab + + + verse per line + + + + + Ui_customEditDialog + + + Theme: + + + + + SongMaintenanceForm + + + Couldn't add your book. + + + + + Error + + + + + Ui_BibleImportWizard + + + Bible: + + + + + ThemeManager + + + Delete Theme + + + + + SplashScreen + + + Splash Screen + + + + + SongMediaItem + + + Song + + + + + Ui_OpenSongExportDialog + + + Song Title + + + + + Ui_AmendThemeDialog + + + Bottom + + + + + Ui_MainWindow + + + List the Plugins + + + + + SongMaintenanceForm + + + No author selected! + + + + + SongUsageDeleteForm + + + Delete Selected Song Usage Events? + + + + + SongUsagePlugin + + + <b>SongUsage Plugin</b><br>This plugin records the use of songs and when they have been used during a live service + + + + + Ui_customEditDialog + + + Move slide Up 1 + + + + + SongsPlugin + + + OpenSong + + + + + AlertsManager + + + Alert message created and delayed + + + + + Ui_EditSongDialog + + + Alternative Title: + + + + + ServiceManager + + + Open Service + + + + + BiblesTab + + + Display Style: + + + + + Ui_AmendThemeDialog + + + Image + + + + + EditSongForm + + + You need to enter a song title. + + + + + ThemeManager + + + Error + + + + + Ui_SongUsageDeleteDialog + + + Song Usage Delete + + + + + ImportWizardForm + + + Invalid Bible Location + + + + + BibleMediaItem + + + Book: + + + + + ThemeManager + + + Make Global + + + + + Ui_MainWindow + + + &Service Manager + + + + + Ui_OpenLPImportDialog + + + Author + + + + + Ui_AmendThemeDialog + + + Height: + + + + + ThemeManager + + + Delete a theme + + + + + Ui_BibleImportWizard + + + Crosswalk + + + + + SongBookForm + + + Error + + + + + Ui_AuthorsDialog + + + Last name: + + + + + ThemesTab + + + Use the global theme, overriding any themes associated with either the service or the songs. + + + + + Ui_customEditDialog + + + Title: + + + + + ImportWizardForm + + + You need to set a copyright for your Bible! Bibles in the Public Domain need to be marked as such. + + + + + SongMediaItem + + + Maintain the lists of authors, topics and books + + + + + Ui_AlertEditDialog + + + Save + + + + + EditCustomForm + + + You have unsaved data + + + + + Ui_AmendThemeDialog + + + Outline + + + + + BibleMediaItem + + + Text Search + + + + + Ui_BibleImportWizard + + + CSV + + + + + SongUsagePlugin + + + Delete song usage to specified date + + + + + Ui_SongUsageDetailDialog + + + Report Location + + + + + Ui_BibleImportWizard + + + OpenSong + + + + + Ui_MainWindow + + + Open Service + + + + + BibleMediaItem + + + Find: + + + + + ImageMediaItem + + + Select Image(s) + + + + + BibleMediaItem + + + Search Type: + + + + + Ui_MainWindow + + + Media Manager + + + + + Alt+F4 + + + + + MediaManagerItem + + + &Preview + + + + + GeneralTab + + + CCLI Details + + + + + BibleMediaItem + + + Bible not fully loaded + + + + + Ui_MainWindow + + + Toggle the visibility of the Preview Panel + + + + + ImportWizardForm + + + Bible Exists + + + + + Ui_MainWindow + + + &User Guide + + + + + AlertsTab + + + pt + + + + + Ui_MainWindow + + + Set the interface language to English + + + + + Ui_AmendThemeDialog + + + Main Font + + + + + ImportWizardForm + + + Empty Copyright + + + + + AuthorsForm + + + You need to type in the first name of the author. + + + + + SongsTab + + + Display Verses on Live Tool bar: + + + + + ServiceManager + + + Move to top + + + + + ImageMediaItem + + + Override background + + + + + Ui_SongMaintenanceDialog + + + Edit + + + + + Ui_OpenSongExportDialog + + + Select All + + + + + ThemesTab + + + Use the theme from each song in the database. If a song doesn't have a theme associated with it, then use the service's theme. If the service doesn't have a theme, then use the global theme. + + + + + PresentationMediaItem + + + Presentation + + + + + Ui_AmendThemeDialog + + + Solid Color + + + + + CustomTab + + + Custom + + + + + Ui_OpenLPImportDialog + + + Ready to import + + + + + MainWindow + + + OpenLP version %s has been updated to version %s + +You can obtain the latest version from http://openlp.org + + + + + Ui_BibleImportWizard + + + File Location: + + + + + SlideController + + + Go to Verse + + + + + SongMaintenanceForm + + + Couldn't add your topic. + + + + + Ui_MainWindow + + + &Import + + + + + Quit OpenLP + + + + + Ui_BibleImportWizard + + + 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. + + + + + Ui_OpenLPExportDialog + + + Title + + + + + ImportWizardForm + + + Empty Version Name + + + + + Ui_MainWindow + + + &Preview Panel + + + + + SlideController + + + Start continuous loop + + + + + GeneralTab + + + primary + + + + + Ui_EditSongDialog + + + Add a Theme + + + + + Ui_MainWindow + + + &New + + + + + Ui_customEditDialog + + + Credits: + + + + + Ui_EditSongDialog + + + R&emove + + + + + SlideController + + + Live + + + + + Ui_AmendThemeDialog + + + Font Main + + + + + BiblesTab + + + continuous + + + + + ThemeManager + + + File is not a valid theme. + + + + + GeneralTab + + + Application Startup + + + + + Ui_AmendThemeDialog + + + Use Default Location: + + + + + Ui_OpenSongImportDialog + + + Import + + + + + Ui_AmendThemeDialog + + + Other Options + + + + + Ui_EditSongDialog + + + Verse Order: + + + + + Ui_MainWindow + + + Default Theme: + + + + + Toggle Preview Panel + + + + + SongMediaItem + + + Lyrics + + + + + Ui_OpenLPImportDialog + + + Progress: + + + + + Ui_AmendThemeDialog + + + Shadow + + + + + GeneralTab + + + Select monitor for output display: + + + + + Ui_MainWindow + + + &Settings + + + + + EditSongForm + + + Invalid verse entry - values must be Numeric, I,B,C,T,P,E,O + + + + + Ui_AmendThemeDialog + + + Italics + + + + + ServiceManager + + + Create a new service + + + + + Ui_AmendThemeDialog + + + Background: + + + + + Ui_OpenLPImportDialog + + + openlp.org Song Importer + + + + + Ui_BibleImportWizard + + + Copyright: + + + + + ThemesTab + + + Service level + + + + + BiblesTab + + + [ and ] + + + + + Ui_BibleImportWizard + + + Verse Location: + + + + + MediaManagerItem + + + You must select one or more items + + + + + GeneralTab + + + Application Settings + + + + + ServiceManager + + + Save this service + + + + + ImportWizardForm + + + Open Books CSV file + + + + + GeneralTab + + + SongSelect Username: + + + + + Ui_AmendThemeDialog + + + X Position: + + + + + BibleMediaItem + + + No matching book could be found in this Bible. + + + + + Ui_BibleImportWizard + + + Server: + + + + + Ui_EditVerseDialog + + + Ending + + + + + CustomTab + + + Display Footer: + + + + + ImportWizardForm + + + Invalid OpenSong Bible + + + + + GeneralTab + + + CCLI Number: + + + + + Ui_AmendThemeDialog + + + Center + + + + + ServiceManager + + + Theme: + + + + + AlertEditForm + + + Please save or clear selected item + + + + + Ui_MainWindow + + + &Live + + + + + Ui_AmendThemeDialog + + + <Color2> + + + + + Ui_MainWindow + + + English + + + + + ImageMediaItem + + + You must select one or more items + + + + + Ui_AuthorsDialog + + + First name: + + + + + Ui_OpenLPExportDialog + + + Select openlp.org export filename: + + + + + Ui_BibleImportWizard + + + Permission: + + + + + Ui_OpenSongImportDialog + + + Close + + + + + Ui_SongUsageDetailDialog + + + Song Usage Extraction + + + + + Ui_AmendThemeDialog + + + Opaque + + + + + ImportWizardForm + + + Your Bible import failed. + + + + + SlideController + + + Start playing media + + + + + SongMediaItem + + + Type: + + + + + SongMaintenanceForm + + + This book can't be deleted, it is currently assigned to at least one song. + + + + + Ui_AboutDialog + + + Close + + + + + TopicsForm + + + You need to type in a topic name! + + + + + Ui_OpenSongExportDialog + + + Song Export List + + + + + BibleMediaItem + + + Dual: + + + + + ImageTab + + + sec + + + + + ServiceManager + + + Delete From Service + + + + + GeneralTab + + + Automatically open the last service + + + + + Ui_OpenLPImportDialog + + + Song Import List + + + + + Ui_OpenSongExportDialog + + + Author + + + + + Ui_AmendThemeDialog + + + Outline Color: + + + + + Ui_BibleImportWizard + + + Select Import Source + + + + + Ui_MainWindow + + + F9 + + + + + F8 + + + + + ServiceManager + + + &Change Item Theme + + + + + Ui_SongMaintenanceDialog + + + Topics + + + + + Ui_OpenLPImportDialog + + + Import File Song List + + + + + Ui_customEditDialog + + + Edit Custom Slides + + + + + Ui_BibleImportWizard + + + Set up the Bible's license details. + + + + + Ui_EditVerseDialog + + + Number + + + + + Ui_AmendThemeDialog + + + Alignment + + + + + SongMaintenanceForm + + + Delete Book + + + + + ThemeManager + + + Edit a theme + + + + + Ui_BibleImportWizard + + + BibleGateway + + + + + GeneralTab + + + Preview Next Song from Service Manager + + + + + Ui_EditSongDialog + + + Title && Lyrics + + + + + SongMaintenanceForm + + + No book selected! + + + + + SlideController + + + Move to live + + + + + Ui_EditVerseDialog + + + Other + + + + + Ui_EditSongDialog + + + Theme + + + + + ServiceManager + + + Save Service + + + + + Ui_SongUsageDetailDialog + + + Select Date Range + + + + + Ui_MainWindow + + + Save the current service to disk + + + + + BibleMediaItem + + + Chapter: + + + + + Search + + + + + PresentationTab + + + Available Controllers + + + + + Ui_MainWindow + + + Add &Tool... + + + + + TopicsForm + + + Error + + + + + RemoteTab + + + Remotes Receiver Port + + + + + Ui_MainWindow + + + &View + + + + + Ui_AmendThemeDialog + + + Normal + + + + + Ui_OpenLPExportDialog + + + Close + + + + + Ui_BibleImportWizard + + + Username: + + + + + ThemeManager + + + Edit Theme + + + + + SlideController + + + Preview + + + + + Ui_AlertDialog + + + Alert Message + + + + + ImportWizardForm + + + Finished import. + + + + + GeneralTab + + + Show blank screen warning + + + + + ImportWizardForm + + + You need to specify a file of Bible verses to import. + + + + + AlertsTab + + + Location: + + + + + Ui_EditSongDialog + + + Authors, Topics && Book + + + + + EditSongForm + + + You need to enter some verses. + + + + + Ui_BibleImportWizard + + + Download Options + + + + + BiblePlugin + + + <strong>Bible Plugin</strong><br />This plugin allows bible verses from different sources to be displayed on the screen during the service. + + + + + Ui_EditSongDialog + + + Copyright Information + + + + + Ui_MainWindow + + + &Export + + + + + Ui_AmendThemeDialog + + + Bold + + + + + SongsPlugin + + + Export songs in OpenLP 2.0 format + + + + + MediaManagerItem + + + Load a new + + + + + AlertEditForm + + + Missing data + + + + + SongsPlugin + + + <b>Song Plugin</b> <br>This plugin allows Songs to be managed and displayed.<br> + + + + + Ui_AmendThemeDialog + + + Footer Font + + + + + EditSongForm + + + Invalid verse entry - vX + + + + + ServiceManager + + + OpenLP Service Files (*.osz) + + + + + MediaManagerItem + + + Delete the selected item + + + + + Ui_OpenLPExportDialog + + + Export + + + + + Ui_BibleImportWizard + + + Location: + + + + + BibleMediaItem + + + Keep + + + + + SongUsagePlugin + + + Generate report on Song Usage + + + + + Ui_EditSongDialog + + + Topic + + + + + Ui_MainWindow + + + &Open + + + + + AuthorsForm + + + You haven't set a display name for the author, would you like me to combine the first and last names for you? + + + + + AmendThemeForm + + + Slide Height is %s rows + + + + + Ui_EditSongDialog + + + Lyrics: + + + + + Ui_AboutDialog + + + Project Lead + Raoul "superfly" Snyman + +Developers + Tim "TRB143" Bentley + Jonathan "gushie" Corwin + Michael "cocooncrash" Gorven + Scott "sguerrieri" Guerrieri + Raoul "superfly" Snyman + Maikel Stuivenberg + Martin "mijiti" Thompson + Jon "Meths" Tibble + Carsten "catini" Tingaard + +Testers + Wesley "wrst" Stout + + + + + SongMediaItem + + + Titles + + + + + Ui_OpenLPExportDialog + + + Lyrics + + + + + PresentationMediaItem + + + Present using: + + + + + SongMediaItem + + + Clear + + + + + ServiceManager + + + &Live Verse + + + + + Ui_OpenSongImportDialog + + + Progress: + + + + + Ui_MainWindow + + + Toggle Theme Manager + + + + + Ui_AlertDialog + + + Alert Text: + + + + + Ui_EditSongDialog + + + Edit + + + + + AlertsTab + + + Font Color: + + + + + Ui_AmendThemeDialog + + + Theme Maintenance + + + + + CustomTab + + + Custom Display + + + + + Ui_OpenSongExportDialog + + + Title + + + + + Ui_AmendThemeDialog + + + <Color1> + + + + + Ui_EditSongDialog + + + Authors + + + + + ThemeManager + + + Export Theme + + + + + ImageMediaItem + + + No items selected... + + + + + Ui_SongBookDialog + + + Name: + + + + + Ui_AuthorsDialog + + + Author Maintenance + + + + + Ui_AmendThemeDialog + + + Font Footer + + + + + BiblesTab + + + Verse Display + + + + + Ui_MainWindow + + + &Options + + + + + BibleMediaItem + + + Results: + + + + + Ui_OpenLPExportDialog + + + Full Song List + + + + + ServiceManager + + + Move to &top + + + + + SlideController + + + Move to last + + + + + Ui_OpenLPExportDialog + + + Progress: + + + + + Ui_SongMaintenanceDialog + + + Add + + + + + SongMaintenanceForm + + + Are you sure you want to delete the selected author? + + + + + SongUsagePlugin + + + Song Usage Status + + + + + BibleMediaItem + + + Verse Search + + + + + Ui_SongBookDialog + + + Edit Book + + + + + EditSongForm + + + Save && Preview + + + + + Ui_SongBookDialog + + + Publisher: + + + + + Ui_AmendThemeDialog + + + Font Weight: + + + + + Ui_BibleImportWizard + + + Bible Filename: + + + + + Ui_AmendThemeDialog + + + Transparent + + + + + SongMediaItem + + + Search + + + + + Ui_BibleImportWizard + + + Format: + + + + + Ui_AmendThemeDialog + + + Background + + + + + Ui_BibleImportWizard + + + Importing + + + + + Ui_customEditDialog + + + Edit all slides + + + + + SongsTab + + + Enable search as you type: + + + + + Ui_MainWindow + + + Ctrl+S + + + + + SongMediaItem + + + Authors + + + + + Ui_PluginViewDialog + + + Active + + + + + SongMaintenanceForm + + + Couldn't add your author. + + + + + Ui_MainWindow + + + Ctrl+O + + + + + Ctrl+N + + + + + Ui_AlertEditDialog + + + Edit + + + + + Ui_EditSongDialog + + + Song Editor + + + + + AlertsTab + + + Font + + + + + SlideController + + + Edit and re-preview Song + + + + + Delay between slides in seconds + + + + + MediaManagerItem + + + &Edit + + + + + Ui_AmendThemeDialog + + + Vertical + + + + + Width: + + + + + ThemesTab + + + Global level + + + + + ThemeManager + + + You are unable to delete the default theme. + + + + + BibleMediaItem + + + Version: + + + + + Ui_AboutDialog + + + OpenLP <version> build <revision> - Open Source Lyrics Projection + +OpenLP is free church presentation software, or lyrics projection software, used to display slides of songs, Bible verses, videos, images, and even presentations (if OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. + +Find out more about OpenLP: http://openlp.org/ + +OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. + + + + + SongsPlugin + + + OpenLP 2.0 + + + + + ServiceManager + + + New Service + + + + + Ui_TopicsDialog + + + Topic name: + + + + + Ui_BibleImportWizard + + + License Details + + + + + Ui_AboutDialog + + + License + + + + + OpenSongBible + + + Importing + + + + + Ui_AmendThemeDialog + + + Middle + + + + + Ui_customEditDialog + + + Save + + + + + AlertEditForm + + + Item selected to Edit + + + + + BibleMediaItem + + + From: + + + + + Ui_AmendThemeDialog + + + Shadow Color: + + + + + ServiceManager + + + &Notes + + + + + Ui_MainWindow + + + E&xit + + + + + Ui_OpenLPImportDialog + + + Close + + + + + MainWindow + + + OpenLP Version Updated + + + + + Ui_customEditDialog + + + Replace edited slide + + + + + EditCustomForm + + + You need to enter a title + + + + + ThemeManager + + + Theme Exists + + + + + Ui_MainWindow + + + &Help + + + + + Ui_EditVerseDialog + + + Bridge + + + + + Ui_OpenSongExportDialog + + + OpenSong Song Exporter + + + + + Ui_AmendThemeDialog + + + Vertical Align: + + + + + Ui_EditVerseDialog + + + Pre-Chorus + + + + + Ui_AmendThemeDialog + + + Top + + + + + BiblesTab + + + Display Dual Bible Verses + + + + + Ui_MainWindow + + + Toggle Service Manager + + + + + Ui_EditSongDialog + + + Delete + + + + + MediaManagerItem + + + &Add to Service + + + + + AmendThemeForm + + + First Color: + + + + + ThemesTab + + + Song level + + + + + alertsPlugin + + + Show an alert message + + + + + Ui_MainWindow + + + Ctrl+F1 + + + + + SongMaintenanceForm + + + Couldn't save your topic. + + + + + Ui_MainWindow + + + Save the current service under a new name + + + + + Ui_OpenLPExportDialog + + + Remove Selected + + + + + ThemeManager + + + Delete theme + + + + + ImageTab + + + Image Settings + + + + + Ui_OpenSongImportDialog + + + OpenSong Song Importer + + + + + SongUsagePlugin + + + &Extract recorded data + + + + + AlertsTab + + + Font Name: + + + + + Ui_MainWindow + + + &Web Site + + + + + MediaManagerItem + + + Send the selected item live + + + + + Ui_MainWindow + + + M&ode + + + + + Translate the interface to your language + + + + + Service Manager + + + + + CustomMediaItem + + + Custom + + + + + Ui_BibleImportWizard + + + OSIS + + + + + SongsPlugin + + + openlp.org 1.0 + + + + + Ui_MainWindow + + + &Theme + + + + + Ui_EditVerseDialog + + + Edit Verse + + + + + Ui_MainWindow + + + &Language + + + + + ServiceManager + + + Move to end + + + + + Your service is unsaved, do you want to save those changes before creating a new one ? + + + + + Ui_OpenSongExportDialog + + + Remove Selected + + + + + SongMediaItem + + + Search: + + + + + MainWindow + + + Save Changes to Service? + + + + + Your service has changed, do you want to save those changes? + + + + + ServiceManager + + + &Delete From Service + + + + + Ui_EditSongDialog + + + &Add to Song + + + + + Ui_MainWindow + + + &About + + + + + ImportWizardForm + + + You need to specify a version name for your Bible. + + + + + BiblesTab + + + Only show new chapter numbers + + + + + Ui_AlertEditDialog + + + Delete + + + + + EditCustomForm + + + Error + + + + + ThemesTab + + + Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. + + + + + AlertEditForm + + + Item selected to Add + + + + + Ui_AmendThemeDialog + + + Right + + + + + ThemeManager + + + Save Theme - (%s) + + + + + MediaManagerItem + + + Add the selected item(s) to the service + + + + + AuthorsForm + + + Error + + + + + Ui_AmendThemeDialog + + + Font Color: + + + + + Ui_OpenLPImportDialog + + + Select openlp.org songfile to import: + + + + + Ui_SettingsDialog + + + Settings + + + + + BiblesTab + + + Layout Style: + + + + + MediaManagerItem + + + Edit the selected + + + + + SlideController + + + Move to next + + + + + Ui_MainWindow + + + &Plugin List + + + + + BiblePlugin + + + &Bible + + + + + Ui_BibleImportWizard + + + Web Download + + + + + Ui_AmendThemeDialog + + + Horizontal + + + + + ImportWizardForm + + + Open OSIS file + + + + + Ui_AmendThemeDialog + + + Circular + + + + + PresentationMediaItem + + + Automatic + + + + + SongMaintenanceForm + + + Couldn't save your book. + + + + + Ui_AmendThemeDialog + + + pt + + + + + SongMaintenanceForm + + + Delete Topic + + + + + Ui_OpenLPImportDialog + + + Lyrics + + + + + BiblesTab + + + No brackets + + + + + Ui_AlertEditDialog + + + Maintain Alerts + + + + + Ui_AmendThemeDialog + + + px + + + + + ServiceManager + + + Select a theme for the service + + + + + ThemesTab + + + Themes + + + + + Ui_PluginViewDialog + + + Status: + + + + + Ui_EditSongDialog + + + CCLI Number: + + + + + ImportWizardForm + + + This Bible already exists! Please import a different Bible or first delete the existing one. + + + + + Ui_MainWindow + + + &Translate + + + + + BiblesTab + + + Bibles + + + + + Ui_SongMaintenanceDialog + + + Authors + + + + + SongUsageDetailForm + + + Output File Location + + + + + BiblesTab + + + { and } + + + + + GeneralTab + + + Prompt to save Service before starting New + + + + + ImportWizardForm + + + Starting import... + + + + + BiblesTab + + + Note: +Changes don't affect verses already in the service + + + + + Ui_EditVerseDialog + + + Intro + + + + + ServiceManager + + + Move up order + + + + + PresentationTab + + + available + + + + + ThemeManager + + + default + + + + + SongMaintenanceForm + + + Delete Author + + + + + Ui_AmendThemeDialog + + + Display Location + + + + + Ui_PluginViewDialog + + + Version: + + + + + Ui_AlertEditDialog + + + Add + + + + + GeneralTab + + + General + + + + + Ui_AmendThemeDialog + + + Y Position: + + + + + ServiceManager + + + Move down order + + + + + BiblesTab + + + verse per slide + + + + + Ui_AmendThemeDialog + + + Show Shadow: + + + + + AlertsTab + + + Preview + + + + + alertsPlugin + + + <b>Alerts Plugin</b><br>This plugin controls the displaying of alerts on the presentations screen + + + + + GeneralTab + + + Show the splash screen + + + + + Ui_MainWindow + + + New Service + + + + + SlideController + + + Move to first + + + + + Ui_MainWindow + + + &Online Help + + + + + SlideController + + + Blank Screen + + + + + Ui_MainWindow + + + Save Service + + + + + Save &As... + + + + + Toggle the visibility of the Media Manager + + + + + BibleMediaItem + + + No Book Found + + + + + Ui_EditSongDialog + + + Add + + + + + alertsPlugin + + + &Alert + + + + + BibleMediaItem + + + Advanced + + + + + ImageMediaItem + + + Image(s) + + + + + Ui_MainWindow + + + F11 + + + + + F10 + + + + + F12 + + + + + CustomPlugin + + + <b>Custom Plugin</b><br>This plugin allows slides to be displayed on the screen in the same way songs are. This plugin provides greater freedom over the songs plugin.<br> + + + + + Ui_MainWindow + + + Alt+F7 + + + + + Add an application to the list of tools + + + + + MediaPlugin + + + <b>Media Plugin</b><br>This plugin allows the playing of audio and video media + + + + + ServiceManager + + + Move &down + + + + + BiblesTab + + + Bible Theme: + + + + + SongsPlugin + + + Export songs in openlp.org 1.0 format + + + + + Ui_MainWindow + + + Theme Manager + + + + + AlertsTab + + + Alerts + + + + + Ui_customEditDialog + + + Move slide down 1 + + + + + Ui_AmendThemeDialog + + + Font: + + + + + ServiceManager + + + Load an existing service + + + + + Ui_MainWindow + + + Toggle the visibility of the Theme Manager + + + + + PresentationTab + + + Presentations + + + + + SplashScreen + + + Starting + + + + + ImageTab + + + Slide Loop Delay: + + + + + SlideController + + + Verse + + + + + AlertsTab + + + Alert timeout: + + + + + Ui_MainWindow + + + &Preview Pane + + + + + MediaManagerItem + + + Add a new + + + + + ThemeManager + + + Select Theme Import File + + + + + New Theme + + + + + MediaMediaItem + + + Media + + + + + Ui_AmendThemeDialog + + + Preview + + + + + Outline Size: + + + + + Ui_OpenSongExportDialog + + + Progress: + + + + + AmendThemeForm + + + Second Color: + + + + + Ui_EditSongDialog + + + Theme, Copyright Info && Comments + + + + + Ui_AboutDialog + + + Credits + + + + + BibleMediaItem + + + To: + + + + + Ui_EditSongDialog + + + Song Book + + + + + Ui_OpenLPExportDialog + + + Author + + + + + Ui_AmendThemeDialog + + + Wrap Indentation + + + + + ThemeManager + + + Import a theme + + + + + ImageMediaItem + + + Image + + + + + BibleMediaItem + + + Clear + + + + + Ui_MainWindow + + + Save Service As + + + + + Ui_AlertDialog + + + Cancel + + + + + Ui_OpenLPImportDialog + + + Import + + + + + Ui_EditVerseDialog + + + Chorus + + + + + Ui_EditSongDialog + + + Edit All + + + + + AuthorsForm + + + You need to type in the last name of the author. + + + + + SongsTab + + + Songs Mode + + + + + Ui_AmendThemeDialog + + + Left + + + + + RemotesPlugin + + + <b>Remote Plugin</b><br>This plugin provides the ability to send messages to a running version of openlp on a different computer.<br>The Primary use for this would be to send alerts from a creche + + + + + ImageTab + + + Images + + + + + BibleMediaItem + + + Verse: + + + + + Ui_OpenLPExportDialog + + + openlp.org Song Exporter + + + + + Song Export List + + + + + ThemeManager + + + Export theme + + + + + Ui_SongMaintenanceDialog + + + Delete + + + + + Ui_AmendThemeDialog + + + Theme Name: + + + + + Ui_AboutDialog + + + About OpenLP + + + + + Ui_MainWindow + + + Toggle the visibility of the Service Manager + + + + + PresentationMediaItem + + + A presentation with that filename already exists. + + + + + ImageMediaItem + + + Allow the background of live slide to be overridden + + + + + SongUsageDeleteForm + + + Are you sure you want to delete selected Song Usage data? + + + + + AlertsTab + + + openlp.org + + + + + ImportWizardForm + + + Invalid Books File + + + + + Ui_OpenLPImportDialog + + + Song Title + + + + + MediaManagerItem + + + &Show Live + + + + + AlertsTab + + + Keep History: + + + + + Ui_AmendThemeDialog + + + Image: + + + + + ImportWizardForm + + + Open Verses CSV file + + + + + Ui_customEditDialog + + + Set Theme for Slides + + + + + Ui_MainWindow + + + More information about OpenLP + + + + + AlertsTab + + + Background Color: + + + + + SongMaintenanceForm + + + No topic selected! + + + + + Ui_MainWindow + + + &Media Manager + + + + + &Tools + + + + + AmendThemeForm + + + Background Color: + + + + + Ui_EditSongDialog + + + A&dd to Song + + + + + Title: + + + + + GeneralTab + + + Screen + + + + + SongMaintenanceForm + + + This topic can't be deleted, it is currently assigned to at least one song. + + + + + AlertsTab + + + s + + + + + Ui_AlertEditDialog + + + Clear + + + + + Ui_BibleImportWizard + + + Please wait while your Bible is imported. + + + + + MediaManagerItem + + + No items selected... + + + + + Ui_OpenLPImportDialog + + + Select All + + + + + Ui_BibleImportWizard + + + Select the import format, and where to import from. + + + + + Ui_OpenLPImportDialog + + + Title + + + + + Ui_OpenSongExportDialog + + + Select OpenSong song folder: + + + + + Ui_MainWindow + + + Toggle Media Manager + + + + + SongUsagePlugin + + + &Song Usage + + + + + GeneralTab + + + Monitors + + + + + EditCustomForm + + + You need to enter a slide + + + + + ThemeManager + + + You have not selected a theme. + + + + + Ui_EditVerseDialog + + + Verse Type + + + + + ImportWizardForm + + + You need to specify a file to import your Bible from. + + + + + Ui_EditSongDialog + + + Comments + + + + + AlertsTab + + + Bottom + + + + + Ui_MainWindow + + + Create a new Service + + + + + AlertsTab + + + Top + + + + + ServiceManager + + + &Preview Verse + + + + + Ui_PluginViewDialog + + + TextLabel + + + + + AlertsTab + + + Font Size: + + + + + Ui_PluginViewDialog + + + About: + + + + + Inactive + + + + + Ui_OpenSongExportDialog + + + Ready to export + + + + + Export + + + + + Ui_PluginViewDialog + + + Plugin List + + + + + Ui_AmendThemeDialog + + + Transition Active: + + + + + Ui_BibleImportWizard + + + Proxy Server (Optional) + + + + + Ui_EditSongDialog + + + &Manage Authors, Topics, Books + + + + + Ui_OpenLPExportDialog + + + Ready to export + + + + + ImageMediaItem + + + Images (*.jpg *.jpeg *.gif *.png *.bmp);; All files (*) + + + + + EditCustomForm + + + Save && Preview + + + + + Ui_OpenLPExportDialog + + + Select All + + + + + Ui_SongUsageDetailDialog + + + to + + + + + Ui_AmendThemeDialog + + + Size: + + + + + MainWindow + + + OpenLP Main Display Blanked + + + + + Ui_OpenLPImportDialog + + + Remove Selected + + + + + ServiceManager + + + Move &up + + + + + ImportWizardForm + + + You need to specify an OpenSong Bible file to import. + + + + + PresentationMediaItem + + + Select Presentation(s) + + + + + File exists + + + + + Ui_OpenSongImportDialog + + + Ready to import + + + + + SlideController + + + Stop continuous loop + + + + + s + + + + + ImagePlugin + + + <b>Image Plugin</b><br>Allows images of all types to be displayed. If a number of images are selected together and presented on the live controller it is possible to turn them into a timed loop.<br<br>From the plugin if the <i>Override background</i> is chosen and an image is selected any songs which are rendered will use the selected image from the background instead of the one provied by the theme.<br> + + + + + SongMediaItem + + + Song Maintenance + + + + + Ui_customEditDialog + + + Edit + + + + + Ui_AmendThemeDialog + + + Gradient : + + + + + ImportWizardForm + + + Invalid Verse File + + + + + EditSongForm + + + Error + + + + + Ui_customEditDialog + + + Add New + + + + + Ui_AuthorsDialog + + + Display name: + + + + + SongMaintenanceForm + + + Are you sure you want to delete the selected topic? + + + + + Ui_AmendThemeDialog + + + Bold/Italics + + + + + Ui_SongMaintenanceDialog + + + Song Maintenance + + + + + Ui_BibleImportWizard + + + Welcome to the Bible Import Wizard + + + + + SongsTab + + + Songs + + + + + Ui_BibleImportWizard + + + Password: + + + + + Ui_MainWindow + + + &Theme Manager + + + + + MediaManagerItem + + + Preview the selected item + + + + + Ui_BibleImportWizard + + + Version Name: + + + + + Ui_AboutDialog + + + About + + + + + MediaMediaItem + + + Select Media + + + + + Ui_AmendThemeDialog + + + Horizontal Align: + + + + + ServiceManager + + + &Edit Item + + + + + Ui_AmendThemeDialog + + + Background Type: + + + + + Ui_MainWindow + + + &Save + + + + + OpenLP 2.0 + + + + + ThemeManager + + + A theme with this name already exists, would you like to overwrite it? + + + + + Export a theme + + + + + AmendThemeForm + + + Open file + + + + + Ui_TopicsDialog + + + Topic Maintenance + + + + + Ui_customEditDialog + + + Clear edit area + + + + + Ui_AmendThemeDialog + + + Show Outline: + + + + + Gradient + + + + + SongBookForm + + + You need to type in a book name! + + + + + ImportWizardForm + + + Open OpenSong Bible + + + + + Ui_MainWindow + + + Look && &Feel + + + + + Ui_BibleImportWizard + + + Ready. + + + + + Ui_SongMaintenanceDialog + + + Books/Hymnals + + + + + Ui_AboutDialog + + + Contribute + + + + + ServiceManager + + + Move to &bottom + + + + + Ui_BibleImportWizard + + + Books Location: + + + + + Ui_OpenSongExportDialog + + + Full Song List + + + + + GeneralTab + + + SongSelect Password: + + + + + From d7cb156f21be91f3d4bc5a3ad3b16546ee8b2241 Mon Sep 17 00:00:00 2001 From: rimach Date: Tue, 20 Apr 2010 22:20:29 +0200 Subject: [PATCH 12/81] corrections --- resources/i18n/openlp_af.qm | Bin 34261 -> 34058 bytes resources/i18n/openlp_de.qm | Bin 36265 -> 36123 bytes resources/i18n/openlp_en.ts | 7722 +++++++++++++------------------- resources/i18n/openlp_en_GB.qm | Bin 31723 -> 31458 bytes resources/i18n/openlp_en_ZA.qm | Bin 22938 -> 22957 bytes resources/i18n/openlp_es.qm | Bin 14546 -> 14874 bytes resources/i18n/openlp_hu.qm | Bin 35270 -> 35007 bytes resources/i18n/openlp_nb.qm | Bin 20852 -> 21181 bytes resources/i18n/openlp_pt_BR.qm | Bin 35931 -> 35695 bytes resources/i18n/openlp_sv.qm | Bin 37049 -> 37039 bytes scripts/translation_utils.py | 9 +- 11 files changed, 3197 insertions(+), 4534 deletions(-) diff --git a/resources/i18n/openlp_af.qm b/resources/i18n/openlp_af.qm index 58b2f37c46413f2353c6d2b8010ff92a8470e13f..f7f13cbfafcdec3d5090914de27ca07c13cab55e 100644 GIT binary patch delta 4864 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 - - - - BibleMediaItem + + + AboutForm - - Quick - + + build + - - - Ui_customEditDialog + + + AlertDialog - - Delete selected slide - - - - - BiblesTab - - - ( and ) - - - - - RemoteTab - - - Remotes - - - - - Ui_EditSongDialog - - - &Remove - - - - - Ui_AmendThemeDialog - - - Shadow Size: - - - - - Ui_OpenSongExportDialog - - - Close - - - - - ThemeManager - - - Import Theme - - - - - Ui_AmendThemeDialog - - - Slide Transition - - - - - SongMaintenanceForm - - - Are you sure you want to delete the selected book? - - - - - ThemesTab - - - Theme level - - - - - BibleMediaItem - - - Bible - - - - - ServiceManager - - - Save Changes to Service? - - - - - SongUsagePlugin - - - &Delete recorded data - - - - - Ui_OpenLPExportDialog - - - Song Title - - - - - Ui_customEditDialog - - - Edit selected slide - - - - - SongMediaItem - - - CCLI Licence: - - - - - Ui_BibleImportWizard - - - Bible Import Wizard - - - - - Ui_customEditDialog - - - Edit All - - - - - SongMaintenanceForm - - - Couldn't save your author. - - - - - Ui_ServiceNoteEdit - - - Service Item Notes - - - - - Ui_customEditDialog - - - Add new slide at bottom - + + Alert Message + - - Clear - + + Alert &text: + - - - ThemesTab - - Global theme - + + &Parameter(s): + - - - PresentationPlugin - - <b>Presentation Plugin</b> <br> Delivers the ability to show presentations using a number of different programs. The choice of available presentation programs is available to the user in a drop down box. - + + &New + - - - SongUsagePlugin - - Start/Stop live song usage recording - + + &Save + - - - MainWindow - - The Main Display has been blanked out - + + &Edit + - - - Ui_OpenSongExportDialog - - Lyrics - + + &Delete + - - - Ui_AlertDialog - - Display - + + Displ&ay + - - - SongMaintenanceForm - - This author can't be deleted, they are currently assigned to at least one song. - + + Display && Cl&ose + - - - Ui_customEditDialog - - Delete - + + &Close + - - - Ui_EditVerseDialog + + + AlertForm - - Verse - + + Item selected to Add + - - - Ui_OpenSongImportDialog - - OpenSong Folder: - + + Missing data + - - - ThemeManager - - - Create a new theme - - - - - Ui_MainWindow - - - Open an existing service - - - - - SlideController - - - Move to previous - - - - - SongsPlugin - - - &Song - - - - - Ui_PluginViewDialog - - - Plugin Details - - - - - ImportWizardForm - - - You need to specify a file with books of the Bible to use in the import. - - - - + + AlertsTab - - Edit History: - + + pt + - - - Ui_MainWindow - - &File - + + Location: + - - - BiblesTab - - verse per line - + + Font Color: + - - - Ui_customEditDialog - - Theme: - + + Font + - - - SongMaintenanceForm - - Couldn't add your book. - + + Font Name: + - - Error - + + Preview + - - - Ui_BibleImportWizard - - Bible: - + + Alerts + - - - ThemeManager - - Delete Theme - + + Alert timeout: + - - - SplashScreen - - Splash Screen - + + openlp.org + - - - SongMediaItem - - Song - + + Keep History: + - - - Ui_OpenSongExportDialog - - Song Title - + + Background Color: + - - - Ui_AmendThemeDialog - - Bottom - + + s + - - - Ui_MainWindow - - List the Plugins - + + Bottom + - - - SongMaintenanceForm - - No author selected! - + + Top + - - - SongUsageDeleteForm - - Delete Selected Song Usage Events? - + + Font Size: + - - - SongUsagePlugin - - - <b>SongUsage Plugin</b><br>This plugin records the use of songs and when they have been used during a live service - - - - - Ui_customEditDialog - - - Move slide Up 1 - - - - - SongsPlugin - - - OpenSong - - - - - AlertsManager - - - Alert message created and delayed - - - - - Ui_EditSongDialog - - - Alternative Title: - - - - - ServiceManager - - - Open Service - - - - - BiblesTab - - - Display Style: - - - - - Ui_AmendThemeDialog - - - Image - - - - - EditSongForm - - - You need to enter a song title. - - - - - ThemeManager - - - Error - - - - - Ui_SongUsageDeleteDialog - - - Song Usage Delete - - - - - ImportWizardForm - - - Invalid Bible Location - - - - - BibleMediaItem - - - Book: - - - - - ThemeManager - - - Make Global - - - - - Ui_MainWindow - - - &Service Manager - - - - - Ui_OpenLPImportDialog - - - Author - - - - - Ui_AmendThemeDialog - - - Height: - - - - - ThemeManager - - - Delete a theme - - - - - Ui_BibleImportWizard - - - Crosswalk - - - - - SongBookForm - - - Error - - - - - Ui_AuthorsDialog - - - Last name: - - - - - ThemesTab - - - Use the global theme, overriding any themes associated with either the service or the songs. - - - - - Ui_customEditDialog - - - Title: - - - - - ImportWizardForm - - - You need to set a copyright for your Bible! Bibles in the Public Domain need to be marked as such. - - - - - SongMediaItem - - - Maintain the lists of authors, topics and books - - - - - Ui_AlertEditDialog - - - Save - - - - - EditCustomForm - - - You have unsaved data - - - - - Ui_AmendThemeDialog - - - Outline - - - - - BibleMediaItem - - - Text Search - - - - - Ui_BibleImportWizard - - - CSV - - - - - SongUsagePlugin - - - Delete song usage to specified date - - - - - Ui_SongUsageDetailDialog - - - Report Location - - - - - Ui_BibleImportWizard - - - OpenSong - - - - - Ui_MainWindow - - - Open Service - - - - - BibleMediaItem - - - Find: - - - - - ImageMediaItem - - - Select Image(s) - - - - - BibleMediaItem - - - Search Type: - - - - - Ui_MainWindow - - - Media Manager - - - - - Alt+F4 - - - - - MediaManagerItem - - - &Preview - - - - - GeneralTab - - - CCLI Details - - - - - BibleMediaItem - - - Bible not fully loaded - - - - - Ui_MainWindow - - - Toggle the visibility of the Preview Panel - - - - - ImportWizardForm - - - Bible Exists - - - - - Ui_MainWindow - - - &User Guide - - - - - AlertsTab - - - pt - - - - - Ui_MainWindow - - - Set the interface language to English - - - - - Ui_AmendThemeDialog - - - Main Font - - - - - ImportWizardForm - - - Empty Copyright - - - - - AuthorsForm - - - You need to type in the first name of the author. - - - - - SongsTab - - - Display Verses on Live Tool bar: - - - - - ServiceManager - - - Move to top - - - - - ImageMediaItem - - - Override background - - - - - Ui_SongMaintenanceDialog - - - Edit - - - - - Ui_OpenSongExportDialog - - - Select All - - - - - ThemesTab - - - Use the theme from each song in the database. If a song doesn't have a theme associated with it, then use the service's theme. If the service doesn't have a theme, then use the global theme. - - - - - PresentationMediaItem - - - Presentation - - - - - Ui_AmendThemeDialog - - - Solid Color - - - - - CustomTab - - - Custom - - - - - Ui_OpenLPImportDialog - - - Ready to import - - - - - MainWindow - - - OpenLP version %s has been updated to version %s - -You can obtain the latest version from http://openlp.org - - - - - Ui_BibleImportWizard - - - File Location: - - - - - SlideController - - - Go to Verse - - - - - SongMaintenanceForm - - - Couldn't add your topic. - - - - - Ui_MainWindow - - - &Import - - - - - Quit OpenLP - - - - - Ui_BibleImportWizard - - - 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. - - - - - Ui_OpenLPExportDialog - - - Title - - - - - ImportWizardForm - - - Empty Version Name - - - - - Ui_MainWindow - - - &Preview Panel - - - - - SlideController - - - Start continuous loop - - - - - GeneralTab - - - primary - - - - - Ui_EditSongDialog - - - Add a Theme - - - - - Ui_MainWindow - - - &New - - - - - Ui_customEditDialog - - - Credits: - - - - - Ui_EditSongDialog - - - R&emove - - - - - SlideController - - - Live - - - - - Ui_AmendThemeDialog - - - Font Main - - - - - BiblesTab - - - continuous - - - - - ThemeManager - - - File is not a valid theme. - - - - - GeneralTab - - - Application Startup - - - - - Ui_AmendThemeDialog - - - Use Default Location: - - - - - Ui_OpenSongImportDialog - - - Import - - - - - Ui_AmendThemeDialog - - - Other Options - - - - - Ui_EditSongDialog - - - Verse Order: - - - - - Ui_MainWindow - - - Default Theme: - - - - - Toggle Preview Panel - - - - - SongMediaItem - - - Lyrics - - - - - Ui_OpenLPImportDialog - - - Progress: - - - - - Ui_AmendThemeDialog - - - Shadow - - - - - GeneralTab - - - Select monitor for output display: - - - - - Ui_MainWindow - - - &Settings - - - - - EditSongForm - - - Invalid verse entry - values must be Numeric, I,B,C,T,P,E,O - - - - - Ui_AmendThemeDialog - - - Italics - - - - - ServiceManager - - - Create a new service - - - - - Ui_AmendThemeDialog - - - Background: - - - - - Ui_OpenLPImportDialog - - - openlp.org Song Importer - - - - - Ui_BibleImportWizard - - - Copyright: - - - - - ThemesTab - - - Service level - - - - - BiblesTab - - - [ and ] - - - - - Ui_BibleImportWizard - - - Verse Location: - - - - - MediaManagerItem - - - You must select one or more items - - - - - GeneralTab - - - Application Settings - - - - - ServiceManager - - - Save this service - - - - - ImportWizardForm - - - Open Books CSV file - - - - - GeneralTab - - - SongSelect Username: - - - - - Ui_AmendThemeDialog - - - X Position: - - - - - BibleMediaItem - - - No matching book could be found in this Bible. - - - - - Ui_BibleImportWizard - - - Server: - - - - - Ui_EditVerseDialog - - - Ending - - - - - CustomTab - - - Display Footer: - - - - - ImportWizardForm - - - Invalid OpenSong Bible - - - - - GeneralTab - - - CCLI Number: - - - - - Ui_AmendThemeDialog - - - Center - - - - - ServiceManager - - - Theme: - - - - - AlertEditForm - - - Please save or clear selected item - - - - - Ui_MainWindow - - - &Live - - - - - Ui_AmendThemeDialog - - - <Color2> - - - - - Ui_MainWindow - - - English - - - - - ImageMediaItem - - - You must select one or more items - - - - - Ui_AuthorsDialog - - - First name: - - - - - Ui_OpenLPExportDialog - - - Select openlp.org export filename: - - - - - Ui_BibleImportWizard - - - Permission: - - - - - Ui_OpenSongImportDialog - - - Close - - - - - Ui_SongUsageDetailDialog - - - Song Usage Extraction - - - - - Ui_AmendThemeDialog - - - Opaque - - - - - ImportWizardForm - - - Your Bible import failed. - - - - - SlideController - - - Start playing media - - - - - SongMediaItem - - - Type: - - - - - SongMaintenanceForm - - - This book can't be deleted, it is currently assigned to at least one song. - - - - - Ui_AboutDialog - - - Close - - - - - TopicsForm - - - You need to type in a topic name! - - - - - Ui_OpenSongExportDialog - - - Song Export List - - - - - BibleMediaItem - - - Dual: - - - - - ImageTab - - - sec - - - - - ServiceManager - - - Delete From Service - - - - - GeneralTab - - - Automatically open the last service - - - - - Ui_OpenLPImportDialog - - - Song Import List - - - - - Ui_OpenSongExportDialog - - - Author - - - - - Ui_AmendThemeDialog - - - Outline Color: - - - - - Ui_BibleImportWizard - - - Select Import Source - - - - - Ui_MainWindow - - - F9 - - - - - F8 - - - - - ServiceManager - - - &Change Item Theme - - - - - Ui_SongMaintenanceDialog - - - Topics - - - - - Ui_OpenLPImportDialog - - - Import File Song List - - - - - Ui_customEditDialog - - - Edit Custom Slides - - - - - Ui_BibleImportWizard - - - Set up the Bible's license details. - - - - - Ui_EditVerseDialog - - - Number - - - - - Ui_AmendThemeDialog - - - Alignment - - - - - SongMaintenanceForm - - - Delete Book - - - - - ThemeManager - - - Edit a theme - - - - - Ui_BibleImportWizard - - - BibleGateway - - - - - GeneralTab - - - Preview Next Song from Service Manager - - - - - Ui_EditSongDialog - - - Title && Lyrics - - - - - SongMaintenanceForm - - - No book selected! - - - - - SlideController - - - Move to live - - - - - Ui_EditVerseDialog - - - Other - - - - - Ui_EditSongDialog - - - Theme - - - - - ServiceManager - - - Save Service - - - - - Ui_SongUsageDetailDialog - - - Select Date Range - - - - - Ui_MainWindow - - - Save the current service to disk - - - - - BibleMediaItem - - - Chapter: - - - - - Search - - - - - PresentationTab - - - Available Controllers - - - - - Ui_MainWindow - - - Add &Tool... - - - - - TopicsForm - - - Error - - - - - RemoteTab - - - Remotes Receiver Port - - - - - Ui_MainWindow - - - &View - - - - - Ui_AmendThemeDialog - - - Normal - - - - - Ui_OpenLPExportDialog - - - Close - - - - - Ui_BibleImportWizard - - - Username: - - - - - ThemeManager - - - Edit Theme - - - - - SlideController - - - Preview - - - - - Ui_AlertDialog - - - Alert Message - - - - - ImportWizardForm - - - Finished import. - - - - - GeneralTab - - - Show blank screen warning - - - - - ImportWizardForm - - - You need to specify a file of Bible verses to import. - - - - - AlertsTab - - - Location: - - - - - Ui_EditSongDialog - - - Authors, Topics && Book - - - - - EditSongForm - - - You need to enter some verses. - - - - - Ui_BibleImportWizard - - - Download Options - - - - - BiblePlugin - - - <strong>Bible Plugin</strong><br />This plugin allows bible verses from different sources to be displayed on the screen during the service. - - - - - Ui_EditSongDialog - - - Copyright Information - - - - - Ui_MainWindow - - - &Export - - - - - Ui_AmendThemeDialog - - - Bold - - - - - SongsPlugin - - - Export songs in OpenLP 2.0 format - - - - - MediaManagerItem - - - Load a new - - - - - AlertEditForm - - - Missing data - - - - - SongsPlugin - - - <b>Song Plugin</b> <br>This plugin allows Songs to be managed and displayed.<br> - - - - - Ui_AmendThemeDialog - - - Footer Font - - - - - EditSongForm - - - Invalid verse entry - vX - - - - - ServiceManager - - - OpenLP Service Files (*.osz) - - - - - MediaManagerItem - - - Delete the selected item - - - - - Ui_OpenLPExportDialog - - - Export - - - - - Ui_BibleImportWizard - - - Location: - - - - - BibleMediaItem - - - Keep - - - - - SongUsagePlugin - - - Generate report on Song Usage - - - - - Ui_EditSongDialog - - - Topic - - - - - Ui_MainWindow - - - &Open - - - - - AuthorsForm - - - You haven't set a display name for the author, would you like me to combine the first and last names for you? - - - - + + AmendThemeForm - - Slide Height is %s rows - + + Slide Height is %s rows + - - - Ui_EditSongDialog - - Lyrics: - + + First Color: + - - - Ui_AboutDialog - - Project Lead - Raoul "superfly" Snyman - -Developers - Tim "TRB143" Bentley - Jonathan "gushie" Corwin - Michael "cocooncrash" Gorven - Scott "sguerrieri" Guerrieri - Raoul "superfly" Snyman - Maikel Stuivenberg - Martin "mijiti" Thompson - Jon "Meths" Tibble - Carsten "catini" Tingaard - -Testers - Wesley "wrst" Stout - + + Second Color: + - - - SongMediaItem - - Titles - + + Background Color: + - - - Ui_OpenLPExportDialog + + + AuthorsForm - - Lyrics - + + You need to type in the first name of the author. + - - - PresentationMediaItem - - Present using: - + + You haven't set a display name for the author, would you like me to combine the first and last names for you? + - - - SongMediaItem - - Clear - + + Error + - - - ServiceManager - - &Live Verse - + + You need to type in the last name of the author. + - - - Ui_OpenSongImportDialog + + + BibleMediaItem - - Progress: - + + Quick + - - - Ui_MainWindow - - Toggle Theme Manager - + + Bible + - - - Ui_AlertDialog - - Alert Text: - + + Book: + - - - Ui_EditSongDialog - - Edit - + + Text Search + - - - AlertsTab - - Font Color: - + + Find: + - - - Ui_AmendThemeDialog - - Theme Maintenance - + + Search Type: + - - - CustomTab - - Custom Display - + + Bible not fully loaded + - - - Ui_OpenSongExportDialog - - Title - + + No matching book could be found in this Bible. + - - - Ui_AmendThemeDialog - - <Color1> - + + Dual: + - - - Ui_EditSongDialog - - Authors - + + Chapter: + - - - ThemeManager - - Export Theme - + + Search + - - - ImageMediaItem - - No items selected... - + + Keep + - - - Ui_SongBookDialog - - Name: - + + Results: + - - - Ui_AuthorsDialog - - Author Maintenance - + + Verse Search + - - - Ui_AmendThemeDialog - - Font Footer - + + Version: + - - + + + From: + + + + + No Book Found + + + + + Advanced + + + + + To: + + + + + Clear + + + + + Verse: + + + + + BiblePlugin + + + <strong>Bible Plugin</strong><br />This plugin allows bible verses from different sources to be displayed on the screen during the service. + + + + BiblesTab - - Verse Display - + + ( and ) + - - - Ui_MainWindow - - &Options - + + verse per line + - - - BibleMediaItem - - Results: - + + Display Style: + - - - Ui_OpenLPExportDialog - - Full Song List - + + continuous + - - - ServiceManager - - Move to &top - + + [ and ] + - - - SlideController - - Move to last - + + Verse Display + - - - Ui_OpenLPExportDialog - - Progress: - + + Display Dual Bible Verses + - - - Ui_SongMaintenanceDialog - - Add - + + Only show new chapter numbers + - - - SongMaintenanceForm - - Are you sure you want to delete the selected author? - + + Layout Style: + - - - SongUsagePlugin - - Song Usage Status - + + No brackets + - - - BibleMediaItem - - Verse Search - + + Bibles + - - - Ui_SongBookDialog - - Edit Book - + + { and } + - - + + + Note: +Changes don't affect verses already in the service + + + + + verse per slide + + + + + Bible Theme: + + + + + CustomMediaItem + + + Custom + + + + + CustomPlugin + + + <b>Custom Plugin</b><br>This plugin allows slides to be displayed on the screen in the same way songs are. This plugin provides greater freedom over the songs plugin.<br> + + + + + CustomTab + + + Custom + + + + + Display Footer: + + + + + Custom Display + + + + + EditCustomForm + + + You need to enter a title + + + + + Error + + + + + You need to enter a slide + + + + + Save && Preview + + + + + You have unsaved data, please save or clear + + + + EditSongForm - - Save && Preview - - - - - Ui_SongBookDialog - - - Publisher: - - - - - Ui_AmendThemeDialog - - - Font Weight: - - - - - Ui_BibleImportWizard - - - Bible Filename: - - - - - Ui_AmendThemeDialog - - - Transparent - - - - - SongMediaItem - - - Search - - - - - Ui_BibleImportWizard - - - Format: - - - - - Ui_AmendThemeDialog - - - Background - - - - - Ui_BibleImportWizard - - - Importing - - - - - Ui_customEditDialog - - - Edit all slides - - - - - SongsTab - - - Enable search as you type: - - - - - Ui_MainWindow - - - Ctrl+S - - - - - SongMediaItem - - - Authors - - - - - Ui_PluginViewDialog - - - Active - - - - - SongMaintenanceForm - - - Couldn't add your author. - - - - - Ui_MainWindow - - - Ctrl+O - + + You need to enter a song title. + - - Ctrl+N - - - - - Ui_AlertEditDialog - - - Edit - - - - - Ui_EditSongDialog - - - Song Editor - - - - - AlertsTab - - - Font - - - - - SlideController - - - Edit and re-preview Song - + + You need to enter some verses. + - - Delay between slides in seconds - + + Save && Preview + - - + + + Error + + + + + bitped + + + + + v + + + + + c + + + + + Invalid verse entry - Vx or Cx + + + + + Invalid verse entry, values must be I,B,T,P,E,O,Vx,Cx + + + + + EditVerseForm + + + Verse + + + + + Chrous + + + + + GeneralTab + + + CCLI Details + + + + + primary + + + + + Application Startup + + + + + Select monitor for output display: + + + + + Application Settings + + + + + SongSelect Username: + + + + + CCLI Number: + + + + + Automatically open the last service + + + + + Preview Next Song from Service Manager + + + + + Show blank screen warning + + + + + Prompt to save Service before starting New + + + + + General + + + + + Show the splash screen + + + + + Screen + + + + + Monitors + + + + + SongSelect Password: + + + + + Display if in single screen + + + + + ImageMediaItem + + + Select Image(s) + + + + + Image(s) + + + + + Image + + + + + Images (*.jpg *.jpeg *.gif *.png *.bmp);; All files (*) + + + + + Replace Live Background + + + + + No item selected + + + + + You must select one item + + + + + ImagePlugin + + + <b>Image Plugin</b><br>Allows images of all types to be displayed. If a number of images are selected together and presented on the live controller it is possible to turn them into a timed loop.<br<br>From the plugin if the <i>Override background</i> is chosen and an image is selected any songs which are rendered will use the selected image from the background instead of the one provied by the theme.<br> + + + + + ImageTab + + + sec + + + + + Image Settings + + + + + Slide Loop Delay: + + + + + Images + + + + + ImportWizardForm + + + You need to specify a file with books of the Bible to use in the import. + + + + + Invalid Bible Location + + + + + You need to set a copyright for your Bible! Bibles in the Public Domain need to be marked as such. + + + + + Bible Exists + + + + + Empty Copyright + + + + + Empty Version Name + + + + + Invalid OpenSong Bible + + + + + Your Bible import failed. + + + + + Finished import. + + + + + You need to specify a file of Bible verses to import. + + + + + You need to specify a version name for your Bible. + + + + + This Bible already exists! Please import a different Bible or first delete the existing one. + + + + + Starting import... + + + + + Invalid Books File + + + + + You need to specify a file to import your Bible from. + + + + + You need to specify an OpenSong Bible file to import. + + + + + Invalid Verse File + + + + + Open OpenSong Bible + + + + + Open OSIS File + + + + + Open Books CSV File + + + + + Open Verses CSV File + + + + + LanguageManager + + + Language + + + + + After restart new Language settings will be used. + + + + + MainWindow + + + The Main Display has been blanked out + + + + + OpenLP Version Updated + + + + + Save Changes to Service? + + + + + Your service has changed, do you want to save those changes? + + + + + OpenLP Main Display Blanked + + + + + New Service + + + + + Open Service + + + + + Save Service + + + + + OpenLP 2.0 + + + + + English + + + + + Default Theme: + + + + + &File + + + + + &Import + + + + + &Export + + + + + &Options + + + + + &View + + + + + M&ode + + + + + &Tools + + + + + &Help + + + + + Media Manager + + + + + Service Manager + + + + + Theme Manager + + + + + &New + + + + + Create a new Service + + + + + Ctrl+N + + + + + &Open + + + + + Open an existing service + + + + + Ctrl+O + + + + + &Save + + + + + Save the current service to disk + + + + + Ctrl+S + + + + + Save &As... + + + + + Save Service As + + + + + Save the current service under a new name + + + + + F12 + + + + + E&xit + + + + + Quit OpenLP + + + + + Alt+F4 + + + + + &Theme + + + + + &Language + + + + + Look && &Feel + + + + + &Settings + + + + + &Media Manager + + + + + Toggle Media Manager + + + + + Toggle the visibility of the Media Manager + + + + + F8 + + + + + &Theme Manager + + + + + Toggle Theme Manager + + + + + Toggle the visibility of the Theme Manager + + + + + F10 + + + + + &Service Manager + + + + + Toggle Service Manager + + + + + Toggle the visibility of the Service Manager + + + + + F9 + + + + + &Preview Panel + + + + + Toggle Preview Panel + + + + + Toggle the visibility of the Preview Panel + + + + + F11 + + + + + &Plugin List + + + + + List the Plugins + + + + + Alt+F7 + + + + + &User Guide + + + + + &About + + + + + More information about OpenLP + + + + + Ctrl+F1 + + + + + &Online Help + + + + + &Web Site + + + + + &Auto Detect + + + + + Choose System language, if available + + + + + Set the interface language to %1 + + + + + Add &Tool... + + + + + Add an application to the list of tools + + + + + &Preview Pane + + + + + &Live + + + + + Version %s of OpenLP is now available for download (you are currently running version %s). + +You can download the latest version from http://openlp.org + + + + MediaManagerItem - - &Edit - - - - - Ui_AmendThemeDialog - - - Vertical - + + &Preview + - - Width: - + + You must select one or more items + - - - ThemesTab - - Global level - + + Load a new + - - + + + Delete the selected item + + + + + &Edit + + + + + &Add to Service + + + + + Send the selected item live + + + + + Add the selected item(s) to the service + + + + + Edit the selected + + + + + Add a new + + + + + &Show Live + + + + + Preview the selected item + + + + + Import a + + + + + &Delete + + + + + &Add to selected Service Item + + + + + No Items Selected + + + + + You must select one or more items. + + + + + No items selected + + + + + No Service Item Selected + + + + + You must select a existing service item to add to. + + + + + Invalid Service Item + + + + + MediaMediaItem + + + Media + + + + + Select Media + + + + + Videos (%s);;Audio (%s);;All files (*) + + + + + MediaPlugin + + + <b>Media Plugin</b><br>This plugin allows the playing of audio and video media + + + + + OpenSongBible + + + Importing + + + + + PresentationMediaItem + + + Presentation + + + + + Present using: + + + + + Automatic + + + + + A presentation with that filename already exists. + + + + + Select Presentation(s) + + + + + File exists + + + + + Presentations (%s) + + + + + PresentationPlugin + + + <b>Presentation Plugin</b> <br> Delivers the ability to show presentations using a number of different programs. The choice of available presentation programs is available to the user in a drop down box. + + + + + PresentationTab + + + Available Controllers + + + + + available + + + + + Presentations + + + + + RemoteTab + + + Remotes + + + + + Remotes Receiver Port + + + + + RemotesPlugin + + + <b>Remote Plugin</b><br>This plugin provides the ability to send messages to a running version of openlp on a different computer.<br>The Primary use for this would be to send alerts from a creche + + + + + ServiceManager + + + Save Changes to Service? + + + + + Open Service + + + + + Move to top + + + + + Create a new service + + + + + Save this service + + + + + Theme: + + + + + Delete From Service + + + + + Save Service + + + + + &Live Verse + + + + + Move to &top + + + + + New Service + + + + + &Notes + + + + + Move to end + + + + + Your service is unsaved, do you want to save those changes before creating a new one ? + + + + + &Delete From Service + + + + + Move up order + + + + + Move down order + + + + + Move &down + + + + + Load an existing service + + + + + &Preview Verse + + + + + Move &up + + + + + &Edit Item + + + + + Move to &bottom + + + + + &Maintain Item + + + + + SlideController + + + Move to previous + + + + + Go to Verse + + + + + Start continuous loop + + + + + Live + + + + + Start playing media + + + + + Move to live + + + + + Preview + + + + + Move to last + + + + + Edit and re-preview Song + + + + + Delay between slides in seconds + + + + + Move to next + + + + + Move to first + + + + + Blank Screen + + + + + Verse + + + + + Stop continuous loop + + + + + s + + + + + Theme Screen + + + + + Hide Screen + + + + + Chorus + + + + + SongBookForm + + + Error + + + + + You need to type in a book name! + + + + + SongMaintenanceForm + + + Are you sure you want to delete the selected book? + + + + + Couldn't save your author. + + + + + This author can't be deleted, they are currently assigned to at least one song. + + + + + Couldn't add your book. + + + + + Error + + + + + No author selected! + + + + + Couldn't add your topic. + + + + + This book can't be deleted, it is currently assigned to at least one song. + + + + + Delete Book + + + + + No book selected! + + + + + Are you sure you want to delete the selected author? + + + + + Couldn't add your author. + + + + + Couldn't save your topic. + + + + + Couldn't save your book. + + + + + Delete Topic + + + + + Delete Author + + + + + No topic selected! + + + + + This topic can't be deleted, it is currently assigned to at least one song. + + + + + Are you sure you want to delete the selected topic? + + + + + SongMediaItem + + + CCLI Licence: + + + + + Song + + + + + Maintain the lists of authors, topics and books + + + + + Lyrics + + + + + Type: + + + + + Titles + + + + + Clear + + + + + Search + + + + + Authors + + + + + Search: + + + + + Song Maintenance + + + + + %s (%s) + + + + + Delete song? + + + + + Delete %d songs? + + + + + Delete Confirmation + + + + + SongUsageDeleteForm + + + Delete Selected Song Usage Events? + + + + + Are you sure you want to delete selected Song Usage data? + + + + + SongUsageDetailForm + + + Output File Location + + + + + SongUsagePlugin + + + <b>SongUsage Plugin</b><br>This plugin records the use of songs and when they have been used during a live service + + + + + SongsPlugin + + + <b>Song Plugin</b> <br>This plugin allows Songs to be managed and displayed.<br> + + + + + Open Songs of Fellowship file + + + + + Open documents or presentations + + + + + SongsTab + + + Display Verses on Live Tool bar: + + + + + Enable search as you type: + + + + + Songs Mode + + + + + Songs + + + + ThemeManager - - You are unable to delete the default theme. - + + Import Theme + - - - BibleMediaItem - - Version: - + + Create a new theme + - - + + + Delete Theme + + + + + Error + + + + + Make Global + + + + + Delete a theme + + + + + File is not a valid theme. + + + + + Edit a theme + + + + + Edit Theme + + + + + Export Theme + + + + + You are unable to delete the default theme. + + + + + Theme Exists + + + + + Delete theme + + + + + Save Theme - (%s) + + + + + default + + + + + Select Theme Import File + + + + + New Theme + + + + + Import a theme + + + + + Export theme + + + + + You have not selected a theme. + + + + + A theme with this name already exists, would you like to overwrite it? + + + + + Export a theme + + + + + Theme %s is use in %s plugin + + + + + Theme %s is use by Service Manager + + + + + ThemesTab + + + Theme level + + + + + Global theme + + + + + Use the global theme, overriding any themes associated with either the service or the songs. + + + + + Use the theme from each song in the database. If a song doesn't have a theme associated with it, then use the service's theme. If the service doesn't have a theme, then use the global theme. + + + + + Service level + + + + + Global level + + + + + Song level + + + + + Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. + + + + + Themes + + + + + TopicsForm + + + You need to type in a topic name! + + + + + Error + + + + Ui_AboutDialog - - OpenLP <version> build <revision> - Open Source Lyrics Projection + + Close + + + + + License + + + + + Credits + + + + + About OpenLP + + + + + About + + + + + Contribute + + + + + OpenLP <version><revision> - Open Source Lyrics Projection OpenLP is free church presentation software, or lyrics projection software, used to display slides of songs, Bible verses, videos, images, and even presentations (if OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. Find out more about OpenLP: http://openlp.org/ OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - + - - - SongsPlugin - - OpenLP 2.0 - + + Project Lead + Raoul "superfly" Snyman + +Developers + Tim "TRB143" Bentley + Jonathan "gushie" Corwin + Michael "cocooncrash" Gorven + Scott "sguerrieri" Guerrieri + Raoul "superfly" Snyman + Martin "mijiti" Thompson + Jon "Meths" Tibble + +Contributors + Meinert "m2j" Jordan + Christian "crichter" Richter + Maikel Stuivenberg + Carsten "catini" Tingaard + +Testers + Philip "Phill" Ridout + Wesley "wrst" Stout (lead) + +Packagers + Thomas "tabthorpe" Abthorpe (FreeBSD) + Tim "TRB143" Bentley (Fedora) + Michael "cocooncrash" Gorven (Ubuntu) + Matthias "matthub" Hub (Mac OS X) + Raoul "superfly" Snyman (Windows) + + - - - ServiceManager - - New Service - + + Copyright + - - - Ui_TopicsDialog - - - Topic name: - - - - - Ui_BibleImportWizard - - - License Details - - - - - Ui_AboutDialog - - - License - - - - - OpenSongBible - - - Importing - - - - + + Ui_AmendThemeDialog - - Middle - + + Shadow Size: + - - - Ui_customEditDialog - - Save - + + Slide Transition + - - - AlertEditForm - - Item selected to Edit - + + Bottom + - - - BibleMediaItem - - From: - + + Image + - - - Ui_AmendThemeDialog - - Shadow Color: - + + Height: + - - - ServiceManager - - &Notes - + + Outline + - - - Ui_MainWindow - - E&xit - + + Main Font + - - - Ui_OpenLPImportDialog - - Close - + + Solid Color + - - - MainWindow - - OpenLP Version Updated - + + Font Main + - - - Ui_customEditDialog - - Replace edited slide - + + Use Default Location: + - - - EditCustomForm - - You need to enter a title - + + Other Options + - - - ThemeManager - - Theme Exists - + + Shadow + - - - Ui_MainWindow - - &Help - + + Italics + - - - Ui_EditVerseDialog - - Bridge - + + Background: + - - - Ui_OpenSongExportDialog - - OpenSong Song Exporter - + + X Position: + - - - Ui_AmendThemeDialog - - Vertical Align: - + + Center + - - - Ui_EditVerseDialog - - Pre-Chorus - + + <Color2> + - - - Ui_AmendThemeDialog - - Top - + + Opaque + - - - BiblesTab - - Display Dual Bible Verses - + + Outline Color: + - - - Ui_MainWindow - - Toggle Service Manager - + + Alignment + - - - Ui_EditSongDialog - - Delete - + + Normal + - - - MediaManagerItem - - &Add to Service - + + Bold + - - - AmendThemeForm - - First Color: - + + Footer Font + - - - ThemesTab - - Song level - + + Theme Maintenance + - - - alertsPlugin - - Show an alert message - + + <Color1> + - - - Ui_MainWindow - - Ctrl+F1 - + + Font Footer + - - - SongMaintenanceForm - - Couldn't save your topic. - + + Font Weight: + - - - Ui_MainWindow - - Save the current service under a new name - + + Transparent + - - - Ui_OpenLPExportDialog - - Remove Selected - + + Background + - - - ThemeManager - - Delete theme - + + Vertical + - - - ImageTab - - Image Settings - + + Width: + - - - Ui_OpenSongImportDialog - - OpenSong Song Importer - + + Middle + - - - SongUsagePlugin - - &Extract recorded data - + + Shadow Color: + - - - AlertsTab - - Font Name: - + + Vertical Align: + - - - Ui_MainWindow - - &Web Site - + + Top + - - - MediaManagerItem - - Send the selected item live - + + Right + - - - Ui_MainWindow - - M&ode - + + Font Color: + - - Translate the interface to your language - + + Horizontal + - - Service Manager - + + Circular + - - - CustomMediaItem - - Custom - + + pt + - - - Ui_BibleImportWizard - - OSIS - + + px + - - - SongsPlugin - - openlp.org 1.0 - + + Display Location + - - - Ui_MainWindow - - &Theme - + + Y Position: + - - - Ui_EditVerseDialog - - Edit Verse - + + Show Shadow: + - - - Ui_MainWindow - - &Language - + + Font: + - - - ServiceManager - - Move to end - + + Preview + - - Your service is unsaved, do you want to save those changes before creating a new one ? - + + Outline Size: + - - - Ui_OpenSongExportDialog - - Remove Selected - + + Wrap Indentation + - - - SongMediaItem - - Search: - + + Left + - - - MainWindow - - Save Changes to Service? - + + Theme Name: + - - Your service has changed, do you want to save those changes? - + + Image: + - - - ServiceManager - - &Delete From Service - + + Transition Active: + - - - Ui_EditSongDialog - - &Add to Song - + + Size: + - - - Ui_MainWindow - - &About - + + Gradient : + - - - ImportWizardForm - - You need to specify a version name for your Bible. - + + Bold/Italics + - - - BiblesTab - - Only show new chapter numbers - + + Horizontal Align: + - - - Ui_AlertEditDialog - - Delete - + + Background Type: + - - - EditCustomForm - - Error - + + Show Outline: + - - - ThemesTab - - Use the theme from the service, overriding any of the individual songs' themes. If the service doesn't have a theme, then use the global theme. - + + Gradient + - - - AlertEditForm - - - Item selected to Add - - - - - Ui_AmendThemeDialog - - - Right - - - - - ThemeManager - - - Save Theme - (%s) - - - - - MediaManagerItem - - - Add the selected item(s) to the service - - - - - AuthorsForm - - - Error - - - - - Ui_AmendThemeDialog - - - Font Color: - - - - - Ui_OpenLPImportDialog - - - Select openlp.org songfile to import: - - - - - Ui_SettingsDialog - - - Settings - - - - - BiblesTab - - - Layout Style: - - - - - MediaManagerItem - - - Edit the selected - - - - - SlideController - - - Move to next - - - - - Ui_MainWindow - - - &Plugin List - - - - - BiblePlugin - - - &Bible - - - - - Ui_BibleImportWizard - - - Web Download - - - - - Ui_AmendThemeDialog - - - Horizontal - - - - - ImportWizardForm - - - Open OSIS file - - - - - Ui_AmendThemeDialog - - - Circular - - - - - PresentationMediaItem - - - Automatic - - - - - SongMaintenanceForm - - - Couldn't save your book. - - - - - Ui_AmendThemeDialog - - - pt - - - - - SongMaintenanceForm - - - Delete Topic - - - - - Ui_OpenLPImportDialog - - - Lyrics - - - - - BiblesTab - - - No brackets - - - - - Ui_AlertEditDialog - - - Maintain Alerts - - - - - Ui_AmendThemeDialog - - - px - - - - - ServiceManager - - - Select a theme for the service - - - - - ThemesTab - - - Themes - - - - - Ui_PluginViewDialog - - - Status: - - - - - Ui_EditSongDialog - - - CCLI Number: - - - - - ImportWizardForm - - - This Bible already exists! Please import a different Bible or first delete the existing one. - - - - - Ui_MainWindow - - - &Translate - - - - - BiblesTab - - - Bibles - - - - - Ui_SongMaintenanceDialog - - - Authors - - - - - SongUsageDetailForm - - - Output File Location - - - - - BiblesTab - - - { and } - - - - - GeneralTab - - - Prompt to save Service before starting New - - - - - ImportWizardForm - - - Starting import... - - - - - BiblesTab - - - Note: -Changes don't affect verses already in the service - - - - - Ui_EditVerseDialog - - - Intro - - - - - ServiceManager - - - Move up order - - - - - PresentationTab - - - available - - - - - ThemeManager - - - default - - - - - SongMaintenanceForm - - - Delete Author - - - - - Ui_AmendThemeDialog - - - Display Location - - - - - Ui_PluginViewDialog - - - Version: - - - - - Ui_AlertEditDialog - - - Add - - - - - GeneralTab - - - General - - - - - Ui_AmendThemeDialog - - - Y Position: - - - - - ServiceManager - - - Move down order - - - - - BiblesTab - - - verse per slide - - - - - Ui_AmendThemeDialog - - - Show Shadow: - - - - - AlertsTab - - - Preview - - - - - alertsPlugin - - - <b>Alerts Plugin</b><br>This plugin controls the displaying of alerts on the presentations screen - - - - - GeneralTab - - - Show the splash screen - - - - - Ui_MainWindow - - - New Service - - - - - SlideController - - - Move to first - - - - - Ui_MainWindow - - - &Online Help - - - - - SlideController - - - Blank Screen - - - - - Ui_MainWindow - - - Save Service - - - - - Save &As... - - - - - Toggle the visibility of the Media Manager - - - - - BibleMediaItem - - - No Book Found - - - - - Ui_EditSongDialog - - - Add - - - - - alertsPlugin - - - &Alert - - - - - BibleMediaItem - - - Advanced - - - - - ImageMediaItem - - - Image(s) - - - - - Ui_MainWindow - - - F11 - - - - - F10 - - - - - F12 - - - - - CustomPlugin - - - <b>Custom Plugin</b><br>This plugin allows slides to be displayed on the screen in the same way songs are. This plugin provides greater freedom over the songs plugin.<br> - - - - - Ui_MainWindow - - - Alt+F7 - - - - - Add an application to the list of tools - - - - - MediaPlugin - - - <b>Media Plugin</b><br>This plugin allows the playing of audio and video media - - - - - ServiceManager - - - Move &down - - - - - BiblesTab - - - Bible Theme: - - - - - SongsPlugin - - - Export songs in openlp.org 1.0 format - - - - - Ui_MainWindow - - - Theme Manager - - - - - AlertsTab - - - Alerts - - - - - Ui_customEditDialog - - - Move slide down 1 - - - - - Ui_AmendThemeDialog - - - Font: - - - - - ServiceManager - - - Load an existing service - - - - - Ui_MainWindow - - - Toggle the visibility of the Theme Manager - - - - - PresentationTab - - - Presentations - - - - - SplashScreen - - - Starting - - - - - ImageTab - - - Slide Loop Delay: - - - - - SlideController - - - Verse - - - - - AlertsTab - - - Alert timeout: - - - - - Ui_MainWindow - - - &Preview Pane - - - - - MediaManagerItem - - - Add a new - - - - - ThemeManager - - - Select Theme Import File - - - - - New Theme - - - - - MediaMediaItem - - - Media - - - - - Ui_AmendThemeDialog - - - Preview - - - - - Outline Size: - - - - - Ui_OpenSongExportDialog - - - Progress: - - - - - AmendThemeForm - - - Second Color: - - - - - Ui_EditSongDialog - - - Theme, Copyright Info && Comments - - - - - Ui_AboutDialog - - - Credits - - - - - BibleMediaItem - - - To: - - - - - Ui_EditSongDialog - - - Song Book - - - - - Ui_OpenLPExportDialog - - - Author - - - - - Ui_AmendThemeDialog - - - Wrap Indentation - - - - - ThemeManager - - - Import a theme - - - - - ImageMediaItem - - - Image - - - - - BibleMediaItem - - - Clear - - - - - Ui_MainWindow - - - Save Service As - - - - - Ui_AlertDialog - - - Cancel - - - - - Ui_OpenLPImportDialog - - - Import - - - - - Ui_EditVerseDialog - - - Chorus - - - - - Ui_EditSongDialog - - - Edit All - - - - - AuthorsForm - - - You need to type in the last name of the author. - - - - - SongsTab - - - Songs Mode - - - - - Ui_AmendThemeDialog - - - Left - - - - - RemotesPlugin - - - <b>Remote Plugin</b><br>This plugin provides the ability to send messages to a running version of openlp on a different computer.<br>The Primary use for this would be to send alerts from a creche - - - - - ImageTab - - - Images - - - - - BibleMediaItem - - - Verse: - - - - - Ui_OpenLPExportDialog - - - openlp.org Song Exporter - - - - - Song Export List - - - - - ThemeManager - - - Export theme - - - - - Ui_SongMaintenanceDialog - - - Delete - - - - - Ui_AmendThemeDialog - - - Theme Name: - - - - - Ui_AboutDialog - - - About OpenLP - - - - - Ui_MainWindow - - - Toggle the visibility of the Service Manager - - - - - PresentationMediaItem - - - A presentation with that filename already exists. - - - - - ImageMediaItem - - - Allow the background of live slide to be overridden - - - - - SongUsageDeleteForm - - - Are you sure you want to delete selected Song Usage data? - - - - - AlertsTab - - - openlp.org - - - - - ImportWizardForm - - - Invalid Books File - - - - - Ui_OpenLPImportDialog - - - Song Title - - - - - MediaManagerItem - - - &Show Live - - - - - AlertsTab - - - Keep History: - - - - - Ui_AmendThemeDialog - - - Image: - - - - - ImportWizardForm - - - Open Verses CSV file - - - - - Ui_customEditDialog - - - Set Theme for Slides - - - - - Ui_MainWindow - - - More information about OpenLP - - - - - AlertsTab - - - Background Color: - - - - - SongMaintenanceForm - - - No topic selected! - - - - - Ui_MainWindow - - - &Media Manager - - - - - &Tools - - - - - AmendThemeForm - - - Background Color: - - - - - Ui_EditSongDialog - - - A&dd to Song - - - - - Title: - - - - - GeneralTab - - - Screen - - - - - SongMaintenanceForm - - - This topic can't be deleted, it is currently assigned to at least one song. - - - - - AlertsTab - - - s - - - - - Ui_AlertEditDialog - - - Clear - - - - - Ui_BibleImportWizard - - - Please wait while your Bible is imported. - - - - - MediaManagerItem - - - No items selected... - - - - - Ui_OpenLPImportDialog - - - Select All - - - - - Ui_BibleImportWizard - - - Select the import format, and where to import from. - - - - - Ui_OpenLPImportDialog - - - Title - - - - - Ui_OpenSongExportDialog - - - Select OpenSong song folder: - - - - - Ui_MainWindow - - - Toggle Media Manager - - - - - SongUsagePlugin - - - &Song Usage - - - - - GeneralTab - - - Monitors - - - - - EditCustomForm - - - You need to enter a slide - - - - - ThemeManager - - - You have not selected a theme. - - - - - Ui_EditVerseDialog - - - Verse Type - - - - - ImportWizardForm - - - You need to specify a file to import your Bible from. - - - - - Ui_EditSongDialog - - - Comments - - - - - AlertsTab - - - Bottom - - - - - Ui_MainWindow - - - Create a new Service - - - - - AlertsTab - - - Top - - - - - ServiceManager - - - &Preview Verse - - - - - Ui_PluginViewDialog - - - TextLabel - - - - - AlertsTab - - - Font Size: - - - - - Ui_PluginViewDialog - - - About: - - - - - Inactive - - - - - Ui_OpenSongExportDialog - - - Ready to export - - - - - Export - - - - - Ui_PluginViewDialog - - - Plugin List - - - - - Ui_AmendThemeDialog - - - Transition Active: - - - - - Ui_BibleImportWizard - - - Proxy Server (Optional) - - - - - Ui_EditSongDialog - - - &Manage Authors, Topics, Books - - - - - Ui_OpenLPExportDialog - - - Ready to export - - - - - ImageMediaItem - - - Images (*.jpg *.jpeg *.gif *.png *.bmp);; All files (*) - - - - - EditCustomForm - - - Save && Preview - - - - - Ui_OpenLPExportDialog - - - Select All - - - - - Ui_SongUsageDetailDialog - - - to - - - - - Ui_AmendThemeDialog - - - Size: - - - - - MainWindow - - - OpenLP Main Display Blanked - - - - - Ui_OpenLPImportDialog - - - Remove Selected - - - - - ServiceManager - - - Move &up - - - - - ImportWizardForm - - - You need to specify an OpenSong Bible file to import. - - - - - PresentationMediaItem - - - Select Presentation(s) - - - - - File exists - - - - - Ui_OpenSongImportDialog - - - Ready to import - - - - - SlideController - - - Stop continuous loop - - - - - s - - - - - ImagePlugin - - - <b>Image Plugin</b><br>Allows images of all types to be displayed. If a number of images are selected together and presented on the live controller it is possible to turn them into a timed loop.<br<br>From the plugin if the <i>Override background</i> is chosen and an image is selected any songs which are rendered will use the selected image from the background instead of the one provied by the theme.<br> - - - - - SongMediaItem - - - Song Maintenance - - - - - Ui_customEditDialog - - - Edit - - - - - Ui_AmendThemeDialog - - - Gradient : - - - - - ImportWizardForm - - - Invalid Verse File - - - - - EditSongForm - - - Error - - - - - Ui_customEditDialog - - - Add New - - - - + + Ui_AuthorsDialog - - Display name: - + + Last name: + - - - SongMaintenanceForm - - Are you sure you want to delete the selected topic? - + + First name: + - - - Ui_AmendThemeDialog - - Bold/Italics - + + Author Maintenance + - - - Ui_SongMaintenanceDialog - - Song Maintenance - + + Display name: + - - + + Ui_BibleImportWizard - - Welcome to the Bible Import Wizard - - - - - SongsTab - - - Songs - - - - - Ui_BibleImportWizard - - - Password: - - - - - Ui_MainWindow - - - &Theme Manager - - - - - MediaManagerItem - - - Preview the selected item - - - - - Ui_BibleImportWizard - - - Version Name: - - - - - Ui_AboutDialog - - - About - - - - - MediaMediaItem - - - Select Media - - - - - Ui_AmendThemeDialog - - - Horizontal Align: - - - - - ServiceManager - - - &Edit Item - - - - - Ui_AmendThemeDialog - - - Background Type: - - - - - Ui_MainWindow - - - &Save - + + Bible Import Wizard + - - OpenLP 2.0 - - - - - ThemeManager - - - A theme with this name already exists, would you like to overwrite it? - + + Bible: + - - Export a theme - - - - - AmendThemeForm - - - Open file - - - - - Ui_TopicsDialog - - - Topic Maintenance - - - - - Ui_customEditDialog - - - Clear edit area - - - - - Ui_AmendThemeDialog - - - Show Outline: - + + Crosswalk + - - Gradient - + + CSV + - - - SongBookForm - - You need to type in a book name! - + + OpenSong + - - - ImportWizardForm - - Open OpenSong Bible - + + File Location: + - - - Ui_MainWindow - - Look && &Feel - + + 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. + - - - Ui_BibleImportWizard - - Ready. - + + Copyright: + - - - Ui_SongMaintenanceDialog - - Books/Hymnals - + + Verse Location: + - - - Ui_AboutDialog - - Contribute - + + Server: + - - - ServiceManager - - Move to &bottom - + + Permission: + - - - Ui_BibleImportWizard - - Books Location: - + + Select Import Source + - - + + + Set up the Bible's license details. + + + + + BibleGateway + + + + + Username: + + + + + Download Options + + + + + Location: + + + + + Bible Filename: + + + + + Format: + + + + + Importing + + + + + License Details + + + + + OSIS + + + + + Web Download + + + + + Please wait while your Bible is imported. + + + + + Select the import format, and where to import from. + + + + + Proxy Server (Optional) + + + + + Welcome to the Bible Import Wizard + + + + + Password: + + + + + Version Name: + + + + + Ready. + + + + + Books Location: + + + + + Ui_EditSongDialog + + + &Remove + + + + + Alternative Title: + + + + + Add a Theme + + + + + R&emove + + + + + Verse Order: + + + + + Title && Lyrics + + + + + Theme + + + + + Authors, Topics && Book + + + + + Copyright Information + + + + + Topic + + + + + Lyrics: + + + + + Edit + + + + + Authors + + + + + Song Editor + + + + + Delete + + + + + &Add to Song + + + + + CCLI Number: + + + + + Add + + + + + Theme, Copyright Info && Comments + + + + + Song Book + + + + + Edit All + + + + + A&dd to Song + + + + + Title: + + + + + Comments + + + + + &Manage Authors, Topics, Books + + + + + Ui_EditVerseDialog + + + Verse + + + + + Ending + + + + + Number + + + + + Other + + + + + Bridge + + + + + Pre-Chorus + + + + + Edit Verse + + + + + Intro + + + + + Chorus + + + + + Verse Type + + + + + Ui_OpenLPExportDialog + + + Song Title + + + + + Title + + + + + Select openlp.org export filename: + + + + + Close + + + + + Export + + + + + Lyrics + + + + + Full Song List + + + + + Progress: + + + + + Remove Selected + + + + + Author + + + + + openlp.org Song Exporter + + + + + Song Export List + + + + + Ready to export + + + + + Select All + + + + + Ui_OpenLPImportDialog + + + Author + + + + + Ready to import + + + + + Progress: + + + + + openlp.org Song Importer + + + + + Song Import List + + + + + Import File Song List + + + + + Close + + + + + Select openlp.org songfile to import: + + + + + Lyrics + + + + + Import + + + + + Song Title + + + + + Select All + + + + + Title + + + + + Remove Selected + + + + Ui_OpenSongExportDialog - - Full Song List - + + Close + - - - GeneralTab - - SongSelect Password: - + + Lyrics + - - + + + Song Title + + + + + Select All + + + + + Song Export List + + + + + Author + + + + + Title + + + + + OpenSong Song Exporter + + + + + Remove Selected + + + + + Progress: + + + + + Select OpenSong song folder: + + + + + Ready to export + + + + + Export + + + + + Full Song List + + + + + Ui_OpenSongImportDialog + + + OpenSong Folder: + + + + + Import + + + + + Close + + + + + Progress: + + + + + OpenSong Song Importer + + + + + Ready to import + + + + + Ui_PluginViewDialog + + + Plugin Details + + + + + Active + + + + + Status: + + + + + Version: + + + + + TextLabel + + + + + About: + + + + + Inactive + + + + + Plugin List + + + + + Ui_ServiceItemEditDialog + + + Service Item Maintenance + + + + + Up + + + + + Delete + + + + + Down + + + + + Ui_ServiceNoteEdit + + + Service Item Notes + + + + + Ui_SettingsDialog + + + Settings + + + + + Ui_SongBookDialog + + + Name: + + + + + Edit Book + + + + + Publisher: + + + + + Ui_SongMaintenanceDialog + + + Edit + + + + + Topics + + + + + Add + + + + + Authors + + + + + Delete + + + + + Song Maintenance + + + + + Books/Hymnals + + + + + Ui_SongUsageDeleteDialog + + + Song Usage Delete + + + + + Ui_SongUsageDetailDialog + + + Report Location + + + + + Song Usage Extraction + + + + + Select Date Range + + + + + to + + + + + Ui_TopicsDialog + + + Topic name: + + + + + Topic Maintenance + + + + + Ui_customEditDialog + + + Delete selected slide + + + + + Edit selected slide + + + + + Edit All + + + + + Add new slide at bottom + + + + + Clear + + + + + Delete + + + + + Theme: + + + + + Move slide Up 1 + + + + + Title: + + + + + Credits: + + + + + Edit Custom Slides + + + + + Edit all slides + + + + + Save + + + + + Replace edited slide + + + + + Move slide down 1 + + + + + Edit + + + + + Add New + + + + + Clear edit area + + + + + Split Slide + + + + + Add slide split + + + + + alertsPlugin + + + Show an alert message + + + + + <b>Alerts Plugin</b><br>This plugin controls the displaying of alerts on the presentations screen + + + + + &Alert + + + + + export_menu + + + &Bible + + + + + &Song + + + + + OpenSong + + + + + openlp.org 1.0 + + + + + OpenLP 2.0 + + + + + import_menu + + + &Bible + + + + + &Song + + + + + OpenSong + + + + + openlp.org 1.0 + + + + + Import songs in openlp.org 1.0 format + + + + + OpenLP 2.0 + + + + + Import songs in OpenLP 2.0 format + + + + + Songs of Fellowship + + + + + Import songs from the VOLS1_2.RTF, sof3words.rtf and sof4words.rtf supplied with the music books + + + + + Generic Document/Presentation Import + + + + + Import songs from Word/Writer/Powerpoint/Impress + + + + + self.ImportSongMenu + + + Import Error + + + + + Error importing Songs of Fellowship file. +OpenOffice.org must be installed and you must be using an unedited copy of the RTF included with the Songs of Fellowship Music Editions + + + + + self.splash_screen + + + Starting + + + + + Splash Screen + + + + + tools_menu + + + &Song Usage + + + + + &Delete recorded data + + + + + Delete song usage to specified date + + + + + &Extract recorded data + + + + + Generate report on Song Usage + + + + + Song Usage Status + + + + + Start/Stop live song usage recording + + + diff --git a/resources/i18n/openlp_en_GB.qm b/resources/i18n/openlp_en_GB.qm index ba67f92d1960c5aacc9ce47122b14b490c06e614..60c04ed9b289e24a8344182665dbb0c7d94e11c9 100644 GIT binary patch delta 4812 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 V{%O6e)0Z>~x|S8R#bkZO{2MjI0vP}R delta 4958 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 delta 3470 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 diff --git a/resources/i18n/openlp_hu.qm b/resources/i18n/openlp_hu.qm index c6632c745835ec60cfe298ae528ff8d11cc9f320..1efe9be1bcd2a63733fa3119955e2a4a6f9119d5 100644 GIT binary patch delta 4863 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 delta 5008 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 XdHVm&o8gz0kL1dZnXIW_wT1aV47w&- delta 5032 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 Hs+fNRE^JUt diff --git a/resources/i18n/openlp_sv.qm b/resources/i18n/openlp_sv.qm index cd3485ece4368db4359f7bbd5bd3df2cf0ccf488..43f9f9c758707b497053ca05c30ae8ec8119bbf6 100644 GIT binary patch delta 5243 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 diff --git a/scripts/translation_utils.py b/scripts/translation_utils.py index edc61f5d6..bfb443d1b 100755 --- a/scripts/translation_utils.py +++ b/scripts/translation_utils.py @@ -25,14 +25,9 @@ ############################################################################### # Short description # Steps for creating languages: -# 1. create an empty ts file for the wished translation in ./resources/i18n folder +# 1. make shure that the openlp_en.ts file exist # 2. go to scripts folder and start: -# python generate_pro.py -# 3. go to main folder and start: -# pylupdate4 openlp.pro -# 4. do all the translation stuff at the related *.ts files (install first qt3-dev-tools) -# 5. at main folder start: -# lrelease -verbose openlp.pro +# python translation_utils.py -a ############################################################################### import os From b83d1157389aaf3120b6046d8f83f97deb86fcc5 Mon Sep 17 00:00:00 2001 From: rimach Date: Thu, 22 Apr 2010 19:27:26 +0200 Subject: [PATCH 13/81] Copyright character solution --- openlp/core/ui/aboutdialog.py | 59 ++-- openlp/plugins/songs/forms/editsongdialog.py | 2 +- resources/i18n/openlp_af.qm | Bin 34058 -> 33942 bytes resources/i18n/openlp_de.qm | Bin 36123 -> 36466 bytes resources/i18n/openlp_en.ts | 343 +++++++++++++------ resources/i18n/openlp_en_GB.qm | Bin 31458 -> 31360 bytes resources/i18n/openlp_en_ZA.qm | Bin 22957 -> 22950 bytes resources/i18n/openlp_es.qm | Bin 14874 -> 14867 bytes resources/i18n/openlp_hu.qm | Bin 35007 -> 34879 bytes resources/i18n/openlp_nb.qm | Bin 21181 -> 21120 bytes resources/i18n/openlp_pt_BR.qm | Bin 35695 -> 35585 bytes resources/i18n/openlp_sv.qm | Bin 37039 -> 36927 bytes 12 files changed, 261 insertions(+), 143 deletions(-) diff --git a/openlp/core/ui/aboutdialog.py b/openlp/core/ui/aboutdialog.py index 7d8d27103..b3a7ffcbe 100644 --- a/openlp/core/ui/aboutdialog.py +++ b/openlp/core/ui/aboutdialog.py @@ -24,27 +24,28 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_AboutDialog(object): - def setupUi(self, AboutDialog): - AboutDialog.setObjectName(u'AboutDialog') - AboutDialog.resize(516, 481) + def setupUi(self, AboutForm): + AboutForm.setObjectName(u'AboutDialog') + AboutForm.resize(516, 481) LogoIcon = QtGui.QIcon() LogoIcon.addPixmap(QtGui.QPixmap(u':/icon/openlp-logo-16x16.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - AboutDialog.setWindowIcon(LogoIcon) - self.AboutDialogLayout = QtGui.QVBoxLayout(AboutDialog) - self.AboutDialogLayout.setSpacing(8) - self.AboutDialogLayout.setMargin(8) - self.AboutDialogLayout.setObjectName(u'AboutDialogLayout') - self.LogoLabel = QtGui.QLabel(AboutDialog) + AboutForm.setWindowIcon(LogoIcon) + self.AboutFormLayout = QtGui.QVBoxLayout(AboutForm) + self.AboutFormLayout.setSpacing(8) + self.AboutFormLayout.setMargin(8) + self.AboutFormLayout.setObjectName(u'AboutFormLayout') + self.LogoLabel = QtGui.QLabel(AboutForm) self.LogoLabel.setPixmap( QtGui.QPixmap(u':/graphics/openlp-about-logo.png')) self.LogoLabel.setScaledContents(False) self.LogoLabel.setIndent(0) self.LogoLabel.setObjectName(u'LogoLabel') - self.AboutDialogLayout.addWidget(self.LogoLabel) - self.AboutNotebook = QtGui.QTabWidget(AboutDialog) + self.AboutFormLayout.addWidget(self.LogoLabel) + self.AboutNotebook = QtGui.QTabWidget(AboutForm) self.AboutNotebook.setObjectName(u'AboutNotebook') self.AboutTab = QtGui.QWidget() self.AboutTab.setObjectName(u'AboutTab') @@ -79,8 +80,8 @@ class Ui_AboutDialog(object): self.LicenseTextEdit.setObjectName(u'LicenseTextEdit') self.LicenseTabLayout.addWidget(self.LicenseTextEdit) self.AboutNotebook.addTab(self.LicenseTab, '') - self.AboutDialogLayout.addWidget(self.AboutNotebook) - self.ButtonWidget = QtGui.QWidget(AboutDialog) + self.AboutFormLayout.addWidget(self.AboutNotebook) + self.ButtonWidget = QtGui.QWidget(AboutForm) self.ButtonWidget.setObjectName(u'ButtonWidget') self.ButtonWidgetLayout = QtGui.QHBoxLayout(self.ButtonWidget) self.ButtonWidgetLayout.setSpacing(8) @@ -104,17 +105,17 @@ class Ui_AboutDialog(object): self.CloseButton.setIcon(CloseIcon) self.CloseButton.setObjectName(u'CloseButton') self.ButtonWidgetLayout.addWidget(self.CloseButton) - self.AboutDialogLayout.addWidget(self.ButtonWidget) + self.AboutFormLayout.addWidget(self.ButtonWidget) - self.retranslateUi(AboutDialog) + self.retranslateUi(AboutForm) self.AboutNotebook.setCurrentIndex(0) QtCore.QObject.connect(self.CloseButton, QtCore.SIGNAL(u'clicked()'), - AboutDialog.close) - QtCore.QMetaObject.connectSlotsByName(AboutDialog) + AboutForm.close) + QtCore.QMetaObject.connectSlotsByName(AboutForm) - def retranslateUi(self, AboutDialog): - AboutDialog.setWindowTitle(self.trUtf8('About OpenLP')) - self.AboutTextEdit.setPlainText(self.trUtf8( + def retranslateUi(self, AboutForm): + AboutForm.setWindowTitle(translate('AboutForm', 'About OpenLP')) + self.AboutTextEdit.setPlainText(translate('AboutForm', 'OpenLP - Open Source Lyrics ' 'Projection\n' '\n' @@ -131,8 +132,8 @@ class Ui_AboutDialog(object): 'consider contributing by using the button below.' )) self.AboutNotebook.setTabText( - self.AboutNotebook.indexOf(self.AboutTab), self.trUtf8('About')) - self.CreditsTextEdit.setPlainText(self.trUtf8( + self.AboutNotebook.indexOf(self.AboutTab), translate('AboutForm', 'About')) + self.CreditsTextEdit.setPlainText(translate('AboutForm', 'Project Lead\n' ' Raoul "superfly" Snyman\n' '\n' @@ -164,11 +165,11 @@ class Ui_AboutDialog(object): )) self.AboutNotebook.setTabText( self.AboutNotebook.indexOf(self.CreditsTab), - self.trUtf8('Credits')) - self.LicenseTextEdit.setPlainText(self.trUtf8( - 'Copyright ' + u'\u00a9'.encode('utf8') + ' 2004-2010 Raoul ' + translate('AboutForm', 'Credits')) + self.LicenseTextEdit.setPlainText(translate('AboutForm', + 'Copyright \xa9 2004-2010 Raoul ' 'Snyman\n' - 'Portions copyright ' + u'\u00a9'.encode('utf8') + ' 2004-2010 ' + 'Portions copyright \xa9 2004-2010 ' 'Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, ' 'Christian Richter, Maikel Stuivenberg, Martin Thompson, Jon ' 'Tibble, Carsten Tinggaard\n' @@ -557,6 +558,6 @@ class Ui_AboutDialog(object): 'instead of this License.')) self.AboutNotebook.setTabText( self.AboutNotebook.indexOf(self.LicenseTab), - self.trUtf8('License')) - self.ContributeButton.setText(self.trUtf8('Contribute')) - self.CloseButton.setText(self.trUtf8('Close')) + translate('AboutForm', 'License')) + self.ContributeButton.setText(translate('AboutForm', 'Contribute')) + self.CloseButton.setText(translate('AboutForm', 'Close')) diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index b992aeea4..ae0308c80 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -445,7 +445,7 @@ class Ui_EditSongDialog(object): self.ThemeGroupBox.setTitle(self.trUtf8('Theme')) self.ThemeAddButton.setText(self.trUtf8('Add a Theme')) self.CopyrightGroupBox.setTitle(self.trUtf8('Copyright Information')) - self.CopyrightInsertButton.setText(self.trUtf8(u'\u00a9'.encode('utf8'))) + self.CopyrightInsertButton.setText(self.trUtf8(u'\xa9')) self.CCLILabel.setText(self.trUtf8('CCLI Number:')) self.CommentsGroupBox.setTitle(self.trUtf8('Comments')) self.SongTabWidget.setTabText( diff --git a/resources/i18n/openlp_af.qm b/resources/i18n/openlp_af.qm index f7f13cbfafcdec3d5090914de27ca07c13cab55e..48b4c532238f23dbe9550e82b65475a00d5fd039 100644 GIT binary patch delta 4631 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 delta 4730 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 diff --git a/resources/i18n/openlp_de.qm b/resources/i18n/openlp_de.qm index b0493348fdd4f19f45a05f0ec5dbad9c92551101..ac8b76ce8b2ba92daf90ee56cad39664f0ab65c7 100644 GIT binary patch delta 5088 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 TH7hIZ8I9_ndyUKkD}VV1ju1hE delta 4718 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 - - - AlertDialog - - Alert Message + + About OpenLP - - Alert &text: + + OpenLP <version><revision> - Open Source Lyrics Projection + +OpenLP is free church presentation software, or lyrics projection software, used to display slides of songs, Bible verses, videos, images, and even presentations (if OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. + +Find out more about OpenLP: http://openlp.org/ + +OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. - - &Parameter(s): + + About - - &New + + Project Lead + Raoul "superfly" Snyman + +Developers + Tim "TRB143" Bentley + Jonathan "gushie" Corwin + Michael "cocooncrash" Gorven + Scott "sguerrieri" Guerrieri + Raoul "superfly" Snyman + Martin "mijiti" Thompson + Jon "Meths" Tibble + +Contributors + Meinert "m2j" Jordan + Christian "crichter" Richter + Maikel Stuivenberg + Carsten "catini" Tingaard + +Testers + Philip "Phill" Ridout + Wesley "wrst" Stout (lead) + +Packagers + Thomas "tabthorpe" Abthorpe (FreeBSD) + Tim "TRB143" Bentley (Fedora) + Michael "cocooncrash" Gorven (Ubuntu) + Matthias "matthub" Hub (Mac OS X) + Raoul "superfly" Snyman (Windows) + - - &Save + + Credits - - &Edit + + Copyright © 2004-2010 Raoul Snyman +Portions copyright © 2004-2010 Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Carsten Tinggaard + +This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See below for more details. + + +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. + +Preamble + +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + +GNU GENERAL PUBLIC LICENSE +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. + +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version', you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +END OF TERMS AND CONDITIONS + +How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. + +To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. + +<one line to give the program's name and a brief idea of what it does.> +Copyright (C) <year> <name of author> + +This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this when it starts in an interactive mode: + +Gnomovision version 69, Copyright (C) year name of author +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type "show w". +This is free software, and you are welcome to redistribute it under certain conditions; type "show c" for details. + +The hypothetical commands "show w" and "show c" should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than "show w" and "show c"; they could even be mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: + +Yoyodyne, Inc., hereby disclaims all copyright interest in the program "Gnomovision" (which makes passes at compilers) written by James Hacker. + +<signature of Ty Coon>, 1 April 1989 +Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. - - &Delete + + License - - Displ&ay + + Contribute - - Display && Cl&ose - - - - - &Close + + Close AlertForm - + Item selected to Add - + Missing data @@ -77,77 +233,72 @@ AlertsTab - + pt - + Location: - + Font Color: - + Font - + Font Name: - + Preview - + Alerts - + Alert timeout: - + openlp.org - - Keep History: - - - - + Background Color: - + s - + Bottom - + Top - + Font Size: @@ -612,7 +763,7 @@ Changes don't affect verses already in the service - + Image(s) @@ -632,12 +783,12 @@ Changes don't affect verses already in the service - + No item selected - + You must select one item @@ -1182,7 +1333,7 @@ You can download the latest version from http://openlp.org - + You must select one or more items @@ -1252,32 +1403,32 @@ You can download the latest version from http://openlp.org - + No Items Selected - + You must select one or more items. - + No items selected - + No Service Item Selected - + You must select a existing service item to add to. - + Invalid Service Item @@ -1334,7 +1485,7 @@ You can download the latest version from http://openlp.org - + A presentation with that filename already exists. @@ -1344,7 +1495,7 @@ You can download the latest version from http://openlp.org - + File exists @@ -1357,7 +1508,7 @@ You can download the latest version from http://openlp.org PresentationPlugin - + <b>Presentation Plugin</b> <br> Delivers the ability to show presentations using a number of different programs. The choice of available presentation programs is available to the user in a drop down box. @@ -2066,84 +2217,50 @@ You can download the latest version from http://openlp.org - Ui_AboutDialog + Ui_AlertDialog - - Close + + Alert Message - - License + + Alert &text: - - Credits + + &Parameter(s): - - About OpenLP + + &New - - About + + &Save - - Contribute + + &Delete - - OpenLP <version><revision> - Open Source Lyrics Projection - -OpenLP is free church presentation software, or lyrics projection software, used to display slides of songs, Bible verses, videos, images, and even presentations (if OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) for church worship using a computer and a data projector. - -Find out more about OpenLP: http://openlp.org/ - -OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below. + + Displ&ay - - Project Lead - Raoul "superfly" Snyman - -Developers - Tim "TRB143" Bentley - Jonathan "gushie" Corwin - Michael "cocooncrash" Gorven - Scott "sguerrieri" Guerrieri - Raoul "superfly" Snyman - Martin "mijiti" Thompson - Jon "Meths" Tibble - -Contributors - Meinert "m2j" Jordan - Christian "crichter" Richter - Maikel Stuivenberg - Carsten "catini" Tingaard - -Testers - Philip "Phill" Ridout - Wesley "wrst" Stout (lead) - -Packagers - Thomas "tabthorpe" Abthorpe (FreeBSD) - Tim "TRB143" Bentley (Fedora) - Michael "cocooncrash" Gorven (Ubuntu) - Matthias "matthub" Hub (Mac OS X) - Raoul "superfly" Snyman (Windows) - + + Display && Cl&ose - - Copyright + + &Close diff --git a/resources/i18n/openlp_en_GB.qm b/resources/i18n/openlp_en_GB.qm index 60c04ed9b289e24a8344182665dbb0c7d94e11c9..d5acb055374d1f4a239d63baa435ca6483c7f99a 100644 GIT binary patch delta 4570 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 delta 4662 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 Gxc>l`=HUJS diff --git a/resources/i18n/openlp_hu.qm b/resources/i18n/openlp_hu.qm index 1efe9be1bcd2a63733fa3119955e2a4a6f9119d5..530115bb4b7ab9365fa94f2b6fabee1ed482ba1c 100644 GIT binary patch delta 4617 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 VRJ~4KPkGrZJAT=TF^$T5^&iIL3itp3 diff --git a/resources/i18n/openlp_nb.qm b/resources/i18n/openlp_nb.qm index 13ee0572814256aa023251ebd7c6a5ada0c1b5ec..2976e8d1e4d3c321698379c1762236c907a28e73 100644 GIT binary patch delta 2956 zcmYk-3tUav9tZIMK4dEF)qTl0l*fTUb{W-izV?36_r(`q-oVBHc3#2ha zHxqHOin)sAij9gNXl!jKkw&I*rKzyL;&{a+iaRJ~i-7;v&;)bcMPozaHYEW%23epLSDFEEkz4Z;Mvb#!%BIowS* z!WY1cbYJ#@oz%SkA(7xl4`w`u6Y2MuB)EuCT`7TOjJn_wyv%fIMuI{I1U?xc~-+-U@JncRLTnY5o-dZr9EGTW?266w`U z&2RW_^{z}qcn=uGG+h}1=PD`ACdx1T$_q&k+31g(Boy|1q)vhJpq zwqm8$1J&}00vN4!h)sYw>amfnaFaU4^t^SGdV$ME_*PvVe~hThK=rK)n_;TDtvJqz zV41qZ+_6jjpD~lrKFex5gWvJv7rLCS+sXjoXW*y#S+;sxem z*HTvp1GuN#JK-e7b&B;|#~uUvA8AxJ*!@m!nl5wjyi>BqCJdX-sYw%9=nh|KQsVrG zoOw;g%v#u2lNsR*jWL>evoXLqPqRdeUF%$;Ilr?XtW#{W=+aa3qqi-Q%TP^gJC2h} z4Bw-?8t&kGYwy7)yzd-)BG*2AwDVdR!$>g;lJyN`dag?4^2jE*&4i%`W9$8J1clnJJh)+e4_RDA4Am7Q9Jcx1kQiI zFzsC5Ms(zAPptQar!DpuwclrBg8sv`mpXoeX^LAFn{?cCyny<*>t*VNjCyq|Jql57u8n+5wM!S)VEnLPy-Orc&#+8=Y%f%3Sfx>)?u7}4+vqbR z^)O7I6%Yic=nHnBRKpkOtJ<;4hi}oJ_L&PC^!HLCh=RN5@0Txvar&437$3aCFxd2p z4X!mrr=fDe&4!ixE)j){G*o|xg(-$3pCh5r*@n|C7#~_>xR5d!8uuEmvdB2}k>Tfy zI0YlD4b9EjaEwe5budeI4M$~0?2X|8m?) z+4c5B;aa(26UK!*$&d5$-~_on274=fuH1h73fzXX9NwU=`BAu|s=20Lp%R3!)SS=r zB6H@?t;w)T4K}_ee08`O)B6LLOufj%9GPxI@E2fiMVs%YTQa37F-nDNk!cs3uQj-r zn4?llhjK5cJ&3B5Rvn!u`fGn1HPCi7D-+W1aQ7qfy1MZOG&?^zPH<KIVWcp*_OC;?N+lY&X4&ocVplL delta 2987 zcmY+`2~-qE8VB&NXS%0nrh8@(IRsH)2tk1$AeSH@69gm?g973ag(QF=E*cf1Mn{8L z6!AdBThtJU2jYQf0^WEp3a&?7+~9#2CBa)ZvaaSoOuO%;-kbhaRae(keO*;E3(A=z z<;+SeW^a-8Nn;&LBzr>cO|C?84Y~jB4fW*VeHw<4NBU8iL>?8Jr0h*&fA@!8G)};blo68C zCCh1C`g7DDrtu2&r@Tz#&tpQ$`({<5q|uMQxb+*6Dw>wg#!OU`sC3aCxP-P3KnJSh z)Ra*Qf2OO3>F_oEqVpnBe?TqE@4{rdoze!srMJV!!b(PVsTf{l*h)&Ir2)g&@!4R&x2(|BnJ+`?R!ZG)$noB0U2=2x>?d#0n~9+5Uwrj%ho z+Oaa5`sHLKZL!R$7BkYd%bY!55?Q#&T+7kGB1x8%(ii5-N=nP&b=mj+?(l!Ink)>k zhp+6_>Chj=Rd7rpM_?`Tts8)DZKEd?7rA$8Ec@=b%S0&WI6#4aY zB}QaQv3MT5=leKX7g?_AK*)^EYI_X>BRaS2pNo3{0 zrsbx=bau{O49Kd4&C6L0E8$vL&lc{%;G1v zcGFlaKI>EL4uz?FhuyXO4Uvrnd<)&!N>9wlCQLF*a-8(gnx3=MbK)aRz%G>2R3HL&UvOcm?XZXo%bN;YxbR)BMD`pvWJMX&OOBK*U%;LreArie8a_Ng};5sfNeG9BN>)^nx4h$o5NaHpx zUI(iruW*}!Z=rmTE1jD`)F+Xvs>eY4WJ{KCd-t2lJB?DN8DdfOdCnco!ASdxT&-mm zbmUG%{{iE;TeY=tGWTF}7yP^Aamhcp&I&D&qpd<_h1Ktvtgy_+^NuSNRuNcqPBO)y z0(a=Bm=Ny|gB9tihoEtcVp60NG7A*bCYu`kpqQ(~s&zV}sNd!WJIp%kCF2zT@U|v$ z&Q!EM!FF<9z}uBp!7IFr@+Ohqp7+bPhokuzr$V@ZkJ*OE>NoOP#KQ)&F2qkwz;i|y zXMWbJL?V|Ye*VJ0!P$J_#aTq}74R#A9>N-aRb@}uz;C&U2)VlO+lFPrulN&>@SN)p z{6ELOgiZX76<+WyfA{HWqW2^D*1IO>D%olrNbet1a<&%mu`FYz#Qt|5quQ*%NZsd1?o#bu8H{p+YIpSp_*8Yi zK~3b*OVxU~9QvrK0Ncr%rwqNW|X?(fR@N>zj~h%AswJn|M>Va3{ck+?hhEDZp=LZ z@2RhJp`AA;$ej=opKO6O)%z3)?2b)vr=W;5`OvJdi!js!yTdn1Ft)yd7lp#8Hll$Q zLRmg0Ht>j0X8gB^%srvZq@ROif>6`ii1IYy=z2Wp_ei+UAVU7B!hq!!H%5=Tz@66IuZb+|oTBCh{&DBLM-V4C62W`mXDhS!IQf?dVRuy$w=_vp}1 zaH`}Qao?CWll2Fyyn=zDX>d(a{?A^=upisrL*B8O-CTwhyJAX zF&(j??b?{n5xKA)+WhSoV6L|6bsQ|x?w^SPg_mlN-9r0tW4-p=1RrFYwM{HWJj7Pp zd>*@CNTjx!ss5MD1_uO* z5!q>9&WOxR&Cbanj@;|m>O4)UOsPxEoEY(0&dlNk7LLVjmUh+SEqp?aF9`3oJ2Bl? z71@xhRD-3CoNsr@@c+6b!cS9o!oiF*oxbXp=v%m~J70_|j&mt(rR~V=kxGZ@G&Q}u zh3$)ka}Vh^de$uw4(z`shBKELyjsSQ>4z(p;a?Nu|E|nLm~%`FgI9*O3CyPqqVz5? zbIds=pBcCsx3T4Lt-|LBK4;!FlNuq|ro>>qn^X0LIB!O$mBJ}Sy86`!4~DTW-sfw> Nk$_iFZHNzJ{sf`T>HGiy diff --git a/resources/i18n/openlp_pt_BR.qm b/resources/i18n/openlp_pt_BR.qm index bf300059d46778496e8323244234b0c60eb9b27b..f5f4cdc71514feaae60e0b02de436026b4aeb124 100644 GIT binary patch delta 4621 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 delta 4718 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 a2{smgovhc%sg<){_4aEwrpl|3WBwOo7Cq4b From f7d1fba359329cd1c5484a4741074d6a9537e9ee Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 26 Apr 2010 21:22:10 +0200 Subject: [PATCH 14/81] Fixes to the docs. --- documentation/source/core/lib.rst | 6 ------ documentation/source/plugins/bibles.rst | 9 ++++++--- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/documentation/source/core/lib.rst b/documentation/source/core/lib.rst index 146d0d934..37360a43a 100644 --- a/documentation/source/core/lib.rst +++ b/documentation/source/core/lib.rst @@ -18,12 +18,6 @@ .. autoclass:: openlp.core.lib.eventreceiver.EventReceiver :members: -:mod:`ListWithPreviews` ------------------------ - -.. autoclass:: openlp.core.lib.listwithpreviews.ListWithPreviews - :members: - :mod:`MediaManagerItem` ----------------------- diff --git a/documentation/source/plugins/bibles.rst b/documentation/source/plugins/bibles.rst index d374c1e97..c042feb56 100644 --- a/documentation/source/plugins/bibles.rst +++ b/documentation/source/plugins/bibles.rst @@ -45,10 +45,10 @@ :mod:`csv` ^^^^^^^^^^ -.. automodule:: openlp.plugins.bibles.lib.csv +.. automodule:: openlp.plugins.bibles.lib.csvbible :members: -.. autoclass:: openlp.plugins.bibles.lib.csv.CSVBible +.. autoclass:: openlp.plugins.bibles.lib.csvbible.CSVBible :members: :mod:`http` @@ -63,7 +63,10 @@ :mod:`bibleOSISimpl` ^^^^^^^^^^^^^^^^^^^^ -.. automodule:: openlp.plugins.bibles.lib.bibleOSISimpl +.. automodule:: openlp.plugins.bibles.lib.osis + :members: + +.. autoclass:: openlp.plugins.bibles.lib.osis.OSISBible :members: :mod:`biblestab` From 181c19d1123d2011004eadb273c3b6f8e45521f0 Mon Sep 17 00:00:00 2001 From: rimach Date: Tue, 27 Apr 2010 22:54:55 +0200 Subject: [PATCH 15/81] futher changes --- openlp/core/ui/aboutform.py | 1 + openlp/core/ui/amendthemedialog.py | 267 +++++++++--------- openlp/core/ui/plugindialog.py | 41 +-- openlp/core/ui/serviceitemeditdialog.py | 23 +- openlp/core/ui/servicenotedialog.py | 17 +- openlp/core/ui/settingsdialog.py | 25 +- openlp/plugins/alerts/forms/alertdialog.py | 75 ++--- .../plugins/bibles/forms/bibleimportwizard.py | 89 +++--- .../plugins/custom/forms/editcustomdialog.py | 105 +++---- openlp/plugins/songs/forms/authorsdialog.py | 41 +-- openlp/plugins/songs/forms/editsongdialog.py | 129 ++++----- openlp/plugins/songs/forms/editversedialog.py | 55 ++-- .../plugins/songs/forms/openlpexportdialog.py | 63 +++-- .../plugins/songs/forms/openlpimportdialog.py | 63 +++-- 14 files changed, 504 insertions(+), 490 deletions(-) diff --git a/openlp/core/ui/aboutform.py b/openlp/core/ui/aboutform.py index c79324515..cf051722b 100644 --- a/openlp/core/ui/aboutform.py +++ b/openlp/core/ui/aboutform.py @@ -26,6 +26,7 @@ from PyQt4 import QtCore, QtGui from aboutdialog import Ui_AboutDialog +from openlp.core.lib import translate class AboutForm(QtGui.QDialog, Ui_AboutDialog): """ diff --git a/openlp/core/ui/amendthemedialog.py b/openlp/core/ui/amendthemedialog.py index 65d675cd1..65c7b21a5 100644 --- a/openlp/core/ui/amendthemedialog.py +++ b/openlp/core/ui/amendthemedialog.py @@ -25,20 +25,21 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon +from openlp.core.lib import translate class Ui_AmendThemeDialog(object): - def setupUi(self, AmendThemeDialog): - AmendThemeDialog.setObjectName(u'AmendThemeDialog') - AmendThemeDialog.setWindowModality(QtCore.Qt.ApplicationModal) - AmendThemeDialog.resize(586, 651) + def setupUi(self, AmendThemeForm): + AmendThemeForm.setObjectName(u'AmendThemeDialog') + AmendThemeForm.setWindowModality(QtCore.Qt.ApplicationModal) + AmendThemeForm.resize(586, 651) icon = build_icon(u':/icon/openlp-logo-16x16.png') - AmendThemeDialog.setWindowIcon(icon) - AmendThemeDialog.setModal(True) - self.AmendThemeLayout = QtGui.QVBoxLayout(AmendThemeDialog) + AmendThemeForm.setWindowIcon(icon) + AmendThemeForm.setModal(True) + self.AmendThemeLayout = QtGui.QVBoxLayout(AmendThemeForm) self.AmendThemeLayout.setSpacing(8) self.AmendThemeLayout.setMargin(8) self.AmendThemeLayout.setObjectName(u'AmendThemeLayout') - self.ThemeNameWidget = QtGui.QWidget(AmendThemeDialog) + self.ThemeNameWidget = QtGui.QWidget(AmendThemeForm) self.ThemeNameWidget.setObjectName(u'ThemeNameWidget') self.ThemeNameLayout = QtGui.QHBoxLayout(self.ThemeNameWidget) self.ThemeNameLayout.setSpacing(8) @@ -51,7 +52,7 @@ class Ui_AmendThemeDialog(object): self.ThemeNameEdit.setObjectName(u'ThemeNameEdit') self.ThemeNameLayout.addWidget(self.ThemeNameEdit) self.AmendThemeLayout.addWidget(self.ThemeNameWidget) - self.ContentWidget = QtGui.QWidget(AmendThemeDialog) + self.ContentWidget = QtGui.QWidget(AmendThemeForm) self.ContentWidget.setObjectName(u'ContentWidget') self.ContentLayout = QtGui.QHBoxLayout(self.ContentWidget) self.ContentLayout.setSpacing(8) @@ -525,7 +526,7 @@ class Ui_AmendThemeDialog(object): self.ThemeTabWidget.addTab(self.OtherOptionsTab, u'') self.ContentLayout.addWidget(self.ThemeTabWidget) self.AmendThemeLayout.addWidget(self.ContentWidget) - self.PreviewGroupBox = QtGui.QGroupBox(AmendThemeDialog) + self.PreviewGroupBox = QtGui.QGroupBox(AmendThemeForm) self.PreviewGroupBox.setObjectName(u'PreviewGroupBox') self.ThemePreviewLayout = QtGui.QHBoxLayout(self.PreviewGroupBox) self.ThemePreviewLayout.setSpacing(8) @@ -549,140 +550,140 @@ class Ui_AmendThemeDialog(object): spacerItem8 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) self.ThemePreviewLayout.addItem(spacerItem8) self.AmendThemeLayout.addWidget(self.PreviewGroupBox) - self.ThemeButtonBox = QtGui.QDialogButtonBox(AmendThemeDialog) + self.ThemeButtonBox = QtGui.QDialogButtonBox(AmendThemeForm) self.ThemeButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.ThemeButtonBox.setObjectName(u'ThemeButtonBox') self.AmendThemeLayout.addWidget(self.ThemeButtonBox) - self.retranslateUi(AmendThemeDialog) + self.retranslateUi(AmendThemeForm) self.ThemeTabWidget.setCurrentIndex(0) - QtCore.QObject.connect(self.ThemeButtonBox, QtCore.SIGNAL(u'accepted()'), AmendThemeDialog.accept) - QtCore.QObject.connect(self.ThemeButtonBox, QtCore.SIGNAL(u'rejected()'), AmendThemeDialog.reject) - QtCore.QMetaObject.connectSlotsByName(AmendThemeDialog) - AmendThemeDialog.setTabOrder(self.ThemeButtonBox, self.ThemeNameEdit) - AmendThemeDialog.setTabOrder(self.ThemeNameEdit, self.ThemeTabWidget) - AmendThemeDialog.setTabOrder(self.ThemeTabWidget, self.BackgroundComboBox) - AmendThemeDialog.setTabOrder(self.BackgroundComboBox, self.BackgroundTypeComboBox) - AmendThemeDialog.setTabOrder(self.BackgroundTypeComboBox, self.Color1PushButton) - AmendThemeDialog.setTabOrder(self.Color1PushButton, self.Color2PushButton) - AmendThemeDialog.setTabOrder(self.Color2PushButton, self.ImageLineEdit) - AmendThemeDialog.setTabOrder(self.ImageLineEdit, self.ImageToolButton) - AmendThemeDialog.setTabOrder(self.ImageToolButton, self.GradientComboBox) - AmendThemeDialog.setTabOrder(self.GradientComboBox, self.FontMainComboBox) - AmendThemeDialog.setTabOrder(self.FontMainComboBox, self.FontMainColorPushButton) - AmendThemeDialog.setTabOrder(self.FontMainColorPushButton, self.FontMainSizeSpinBox) - AmendThemeDialog.setTabOrder(self.FontMainSizeSpinBox, self.FontMainWeightComboBox) - AmendThemeDialog.setTabOrder(self.FontMainWeightComboBox, self.FontMainLineSpacingSpinBox) - AmendThemeDialog.setTabOrder(self.FontMainLineSpacingSpinBox, self.FontMainDefaultCheckBox) - AmendThemeDialog.setTabOrder(self.FontMainDefaultCheckBox, self.FontMainXSpinBox) - AmendThemeDialog.setTabOrder(self.FontMainXSpinBox, self.FontMainYSpinBox) - AmendThemeDialog.setTabOrder(self.FontMainYSpinBox, self.FontMainWidthSpinBox) - AmendThemeDialog.setTabOrder(self.FontMainWidthSpinBox, self.FontMainHeightSpinBox) - AmendThemeDialog.setTabOrder(self.FontMainHeightSpinBox, self.FontFooterComboBox) - AmendThemeDialog.setTabOrder(self.FontFooterComboBox, self.FontFooterColorPushButton) - AmendThemeDialog.setTabOrder(self.FontFooterColorPushButton, self.FontFooterSizeSpinBox) - AmendThemeDialog.setTabOrder(self.FontFooterSizeSpinBox, self.FontFooterWeightComboBox) - AmendThemeDialog.setTabOrder(self.FontFooterWeightComboBox, self.FontFooterDefaultCheckBox) - AmendThemeDialog.setTabOrder(self.FontFooterDefaultCheckBox, self.FontFooterXSpinBox) - AmendThemeDialog.setTabOrder(self.FontFooterXSpinBox, self.FontFooterYSpinBox) - AmendThemeDialog.setTabOrder(self.FontFooterYSpinBox, self.FontFooterWidthSpinBox) - AmendThemeDialog.setTabOrder(self.FontFooterWidthSpinBox, self.FontFooterHeightSpinBox) - AmendThemeDialog.setTabOrder(self.FontFooterHeightSpinBox, self.OutlineCheckBox) - AmendThemeDialog.setTabOrder(self.OutlineCheckBox, self.OutlineColorPushButton) - AmendThemeDialog.setTabOrder(self.OutlineColorPushButton, self.ShadowCheckBox) - AmendThemeDialog.setTabOrder(self.ShadowCheckBox, self.ShadowColorPushButton) - AmendThemeDialog.setTabOrder(self.ShadowColorPushButton, self.HorizontalComboBox) - AmendThemeDialog.setTabOrder(self.HorizontalComboBox, self.VerticalComboBox) + QtCore.QObject.connect(self.ThemeButtonBox, QtCore.SIGNAL(u'accepted()'), AmendThemeForm.accept) + QtCore.QObject.connect(self.ThemeButtonBox, QtCore.SIGNAL(u'rejected()'), AmendThemeForm.reject) + QtCore.QMetaObject.connectSlotsByName(AmendThemeForm) + AmendThemeForm.setTabOrder(self.ThemeButtonBox, self.ThemeNameEdit) + AmendThemeForm.setTabOrder(self.ThemeNameEdit, self.ThemeTabWidget) + AmendThemeForm.setTabOrder(self.ThemeTabWidget, self.BackgroundComboBox) + AmendThemeForm.setTabOrder(self.BackgroundComboBox, self.BackgroundTypeComboBox) + AmendThemeForm.setTabOrder(self.BackgroundTypeComboBox, self.Color1PushButton) + AmendThemeForm.setTabOrder(self.Color1PushButton, self.Color2PushButton) + AmendThemeForm.setTabOrder(self.Color2PushButton, self.ImageLineEdit) + AmendThemeForm.setTabOrder(self.ImageLineEdit, self.ImageToolButton) + AmendThemeForm.setTabOrder(self.ImageToolButton, self.GradientComboBox) + AmendThemeForm.setTabOrder(self.GradientComboBox, self.FontMainComboBox) + AmendThemeForm.setTabOrder(self.FontMainComboBox, self.FontMainColorPushButton) + AmendThemeForm.setTabOrder(self.FontMainColorPushButton, self.FontMainSizeSpinBox) + AmendThemeForm.setTabOrder(self.FontMainSizeSpinBox, self.FontMainWeightComboBox) + AmendThemeForm.setTabOrder(self.FontMainWeightComboBox, self.FontMainLineSpacingSpinBox) + AmendThemeForm.setTabOrder(self.FontMainLineSpacingSpinBox, self.FontMainDefaultCheckBox) + AmendThemeForm.setTabOrder(self.FontMainDefaultCheckBox, self.FontMainXSpinBox) + AmendThemeForm.setTabOrder(self.FontMainXSpinBox, self.FontMainYSpinBox) + AmendThemeForm.setTabOrder(self.FontMainYSpinBox, self.FontMainWidthSpinBox) + AmendThemeForm.setTabOrder(self.FontMainWidthSpinBox, self.FontMainHeightSpinBox) + AmendThemeForm.setTabOrder(self.FontMainHeightSpinBox, self.FontFooterComboBox) + AmendThemeForm.setTabOrder(self.FontFooterComboBox, self.FontFooterColorPushButton) + AmendThemeForm.setTabOrder(self.FontFooterColorPushButton, self.FontFooterSizeSpinBox) + AmendThemeForm.setTabOrder(self.FontFooterSizeSpinBox, self.FontFooterWeightComboBox) + AmendThemeForm.setTabOrder(self.FontFooterWeightComboBox, self.FontFooterDefaultCheckBox) + AmendThemeForm.setTabOrder(self.FontFooterDefaultCheckBox, self.FontFooterXSpinBox) + AmendThemeForm.setTabOrder(self.FontFooterXSpinBox, self.FontFooterYSpinBox) + AmendThemeForm.setTabOrder(self.FontFooterYSpinBox, self.FontFooterWidthSpinBox) + AmendThemeForm.setTabOrder(self.FontFooterWidthSpinBox, self.FontFooterHeightSpinBox) + AmendThemeForm.setTabOrder(self.FontFooterHeightSpinBox, self.OutlineCheckBox) + AmendThemeForm.setTabOrder(self.OutlineCheckBox, self.OutlineColorPushButton) + AmendThemeForm.setTabOrder(self.OutlineColorPushButton, self.ShadowCheckBox) + AmendThemeForm.setTabOrder(self.ShadowCheckBox, self.ShadowColorPushButton) + AmendThemeForm.setTabOrder(self.ShadowColorPushButton, self.HorizontalComboBox) + AmendThemeForm.setTabOrder(self.HorizontalComboBox, self.VerticalComboBox) - def retranslateUi(self, AmendThemeDialog): - AmendThemeDialog.setWindowTitle(self.trUtf8('Theme Maintenance')) - self.ThemeNameLabel.setText(self.trUtf8('Theme Name:')) - self.BackgroundLabel.setText(self.trUtf8('Background:')) - self.BackgroundComboBox.setItemText(0, self.trUtf8('Opaque')) - self.BackgroundComboBox.setItemText(1, self.trUtf8('Transparent')) - self.BackgroundTypeLabel.setText(self.trUtf8('Background Type:')) - self.BackgroundTypeComboBox.setItemText(0, self.trUtf8('Solid Color')) - self.BackgroundTypeComboBox.setItemText(1, self.trUtf8('Gradient')) - self.BackgroundTypeComboBox.setItemText(2, self.trUtf8('Image')) - self.Color1Label.setText(self.trUtf8('')) - self.Color2Label.setText(self.trUtf8('')) - self.ImageLabel.setText(self.trUtf8('Image:')) - self.GradientLabel.setText(self.trUtf8('Gradient :')) - self.GradientComboBox.setItemText(0, self.trUtf8('Horizontal')) - self.GradientComboBox.setItemText(1, self.trUtf8('Vertical')) - self.GradientComboBox.setItemText(2, self.trUtf8('Circular')) + def retranslateUi(self, AmendThemeForm): + AmendThemeForm.setWindowTitle(translate('AmendThemeForm','Theme Maintenance')) + self.ThemeNameLabel.setText(translate('AmendThemeForm','Theme Name:')) + self.BackgroundLabel.setText(translate('AmendThemeForm','Background:')) + self.BackgroundComboBox.setItemText(0, translate('AmendThemeForm','Opaque')) + self.BackgroundComboBox.setItemText(1, translate('AmendThemeForm','Transparent')) + self.BackgroundTypeLabel.setText(translate('AmendThemeForm','Background Type:')) + self.BackgroundTypeComboBox.setItemText(0, translate('AmendThemeForm','Solid Color')) + self.BackgroundTypeComboBox.setItemText(1, translate('AmendThemeForm','Gradient')) + self.BackgroundTypeComboBox.setItemText(2, translate('AmendThemeForm','Image')) + self.Color1Label.setText(translate('AmendThemeForm','')) + self.Color2Label.setText(translate('AmendThemeForm','')) + self.ImageLabel.setText(translate('AmendThemeForm','Image:')) + self.GradientLabel.setText(translate('AmendThemeForm','Gradient :')) + self.GradientComboBox.setItemText(0, translate('AmendThemeForm','Horizontal')) + self.GradientComboBox.setItemText(1, translate('AmendThemeForm','Vertical')) + self.GradientComboBox.setItemText(2, translate('AmendThemeForm','Circular')) self.ThemeTabWidget.setTabText( self.ThemeTabWidget.indexOf(self.BackgroundTab), - self.trUtf8('Background')) - self.FontMainGroupBox.setTitle(self.trUtf8('Main Font')) - self.FontMainlabel.setText(self.trUtf8('Font:')) - self.FontMainColorLabel.setText(self.trUtf8('Font Color:')) - self.FontMainSize.setText(self.trUtf8('Size:')) - self.FontMainSizeSpinBox.setSuffix(self.trUtf8('pt')) - self.FontMainWrapIndentationLabel.setText(self.trUtf8('Wrap Indentation')) - self.FontMainWeightComboBox.setItemText(0, self.trUtf8('Normal')) - self.FontMainWeightComboBox.setItemText(1, self.trUtf8('Bold')) - self.FontMainWeightComboBox.setItemText(2, self.trUtf8('Italics')) - self.FontMainWeightComboBox.setItemText(3, self.trUtf8('Bold/Italics')) - self.FontMainWeightLabel.setText(self.trUtf8('Font Weight:')) - self.MainLocationGroupBox.setTitle(self.trUtf8('Display Location')) - self.DefaultLocationLabel.setText(self.trUtf8('Use Default Location:')) - self.FontMainXLabel.setText(self.trUtf8('X Position:')) - self.FontMainYLabel.setText(self.trUtf8('Y Position:')) - self.FontMainWidthLabel.setText(self.trUtf8('Width:')) - self.FontMainHeightLabel.setText(self.trUtf8('Height:')) - self.FontMainXSpinBox.setSuffix(self.trUtf8('px')) - self.FontMainYSpinBox.setSuffix(self.trUtf8('px')) - self.FontMainWidthSpinBox.setSuffix(self.trUtf8('px')) - self.FontMainHeightSpinBox.setSuffix(self.trUtf8('px')) + translate('AmendThemeForm','Background')) + self.FontMainGroupBox.setTitle(translate('AmendThemeForm','Main Font')) + self.FontMainlabel.setText(translate('AmendThemeForm','Font:')) + self.FontMainColorLabel.setText(translate('AmendThemeForm','Font Color:')) + self.FontMainSize.setText(translate('AmendThemeForm','Size:')) + self.FontMainSizeSpinBox.setSuffix(translate('AmendThemeForm','pt')) + self.FontMainWrapIndentationLabel.setText(translate('AmendThemeForm','Wrap Indentation')) + self.FontMainWeightComboBox.setItemText(0, translate('AmendThemeForm','Normal')) + self.FontMainWeightComboBox.setItemText(1, translate('AmendThemeForm','Bold')) + self.FontMainWeightComboBox.setItemText(2, translate('AmendThemeForm','Italics')) + self.FontMainWeightComboBox.setItemText(3, translate('AmendThemeForm','Bold/Italics')) + self.FontMainWeightLabel.setText(translate('AmendThemeForm','Font Weight:')) + self.MainLocationGroupBox.setTitle(translate('AmendThemeForm','Display Location')) + self.DefaultLocationLabel.setText(translate('AmendThemeForm','Use Default Location:')) + self.FontMainXLabel.setText(translate('AmendThemeForm','X Position:')) + self.FontMainYLabel.setText(translate('AmendThemeForm','Y Position:')) + self.FontMainWidthLabel.setText(translate('AmendThemeForm','Width:')) + self.FontMainHeightLabel.setText(translate('AmendThemeForm','Height:')) + self.FontMainXSpinBox.setSuffix(translate('AmendThemeForm','px')) + self.FontMainYSpinBox.setSuffix(translate('AmendThemeForm','px')) + self.FontMainWidthSpinBox.setSuffix(translate('AmendThemeForm','px')) + self.FontMainHeightSpinBox.setSuffix(translate('AmendThemeForm','px')) self.ThemeTabWidget.setTabText( self.ThemeTabWidget.indexOf(self.FontMainTab), - self.trUtf8('Font Main')) - self.FooterFontGroupBox.setTitle(self.trUtf8('Footer Font')) - self.FontFooterLabel.setText(self.trUtf8('Font:')) - self.FontFooterColorLabel.setText(self.trUtf8('Font Color:')) - self.FontFooterSizeLabel.setText(self.trUtf8('Size:')) - self.FontFooterSizeSpinBox.setSuffix(self.trUtf8('pt')) - self.FontFooterWeightComboBox.setItemText(0, self.trUtf8('Normal')) - self.FontFooterWeightComboBox.setItemText(1, self.trUtf8('Bold')) - self.FontFooterWeightComboBox.setItemText(2, self.trUtf8('Italics')) - self.FontFooterWeightComboBox.setItemText(3, self.trUtf8('Bold/Italics')) - self.FontFooterWeightLabel.setText(self.trUtf8('Font Weight:')) - self.LocationFooterGroupBox.setTitle(self.trUtf8('Display Location')) - self.FontFooterDefaultLabel.setText(self.trUtf8('Use Default Location:')) - self.FontFooterXLabel.setText(self.trUtf8('X Position:')) - self.FontFooterYLabel.setText(self.trUtf8('Y Position:')) - self.FontFooterWidthLabel.setText(self.trUtf8('Width:')) - self.FontFooterHeightLabel.setText(self.trUtf8('Height:')) - self.FontFooterXSpinBox.setSuffix(self.trUtf8('px')) - self.FontFooterYSpinBox.setSuffix(self.trUtf8('px')) - self.FontFooterWidthSpinBox.setSuffix(self.trUtf8('px')) - self.FontFooterHeightSpinBox.setSuffix(self.trUtf8('px')) + translate('AmendThemeForm','Font Main')) + self.FooterFontGroupBox.setTitle(translate('AmendThemeForm','Footer Font')) + self.FontFooterLabel.setText(translate('AmendThemeForm','Font:')) + self.FontFooterColorLabel.setText(translate('AmendThemeForm','Font Color:')) + self.FontFooterSizeLabel.setText(translate('AmendThemeForm','Size:')) + self.FontFooterSizeSpinBox.setSuffix(translate('AmendThemeForm','pt')) + self.FontFooterWeightComboBox.setItemText(0, translate('AmendThemeForm','Normal')) + self.FontFooterWeightComboBox.setItemText(1, translate('AmendThemeForm','Bold')) + self.FontFooterWeightComboBox.setItemText(2, translate('AmendThemeForm','Italics')) + self.FontFooterWeightComboBox.setItemText(3, translate('AmendThemeForm','Bold/Italics')) + self.FontFooterWeightLabel.setText(translate('AmendThemeForm','Font Weight:')) + self.LocationFooterGroupBox.setTitle(translate('AmendThemeForm','Display Location')) + self.FontFooterDefaultLabel.setText(translate('AmendThemeForm','Use Default Location:')) + self.FontFooterXLabel.setText(translate('AmendThemeForm','X Position:')) + self.FontFooterYLabel.setText(translate('AmendThemeForm','Y Position:')) + self.FontFooterWidthLabel.setText(translate('AmendThemeForm','Width:')) + self.FontFooterHeightLabel.setText(translate('AmendThemeForm','Height:')) + self.FontFooterXSpinBox.setSuffix(translate('AmendThemeForm','px')) + self.FontFooterYSpinBox.setSuffix(translate('AmendThemeForm','px')) + self.FontFooterWidthSpinBox.setSuffix(translate('AmendThemeForm','px')) + self.FontFooterHeightSpinBox.setSuffix(translate('AmendThemeForm','px')) self.ThemeTabWidget.setTabText( self.ThemeTabWidget.indexOf(self.FontFooterTab), - self.trUtf8('Font Footer')) - self.OutlineGroupBox.setTitle(self.trUtf8('Outline')) - self.OutlineSpinBoxLabel.setText(self.trUtf8('Outline Size:')) - self.OutlineSpinBox.setSuffix(self.trUtf8('px')) - self.OutlineColorLabel.setText(self.trUtf8('Outline Color:')) - self.OutlineEnabledLabel.setText(self.trUtf8('Show Outline:')) - self.ShadowGroupBox.setTitle(self.trUtf8('Shadow')) - self.ShadowSpinBoxLabel.setText(self.trUtf8('Shadow Size:')) - self.ShadowSpinBox.setSuffix(self.trUtf8('px')) - self.ShadowColorLabel.setText(self.trUtf8('Shadow Color:')) - self.ShadowEnabledLabel.setText(self.trUtf8('Show Shadow:')) - self.AlignmentGroupBox.setTitle(self.trUtf8('Alignment')) - self.HorizontalLabel.setText(self.trUtf8('Horizontal Align:')) - self.HorizontalComboBox.setItemText(0, self.trUtf8('Left')) - self.HorizontalComboBox.setItemText(1, self.trUtf8('Right')) - self.HorizontalComboBox.setItemText(2, self.trUtf8('Center')) - self.VerticalLabel.setText(self.trUtf8('Vertical Align:')) - self.VerticalComboBox.setItemText(0, self.trUtf8('Top')) - self.VerticalComboBox.setItemText(1, self.trUtf8('Middle')) - self.VerticalComboBox.setItemText(2, self.trUtf8('Bottom')) - self.TransitionGroupBox.setTitle(self.trUtf8('Slide Transition')) - self.SlideTransitionCheckedBoxLabel.setText(self.trUtf8('Transition Active:')) + translate('AmendThemeForm','Font Footer')) + self.OutlineGroupBox.setTitle(translate('AmendThemeForm','Outline')) + self.OutlineSpinBoxLabel.setText(translate('AmendThemeForm','Outline Size:')) + self.OutlineSpinBox.setSuffix(translate('AmendThemeForm','px')) + self.OutlineColorLabel.setText(translate('AmendThemeForm','Outline Color:')) + self.OutlineEnabledLabel.setText(translate('AmendThemeForm','Show Outline:')) + self.ShadowGroupBox.setTitle(translate('AmendThemeForm','Shadow')) + self.ShadowSpinBoxLabel.setText(translate('AmendThemeForm','Shadow Size:')) + self.ShadowSpinBox.setSuffix(translate('AmendThemeForm','px')) + self.ShadowColorLabel.setText(translate('AmendThemeForm','Shadow Color:')) + self.ShadowEnabledLabel.setText(translate('AmendThemeForm','Show Shadow:')) + self.AlignmentGroupBox.setTitle(translate('AmendThemeForm','Alignment')) + self.HorizontalLabel.setText(translate('AmendThemeForm','Horizontal Align:')) + self.HorizontalComboBox.setItemText(0, translate('AmendThemeForm','Left')) + self.HorizontalComboBox.setItemText(1, translate('AmendThemeForm','Right')) + self.HorizontalComboBox.setItemText(2, translate('AmendThemeForm','Center')) + self.VerticalLabel.setText(translate('AmendThemeForm','Vertical Align:')) + self.VerticalComboBox.setItemText(0, translate('AmendThemeForm','Top')) + self.VerticalComboBox.setItemText(1, translate('AmendThemeForm','Middle')) + self.VerticalComboBox.setItemText(2, translate('AmendThemeForm','Bottom')) + self.TransitionGroupBox.setTitle(translate('AmendThemeForm','Slide Transition')) + self.SlideTransitionCheckedBoxLabel.setText(translate('AmendThemeForm','Transition Active:')) self.ThemeTabWidget.setTabText( self.ThemeTabWidget.indexOf(self.OtherOptionsTab), - self.trUtf8('Other Options')) - self.PreviewGroupBox.setTitle(self.trUtf8('Preview')) + translate('AmendThemeForm','Other Options')) + self.PreviewGroupBox.setTitle(translate('AmendThemeForm','Preview')) diff --git a/openlp/core/ui/plugindialog.py b/openlp/core/ui/plugindialog.py index f4a1773c9..3e94d91b6 100644 --- a/openlp/core/ui/plugindialog.py +++ b/openlp/core/ui/plugindialog.py @@ -24,20 +24,21 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_PluginViewDialog(object): - def setupUi(self, PluginViewDialog): - PluginViewDialog.setObjectName(u'PluginViewDialog') - PluginViewDialog.setWindowModality(QtCore.Qt.ApplicationModal) - PluginViewDialog.resize(554, 344) - self.PluginLayout = QtGui.QVBoxLayout(PluginViewDialog) + def setupUi(self, PluginForm): + PluginForm.setObjectName(u'PluginViewDialog') + PluginForm.setWindowModality(QtCore.Qt.ApplicationModal) + PluginForm.resize(554, 344) + self.PluginLayout = QtGui.QVBoxLayout(PluginForm) self.PluginLayout.setSpacing(8) self.PluginLayout.setMargin(8) self.PluginLayout.setObjectName(u'PluginLayout') self.ListLayout = QtGui.QHBoxLayout() self.ListLayout.setSpacing(8) self.ListLayout.setObjectName(u'ListLayout') - self.PluginListWidget = QtGui.QListWidget(PluginViewDialog) + self.PluginListWidget = QtGui.QListWidget(PluginForm) sizePolicy = QtGui.QSizePolicy( QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) @@ -48,7 +49,7 @@ class Ui_PluginViewDialog(object): self.PluginListWidget.setMaximumSize(QtCore.QSize(192, 16777215)) self.PluginListWidget.setObjectName(u'PluginListWidget') self.ListLayout.addWidget(self.PluginListWidget) - self.PluginInfoGroupBox = QtGui.QGroupBox(PluginViewDialog) + self.PluginInfoGroupBox = QtGui.QGroupBox(PluginForm) self.PluginInfoGroupBox.setAlignment( QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.PluginInfoGroupBox.setFlat(False) @@ -87,22 +88,22 @@ class Ui_PluginViewDialog(object): 2, QtGui.QFormLayout.FieldRole, self.AboutTextBrowser) self.ListLayout.addWidget(self.PluginInfoGroupBox) self.PluginLayout.addLayout(self.ListLayout) - self.PluginListButtonBox = QtGui.QDialogButtonBox(PluginViewDialog) + self.PluginListButtonBox = QtGui.QDialogButtonBox(PluginForm) self.PluginListButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) self.PluginListButtonBox.setObjectName(u'PluginListButtonBox') self.PluginLayout.addWidget(self.PluginListButtonBox) - self.retranslateUi(PluginViewDialog) + self.retranslateUi(PluginForm) QtCore.QObject.connect(self.PluginListButtonBox, - QtCore.SIGNAL(u'accepted()'), PluginViewDialog.close) - QtCore.QMetaObject.connectSlotsByName(PluginViewDialog) + QtCore.SIGNAL(u'accepted()'), PluginForm.close) + QtCore.QMetaObject.connectSlotsByName(PluginForm) - def retranslateUi(self, PluginViewDialog): - PluginViewDialog.setWindowTitle(self.trUtf8('Plugin List')) - self.PluginInfoGroupBox.setTitle(self.trUtf8('Plugin Details')) - self.VersionLabel.setText(self.trUtf8('Version:')) - self.VersionNumberLabel.setText(self.trUtf8('TextLabel')) - self.AboutLabel.setText(self.trUtf8('About:')) - self.StatusLabel.setText(self.trUtf8('Status:')) - self.StatusComboBox.setItemText(0, self.trUtf8('Active')) - self.StatusComboBox.setItemText(1, self.trUtf8('Inactive')) + def retranslateUi(self, PluginForm): + PluginForm.setWindowTitle(translate('PluginForm', 'Plugin List')) + self.PluginInfoGroupBox.setTitle(translate('PluginForm', 'Plugin Details')) + self.VersionLabel.setText(translate('PluginForm', 'Version:')) + self.VersionNumberLabel.setText(translate('PluginForm', 'TextLabel')) + self.AboutLabel.setText(translate('PluginForm', 'About:')) + self.StatusLabel.setText(translate('PluginForm', 'Status:')) + self.StatusComboBox.setItemText(0, translate('PluginForm', 'Active')) + self.StatusComboBox.setItemText(1, translate('PluginForm', 'Inactive')) diff --git a/openlp/core/ui/serviceitemeditdialog.py b/openlp/core/ui/serviceitemeditdialog.py index fbaa52ca1..47691fcdb 100644 --- a/openlp/core/ui/serviceitemeditdialog.py +++ b/openlp/core/ui/serviceitemeditdialog.py @@ -24,12 +24,13 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_ServiceItemEditDialog(object): - def setupUi(self, ServiceItemEditDialog): - ServiceItemEditDialog.setObjectName(u'ServiceItemEditDialog') - ServiceItemEditDialog.resize(386, 272) - self.layoutWidget = QtGui.QWidget(ServiceItemEditDialog) + def setupUi(self, ServiceItemEditForm): + ServiceItemEditForm.setObjectName(u'ServiceItemEditDialog') + ServiceItemEditForm.resize(386, 272) + self.layoutWidget = QtGui.QWidget(ServiceItemEditForm) self.layoutWidget.setGeometry(QtCore.QRect(20, 20, 351, 241)) self.layoutWidget.setObjectName(u'layoutWidget') self.outerLayout = QtGui.QVBoxLayout(self.layoutWidget) @@ -62,12 +63,12 @@ class Ui_ServiceItemEditDialog(object): self.buttonBox.setObjectName(u'buttonBox') self.outerLayout.addWidget(self.buttonBox) - self.retranslateUi(ServiceItemEditDialog) - QtCore.QMetaObject.connectSlotsByName(ServiceItemEditDialog) + self.retranslateUi(ServiceItemEditForm) + QtCore.QMetaObject.connectSlotsByName(ServiceItemEditForm) - def retranslateUi(self, ServiceItemEditDialog): - ServiceItemEditDialog.setWindowTitle(self.trUtf8('Service Item Maintenance')) - self.upButton.setText(self.trUtf8('Up')) - self.deleteButton.setText(self.trUtf8('Delete')) - self.downButton.setText(self.trUtf8('Down')) + def retranslateUi(self, ServiceItemEditForm): + ServiceItemEditForm.setWindowTitle(translate('ServiceItemEditForm', 'Service Item Maintenance')) + self.upButton.setText(translate('ServiceItemEditForm', 'Up')) + self.deleteButton.setText(translate('ServiceItemEditForm', 'Delete')) + self.downButton.setText(translate('ServiceItemEditForm', 'Down')) diff --git a/openlp/core/ui/servicenotedialog.py b/openlp/core/ui/servicenotedialog.py index e1d830c5e..c39b29473 100644 --- a/openlp/core/ui/servicenotedialog.py +++ b/openlp/core/ui/servicenotedialog.py @@ -24,12 +24,13 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_ServiceNoteEdit(object): - def setupUi(self, ServiceNoteEdit): - ServiceNoteEdit.setObjectName(u'ServiceNoteEdit') - ServiceNoteEdit.resize(400, 243) - self.widget = QtGui.QWidget(ServiceNoteEdit) + def setupUi(self, ServiceNoteForm): + ServiceNoteForm.setObjectName(u'ServiceNoteEdit') + ServiceNoteForm.resize(400, 243) + self.widget = QtGui.QWidget(ServiceNoteForm) self.widget.setGeometry(QtCore.QRect(20, 10, 361, 223)) self.widget.setObjectName(u'widget') self.verticalLayout = QtGui.QVBoxLayout(self.widget) @@ -42,8 +43,8 @@ class Ui_ServiceNoteEdit(object): self.buttonBox.setObjectName(u'buttonBox') self.verticalLayout.addWidget(self.buttonBox) - self.retranslateUi(ServiceNoteEdit) - QtCore.QMetaObject.connectSlotsByName(ServiceNoteEdit) + self.retranslateUi(ServiceNoteForm) + QtCore.QMetaObject.connectSlotsByName(ServiceNoteForm) - def retranslateUi(self, ServiceNoteEdit): - ServiceNoteEdit.setWindowTitle(self.trUtf8('Service Item Notes')) + def retranslateUi(self, ServiceNoteForm): + ServiceNoteForm.setWindowTitle(translate('ServiceNoteForm', 'Service Item Notes')) diff --git a/openlp/core/ui/settingsdialog.py b/openlp/core/ui/settingsdialog.py index 7148b0478..fc1ae8ba0 100644 --- a/openlp/core/ui/settingsdialog.py +++ b/openlp/core/ui/settingsdialog.py @@ -24,19 +24,20 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_SettingsDialog(object): - def setupUi(self, SettingsDialog): - SettingsDialog.setObjectName(u'SettingsDialog') - SettingsDialog.resize(724, 502) - self.SettingsLayout = QtGui.QVBoxLayout(SettingsDialog) + def setupUi(self, SettingsForm): + SettingsForm.setObjectName(u'SettingsDialog') + SettingsForm.resize(724, 502) + self.SettingsLayout = QtGui.QVBoxLayout(SettingsForm) self.SettingsLayout.setSpacing(8) self.SettingsLayout.setMargin(8) self.SettingsLayout.setObjectName(u'SettingsLayout') - self.SettingsTabWidget = QtGui.QTabWidget(SettingsDialog) + self.SettingsTabWidget = QtGui.QTabWidget(SettingsForm) self.SettingsTabWidget.setObjectName(u'SettingsTabWidget') self.SettingsLayout.addWidget(self.SettingsTabWidget) - self.ButtonsBox = QtGui.QDialogButtonBox(SettingsDialog) + self.ButtonsBox = QtGui.QDialogButtonBox(SettingsForm) sizePolicy = QtGui.QSizePolicy( QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) @@ -50,13 +51,13 @@ class Ui_SettingsDialog(object): QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.ButtonsBox.setObjectName(u'ButtonsBox') self.SettingsLayout.addWidget(self.ButtonsBox) - self.retranslateUi(SettingsDialog) + self.retranslateUi(SettingsForm) self.SettingsTabWidget.setCurrentIndex(0) QtCore.QObject.connect(self.ButtonsBox, - QtCore.SIGNAL(u'accepted()'), SettingsDialog.accept) + QtCore.SIGNAL(u'accepted()'), SettingsForm.accept) QtCore.QObject.connect(self.ButtonsBox, - QtCore.SIGNAL(u'rejected()'), SettingsDialog.reject) - QtCore.QMetaObject.connectSlotsByName(SettingsDialog) + QtCore.SIGNAL(u'rejected()'), SettingsForm.reject) + QtCore.QMetaObject.connectSlotsByName(SettingsForm) - def retranslateUi(self, SettingsDialog): - SettingsDialog.setWindowTitle(self.trUtf8('Settings')) + def retranslateUi(self, SettingsForm): + SettingsForm.setWindowTitle(translate('SettingsForm', 'Settings')) diff --git a/openlp/plugins/alerts/forms/alertdialog.py b/openlp/plugins/alerts/forms/alertdialog.py index 00203f1f2..cdb455cd3 100644 --- a/openlp/plugins/alerts/forms/alertdialog.py +++ b/openlp/plugins/alerts/forms/alertdialog.py @@ -24,15 +24,16 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_AlertDialog(object): - def setupUi(self, AlertDialog): - AlertDialog.setObjectName(u'AlertDialog') - AlertDialog.resize(567, 440) + def setupUi(self, AlertForm): + AlertForm.setObjectName(u'AlertDialog') + AlertForm.resize(567, 440) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - AlertDialog.setWindowIcon(icon) - self.AlertFormLayout = QtGui.QVBoxLayout(AlertDialog) + AlertForm.setWindowIcon(icon) + self.AlertFormLayout = QtGui.QVBoxLayout(AlertForm) self.AlertFormLayout.setSpacing(8) self.AlertFormLayout.setMargin(8) self.AlertFormLayout.setObjectName(u'AlertFormLayout') @@ -40,7 +41,7 @@ class Ui_AlertDialog(object): self.AlertTextLayout.setContentsMargins(0, 0, -1, -1) self.AlertTextLayout.setSpacing(8) self.AlertTextLayout.setObjectName(u'AlertTextLayout') - self.AlertEntryLabel = QtGui.QLabel(AlertDialog) + self.AlertEntryLabel = QtGui.QLabel(AlertForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -48,13 +49,13 @@ class Ui_AlertDialog(object): self.AlertEntryLabel.setSizePolicy(sizePolicy) self.AlertEntryLabel.setObjectName(u'AlertEntryLabel') self.AlertTextLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.AlertEntryLabel) - self.AlertParameter = QtGui.QLabel(AlertDialog) + self.AlertParameter = QtGui.QLabel(AlertForm) self.AlertParameter.setObjectName(u'AlertParameter') self.AlertTextLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.AlertParameter) - self.ParameterEdit = QtGui.QLineEdit(AlertDialog) + self.ParameterEdit = QtGui.QLineEdit(AlertForm) self.ParameterEdit.setObjectName(u'ParameterEdit') self.AlertTextLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.ParameterEdit) - self.AlertTextEdit = QtGui.QLineEdit(AlertDialog) + self.AlertTextEdit = QtGui.QLineEdit(AlertForm) self.AlertTextEdit.setObjectName(u'AlertTextEdit') self.AlertTextLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.AlertTextEdit) self.AlertFormLayout.addLayout(self.AlertTextLayout) @@ -62,27 +63,27 @@ class Ui_AlertDialog(object): self.ManagementLayout.setSpacing(8) self.ManagementLayout.setContentsMargins(-1, -1, -1, 0) self.ManagementLayout.setObjectName(u'ManagementLayout') - self.AlertListWidget = QtGui.QListWidget(AlertDialog) + self.AlertListWidget = QtGui.QListWidget(AlertForm) self.AlertListWidget.setAlternatingRowColors(True) self.AlertListWidget.setObjectName(u'AlertListWidget') self.ManagementLayout.addWidget(self.AlertListWidget) self.ManageButtonLayout = QtGui.QVBoxLayout() self.ManageButtonLayout.setSpacing(8) self.ManageButtonLayout.setObjectName(u'ManageButtonLayout') - self.NewButton = QtGui.QPushButton(AlertDialog) + self.NewButton = QtGui.QPushButton(AlertForm) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(u':/general/general_new.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.NewButton.setIcon(icon1) self.NewButton.setObjectName(u'NewButton') self.ManageButtonLayout.addWidget(self.NewButton) - self.SaveButton = QtGui.QPushButton(AlertDialog) + self.SaveButton = QtGui.QPushButton(AlertForm) self.SaveButton.setEnabled(False) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(u':/general/general_save.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.SaveButton.setIcon(icon2) self.SaveButton.setObjectName(u'SaveButton') self.ManageButtonLayout.addWidget(self.SaveButton) - self.DeleteButton = QtGui.QPushButton(AlertDialog) + self.DeleteButton = QtGui.QPushButton(AlertForm) icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(u':/general/general_delete.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.DeleteButton.setIcon(icon3) @@ -98,18 +99,18 @@ class Ui_AlertDialog(object): spacerItem1 = QtGui.QSpacerItem(181, 0, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.AlertButtonLayout.addItem(spacerItem1) - self.DisplayButton = QtGui.QPushButton(AlertDialog) + self.DisplayButton = QtGui.QPushButton(AlertForm) icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap(u':/general/general_live.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.DisplayButton.setIcon(icon4) self.DisplayButton.setObjectName(u'DisplayButton') self.AlertButtonLayout.addWidget(self.DisplayButton) - self.DisplayCloseButton = QtGui.QPushButton(AlertDialog) + self.DisplayCloseButton = QtGui.QPushButton(AlertForm) self.DisplayCloseButton.setIcon(icon4) self.DisplayCloseButton.setObjectName(u'DisplayCloseButton') self.AlertButtonLayout.addWidget(self.DisplayCloseButton) - self.CloseButton = QtGui.QPushButton(AlertDialog) + self.CloseButton = QtGui.QPushButton(AlertForm) icon5 = QtGui.QIcon() icon5.addPixmap(QtGui.QPixmap(u':/system/system_close.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -120,26 +121,26 @@ class Ui_AlertDialog(object): self.AlertEntryLabel.setBuddy(self.AlertTextEdit) self.AlertParameter.setBuddy(self.ParameterEdit) - self.retranslateUi(AlertDialog) - QtCore.QObject.connect(self.CloseButton, QtCore.SIGNAL(u'clicked()'), AlertDialog.close) - QtCore.QMetaObject.connectSlotsByName(AlertDialog) - AlertDialog.setTabOrder(self.AlertTextEdit, self.ParameterEdit) - AlertDialog.setTabOrder(self.ParameterEdit, self.AlertListWidget) - AlertDialog.setTabOrder(self.AlertListWidget, self.NewButton) - AlertDialog.setTabOrder(self.NewButton, self.SaveButton) - AlertDialog.setTabOrder(self.SaveButton, self.DeleteButton) - AlertDialog.setTabOrder(self.DeleteButton, self.DisplayButton) - AlertDialog.setTabOrder(self.DisplayButton, self.DisplayCloseButton) - AlertDialog.setTabOrder(self.DisplayCloseButton, self.CloseButton) + self.retranslateUi(AlertForm) + QtCore.QObject.connect(self.CloseButton, QtCore.SIGNAL(u'clicked()'), AlertForm.close) + QtCore.QMetaObject.connectSlotsByName(AlertForm) + AlertForm.setTabOrder(self.AlertTextEdit, self.ParameterEdit) + AlertForm.setTabOrder(self.ParameterEdit, self.AlertListWidget) + AlertForm.setTabOrder(self.AlertListWidget, self.NewButton) + AlertForm.setTabOrder(self.NewButton, self.SaveButton) + AlertForm.setTabOrder(self.SaveButton, self.DeleteButton) + AlertForm.setTabOrder(self.DeleteButton, self.DisplayButton) + AlertForm.setTabOrder(self.DisplayButton, self.DisplayCloseButton) + AlertForm.setTabOrder(self.DisplayCloseButton, self.CloseButton) - def retranslateUi(self, AlertDialog): - AlertDialog.setWindowTitle(self.trUtf8('Alert Message')) - self.AlertEntryLabel.setText(self.trUtf8('Alert &text:')) - self.AlertParameter.setText(self.trUtf8('&Parameter(s):')) - self.NewButton.setText(self.trUtf8('&New')) - self.SaveButton.setText(self.trUtf8('&Save')) - self.DeleteButton.setText(self.trUtf8('&Delete')) - self.DisplayButton.setText(self.trUtf8('Displ&ay')) - self.DisplayCloseButton.setText(self.trUtf8('Display && Cl&ose')) - self.CloseButton.setText(self.trUtf8('&Close')) + def retranslateUi(self, AlertForm): + AlertForm.setWindowTitle(translate('AlertForm', 'Alert Message')) + self.AlertEntryLabel.setText(translate('AlertForm', 'Alert &text:')) + self.AlertParameter.setText(translate('AlertForm', '&Parameter(s):')) + self.NewButton.setText(translate('AlertForm', '&New')) + self.SaveButton.setText(translate('AlertForm', '&Save')) + self.DeleteButton.setText(translate('AlertForm', '&Delete')) + self.DisplayButton.setText(translate('AlertForm', 'Displ&ay')) + self.DisplayCloseButton.setText(translate('AlertForm', 'Display && Cl&ose')) + self.CloseButton.setText(translate('AlertForm', '&Close')) diff --git a/openlp/plugins/bibles/forms/bibleimportwizard.py b/openlp/plugins/bibles/forms/bibleimportwizard.py index 7b42ed26d..8acfdac21 100644 --- a/openlp/plugins/bibles/forms/bibleimportwizard.py +++ b/openlp/plugins/bibles/forms/bibleimportwizard.py @@ -24,14 +24,15 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_BibleImportWizard(object): - def setupUi(self, BibleImportWizard): - BibleImportWizard.setObjectName(u'BibleImportWizard') - BibleImportWizard.resize(550, 386) - BibleImportWizard.setModal(True) - BibleImportWizard.setWizardStyle(QtGui.QWizard.ModernStyle) - BibleImportWizard.setOptions( + def setupUi(self, ImportWizardForm): + ImportWizardForm.setObjectName(u'BibleImportWizard') + ImportWizardForm.resize(550, 386) + ImportWizardForm.setModal(True) + ImportWizardForm.setWizardStyle(QtGui.QWizard.ModernStyle) + ImportWizardForm.setOptions( QtGui.QWizard.IndependentPages | \ QtGui.QWizard.NoBackButtonOnStartPage | \ QtGui.QWizard.NoBackButtonOnLastPage) @@ -57,7 +58,7 @@ class Ui_BibleImportWizard(object): spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.WelcomeLayout.addItem(spacerItem1) - BibleImportWizard.addPage(self.WelcomePage) + ImportWizardForm.addPage(self.WelcomePage) self.SelectPage = QtGui.QWizardPage() self.SelectPage.setObjectName(u'SelectPage') self.SelectPageLayout = QtGui.QVBoxLayout(self.SelectPage) @@ -251,7 +252,7 @@ class Ui_BibleImportWizard(object): self.WebDownloadLayout.addWidget(self.WebDownloadTabWidget) self.FormatWidget.addWidget(self.WebDownloadPage) self.SelectPageLayout.addWidget(self.FormatWidget) - BibleImportWizard.addPage(self.SelectPage) + ImportWizardForm.addPage(self.SelectPage) self.LicenseDetailsPage = QtGui.QWizardPage() self.LicenseDetailsPage.setObjectName(u'LicenseDetailsPage') self.LicenseDetailsLayout = QtGui.QFormLayout(self.LicenseDetailsPage) @@ -282,7 +283,7 @@ class Ui_BibleImportWizard(object): self.PermissionEdit.setObjectName(u'PermissionEdit') self.LicenseDetailsLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.PermissionEdit) - BibleImportWizard.addPage(self.LicenseDetailsPage) + ImportWizardForm.addPage(self.LicenseDetailsPage) self.ImportPage = QtGui.QWizardPage() self.ImportPage.setObjectName(u'ImportPage') self.ImportLayout = QtGui.QVBoxLayout(self.ImportPage) @@ -296,58 +297,58 @@ class Ui_BibleImportWizard(object): self.ImportProgressBar.setValue(0) self.ImportProgressBar.setObjectName(u'ImportProgressBar') self.ImportLayout.addWidget(self.ImportProgressBar) - BibleImportWizard.addPage(self.ImportPage) + ImportWizardForm.addPage(self.ImportPage) - self.retranslateUi(BibleImportWizard) + self.retranslateUi(ImportWizardForm) self.FormatWidget.setCurrentIndex(0) self.WebDownloadTabWidget.setCurrentIndex(0) QtCore.QObject.connect(self.FormatComboBox, QtCore.SIGNAL(u'currentIndexChanged(int)'), self.FormatWidget.setCurrentIndex) - QtCore.QMetaObject.connectSlotsByName(BibleImportWizard) + QtCore.QMetaObject.connectSlotsByName(ImportWizardForm) - def retranslateUi(self, BibleImportWizard): - BibleImportWizard.setWindowTitle(self.trUtf8('Bible Import Wizard')) + def retranslateUi(self, ImportWizardForm): + ImportWizardForm.setWindowTitle(translate('ImportWizardForm', 'Bible Import Wizard')) self.TitleLabel.setText( u'' + \ - self.trUtf8('Welcome to the Bible Import Wizard') + u'') + translate('ImportWizardForm', 'Welcome to the Bible Import Wizard') + u'') self.InformationLabel.setText( - self.trUtf8('This wizard will help you to import Bibles from a ' + translate('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(self.trUtf8('Select Import Source')) + self.SelectPage.setTitle(translate('ImportWizardForm', 'Select Import Source')) self.SelectPage.setSubTitle( - self.trUtf8('Select the import format, and where to import from.')) - self.FormatLabel.setText(self.trUtf8('Format:')) - self.FormatComboBox.setItemText(0, self.trUtf8('OSIS')) - self.FormatComboBox.setItemText(1, self.trUtf8('CSV')) - self.FormatComboBox.setItemText(2, self.trUtf8('OpenSong')) - self.FormatComboBox.setItemText(3, self.trUtf8('Web Download')) - self.OsisLocationLabel.setText(self.trUtf8('File Location:')) - self.BooksLocationLabel.setText(self.trUtf8('Books Location:')) - self.VerseLocationLabel.setText(self.trUtf8('Verse Location:')) - self.OpenSongFileLabel.setText(self.trUtf8('Bible Filename:')) - self.LocationLabel.setText(self.trUtf8('Location:')) - self.LocationComboBox.setItemText(0, self.trUtf8('Crosswalk')) - self.LocationComboBox.setItemText(1, self.trUtf8('BibleGateway')) - self.BibleLabel.setText(self.trUtf8('Bible:')) + translate('ImportWizardForm', 'Select the import format, and where to import from.')) + self.FormatLabel.setText(translate('ImportWizardForm', 'Format:')) + self.FormatComboBox.setItemText(0, translate('ImportWizardForm', 'OSIS')) + self.FormatComboBox.setItemText(1, translate('ImportWizardForm', 'CSV')) + self.FormatComboBox.setItemText(2, translate('ImportWizardForm', 'OpenSong')) + self.FormatComboBox.setItemText(3, translate('ImportWizardForm', 'Web Download')) + self.OsisLocationLabel.setText(translate('ImportWizardForm', 'File Location:')) + self.BooksLocationLabel.setText(translate('ImportWizardForm', 'Books Location:')) + self.VerseLocationLabel.setText(translate('ImportWizardForm', 'Verse Location:')) + self.OpenSongFileLabel.setText(translate('ImportWizardForm', 'Bible Filename:')) + self.LocationLabel.setText(translate('ImportWizardForm', 'Location:')) + self.LocationComboBox.setItemText(0, translate('ImportWizardForm', 'Crosswalk')) + self.LocationComboBox.setItemText(1, translate('ImportWizardForm', 'BibleGateway')) + self.BibleLabel.setText(translate('ImportWizardForm', 'Bible:')) self.WebDownloadTabWidget.setTabText( self.WebDownloadTabWidget.indexOf(self.DownloadOptionsTab), - self.trUtf8('Download Options')) - self.AddressLabel.setText(self.trUtf8('Server:')) - self.UsernameLabel.setText(self.trUtf8('Username:')) - self.PasswordLabel.setText(self.trUtf8('Password:')) + translate('ImportWizardForm', 'Download Options')) + self.AddressLabel.setText(translate('ImportWizardForm', 'Server:')) + self.UsernameLabel.setText(translate('ImportWizardForm', 'Username:')) + self.PasswordLabel.setText(translate('ImportWizardForm', 'Password:')) self.WebDownloadTabWidget.setTabText( self.WebDownloadTabWidget.indexOf(self.ProxyServerTab), - self.trUtf8('Proxy Server (Optional)')) - self.LicenseDetailsPage.setTitle(self.trUtf8('License Details')) + translate('ImportWizardForm', 'Proxy Server (Optional)')) + self.LicenseDetailsPage.setTitle(translate('ImportWizardForm', 'License Details')) self.LicenseDetailsPage.setSubTitle( - self.trUtf8('Set up the Bible\'s license details.')) - self.VersionNameLabel.setText(self.trUtf8('Version Name:')) - self.CopyrightLabel.setText(self.trUtf8('Copyright:')) - self.PermissionLabel.setText(self.trUtf8('Permission:')) - self.ImportPage.setTitle(self.trUtf8('Importing')) + translate('ImportWizardForm', 'Set up the Bible\'s license details.')) + self.VersionNameLabel.setText(translate('ImportWizardForm', 'Version Name:')) + self.CopyrightLabel.setText(translate('ImportWizardForm', 'Copyright:')) + self.PermissionLabel.setText(translate('ImportWizardForm', 'Permission:')) + self.ImportPage.setTitle(translate('ImportWizardForm', 'Importing')) self.ImportPage.setSubTitle( - self.trUtf8('Please wait while your Bible is imported.')) - self.ImportProgressLabel.setText(self.trUtf8('Ready.')) + translate('ImportWizardForm', 'Please wait while your Bible is imported.')) + self.ImportProgressLabel.setText(translate('ImportWizardForm', 'Ready.')) self.ImportProgressBar.setFormat(u'%p%') diff --git a/openlp/plugins/custom/forms/editcustomdialog.py b/openlp/plugins/custom/forms/editcustomdialog.py index 5f3fe7614..79380b9ba 100644 --- a/openlp/plugins/custom/forms/editcustomdialog.py +++ b/openlp/plugins/custom/forms/editcustomdialog.py @@ -24,35 +24,36 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_customEditDialog(object): - def setupUi(self, customEditDialog): - customEditDialog.setObjectName(u'customEditDialog') - customEditDialog.resize(590, 541) + def setupUi(self, EditCustomForm): + EditCustomForm.setObjectName(u'customEditDialog') + EditCustomForm.resize(590, 541) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - customEditDialog.setWindowIcon(icon) - self.gridLayout = QtGui.QGridLayout(customEditDialog) + EditCustomForm.setWindowIcon(icon) + self.gridLayout = QtGui.QGridLayout(EditCustomForm) self.gridLayout.setObjectName(u'gridLayout') self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(u'horizontalLayout') - self.TitleLabel = QtGui.QLabel(customEditDialog) + self.TitleLabel = QtGui.QLabel(EditCustomForm) self.TitleLabel.setObjectName(u'TitleLabel') self.horizontalLayout.addWidget(self.TitleLabel) - self.TitleEdit = QtGui.QLineEdit(customEditDialog) + self.TitleEdit = QtGui.QLineEdit(EditCustomForm) self.TitleEdit.setObjectName(u'TitleEdit') self.horizontalLayout.addWidget(self.TitleEdit) self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(u'horizontalLayout_4') - self.VerseListView = QtGui.QListWidget(customEditDialog) + self.VerseListView = QtGui.QListWidget(EditCustomForm) self.VerseListView.setAlternatingRowColors(True) self.VerseListView.setObjectName(u'VerseListView') self.horizontalLayout_4.addWidget(self.VerseListView) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(u'verticalLayout') - self.UpButton = QtGui.QPushButton(customEditDialog) + self.UpButton = QtGui.QPushButton(EditCustomForm) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(u':/services/service_up.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -62,7 +63,7 @@ class Ui_customEditDialog(object): spacerItem = QtGui.QSpacerItem(20, 128, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) - self.DownButton = QtGui.QPushButton(customEditDialog) + self.DownButton = QtGui.QPushButton(EditCustomForm) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(u':/services/service_down.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -71,7 +72,7 @@ class Ui_customEditDialog(object): self.verticalLayout.addWidget(self.DownButton) self.horizontalLayout_4.addLayout(self.verticalLayout) self.gridLayout.addLayout(self.horizontalLayout_4, 1, 0, 1, 1) - self.EditWidget = QtGui.QWidget(customEditDialog) + self.EditWidget = QtGui.QWidget(EditCustomForm) self.EditWidget.setObjectName(u'EditWidget') self.EditLayout_3 = QtGui.QHBoxLayout(self.EditWidget) self.EditLayout_3.setSpacing(8) @@ -112,63 +113,63 @@ class Ui_customEditDialog(object): self.gridLayout.addWidget(self.EditWidget, 2, 0, 1, 1) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(u'horizontalLayout_3') - self.ThemeLabel = QtGui.QLabel(customEditDialog) + self.ThemeLabel = QtGui.QLabel(EditCustomForm) self.ThemeLabel.setObjectName(u'ThemeLabel') self.horizontalLayout_3.addWidget(self.ThemeLabel) - self.ThemeComboBox = QtGui.QComboBox(customEditDialog) + self.ThemeComboBox = QtGui.QComboBox(EditCustomForm) self.ThemeComboBox.setObjectName(u'ThemeComboBox') self.horizontalLayout_3.addWidget(self.ThemeComboBox) self.gridLayout.addLayout(self.horizontalLayout_3, 3, 0, 1, 1) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(u'horizontalLayout_2') - self.CreditLabel = QtGui.QLabel(customEditDialog) + self.CreditLabel = QtGui.QLabel(EditCustomForm) self.CreditLabel.setObjectName(u'CreditLabel') self.horizontalLayout_2.addWidget(self.CreditLabel) - self.CreditEdit = QtGui.QLineEdit(customEditDialog) + self.CreditEdit = QtGui.QLineEdit(EditCustomForm) self.CreditEdit.setObjectName(u'CreditEdit') self.horizontalLayout_2.addWidget(self.CreditEdit) self.gridLayout.addLayout(self.horizontalLayout_2, 4, 0, 1, 1) - self.buttonBox = QtGui.QDialogButtonBox(customEditDialog) + self.buttonBox = QtGui.QDialogButtonBox(EditCustomForm) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) self.buttonBox.setObjectName(u'buttonBox') self.gridLayout.addWidget(self.buttonBox, 5, 0, 1, 1) - self.retranslateUi(customEditDialog) + self.retranslateUi(EditCustomForm) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), - customEditDialog.accept) + EditCustomForm.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), - customEditDialog.closePressed) - QtCore.QMetaObject.connectSlotsByName(customEditDialog) - customEditDialog.setTabOrder(self.TitleEdit, self.VerseTextEdit) - customEditDialog.setTabOrder(self.VerseTextEdit, self.AddButton) - customEditDialog.setTabOrder(self.AddButton, self.VerseListView) - customEditDialog.setTabOrder(self.VerseListView, self.EditButton) - customEditDialog.setTabOrder(self.EditButton, self.EditAllButton) - customEditDialog.setTabOrder(self.EditAllButton, self.SaveButton) - customEditDialog.setTabOrder(self.SaveButton, self.DeleteButton) - customEditDialog.setTabOrder(self.DeleteButton, self.CreditEdit) - customEditDialog.setTabOrder(self.CreditEdit, self.UpButton) - customEditDialog.setTabOrder(self.UpButton, self.DownButton) - customEditDialog.setTabOrder(self.DownButton, self.ThemeComboBox) + EditCustomForm.closePressed) + QtCore.QMetaObject.connectSlotsByName(EditCustomForm) + EditCustomForm.setTabOrder(self.TitleEdit, self.VerseTextEdit) + EditCustomForm.setTabOrder(self.VerseTextEdit, self.AddButton) + EditCustomForm.setTabOrder(self.AddButton, self.VerseListView) + EditCustomForm.setTabOrder(self.VerseListView, self.EditButton) + EditCustomForm.setTabOrder(self.EditButton, self.EditAllButton) + EditCustomForm.setTabOrder(self.EditAllButton, self.SaveButton) + EditCustomForm.setTabOrder(self.SaveButton, self.DeleteButton) + EditCustomForm.setTabOrder(self.DeleteButton, self.CreditEdit) + EditCustomForm.setTabOrder(self.CreditEdit, self.UpButton) + EditCustomForm.setTabOrder(self.UpButton, self.DownButton) + EditCustomForm.setTabOrder(self.DownButton, self.ThemeComboBox) - def retranslateUi(self, customEditDialog): - customEditDialog.setWindowTitle(self.trUtf8('Edit Custom Slides')) - self.UpButton.setToolTip(self.trUtf8('Move slide Up 1')) - self.DownButton.setToolTip(self.trUtf8('Move slide down 1')) - self.TitleLabel.setText(self.trUtf8('Title:')) - self.AddButton.setText(self.trUtf8('Add New')) - self.AddButton.setToolTip(self.trUtf8('Add new slide at bottom')) - self.EditButton.setText(self.trUtf8('Edit')) - self.EditButton.setToolTip(self.trUtf8('Edit selected slide')) - self.EditAllButton.setText(self.trUtf8('Edit All')) - self.EditAllButton.setToolTip(self.trUtf8('Edit all slides')) - self.SaveButton.setText(self.trUtf8('Save')) - self.SaveButton.setToolTip(self.trUtf8('Replace edited slide')) - self.DeleteButton.setText(self.trUtf8('Delete')) - self.DeleteButton.setToolTip(self.trUtf8('Delete selected slide')) - self.ClearButton.setText(self.trUtf8('Clear')) - self.ClearButton.setToolTip(self.trUtf8('Clear edit area')) - self.SplitButton.setText(self.trUtf8('Split Slide')) - self.SplitButton.setToolTip(self.trUtf8('Add slide split')) - self.ThemeLabel.setText(self.trUtf8('Theme:')) - self.CreditLabel.setText(self.trUtf8('Credits:')) + def retranslateUi(self, EditCustomForm): + EditCustomForm.setWindowTitle(translate('EditCustomForm', 'Edit Custom Slides')) + self.UpButton.setToolTip(translate('EditCustomForm', 'Move slide Up 1')) + self.DownButton.setToolTip(translate('EditCustomForm', 'Move slide down 1')) + self.TitleLabel.setText(translate('EditCustomForm', 'Title:')) + self.AddButton.setText(translate('EditCustomForm', 'Add New')) + self.AddButton.setToolTip(translate('EditCustomForm', 'Add new slide at bottom')) + self.EditButton.setText(translate('EditCustomForm', 'Edit')) + self.EditButton.setToolTip(translate('EditCustomForm', 'Edit selected slide')) + self.EditAllButton.setText(translate('EditCustomForm', 'Edit All')) + self.EditAllButton.setToolTip(translate('EditCustomForm', 'Edit all slides')) + self.SaveButton.setText(translate('EditCustomForm', 'Save')) + self.SaveButton.setToolTip(translate('EditCustomForm', 'Replace edited slide')) + self.DeleteButton.setText(translate('EditCustomForm', 'Delete')) + self.DeleteButton.setToolTip(translate('EditCustomForm', 'Delete selected slide')) + self.ClearButton.setText(translate('EditCustomForm', 'Clear')) + self.ClearButton.setToolTip(translate('EditCustomForm', 'Clear edit area')) + self.SplitButton.setText(translate('EditCustomForm', 'Split Slide')) + self.SplitButton.setToolTip(translate('EditCustomForm', 'Add slide split')) + self.ThemeLabel.setText(translate('EditCustomForm', 'Theme:')) + self.CreditLabel.setText(translate('EditCustomForm', 'Credits:')) diff --git a/openlp/plugins/songs/forms/authorsdialog.py b/openlp/plugins/songs/forms/authorsdialog.py index ca28f461c..10bef469f 100644 --- a/openlp/plugins/songs/forms/authorsdialog.py +++ b/openlp/plugins/songs/forms/authorsdialog.py @@ -24,40 +24,41 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_AuthorsDialog(object): - def setupUi(self, AuthorsDialog): - AuthorsDialog.setObjectName(u'AuthorsDialog') - AuthorsDialog.resize(393, 147) - self.AuthorsLayout = QtGui.QFormLayout(AuthorsDialog) + def setupUi(self, AuthorsForm): + AuthorsForm.setObjectName(u'AuthorsDialog') + AuthorsForm.resize(393, 147) + self.AuthorsLayout = QtGui.QFormLayout(AuthorsForm) self.AuthorsLayout.setMargin(8) self.AuthorsLayout.setSpacing(8) self.AuthorsLayout.setObjectName(u'AuthorsLayout') - self.FirstNameLabel = QtGui.QLabel(AuthorsDialog) + self.FirstNameLabel = QtGui.QLabel(AuthorsForm) self.FirstNameLabel.setObjectName(u'FirstNameLabel') self.AuthorsLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.FirstNameLabel) - self.FirstNameEdit = QtGui.QLineEdit(AuthorsDialog) + self.FirstNameEdit = QtGui.QLineEdit(AuthorsForm) self.FirstNameEdit.setObjectName(u'FirstNameEdit') self.AuthorsLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.FirstNameEdit) - self.LastNameLabel = QtGui.QLabel(AuthorsDialog) + self.LastNameLabel = QtGui.QLabel(AuthorsForm) self.LastNameLabel.setObjectName(u'LastNameLabel') self.AuthorsLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.LastNameLabel) - self.LastNameEdit = QtGui.QLineEdit(AuthorsDialog) + self.LastNameEdit = QtGui.QLineEdit(AuthorsForm) self.LastNameEdit.setObjectName(u'LastNameEdit') self.AuthorsLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.LastNameEdit) - self.DisplayLabel = QtGui.QLabel(AuthorsDialog) + self.DisplayLabel = QtGui.QLabel(AuthorsForm) self.DisplayLabel.setObjectName(u'DisplayLabel') self.AuthorsLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.DisplayLabel) - self.DisplayEdit = QtGui.QLineEdit(AuthorsDialog) + self.DisplayEdit = QtGui.QLineEdit(AuthorsForm) self.DisplayEdit.setObjectName(u'DisplayEdit') self.AuthorsLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.DisplayEdit) - self.AuthorButtonBox = QtGui.QDialogButtonBox(AuthorsDialog) + self.AuthorButtonBox = QtGui.QDialogButtonBox(AuthorsForm) self.AuthorButtonBox.setOrientation(QtCore.Qt.Horizontal) self.AuthorButtonBox.setStandardButtons( QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) @@ -65,15 +66,15 @@ class Ui_AuthorsDialog(object): self.AuthorsLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.AuthorButtonBox) - self.retranslateUi(AuthorsDialog) + self.retranslateUi(AuthorsForm) QtCore.QObject.connect(self.AuthorButtonBox, - QtCore.SIGNAL(u'accepted()'), AuthorsDialog.accept) + QtCore.SIGNAL(u'accepted()'), AuthorsForm.accept) QtCore.QObject.connect(self.AuthorButtonBox, - QtCore.SIGNAL(u'rejected()'), AuthorsDialog.reject) - QtCore.QMetaObject.connectSlotsByName(AuthorsDialog) + QtCore.SIGNAL(u'rejected()'), AuthorsForm.reject) + QtCore.QMetaObject.connectSlotsByName(AuthorsForm) - def retranslateUi(self, AuthorsDialog): - AuthorsDialog.setWindowTitle(self.trUtf8('Author Maintenance')) - self.DisplayLabel.setText(self.trUtf8('Display name:')) - self.FirstNameLabel.setText(self.trUtf8('First name:')) - self.LastNameLabel.setText(self.trUtf8('Last name:')) + def retranslateUi(self, AuthorsForm): + AuthorsForm.setWindowTitle(translate('AuthorsForm', 'Author Maintenance')) + self.DisplayLabel.setText(translate('AuthorsForm', 'Display name:')) + self.FirstNameLabel.setText(translate('AuthorsForm', 'First name:')) + self.LastNameLabel.setText(translate('AuthorsForm', 'Last name:')) diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index ae0308c80..04df954ec 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -24,20 +24,21 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate from openlp.core.lib import build_icon class Ui_EditSongDialog(object): - def setupUi(self, EditSongDialog): - EditSongDialog.setObjectName(u'EditSongDialog') - EditSongDialog.resize(645, 417) + def setupUi(self, EditSongForm): + EditSongForm.setObjectName(u'EditSongDialog') + EditSongForm.resize(645, 417) icon = build_icon(u':/icon/openlp.org-icon-32.bmp') - EditSongDialog.setWindowIcon(icon) - EditSongDialog.setModal(True) - self.verticalLayout = QtGui.QVBoxLayout(EditSongDialog) + EditSongForm.setWindowIcon(icon) + EditSongForm.setModal(True) + self.verticalLayout = QtGui.QVBoxLayout(EditSongForm) self.verticalLayout.setMargin(8) self.verticalLayout.setObjectName(u'verticalLayout') - self.SongTabWidget = QtGui.QTabWidget(EditSongDialog) + self.SongTabWidget = QtGui.QTabWidget(EditSongForm) self.SongTabWidget.setObjectName(u'SongTabWidget') self.LyricsTab = QtGui.QWidget() self.LyricsTab.setObjectName(u'LyricsTab') @@ -379,75 +380,75 @@ class Ui_EditSongDialog(object): self.ThemeTabLayout.addItem(spacerItem5) self.SongTabWidget.addTab(self.ThemeTab, u'') self.verticalLayout.addWidget(self.SongTabWidget) - self.ButtonBox = QtGui.QDialogButtonBox(EditSongDialog) + self.ButtonBox = QtGui.QDialogButtonBox(EditSongForm) self.ButtonBox.setStandardButtons( QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Save) self.ButtonBox.setObjectName(u'ButtonBox') self.verticalLayout.addWidget(self.ButtonBox) - self.retranslateUi(EditSongDialog) + self.retranslateUi(EditSongForm) QtCore.QObject.connect(self.ButtonBox, - QtCore.SIGNAL(u'rejected()'), EditSongDialog.closePressed) + QtCore.SIGNAL(u'rejected()'), EditSongForm.closePressed) QtCore.QObject.connect(self.ButtonBox, - QtCore.SIGNAL(u'accepted()'), EditSongDialog.accept) - QtCore.QMetaObject.connectSlotsByName(EditSongDialog) - EditSongDialog.setTabOrder(self.SongTabWidget, self.TitleEditItem) - EditSongDialog.setTabOrder(self.TitleEditItem, self.AlternativeEdit) - EditSongDialog.setTabOrder(self.AlternativeEdit, self.VerseListWidget) - EditSongDialog.setTabOrder(self.VerseListWidget, self.VerseAddButton) - EditSongDialog.setTabOrder(self.VerseAddButton, self.VerseEditButton) - EditSongDialog.setTabOrder(self.VerseEditButton, self.VerseEditAllButton) - EditSongDialog.setTabOrder(self.VerseEditAllButton, self.VerseDeleteButton) - EditSongDialog.setTabOrder(self.VerseDeleteButton, self.VerseOrderEdit) - EditSongDialog.setTabOrder(self.VerseOrderEdit, self.AuthorsSelectionComboItem) - EditSongDialog.setTabOrder(self.AuthorsSelectionComboItem, self.AuthorAddButton) - EditSongDialog.setTabOrder(self.AuthorAddButton, self.AuthorsListView) - EditSongDialog.setTabOrder(self.AuthorsListView, self.AuthorRemoveButton) - EditSongDialog.setTabOrder(self.AuthorRemoveButton, self.MaintenanceButton) - EditSongDialog.setTabOrder(self.MaintenanceButton, self.SongTopicCombo) - EditSongDialog.setTabOrder(self.SongTopicCombo, self.TopicAddButton) - EditSongDialog.setTabOrder(self.TopicAddButton, self.TopicsListView) - EditSongDialog.setTabOrder(self.TopicsListView, self.TopicRemoveButton) - EditSongDialog.setTabOrder(self.TopicRemoveButton, self.SongbookCombo) - EditSongDialog.setTabOrder(self.SongbookCombo, self.ThemeSelectionComboItem) - EditSongDialog.setTabOrder(self.ThemeSelectionComboItem, self.ThemeAddButton) - EditSongDialog.setTabOrder(self.ThemeAddButton, self.CopyrightEditItem) - EditSongDialog.setTabOrder(self.CopyrightEditItem, self.CopyrightInsertButton) - EditSongDialog.setTabOrder(self.CopyrightInsertButton, self.CCLNumberEdit) - EditSongDialog.setTabOrder(self.CCLNumberEdit, self.CommentsEdit) - EditSongDialog.setTabOrder(self.CommentsEdit, self.ButtonBox) + QtCore.SIGNAL(u'accepted()'), EditSongForm.accept) + QtCore.QMetaObject.connectSlotsByName(EditSongForm) + EditSongForm.setTabOrder(self.SongTabWidget, self.TitleEditItem) + EditSongForm.setTabOrder(self.TitleEditItem, self.AlternativeEdit) + EditSongForm.setTabOrder(self.AlternativeEdit, self.VerseListWidget) + EditSongForm.setTabOrder(self.VerseListWidget, self.VerseAddButton) + EditSongForm.setTabOrder(self.VerseAddButton, self.VerseEditButton) + EditSongForm.setTabOrder(self.VerseEditButton, self.VerseEditAllButton) + EditSongForm.setTabOrder(self.VerseEditAllButton, self.VerseDeleteButton) + EditSongForm.setTabOrder(self.VerseDeleteButton, self.VerseOrderEdit) + EditSongForm.setTabOrder(self.VerseOrderEdit, self.AuthorsSelectionComboItem) + EditSongForm.setTabOrder(self.AuthorsSelectionComboItem, self.AuthorAddButton) + EditSongForm.setTabOrder(self.AuthorAddButton, self.AuthorsListView) + EditSongForm.setTabOrder(self.AuthorsListView, self.AuthorRemoveButton) + EditSongForm.setTabOrder(self.AuthorRemoveButton, self.MaintenanceButton) + EditSongForm.setTabOrder(self.MaintenanceButton, self.SongTopicCombo) + EditSongForm.setTabOrder(self.SongTopicCombo, self.TopicAddButton) + EditSongForm.setTabOrder(self.TopicAddButton, self.TopicsListView) + EditSongForm.setTabOrder(self.TopicsListView, self.TopicRemoveButton) + EditSongForm.setTabOrder(self.TopicRemoveButton, self.SongbookCombo) + EditSongForm.setTabOrder(self.SongbookCombo, self.ThemeSelectionComboItem) + EditSongForm.setTabOrder(self.ThemeSelectionComboItem, self.ThemeAddButton) + EditSongForm.setTabOrder(self.ThemeAddButton, self.CopyrightEditItem) + EditSongForm.setTabOrder(self.CopyrightEditItem, self.CopyrightInsertButton) + EditSongForm.setTabOrder(self.CopyrightInsertButton, self.CCLNumberEdit) + EditSongForm.setTabOrder(self.CCLNumberEdit, self.CommentsEdit) + EditSongForm.setTabOrder(self.CommentsEdit, self.ButtonBox) - def retranslateUi(self, EditSongDialog): - EditSongDialog.setWindowTitle(self.trUtf8('Song Editor')) - self.TitleLabel.setText(self.trUtf8('Title:')) - self.AlternativeTitleLabel.setText(self.trUtf8('Alternative Title:')) - self.LyricsLabel.setText(self.trUtf8('Lyrics:')) - self.VerseOrderLabel.setText(self.trUtf8('Verse Order:')) - self.VerseAddButton.setText(self.trUtf8('Add')) - self.VerseEditButton.setText(self.trUtf8('Edit')) - self.VerseEditAllButton.setText(self.trUtf8('Edit All')) - self.VerseDeleteButton.setText(self.trUtf8('Delete')) + def retranslateUi(self, EditSongForm): + EditSongForm.setWindowTitle(translate('EditSongForm', 'Song Editor')) + self.TitleLabel.setText(translate('EditSongForm', 'Title:')) + self.AlternativeTitleLabel.setText(translate('EditSongForm', 'Alternative Title:')) + self.LyricsLabel.setText(translate('EditSongForm', 'Lyrics:')) + self.VerseOrderLabel.setText(translate('EditSongForm', 'Verse Order:')) + self.VerseAddButton.setText(translate('EditSongForm', 'Add')) + self.VerseEditButton.setText(translate('EditSongForm', 'Edit')) + self.VerseEditAllButton.setText(translate('EditSongForm', 'Edit All')) + self.VerseDeleteButton.setText(translate('EditSongForm', 'Delete')) self.SongTabWidget.setTabText( self.SongTabWidget.indexOf(self.LyricsTab), - self.trUtf8('Title && Lyrics')) - self.AuthorsGroupBox.setTitle(self.trUtf8('Authors')) - self.AuthorAddButton.setText(self.trUtf8('&Add to Song')) - self.AuthorRemoveButton.setText(self.trUtf8('&Remove')) + translate('EditSongForm', 'Title && Lyrics')) + self.AuthorsGroupBox.setTitle(translate('EditSongForm', 'Authors')) + self.AuthorAddButton.setText(translate('EditSongForm', '&Add to Song')) + self.AuthorRemoveButton.setText(translate('EditSongForm', '&Remove')) self.MaintenanceButton.setText( - self.trUtf8('&Manage Authors, Topics, Books')) - self.TopicGroupBox.setTitle(self.trUtf8('Topic')) - self.TopicAddButton.setText(self.trUtf8('A&dd to Song')) - self.TopicRemoveButton.setText(self.trUtf8('R&emove')) - self.SongBookGroup.setTitle(self.trUtf8('Song Book')) + translate('EditSongForm', '&Manage Authors, Topics, Books')) + self.TopicGroupBox.setTitle(translate('EditSongForm', 'Topic')) + self.TopicAddButton.setText(translate('EditSongForm', 'A&dd to Song')) + self.TopicRemoveButton.setText(translate('EditSongForm', 'R&emove')) + self.SongBookGroup.setTitle(translate('EditSongForm', 'Song Book')) self.SongTabWidget.setTabText( self.SongTabWidget.indexOf(self.AuthorsTab), - self.trUtf8('Authors, Topics && Book')) - self.ThemeGroupBox.setTitle(self.trUtf8('Theme')) - self.ThemeAddButton.setText(self.trUtf8('Add a Theme')) - self.CopyrightGroupBox.setTitle(self.trUtf8('Copyright Information')) - self.CopyrightInsertButton.setText(self.trUtf8(u'\xa9')) - self.CCLILabel.setText(self.trUtf8('CCLI Number:')) - self.CommentsGroupBox.setTitle(self.trUtf8('Comments')) + translate('EditSongForm', 'Authors, Topics && Book')) + self.ThemeGroupBox.setTitle(translate('EditSongForm', 'Theme')) + self.ThemeAddButton.setText(translate('EditSongForm', 'Add a Theme')) + self.CopyrightGroupBox.setTitle(translate('EditSongForm', 'Copyright Information')) + self.CopyrightInsertButton.setText(translate('EditSongForm', u'\xa9')) + self.CCLILabel.setText(translate('EditSongForm', 'CCLI Number:')) + self.CommentsGroupBox.setTitle(translate('EditSongForm', 'Comments')) self.SongTabWidget.setTabText( self.SongTabWidget.indexOf(self.ThemeTab), - self.trUtf8('Theme, Copyright Info && Comments')) + translate('EditSongForm', 'Theme, Copyright Info && Comments')) diff --git a/openlp/plugins/songs/forms/editversedialog.py b/openlp/plugins/songs/forms/editversedialog.py index 7829e2c27..40a75b073 100644 --- a/openlp/plugins/songs/forms/editversedialog.py +++ b/openlp/plugins/songs/forms/editversedialog.py @@ -24,13 +24,14 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_EditVerseDialog(object): - def setupUi(self, EditVerseDialog): - EditVerseDialog.setObjectName(u'EditVerseDialog') - EditVerseDialog.resize(500, 521) - EditVerseDialog.setModal(True) - self.layoutWidget = QtGui.QWidget(EditVerseDialog) + def setupUi(self, EditVerseForm): + EditVerseForm.setObjectName(u'EditVerseDialog') + EditVerseForm.resize(500, 521) + EditVerseForm.setModal(True) + self.layoutWidget = QtGui.QWidget(EditVerseForm) self.layoutWidget.setGeometry(QtCore.QRect(11, 1, 471, 491)) self.layoutWidget.setObjectName(u'layoutWidget') self.verticalLayout_3 = QtGui.QVBoxLayout(self.layoutWidget) @@ -103,27 +104,27 @@ class Ui_EditVerseDialog(object): self.ButtonBox.setObjectName(u'ButtonBox') self.verticalLayout_3.addWidget(self.ButtonBox) - self.retranslateUi(EditVerseDialog) - QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'accepted()'), EditVerseDialog.accept) - QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'rejected()'), EditVerseDialog.reject) - QtCore.QMetaObject.connectSlotsByName(EditVerseDialog) + self.retranslateUi(EditVerseForm) + QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'accepted()'), EditVerseForm.accept) + QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'rejected()'), EditVerseForm.reject) + QtCore.QMetaObject.connectSlotsByName(EditVerseForm) - def retranslateUi(self, EditVerseDialog): - EditVerseDialog.setWindowTitle(self.trUtf8('Edit Verse')) - self.VerseTypeLabel.setText(self.trUtf8('Verse Type')) - self.VerseListComboBox.setItemText(0, self.trUtf8('Intro')) - self.VerseListComboBox.setItemText(1, self.trUtf8('Verse')) - self.VerseListComboBox.setItemText(2, self.trUtf8('Pre-Chorus')) - self.VerseListComboBox.setItemText(3, self.trUtf8('Chorus')) - self.VerseListComboBox.setItemText(4, self.trUtf8('Bridge')) - self.VerseListComboBox.setItemText(5, self.trUtf8('Ending')) - self.VerseListComboBox.setItemText(6, self.trUtf8('Other')) - self.VerseNumberLabel.setText(self.trUtf8('Number')) - self.addBridge.setText(self.trUtf8('Bridge')) - self.addVerse.setText(self.trUtf8('Verse')) - self.addChorus.setText(self.trUtf8('Chorus')) - self.addPreChorus.setText(self.trUtf8('Pre-Chorus')) - self.addIntro.setText(self.trUtf8('Intro')) - self.addOther.setText(self.trUtf8('Other')) - self.addEnding.setText(self.trUtf8('Ending')) + def retranslateUi(self, EditVerseForm): + EditVerseForm.setWindowTitle(translate('EditVerseForm', 'Edit Verse')) + self.VerseTypeLabel.setText(translate('EditVerseForm', 'Verse Type')) + self.VerseListComboBox.setItemText(0, translate('EditVerseForm', 'Intro')) + self.VerseListComboBox.setItemText(1, translate('EditVerseForm', 'Verse')) + self.VerseListComboBox.setItemText(2, translate('EditVerseForm', 'Pre-Chorus')) + self.VerseListComboBox.setItemText(3, translate('EditVerseForm', 'Chorus')) + self.VerseListComboBox.setItemText(4, translate('EditVerseForm', 'Bridge')) + self.VerseListComboBox.setItemText(5, translate('EditVerseForm', 'Ending')) + self.VerseListComboBox.setItemText(6, translate('EditVerseForm', 'Other')) + self.VerseNumberLabel.setText(translate('EditVerseForm', 'Number')) + self.addBridge.setText(translate('EditVerseForm', 'Bridge')) + self.addVerse.setText(translate('EditVerseForm', 'Verse')) + self.addChorus.setText(translate('EditVerseForm', 'Chorus')) + self.addPreChorus.setText(translate('EditVerseForm', 'Pre-Chorus')) + self.addIntro.setText(translate('EditVerseForm', 'Intro')) + self.addOther.setText(translate('EditVerseForm', 'Other')) + self.addEnding.setText(translate('EditVerseForm', 'Ending')) diff --git a/openlp/plugins/songs/forms/openlpexportdialog.py b/openlp/plugins/songs/forms/openlpexportdialog.py index 2236d9ed3..82934e19d 100644 --- a/openlp/plugins/songs/forms/openlpexportdialog.py +++ b/openlp/plugins/songs/forms/openlpexportdialog.py @@ -24,18 +24,19 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_OpenLPExportDialog(object): - def setupUi(self, OpenLPExportDialog): - OpenLPExportDialog.setObjectName(u'OpenLPExportDialog') - OpenLPExportDialog.resize(473, 459) + def setupUi(self, OpenLPExportForm): + OpenLPExportForm.setObjectName(u'OpenLPExportDialog') + OpenLPExportForm.resize(473, 459) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - OpenLPExportDialog.setWindowIcon(icon) - self.verticalLayout_5 = QtGui.QVBoxLayout(OpenLPExportDialog) + OpenLPExportForm.setWindowIcon(icon) + self.verticalLayout_5 = QtGui.QVBoxLayout(OpenLPExportForm) self.verticalLayout_5.setMargin(8) self.verticalLayout_5.setObjectName(u'verticalLayout_5') - self.ExportFileWidget = QtGui.QWidget(OpenLPExportDialog) + self.ExportFileWidget = QtGui.QWidget(OpenLPExportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -59,7 +60,7 @@ class Ui_OpenLPExportDialog(object): self.ExportFileSelectPushButton.setObjectName(u'ExportFileSelectPushButton') self.horizontalLayout.addWidget(self.ExportFileSelectPushButton) self.verticalLayout_5.addWidget(self.ExportFileWidget) - self.SongListFrame = QtGui.QFrame(OpenLPExportDialog) + self.SongListFrame = QtGui.QFrame(OpenLPExportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -242,7 +243,7 @@ class Ui_OpenLPExportDialog(object): self.verticalLayout_2.addWidget(self.SelectedRemoveSelectedWidget) self.horizontalLayout_6.addWidget(self.SelectedFileListWidget) self.verticalLayout_5.addWidget(self.SongListFrame) - self.ProgressGroupBox = QtGui.QGroupBox(OpenLPExportDialog) + self.ProgressGroupBox = QtGui.QGroupBox(OpenLPExportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -261,7 +262,7 @@ class Ui_OpenLPExportDialog(object): self.ProgressBar.setObjectName(u'ProgressBar') self.verticalLayout_4.addWidget(self.ProgressBar) self.verticalLayout_5.addWidget(self.ProgressGroupBox) - self.ButtonBarWidget = QtGui.QWidget(OpenLPExportDialog) + self.ButtonBarWidget = QtGui.QWidget(OpenLPExportForm) self.ButtonBarWidget.setObjectName(u'ButtonBarWidget') self.horizontalLayout_7 = QtGui.QHBoxLayout(self.ButtonBarWidget) self.horizontalLayout_7.setSpacing(8) @@ -277,29 +278,29 @@ class Ui_OpenLPExportDialog(object): self.horizontalLayout_7.addWidget(self.ClosePushButton) self.verticalLayout_5.addWidget(self.ButtonBarWidget) - self.retranslateUi(OpenLPExportDialog) - QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenLPExportDialog.close) + self.retranslateUi(OpenLPExportForm) + QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenLPExportForm.close) QtCore.QObject.connect(self.ExportSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.ExportListTable.selectAll) QtCore.QObject.connect(self.SelectedSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.selectAll) QtCore.QObject.connect(self.SelectedRemoveSelectedButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.clear) - QtCore.QMetaObject.connectSlotsByName(OpenLPExportDialog) + QtCore.QMetaObject.connectSlotsByName(OpenLPExportForm) - def retranslateUi(self, OpenLPExportDialog): - OpenLPExportDialog.setWindowTitle(self.trUtf8('openlp.org Song Exporter')) - self.ExportFileLabel.setText(self.trUtf8('Select openlp.org export filename:')) - self.ExportListLabel.setText(self.trUtf8('Full Song List')) - self.ExportListTable.horizontalHeaderItem(0).setText(self.trUtf8('Song Title')) - self.ExportListTable.horizontalHeaderItem(1).setText(self.trUtf8('Author')) - self.ExportSelectAllPushButton.setText(self.trUtf8('Select All')) - self.ExportFilterComboBox.setItemText(0, self.trUtf8('Lyrics')) - self.ExportFilterComboBox.setItemText(1, self.trUtf8('Title')) - self.ExportFilterComboBox.setItemText(2, self.trUtf8('Author')) - self.SelectedListLabel.setText(self.trUtf8('Song Export List')) - self.SelectedListTable.horizontalHeaderItem(0).setText(self.trUtf8('Song Title')) - self.SelectedListTable.horizontalHeaderItem(1).setText(self.trUtf8('Author')) - self.SelectedSelectAllPushButton.setText(self.trUtf8('Select All')) - self.SelectedRemoveSelectedButton.setText(self.trUtf8('Remove Selected')) - self.ProgressGroupBox.setTitle(self.trUtf8('Progress:')) - self.ProgressLabel.setText(self.trUtf8('Ready to export')) - self.ExportPushButton.setText(self.trUtf8('Export')) - self.ClosePushButton.setText(self.trUtf8('Close')) + def retranslateUi(self, OpenLPExportForm): + OpenLPExportForm.setWindowTitle(translate('OpenLPExportForm', 'openlp.org Song Exporter')) + self.ExportFileLabel.setText(translate('OpenLPExportForm', 'Select openlp.org export filename:')) + self.ExportListLabel.setText(translate('OpenLPExportForm', 'Full Song List')) + self.ExportListTable.horizontalHeaderItem(0).setText(translate('OpenLPExportForm', 'Song Title')) + self.ExportListTable.horizontalHeaderItem(1).setText(translate('OpenLPExportForm', 'Author')) + self.ExportSelectAllPushButton.setText(translate('OpenLPExportForm', 'Select All')) + self.ExportFilterComboBox.setItemText(0, translate('OpenLPExportForm', 'Lyrics')) + self.ExportFilterComboBox.setItemText(1, translate('OpenLPExportForm', 'Title')) + self.ExportFilterComboBox.setItemText(2, translate('OpenLPExportForm', 'Author')) + self.SelectedListLabel.setText(translate('OpenLPExportForm', 'Song Export List')) + self.SelectedListTable.horizontalHeaderItem(0).setText(translate('OpenLPExportForm', 'Song Title')) + self.SelectedListTable.horizontalHeaderItem(1).setText(translate('OpenLPExportForm', 'Author')) + self.SelectedSelectAllPushButton.setText(translate('OpenLPExportForm', 'Select All')) + self.SelectedRemoveSelectedButton.setText(translate('OpenLPExportForm', 'Remove Selected')) + self.ProgressGroupBox.setTitle(translate('OpenLPExportForm', 'Progress:')) + self.ProgressLabel.setText(translate('OpenLPExportForm', 'Ready to export')) + self.ExportPushButton.setText(translate('OpenLPExportForm', 'Export')) + self.ClosePushButton.setText(translate('OpenLPExportForm', 'Close')) diff --git a/openlp/plugins/songs/forms/openlpimportdialog.py b/openlp/plugins/songs/forms/openlpimportdialog.py index 61732d978..455b6347c 100644 --- a/openlp/plugins/songs/forms/openlpimportdialog.py +++ b/openlp/plugins/songs/forms/openlpimportdialog.py @@ -24,18 +24,19 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_OpenLPImportDialog(object): - def setupUi(self, OpenLPImportDialog): - OpenLPImportDialog.setObjectName(u'OpenLPImportDialog') - OpenLPImportDialog.resize(473, 459) + def setupUi(self, OpenLPImportForm): + OpenLPImportForm.setObjectName(u'OpenLPImportDialog') + OpenLPImportForm.resize(473, 459) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - OpenLPImportDialog.setWindowIcon(icon) - self.verticalLayout_5 = QtGui.QVBoxLayout(OpenLPImportDialog) + OpenLPImportForm.setWindowIcon(icon) + self.verticalLayout_5 = QtGui.QVBoxLayout(OpenLPImportForm) self.verticalLayout_5.setMargin(8) self.verticalLayout_5.setObjectName(u'verticalLayout_5') - self.ImportFileWidget = QtGui.QWidget(OpenLPImportDialog) + self.ImportFileWidget = QtGui.QWidget(OpenLPImportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -59,7 +60,7 @@ class Ui_OpenLPImportDialog(object): self.ImportFileSelectPushButton.setObjectName(u'ImportFileSelectPushButton') self.horizontalLayout.addWidget(self.ImportFileSelectPushButton) self.verticalLayout_5.addWidget(self.ImportFileWidget) - self.SongListFrame = QtGui.QFrame(OpenLPImportDialog) + self.SongListFrame = QtGui.QFrame(OpenLPImportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -242,7 +243,7 @@ class Ui_OpenLPImportDialog(object): self.verticalLayout_2.addWidget(self.SelectedRemoveSelectedWidget) self.horizontalLayout_6.addWidget(self.SelectedFileListWidget) self.verticalLayout_5.addWidget(self.SongListFrame) - self.ProgressGroupBox = QtGui.QGroupBox(OpenLPImportDialog) + self.ProgressGroupBox = QtGui.QGroupBox(OpenLPImportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -261,7 +262,7 @@ class Ui_OpenLPImportDialog(object): self.ProgressBar.setObjectName(u'ProgressBar') self.verticalLayout_4.addWidget(self.ProgressBar) self.verticalLayout_5.addWidget(self.ProgressGroupBox) - self.ButtonBarWidget = QtGui.QWidget(OpenLPImportDialog) + self.ButtonBarWidget = QtGui.QWidget(OpenLPImportForm) self.ButtonBarWidget.setObjectName(u'ButtonBarWidget') self.horizontalLayout_7 = QtGui.QHBoxLayout(self.ButtonBarWidget) self.horizontalLayout_7.setSpacing(8) @@ -277,29 +278,29 @@ class Ui_OpenLPImportDialog(object): self.horizontalLayout_7.addWidget(self.ClosePushButton) self.verticalLayout_5.addWidget(self.ButtonBarWidget) - self.retranslateUi(OpenLPImportDialog) - QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenLPImportDialog.close) + self.retranslateUi(OpenLPImportForm) + QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenLPImportForm.close) QtCore.QObject.connect(self.ImportSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.ImportListTable.selectAll) QtCore.QObject.connect(self.SelectedSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.selectAll) QtCore.QObject.connect(self.SelectedRemoveSelectedButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.clear) - QtCore.QMetaObject.connectSlotsByName(OpenLPImportDialog) + QtCore.QMetaObject.connectSlotsByName(OpenLPImportForm) - def retranslateUi(self, OpenLPImportDialog): - OpenLPImportDialog.setWindowTitle(self.trUtf8('openlp.org Song Importer')) - self.ImportFileLabel.setText(self.trUtf8('Select openlp.org songfile to import:')) - self.ImportListLabel.setText(self.trUtf8('Import File Song List')) - self.ImportListTable.horizontalHeaderItem(0).setText(self.trUtf8('Song Title')) - self.ImportListTable.horizontalHeaderItem(1).setText(self.trUtf8('Author')) - self.ImportSelectAllPushButton.setText(self.trUtf8('Select All')) - self.ImportFilterComboBox.setItemText(0, self.trUtf8('Lyrics')) - self.ImportFilterComboBox.setItemText(1, self.trUtf8('Title')) - self.ImportFilterComboBox.setItemText(2, self.trUtf8('Author')) - self.SelectedListLabel.setText(self.trUtf8('Song Import List')) - self.SelectedListTable.horizontalHeaderItem(0).setText(self.trUtf8('Song Title')) - self.SelectedListTable.horizontalHeaderItem(1).setText(self.trUtf8('Author')) - self.SelectedSelectAllPushButton.setText(self.trUtf8('Select All')) - self.SelectedRemoveSelectedButton.setText(self.trUtf8('Remove Selected')) - self.ProgressGroupBox.setTitle(self.trUtf8('Progress:')) - self.ProgressLabel.setText(self.trUtf8('Ready to import')) - self.ImportPushButton.setText(self.trUtf8('Import')) - self.ClosePushButton.setText(self.trUtf8('Close')) + def retranslateUi(self, OpenLPImportForm): + OpenLPImportForm.setWindowTitle(translate('OpenLPImportForm', 'openlp.org Song Importer')) + self.ImportFileLabel.setText(translate('OpenLPImportForm', 'Select openlp.org songfile to import:')) + self.ImportListLabel.setText(translate('OpenLPImportForm', 'Import File Song List')) + self.ImportListTable.horizontalHeaderItem(0).setText(translate('OpenLPImportForm', 'Song Title')) + self.ImportListTable.horizontalHeaderItem(1).setText(translate('OpenLPImportForm', 'Author')) + self.ImportSelectAllPushButton.setText(translate('OpenLPImportForm', 'Select All')) + self.ImportFilterComboBox.setItemText(0, translate('OpenLPImportForm', 'Lyrics')) + self.ImportFilterComboBox.setItemText(1, translate('OpenLPImportForm', 'Title')) + self.ImportFilterComboBox.setItemText(2, translate('OpenLPImportForm', 'Author')) + self.SelectedListLabel.setText(translate('OpenLPImportForm', 'Song Import List')) + self.SelectedListTable.horizontalHeaderItem(0).setText(translate('OpenLPImportForm', 'Song Title')) + self.SelectedListTable.horizontalHeaderItem(1).setText(translate('OpenLPImportForm', 'Author')) + self.SelectedSelectAllPushButton.setText(translate('OpenLPImportForm', 'Select All')) + self.SelectedRemoveSelectedButton.setText(translate('OpenLPImportForm', 'Remove Selected')) + self.ProgressGroupBox.setTitle(translate('OpenLPImportForm', 'Progress:')) + self.ProgressLabel.setText(translate('OpenLPImportForm', 'Ready to import')) + self.ImportPushButton.setText(translate('OpenLPImportForm', 'Import')) + self.ClosePushButton.setText(translate('OpenLPImportForm', 'Close')) From fecf79d521c5c4292d6bb908ae5c41e874bcc820 Mon Sep 17 00:00:00 2001 From: rimach Date: Fri, 30 Apr 2010 21:32:20 +0200 Subject: [PATCH 16/81] Head --- resources/i18n/openlp_af.qm | Bin 33942 -> 30999 bytes resources/i18n/openlp_de.qm | Bin 36466 -> 33249 bytes resources/i18n/openlp_en.ts | 2682 ++++++++++++++++---------------- resources/i18n/openlp_en_GB.qm | Bin 31360 -> 29117 bytes resources/i18n/openlp_en_ZA.qm | Bin 22950 -> 21680 bytes resources/i18n/openlp_es.qm | Bin 14867 -> 14504 bytes resources/i18n/openlp_hu.qm | Bin 34879 -> 32443 bytes resources/i18n/openlp_ko.qm | Bin 462 -> 456 bytes resources/i18n/openlp_nb.qm | Bin 21120 -> 20131 bytes resources/i18n/openlp_pt_BR.qm | Bin 35585 -> 32822 bytes resources/i18n/openlp_sv.qm | Bin 36927 -> 34154 bytes 11 files changed, 1304 insertions(+), 1378 deletions(-) diff --git a/resources/i18n/openlp_af.qm b/resources/i18n/openlp_af.qm index 48b4c532238f23dbe9550e82b65475a00d5fd039..8767c8032d6ac679b8f9c34d063a348aa749f460 100644 GIT binary patch delta 5985 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 Wwh`*%ON^z)qB28SzNyHT;{O2$*^##Z delta 8567 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 diff --git a/resources/i18n/openlp_en.ts b/resources/i18n/openlp_en.ts index c0eb5564f..9d50330c1 100644 --- a/resources/i18n/openlp_en.ts +++ b/resources/i18n/openlp_en.ts @@ -3,7 +3,7 @@ AboutForm - + build @@ -229,102 +229,374 @@ This General Public License does not permit incorporating your program into prop Missing data - - - AlertsTab - - pt + + Alert Message - - Location: + + Alert &text: - - Font Color: + + &Parameter(s): - - Font + + &New - - Font Name: + + &Save - - Preview + + &Delete - - Alerts + + Displ&ay - - Alert timeout: + + Display && Cl&ose - - openlp.org - - - - - Background Color: - - - - - s - - - - - Bottom - - - - - Top - - - - - Font Size: + + &Close AmendThemeForm - + Slide Height is %s rows - + First Color: - + Second Color: - + Background Color: + + + Theme Maintenance + + + + + Theme Name: + + + + + Background: + + + + + Opaque + + + + + Transparent + + + + + Background Type: + + + + + Solid Color + + + + + Gradient + + + + + Image + + + + + <Color1> + + + + + <Color2> + + + + + Image: + + + + + Gradient : + + + + + Horizontal + + + + + Vertical + + + + + Circular + + + + + Background + + + + + Main Font + + + + + Font: + + + + + Font Color: + + + + + Size: + + + + + pt + + + + + Wrap Indentation + + + + + Adjust Line Spacing + + + + + Normal + + + + + Bold + + + + + Italics + + + + + Bold/Italics + + + + + Font Weight: + + + + + Display Location + + + + + Use Default Location: + + + + + X Position: + + + + + Y Position: + + + + + Width: + + + + + Height: + + + + + px + + + + + Font Main + + + + + Footer Font + + + + + Font Footer + + + + + Outline + + + + + Outline Size: + + + + + Outline Color: + + + + + Show Outline: + + + + + Shadow + + + + + Shadow Size: + + + + + Shadow Color: + + + + + Show Shadow: + + + + + Alignment + + + + + Horizontal Align: + + + + + Left + + + + + Right + + + + + Center + + + + + Vertical Align: + + + + + Top + + + + + Middle + + + + + Bottom + + + + + Slide Transition + + + + + Transition Active: + + + + + Other Options + + + + + Preview + + AuthorsForm @@ -348,111 +620,131 @@ This General Public License does not permit incorporating your program into prop You need to type in the last name of the author. + + + Author Maintenance + + + + + Display name: + + + + + First name: + + + + + Last name: + + BibleMediaItem - + Quick - + Bible - + Book: - + Text Search - + Find: - + Search Type: - + Bible not fully loaded - + No matching book could be found in this Bible. - + Dual: - + Chapter: - + Search - + Keep - + Results: - + Verse Search - + Version: - + From: - + No Book Found - + Advanced - + To: - + Clear - + Verse: @@ -468,27 +760,27 @@ This General Public License does not permit incorporating your program into prop BiblesTab - + ( and ) - + verse per line - + Display Style: - + continuous - + [ and ] @@ -498,7 +790,7 @@ This General Public License does not permit incorporating your program into prop - + Display Dual Bible Verses @@ -508,12 +800,12 @@ This General Public License does not permit incorporating your program into prop - + Layout Style: - + No brackets @@ -523,23 +815,23 @@ This General Public License does not permit incorporating your program into prop - + { and } - + Note: Changes don't affect verses already in the service - + verse per slide - + Bible Theme: @@ -547,7 +839,7 @@ Changes don't affect verses already in the service CustomMediaItem - + Custom @@ -568,13 +860,13 @@ Changes don't affect verses already in the service - - Display Footer: + + Custom Display - - Custom Display + + Display Footer @@ -605,6 +897,106 @@ Changes don't affect verses already in the service You have unsaved data, please save or clear + + + Edit Custom Slides + + + + + Move slide Up 1 + + + + + Move slide down 1 + + + + + Title: + + + + + Add New + + + + + Add new slide at bottom + + + + + Edit + + + + + Edit selected slide + + + + + Edit All + + + + + Edit all slides + + + + + Save + + + + + Replace edited slide + + + + + Delete + + + + + Delete selected slide + + + + + Clear + + + + + Clear edit area + + + + + Split Slide + + + + + Add slide split + + + + + Theme: + + + + + Credits: + + EditSongForm @@ -653,6 +1045,131 @@ Changes don't affect verses already in the service Invalid verse entry, values must be I,B,T,P,E,O,Vx,Cx + + + Song Editor + + + + + Title: + + + + + Alternative Title: + + + + + Lyrics: + + + + + Verse Order: + + + + + Add + + + + + Edit + + + + + Edit All + + + + + Delete + + + + + Title && Lyrics + + + + + Authors + + + + + &Add to Song + + + + + &Remove + + + + + &Manage Authors, Topics, Books + + + + + Topic + + + + + A&dd to Song + + + + + R&emove + + + + + Song Book + + + + + Authors, Topics && Book + + + + + Theme + + + + + Add a Theme + + + + + Copyright Information + + + + + CCLI Number: + + + + + Comments + + + + + Theme, Copyright Info && Comments + + EditVerseForm @@ -666,109 +1183,154 @@ Changes don't affect verses already in the service Chrous + + + Edit Verse + + + + + Verse Type + + + + + Intro + + + + + Pre-Chorus + + + + + Chorus + + + + + Bridge + + + + + Ending + + + + + Other + + + + + Number + + GeneralTab - + CCLI Details - + primary - + Application Startup - + Select monitor for output display: - + Application Settings - + SongSelect Username: - + CCLI Number: - + Automatically open the last service - + Preview Next Song from Service Manager - + Show blank screen warning - + Prompt to save Service before starting New - + General - + Show the splash screen - + Screen - + Monitors - + SongSelect Password: - - Display if in single screen + + Display if a single screen ImageMediaItem - + Select Image(s) - + Image(s) - + Image @@ -778,17 +1340,17 @@ Changes don't affect verses already in the service - + Replace Live Background - + No item selected - + You must select one item @@ -827,120 +1389,275 @@ Changes don't affect verses already in the service ImportWizardForm - + You need to specify a file with books of the Bible to use in the import. - + Invalid Bible Location - + You need to set a copyright for your Bible! Bibles in the Public Domain need to be marked as such. - + Bible Exists - + Empty Copyright - + Empty Version Name - + Invalid OpenSong Bible - + Your Bible import failed. - + Finished import. - + You need to specify a file of Bible verses to import. - + You need to specify a version name for your Bible. - + This Bible already exists! Please import a different Bible or first delete the existing one. - + Starting import... - + Invalid Books File - + You need to specify a file to import your Bible from. - + You need to specify an OpenSong Bible file to import. - + Invalid Verse File - + Open OpenSong Bible - + Open OSIS File - + Open Books CSV File - + Open Verses CSV File + + + Bible Import Wizard + + + + + Welcome to the Bible Import Wizard + + + + + 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. + + + + + Select Import Source + + + + + Select the import format, and where to import from. + + + + + Format: + + + + + OSIS + + + + + CSV + + + + + OpenSong + + + + + Web Download + + + + + File Location: + + + + + Books Location: + + + + + Verse Location: + + + + + Bible Filename: + + + + + Location: + + + + + Crosswalk + + + + + BibleGateway + + + + + Bible: + + + + + Download Options + + + + + Server: + + + + + Username: + + + + + Password: + + + + + Proxy Server (Optional) + + + + + License Details + + + + + Set up the Bible's license details. + + + + + Version Name: + + + + + Copyright: + + + + + Permission: + + + + + Importing + + + + + Please wait while your Bible is imported. + + + + + Ready. + + LanguageManager - + Language - + After restart new Language settings will be used. @@ -948,387 +1665,387 @@ Changes don't affect verses already in the service MainWindow - + The Main Display has been blanked out - + OpenLP Version Updated - + Save Changes to Service? - - Your service has changed, do you want to save those changes? - - - - + OpenLP Main Display Blanked - + New Service - + Open Service - + Save Service - + OpenLP 2.0 - + English - + Default Theme: - + &File - + &Import - + &Export - + &Options - + &View - + M&ode - + &Tools - + &Help - + Media Manager - + Service Manager - + Theme Manager - + &New - + Create a new Service - + Ctrl+N - + &Open - + Open an existing service - + Ctrl+O - + &Save - + Save the current service to disk - + Ctrl+S - + Save &As... - + Save Service As - + Save the current service under a new name - + F12 - + E&xit - + Quit OpenLP - + Alt+F4 - + &Theme - + &Language - + Look && &Feel - + &Settings - + &Media Manager - + Toggle Media Manager - + Toggle the visibility of the Media Manager - + F8 - + &Theme Manager - + Toggle Theme Manager - + Toggle the visibility of the Theme Manager - + F10 - + &Service Manager - + Toggle Service Manager - + Toggle the visibility of the Service Manager - + F9 - + &Preview Panel - + Toggle Preview Panel - + Toggle the visibility of the Preview Panel - + F11 - + &Plugin List - + List the Plugins - + Alt+F7 - + &User Guide - + &About - + More information about OpenLP - + Ctrl+F1 - + &Online Help - + &Web Site - + &Auto Detect - + Choose System language, if available - + Set the interface language to %1 - + Add &Tool... - + Add an application to the list of tools - + &Preview Pane - + &Live - + Version %s of OpenLP is now available for download (you are currently running version %s). You can download the latest version from http://openlp.org + + + Your service has changed. Do you want to save those changes? + + MediaManagerItem - + &Preview @@ -1338,77 +2055,77 @@ You can download the latest version from http://openlp.org - + Load a new - + Delete the selected item - + &Edit - + &Add to Service - + Send the selected item live - + Add the selected item(s) to the service - + Edit the selected - + Add a new - + &Show Live - + Preview the selected item - + Import a - + &Delete - + &Add to selected Service Item - + No Items Selected - + You must select one or more items. @@ -1423,20 +2140,20 @@ You can download the latest version from http://openlp.org - - You must select a existing service item to add to. + + Invalid Service Item - - Invalid Service Item + + You must select an existing service item to add to. MediaMediaItem - + Media @@ -1450,6 +2167,21 @@ You can download the latest version from http://openlp.org Videos (%s);;Audio (%s);;All files (*) + + + Replace Live Background + + + + + No item selected + + + + + You must select one item + + MediaPlugin @@ -1459,6 +2191,152 @@ You can download the latest version from http://openlp.org + + OpenLPExportForm + + + openlp.org Song Exporter + + + + + Select openlp.org export filename: + + + + + Full Song List + + + + + Song Title + + + + + Author + + + + + Select All + + + + + Lyrics + + + + + Title + + + + + Song Export List + + + + + Remove Selected + + + + + Progress: + + + + + Ready to export + + + + + Export + + + + + Close + + + + + OpenLPImportForm + + + openlp.org Song Importer + + + + + Select openlp.org songfile to import: + + + + + Import File Song List + + + + + Song Title + + + + + Author + + + + + Select All + + + + + Lyrics + + + + + Title + + + + + Song Import List + + + + + Remove Selected + + + + + Progress: + + + + + Ready to import + + + + + Import + + + + + Close + + + OpenSongBible @@ -1467,40 +2345,83 @@ You can download the latest version from http://openlp.org + + PluginForm + + + Plugin List + + + + + Plugin Details + + + + + Version: + + + + + TextLabel + + + + + About: + + + + + Status: + + + + + Active + + + + + Inactive + + + PresentationMediaItem - + Presentation - + Present using: - + Automatic - + A presentation with that filename already exists. - + Select Presentation(s) - + File exists - + Presentations (%s) @@ -1508,7 +2429,7 @@ You can download the latest version from http://openlp.org PresentationPlugin - + <b>Presentation Plugin</b> <br> Delivers the ability to show presentations using a number of different programs. The choice of available presentation programs is available to the user in a drop down box. @@ -1547,228 +2468,272 @@ You can download the latest version from http://openlp.org RemotesPlugin - + <b>Remote Plugin</b><br>This plugin provides the ability to send messages to a running version of openlp on a different computer.<br>The Primary use for this would be to send alerts from a creche + + ServiceItemEditForm + + + Service Item Maintenance + + + + + Up + + + + + Delete + + + + + Down + + + ServiceManager - + Save Changes to Service? - + Open Service - + Move to top - + Create a new service - + Save this service - + Theme: - + Delete From Service - + Save Service - + &Live Verse - + Move to &top - + New Service - + &Notes - + Move to end - - Your service is unsaved, do you want to save those changes before creating a new one ? - - - - + &Delete From Service - + Move up order - + Move down order - + Move &down - + Load an existing service - + &Preview Verse - + Move &up - + &Edit Item - + Move to &bottom - + &Maintain Item + + + Your service is unsaved, do you want to save those changes before creating a new one? + + + + + Your current service is unsaved, do you want to save the changes before opening a new one? + + + + + ServiceNoteForm + + + Service Item Notes + + + + + SettingsForm + + + Settings + + SlideController - + Move to previous - + Go to Verse - + Start continuous loop - + Live - + Start playing media - + Move to live - + Preview - + Move to last - + Edit and re-preview Song - + Delay between slides in seconds - + Move to next - + Move to first - + Blank Screen - + Verse - + Stop continuous loop - + s - + Theme Screen - + Hide Screen - + Chorus @@ -1892,12 +2857,12 @@ You can download the latest version from http://openlp.org - + Song - + Maintain the lists of authors, topics and books @@ -1937,7 +2902,7 @@ You can download the latest version from http://openlp.org - + Song Maintenance @@ -1978,7 +2943,7 @@ You can download the latest version from http://openlp.org SongUsageDetailForm - + Output File Location @@ -1986,7 +2951,7 @@ You can download the latest version from http://openlp.org SongUsagePlugin - + <b>SongUsage Plugin</b><br>This plugin records the use of songs and when they have been used during a live service @@ -2011,16 +2976,6 @@ You can download the latest version from http://openlp.org SongsTab - - - Display Verses on Live Tool bar: - - - - - Enable search as you type: - - Songs Mode @@ -2031,126 +2986,136 @@ You can download the latest version from http://openlp.org Songs + + + Enable search as you type + + + + + Display Verses on Live Tool bar + + ThemeManager - + Import Theme - + Create a new theme - + Delete Theme - + Error - + Make Global - + Delete a theme - + File is not a valid theme. - + Edit a theme - + Edit Theme - + Export Theme - + You are unable to delete the default theme. - + Theme Exists - + Delete theme - + Save Theme - (%s) - + default - + Select Theme Import File - + New Theme - + Import a theme - + Export theme - + You have not selected a theme. - + A theme with this name already exists, would you like to overwrite it? - + Export a theme - + Theme %s is use in %s plugin - + Theme %s is use by Service Manager @@ -2216,860 +3181,6 @@ You can download the latest version from http://openlp.org - - Ui_AlertDialog - - - Alert Message - - - - - Alert &text: - - - - - &Parameter(s): - - - - - &New - - - - - &Save - - - - - &Delete - - - - - Displ&ay - - - - - Display && Cl&ose - - - - - &Close - - - - - Ui_AmendThemeDialog - - - Shadow Size: - - - - - Slide Transition - - - - - Bottom - - - - - Image - - - - - Height: - - - - - Outline - - - - - Main Font - - - - - Solid Color - - - - - Font Main - - - - - Use Default Location: - - - - - Other Options - - - - - Shadow - - - - - Italics - - - - - Background: - - - - - X Position: - - - - - Center - - - - - <Color2> - - - - - Opaque - - - - - Outline Color: - - - - - Alignment - - - - - Normal - - - - - Bold - - - - - Footer Font - - - - - Theme Maintenance - - - - - <Color1> - - - - - Font Footer - - - - - Font Weight: - - - - - Transparent - - - - - Background - - - - - Vertical - - - - - Width: - - - - - Middle - - - - - Shadow Color: - - - - - Vertical Align: - - - - - Top - - - - - Right - - - - - Font Color: - - - - - Horizontal - - - - - Circular - - - - - pt - - - - - px - - - - - Display Location - - - - - Y Position: - - - - - Show Shadow: - - - - - Font: - - - - - Preview - - - - - Outline Size: - - - - - Wrap Indentation - - - - - Left - - - - - Theme Name: - - - - - Image: - - - - - Transition Active: - - - - - Size: - - - - - Gradient : - - - - - Bold/Italics - - - - - Horizontal Align: - - - - - Background Type: - - - - - Show Outline: - - - - - Gradient - - - - - Ui_AuthorsDialog - - - Last name: - - - - - First name: - - - - - Author Maintenance - - - - - Display name: - - - - - Ui_BibleImportWizard - - - Bible Import Wizard - - - - - Bible: - - - - - Crosswalk - - - - - CSV - - - - - OpenSong - - - - - File Location: - - - - - 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. - - - - - Copyright: - - - - - Verse Location: - - - - - Server: - - - - - Permission: - - - - - Select Import Source - - - - - Set up the Bible's license details. - - - - - BibleGateway - - - - - Username: - - - - - Download Options - - - - - Location: - - - - - Bible Filename: - - - - - Format: - - - - - Importing - - - - - License Details - - - - - OSIS - - - - - Web Download - - - - - Please wait while your Bible is imported. - - - - - Select the import format, and where to import from. - - - - - Proxy Server (Optional) - - - - - Welcome to the Bible Import Wizard - - - - - Password: - - - - - Version Name: - - - - - Ready. - - - - - Books Location: - - - - - Ui_EditSongDialog - - - &Remove - - - - - Alternative Title: - - - - - Add a Theme - - - - - R&emove - - - - - Verse Order: - - - - - Title && Lyrics - - - - - Theme - - - - - Authors, Topics && Book - - - - - Copyright Information - - - - - Topic - - - - - Lyrics: - - - - - Edit - - - - - Authors - - - - - Song Editor - - - - - Delete - - - - - &Add to Song - - - - - CCLI Number: - - - - - Add - - - - - Theme, Copyright Info && Comments - - - - - Song Book - - - - - Edit All - - - - - A&dd to Song - - - - - Title: - - - - - Comments - - - - - &Manage Authors, Topics, Books - - - - - Ui_EditVerseDialog - - - Verse - - - - - Ending - - - - - Number - - - - - Other - - - - - Bridge - - - - - Pre-Chorus - - - - - Edit Verse - - - - - Intro - - - - - Chorus - - - - - Verse Type - - - - - Ui_OpenLPExportDialog - - - Song Title - - - - - Title - - - - - Select openlp.org export filename: - - - - - Close - - - - - Export - - - - - Lyrics - - - - - Full Song List - - - - - Progress: - - - - - Remove Selected - - - - - Author - - - - - openlp.org Song Exporter - - - - - Song Export List - - - - - Ready to export - - - - - Select All - - - - - Ui_OpenLPImportDialog - - - Author - - - - - Ready to import - - - - - Progress: - - - - - openlp.org Song Importer - - - - - Song Import List - - - - - Import File Song List - - - - - Close - - - - - Select openlp.org songfile to import: - - - - - Lyrics - - - - - Import - - - - - Song Title - - - - - Select All - - - - - Title - - - - - Remove Selected - - - Ui_OpenSongExportDialog @@ -3176,88 +3287,6 @@ You can download the latest version from http://openlp.org - - Ui_PluginViewDialog - - - Plugin Details - - - - - Active - - - - - Status: - - - - - Version: - - - - - TextLabel - - - - - About: - - - - - Inactive - - - - - Plugin List - - - - - Ui_ServiceItemEditDialog - - - Service Item Maintenance - - - - - Up - - - - - Delete - - - - - Down - - - - - Ui_ServiceNoteEdit - - - Service Item Notes - - - - - Ui_SettingsDialog - - - Settings - - - Ui_SongBookDialog @@ -3358,109 +3387,6 @@ You can download the latest version from http://openlp.org - - Ui_customEditDialog - - - Delete selected slide - - - - - Edit selected slide - - - - - Edit All - - - - - Add new slide at bottom - - - - - Clear - - - - - Delete - - - - - Theme: - - - - - Move slide Up 1 - - - - - Title: - - - - - Credits: - - - - - Edit Custom Slides - - - - - Edit all slides - - - - - Save - - - - - Replace edited slide - - - - - Move slide down 1 - - - - - Edit - - - - - Add New - - - - - Clear edit area - - - - - Split Slide - - - - - Add slide split - - - alertsPlugin @@ -3469,7 +3395,7 @@ You can download the latest version from http://openlp.org - + <b>Alerts Plugin</b><br>This plugin controls the displaying of alerts on the presentations screen @@ -3595,37 +3521,37 @@ OpenOffice.org must be installed and you must be using an unedited copy of the R tools_menu - + &Song Usage - + &Delete recorded data - + Delete song usage to specified date - + &Extract recorded data - + Generate report on Song Usage - + Song Usage Status - + Start/Stop live song usage recording diff --git a/resources/i18n/openlp_en_GB.qm b/resources/i18n/openlp_en_GB.qm index d5acb055374d1f4a239d63baa435ca6483c7f99a..0103ea3084350b6cb1b12f4eadeb91d270dd7c6e 100644 GIT binary patch delta 6177 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 F{TJh6$prua delta 5611 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 diff --git a/resources/i18n/openlp_hu.qm b/resources/i18n/openlp_hu.qm index 530115bb4b7ab9365fa94f2b6fabee1ed482ba1c..2dfc0bf7f0e9d70365149824c4fcf7b065af13d0 100644 GIT binary patch delta 6393 zcmZ|T2Urx>+6VA=W@ok+5DTbL5l{qz4HeMPq$@>Hng~)BSOct5G(vQv#EP-7Rzft! z9uSQyF%hHjioNDWbCYXJBx+(W3HfaC{%0A~s2|V6{?0iwbIyC}mc5JEhNp~a$X8kR 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 CY$8Me delta 8428 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 JRH@O{{{^h_d{Y1b diff --git a/resources/i18n/openlp_ko.qm b/resources/i18n/openlp_ko.qm index 5a91048541b8c6c29bfe0edd019360a8936f1ff9..1843093c3b1bc55ae643b34d4d58690e20c5c4b0 100644 GIT binary patch delta 60 zcmX@de1dsGDRU6R^oflX6DJr?{HZl@f*K>|#6}YZKBvs2oK)Y`l*~lWlGI!VKG&4Y Q66ez5lKfn^{Gwb20J0Gk)c^nh delta 61 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 delta 4628 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 ad%?@n|LN*7rp#1sDz@ZU%q7KQ4F3l|-{0r} diff --git a/resources/i18n/openlp_pt_BR.qm b/resources/i18n/openlp_pt_BR.qm index f5f4cdc71514feaae60e0b02de436026b4aeb124..64d9f6364690cdae8f457e0881166c55fb895666 100644 GIT binary patch delta 6295 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 EA9=$FQ~&?~ delta 8515 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 diff --git a/resources/i18n/openlp_sv.qm b/resources/i18n/openlp_sv.qm index 592530062c7254b400551c58a25a7d0329fb7747..ba50bcea7768842e36d8a5ef0d1dda05f88e9c1a 100644 GIT binary patch delta 6504 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 W^~W$8yVY83bIW8As8gvf0{;h-%n0QG From 190a6d48199501f37f79e629a964c7bf3ea24945 Mon Sep 17 00:00:00 2001 From: rimach Date: Fri, 30 Apr 2010 22:03:26 +0200 Subject: [PATCH 17/81] Head --- .../songs/forms/opensongexportdialog.py | 63 +-- .../songs/forms/opensongimportdialog.py | 37 +- openlp/plugins/songs/forms/songbookdialog.py | 35 +- .../songs/forms/songmaintenancedialog.py | 50 +-- openlp/plugins/songs/forms/topicsdialog.py | 29 +- .../songusage/forms/songusagedeletedialog.py | 3 +- .../songusage/forms/songusagedetaildialog.py | 9 +- resources/i18n/openlp_af.qm | Bin 30999 -> 31508 bytes resources/i18n/openlp_de.qm | Bin 33249 -> 33786 bytes resources/i18n/openlp_en.ts | 384 +++++++++--------- resources/i18n/openlp_en_GB.qm | Bin 29117 -> 28983 bytes resources/i18n/openlp_en_ZA.qm | Bin 21680 -> 21540 bytes resources/i18n/openlp_es.qm | Bin 14504 -> 14461 bytes resources/i18n/openlp_hu.qm | Bin 32443 -> 32311 bytes resources/i18n/openlp_nb.qm | Bin 20131 -> 20348 bytes resources/i18n/openlp_pt_BR.qm | Bin 32822 -> 33037 bytes resources/i18n/openlp_sv.qm | Bin 34154 -> 34308 bytes 17 files changed, 301 insertions(+), 309 deletions(-) diff --git a/openlp/plugins/songs/forms/opensongexportdialog.py b/openlp/plugins/songs/forms/opensongexportdialog.py index c40800dfa..571be630b 100644 --- a/openlp/plugins/songs/forms/opensongexportdialog.py +++ b/openlp/plugins/songs/forms/opensongexportdialog.py @@ -24,18 +24,19 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_OpenSongExportDialog(object): - def setupUi(self, OpenSongExportDialog): - OpenSongExportDialog.setObjectName(u'OpenSongExportDialog') - OpenSongExportDialog.resize(473, 459) + def setupUi(self, OpenSongExportForm): + OpenSongExportForm.setObjectName(u'OpenSongExportDialog') + OpenSongExportForm.resize(473, 459) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - OpenSongExportDialog.setWindowIcon(icon) - self.verticalLayout_5 = QtGui.QVBoxLayout(OpenSongExportDialog) + OpenSongExportForm.setWindowIcon(icon) + self.verticalLayout_5 = QtGui.QVBoxLayout(OpenSongExportForm) self.verticalLayout_5.setMargin(8) self.verticalLayout_5.setObjectName(u'verticalLayout_5') - self.ExportFileWidget = QtGui.QWidget(OpenSongExportDialog) + self.ExportFileWidget = QtGui.QWidget(OpenSongExportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -59,7 +60,7 @@ class Ui_OpenSongExportDialog(object): self.ExportFileSelectPushButton.setObjectName(u'ExportFileSelectPushButton') self.horizontalLayout.addWidget(self.ExportFileSelectPushButton) self.verticalLayout_5.addWidget(self.ExportFileWidget) - self.SongListFrame = QtGui.QFrame(OpenSongExportDialog) + self.SongListFrame = QtGui.QFrame(OpenSongExportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -242,7 +243,7 @@ class Ui_OpenSongExportDialog(object): self.verticalLayout_2.addWidget(self.SelectedRemoveSelectedWidget) self.horizontalLayout_6.addWidget(self.SelectedFileListWidget) self.verticalLayout_5.addWidget(self.SongListFrame) - self.ProgressGroupBox = QtGui.QGroupBox(OpenSongExportDialog) + self.ProgressGroupBox = QtGui.QGroupBox(OpenSongExportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -261,7 +262,7 @@ class Ui_OpenSongExportDialog(object): self.ProgressBar.setObjectName(u'ProgressBar') self.verticalLayout_4.addWidget(self.ProgressBar) self.verticalLayout_5.addWidget(self.ProgressGroupBox) - self.ButtonBarWidget = QtGui.QWidget(OpenSongExportDialog) + self.ButtonBarWidget = QtGui.QWidget(OpenSongExportForm) self.ButtonBarWidget.setObjectName(u'ButtonBarWidget') self.horizontalLayout_7 = QtGui.QHBoxLayout(self.ButtonBarWidget) self.horizontalLayout_7.setSpacing(8) @@ -277,29 +278,29 @@ class Ui_OpenSongExportDialog(object): self.horizontalLayout_7.addWidget(self.ClosePushButton) self.verticalLayout_5.addWidget(self.ButtonBarWidget) - self.retranslateUi(OpenSongExportDialog) - QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenSongExportDialog.close) + self.retranslateUi(OpenSongExportForm) + QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenSongExportForm.close) QtCore.QObject.connect(self.ExportSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.ExportListTable.selectAll) QtCore.QObject.connect(self.SelectedSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.selectAll) QtCore.QObject.connect(self.SelectedRemoveSelectedButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.clear) - QtCore.QMetaObject.connectSlotsByName(OpenSongExportDialog) + QtCore.QMetaObject.connectSlotsByName(OpenSongExportForm) - def retranslateUi(self, OpenSongExportDialog): - OpenSongExportDialog.setWindowTitle(self.trUtf8('OpenSong Song Exporter')) - self.ExportFileLabel.setText(self.trUtf8('Select OpenSong song folder:')) - self.ExportListLabel.setText(self.trUtf8('Full Song List')) - self.ExportListTable.horizontalHeaderItem(0).setText(self.trUtf8('Song Title')) - self.ExportListTable.horizontalHeaderItem(1).setText(self.trUtf8('Author')) - self.ExportSelectAllPushButton.setText(self.trUtf8('Select All')) - self.ExportFilterComboBox.setItemText(0, self.trUtf8('Lyrics')) - self.ExportFilterComboBox.setItemText(1, self.trUtf8('Title')) - self.ExportFilterComboBox.setItemText(2, self.trUtf8('Author')) - self.SelectedListLabel.setText(self.trUtf8('Song Export List')) - self.SelectedListTable.horizontalHeaderItem(0).setText(self.trUtf8('Song Title')) - self.SelectedListTable.horizontalHeaderItem(1).setText(self.trUtf8('Author')) - self.SelectedSelectAllPushButton.setText(self.trUtf8('Select All')) - self.SelectedRemoveSelectedButton.setText(self.trUtf8('Remove Selected')) - self.ProgressGroupBox.setTitle(self.trUtf8('Progress:')) - self.ProgressLabel.setText(self.trUtf8('Ready to export')) - self.ExportPushButton.setText(self.trUtf8('Export')) - self.ClosePushButton.setText(self.trUtf8('Close')) + def retranslateUi(self, OpenSongExportForm): + OpenSongExportForm.setWindowTitle(translate('OpenSong Song Exporter')) + self.ExportFileLabel.setText(translate('OpenSongExportForm', 'Select OpenSong song folder:')) + self.ExportListLabel.setText(translate('OpenSongExportForm', 'Full Song List')) + self.ExportListTable.horizontalHeaderItem(0).setText(translate('OpenSongExportForm', 'Song Title')) + self.ExportListTable.horizontalHeaderItem(1).setText(translate('OpenSongExportForm', 'Author')) + self.ExportSelectAllPushButton.setText(translate('OpenSongExportForm', 'Select All')) + self.ExportFilterComboBox.setItemText(0, translate('OpenSongExportForm', 'Lyrics')) + self.ExportFilterComboBox.setItemText(1, translate('OpenSongExportForm', 'Title')) + self.ExportFilterComboBox.setItemText(2, translate('OpenSongExportForm', 'Author')) + self.SelectedListLabel.setText(translate('OpenSongExportForm', 'Song Export List')) + self.SelectedListTable.horizontalHeaderItem(0).setText(translate('OpenSongExportForm', 'Song Title')) + self.SelectedListTable.horizontalHeaderItem(1).setText(translate('OpenSongExportForm', 'Author')) + self.SelectedSelectAllPushButton.setText(translate('OpenSongExportForm', 'Select All')) + self.SelectedRemoveSelectedButton.setText(translate('OpenSongExportForm', 'Remove Selected')) + self.ProgressGroupBox.setTitle(translate('OpenSongExportForm', 'Progress:')) + self.ProgressLabel.setText(translate('OpenSongExportForm', 'Ready to export')) + self.ExportPushButton.setText(translate('OpenSongExportForm', 'Export')) + self.ClosePushButton.setText(translate('OpenSongExportForm', 'Close')) diff --git a/openlp/plugins/songs/forms/opensongimportdialog.py b/openlp/plugins/songs/forms/opensongimportdialog.py index e0fd23821..df9bce507 100644 --- a/openlp/plugins/songs/forms/opensongimportdialog.py +++ b/openlp/plugins/songs/forms/opensongimportdialog.py @@ -24,19 +24,20 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_OpenSongImportDialog(object): - def setupUi(self, OpenSongImportDialog): - OpenSongImportDialog.setObjectName(u'OpenSongImportDialog') - OpenSongImportDialog.resize(481, 172) + def setupUi(self, OpenSongImportForm): + OpenSongImportForm.setObjectName(u'OpenSongImportDialog') + OpenSongImportForm.resize(481, 172) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - OpenSongImportDialog.setWindowIcon(icon) - self.verticalLayout = QtGui.QVBoxLayout(OpenSongImportDialog) + OpenSongImportForm.setWindowIcon(icon) + self.verticalLayout = QtGui.QVBoxLayout(OpenSongImportForm) self.verticalLayout.setSpacing(6) self.verticalLayout.setMargin(8) self.verticalLayout.setObjectName(u'verticalLayout') - self.ImportFileWidget = QtGui.QWidget(OpenSongImportDialog) + self.ImportFileWidget = QtGui.QWidget(OpenSongImportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -60,7 +61,7 @@ class Ui_OpenSongImportDialog(object): self.ImportFileSelectPushButton.setObjectName(u'ImportFileSelectPushButton') self.horizontalLayout.addWidget(self.ImportFileSelectPushButton) self.verticalLayout.addWidget(self.ImportFileWidget) - self.ProgressGroupBox = QtGui.QGroupBox(OpenSongImportDialog) + self.ProgressGroupBox = QtGui.QGroupBox(OpenSongImportForm) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -79,7 +80,7 @@ class Ui_OpenSongImportDialog(object): self.ProgressBar.setObjectName(u'ProgressBar') self.verticalLayout_4.addWidget(self.ProgressBar) self.verticalLayout.addWidget(self.ProgressGroupBox) - self.ButtonBarWidget = QtGui.QWidget(OpenSongImportDialog) + self.ButtonBarWidget = QtGui.QWidget(OpenSongImportForm) self.ButtonBarWidget.setObjectName(u'ButtonBarWidget') self.horizontalLayout_7 = QtGui.QHBoxLayout(self.ButtonBarWidget) self.horizontalLayout_7.setSpacing(8) @@ -95,14 +96,14 @@ class Ui_OpenSongImportDialog(object): self.horizontalLayout_7.addWidget(self.ClosePushButton) self.verticalLayout.addWidget(self.ButtonBarWidget) - self.retranslateUi(OpenSongImportDialog) - QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenSongImportDialog.close) - QtCore.QMetaObject.connectSlotsByName(OpenSongImportDialog) + self.retranslateUi(OpenSongImportForm) + QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenSongImportForm.close) + QtCore.QMetaObject.connectSlotsByName(OpenSongImportForm) - def retranslateUi(self, OpenSongImportDialog): - OpenSongImportDialog.setWindowTitle(self.trUtf8('OpenSong Song Importer')) - self.ImportFileLabel.setText(self.trUtf8('OpenSong Folder:')) - self.ProgressGroupBox.setTitle(self.trUtf8('Progress:')) - self.ProgressLabel.setText(self.trUtf8('Ready to import')) - self.ImportPushButton.setText(self.trUtf8('Import')) - self.ClosePushButton.setText(self.trUtf8('Close')) + def retranslateUi(self, OpenSongImportForm): + OpenSongImportForm.setWindowTitle(translate('OpenSongImportForm', 'OpenSong Song Importer')) + self.ImportFileLabel.setText(translate('OpenSongImportForm', 'OpenSong Folder:')) + self.ProgressGroupBox.setTitle(translate('OpenSongImportForm', 'Progress:')) + self.ProgressLabel.setText(translate('OpenSongImportForm', 'Ready to import')) + self.ImportPushButton.setText(translate('OpenSongImportForm', 'Import')) + self.ClosePushButton.setText(translate('OpenSongImportForm', 'Close')) diff --git a/openlp/plugins/songs/forms/songbookdialog.py b/openlp/plugins/songs/forms/songbookdialog.py index 823e20eba..4276ae9da 100644 --- a/openlp/plugins/songs/forms/songbookdialog.py +++ b/openlp/plugins/songs/forms/songbookdialog.py @@ -24,32 +24,33 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_SongBookDialog(object): - def setupUi(self, SongBookDialog): - SongBookDialog.setObjectName(u'SongBookDialog') - SongBookDialog.resize(367, 120) - self.SongBookLayout = QtGui.QFormLayout(SongBookDialog) + def setupUi(self, SongBookForm): + SongBookForm.setObjectName(u'SongBookDialog') + SongBookForm.resize(367, 120) + self.SongBookLayout = QtGui.QFormLayout(SongBookForm) self.SongBookLayout.setMargin(8) self.SongBookLayout.setSpacing(8) self.SongBookLayout.setObjectName(u'SongBookLayout') - self.NameLabel = QtGui.QLabel(SongBookDialog) + self.NameLabel = QtGui.QLabel(SongBookForm) self.NameLabel.setObjectName(u'NameLabel') self.SongBookLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.NameLabel) - self.NameEdit = QtGui.QLineEdit(SongBookDialog) + self.NameEdit = QtGui.QLineEdit(SongBookForm) self.NameEdit.setObjectName(u'NameEdit') self.SongBookLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.NameEdit) - self.PublisherLabel = QtGui.QLabel(SongBookDialog) + self.PublisherLabel = QtGui.QLabel(SongBookForm) self.PublisherLabel.setObjectName(u'PublisherLabel') self.SongBookLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.PublisherLabel) - self.PublisherEdit = QtGui.QLineEdit(SongBookDialog) + self.PublisherEdit = QtGui.QLineEdit(SongBookForm) self.PublisherEdit.setObjectName(u'PublisherEdit') self.SongBookLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.PublisherEdit) - self.ButtonBox = QtGui.QDialogButtonBox(SongBookDialog) + self.ButtonBox = QtGui.QDialogButtonBox(SongBookForm) self.ButtonBox.setOrientation(QtCore.Qt.Horizontal) self.ButtonBox.setStandardButtons( QtGui.QDialogButtonBox.Save | QtGui.QDialogButtonBox.Cancel) @@ -57,14 +58,14 @@ class Ui_SongBookDialog(object): self.SongBookLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.ButtonBox) - self.retranslateUi(SongBookDialog) + self.retranslateUi(SongBookForm) QtCore.QObject.connect(self.ButtonBox, - QtCore.SIGNAL(u'accepted()'), SongBookDialog.accept) + QtCore.SIGNAL(u'accepted()'), SongBookForm.accept) QtCore.QObject.connect(self.ButtonBox, - QtCore.SIGNAL(u'rejected()'), SongBookDialog.reject) - QtCore.QMetaObject.connectSlotsByName(SongBookDialog) + QtCore.SIGNAL(u'rejected()'), SongBookForm.reject) + QtCore.QMetaObject.connectSlotsByName(SongBookForm) - def retranslateUi(self, SongBookDialog): - SongBookDialog.setWindowTitle(self.trUtf8('Edit Book')) - self.NameLabel.setText(self.trUtf8('Name:')) - self.PublisherLabel.setText(self.trUtf8('Publisher:')) + def retranslateUi(self, SongBookForm): + SongBookForm.setWindowTitle(translate('SongBookForm', 'Edit Book')) + self.NameLabel.setText(translate('SongBookForm', 'Name:')) + self.PublisherLabel.setText(translate('SongBookForm', 'Publisher:')) diff --git a/openlp/plugins/songs/forms/songmaintenancedialog.py b/openlp/plugins/songs/forms/songmaintenancedialog.py index cbd08f34d..ca4b5ec0e 100644 --- a/openlp/plugins/songs/forms/songmaintenancedialog.py +++ b/openlp/plugins/songs/forms/songmaintenancedialog.py @@ -25,18 +25,18 @@ from PyQt4 import QtCore, QtGui -from openlp.core.lib import build_icon +from openlp.core.lib import build_icon, translate class Ui_SongMaintenanceDialog(object): - def setupUi(self, SongMaintenanceDialog): - SongMaintenanceDialog.setObjectName(u'SongMaintenanceDialog') - SongMaintenanceDialog.setWindowModality(QtCore.Qt.ApplicationModal) - SongMaintenanceDialog.resize(486, 361) - self.DialogLayout = QtGui.QVBoxLayout(SongMaintenanceDialog) + def setupUi(self, SongMaintenanceForm): + SongMaintenanceForm.setObjectName(u'SongMaintenanceDialog') + SongMaintenanceForm.setWindowModality(QtCore.Qt.ApplicationModal) + SongMaintenanceForm.resize(486, 361) + self.DialogLayout = QtGui.QVBoxLayout(SongMaintenanceForm) self.DialogLayout.setSpacing(8) self.DialogLayout.setMargin(8) self.DialogLayout.setObjectName(u'DialogLayout') - self.ContentWidget = QtGui.QWidget(SongMaintenanceDialog) + self.ContentWidget = QtGui.QWidget(SongMaintenanceForm) self.ContentWidget.setObjectName(u'ContentWidget') self.ContentLayout = QtGui.QHBoxLayout(self.ContentWidget) self.ContentLayout.setSpacing(8) @@ -192,32 +192,32 @@ class Ui_SongMaintenanceDialog(object): self.TypeStackedWidget.addWidget(self.BooksPage) self.ContentLayout.addWidget(self.TypeStackedWidget) self.DialogLayout.addWidget(self.ContentWidget) - self.MaintenanceButtonBox = QtGui.QDialogButtonBox(SongMaintenanceDialog) + self.MaintenanceButtonBox = QtGui.QDialogButtonBox(SongMaintenanceForm) self.MaintenanceButtonBox.setOrientation(QtCore.Qt.Horizontal) self.MaintenanceButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) self.MaintenanceButtonBox.setObjectName(u'MaintenanceButtonBox') self.DialogLayout.addWidget(self.MaintenanceButtonBox) - self.retranslateUi(SongMaintenanceDialog) + self.retranslateUi(SongMaintenanceForm) self.TypeStackedWidget.setCurrentIndex(0) QtCore.QObject.connect(self.MaintenanceButtonBox, - QtCore.SIGNAL(u'rejected()'), SongMaintenanceDialog.accept) + QtCore.SIGNAL(u'rejected()'), SongMaintenanceForm.accept) QtCore.QObject.connect(self.TypeListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.TypeStackedWidget.setCurrentIndex) - QtCore.QMetaObject.connectSlotsByName(SongMaintenanceDialog) + QtCore.QMetaObject.connectSlotsByName(SongMaintenanceForm) - def retranslateUi(self, SongMaintenanceDialog): - SongMaintenanceDialog.setWindowTitle(self.trUtf8('Song Maintenance')) - self.TypeListWidget.item(0).setText(self.trUtf8('Authors')) - self.TypeListWidget.item(1).setText(self.trUtf8('Topics')) - self.TypeListWidget.item(2).setText(self.trUtf8('Books/Hymnals')) - self.AuthorAddButton.setText(self.trUtf8('Add')) - self.AuthorEditButton.setText(self.trUtf8('Edit')) - self.AuthorDeleteButton.setText(self.trUtf8('Delete')) - self.TopicAddButton.setText(self.trUtf8('Add')) - self.TopicEditButton.setText(self.trUtf8('Edit')) - self.TopicDeleteButton.setText(self.trUtf8('Delete')) - self.BookAddButton.setText(self.trUtf8('Add')) - self.BookEditButton.setText(self.trUtf8('Edit')) - self.BookDeleteButton.setText(self.trUtf8('Delete')) + def retranslateUi(self, SongMaintenanceForm): + SongMaintenanceForm.setWindowTitle(translate('SongMaintenanceForm', 'Song Maintenance')) + self.TypeListWidget.item(0).setText(translate('SongMaintenanceForm', 'Authors')) + self.TypeListWidget.item(1).setText(translate('SongMaintenanceForm', 'Topics')) + self.TypeListWidget.item(2).setText(translate('SongMaintenanceForm', 'Books/Hymnals')) + self.AuthorAddButton.setText(translate('SongMaintenanceForm', 'Add')) + self.AuthorEditButton.setText(translate('SongMaintenanceForm', 'Edit')) + self.AuthorDeleteButton.setText(translate('SongMaintenanceForm', 'Delete')) + self.TopicAddButton.setText(translate('SongMaintenanceForm', 'Add')) + self.TopicEditButton.setText(translate('SongMaintenanceForm', 'Edit')) + self.TopicDeleteButton.setText(translate('SongMaintenanceForm', 'Delete')) + self.BookAddButton.setText(translate('SongMaintenanceForm', 'Add')) + self.BookEditButton.setText(translate('SongMaintenanceForm', 'Edit')) + self.BookDeleteButton.setText(translate('SongMaintenanceForm', 'Delete')) diff --git a/openlp/plugins/songs/forms/topicsdialog.py b/openlp/plugins/songs/forms/topicsdialog.py index 122af0455..559c24e12 100644 --- a/openlp/plugins/songs/forms/topicsdialog.py +++ b/openlp/plugins/songs/forms/topicsdialog.py @@ -24,26 +24,27 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_TopicsDialog(object): - def setupUi(self, TopicsDialog): - TopicsDialog.setObjectName(u'TopicsDialog') - TopicsDialog.resize(365, 77) - self.TopicLayout = QtGui.QFormLayout(TopicsDialog) + def setupUi(self, TopicsForm): + TopicsForm.setObjectName(u'TopicsDialog') + TopicsForm.resize(365, 77) + self.TopicLayout = QtGui.QFormLayout(TopicsForm) self.TopicLayout.setFieldGrowthPolicy( QtGui.QFormLayout.ExpandingFieldsGrow) self.TopicLayout.setMargin(8) self.TopicLayout.setSpacing(8) self.TopicLayout.setObjectName(u'TopicLayout') - self.NameLabel = QtGui.QLabel(TopicsDialog) + self.NameLabel = QtGui.QLabel(TopicsForm) self.NameLabel.setObjectName(u'NameLabel') self.TopicLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.NameLabel) - self.NameEdit = QtGui.QLineEdit(TopicsDialog) + self.NameEdit = QtGui.QLineEdit(TopicsForm) self.NameEdit.setObjectName(u'NameEdit') self.TopicLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.NameEdit) - self.TopicButtonBox = QtGui.QDialogButtonBox(TopicsDialog) + self.TopicButtonBox = QtGui.QDialogButtonBox(TopicsForm) self.TopicButtonBox.setOrientation(QtCore.Qt.Horizontal) self.TopicButtonBox.setStandardButtons( QtGui.QDialogButtonBox.Save | QtGui.QDialogButtonBox.Cancel) @@ -51,13 +52,13 @@ class Ui_TopicsDialog(object): self.TopicLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.TopicButtonBox) - self.retranslateUi(TopicsDialog) + self.retranslateUi(TopicsForm) QtCore.QObject.connect(self.TopicButtonBox, - QtCore.SIGNAL(u'accepted()'), TopicsDialog.accept) + QtCore.SIGNAL(u'accepted()'), TopicsForm.accept) QtCore.QObject.connect(self.TopicButtonBox, - QtCore.SIGNAL(u'rejected()'), TopicsDialog.reject) - QtCore.QMetaObject.connectSlotsByName(TopicsDialog) + QtCore.SIGNAL(u'rejected()'), TopicsForm.reject) + QtCore.QMetaObject.connectSlotsByName(TopicsForm) - def retranslateUi(self, TopicsDialog): - TopicsDialog.setWindowTitle(self.trUtf8('Topic Maintenance')) - self.NameLabel.setText(self.trUtf8('Topic name:')) + def retranslateUi(self, TopicsForm): + TopicsForm.setWindowTitle(translate('TopicsForm', 'Topic Maintenance')) + self.NameLabel.setText(translate('TopicsForm', 'Topic name:')) diff --git a/openlp/plugins/songusage/forms/songusagedeletedialog.py b/openlp/plugins/songusage/forms/songusagedeletedialog.py index 2cb19f4f5..dc02965f5 100644 --- a/openlp/plugins/songusage/forms/songusagedeletedialog.py +++ b/openlp/plugins/songusage/forms/songusagedeletedialog.py @@ -24,6 +24,7 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_SongUsageDeleteDialog(object): def setupUi(self, AuditDeleteDialog): @@ -57,4 +58,4 @@ class Ui_SongUsageDeleteDialog(object): QtCore.QMetaObject.connectSlotsByName(AuditDeleteDialog) def retranslateUi(self, AuditDeleteDialog): - AuditDeleteDialog.setWindowTitle(self.trUtf8('Song Usage Delete')) + AuditDeleteDialog.setWindowTitle(translate('AuditDeleteDialog', 'Song Usage Delete')) diff --git a/openlp/plugins/songusage/forms/songusagedetaildialog.py b/openlp/plugins/songusage/forms/songusagedetaildialog.py index 13b4fe18d..9512a4278 100644 --- a/openlp/plugins/songusage/forms/songusagedetaildialog.py +++ b/openlp/plugins/songusage/forms/songusagedetaildialog.py @@ -24,6 +24,7 @@ ############################################################################### from PyQt4 import QtCore, QtGui +from openlp.core.lib import translate class Ui_SongUsageDetailDialog(object): def setupUi(self, AuditDetailDialog): @@ -86,7 +87,7 @@ class Ui_SongUsageDetailDialog(object): QtCore.QMetaObject.connectSlotsByName(AuditDetailDialog) def retranslateUi(self, AuditDetailDialog): - AuditDetailDialog.setWindowTitle(self.trUtf8('Song Usage Extraction')) - self.DateRangeGroupBox.setTitle(self.trUtf8('Select Date Range')) - self.ToLabel.setText(self.trUtf8('to')) - self.FileGroupBox.setTitle(self.trUtf8('Report Location')) + AuditDetailDialog.setWindowTitle(translate('AuditDetailDialog', 'Song Usage Extraction')) + self.DateRangeGroupBox.setTitle(translate('AuditDetailDialog', 'Select Date Range')) + self.ToLabel.setText(translate('AuditDetailDialog', 'to')) + self.FileGroupBox.setTitle(translate('AuditDetailDialog', 'Report Location')) diff --git a/resources/i18n/openlp_af.qm b/resources/i18n/openlp_af.qm index 8767c8032d6ac679b8f9c34d063a348aa749f460..865213138759d10464fbcc7675370eb81304577a 100644 GIT binary patch delta 4570 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 + + AuditDeleteDialog + + + Song Usage Delete + + + + + AuditDetailDialog + + + Song Usage Extraction + + + + + Select Date Range + + + + + to + + + + + Report Location + + + AuthorsForm @@ -2345,6 +2376,107 @@ You can download the latest version from http://openlp.org + + OpenSongExportForm + + + Select OpenSong song folder: + + + + + Full Song List + + + + + Song Title + + + + + Author + + + + + Select All + + + + + Lyrics + + + + + Title + + + + + Song Export List + + + + + Remove Selected + + + + + Progress: + + + + + Ready to export + + + + + Export + + + + + Close + + + + + OpenSongImportForm + + + OpenSong Song Importer + + + + + OpenSong Folder: + + + + + Progress: + + + + + Ready to import + + + + + Import + + + + + Close + + + PluginForm @@ -2750,6 +2882,21 @@ You can download the latest version from http://openlp.org You need to type in a book name! + + + Edit Book + + + + + Name: + + + + + Publisher: + + SongMaintenanceForm @@ -2848,6 +2995,41 @@ You can download the latest version from http://openlp.org Are you sure you want to delete the selected topic? + + + Song Maintenance + + + + + Authors + + + + + Topics + + + + + Books/Hymnals + + + + + Add + + + + + Edit + + + + + Delete + + SongMediaItem @@ -3180,210 +3362,14 @@ You can download the latest version from http://openlp.org Error - - - Ui_OpenSongExportDialog - - - Close - - - - - Lyrics - - - - - Song Title - - - - - Select All - - - - - Song Export List - - - - - Author - - - - - Title - - - - - OpenSong Song Exporter - - - - - Remove Selected - - - - - Progress: - - - - - Select OpenSong song folder: - - - - - Ready to export - - - - - Export - - - - - Full Song List - - - - - Ui_OpenSongImportDialog - - - OpenSong Folder: - - - - - Import - - - - - Close - - - - - Progress: - - - - - OpenSong Song Importer - - - - - Ready to import - - - - - Ui_SongBookDialog - - - Name: - - - - - Edit Book - - - - - Publisher: - - - - - Ui_SongMaintenanceDialog - - - Edit - - - - - Topics - - - - - Add - - - - - Authors - - - - - Delete - - - - - Song Maintenance - - - - - Books/Hymnals - - - - - Ui_SongUsageDeleteDialog - - - Song Usage Delete - - - - - Ui_SongUsageDetailDialog - - - Report Location - - - - - Song Usage Extraction - - - - - Select Date Range - - - - - to - - - - - Ui_TopicsDialog - Topic name: + Topic Maintenance - - Topic Maintenance + + Topic name: diff --git a/resources/i18n/openlp_en_GB.qm b/resources/i18n/openlp_en_GB.qm index 0103ea3084350b6cb1b12f4eadeb91d270dd7c6e..6ccb8a4acb97482c9c6ab297c65dd5ace95453a1 100644 GIT binary patch delta 4268 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 delta 4389 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 diff --git a/resources/i18n/openlp_en_ZA.qm b/resources/i18n/openlp_en_ZA.qm index f21e060ce3fd92fc6cc8265a7410c2eea7c91200..58ee3e02cfc5dbcbb211fa5aa464ff1af936163f 100644 GIT binary patch delta 3148 zcmZA22Urwm8VB%qc4u~GXJ>b%2uKsKfLO4gAVfr(6{RR37zGt^Q4kf&spp;&8xkQb zc0`T+L`4^)0ZvZE8Wk@wK9(p7XNytstT8C}Uzqdmxp^Mu_r34zeDih6_Axv6G6lBG z)x&M)F~;RI{MZK~ZZnNgxxq5o$24N&L?V@5wy*4X*=4e&vbS308H!{V5b<^txlV*# zDa!9>7%Xd`sHA+viz#|_Hj$AxQS^(BNYqgDyKwl3M(5-b2_nTEJO$fRywzjqO9|>A z7*7e+n_&qhe0&Yfl=xd;c%G6po#35T)q-pvN}BSDNIitcsZg)_OB#1!Eu7V&k<^=L za@|uT4pHt|4|s`I{|O_aenji0)ewm)D*5U@45Yn2s7PE%HOuiKaXVd2D?wWd-Pxq1^z;bGiOoX=?#T655Vw5=-iKPCFb?I+L6ecs)cTu5~!`Ljm z40kdf&ZtnTW5U!sh_u$sgfYHwfb1eB<-%#iyO@k5g6EkmPYkj4BeVGLn}~G2OtDoc zOk>P{T!YJ*b0O{EA*S|9FucKBS8RvP%!Y0Mql3hgBk&2ytyN2l${4SBSgRawso1uka%&dm z+IFn+L=#@LEl^%RzZO<2-?mtDOYMuB8M1w8XDNbn-csByRPy}xSieb0Uvfa&TiCy3v1cp#8a@5-KRp_jyJOV*L*@D z7&gOrc7MJSX0oN-(DQc7WXoi4w(6*6OZVdgj&8Ce*dsO3h$pc%WrJY>TRRsWaNHw% zjlDnPUx=TwPhv4LP7?d->Nn8n!@iBj>U2uxSj!7eYh_Py(sT68=_aS$jgfICE+{7p z`fvmHcY;w|aQ+UMCR-$XQnryB)oB5d3(t*tiz#vO;^It;;0kV>KSsc%gqyPRDE7b0 zQ7&!DRwOR9>T1sw`C*^C#&DZgZh)I*&vL~9b%^h9B@5Gt+K=E4o<;-PPm)~&F$L{+ zab-s=`6}5*(31beRamDJxwYj^4t@{AxXTVB$w+RgTwO&45*xV3TRy-;vh}UHx0M~H zQrKeKxTmSCr=ueG0+sEcLRhDA{D?*6p-}bD^@d$k3A4~+k726u(S4yoH6`U3T&bEG zh7;Cfk80*L%kQqL777j6{~j+?e=Vsb>L994Z})_rvI(+Zseb6$7Wu8JhDL194##<} zVJv*XcMxt9b#&$f526Dd)A%87c`%PpCmtSZt@o`F;NhI)%z1clWDctv2%Ciqm~j5yb+i=DvPw}AtN z?qUa+EchhgLtT~#{oI`3cY>eaF!(|U&&wwAb`UarFTo69w)+uyNvPCcBnU|0<2 zir*ArBzk@?ZY&Rnzlgibb+B37TZM-7nl2s|Fh#wViN|031D1tz_(&R-v zfUh+>R-os7wVEBj;3VwZPj;H@HqFt7TI8!W51BLA|NVMv9><|a{o*yxv^!w2=GD;I zM1Gv+?MR%6e!iMduJ%O!?PTL5b@^+=MyZWI7OVd@$^Fk*Z2otokv(q^^Ll&ga9%#h&3G&od_sM{xwO2C2V7~VDc#BoqXMU(C z=%w}#|2;$l9d*4T*1`bI`y+({+`~ zMKE7iU59!GmFv!rH}*o|vhJo+1N@}BbpeYhBvg0zZaPfYQ&E79#-+htT#@6y~WQrj(J2f*Ub5g45iJz;vkH51+7i(Hi3_d834tL9CM=q@e+&kjW zyCv#lvWm7b2Fg!DWJggvO+-AQZ7pP|M`Cxc5=&A+HyZa-^(#k_2*J+ z;k+DQg*WI|+#88ZHqrJbw`i5sJ0gZ*aE3!H8O9E+v-M_Nna+$)OL7pBSjKDTe7`hLq_u(oEmReqnka8)Zry9rtgLKt8wt delta 3283 zcmZ|R2UHYy9tZH>?9S}W&d%;i6QoJepwete6_jR)D8+(GP=YIhQWUJH8;^SyBw}1_ zNNhw8YgF*`gwrT+5et@6&#sY}rv^)`vEO&u@m}7&mwj*e{Qv)%{msAp{(ttnDrV0% zX1OhMd9U3}#<-L|Kk$Z#+ekxHZg9WsLmIO7OCpu6Y=~^SY_aTK*;^KQ6~(c0hnPS{Mb^|izs1f0g;hkLkW*Np`nQqUd6yx8eUXPB6T6cysCzoe9=m2hU8 zMpAE}3AcVlLk$)G%LAUHrL!?3>Q-7cxq(R3(E7jr1p85yKLUwgQ^P{MNZd+iGu9Jn z-04DOK8&UtdOw&+H<#UkWpsP|UHA|B7&ivqW)#gPB8g#?MJHf5W4*K0h(ab~eG>tt z#f(kiX}FE?a7IAsXC_)*Nu;%B#*OF=BV`vbX-)O0Z)dW{5Q)syVQ2 zs50Mu1x!_L$itf3u2dd=hXA&xl$VaLgm0BE&DyytUky%z{gtmv&GiYa@FoNvVcT`< z2`{r9D=!kY_h&sK6X92^v6E*t3bpL`5cIVDbJj4!KxBV_owEl$w!h34<(9$6a5a&G ziY@sbyTZXmcChSBwsb`?+Lyt4xP@JDMS^wgs@gB$4R*~Nyx8G6yH>xMsDp;B7;_Bz z7};$qb3+unW7!8d7k-2$c1NiaZfAG;UQpKUuh+*lszl^-lB^aH>~pr37IHj4l_siHrB6p_R*+xPi!3DLa%a3&ehRUBazfyat|^ea}^d+#>2|%dIcW zfJNNydUUX3xojiE5_G)I?b&B;e`e9m6{6iOfIDQJ1&44)2mDS(ax3IcI}Alb1$XPv zA$W$n_w5__i$(VivO{DSsuZ@^KJJw&>nRB2eoAHAAIa(Aq;hN?s6& z`I)arz#M-50%HyerTk)(BhhE6e97sVu$nJ9gKYn-S@tczJm@}=mo2|yrw#PwH(bM1 zdd=ZC4a$U#{Lx1U=+(+MaBGRW==t+wUclb`tcD|*5T!9N)<>iSQikDC*GDg*`&ChF!b#FP}k;X-!rQ*fJ* z@4k=7TM%mXCt!q7yA1KX$H=Z08nW;n@5920m;Z+UvFM`^jBO1*erj$Uj!2&Y>hZe_ zFiUoW>;-k^60E7uGj&0slE}BcdS=!;*jHVA03Gs8QGct#$b4tZZddPG9)kKw^{(o2 z_(Xkh$pa!kdv(((5q4L%)NO%-jAAdAMWI{_PhJOW#rWzu@Vc0uhNSd+4^xT!9mGko zYS>GhYKt@6e~4JP9|8R5iOVzR!=2(cWtfTXkHxh$F+@GA#jQ0u7$8>Fp(8yui+cqu zQIA^j;Nx@ffml~EoT#T!DK;e`YkNA2C#%g45YNo0fq5FG8>X!15)Io{uhOvFDo{VF zQAL}5Zn2lACT9f>u3q69V+-t^p(%;IOBB#eQ@IEu4~WuKUdKroFhzEg>?O_qmNVG@ z0WUPaFpWfgCTZ@C#EANQt$C=egy%KS2IUh4hH738#fcc0rTO4$PZTsvwnS3bJV$-M z)Gi3g8gxl=pNC`%wvmQ*zYOc71Oah_FIo%{q{K`GXv8<>tIh&ZcT zRCR)=U!bmd%_Eqo+x-r?)Ng@q-*j}a|7KmSaxQGt9l2#hp#BeZ$5VR{MJjbyoLXRS z-PI-}Q{-&j&6`whf6{ix;o zy9EXCfc~BWFOIsPe-ekJi+Zhp^7m$CC$>1CuMr4i~mS@OG%FW4$ znU$A2tspuxZAxy2$;zsIwbAN?&Q#aO+4NQ?2?mB$o^@lYG2=S@&CSXH89Yj>v&pC47wta4uA0*fIO*ZTgm(<7*|AFZJ_B~yp4BC zTbU?bHjide5z0%btgQvdU)!gWcHnutzWd~QeVa{mR<2*77P<6^R=I$jrgscS#Apz~ z!E`$wKV2DX#=(4_am9uI4WB-Y|Nly1Of(Z`t})|q<>10m{>KmV7ql&5N=-otefpSZ z+&p^Hsnm#xwq}*xw=87pYDXhb%j>V;A<`fum(sI%b X^1J6HC0JX@-Hy!7oh&yuCyo3sBJOkj diff --git a/resources/i18n/openlp_es.qm b/resources/i18n/openlp_es.qm index 689a2243014ed1a03ea83132032d5cec91c699a2..f128095b841b2e9f42ae36617e70d4149e64142b 100644 GIT binary patch delta 1743 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 R%ClspWG%JG>FqLa{~OH>-KhWo diff --git a/resources/i18n/openlp_hu.qm b/resources/i18n/openlp_hu.qm index 2dfc0bf7f0e9d70365149824c4fcf7b065af13d0..9f67c7dbcc4680779e644b89fb0b7e72222f6f77 100644 GIT binary patch delta 4337 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 delta 4463 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 delta 2928 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 HH$LURu-*w^ diff --git a/resources/i18n/openlp_pt_BR.qm b/resources/i18n/openlp_pt_BR.qm index 64d9f6364690cdae8f457e0881166c55fb895666..a0d2b109b9b141278e694931a23e471cb63c2a6f 100644 GIT binary patch delta 4427 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 delta 4475 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 diff --git a/resources/i18n/openlp_sv.qm b/resources/i18n/openlp_sv.qm index ba50bcea7768842e36d8a5ef0d1dda05f88e9c1a..bd6daac494b692fb34d91356e57eaacd7e5abf15 100644 GIT binary patch delta 4825 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 LRF{TVF3tKEF#a7# delta 4902 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 Date: Sat, 1 May 2010 00:07:51 +0200 Subject: [PATCH 18/81] resolve merge proposal comments --- openlp/core/lib/toolbar.py | 1 + openlp/core/ui/aboutdialog.py | 3 +- resources/i18n/openlp_en.ts | 6 +- scripts/translation_utils.py | 344 +++++++++++++++++----------------- 4 files changed, 177 insertions(+), 177 deletions(-) diff --git a/openlp/core/lib/toolbar.py b/openlp/core/lib/toolbar.py index 7b5d86d54..824199469 100644 --- a/openlp/core/lib/toolbar.py +++ b/openlp/core/lib/toolbar.py @@ -124,6 +124,7 @@ class OpenLPToolbar(QtGui.QToolBar): log.error(u'getIconFromTitle - no icon for %s' % title) return QtGui.QIcon() except: + log.exception(u'getIconFromTitle - title %s not found' % title) return QtGui.QIcon() def makeWidgetsInvisible(self, widgets): diff --git a/openlp/core/ui/aboutdialog.py b/openlp/core/ui/aboutdialog.py index b3a7ffcbe..8c351b17c 100644 --- a/openlp/core/ui/aboutdialog.py +++ b/openlp/core/ui/aboutdialog.py @@ -167,8 +167,7 @@ class Ui_AboutDialog(object): self.AboutNotebook.indexOf(self.CreditsTab), translate('AboutForm', 'Credits')) self.LicenseTextEdit.setPlainText(translate('AboutForm', - 'Copyright \xa9 2004-2010 Raoul ' - 'Snyman\n' + 'Copyright \xa9 2004-2010 Raoul Snyman\n' 'Portions copyright \xa9 2004-2010 ' 'Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, ' 'Christian Richter, Maikel Stuivenberg, Martin Thompson, Jon ' diff --git a/resources/i18n/openlp_en.ts b/resources/i18n/openlp_en.ts index c27f8bd5a..5f84b2125 100644 --- a/resources/i18n/openlp_en.ts +++ b/resources/i18n/openlp_en.ts @@ -202,17 +202,17 @@ This General Public License does not permit incorporating your program into prop - + License - + Contribute - + Close diff --git a/scripts/translation_utils.py b/scripts/translation_utils.py index bfb443d1b..7a76a5566 100755 --- a/scripts/translation_utils.py +++ b/scripts/translation_utils.py @@ -1,172 +1,172 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # -# Thompson, Jon Tibble, Carsten Tinggaard # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See 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 # -############################################################################### -# Short description -# Steps for creating languages: -# 1. make shure that the openlp_en.ts file exist -# 2. go to scripts folder and start: -# python translation_utils.py -a -############################################################################### - -import os -from optparse import OptionParser -import urllib -from PyQt4 import QtCore - -ignore_pathes = ["./scripts", "./openlp/core/test"] -ignore_files = ["setup.py"] -translation_path = "http://pootle.projecthq.biz/export/openlp/" -translations = [ "af" - , "en_ZA" - , "en_GB" - , "de" - , "hu" - , "ko" - , "nb" - , "pt_BR" - , "es" - , "sv"] - - - -def write_file(filename, stringlist): - content = u'' - for line in stringlist: - content = u'%s%s\n' % (content, line) - file = open(filename, u'w') - file.write(content.encode('utf8')) - file.close() - -def main(): - # Set up command line options. - usage = u'Usage: %prog [options]' - parser = OptionParser(usage=usage) - parser.add_option("-d", "--download-ts", action="store_true", dest="download", - help="Load languages from Pootle Server") - parser.add_option("-p", "--prepare", action="store_true", dest="prepare", - help="preparation (generate pro file)") - parser.add_option("-u", "--update", action="store_true", dest="update", - help="update translation files") - parser.add_option("-g", "--generate", action="store_true", dest="generate", - help="generate qm files") - parser.add_option("-a", "--all", action="store_true", dest="all", - help="proceed all options") - - (options, args) = parser.parse_args() - qt_args = [] - if options.download: - downloadTranslations() - elif options.prepare: - preparation() - elif options.update: - update() - elif options.generate: - generate() - elif options.all: - all() - else: - pass - -def downloadTranslations(): - print "download()" - for language in translations: - filename = os.path.join('..','resources', 'i18n', "openlp_%s.ts" % language) - print filename - page = urllib.urlopen("%s%s.ts" % (translation_path, language)) - content = page.read().decode("utf8") - page.close() - file = open(filename, u'w') - file.write(content.encode('utf8')) - file.close() - -def preparation(): - stringlist = [] - start_dir = os.path.join(u'..') - for root, dirs, files in os.walk(start_dir): - for file in files: - path = "%s" % root - path = path.replace("\\","/") - path = path.replace("..",".") - - if file.startswith(u'hook-') or file.startswith(u'test_'): - continue - - cond = False - for search in ignore_pathes: - if path.startswith(search): - cond = True - if cond == True: - continue - cond = False - for search in ignore_files: - if search == file: - cond = True - if cond == True: - continue - - if file.endswith(u'.py'): - line = "%s/%s" % (path, file) - print u'Parsing "%s"' % line - stringlist.append("SOURCES += %s" % line) - elif file.endswith(u'.pyw'): - line = "%s/%s" % (path, file) - print u'Parsing "%s"' % line - stringlist.append("SOURCES += %s" % line) - elif file.endswith(u'.ts'): - line = "%s/%s" % (path, file) - print u'Parsing "%s"' % line - stringlist.append("TRANSLATIONS += %s" % line) - - print u'Generating PRO file...', - stringlist.sort() - write_file(os.path.join(start_dir, u'openlp.pro'), stringlist) - print u'done.' - - -def update(): - print "update()" - updateProcess = QtCore.QProcess() - updateProcess.start("pylupdate4 -noobsolete ../openlp.pro") - updateProcess.waitForFinished(60000) - -def generate(): - print "generate()" - generateProcess = QtCore.QProcess() - generateProcess.start("lrelease ../openlp.pro") - generateProcess.waitForFinished(60000) - -def all(): - print "all()" - downloadTranslations() - preparation() - update() - generate() - - -if __name__ == u'__main__': - if os.path.split(os.path.abspath(u'.'))[1] != u'scripts': - print u'You need to run this script from the scripts directory.' - else: - main() +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # +# Thompson, Jon Tibble, Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See 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 # +############################################################################### +# Short description +# Steps for creating languages: +# 1. make shure that the openlp_en.ts file exist +# 2. go to scripts folder and start: +# python translation_utils.py -a +############################################################################### + +import os +from optparse import OptionParser +import urllib +from PyQt4 import QtCore + +ignore_pathes = [u"./scripts", u"./openlp/core/test"] +ignore_files = [u"setup.py"] +translation_path = u"http://pootle.projecthq.biz/export/openlp/" +translations = [ u"af" + , u"en_ZA" + , u"en_GB" + , u"de" + , u"hu" + , u"ko" + , u"nb" + , u"pt_BR" + , u"es" + , u"sv"] + + + +def write_file(filename, stringlist): + content = u'' + for line in stringlist: + content = u'%s%s\n' % (content, line) + file = open(filename, u'w') + file.write(content.encode('utf8')) + file.close() + +def main(): + # Set up command line options. + usage = u'Usage: %prog [options]' + parser = OptionParser(usage=usage) + parser.add_option("-d", "--download-ts", action="store_true", dest="download", + help="Load languages from Pootle Server") + parser.add_option("-p", "--prepare", action="store_true", dest="prepare", + help="preparation (generate pro file)") + parser.add_option("-u", "--update", action="store_true", dest="update", + help="update translation files") + parser.add_option("-g", "--generate", action="store_true", dest="generate", + help="generate qm files") + parser.add_option("-a", "--all", action="store_true", dest="all", + help="proceed all options") + + (options, args) = parser.parse_args() + qt_args = [] + if options.download: + downloadTranslations() + elif options.prepare: + preparation() + elif options.update: + update() + elif options.generate: + generate() + elif options.all: + all() + else: + pass + +def downloadTranslations(): + print "download()" + for language in translations: + filename = os.path.join(u'..',u'resources', u'i18n', u"openlp_%s.ts" % language) + print filename + page = urllib.urlopen(u"%s%s.ts" % (translation_path, language)) + content = page.read().decode("utf8") + page.close() + file = open(filename, u'w') + file.write(content.encode('utf8')) + file.close() + +def preparation(): + stringlist = [] + start_dir = os.path.join(u'..') + for root, dirs, files in os.walk(start_dir): + for file in files: + path = u"%s" % root + path = path.replace("\\","/") + path = path.replace("..",".") + + if file.startswith(u'hook-') or file.startswith(u'test_'): + continue + + cond = False + for search in ignore_pathes: + if path.startswith(search): + cond = True + if cond == True: + continue + cond = False + for search in ignore_files: + if search == file: + cond = True + if cond == True: + continue + + if file.endswith(u'.py'): + line = u"%s/%s" % (path, file) + print u'Parsing "%s"' % line + stringlist.append(u"SOURCES += %s" % line) + elif file.endswith(u'.pyw'): + line = u"%s/%s" % (path, file) + print u'Parsing "%s"' % line + stringlist.append(u"SOURCES += %s" % line) + elif file.endswith(u'.ts'): + line = u"%s/%s" % (path, file) + print u'Parsing "%s"' % line + stringlist.append(u"TRANSLATIONS += %s" % line) + + print u'Generating PRO file...', + stringlist.sort() + write_file(os.path.join(start_dir, u'openlp.pro'), stringlist) + print u'done.' + + +def update(): + print "update()" + updateProcess = QtCore.QProcess() + updateProcess.start(u"pylupdate4 -noobsolete ../openlp.pro") + updateProcess.waitForFinished(60000) + +def generate(): + print "generate()" + generateProcess = QtCore.QProcess() + generateProcess.start(u"lrelease ../openlp.pro") + generateProcess.waitForFinished(60000) + +def all(): + print "all()" + downloadTranslations() + preparation() + update() + generate() + + +if __name__ == u'__main__': + if os.path.split(os.path.abspath(u'.'))[1] != u'scripts': + print u'You need to run this script from the scripts directory.' + else: + main() From 4e296bfb5f0232d312c08333b2419f1aab563ca2 Mon Sep 17 00:00:00 2001 From: rimach Date: Sat, 1 May 2010 21:45:06 +0200 Subject: [PATCH 19/81] changes --- openlp/core/ui/aboutdialog.py | 38 +++---- openlp/core/ui/amendthemedialog.py | 102 +++++++++--------- openlp/core/ui/plugindialog.py | 26 ++--- openlp/core/ui/serviceitemeditdialog.py | 16 +-- openlp/core/ui/servicenotedialog.py | 16 +-- openlp/core/ui/settingsdialog.py | 24 ++--- openlp/plugins/alerts/forms/alertdialog.py | 70 ++++++------ .../plugins/bibles/forms/bibleimportwizard.py | 28 ++--- .../plugins/custom/forms/editcustomdialog.py | 66 ++++++------ openlp/plugins/songs/forms/authorsdialog.py | 34 +++--- openlp/plugins/songs/forms/editsongdialog.py | 78 +++++++------- openlp/plugins/songs/forms/editversedialog.py | 22 ++-- .../plugins/songs/forms/openlpexportdialog.py | 28 ++--- .../plugins/songs/forms/openlpimportdialog.py | 28 ++--- .../songs/forms/opensongexportdialog.py | 28 ++--- .../songs/forms/opensongimportdialog.py | 26 ++--- openlp/plugins/songs/forms/songbookdialog.py | 30 +++--- .../songs/forms/songmaintenancedialog.py | 24 ++--- openlp/plugins/songs/forms/topicsdialog.py | 26 ++--- .../songusage/forms/songusagedeletedialog.py | 22 ++-- .../songusage/forms/songusagedetaildialog.py | 26 ++--- 21 files changed, 379 insertions(+), 379 deletions(-) diff --git a/openlp/core/ui/aboutdialog.py b/openlp/core/ui/aboutdialog.py index 8c351b17c..fac8874f5 100644 --- a/openlp/core/ui/aboutdialog.py +++ b/openlp/core/ui/aboutdialog.py @@ -27,25 +27,25 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_AboutDialog(object): - def setupUi(self, AboutForm): - AboutForm.setObjectName(u'AboutDialog') - AboutForm.resize(516, 481) + def setupUi(self, AboutDialog): + AboutDialog.setObjectName(u'AboutDialog') + AboutDialog.resize(516, 481) LogoIcon = QtGui.QIcon() LogoIcon.addPixmap(QtGui.QPixmap(u':/icon/openlp-logo-16x16.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - AboutForm.setWindowIcon(LogoIcon) - self.AboutFormLayout = QtGui.QVBoxLayout(AboutForm) - self.AboutFormLayout.setSpacing(8) - self.AboutFormLayout.setMargin(8) - self.AboutFormLayout.setObjectName(u'AboutFormLayout') - self.LogoLabel = QtGui.QLabel(AboutForm) + AboutDialog.setWindowIcon(LogoIcon) + self.AboutDialogLayout = QtGui.QVBoxLayout(AboutDialog) + self.AboutDialogLayout.setSpacing(8) + self.AboutDialogLayout.setMargin(8) + self.AboutDialogLayout.setObjectName(u'AboutDialogLayout') + self.LogoLabel = QtGui.QLabel(AboutDialog) self.LogoLabel.setPixmap( QtGui.QPixmap(u':/graphics/openlp-about-logo.png')) self.LogoLabel.setScaledContents(False) self.LogoLabel.setIndent(0) self.LogoLabel.setObjectName(u'LogoLabel') - self.AboutFormLayout.addWidget(self.LogoLabel) - self.AboutNotebook = QtGui.QTabWidget(AboutForm) + self.AboutDialogLayout.addWidget(self.LogoLabel) + self.AboutNotebook = QtGui.QTabWidget(AboutDialog) self.AboutNotebook.setObjectName(u'AboutNotebook') self.AboutTab = QtGui.QWidget() self.AboutTab.setObjectName(u'AboutTab') @@ -80,8 +80,8 @@ class Ui_AboutDialog(object): self.LicenseTextEdit.setObjectName(u'LicenseTextEdit') self.LicenseTabLayout.addWidget(self.LicenseTextEdit) self.AboutNotebook.addTab(self.LicenseTab, '') - self.AboutFormLayout.addWidget(self.AboutNotebook) - self.ButtonWidget = QtGui.QWidget(AboutForm) + self.AboutDialogLayout.addWidget(self.AboutNotebook) + self.ButtonWidget = QtGui.QWidget(AboutDialog) self.ButtonWidget.setObjectName(u'ButtonWidget') self.ButtonWidgetLayout = QtGui.QHBoxLayout(self.ButtonWidget) self.ButtonWidgetLayout.setSpacing(8) @@ -105,16 +105,16 @@ class Ui_AboutDialog(object): self.CloseButton.setIcon(CloseIcon) self.CloseButton.setObjectName(u'CloseButton') self.ButtonWidgetLayout.addWidget(self.CloseButton) - self.AboutFormLayout.addWidget(self.ButtonWidget) + self.AboutDialogLayout.addWidget(self.ButtonWidget) - self.retranslateUi(AboutForm) + self.retranslateUi(AboutDialog) self.AboutNotebook.setCurrentIndex(0) QtCore.QObject.connect(self.CloseButton, QtCore.SIGNAL(u'clicked()'), - AboutForm.close) - QtCore.QMetaObject.connectSlotsByName(AboutForm) + AboutDialog.close) + QtCore.QMetaObject.connectSlotsByName(AboutDialog) - def retranslateUi(self, AboutForm): - AboutForm.setWindowTitle(translate('AboutForm', 'About OpenLP')) + def retranslateUi(self, AboutDialog): + AboutDialog.setWindowTitle(translate('AboutForm', 'About OpenLP')) self.AboutTextEdit.setPlainText(translate('AboutForm', 'OpenLP - Open Source Lyrics ' 'Projection\n' diff --git a/openlp/core/ui/amendthemedialog.py b/openlp/core/ui/amendthemedialog.py index 00000f23d..34c3573da 100644 --- a/openlp/core/ui/amendthemedialog.py +++ b/openlp/core/ui/amendthemedialog.py @@ -28,18 +28,18 @@ from openlp.core.lib import build_icon from openlp.core.lib import translate class Ui_AmendThemeDialog(object): - def setupUi(self, AmendThemeForm): - AmendThemeForm.setObjectName(u'AmendThemeDialog') - AmendThemeForm.setWindowModality(QtCore.Qt.ApplicationModal) - AmendThemeForm.resize(586, 651) + def setupUi(self, AmendThemeDialog): + AmendThemeDialog.setObjectName(u'AmendThemeDialog') + AmendThemeDialog.setWindowModality(QtCore.Qt.ApplicationModal) + AmendThemeDialog.resize(586, 651) icon = build_icon(u':/icon/openlp-logo-16x16.png') - AmendThemeForm.setWindowIcon(icon) - AmendThemeForm.setModal(True) - self.AmendThemeLayout = QtGui.QVBoxLayout(AmendThemeForm) + AmendThemeDialog.setWindowIcon(icon) + AmendThemeDialog.setModal(True) + self.AmendThemeLayout = QtGui.QVBoxLayout(AmendThemeDialog) self.AmendThemeLayout.setSpacing(8) self.AmendThemeLayout.setMargin(8) self.AmendThemeLayout.setObjectName(u'AmendThemeLayout') - self.ThemeNameWidget = QtGui.QWidget(AmendThemeForm) + self.ThemeNameWidget = QtGui.QWidget(AmendThemeDialog) self.ThemeNameWidget.setObjectName(u'ThemeNameWidget') self.ThemeNameLayout = QtGui.QHBoxLayout(self.ThemeNameWidget) self.ThemeNameLayout.setSpacing(8) @@ -52,7 +52,7 @@ class Ui_AmendThemeDialog(object): self.ThemeNameEdit.setObjectName(u'ThemeNameEdit') self.ThemeNameLayout.addWidget(self.ThemeNameEdit) self.AmendThemeLayout.addWidget(self.ThemeNameWidget) - self.ContentWidget = QtGui.QWidget(AmendThemeForm) + self.ContentWidget = QtGui.QWidget(AmendThemeDialog) self.ContentWidget.setObjectName(u'ContentWidget') self.ContentLayout = QtGui.QHBoxLayout(self.ContentWidget) self.ContentLayout.setSpacing(8) @@ -532,7 +532,7 @@ class Ui_AmendThemeDialog(object): self.ThemeTabWidget.addTab(self.OtherOptionsTab, u'') self.ContentLayout.addWidget(self.ThemeTabWidget) self.AmendThemeLayout.addWidget(self.ContentWidget) - self.PreviewGroupBox = QtGui.QGroupBox(AmendThemeForm) + self.PreviewGroupBox = QtGui.QGroupBox(AmendThemeDialog) self.PreviewGroupBox.setObjectName(u'PreviewGroupBox') self.ThemePreviewLayout = QtGui.QHBoxLayout(self.PreviewGroupBox) self.ThemePreviewLayout.setSpacing(8) @@ -556,53 +556,53 @@ class Ui_AmendThemeDialog(object): spacerItem8 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) self.ThemePreviewLayout.addItem(spacerItem8) self.AmendThemeLayout.addWidget(self.PreviewGroupBox) - self.ThemeButtonBox = QtGui.QDialogButtonBox(AmendThemeForm) + self.ThemeButtonBox = QtGui.QDialogButtonBox(AmendThemeDialog) self.ThemeButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.ThemeButtonBox.setObjectName(u'ThemeButtonBox') self.AmendThemeLayout.addWidget(self.ThemeButtonBox) - self.retranslateUi(AmendThemeForm) + self.retranslateUi(AmendThemeDialog) self.ThemeTabWidget.setCurrentIndex(0) - QtCore.QObject.connect(self.ThemeButtonBox, QtCore.SIGNAL(u'accepted()'), AmendThemeForm.accept) - QtCore.QObject.connect(self.ThemeButtonBox, QtCore.SIGNAL(u'rejected()'), AmendThemeForm.reject) - QtCore.QMetaObject.connectSlotsByName(AmendThemeForm) - AmendThemeForm.setTabOrder(self.ThemeButtonBox, self.ThemeNameEdit) - AmendThemeForm.setTabOrder(self.ThemeNameEdit, self.ThemeTabWidget) - AmendThemeForm.setTabOrder(self.ThemeTabWidget, self.BackgroundComboBox) - AmendThemeForm.setTabOrder(self.BackgroundComboBox, self.BackgroundTypeComboBox) - AmendThemeForm.setTabOrder(self.BackgroundTypeComboBox, self.Color1PushButton) - AmendThemeForm.setTabOrder(self.Color1PushButton, self.Color2PushButton) - AmendThemeForm.setTabOrder(self.Color2PushButton, self.ImageLineEdit) - AmendThemeForm.setTabOrder(self.ImageLineEdit, self.ImageToolButton) - AmendThemeForm.setTabOrder(self.ImageToolButton, self.GradientComboBox) - AmendThemeForm.setTabOrder(self.GradientComboBox, self.FontMainComboBox) - AmendThemeForm.setTabOrder(self.FontMainComboBox, self.FontMainColorPushButton) - AmendThemeForm.setTabOrder(self.FontMainColorPushButton, self.FontMainSizeSpinBox) - AmendThemeForm.setTabOrder(self.FontMainSizeSpinBox, self.FontMainWeightComboBox) - AmendThemeForm.setTabOrder(self.FontMainWeightComboBox, self.FontMainLineSpacingSpinBox) - AmendThemeForm.setTabOrder(self.FontMainLineSpacingSpinBox, self.FontMainDefaultCheckBox) - AmendThemeForm.setTabOrder(self.FontMainDefaultCheckBox, self.FontMainXSpinBox) - AmendThemeForm.setTabOrder(self.FontMainXSpinBox, self.FontMainYSpinBox) - AmendThemeForm.setTabOrder(self.FontMainYSpinBox, self.FontMainWidthSpinBox) - AmendThemeForm.setTabOrder(self.FontMainWidthSpinBox, self.FontMainHeightSpinBox) - AmendThemeForm.setTabOrder(self.FontMainHeightSpinBox, self.FontFooterComboBox) - AmendThemeForm.setTabOrder(self.FontFooterComboBox, self.FontFooterColorPushButton) - AmendThemeForm.setTabOrder(self.FontFooterColorPushButton, self.FontFooterSizeSpinBox) - AmendThemeForm.setTabOrder(self.FontFooterSizeSpinBox, self.FontFooterWeightComboBox) - AmendThemeForm.setTabOrder(self.FontFooterWeightComboBox, self.FontFooterDefaultCheckBox) - AmendThemeForm.setTabOrder(self.FontFooterDefaultCheckBox, self.FontFooterXSpinBox) - AmendThemeForm.setTabOrder(self.FontFooterXSpinBox, self.FontFooterYSpinBox) - AmendThemeForm.setTabOrder(self.FontFooterYSpinBox, self.FontFooterWidthSpinBox) - AmendThemeForm.setTabOrder(self.FontFooterWidthSpinBox, self.FontFooterHeightSpinBox) - AmendThemeForm.setTabOrder(self.FontFooterHeightSpinBox, self.OutlineCheckBox) - AmendThemeForm.setTabOrder(self.OutlineCheckBox, self.OutlineColorPushButton) - AmendThemeForm.setTabOrder(self.OutlineColorPushButton, self.ShadowCheckBox) - AmendThemeForm.setTabOrder(self.ShadowCheckBox, self.ShadowColorPushButton) - AmendThemeForm.setTabOrder(self.ShadowColorPushButton, self.HorizontalComboBox) - AmendThemeForm.setTabOrder(self.HorizontalComboBox, self.VerticalComboBox) + QtCore.QObject.connect(self.ThemeButtonBox, QtCore.SIGNAL(u'accepted()'), AmendThemeDialog.accept) + QtCore.QObject.connect(self.ThemeButtonBox, QtCore.SIGNAL(u'rejected()'), AmendThemeDialog.reject) + QtCore.QMetaObject.connectSlotsByName(AmendThemeDialog) + AmendThemeDialog.setTabOrder(self.ThemeButtonBox, self.ThemeNameEdit) + AmendThemeDialog.setTabOrder(self.ThemeNameEdit, self.ThemeTabWidget) + AmendThemeDialog.setTabOrder(self.ThemeTabWidget, self.BackgroundComboBox) + AmendThemeDialog.setTabOrder(self.BackgroundComboBox, self.BackgroundTypeComboBox) + AmendThemeDialog.setTabOrder(self.BackgroundTypeComboBox, self.Color1PushButton) + AmendThemeDialog.setTabOrder(self.Color1PushButton, self.Color2PushButton) + AmendThemeDialog.setTabOrder(self.Color2PushButton, self.ImageLineEdit) + AmendThemeDialog.setTabOrder(self.ImageLineEdit, self.ImageToolButton) + AmendThemeDialog.setTabOrder(self.ImageToolButton, self.GradientComboBox) + AmendThemeDialog.setTabOrder(self.GradientComboBox, self.FontMainComboBox) + AmendThemeDialog.setTabOrder(self.FontMainComboBox, self.FontMainColorPushButton) + AmendThemeDialog.setTabOrder(self.FontMainColorPushButton, self.FontMainSizeSpinBox) + AmendThemeDialog.setTabOrder(self.FontMainSizeSpinBox, self.FontMainWeightComboBox) + AmendThemeDialog.setTabOrder(self.FontMainWeightComboBox, self.FontMainLineSpacingSpinBox) + AmendThemeDialog.setTabOrder(self.FontMainLineSpacingSpinBox, self.FontMainDefaultCheckBox) + AmendThemeDialog.setTabOrder(self.FontMainDefaultCheckBox, self.FontMainXSpinBox) + AmendThemeDialog.setTabOrder(self.FontMainXSpinBox, self.FontMainYSpinBox) + AmendThemeDialog.setTabOrder(self.FontMainYSpinBox, self.FontMainWidthSpinBox) + AmendThemeDialog.setTabOrder(self.FontMainWidthSpinBox, self.FontMainHeightSpinBox) + AmendThemeDialog.setTabOrder(self.FontMainHeightSpinBox, self.FontFooterComboBox) + AmendThemeDialog.setTabOrder(self.FontFooterComboBox, self.FontFooterColorPushButton) + AmendThemeDialog.setTabOrder(self.FontFooterColorPushButton, self.FontFooterSizeSpinBox) + AmendThemeDialog.setTabOrder(self.FontFooterSizeSpinBox, self.FontFooterWeightComboBox) + AmendThemeDialog.setTabOrder(self.FontFooterWeightComboBox, self.FontFooterDefaultCheckBox) + AmendThemeDialog.setTabOrder(self.FontFooterDefaultCheckBox, self.FontFooterXSpinBox) + AmendThemeDialog.setTabOrder(self.FontFooterXSpinBox, self.FontFooterYSpinBox) + AmendThemeDialog.setTabOrder(self.FontFooterYSpinBox, self.FontFooterWidthSpinBox) + AmendThemeDialog.setTabOrder(self.FontFooterWidthSpinBox, self.FontFooterHeightSpinBox) + AmendThemeDialog.setTabOrder(self.FontFooterHeightSpinBox, self.OutlineCheckBox) + AmendThemeDialog.setTabOrder(self.OutlineCheckBox, self.OutlineColorPushButton) + AmendThemeDialog.setTabOrder(self.OutlineColorPushButton, self.ShadowCheckBox) + AmendThemeDialog.setTabOrder(self.ShadowCheckBox, self.ShadowColorPushButton) + AmendThemeDialog.setTabOrder(self.ShadowColorPushButton, self.HorizontalComboBox) + AmendThemeDialog.setTabOrder(self.HorizontalComboBox, self.VerticalComboBox) - def retranslateUi(self, AmendThemeForm): - AmendThemeForm.setWindowTitle(translate('AmendThemeForm', 'Theme Maintenance')) + def retranslateUi(self, AmendThemeDialog): + AmendThemeDialog.setWindowTitle(translate('AmendThemeForm', 'Theme Maintenance')) self.ThemeNameLabel.setText(translate('AmendThemeForm', 'Theme Name:')) self.BackgroundLabel.setText(translate('AmendThemeForm', 'Background:')) self.BackgroundComboBox.setItemText(0, translate('AmendThemeForm', 'Opaque')) diff --git a/openlp/core/ui/plugindialog.py b/openlp/core/ui/plugindialog.py index 3e94d91b6..e9c205e20 100644 --- a/openlp/core/ui/plugindialog.py +++ b/openlp/core/ui/plugindialog.py @@ -27,18 +27,18 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_PluginViewDialog(object): - def setupUi(self, PluginForm): - PluginForm.setObjectName(u'PluginViewDialog') - PluginForm.setWindowModality(QtCore.Qt.ApplicationModal) - PluginForm.resize(554, 344) - self.PluginLayout = QtGui.QVBoxLayout(PluginForm) + def setupUi(self, PluginViewDialog): + PluginViewDialog.setObjectName(u'PluginViewDialog') + PluginViewDialog.setWindowModality(QtCore.Qt.ApplicationModal) + PluginViewDialog.resize(554, 344) + self.PluginLayout = QtGui.QVBoxLayout(PluginViewDialog) self.PluginLayout.setSpacing(8) self.PluginLayout.setMargin(8) self.PluginLayout.setObjectName(u'PluginLayout') self.ListLayout = QtGui.QHBoxLayout() self.ListLayout.setSpacing(8) self.ListLayout.setObjectName(u'ListLayout') - self.PluginListWidget = QtGui.QListWidget(PluginForm) + self.PluginListWidget = QtGui.QListWidget(PluginViewDialog) sizePolicy = QtGui.QSizePolicy( QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) @@ -49,7 +49,7 @@ class Ui_PluginViewDialog(object): self.PluginListWidget.setMaximumSize(QtCore.QSize(192, 16777215)) self.PluginListWidget.setObjectName(u'PluginListWidget') self.ListLayout.addWidget(self.PluginListWidget) - self.PluginInfoGroupBox = QtGui.QGroupBox(PluginForm) + self.PluginInfoGroupBox = QtGui.QGroupBox(PluginViewDialog) self.PluginInfoGroupBox.setAlignment( QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter) self.PluginInfoGroupBox.setFlat(False) @@ -88,18 +88,18 @@ class Ui_PluginViewDialog(object): 2, QtGui.QFormLayout.FieldRole, self.AboutTextBrowser) self.ListLayout.addWidget(self.PluginInfoGroupBox) self.PluginLayout.addLayout(self.ListLayout) - self.PluginListButtonBox = QtGui.QDialogButtonBox(PluginForm) + self.PluginListButtonBox = QtGui.QDialogButtonBox(PluginViewDialog) self.PluginListButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Ok) self.PluginListButtonBox.setObjectName(u'PluginListButtonBox') self.PluginLayout.addWidget(self.PluginListButtonBox) - self.retranslateUi(PluginForm) + self.retranslateUi(PluginViewDialog) QtCore.QObject.connect(self.PluginListButtonBox, - QtCore.SIGNAL(u'accepted()'), PluginForm.close) - QtCore.QMetaObject.connectSlotsByName(PluginForm) + QtCore.SIGNAL(u'accepted()'), PluginViewDialog.close) + QtCore.QMetaObject.connectSlotsByName(PluginViewDialog) - def retranslateUi(self, PluginForm): - PluginForm.setWindowTitle(translate('PluginForm', 'Plugin List')) + def retranslateUi(self, PluginViewDialog): + PluginViewDialog.setWindowTitle(translate('PluginForm', 'Plugin List')) self.PluginInfoGroupBox.setTitle(translate('PluginForm', 'Plugin Details')) self.VersionLabel.setText(translate('PluginForm', 'Version:')) self.VersionNumberLabel.setText(translate('PluginForm', 'TextLabel')) diff --git a/openlp/core/ui/serviceitemeditdialog.py b/openlp/core/ui/serviceitemeditdialog.py index 47691fcdb..467c2aed8 100644 --- a/openlp/core/ui/serviceitemeditdialog.py +++ b/openlp/core/ui/serviceitemeditdialog.py @@ -27,10 +27,10 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_ServiceItemEditDialog(object): - def setupUi(self, ServiceItemEditForm): - ServiceItemEditForm.setObjectName(u'ServiceItemEditDialog') - ServiceItemEditForm.resize(386, 272) - self.layoutWidget = QtGui.QWidget(ServiceItemEditForm) + def setupUi(self, ServiceItemEditDialog): + ServiceItemEditDialog.setObjectName(u'ServiceItemEditDialog') + ServiceItemEditDialog.resize(386, 272) + self.layoutWidget = QtGui.QWidget(ServiceItemEditDialog) self.layoutWidget.setGeometry(QtCore.QRect(20, 20, 351, 241)) self.layoutWidget.setObjectName(u'layoutWidget') self.outerLayout = QtGui.QVBoxLayout(self.layoutWidget) @@ -63,11 +63,11 @@ class Ui_ServiceItemEditDialog(object): self.buttonBox.setObjectName(u'buttonBox') self.outerLayout.addWidget(self.buttonBox) - self.retranslateUi(ServiceItemEditForm) - QtCore.QMetaObject.connectSlotsByName(ServiceItemEditForm) + self.retranslateUi(ServiceItemEditDialog) + QtCore.QMetaObject.connectSlotsByName(ServiceItemEditDialog) - def retranslateUi(self, ServiceItemEditForm): - ServiceItemEditForm.setWindowTitle(translate('ServiceItemEditForm', 'Service Item Maintenance')) + def retranslateUi(self, ServiceItemEditDialog): + ServiceItemEditDialog.setWindowTitle(translate('ServiceItemEditForm', 'Service Item Maintenance')) self.upButton.setText(translate('ServiceItemEditForm', 'Up')) self.deleteButton.setText(translate('ServiceItemEditForm', 'Delete')) self.downButton.setText(translate('ServiceItemEditForm', 'Down')) diff --git a/openlp/core/ui/servicenotedialog.py b/openlp/core/ui/servicenotedialog.py index c39b29473..b21adce8d 100644 --- a/openlp/core/ui/servicenotedialog.py +++ b/openlp/core/ui/servicenotedialog.py @@ -27,10 +27,10 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_ServiceNoteEdit(object): - def setupUi(self, ServiceNoteForm): - ServiceNoteForm.setObjectName(u'ServiceNoteEdit') - ServiceNoteForm.resize(400, 243) - self.widget = QtGui.QWidget(ServiceNoteForm) + def setupUi(self, ServiceNoteEdit): + ServiceNoteEdit.setObjectName(u'ServiceNoteEdit') + ServiceNoteEdit.resize(400, 243) + self.widget = QtGui.QWidget(ServiceNoteEdit) self.widget.setGeometry(QtCore.QRect(20, 10, 361, 223)) self.widget.setObjectName(u'widget') self.verticalLayout = QtGui.QVBoxLayout(self.widget) @@ -43,8 +43,8 @@ class Ui_ServiceNoteEdit(object): self.buttonBox.setObjectName(u'buttonBox') self.verticalLayout.addWidget(self.buttonBox) - self.retranslateUi(ServiceNoteForm) - QtCore.QMetaObject.connectSlotsByName(ServiceNoteForm) + self.retranslateUi(ServiceNoteEdit) + QtCore.QMetaObject.connectSlotsByName(ServiceNoteEdit) - def retranslateUi(self, ServiceNoteForm): - ServiceNoteForm.setWindowTitle(translate('ServiceNoteForm', 'Service Item Notes')) + def retranslateUi(self, ServiceNoteEdit): + ServiceNoteEdit.setWindowTitle(translate('ServiceNoteForm', 'Service Item Notes')) diff --git a/openlp/core/ui/settingsdialog.py b/openlp/core/ui/settingsdialog.py index fc1ae8ba0..66501e380 100644 --- a/openlp/core/ui/settingsdialog.py +++ b/openlp/core/ui/settingsdialog.py @@ -27,17 +27,17 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_SettingsDialog(object): - def setupUi(self, SettingsForm): - SettingsForm.setObjectName(u'SettingsDialog') - SettingsForm.resize(724, 502) - self.SettingsLayout = QtGui.QVBoxLayout(SettingsForm) + def setupUi(self, SettingsDialog): + SettingsDialog.setObjectName(u'SettingsDialog') + SettingsDialog.resize(724, 502) + self.SettingsLayout = QtGui.QVBoxLayout(SettingsDialog) self.SettingsLayout.setSpacing(8) self.SettingsLayout.setMargin(8) self.SettingsLayout.setObjectName(u'SettingsLayout') - self.SettingsTabWidget = QtGui.QTabWidget(SettingsForm) + self.SettingsTabWidget = QtGui.QTabWidget(SettingsDialog) self.SettingsTabWidget.setObjectName(u'SettingsTabWidget') self.SettingsLayout.addWidget(self.SettingsTabWidget) - self.ButtonsBox = QtGui.QDialogButtonBox(SettingsForm) + self.ButtonsBox = QtGui.QDialogButtonBox(SettingsDialog) sizePolicy = QtGui.QSizePolicy( QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) @@ -51,13 +51,13 @@ class Ui_SettingsDialog(object): QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.ButtonsBox.setObjectName(u'ButtonsBox') self.SettingsLayout.addWidget(self.ButtonsBox) - self.retranslateUi(SettingsForm) + self.retranslateUi(SettingsDialog) self.SettingsTabWidget.setCurrentIndex(0) QtCore.QObject.connect(self.ButtonsBox, - QtCore.SIGNAL(u'accepted()'), SettingsForm.accept) + QtCore.SIGNAL(u'accepted()'), SettingsDialog.accept) QtCore.QObject.connect(self.ButtonsBox, - QtCore.SIGNAL(u'rejected()'), SettingsForm.reject) - QtCore.QMetaObject.connectSlotsByName(SettingsForm) + QtCore.SIGNAL(u'rejected()'), SettingsDialog.reject) + QtCore.QMetaObject.connectSlotsByName(SettingsDialog) - def retranslateUi(self, SettingsForm): - SettingsForm.setWindowTitle(translate('SettingsForm', 'Settings')) + def retranslateUi(self, SettingsDialog): + SettingsDialog.setWindowTitle(translate('SettingsForm', 'Settings')) diff --git a/openlp/plugins/alerts/forms/alertdialog.py b/openlp/plugins/alerts/forms/alertdialog.py index cdb455cd3..2dc117655 100644 --- a/openlp/plugins/alerts/forms/alertdialog.py +++ b/openlp/plugins/alerts/forms/alertdialog.py @@ -27,21 +27,21 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_AlertDialog(object): - def setupUi(self, AlertForm): - AlertForm.setObjectName(u'AlertDialog') - AlertForm.resize(567, 440) + def setupUi(self, AlertDialog): + AlertDialog.setObjectName(u'AlertDialog') + AlertDialog.resize(567, 440) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - AlertForm.setWindowIcon(icon) - self.AlertFormLayout = QtGui.QVBoxLayout(AlertForm) - self.AlertFormLayout.setSpacing(8) - self.AlertFormLayout.setMargin(8) - self.AlertFormLayout.setObjectName(u'AlertFormLayout') + AlertDialog.setWindowIcon(icon) + self.AlertDialogLayout = QtGui.QVBoxLayout(AlertDialog) + self.AlertDialogLayout.setSpacing(8) + self.AlertDialogLayout.setMargin(8) + self.AlertDialogLayout.setObjectName(u'AlertDialogLayout') self.AlertTextLayout = QtGui.QFormLayout() self.AlertTextLayout.setContentsMargins(0, 0, -1, -1) self.AlertTextLayout.setSpacing(8) self.AlertTextLayout.setObjectName(u'AlertTextLayout') - self.AlertEntryLabel = QtGui.QLabel(AlertForm) + self.AlertEntryLabel = QtGui.QLabel(AlertDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -49,41 +49,41 @@ class Ui_AlertDialog(object): self.AlertEntryLabel.setSizePolicy(sizePolicy) self.AlertEntryLabel.setObjectName(u'AlertEntryLabel') self.AlertTextLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.AlertEntryLabel) - self.AlertParameter = QtGui.QLabel(AlertForm) + self.AlertParameter = QtGui.QLabel(AlertDialog) self.AlertParameter.setObjectName(u'AlertParameter') self.AlertTextLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.AlertParameter) - self.ParameterEdit = QtGui.QLineEdit(AlertForm) + self.ParameterEdit = QtGui.QLineEdit(AlertDialog) self.ParameterEdit.setObjectName(u'ParameterEdit') self.AlertTextLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.ParameterEdit) - self.AlertTextEdit = QtGui.QLineEdit(AlertForm) + self.AlertTextEdit = QtGui.QLineEdit(AlertDialog) self.AlertTextEdit.setObjectName(u'AlertTextEdit') self.AlertTextLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.AlertTextEdit) - self.AlertFormLayout.addLayout(self.AlertTextLayout) + self.AlertDialogLayout.addLayout(self.AlertTextLayout) self.ManagementLayout = QtGui.QHBoxLayout() self.ManagementLayout.setSpacing(8) self.ManagementLayout.setContentsMargins(-1, -1, -1, 0) self.ManagementLayout.setObjectName(u'ManagementLayout') - self.AlertListWidget = QtGui.QListWidget(AlertForm) + self.AlertListWidget = QtGui.QListWidget(AlertDialog) self.AlertListWidget.setAlternatingRowColors(True) self.AlertListWidget.setObjectName(u'AlertListWidget') self.ManagementLayout.addWidget(self.AlertListWidget) self.ManageButtonLayout = QtGui.QVBoxLayout() self.ManageButtonLayout.setSpacing(8) self.ManageButtonLayout.setObjectName(u'ManageButtonLayout') - self.NewButton = QtGui.QPushButton(AlertForm) + self.NewButton = QtGui.QPushButton(AlertDialog) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(u':/general/general_new.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.NewButton.setIcon(icon1) self.NewButton.setObjectName(u'NewButton') self.ManageButtonLayout.addWidget(self.NewButton) - self.SaveButton = QtGui.QPushButton(AlertForm) + self.SaveButton = QtGui.QPushButton(AlertDialog) self.SaveButton.setEnabled(False) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(u':/general/general_save.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.SaveButton.setIcon(icon2) self.SaveButton.setObjectName(u'SaveButton') self.ManageButtonLayout.addWidget(self.SaveButton) - self.DeleteButton = QtGui.QPushButton(AlertForm) + self.DeleteButton = QtGui.QPushButton(AlertDialog) icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(u':/general/general_delete.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.DeleteButton.setIcon(icon3) @@ -92,49 +92,49 @@ class Ui_AlertDialog(object): spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.ManageButtonLayout.addItem(spacerItem) self.ManagementLayout.addLayout(self.ManageButtonLayout) - self.AlertFormLayout.addLayout(self.ManagementLayout) + self.AlertDialogLayout.addLayout(self.ManagementLayout) self.AlertButtonLayout = QtGui.QHBoxLayout() self.AlertButtonLayout.setSpacing(8) self.AlertButtonLayout.setObjectName(u'AlertButtonLayout') spacerItem1 = QtGui.QSpacerItem(181, 0, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.AlertButtonLayout.addItem(spacerItem1) - self.DisplayButton = QtGui.QPushButton(AlertForm) + self.DisplayButton = QtGui.QPushButton(AlertDialog) icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap(u':/general/general_live.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.DisplayButton.setIcon(icon4) self.DisplayButton.setObjectName(u'DisplayButton') self.AlertButtonLayout.addWidget(self.DisplayButton) - self.DisplayCloseButton = QtGui.QPushButton(AlertForm) + self.DisplayCloseButton = QtGui.QPushButton(AlertDialog) self.DisplayCloseButton.setIcon(icon4) self.DisplayCloseButton.setObjectName(u'DisplayCloseButton') self.AlertButtonLayout.addWidget(self.DisplayCloseButton) - self.CloseButton = QtGui.QPushButton(AlertForm) + self.CloseButton = QtGui.QPushButton(AlertDialog) icon5 = QtGui.QIcon() icon5.addPixmap(QtGui.QPixmap(u':/system/system_close.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.CloseButton.setIcon(icon5) self.CloseButton.setObjectName(u'CloseButton') self.AlertButtonLayout.addWidget(self.CloseButton) - self.AlertFormLayout.addLayout(self.AlertButtonLayout) + self.AlertDialogLayout.addLayout(self.AlertButtonLayout) self.AlertEntryLabel.setBuddy(self.AlertTextEdit) self.AlertParameter.setBuddy(self.ParameterEdit) - self.retranslateUi(AlertForm) - QtCore.QObject.connect(self.CloseButton, QtCore.SIGNAL(u'clicked()'), AlertForm.close) - QtCore.QMetaObject.connectSlotsByName(AlertForm) - AlertForm.setTabOrder(self.AlertTextEdit, self.ParameterEdit) - AlertForm.setTabOrder(self.ParameterEdit, self.AlertListWidget) - AlertForm.setTabOrder(self.AlertListWidget, self.NewButton) - AlertForm.setTabOrder(self.NewButton, self.SaveButton) - AlertForm.setTabOrder(self.SaveButton, self.DeleteButton) - AlertForm.setTabOrder(self.DeleteButton, self.DisplayButton) - AlertForm.setTabOrder(self.DisplayButton, self.DisplayCloseButton) - AlertForm.setTabOrder(self.DisplayCloseButton, self.CloseButton) + self.retranslateUi(AlertDialog) + QtCore.QObject.connect(self.CloseButton, QtCore.SIGNAL(u'clicked()'), AlertDialog.close) + QtCore.QMetaObject.connectSlotsByName(AlertDialog) + AlertDialog.setTabOrder(self.AlertTextEdit, self.ParameterEdit) + AlertDialog.setTabOrder(self.ParameterEdit, self.AlertListWidget) + AlertDialog.setTabOrder(self.AlertListWidget, self.NewButton) + AlertDialog.setTabOrder(self.NewButton, self.SaveButton) + AlertDialog.setTabOrder(self.SaveButton, self.DeleteButton) + AlertDialog.setTabOrder(self.DeleteButton, self.DisplayButton) + AlertDialog.setTabOrder(self.DisplayButton, self.DisplayCloseButton) + AlertDialog.setTabOrder(self.DisplayCloseButton, self.CloseButton) - def retranslateUi(self, AlertForm): - AlertForm.setWindowTitle(translate('AlertForm', 'Alert Message')) + def retranslateUi(self, AlertDialog): + AlertDialog.setWindowTitle(translate('AlertForm', 'Alert Message')) self.AlertEntryLabel.setText(translate('AlertForm', 'Alert &text:')) self.AlertParameter.setText(translate('AlertForm', '&Parameter(s):')) self.NewButton.setText(translate('AlertForm', '&New')) diff --git a/openlp/plugins/bibles/forms/bibleimportwizard.py b/openlp/plugins/bibles/forms/bibleimportwizard.py index 8acfdac21..c709dae81 100644 --- a/openlp/plugins/bibles/forms/bibleimportwizard.py +++ b/openlp/plugins/bibles/forms/bibleimportwizard.py @@ -27,12 +27,12 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_BibleImportWizard(object): - def setupUi(self, ImportWizardForm): - ImportWizardForm.setObjectName(u'BibleImportWizard') - ImportWizardForm.resize(550, 386) - ImportWizardForm.setModal(True) - ImportWizardForm.setWizardStyle(QtGui.QWizard.ModernStyle) - ImportWizardForm.setOptions( + def setupUi(self, BibleImportWizard): + BibleImportWizard.setObjectName(u'BibleImportWizard') + BibleImportWizard.resize(550, 386) + BibleImportWizard.setModal(True) + BibleImportWizard.setWizardStyle(QtGui.QWizard.ModernStyle) + BibleImportWizard.setOptions( QtGui.QWizard.IndependentPages | \ QtGui.QWizard.NoBackButtonOnStartPage | \ QtGui.QWizard.NoBackButtonOnLastPage) @@ -58,7 +58,7 @@ class Ui_BibleImportWizard(object): spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.WelcomeLayout.addItem(spacerItem1) - ImportWizardForm.addPage(self.WelcomePage) + BibleImportWizard.addPage(self.WelcomePage) self.SelectPage = QtGui.QWizardPage() self.SelectPage.setObjectName(u'SelectPage') self.SelectPageLayout = QtGui.QVBoxLayout(self.SelectPage) @@ -252,7 +252,7 @@ class Ui_BibleImportWizard(object): self.WebDownloadLayout.addWidget(self.WebDownloadTabWidget) self.FormatWidget.addWidget(self.WebDownloadPage) self.SelectPageLayout.addWidget(self.FormatWidget) - ImportWizardForm.addPage(self.SelectPage) + BibleImportWizard.addPage(self.SelectPage) self.LicenseDetailsPage = QtGui.QWizardPage() self.LicenseDetailsPage.setObjectName(u'LicenseDetailsPage') self.LicenseDetailsLayout = QtGui.QFormLayout(self.LicenseDetailsPage) @@ -283,7 +283,7 @@ class Ui_BibleImportWizard(object): self.PermissionEdit.setObjectName(u'PermissionEdit') self.LicenseDetailsLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.PermissionEdit) - ImportWizardForm.addPage(self.LicenseDetailsPage) + BibleImportWizard.addPage(self.LicenseDetailsPage) self.ImportPage = QtGui.QWizardPage() self.ImportPage.setObjectName(u'ImportPage') self.ImportLayout = QtGui.QVBoxLayout(self.ImportPage) @@ -297,18 +297,18 @@ class Ui_BibleImportWizard(object): self.ImportProgressBar.setValue(0) self.ImportProgressBar.setObjectName(u'ImportProgressBar') self.ImportLayout.addWidget(self.ImportProgressBar) - ImportWizardForm.addPage(self.ImportPage) + BibleImportWizard.addPage(self.ImportPage) - self.retranslateUi(ImportWizardForm) + self.retranslateUi(BibleImportWizard) self.FormatWidget.setCurrentIndex(0) self.WebDownloadTabWidget.setCurrentIndex(0) QtCore.QObject.connect(self.FormatComboBox, QtCore.SIGNAL(u'currentIndexChanged(int)'), self.FormatWidget.setCurrentIndex) - QtCore.QMetaObject.connectSlotsByName(ImportWizardForm) + QtCore.QMetaObject.connectSlotsByName(BibleImportWizard) - def retranslateUi(self, ImportWizardForm): - ImportWizardForm.setWindowTitle(translate('ImportWizardForm', 'Bible Import Wizard')) + def retranslateUi(self, BibleImportWizard): + BibleImportWizard.setWindowTitle(translate('ImportWizardForm', 'Bible Import Wizard')) self.TitleLabel.setText( u'' + \ translate('ImportWizardForm', 'Welcome to the Bible Import Wizard') + u'') diff --git a/openlp/plugins/custom/forms/editcustomdialog.py b/openlp/plugins/custom/forms/editcustomdialog.py index 79380b9ba..57497ebaf 100644 --- a/openlp/plugins/custom/forms/editcustomdialog.py +++ b/openlp/plugins/custom/forms/editcustomdialog.py @@ -27,33 +27,33 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_customEditDialog(object): - def setupUi(self, EditCustomForm): - EditCustomForm.setObjectName(u'customEditDialog') - EditCustomForm.resize(590, 541) + def setupUi(self, customEditDialog): + customEditDialog.setObjectName(u'customEditDialog') + customEditDialog.resize(590, 541) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - EditCustomForm.setWindowIcon(icon) - self.gridLayout = QtGui.QGridLayout(EditCustomForm) + customEditDialog.setWindowIcon(icon) + self.gridLayout = QtGui.QGridLayout(customEditDialog) self.gridLayout.setObjectName(u'gridLayout') self.horizontalLayout = QtGui.QHBoxLayout() self.horizontalLayout.setObjectName(u'horizontalLayout') - self.TitleLabel = QtGui.QLabel(EditCustomForm) + self.TitleLabel = QtGui.QLabel(customEditDialog) self.TitleLabel.setObjectName(u'TitleLabel') self.horizontalLayout.addWidget(self.TitleLabel) - self.TitleEdit = QtGui.QLineEdit(EditCustomForm) + self.TitleEdit = QtGui.QLineEdit(customEditDialog) self.TitleEdit.setObjectName(u'TitleEdit') self.horizontalLayout.addWidget(self.TitleEdit) self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 1) self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(u'horizontalLayout_4') - self.VerseListView = QtGui.QListWidget(EditCustomForm) + self.VerseListView = QtGui.QListWidget(customEditDialog) self.VerseListView.setAlternatingRowColors(True) self.VerseListView.setObjectName(u'VerseListView') self.horizontalLayout_4.addWidget(self.VerseListView) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(u'verticalLayout') - self.UpButton = QtGui.QPushButton(EditCustomForm) + self.UpButton = QtGui.QPushButton(customEditDialog) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(u':/services/service_up.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -63,7 +63,7 @@ class Ui_customEditDialog(object): spacerItem = QtGui.QSpacerItem(20, 128, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) - self.DownButton = QtGui.QPushButton(EditCustomForm) + self.DownButton = QtGui.QPushButton(customEditDialog) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(u':/services/service_down.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -72,7 +72,7 @@ class Ui_customEditDialog(object): self.verticalLayout.addWidget(self.DownButton) self.horizontalLayout_4.addLayout(self.verticalLayout) self.gridLayout.addLayout(self.horizontalLayout_4, 1, 0, 1, 1) - self.EditWidget = QtGui.QWidget(EditCustomForm) + self.EditWidget = QtGui.QWidget(customEditDialog) self.EditWidget.setObjectName(u'EditWidget') self.EditLayout_3 = QtGui.QHBoxLayout(self.EditWidget) self.EditLayout_3.setSpacing(8) @@ -113,47 +113,47 @@ class Ui_customEditDialog(object): self.gridLayout.addWidget(self.EditWidget, 2, 0, 1, 1) self.horizontalLayout_3 = QtGui.QHBoxLayout() self.horizontalLayout_3.setObjectName(u'horizontalLayout_3') - self.ThemeLabel = QtGui.QLabel(EditCustomForm) + self.ThemeLabel = QtGui.QLabel(customEditDialog) self.ThemeLabel.setObjectName(u'ThemeLabel') self.horizontalLayout_3.addWidget(self.ThemeLabel) - self.ThemeComboBox = QtGui.QComboBox(EditCustomForm) + self.ThemeComboBox = QtGui.QComboBox(customEditDialog) self.ThemeComboBox.setObjectName(u'ThemeComboBox') self.horizontalLayout_3.addWidget(self.ThemeComboBox) self.gridLayout.addLayout(self.horizontalLayout_3, 3, 0, 1, 1) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(u'horizontalLayout_2') - self.CreditLabel = QtGui.QLabel(EditCustomForm) + self.CreditLabel = QtGui.QLabel(customEditDialog) self.CreditLabel.setObjectName(u'CreditLabel') self.horizontalLayout_2.addWidget(self.CreditLabel) - self.CreditEdit = QtGui.QLineEdit(EditCustomForm) + self.CreditEdit = QtGui.QLineEdit(customEditDialog) self.CreditEdit.setObjectName(u'CreditEdit') self.horizontalLayout_2.addWidget(self.CreditEdit) self.gridLayout.addLayout(self.horizontalLayout_2, 4, 0, 1, 1) - self.buttonBox = QtGui.QDialogButtonBox(EditCustomForm) + self.buttonBox = QtGui.QDialogButtonBox(customEditDialog) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) self.buttonBox.setObjectName(u'buttonBox') self.gridLayout.addWidget(self.buttonBox, 5, 0, 1, 1) - self.retranslateUi(EditCustomForm) + self.retranslateUi(customEditDialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), - EditCustomForm.accept) + customEditDialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), - EditCustomForm.closePressed) - QtCore.QMetaObject.connectSlotsByName(EditCustomForm) - EditCustomForm.setTabOrder(self.TitleEdit, self.VerseTextEdit) - EditCustomForm.setTabOrder(self.VerseTextEdit, self.AddButton) - EditCustomForm.setTabOrder(self.AddButton, self.VerseListView) - EditCustomForm.setTabOrder(self.VerseListView, self.EditButton) - EditCustomForm.setTabOrder(self.EditButton, self.EditAllButton) - EditCustomForm.setTabOrder(self.EditAllButton, self.SaveButton) - EditCustomForm.setTabOrder(self.SaveButton, self.DeleteButton) - EditCustomForm.setTabOrder(self.DeleteButton, self.CreditEdit) - EditCustomForm.setTabOrder(self.CreditEdit, self.UpButton) - EditCustomForm.setTabOrder(self.UpButton, self.DownButton) - EditCustomForm.setTabOrder(self.DownButton, self.ThemeComboBox) + customEditDialog.closePressed) + QtCore.QMetaObject.connectSlotsByName(customEditDialog) + customEditDialog.setTabOrder(self.TitleEdit, self.VerseTextEdit) + customEditDialog.setTabOrder(self.VerseTextEdit, self.AddButton) + customEditDialog.setTabOrder(self.AddButton, self.VerseListView) + customEditDialog.setTabOrder(self.VerseListView, self.EditButton) + customEditDialog.setTabOrder(self.EditButton, self.EditAllButton) + customEditDialog.setTabOrder(self.EditAllButton, self.SaveButton) + customEditDialog.setTabOrder(self.SaveButton, self.DeleteButton) + customEditDialog.setTabOrder(self.DeleteButton, self.CreditEdit) + customEditDialog.setTabOrder(self.CreditEdit, self.UpButton) + customEditDialog.setTabOrder(self.UpButton, self.DownButton) + customEditDialog.setTabOrder(self.DownButton, self.ThemeComboBox) - def retranslateUi(self, EditCustomForm): - EditCustomForm.setWindowTitle(translate('EditCustomForm', 'Edit Custom Slides')) + def retranslateUi(self, customEditDialog): + customEditDialog.setWindowTitle(translate('EditCustomForm', 'Edit Custom Slides')) self.UpButton.setToolTip(translate('EditCustomForm', 'Move slide Up 1')) self.DownButton.setToolTip(translate('EditCustomForm', 'Move slide down 1')) self.TitleLabel.setText(translate('EditCustomForm', 'Title:')) diff --git a/openlp/plugins/songs/forms/authorsdialog.py b/openlp/plugins/songs/forms/authorsdialog.py index 10bef469f..dbd7af077 100644 --- a/openlp/plugins/songs/forms/authorsdialog.py +++ b/openlp/plugins/songs/forms/authorsdialog.py @@ -27,38 +27,38 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_AuthorsDialog(object): - def setupUi(self, AuthorsForm): - AuthorsForm.setObjectName(u'AuthorsDialog') - AuthorsForm.resize(393, 147) - self.AuthorsLayout = QtGui.QFormLayout(AuthorsForm) + def setupUi(self, AuthorsDialog): + AuthorsDialog.setObjectName(u'AuthorsDialog') + AuthorsDialog.resize(393, 147) + self.AuthorsLayout = QtGui.QFormLayout(AuthorsDialog) self.AuthorsLayout.setMargin(8) self.AuthorsLayout.setSpacing(8) self.AuthorsLayout.setObjectName(u'AuthorsLayout') - self.FirstNameLabel = QtGui.QLabel(AuthorsForm) + self.FirstNameLabel = QtGui.QLabel(AuthorsDialog) self.FirstNameLabel.setObjectName(u'FirstNameLabel') self.AuthorsLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.FirstNameLabel) - self.FirstNameEdit = QtGui.QLineEdit(AuthorsForm) + self.FirstNameEdit = QtGui.QLineEdit(AuthorsDialog) self.FirstNameEdit.setObjectName(u'FirstNameEdit') self.AuthorsLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.FirstNameEdit) - self.LastNameLabel = QtGui.QLabel(AuthorsForm) + self.LastNameLabel = QtGui.QLabel(AuthorsDialog) self.LastNameLabel.setObjectName(u'LastNameLabel') self.AuthorsLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.LastNameLabel) - self.LastNameEdit = QtGui.QLineEdit(AuthorsForm) + self.LastNameEdit = QtGui.QLineEdit(AuthorsDialog) self.LastNameEdit.setObjectName(u'LastNameEdit') self.AuthorsLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.LastNameEdit) - self.DisplayLabel = QtGui.QLabel(AuthorsForm) + self.DisplayLabel = QtGui.QLabel(AuthorsDialog) self.DisplayLabel.setObjectName(u'DisplayLabel') self.AuthorsLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.DisplayLabel) - self.DisplayEdit = QtGui.QLineEdit(AuthorsForm) + self.DisplayEdit = QtGui.QLineEdit(AuthorsDialog) self.DisplayEdit.setObjectName(u'DisplayEdit') self.AuthorsLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.DisplayEdit) - self.AuthorButtonBox = QtGui.QDialogButtonBox(AuthorsForm) + self.AuthorButtonBox = QtGui.QDialogButtonBox(AuthorsDialog) self.AuthorButtonBox.setOrientation(QtCore.Qt.Horizontal) self.AuthorButtonBox.setStandardButtons( QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) @@ -66,15 +66,15 @@ class Ui_AuthorsDialog(object): self.AuthorsLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.AuthorButtonBox) - self.retranslateUi(AuthorsForm) + self.retranslateUi(AuthorsDialog) QtCore.QObject.connect(self.AuthorButtonBox, - QtCore.SIGNAL(u'accepted()'), AuthorsForm.accept) + QtCore.SIGNAL(u'accepted()'), AuthorsDialog.accept) QtCore.QObject.connect(self.AuthorButtonBox, - QtCore.SIGNAL(u'rejected()'), AuthorsForm.reject) - QtCore.QMetaObject.connectSlotsByName(AuthorsForm) + QtCore.SIGNAL(u'rejected()'), AuthorsDialog.reject) + QtCore.QMetaObject.connectSlotsByName(AuthorsDialog) - def retranslateUi(self, AuthorsForm): - AuthorsForm.setWindowTitle(translate('AuthorsForm', 'Author Maintenance')) + def retranslateUi(self, AuthorsDialog): + AuthorsDialog.setWindowTitle(translate('AuthorsForm', 'Author Maintenance')) self.DisplayLabel.setText(translate('AuthorsForm', 'Display name:')) self.FirstNameLabel.setText(translate('AuthorsForm', 'First name:')) self.LastNameLabel.setText(translate('AuthorsForm', 'Last name:')) diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index 04df954ec..6d617072d 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -29,16 +29,16 @@ from openlp.core.lib import translate from openlp.core.lib import build_icon class Ui_EditSongDialog(object): - def setupUi(self, EditSongForm): - EditSongForm.setObjectName(u'EditSongDialog') - EditSongForm.resize(645, 417) + def setupUi(self, EditSongDialog): + EditSongDialog.setObjectName(u'EditSongDialog') + EditSongDialog.resize(645, 417) icon = build_icon(u':/icon/openlp.org-icon-32.bmp') - EditSongForm.setWindowIcon(icon) - EditSongForm.setModal(True) - self.verticalLayout = QtGui.QVBoxLayout(EditSongForm) + EditSongDialog.setWindowIcon(icon) + EditSongDialog.setModal(True) + self.verticalLayout = QtGui.QVBoxLayout(EditSongDialog) self.verticalLayout.setMargin(8) self.verticalLayout.setObjectName(u'verticalLayout') - self.SongTabWidget = QtGui.QTabWidget(EditSongForm) + self.SongTabWidget = QtGui.QTabWidget(EditSongDialog) self.SongTabWidget.setObjectName(u'SongTabWidget') self.LyricsTab = QtGui.QWidget() self.LyricsTab.setObjectName(u'LyricsTab') @@ -380,46 +380,46 @@ class Ui_EditSongDialog(object): self.ThemeTabLayout.addItem(spacerItem5) self.SongTabWidget.addTab(self.ThemeTab, u'') self.verticalLayout.addWidget(self.SongTabWidget) - self.ButtonBox = QtGui.QDialogButtonBox(EditSongForm) + self.ButtonBox = QtGui.QDialogButtonBox(EditSongDialog) self.ButtonBox.setStandardButtons( QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Save) self.ButtonBox.setObjectName(u'ButtonBox') self.verticalLayout.addWidget(self.ButtonBox) - self.retranslateUi(EditSongForm) + self.retranslateUi(EditSongDialog) QtCore.QObject.connect(self.ButtonBox, - QtCore.SIGNAL(u'rejected()'), EditSongForm.closePressed) + QtCore.SIGNAL(u'rejected()'), EditSongDialog.closePressed) QtCore.QObject.connect(self.ButtonBox, - QtCore.SIGNAL(u'accepted()'), EditSongForm.accept) - QtCore.QMetaObject.connectSlotsByName(EditSongForm) - EditSongForm.setTabOrder(self.SongTabWidget, self.TitleEditItem) - EditSongForm.setTabOrder(self.TitleEditItem, self.AlternativeEdit) - EditSongForm.setTabOrder(self.AlternativeEdit, self.VerseListWidget) - EditSongForm.setTabOrder(self.VerseListWidget, self.VerseAddButton) - EditSongForm.setTabOrder(self.VerseAddButton, self.VerseEditButton) - EditSongForm.setTabOrder(self.VerseEditButton, self.VerseEditAllButton) - EditSongForm.setTabOrder(self.VerseEditAllButton, self.VerseDeleteButton) - EditSongForm.setTabOrder(self.VerseDeleteButton, self.VerseOrderEdit) - EditSongForm.setTabOrder(self.VerseOrderEdit, self.AuthorsSelectionComboItem) - EditSongForm.setTabOrder(self.AuthorsSelectionComboItem, self.AuthorAddButton) - EditSongForm.setTabOrder(self.AuthorAddButton, self.AuthorsListView) - EditSongForm.setTabOrder(self.AuthorsListView, self.AuthorRemoveButton) - EditSongForm.setTabOrder(self.AuthorRemoveButton, self.MaintenanceButton) - EditSongForm.setTabOrder(self.MaintenanceButton, self.SongTopicCombo) - EditSongForm.setTabOrder(self.SongTopicCombo, self.TopicAddButton) - EditSongForm.setTabOrder(self.TopicAddButton, self.TopicsListView) - EditSongForm.setTabOrder(self.TopicsListView, self.TopicRemoveButton) - EditSongForm.setTabOrder(self.TopicRemoveButton, self.SongbookCombo) - EditSongForm.setTabOrder(self.SongbookCombo, self.ThemeSelectionComboItem) - EditSongForm.setTabOrder(self.ThemeSelectionComboItem, self.ThemeAddButton) - EditSongForm.setTabOrder(self.ThemeAddButton, self.CopyrightEditItem) - EditSongForm.setTabOrder(self.CopyrightEditItem, self.CopyrightInsertButton) - EditSongForm.setTabOrder(self.CopyrightInsertButton, self.CCLNumberEdit) - EditSongForm.setTabOrder(self.CCLNumberEdit, self.CommentsEdit) - EditSongForm.setTabOrder(self.CommentsEdit, self.ButtonBox) + QtCore.SIGNAL(u'accepted()'), EditSongDialog.accept) + QtCore.QMetaObject.connectSlotsByName(EditSongDialog) + EditSongDialog.setTabOrder(self.SongTabWidget, self.TitleEditItem) + EditSongDialog.setTabOrder(self.TitleEditItem, self.AlternativeEdit) + EditSongDialog.setTabOrder(self.AlternativeEdit, self.VerseListWidget) + EditSongDialog.setTabOrder(self.VerseListWidget, self.VerseAddButton) + EditSongDialog.setTabOrder(self.VerseAddButton, self.VerseEditButton) + EditSongDialog.setTabOrder(self.VerseEditButton, self.VerseEditAllButton) + EditSongDialog.setTabOrder(self.VerseEditAllButton, self.VerseDeleteButton) + EditSongDialog.setTabOrder(self.VerseDeleteButton, self.VerseOrderEdit) + EditSongDialog.setTabOrder(self.VerseOrderEdit, self.AuthorsSelectionComboItem) + EditSongDialog.setTabOrder(self.AuthorsSelectionComboItem, self.AuthorAddButton) + EditSongDialog.setTabOrder(self.AuthorAddButton, self.AuthorsListView) + EditSongDialog.setTabOrder(self.AuthorsListView, self.AuthorRemoveButton) + EditSongDialog.setTabOrder(self.AuthorRemoveButton, self.MaintenanceButton) + EditSongDialog.setTabOrder(self.MaintenanceButton, self.SongTopicCombo) + EditSongDialog.setTabOrder(self.SongTopicCombo, self.TopicAddButton) + EditSongDialog.setTabOrder(self.TopicAddButton, self.TopicsListView) + EditSongDialog.setTabOrder(self.TopicsListView, self.TopicRemoveButton) + EditSongDialog.setTabOrder(self.TopicRemoveButton, self.SongbookCombo) + EditSongDialog.setTabOrder(self.SongbookCombo, self.ThemeSelectionComboItem) + EditSongDialog.setTabOrder(self.ThemeSelectionComboItem, self.ThemeAddButton) + EditSongDialog.setTabOrder(self.ThemeAddButton, self.CopyrightEditItem) + EditSongDialog.setTabOrder(self.CopyrightEditItem, self.CopyrightInsertButton) + EditSongDialog.setTabOrder(self.CopyrightInsertButton, self.CCLNumberEdit) + EditSongDialog.setTabOrder(self.CCLNumberEdit, self.CommentsEdit) + EditSongDialog.setTabOrder(self.CommentsEdit, self.ButtonBox) - def retranslateUi(self, EditSongForm): - EditSongForm.setWindowTitle(translate('EditSongForm', 'Song Editor')) + def retranslateUi(self, EditSongDialog): + EditSongDialog.setWindowTitle(translate('EditSongForm', 'Song Editor')) self.TitleLabel.setText(translate('EditSongForm', 'Title:')) self.AlternativeTitleLabel.setText(translate('EditSongForm', 'Alternative Title:')) self.LyricsLabel.setText(translate('EditSongForm', 'Lyrics:')) diff --git a/openlp/plugins/songs/forms/editversedialog.py b/openlp/plugins/songs/forms/editversedialog.py index 40a75b073..201f06cc7 100644 --- a/openlp/plugins/songs/forms/editversedialog.py +++ b/openlp/plugins/songs/forms/editversedialog.py @@ -27,11 +27,11 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_EditVerseDialog(object): - def setupUi(self, EditVerseForm): - EditVerseForm.setObjectName(u'EditVerseDialog') - EditVerseForm.resize(500, 521) - EditVerseForm.setModal(True) - self.layoutWidget = QtGui.QWidget(EditVerseForm) + def setupUi(self, EditVerseDialog): + EditVerseDialog.setObjectName(u'EditVerseDialog') + EditVerseDialog.resize(500, 521) + EditVerseDialog.setModal(True) + self.layoutWidget = QtGui.QWidget(EditVerseDialog) self.layoutWidget.setGeometry(QtCore.QRect(11, 1, 471, 491)) self.layoutWidget.setObjectName(u'layoutWidget') self.verticalLayout_3 = QtGui.QVBoxLayout(self.layoutWidget) @@ -104,13 +104,13 @@ class Ui_EditVerseDialog(object): self.ButtonBox.setObjectName(u'ButtonBox') self.verticalLayout_3.addWidget(self.ButtonBox) - self.retranslateUi(EditVerseForm) - QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'accepted()'), EditVerseForm.accept) - QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'rejected()'), EditVerseForm.reject) - QtCore.QMetaObject.connectSlotsByName(EditVerseForm) + self.retranslateUi(EditVerseDialog) + QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'accepted()'), EditVerseDialog.accept) + QtCore.QObject.connect(self.ButtonBox, QtCore.SIGNAL(u'rejected()'), EditVerseDialog.reject) + QtCore.QMetaObject.connectSlotsByName(EditVerseDialog) - def retranslateUi(self, EditVerseForm): - EditVerseForm.setWindowTitle(translate('EditVerseForm', 'Edit Verse')) + def retranslateUi(self, EditVerseDialog): + EditVerseDialog.setWindowTitle(translate('EditVerseForm', 'Edit Verse')) self.VerseTypeLabel.setText(translate('EditVerseForm', 'Verse Type')) self.VerseListComboBox.setItemText(0, translate('EditVerseForm', 'Intro')) self.VerseListComboBox.setItemText(1, translate('EditVerseForm', 'Verse')) diff --git a/openlp/plugins/songs/forms/openlpexportdialog.py b/openlp/plugins/songs/forms/openlpexportdialog.py index 82934e19d..2046f2f95 100644 --- a/openlp/plugins/songs/forms/openlpexportdialog.py +++ b/openlp/plugins/songs/forms/openlpexportdialog.py @@ -27,16 +27,16 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_OpenLPExportDialog(object): - def setupUi(self, OpenLPExportForm): - OpenLPExportForm.setObjectName(u'OpenLPExportDialog') - OpenLPExportForm.resize(473, 459) + def setupUi(self, OpenLPExportDialog): + OpenLPExportDialog.setObjectName(u'OpenLPExportDialog') + OpenLPExportDialog.resize(473, 459) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - OpenLPExportForm.setWindowIcon(icon) - self.verticalLayout_5 = QtGui.QVBoxLayout(OpenLPExportForm) + OpenLPExportDialog.setWindowIcon(icon) + self.verticalLayout_5 = QtGui.QVBoxLayout(OpenLPExportDialog) self.verticalLayout_5.setMargin(8) self.verticalLayout_5.setObjectName(u'verticalLayout_5') - self.ExportFileWidget = QtGui.QWidget(OpenLPExportForm) + self.ExportFileWidget = QtGui.QWidget(OpenLPExportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -60,7 +60,7 @@ class Ui_OpenLPExportDialog(object): self.ExportFileSelectPushButton.setObjectName(u'ExportFileSelectPushButton') self.horizontalLayout.addWidget(self.ExportFileSelectPushButton) self.verticalLayout_5.addWidget(self.ExportFileWidget) - self.SongListFrame = QtGui.QFrame(OpenLPExportForm) + self.SongListFrame = QtGui.QFrame(OpenLPExportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -243,7 +243,7 @@ class Ui_OpenLPExportDialog(object): self.verticalLayout_2.addWidget(self.SelectedRemoveSelectedWidget) self.horizontalLayout_6.addWidget(self.SelectedFileListWidget) self.verticalLayout_5.addWidget(self.SongListFrame) - self.ProgressGroupBox = QtGui.QGroupBox(OpenLPExportForm) + self.ProgressGroupBox = QtGui.QGroupBox(OpenLPExportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -262,7 +262,7 @@ class Ui_OpenLPExportDialog(object): self.ProgressBar.setObjectName(u'ProgressBar') self.verticalLayout_4.addWidget(self.ProgressBar) self.verticalLayout_5.addWidget(self.ProgressGroupBox) - self.ButtonBarWidget = QtGui.QWidget(OpenLPExportForm) + self.ButtonBarWidget = QtGui.QWidget(OpenLPExportDialog) self.ButtonBarWidget.setObjectName(u'ButtonBarWidget') self.horizontalLayout_7 = QtGui.QHBoxLayout(self.ButtonBarWidget) self.horizontalLayout_7.setSpacing(8) @@ -278,15 +278,15 @@ class Ui_OpenLPExportDialog(object): self.horizontalLayout_7.addWidget(self.ClosePushButton) self.verticalLayout_5.addWidget(self.ButtonBarWidget) - self.retranslateUi(OpenLPExportForm) - QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenLPExportForm.close) + self.retranslateUi(OpenLPExportDialog) + QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenLPExportDialog.close) QtCore.QObject.connect(self.ExportSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.ExportListTable.selectAll) QtCore.QObject.connect(self.SelectedSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.selectAll) QtCore.QObject.connect(self.SelectedRemoveSelectedButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.clear) - QtCore.QMetaObject.connectSlotsByName(OpenLPExportForm) + QtCore.QMetaObject.connectSlotsByName(OpenLPExportDialog) - def retranslateUi(self, OpenLPExportForm): - OpenLPExportForm.setWindowTitle(translate('OpenLPExportForm', 'openlp.org Song Exporter')) + def retranslateUi(self, OpenLPExportDialog): + OpenLPExportDialog.setWindowTitle(translate('OpenLPExportForm', 'openlp.org Song Exporter')) self.ExportFileLabel.setText(translate('OpenLPExportForm', 'Select openlp.org export filename:')) self.ExportListLabel.setText(translate('OpenLPExportForm', 'Full Song List')) self.ExportListTable.horizontalHeaderItem(0).setText(translate('OpenLPExportForm', 'Song Title')) diff --git a/openlp/plugins/songs/forms/openlpimportdialog.py b/openlp/plugins/songs/forms/openlpimportdialog.py index 455b6347c..8080b5a25 100644 --- a/openlp/plugins/songs/forms/openlpimportdialog.py +++ b/openlp/plugins/songs/forms/openlpimportdialog.py @@ -27,16 +27,16 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_OpenLPImportDialog(object): - def setupUi(self, OpenLPImportForm): - OpenLPImportForm.setObjectName(u'OpenLPImportDialog') - OpenLPImportForm.resize(473, 459) + def setupUi(self, OpenLPImportDialog): + OpenLPImportDialog.setObjectName(u'OpenLPImportDialog') + OpenLPImportDialog.resize(473, 459) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - OpenLPImportForm.setWindowIcon(icon) - self.verticalLayout_5 = QtGui.QVBoxLayout(OpenLPImportForm) + OpenLPImportDialog.setWindowIcon(icon) + self.verticalLayout_5 = QtGui.QVBoxLayout(OpenLPImportDialog) self.verticalLayout_5.setMargin(8) self.verticalLayout_5.setObjectName(u'verticalLayout_5') - self.ImportFileWidget = QtGui.QWidget(OpenLPImportForm) + self.ImportFileWidget = QtGui.QWidget(OpenLPImportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -60,7 +60,7 @@ class Ui_OpenLPImportDialog(object): self.ImportFileSelectPushButton.setObjectName(u'ImportFileSelectPushButton') self.horizontalLayout.addWidget(self.ImportFileSelectPushButton) self.verticalLayout_5.addWidget(self.ImportFileWidget) - self.SongListFrame = QtGui.QFrame(OpenLPImportForm) + self.SongListFrame = QtGui.QFrame(OpenLPImportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -243,7 +243,7 @@ class Ui_OpenLPImportDialog(object): self.verticalLayout_2.addWidget(self.SelectedRemoveSelectedWidget) self.horizontalLayout_6.addWidget(self.SelectedFileListWidget) self.verticalLayout_5.addWidget(self.SongListFrame) - self.ProgressGroupBox = QtGui.QGroupBox(OpenLPImportForm) + self.ProgressGroupBox = QtGui.QGroupBox(OpenLPImportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -262,7 +262,7 @@ class Ui_OpenLPImportDialog(object): self.ProgressBar.setObjectName(u'ProgressBar') self.verticalLayout_4.addWidget(self.ProgressBar) self.verticalLayout_5.addWidget(self.ProgressGroupBox) - self.ButtonBarWidget = QtGui.QWidget(OpenLPImportForm) + self.ButtonBarWidget = QtGui.QWidget(OpenLPImportDialog) self.ButtonBarWidget.setObjectName(u'ButtonBarWidget') self.horizontalLayout_7 = QtGui.QHBoxLayout(self.ButtonBarWidget) self.horizontalLayout_7.setSpacing(8) @@ -278,15 +278,15 @@ class Ui_OpenLPImportDialog(object): self.horizontalLayout_7.addWidget(self.ClosePushButton) self.verticalLayout_5.addWidget(self.ButtonBarWidget) - self.retranslateUi(OpenLPImportForm) - QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenLPImportForm.close) + self.retranslateUi(OpenLPImportDialog) + QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenLPImportDialog.close) QtCore.QObject.connect(self.ImportSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.ImportListTable.selectAll) QtCore.QObject.connect(self.SelectedSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.selectAll) QtCore.QObject.connect(self.SelectedRemoveSelectedButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.clear) - QtCore.QMetaObject.connectSlotsByName(OpenLPImportForm) + QtCore.QMetaObject.connectSlotsByName(OpenLPImportDialog) - def retranslateUi(self, OpenLPImportForm): - OpenLPImportForm.setWindowTitle(translate('OpenLPImportForm', 'openlp.org Song Importer')) + def retranslateUi(self, OpenLPImportDialog): + OpenLPImportDialog.setWindowTitle(translate('OpenLPImportForm', 'openlp.org Song Importer')) self.ImportFileLabel.setText(translate('OpenLPImportForm', 'Select openlp.org songfile to import:')) self.ImportListLabel.setText(translate('OpenLPImportForm', 'Import File Song List')) self.ImportListTable.horizontalHeaderItem(0).setText(translate('OpenLPImportForm', 'Song Title')) diff --git a/openlp/plugins/songs/forms/opensongexportdialog.py b/openlp/plugins/songs/forms/opensongexportdialog.py index 571be630b..4d95e48e2 100644 --- a/openlp/plugins/songs/forms/opensongexportdialog.py +++ b/openlp/plugins/songs/forms/opensongexportdialog.py @@ -27,16 +27,16 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_OpenSongExportDialog(object): - def setupUi(self, OpenSongExportForm): - OpenSongExportForm.setObjectName(u'OpenSongExportDialog') - OpenSongExportForm.resize(473, 459) + def setupUi(self, OpenSongExportDialog): + OpenSongExportDialog.setObjectName(u'OpenSongExportDialog') + OpenSongExportDialog.resize(473, 459) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - OpenSongExportForm.setWindowIcon(icon) - self.verticalLayout_5 = QtGui.QVBoxLayout(OpenSongExportForm) + OpenSongExportDialog.setWindowIcon(icon) + self.verticalLayout_5 = QtGui.QVBoxLayout(OpenSongExportDialog) self.verticalLayout_5.setMargin(8) self.verticalLayout_5.setObjectName(u'verticalLayout_5') - self.ExportFileWidget = QtGui.QWidget(OpenSongExportForm) + self.ExportFileWidget = QtGui.QWidget(OpenSongExportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -60,7 +60,7 @@ class Ui_OpenSongExportDialog(object): self.ExportFileSelectPushButton.setObjectName(u'ExportFileSelectPushButton') self.horizontalLayout.addWidget(self.ExportFileSelectPushButton) self.verticalLayout_5.addWidget(self.ExportFileWidget) - self.SongListFrame = QtGui.QFrame(OpenSongExportForm) + self.SongListFrame = QtGui.QFrame(OpenSongExportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -243,7 +243,7 @@ class Ui_OpenSongExportDialog(object): self.verticalLayout_2.addWidget(self.SelectedRemoveSelectedWidget) self.horizontalLayout_6.addWidget(self.SelectedFileListWidget) self.verticalLayout_5.addWidget(self.SongListFrame) - self.ProgressGroupBox = QtGui.QGroupBox(OpenSongExportForm) + self.ProgressGroupBox = QtGui.QGroupBox(OpenSongExportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -262,7 +262,7 @@ class Ui_OpenSongExportDialog(object): self.ProgressBar.setObjectName(u'ProgressBar') self.verticalLayout_4.addWidget(self.ProgressBar) self.verticalLayout_5.addWidget(self.ProgressGroupBox) - self.ButtonBarWidget = QtGui.QWidget(OpenSongExportForm) + self.ButtonBarWidget = QtGui.QWidget(OpenSongExportDialog) self.ButtonBarWidget.setObjectName(u'ButtonBarWidget') self.horizontalLayout_7 = QtGui.QHBoxLayout(self.ButtonBarWidget) self.horizontalLayout_7.setSpacing(8) @@ -278,15 +278,15 @@ class Ui_OpenSongExportDialog(object): self.horizontalLayout_7.addWidget(self.ClosePushButton) self.verticalLayout_5.addWidget(self.ButtonBarWidget) - self.retranslateUi(OpenSongExportForm) - QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenSongExportForm.close) + self.retranslateUi(OpenSongExportDialog) + QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenSongExportDialog.close) QtCore.QObject.connect(self.ExportSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.ExportListTable.selectAll) QtCore.QObject.connect(self.SelectedSelectAllPushButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.selectAll) QtCore.QObject.connect(self.SelectedRemoveSelectedButton, QtCore.SIGNAL(u'clicked()'), self.SelectedListTable.clear) - QtCore.QMetaObject.connectSlotsByName(OpenSongExportForm) + QtCore.QMetaObject.connectSlotsByName(OpenSongExportDialog) - def retranslateUi(self, OpenSongExportForm): - OpenSongExportForm.setWindowTitle(translate('OpenSong Song Exporter')) + def retranslateUi(self, OpenSongExportDialog): + OpenSongExportDialog.setWindowTitle(translate('OpenSong Song Exporter')) self.ExportFileLabel.setText(translate('OpenSongExportForm', 'Select OpenSong song folder:')) self.ExportListLabel.setText(translate('OpenSongExportForm', 'Full Song List')) self.ExportListTable.horizontalHeaderItem(0).setText(translate('OpenSongExportForm', 'Song Title')) diff --git a/openlp/plugins/songs/forms/opensongimportdialog.py b/openlp/plugins/songs/forms/opensongimportdialog.py index df9bce507..9091e08ad 100644 --- a/openlp/plugins/songs/forms/opensongimportdialog.py +++ b/openlp/plugins/songs/forms/opensongimportdialog.py @@ -27,17 +27,17 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_OpenSongImportDialog(object): - def setupUi(self, OpenSongImportForm): - OpenSongImportForm.setObjectName(u'OpenSongImportDialog') - OpenSongImportForm.resize(481, 172) + def setupUi(self, OpenSongImportDialog): + OpenSongImportDialog.setObjectName(u'OpenSongImportDialog') + OpenSongImportDialog.resize(481, 172) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - OpenSongImportForm.setWindowIcon(icon) - self.verticalLayout = QtGui.QVBoxLayout(OpenSongImportForm) + OpenSongImportDialog.setWindowIcon(icon) + self.verticalLayout = QtGui.QVBoxLayout(OpenSongImportDialog) self.verticalLayout.setSpacing(6) self.verticalLayout.setMargin(8) self.verticalLayout.setObjectName(u'verticalLayout') - self.ImportFileWidget = QtGui.QWidget(OpenSongImportForm) + self.ImportFileWidget = QtGui.QWidget(OpenSongImportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -61,7 +61,7 @@ class Ui_OpenSongImportDialog(object): self.ImportFileSelectPushButton.setObjectName(u'ImportFileSelectPushButton') self.horizontalLayout.addWidget(self.ImportFileSelectPushButton) self.verticalLayout.addWidget(self.ImportFileWidget) - self.ProgressGroupBox = QtGui.QGroupBox(OpenSongImportForm) + self.ProgressGroupBox = QtGui.QGroupBox(OpenSongImportDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) @@ -80,7 +80,7 @@ class Ui_OpenSongImportDialog(object): self.ProgressBar.setObjectName(u'ProgressBar') self.verticalLayout_4.addWidget(self.ProgressBar) self.verticalLayout.addWidget(self.ProgressGroupBox) - self.ButtonBarWidget = QtGui.QWidget(OpenSongImportForm) + self.ButtonBarWidget = QtGui.QWidget(OpenSongImportDialog) self.ButtonBarWidget.setObjectName(u'ButtonBarWidget') self.horizontalLayout_7 = QtGui.QHBoxLayout(self.ButtonBarWidget) self.horizontalLayout_7.setSpacing(8) @@ -96,12 +96,12 @@ class Ui_OpenSongImportDialog(object): self.horizontalLayout_7.addWidget(self.ClosePushButton) self.verticalLayout.addWidget(self.ButtonBarWidget) - self.retranslateUi(OpenSongImportForm) - QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenSongImportForm.close) - QtCore.QMetaObject.connectSlotsByName(OpenSongImportForm) + self.retranslateUi(OpenSongImportDialog) + QtCore.QObject.connect(self.ClosePushButton, QtCore.SIGNAL(u'clicked()'), OpenSongImportDialog.close) + QtCore.QMetaObject.connectSlotsByName(OpenSongImportDialog) - def retranslateUi(self, OpenSongImportForm): - OpenSongImportForm.setWindowTitle(translate('OpenSongImportForm', 'OpenSong Song Importer')) + def retranslateUi(self, OpenSongImportDialog): + OpenSongImportDialog.setWindowTitle(translate('OpenSongImportForm', 'OpenSong Song Importer')) self.ImportFileLabel.setText(translate('OpenSongImportForm', 'OpenSong Folder:')) self.ProgressGroupBox.setTitle(translate('OpenSongImportForm', 'Progress:')) self.ProgressLabel.setText(translate('OpenSongImportForm', 'Ready to import')) diff --git a/openlp/plugins/songs/forms/songbookdialog.py b/openlp/plugins/songs/forms/songbookdialog.py index 4276ae9da..3122ed21b 100644 --- a/openlp/plugins/songs/forms/songbookdialog.py +++ b/openlp/plugins/songs/forms/songbookdialog.py @@ -27,30 +27,30 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_SongBookDialog(object): - def setupUi(self, SongBookForm): - SongBookForm.setObjectName(u'SongBookDialog') - SongBookForm.resize(367, 120) - self.SongBookLayout = QtGui.QFormLayout(SongBookForm) + def setupUi(self, SongBookDialog): + SongBookDialog.setObjectName(u'SongBookDialog') + SongBookDialog.resize(367, 120) + self.SongBookLayout = QtGui.QFormLayout(SongBookDialog) self.SongBookLayout.setMargin(8) self.SongBookLayout.setSpacing(8) self.SongBookLayout.setObjectName(u'SongBookLayout') - self.NameLabel = QtGui.QLabel(SongBookForm) + self.NameLabel = QtGui.QLabel(SongBookDialog) self.NameLabel.setObjectName(u'NameLabel') self.SongBookLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.NameLabel) - self.NameEdit = QtGui.QLineEdit(SongBookForm) + self.NameEdit = QtGui.QLineEdit(SongBookDialog) self.NameEdit.setObjectName(u'NameEdit') self.SongBookLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.NameEdit) - self.PublisherLabel = QtGui.QLabel(SongBookForm) + self.PublisherLabel = QtGui.QLabel(SongBookDialog) self.PublisherLabel.setObjectName(u'PublisherLabel') self.SongBookLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.PublisherLabel) - self.PublisherEdit = QtGui.QLineEdit(SongBookForm) + self.PublisherEdit = QtGui.QLineEdit(SongBookDialog) self.PublisherEdit.setObjectName(u'PublisherEdit') self.SongBookLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.PublisherEdit) - self.ButtonBox = QtGui.QDialogButtonBox(SongBookForm) + self.ButtonBox = QtGui.QDialogButtonBox(SongBookDialog) self.ButtonBox.setOrientation(QtCore.Qt.Horizontal) self.ButtonBox.setStandardButtons( QtGui.QDialogButtonBox.Save | QtGui.QDialogButtonBox.Cancel) @@ -58,14 +58,14 @@ class Ui_SongBookDialog(object): self.SongBookLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.ButtonBox) - self.retranslateUi(SongBookForm) + self.retranslateUi(SongBookDialog) QtCore.QObject.connect(self.ButtonBox, - QtCore.SIGNAL(u'accepted()'), SongBookForm.accept) + QtCore.SIGNAL(u'accepted()'), SongBookDialog.accept) QtCore.QObject.connect(self.ButtonBox, - QtCore.SIGNAL(u'rejected()'), SongBookForm.reject) - QtCore.QMetaObject.connectSlotsByName(SongBookForm) + QtCore.SIGNAL(u'rejected()'), SongBookDialog.reject) + QtCore.QMetaObject.connectSlotsByName(SongBookDialog) - def retranslateUi(self, SongBookForm): - SongBookForm.setWindowTitle(translate('SongBookForm', 'Edit Book')) + def retranslateUi(self, SongBookDialog): + SongBookDialog.setWindowTitle(translate('SongBookForm', 'Edit Book')) self.NameLabel.setText(translate('SongBookForm', 'Name:')) self.PublisherLabel.setText(translate('SongBookForm', 'Publisher:')) diff --git a/openlp/plugins/songs/forms/songmaintenancedialog.py b/openlp/plugins/songs/forms/songmaintenancedialog.py index ca4b5ec0e..a8751b132 100644 --- a/openlp/plugins/songs/forms/songmaintenancedialog.py +++ b/openlp/plugins/songs/forms/songmaintenancedialog.py @@ -28,15 +28,15 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, translate class Ui_SongMaintenanceDialog(object): - def setupUi(self, SongMaintenanceForm): - SongMaintenanceForm.setObjectName(u'SongMaintenanceDialog') - SongMaintenanceForm.setWindowModality(QtCore.Qt.ApplicationModal) - SongMaintenanceForm.resize(486, 361) - self.DialogLayout = QtGui.QVBoxLayout(SongMaintenanceForm) + def setupUi(self, SongMaintenanceDialog): + SongMaintenanceDialog.setObjectName(u'SongMaintenanceDialog') + SongMaintenanceDialog.setWindowModality(QtCore.Qt.ApplicationModal) + SongMaintenanceDialog.resize(486, 361) + self.DialogLayout = QtGui.QVBoxLayout(SongMaintenanceDialog) self.DialogLayout.setSpacing(8) self.DialogLayout.setMargin(8) self.DialogLayout.setObjectName(u'DialogLayout') - self.ContentWidget = QtGui.QWidget(SongMaintenanceForm) + self.ContentWidget = QtGui.QWidget(SongMaintenanceDialog) self.ContentWidget.setObjectName(u'ContentWidget') self.ContentLayout = QtGui.QHBoxLayout(self.ContentWidget) self.ContentLayout.setSpacing(8) @@ -192,23 +192,23 @@ class Ui_SongMaintenanceDialog(object): self.TypeStackedWidget.addWidget(self.BooksPage) self.ContentLayout.addWidget(self.TypeStackedWidget) self.DialogLayout.addWidget(self.ContentWidget) - self.MaintenanceButtonBox = QtGui.QDialogButtonBox(SongMaintenanceForm) + self.MaintenanceButtonBox = QtGui.QDialogButtonBox(SongMaintenanceDialog) self.MaintenanceButtonBox.setOrientation(QtCore.Qt.Horizontal) self.MaintenanceButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) self.MaintenanceButtonBox.setObjectName(u'MaintenanceButtonBox') self.DialogLayout.addWidget(self.MaintenanceButtonBox) - self.retranslateUi(SongMaintenanceForm) + self.retranslateUi(SongMaintenanceDialog) self.TypeStackedWidget.setCurrentIndex(0) QtCore.QObject.connect(self.MaintenanceButtonBox, - QtCore.SIGNAL(u'rejected()'), SongMaintenanceForm.accept) + QtCore.SIGNAL(u'rejected()'), SongMaintenanceDialog.accept) QtCore.QObject.connect(self.TypeListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.TypeStackedWidget.setCurrentIndex) - QtCore.QMetaObject.connectSlotsByName(SongMaintenanceForm) + QtCore.QMetaObject.connectSlotsByName(SongMaintenanceDialog) - def retranslateUi(self, SongMaintenanceForm): - SongMaintenanceForm.setWindowTitle(translate('SongMaintenanceForm', 'Song Maintenance')) + def retranslateUi(self, SongMaintenanceDialog): + SongMaintenanceDialog.setWindowTitle(translate('SongMaintenanceForm', 'Song Maintenance')) self.TypeListWidget.item(0).setText(translate('SongMaintenanceForm', 'Authors')) self.TypeListWidget.item(1).setText(translate('SongMaintenanceForm', 'Topics')) self.TypeListWidget.item(2).setText(translate('SongMaintenanceForm', 'Books/Hymnals')) diff --git a/openlp/plugins/songs/forms/topicsdialog.py b/openlp/plugins/songs/forms/topicsdialog.py index 559c24e12..a78d905f4 100644 --- a/openlp/plugins/songs/forms/topicsdialog.py +++ b/openlp/plugins/songs/forms/topicsdialog.py @@ -27,24 +27,24 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_TopicsDialog(object): - def setupUi(self, TopicsForm): - TopicsForm.setObjectName(u'TopicsDialog') - TopicsForm.resize(365, 77) - self.TopicLayout = QtGui.QFormLayout(TopicsForm) + def setupUi(self, TopicsDialog): + TopicsDialog.setObjectName(u'TopicsDialog') + TopicsDialog.resize(365, 77) + self.TopicLayout = QtGui.QFormLayout(TopicsDialog) self.TopicLayout.setFieldGrowthPolicy( QtGui.QFormLayout.ExpandingFieldsGrow) self.TopicLayout.setMargin(8) self.TopicLayout.setSpacing(8) self.TopicLayout.setObjectName(u'TopicLayout') - self.NameLabel = QtGui.QLabel(TopicsForm) + self.NameLabel = QtGui.QLabel(TopicsDialog) self.NameLabel.setObjectName(u'NameLabel') self.TopicLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.NameLabel) - self.NameEdit = QtGui.QLineEdit(TopicsForm) + self.NameEdit = QtGui.QLineEdit(TopicsDialog) self.NameEdit.setObjectName(u'NameEdit') self.TopicLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.NameEdit) - self.TopicButtonBox = QtGui.QDialogButtonBox(TopicsForm) + self.TopicButtonBox = QtGui.QDialogButtonBox(TopicsDialog) self.TopicButtonBox.setOrientation(QtCore.Qt.Horizontal) self.TopicButtonBox.setStandardButtons( QtGui.QDialogButtonBox.Save | QtGui.QDialogButtonBox.Cancel) @@ -52,13 +52,13 @@ class Ui_TopicsDialog(object): self.TopicLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.TopicButtonBox) - self.retranslateUi(TopicsForm) + self.retranslateUi(TopicsDialog) QtCore.QObject.connect(self.TopicButtonBox, - QtCore.SIGNAL(u'accepted()'), TopicsForm.accept) + QtCore.SIGNAL(u'accepted()'), TopicsDialog.accept) QtCore.QObject.connect(self.TopicButtonBox, - QtCore.SIGNAL(u'rejected()'), TopicsForm.reject) - QtCore.QMetaObject.connectSlotsByName(TopicsForm) + QtCore.SIGNAL(u'rejected()'), TopicsDialog.reject) + QtCore.QMetaObject.connectSlotsByName(TopicsDialog) - def retranslateUi(self, TopicsForm): - TopicsForm.setWindowTitle(translate('TopicsForm', 'Topic Maintenance')) + def retranslateUi(self, TopicsDialog): + TopicsDialog.setWindowTitle(translate('TopicsForm', 'Topic Maintenance')) self.NameLabel.setText(translate('TopicsForm', 'Topic name:')) diff --git a/openlp/plugins/songusage/forms/songusagedeletedialog.py b/openlp/plugins/songusage/forms/songusagedeletedialog.py index dc02965f5..02b7496b2 100644 --- a/openlp/plugins/songusage/forms/songusagedeletedialog.py +++ b/openlp/plugins/songusage/forms/songusagedeletedialog.py @@ -27,10 +27,10 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_SongUsageDeleteDialog(object): - def setupUi(self, AuditDeleteDialog): - AuditDeleteDialog.setObjectName(u'AuditDeleteDialog') - AuditDeleteDialog.resize(291, 243) - self.layoutWidget = QtGui.QWidget(AuditDeleteDialog) + def setupUi(self, SongUsageDeleteDialog): + SongUsageDeleteDialog.setObjectName(u'SongUsageDeleteDialog') + SongUsageDeleteDialog.resize(291, 243) + self.layoutWidget = QtGui.QWidget(SongUsageDeleteDialog) self.layoutWidget.setGeometry(QtCore.QRect(20, 10, 247, 181)) self.layoutWidget.setObjectName(u'layoutWidget') self.verticalLayout = QtGui.QVBoxLayout(self.layoutWidget) @@ -42,20 +42,20 @@ class Ui_SongUsageDeleteDialog(object): QtGui.QCalendarWidget.NoVerticalHeader) self.DeleteCalendar.setObjectName(u'DeleteCalendar') self.verticalLayout.addWidget(self.DeleteCalendar) - self.buttonBox = QtGui.QDialogButtonBox(AuditDeleteDialog) + self.buttonBox = QtGui.QDialogButtonBox(SongUsageDeleteDialog) self.buttonBox.setGeometry(QtCore.QRect(30, 210, 245, 25)) self.buttonBox.setStandardButtons( QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(u'buttonBox') - self.retranslateUi(AuditDeleteDialog) + self.retranslateUi(SongUsageDeleteDialog) QtCore.QObject.connect( self.buttonBox, QtCore.SIGNAL(u'accepted()'), - AuditDeleteDialog.accept) + SongUsageDeleteDialog.accept) QtCore.QObject.connect( self.buttonBox, QtCore.SIGNAL(u'rejected()'), - AuditDeleteDialog.close) - QtCore.QMetaObject.connectSlotsByName(AuditDeleteDialog) + SongUsageDeleteDialog.close) + QtCore.QMetaObject.connectSlotsByName(SongUsageDeleteDialog) - def retranslateUi(self, AuditDeleteDialog): - AuditDeleteDialog.setWindowTitle(translate('AuditDeleteDialog', 'Song Usage Delete')) + def retranslateUi(self, SongUsageDeleteDialog): + SongUsageDeleteDialog.setWindowTitle(translate('AuditDeleteDialog', 'Song Usage Delete')) diff --git a/openlp/plugins/songusage/forms/songusagedetaildialog.py b/openlp/plugins/songusage/forms/songusagedetaildialog.py index 9512a4278..9e25651ab 100644 --- a/openlp/plugins/songusage/forms/songusagedetaildialog.py +++ b/openlp/plugins/songusage/forms/songusagedetaildialog.py @@ -27,12 +27,12 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate class Ui_SongUsageDetailDialog(object): - def setupUi(self, AuditDetailDialog): - AuditDetailDialog.setObjectName(u'AuditDetailDialog') - AuditDetailDialog.resize(609, 413) - self.verticalLayout = QtGui.QVBoxLayout(AuditDetailDialog) + def setupUi(self, SongUsageDetailDialog): + SongUsageDetailDialog.setObjectName(u'SongUsageDetailDialog') + SongUsageDetailDialog.resize(609, 413) + self.verticalLayout = QtGui.QVBoxLayout(SongUsageDetailDialog) self.verticalLayout.setObjectName(u'verticalLayout') - self.DateRangeGroupBox = QtGui.QGroupBox(AuditDetailDialog) + self.DateRangeGroupBox = QtGui.QGroupBox(SongUsageDetailDialog) self.DateRangeGroupBox.setObjectName(u'DateRangeGroupBox') self.verticalLayout_2 = QtGui.QVBoxLayout(self.DateRangeGroupBox) self.verticalLayout_2.setObjectName(u'verticalLayout_2') @@ -69,25 +69,25 @@ class Ui_SongUsageDetailDialog(object): self.verticalLayout_4.addLayout(self.horizontalLayout) self.verticalLayout_2.addWidget(self.FileGroupBox) self.verticalLayout.addWidget(self.DateRangeGroupBox) - self.buttonBox = QtGui.QDialogButtonBox(AuditDetailDialog) + self.buttonBox = QtGui.QDialogButtonBox(SongUsageDetailDialog) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(u'buttonBox') self.verticalLayout.addWidget(self.buttonBox) - self.retranslateUi(AuditDetailDialog) + self.retranslateUi(SongUsageDetailDialog) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), - AuditDetailDialog.accept) + SongUsageDetailDialog.accept) QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), - AuditDetailDialog.close) + SongUsageDetailDialog.close) QtCore.QObject.connect(self.SaveFilePushButton, QtCore.SIGNAL(u'pressed()'), - AuditDetailDialog.defineOutputLocation) - QtCore.QMetaObject.connectSlotsByName(AuditDetailDialog) + SongUsageDetailDialog.defineOutputLocation) + QtCore.QMetaObject.connectSlotsByName(SongUsageDetailDialog) - def retranslateUi(self, AuditDetailDialog): - AuditDetailDialog.setWindowTitle(translate('AuditDetailDialog', 'Song Usage Extraction')) + def retranslateUi(self, SongUsageDetailDialog): + SongUsageDetailDialog.setWindowTitle(translate('AuditDetailDialog', 'Song Usage Extraction')) self.DateRangeGroupBox.setTitle(translate('AuditDetailDialog', 'Select Date Range')) self.ToLabel.setText(translate('AuditDetailDialog', 'to')) self.FileGroupBox.setTitle(translate('AuditDetailDialog', 'Report Location')) From 465ce8c7f78f9a0108a00f1b83bbe42bad416821 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Mon, 3 May 2010 22:49:42 +0100 Subject: [PATCH 20/81] web fixes, allow more file types. Slidecontroller_hide event --- openlp/core/ui/slidecontroller.py | 18 +++++++- .../presentations/lib/messagelistener.py | 17 ++++++++ openlp/plugins/remotes/html/index.html | 4 +- openlp/plugins/remotes/lib/httpserver.py | 43 +++++++++++++------ 4 files changed, 65 insertions(+), 17 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index c0d0d915f..4fa09d9ce 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -674,10 +674,10 @@ class SlideController(QtGui.QWidget): self.themeButton.setChecked(False) if checked: Receiver.send_message(u'maindisplay_hide', HideMode.Screen) - self.blankPlugin(True) + self.hidePlugin(True) else: Receiver.send_message(u'maindisplay_show') - self.blankPlugin(False) + self.hidePlugin(False) def blankPlugin(self, blank): """ @@ -693,6 +693,20 @@ class SlideController(QtGui.QWidget): % self.serviceItem.name.lower(), [self.serviceItem, self.isLive]) + def hidePlugin(self, hide): + """ + Blank the display screen. + """ + if self.serviceItem is not None: + if hide: + Receiver.send_message(u'%s_hide' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + else: + Receiver.send_message(u'%s_unblank' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + def onSlideSelected(self): """ Generate the preview when you click on a slide. diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index b15f25642..b5b6b6879 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -160,6 +160,16 @@ class Controller(object): return self.doc.blank_screen() + def stop(self): + log.debug(u'Live = %s, stop' % self.isLive) + if not self.isLive: + return + if not self.doc.is_loaded(): + return + if not self.doc.is_active(): + return + self.doc.stop_presentation() + def unblank(self): log.debug(u'Live = %s, unblank' % self.isLive) if not self.isLive: @@ -190,6 +200,8 @@ class MessageListener(object): QtCore.SIGNAL(u'presentations_start'), self.startup) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'presentations_stop'), self.shutdown) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'presentations_hide'), self.hide) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'presentations_first'), self.first) QtCore.QObject.connect(Receiver.get_receiver(), @@ -279,6 +291,11 @@ class MessageListener(object): else: self.previewHandler.shutdown() + def hide(self, message): + isLive, item = self.decode_message(message) + if isLive: + self.liveHandler.stop() + def blank(self, message): isLive, item = self.decode_message(message) if isLive: diff --git a/openlp/plugins/remotes/html/index.html b/openlp/plugins/remotes/html/index.html index 25b08fd43..13fc6d094 100644 --- a/openlp/plugins/remotes/html/index.html +++ b/openlp/plugins/remotes/html/index.html @@ -63,7 +63,7 @@ function response(eventname, req){ html += ' style="font-weight: bold"'; html += '>'; html += '' + data[row]['tag'] + ''; - html += '' + data[row]['text'].replace(/\\n/g, '
    '); + html += '' + data[row]['text'].replace(/\n/g, '
    '); html += ''; } html += ''; @@ -105,10 +105,12 @@ send_event("remotes_poll_request");