diff --git a/documentation/source/index.rst b/documentation/source/index.rst index 25fc13758..cd64b13a1 100644 --- a/documentation/source/index.rst +++ b/documentation/source/index.rst @@ -17,7 +17,6 @@ Contents: openlp core/index - migration/index plugins/index Indices and tables diff --git a/documentation/source/migration/index.rst b/documentation/source/migration/index.rst deleted file mode 100644 index a1a64abc8..000000000 --- a/documentation/source/migration/index.rst +++ /dev/null @@ -1,32 +0,0 @@ -.. _migration-index: - -:mod:`migration` Module -======================= - -.. automodule:: openlp.migration - :members: - -:mod:`display` Submodule ------------------------- - -.. automodule:: openlp.migration.display - :members: - -:mod:`migratebibles` Submodule ------------------------------- - -.. automodule:: openlp.migration.migratebibles - :members: - -:mod:`migratefiles` Submodule ------------------------------ - -.. automodule:: openlp.migration.migratefiles - :members: - -:mod:`migratesongs` Submodule ------------------------------ - -.. automodule:: openlp.migration.migratesongs - :members: - diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 40557d446..5a4d3f5b3 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -52,9 +52,10 @@ def translate(context, text, comment=None): def get_text_file_string(text_file): """ - Open a file and return the contents of the file. If the supplied file name - is not a file then the function returns False. If there is an error - loading the file then the function will return None. + Open a file and return its content as unicode string. If the supplied file + name is not a file then the function returns False. If there is an error + loading the file or the content can't be decoded then the function will + return None. ``textfile`` The name of the file. @@ -65,8 +66,9 @@ def get_text_file_string(text_file): content_string = None try: file_handle = open(text_file, u'r') - content_string = file_handle.read() - except IOError: + content = file_handle.read() + content_string = content.decode(u'utf-8') + except (IOError, UnicodeError): log.exception(u'Failed to open text file %s' % text_file) finally: if file_handle: @@ -95,11 +97,10 @@ def build_icon(icon): The icon to build. This can be a QIcon, a resource string in the form ``:/resource/file.png``, or a file location like ``/path/to/file.png``. """ - button_icon = None + button_icon = QtGui.QIcon() if isinstance(icon, QtGui.QIcon): button_icon = icon elif isinstance(icon, basestring): - button_icon = QtGui.QIcon() if icon.startswith(u':/'): button_icon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -107,7 +108,6 @@ def build_icon(icon): button_icon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), QtGui.QIcon.Normal, QtGui.QIcon.Off) elif isinstance(icon, QtGui.QImage): - button_icon = QtGui.QIcon() button_icon.addPixmap(QtGui.QPixmap.fromImage(icon), QtGui.QIcon.Normal, QtGui.QIcon.Off) return button_icon diff --git a/openlp/core/lib/themexmlhandler.py b/openlp/core/lib/themexmlhandler.py index a6d1ec186..b2850d6ec 100644 --- a/openlp/core/lib/themexmlhandler.py +++ b/openlp/core/lib/themexmlhandler.py @@ -96,9 +96,8 @@ class ThemeXML(object): The path name to be added. """ if self.background_filename and path: - self.theme_name = self.theme_name.rstrip().lstrip() - self.background_filename = \ - self.background_filename.rstrip().lstrip() + self.theme_name = self.theme_name.strip() + self.background_filename = self.background_filename.strip() self.background_filename = os.path.join(path, self.theme_name, self.background_filename) @@ -334,13 +333,13 @@ class ThemeXML(object): Pull out the XML string. """ # Print our newly created XML - return self.theme_xml.toxml() + return self.theme_xml.toxml(u'utf-8').decode(u'utf-8') def extract_formatted_xml(self): """ Pull out the XML string formatted for human consumption """ - return self.theme_xml.toprettyxml(indent=u' ', newl=u'\n') + return self.theme_xml.toprettyxml(indent=u' ', newl=u'\n', encoding=u'utf-8') def parse(self, xml): """ @@ -365,11 +364,12 @@ class ThemeXML(object): ``xml`` The XML string to parse. """ - theme_xml = ElementTree(element=XML(xml)) + theme_xml = ElementTree(element=XML(xml.encode(u'ascii', u'xmlcharrefreplace'))) xml_iter = theme_xml.getiterator() master = u'' for element in xml_iter: - element.text = unicode(element.text).decode('unicode-escape') + if not isinstance(element.text, unicode): + element.text = unicode(str(element.text), u'utf-8') if element.getchildren(): master = element.tag + u'_' else: diff --git a/openlp/core/lib/toolbar.py b/openlp/core/lib/toolbar.py index 799852908..b2b05b8c0 100644 --- a/openlp/core/lib/toolbar.py +++ b/openlp/core/lib/toolbar.py @@ -72,9 +72,6 @@ class OpenLPToolbar(QtGui.QToolBar): ToolbarButton = None if icon: ButtonIcon = build_icon(icon) - else: - ButtonIcon = None - if ButtonIcon: if slot and not checkable: ToolbarButton = self.addAction(ButtonIcon, title, slot) else: diff --git a/openlp/core/theme/theme.py b/openlp/core/theme/theme.py index 75a2ddd85..b75b55a2e 100644 --- a/openlp/core/theme/theme.py +++ b/openlp/core/theme/theme.py @@ -175,7 +175,7 @@ class Theme(object): ``xml`` The data to apply to the theme """ - root = ElementTree(element=XML(xml)) + root = ElementTree(element=XML(xml.encode(u'ascii', u'xmlcharrefreplace'))) xml_iter = root.getiterator() for element in xml_iter: delphi_color_change = False diff --git a/openlp/core/ui/aboutdialog.py b/openlp/core/ui/aboutdialog.py index 90a67667e..c6866c8d7 100644 --- a/openlp/core/ui/aboutdialog.py +++ b/openlp/core/ui/aboutdialog.py @@ -114,451 +114,451 @@ class Ui_AboutDialog(object): QtCore.QMetaObject.connectSlotsByName(AboutDialog) def retranslateUi(self, AboutDialog): - AboutDialog.setWindowTitle(translate(u'AboutForm', u'About OpenLP')) - self.AboutTextEdit.setPlainText(translate(u'AboutForm', - u'OpenLP - Open Source Lyrics ' - u'Projection\n' - u'\n' - u'OpenLP is free church presentation software, or lyrics ' - u'projection software, used to display slides of songs, Bible ' - u'verses, videos, images, and even presentations (if ' - u'OpenOffice.org, PowerPoint or PowerPoint Viewer is installed) ' - u'for church worship using a computer and a data projector.\n' - u'\n' - u'Find out more about OpenLP: http://openlp.org/\n' - u'\n' - u'OpenLP is written and maintained by volunteers. If you would ' - u'like to see more free Christian software being written, please ' - u'consider contributing by using the button below.' + AboutDialog.setWindowTitle(translate('AboutForm', 'About OpenLP')) + self.AboutTextEdit.setPlainText(translate('AboutForm', + 'OpenLP - Open Source Lyrics ' + 'Projection\n' + '\n' + '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.\n' + '\n' + 'Find out more about OpenLP: http://openlp.org/\n' + '\n' + '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.' )) self.AboutNotebook.setTabText( self.AboutNotebook.indexOf(self.AboutTab), - translate(u'AboutForm', u'About')) - self.CreditsTextEdit.setPlainText(translate(u'AboutForm', - u'Project Lead\n' - u' Raoul "superfly" Snyman\n' - u'\n' - u'Developers\n' - u' Tim "TRB143" Bentley\n' - u' Jonathan "gushie" Corwin\n' - u' Michael "cocooncrash" Gorven\n' - u' Scott "sguerrieri" Guerrieri\n' - u' Raoul "superfly" Snyman\n' - u' Martin "mijiti" Thompson\n' - u' Jon "Meths" Tibble\n' - u'\n' - u'Contributors\n' - u' Meinert "m2j" Jordan\n' - u' Christian "crichter" Richter\n' - u' Maikel Stuivenberg\n' - u' Carsten "catini" Tingaard\n' - u'\n' - u'Testers\n' - u' Philip "Phill" Ridout\n' - u' Wesley "wrst" Stout (lead)\n' - u'\n' - u'Packagers\n' - u' Thomas "tabthorpe" Abthorpe (FreeBSD)\n' - u' Tim "TRB143" Bentley (Fedora)\n' - u' Michael "cocooncrash" Gorven (Ubuntu)\n' - u' Matthias "matthub" Hub (Mac OS X)\n' - u' Raoul "superfly" Snyman (Windows)\n' + translate('AboutForm', 'About')) + self.CreditsTextEdit.setPlainText(translate('AboutForm', + 'Project Lead\n' + ' Raoul "superfly" Snyman\n' + '\n' + 'Developers\n' + ' Tim "TRB143" Bentley\n' + ' Jonathan "gushie" Corwin\n' + ' Michael "cocooncrash" Gorven\n' + ' Scott "sguerrieri" Guerrieri\n' + ' Raoul "superfly" Snyman\n' + ' Martin "mijiti" Thompson\n' + ' Jon "Meths" Tibble\n' + '\n' + 'Contributors\n' + ' Meinert "m2j" Jordan\n' + ' Christian "crichter" Richter\n' + ' Maikel Stuivenberg\n' + ' Carsten "catini" Tingaard\n' + '\n' + 'Testers\n' + ' Philip "Phill" Ridout\n' + ' Wesley "wrst" Stout (lead)\n' + '\n' + 'Packagers\n' + ' Thomas "tabthorpe" Abthorpe (FreeBSD)\n' + ' Tim "TRB143" Bentley (Fedora)\n' + ' Michael "cocooncrash" Gorven (Ubuntu)\n' + ' Matthias "matthub" Hub (Mac OS X)\n' + ' Raoul "superfly" Snyman (Windows)\n' )) self.AboutNotebook.setTabText( self.AboutNotebook.indexOf(self.CreditsTab), - translate(u'AboutForm', u'Credits')) - self.LicenseTextEdit.setPlainText(translate(u'AboutForm', - u'Copyright \xa9 2004-2010 Raoul Snyman\n' - u'Portions copyright \xa9 2004-2010 ' - u'Tim Bentley, Jonathan Corwin, Michael Gorven, Scott Guerrieri, ' - u'Christian Richter, Maikel Stuivenberg, Martin Thompson, Jon ' - u'Tibble, Carsten Tinggaard\n' - u'\n' - u'This program is free software; you can redistribute it and/or ' - u'modify it under the terms of the GNU General Public License as ' - u'published by the Free Software Foundation; version 2 of the ' - u'License.\n' - u'\n' - u'This program is distributed in the hope that it will be useful, ' - u'but WITHOUT ANY WARRANTY; without even the implied warranty of ' - u'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See below ' - u'for more details.\n' - u'\n' - u'\n' - u'GNU GENERAL PUBLIC LICENSE\n' - u'Version 2, June 1991\n' - u'\n' - u'Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 ' - u'Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. ' - u'Everyone is permitted to copy and distribute verbatim copies of ' - u'this license document, but changing it is not allowed.\n' - u'\n' - u'Preamble\n' - u'\n' - u'The licenses for most software are designed to take away your ' - u'freedom to share and change it. By contrast, the GNU General ' - u'Public License is intended to guarantee your freedom to share ' - u'and change free software--to make sure the software is free for ' - u'all its users. This General Public License applies to most of ' - u'the Free Software Foundation\'s software and to any other ' - u'program whose authors commit to using it. (Some other Free ' - u'Software Foundation software is covered by the GNU Lesser ' - u'General Public License instead.) You can apply it to your ' - u'programs, too.\n' - u'\n' - u'When we speak of free software, we are referring to freedom, not ' - u'price. Our General Public Licenses are designed to make sure ' - u'that you have the freedom to distribute copies of free software ' - u'(and charge for this service if you wish), that you receive ' - u'source code or can get it if you want it, that you can change ' - u'the software or use pieces of it in new free programs; and that ' - u'you know you can do these things.\n' - u'\n' - u'To protect your rights, we need to make restrictions that forbid ' - u'anyone to deny you these rights or to ask you to surrender the ' - u'rights. These restrictions translate to certain responsibilities ' - u'for you if you distribute copies of the software, or if you ' - u'modify it.\n' - u'\n' - u'For example, if you distribute copies of such a program, whether ' - u'gratis or for a fee, you must give the recipients all the rights ' - u'that you have. You must make sure that they, too, receive or ' - u'can get the source code. And you must show them these terms so ' - u'they know their rights.\n' - u'\n' - u'We protect your rights with two steps: (1) copyright the ' - u'software, and (2) offer you this license which gives you legal ' - u'permission to copy, distribute and/or modify the software.\n' - u'\n' - u'Also, for each author\'s protection and ours, we want to make ' - u'certain that everyone understands that there is no warranty for ' - u'this free software. If the software is modified by someone else ' - u'and passed on, we want its recipients to know that what they ' - u'have is not the original, so that any problems introduced by ' - u'others will not reflect on the original authors\' reputations.\n' - u'\n' - u'Finally, any free program is threatened constantly by software ' - u'patents. We wish to avoid the danger that redistributors of a ' - u'free program will individually obtain patent licenses, in effect ' - u'making the program proprietary. To prevent this, we have made ' - u'it clear that any patent must be licensed for everyone\'s free ' - u'use or not licensed at all.\n' - u'\n' - u'The precise terms and conditions for copying, distribution and ' - u'modification follow.\n' - u'\n' - u'GNU GENERAL PUBLIC LICENSE\n' - u'TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n' - u'\n' - u'0. This License applies to any program or other work which ' - u'contains a notice placed by the copyright holder saying it may ' - u'be distributed under the terms of this General Public License. ' - u'The "Program", below, refers to any such program or work, and a ' - u'"work based on the Program" means either the Program or any ' - u'derivative work under copyright law: that is to say, a work ' - u'containing the Program or a portion of it, either verbatim or ' - u'with modifications and/or translated into another language. ' - u'(Hereinafter, translation is included without limitation in the ' - u'term "modification".) Each licensee is addressed as "you".\n' - u'\n' - u'Activities other than copying, distribution and modification are ' - u'not covered by this License; they are outside its scope. The ' - u'act of running the Program is not restricted, and the output ' - u'from the Program is covered only if its contents constitute a ' - u'work based on the Program (independent of having been made by ' - u'running the Program). Whether that is true depends on what the ' - u'Program does.\n' - u'\n' - u'1. You may copy and distribute verbatim copies of the Program\'s ' - u'source code as you receive it, in any medium, provided that you ' - u'conspicuously and appropriately publish on each copy an ' - u'appropriate copyright notice and disclaimer of warranty; keep ' - u'intact all the notices that refer to this License and to the ' - u'absence of any warranty; and give any other recipients of the ' - u'Program a copy of this License along with the Program.\n' - u'\n' - u'You may charge a fee for the physical act of transferring a ' - u'copy, and you may at your option offer warranty protection in ' - u'exchange for a fee.\n' - u'\n' - u'2. You may modify your copy or copies of the Program or any ' - u'portion of it, thus forming a work based on the Program, and ' - u'copy and distribute such modifications or work under the terms ' - u'of Section 1 above, provided that you also meet all of these ' - u'conditions:\n' - u'\n' - u'a) You must cause the modified files to carry prominent notices ' - u'stating that you changed the files and the date of any change.\n' - u'\n' - u'b) You must cause any work that you distribute or publish, that ' - u'in whole or in part contains or is derived from the Program or ' - u'any part thereof, to be licensed as a whole at no charge to all ' - u'third parties under the terms of this License.\n' - u'\n' - u'c) If the modified program normally reads commands interactively ' - u'when run, you must cause it, when started running for such ' - u'interactive use in the most ordinary way, to print or display an ' - u'announcement including an appropriate copyright notice and a ' - u'notice that there is no warranty (or else, saying that you ' - u'provide a warranty) and that users may redistribute the program ' - u'under these conditions, and telling the user how to view a copy ' - u'of this License. (Exception: if the Program itself is ' - u'interactive but does not normally print such an announcement, ' - u'your work based on the Program is not required to print an ' - u'announcement.)\n' - u'\n' - u'These requirements apply to the modified work as a whole. If ' - u'identifiable sections of that work are not derived from the ' - u'Program, and can be reasonably considered independent and ' - u'separate works in themselves, then this License, and its terms, ' - u'do not apply to those sections when you distribute them as ' - u'separate works. But when you distribute the same sections as ' - u'part of a whole which is a work based on the Program, the ' - u'distribution of the whole must be on the terms of this License, ' - u'whose permissions for other licensees extend to the entire ' - u'whole, and thus to each and every part regardless of who wrote ' - u'it.\n' - u'\n' - u'Thus, it is not the intent of this section to claim rights or ' - u'contest your rights to work written entirely by you; rather, the ' - u'intent is to exercise the right to control the distribution of ' - u'derivative or collective works based on the Program.\n' - u'\n' - u'In addition, mere aggregation of another work not based on the ' - u'Program with the Program (or with a work based on the Program) ' - u'on a volume of a storage or distribution medium does not bring ' - u'the other work under the scope of this License.\n' - u'\n' - u'3. You may copy and distribute the Program (or a work based on ' - u'it, under Section 2) in object code or executable form under the ' - u'terms of Sections 1 and 2 above provided that you also do one of ' - u'the following:\n' - u'\n' - u'a) Accompany it with the complete corresponding machine-readable ' - u'source code, which must be distributed under the terms of ' - u'Sections 1 and 2 above on a medium customarily used for software ' - u'interchange; or,\n' - u'\n' - u'b) Accompany it with a written offer, valid for at least three ' - u'years, to give any third party, for a charge no more than your ' - u'cost of physically performing source distribution, a complete ' - u'machine-readable copy of the corresponding source code, to be ' - u'distributed under the terms of Sections 1 and 2 above on a ' - u'medium customarily used for software interchange; or,\n' - u'\n' - u'c) Accompany it with the information you received as to the ' - u'offer to distribute corresponding source code. (This ' - u'alternative is allowed only for noncommercial distribution and ' - u'only if you received the program in object code or executable ' - u'form with such an offer, in accord with Subsection b above.)\n' - u'\n' - u'The source code for a work means the preferred form of the work ' - u'for making modifications to it. For an executable work, ' - u'complete source code means all the source code for all modules ' - u'it contains, plus any associated interface definition files, ' - u'plus the scripts used to control compilation and installation of ' - u'the executable. However, as a special exception, the source ' - u'code distributed need not include anything that is normally ' - u'distributed (in either source or binary form) with the major ' - u'components (compiler, kernel, and so on) of the operating system ' - u'on which the executable runs, unless that component itself ' - u'accompanies the executable.\n' - u'\n' - u'If distribution of executable or object code is made by offering ' - u'access to copy from a designated place, then offering equivalent ' - u'access to copy the source code from the same place counts as ' - u'distribution of the source code, even though third parties are ' - u'not compelled to copy the source along with the object code.\n' - u'\n' - u'4. You may not copy, modify, sublicense, or distribute the ' - u'Program except as expressly provided under this License. Any ' - u'attempt otherwise to copy, modify, sublicense or distribute the ' - u'Program is void, and will automatically terminate your rights ' - u'under this License. However, parties who have received copies, ' - u'or rights, from you under this License will not have their ' - u'licenses terminated so long as such parties remain in full ' - u'compliance.\n' - u'\n' - u'5. You are not required to accept this License, since you have ' - u'not signed it. However, nothing else grants you permission to ' - u'modify or distribute the Program or its derivative works. These ' - u'actions are prohibited by law if you do not accept this ' - u'License. Therefore, by modifying or distributing the Program ' - u'(or any work based on the Program), you indicate your acceptance ' - u'of this License to do so, and all its terms and conditions for ' - u'copying, distributing or modifying the Program or works based on ' - u'it.\n' - u'\n' - u'6. Each time you redistribute the Program (or any work based on ' - u'the Program), the recipient automatically receives a license ' - u'from the original licensor to copy, distribute or modify the ' - u'Program subject to these terms and conditions. You may not ' - u'impose any further restrictions on the recipients\' exercise of ' - u'the rights granted herein. You are not responsible for enforcing ' - u'compliance by third parties to this License.\n' - u'\n' - u'7. If, as a consequence of a court judgment or allegation of ' - u'patent infringement or for any other reason (not limited to ' - u'patent issues), conditions are imposed on you (whether by court ' - u'order, agreement or otherwise) that contradict the conditions of ' - u'this License, they do not excuse you from the conditions of this ' - u'License. If you cannot distribute so as to satisfy ' - u'simultaneously your obligations under this License and any other ' - u'pertinent obligations, then as a consequence you may not ' - u'distribute the Program at all. For example, if a patent license ' - u'would not permit royalty-free redistribution of the Program by ' - u'all those who receive copies directly or indirectly through you, ' - u'then the only way you could satisfy both it and this License ' - u'would be to refrain entirely from distribution of the Program.\n' - u'\n' - u'If any portion of this section is held invalid or unenforceable ' - u'under any particular circumstance, the balance of the section is ' - u'intended to apply and the section as a whole is intended to ' - u'apply in other circumstances.\n' - u'\n' - u'It is not the purpose of this section to induce you to infringe ' - u'any patents or other property right claims or to contest ' - u'validity of any such claims; this section has the sole purpose ' - u'of protecting the integrity of the free software distribution ' - u'system, which is implemented by public license practices. Many ' - u'people have made generous contributions to the wide range of ' - u'software distributed through that system in reliance on ' - u'consistent application of that system; it is up to the ' - u'author/donor to decide if he or she is willing to distribute ' - u'software through any other system and a licensee cannot impose ' - u'that choice.\n' - u'\n' - u'This section is intended to make thoroughly clear what is ' - u'believed to be a consequence of the rest of this License.\n' - u'\n' - u'8. If the distribution and/or use of the Program is restricted ' - u'in certain countries either by patents or by copyrighted ' - u'interfaces, the original copyright holder who places the Program ' - u'under this License may add an explicit geographical distribution ' - u'limitation excluding those countries, so that distribution is ' - u'permitted only in or among countries not thus excluded. In such ' - u'case, this License incorporates the limitation as if written in ' - u'the body of this License.\n' - u'\n' - u'9. The Free Software Foundation may publish revised and/or new ' - u'versions of the General Public License from time to time. Such ' - u'new versions will be similar in spirit to the present version, ' - u'but may differ in detail to address new problems or concerns.\n' - u'\n' - u'Each version is given a distinguishing version number. If the ' - u'Program specifies a version number of this License which applies ' - u'to it and \"any later version\', you have the option of ' - u'following the terms and conditions either of that version or of ' - u'any later version published by the Free Software Foundation. If ' - u'the Program does not specify a version number of this License, ' - u'you may choose any version ever published by the Free Software ' - u'Foundation.\n' - u'\n' - u'10. If you wish to incorporate parts of the Program into other ' - u'free programs whose distribution conditions are different, write ' - u'to the author to ask for permission. For software which is ' - u'copyrighted by the Free Software Foundation, write to the Free ' - u'Software Foundation; we sometimes make exceptions for this. Our ' - u'decision will be guided by the two goals of preserving the free ' - u'status of all derivatives of our free software and of promoting ' - u'the sharing and reuse of software generally.\n' - u'\n' - u'NO WARRANTY\n' - u'\n' - u'11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO ' - u'WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE ' - u'LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT ' - u'HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT ' - u'WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, ' - u'BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY ' - u'AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE ' - u'QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE ' - u'PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY ' - u'SERVICING, REPAIR OR CORRECTION.\n' - u'\n' - u'12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO ' - u'IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY ' - u'MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE ' - u'LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, ' - u'INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR ' - u'INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS ' - u'OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY ' - u'YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ' - u'ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ' - u'ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.\n' - u'\n' - u'END OF TERMS AND CONDITIONS\n' - u'\n' - u'How to Apply These Terms to Your New Programs\n' - u'\n' - u'If you develop a new program, and you want it to be of the ' - u'greatest possible use to the public, the best way to achieve ' - u'this is to make it free software which everyone can redistribute ' - u'and change under these terms.\n' - u'\n' - u'To do so, attach the following notices to the program. It is ' - u'safest to attach them to the start of each source file to most ' - u'effectively convey the exclusion of warranty; and each file ' - u'should have at least the "copyright" line and a pointer to where ' - u'the full notice is found.\n' - u'\n' - u'\n' - u'Copyright (C) \n' - u'\n' - u'This program is free software; you can redistribute it and/or ' - u'modify it under the terms of the GNU General Public License as ' - u'published by the Free Software Foundation; either version 2 of ' - u'the License, or (at your option) any later version.\n' - u'\n' - u'This program is distributed in the hope that it will be useful, ' - u'but WITHOUT ANY WARRANTY; without even the implied warranty of ' - u'MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ' - u'GNU General Public License for more details.\n' - u'\n' - u'You should have received a copy of the GNU General Public ' - u'License along with this program; if not, write to the Free ' - u'Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ' - u'Boston, MA 02110-1301 USA.\n' - u'\n' - u'Also add information on how to contact you by electronic and ' - u'paper mail.\n' - u'\n' - u'If the program is interactive, make it output a short notice ' - u'like this when it starts in an interactive mode:\n' - u'\n' - u'Gnomovision version 69, Copyright (C) year name of author\n' - u'Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type ' - u'"show w".\n' - u'This is free software, and you are welcome to redistribute it ' - u'under certain conditions; type "show c" for details.\n' - u'\n' - u'The hypothetical commands "show w" and "show c" should show ' - u'the appropriate parts of the General Public License. Of course, ' - u'the commands you use may be called something other than "show ' - u'w" and "show c"; they could even be mouse-clicks or menu items--' - u'whatever suits your program.\n' - u'\n' - u'You should also get your employer (if you work as a programmer) ' - u'or your school, if any, to sign a "copyright disclaimer" for the ' - u'program, if necessary. Here is a sample; alter the names:\n' - u'\n' - u'Yoyodyne, Inc., hereby disclaims all copyright interest in the ' - u'program "Gnomovision" (which makes passes at compilers) written ' - u'by James Hacker.\n' - u'\n' - u', 1 April 1989\n' - u'Ty Coon, President of Vice\n' - u'\n' - u'This General Public License does not permit incorporating your ' - u'program into proprietary programs. If your program is a ' - u'subroutine library, you may consider it more useful to permit ' - u'linking proprietary applications with the library. If this is ' - u'what you want to do, use the GNU Lesser General Public License ' - u'instead of this License.')) + translate('AboutForm', 'Credits')) + self.LicenseTextEdit.setPlainText(translate('AboutForm', + '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 ' + 'Tibble, Carsten Tinggaard\n' + '\n' + 'This program is 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.\n' + '\n' + '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.\n' + '\n' + '\n' + 'GNU GENERAL PUBLIC LICENSE\n' + 'Version 2, June 1991\n' + '\n' + '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.\n' + '\n' + 'Preamble\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + 'The precise terms and conditions for copying, distribution and ' + 'modification follow.\n' + '\n' + 'GNU GENERAL PUBLIC LICENSE\n' + 'TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n' + '\n' + '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".\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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:\n' + '\n' + 'a) You must cause the modified files to carry prominent notices ' + 'stating that you changed the files and the date of any change.\n' + '\n' + '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.\n' + '\n' + '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.)\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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:\n' + '\n' + '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,\n' + '\n' + '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,\n' + '\n' + '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.)\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + 'This section is intended to make thoroughly clear what is ' + 'believed to be a consequence of the rest of this License.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + 'NO WARRANTY\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + 'END OF TERMS AND CONDITIONS\n' + '\n' + 'How to Apply These Terms to Your New Programs\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + '\n' + 'Copyright (C) \n' + '\n' + 'This program is 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.\n' + '\n' + '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.\n' + '\n' + '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.\n' + '\n' + 'Also add information on how to contact you by electronic and ' + 'paper mail.\n' + '\n' + 'If the program is interactive, make it output a short notice ' + 'like this when it starts in an interactive mode:\n' + '\n' + 'Gnomovision version 69, Copyright (C) year name of author\n' + 'Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type ' + '"show w".\n' + 'This is free software, and you are welcome to redistribute it ' + 'under certain conditions; type "show c" for details.\n' + '\n' + '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.\n' + '\n' + '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:\n' + '\n' + 'Yoyodyne, Inc., hereby disclaims all copyright interest in the ' + 'program "Gnomovision" (which makes passes at compilers) written ' + 'by James Hacker.\n' + '\n' + ', 1 April 1989\n' + 'Ty Coon, President of Vice\n' + '\n' + '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.')) self.AboutNotebook.setTabText( self.AboutNotebook.indexOf(self.LicenseTab), - translate(u'AboutForm', u'License')) - self.ContributeButton.setText(translate(u'AboutForm', u'Contribute')) - self.CloseButton.setText(translate(u'AboutForm', u'Close')) + translate('AboutForm', 'License')) + self.ContributeButton.setText(translate('AboutForm', 'Contribute')) + self.CloseButton.setText(translate('AboutForm', 'Close')) diff --git a/openlp/core/ui/aboutform.py b/openlp/core/ui/aboutform.py index 4f9519eb8..8370ad09e 100644 --- a/openlp/core/ui/aboutform.py +++ b/openlp/core/ui/aboutform.py @@ -44,7 +44,7 @@ class AboutForm(QtGui.QDialog, Ui_AboutDialog): about_text = about_text.replace(u'', self.applicationVersion[u'version']) if self.applicationVersion[u'build']: - build_text = unicode(translate(u'AboutForm', u' build %s')) % \ + build_text = unicode(translate('AboutForm', ' build %s')) % \ self.applicationVersion[u'build'] else: build_text = u'' diff --git a/openlp/core/ui/amendthemedialog.py b/openlp/core/ui/amendthemedialog.py index 142592d88..b736a740c 100644 --- a/openlp/core/ui/amendthemedialog.py +++ b/openlp/core/ui/amendthemedialog.py @@ -750,158 +750,153 @@ class Ui_AmendThemeDialog(object): def retranslateUi(self, AmendThemeDialog): AmendThemeDialog.setWindowTitle( - translate(u'AmendThemeForm', u'Theme Maintenance')) + translate('AmendThemeForm', 'Theme Maintenance')) self.ThemeNameLabel.setText( - translate(u'AmendThemeForm', u'Theme Name:')) + translate('AmendThemeForm', 'Theme Name:')) self.BackgroundLabel.setText( - translate(u'AmendThemeForm', u'Background:')) + translate('AmendThemeForm', 'Visibility:')) self.BackgroundComboBox.setItemText(0, - translate(u'AmendThemeForm', u'Opaque')) + translate('AmendThemeForm', 'Opaque')) self.BackgroundComboBox.setItemText(1, - translate(u'AmendThemeForm', u'Transparent')) + translate('AmendThemeForm', 'Transparent')) self.BackgroundTypeLabel.setText( - translate(u'AmendThemeForm', u'Background Type:')) + translate('AmendThemeForm', 'Type:')) self.BackgroundTypeComboBox.setItemText(0, - translate(u'AmendThemeForm', u'Solid Color')) + translate('AmendThemeForm', 'Solid Color')) self.BackgroundTypeComboBox.setItemText(1, - translate(u'AmendThemeForm', u'Gradient')) + translate('AmendThemeForm', 'Gradient')) self.BackgroundTypeComboBox.setItemText(2, - translate(u'AmendThemeForm', u'Image')) - self.Color1Label.setText(translate(u'AmendThemeForm', u'')) - self.Color2Label.setText(translate(u'AmendThemeForm', u'')) - self.ImageLabel.setText(translate(u'AmendThemeForm', u'Image:')) - self.GradientLabel.setText(translate(u'AmendThemeForm', u'Gradient :')) + translate('AmendThemeForm', 'Image')) + self.Color1Label.setText(u':') + self.Color2Label.setText(u':') + self.ImageLabel.setText(translate('AmendThemeForm', 'Image:')) + self.GradientLabel.setText(translate('AmendThemeForm', 'Gradient:')) self.GradientComboBox.setItemText(0, - translate(u'AmendThemeForm', u'Horizontal')) + translate('AmendThemeForm', 'Horizontal')) self.GradientComboBox.setItemText(1, - translate(u'AmendThemeForm', u'Vertical')) + translate('AmendThemeForm', 'Vertical')) self.GradientComboBox.setItemText(2, - translate(u'AmendThemeForm', u'Circular')) + translate('AmendThemeForm', 'Circular')) self.ThemeTabWidget.setTabText( self.ThemeTabWidget.indexOf(self.BackgroundTab), - translate(u'AmendThemeForm', u'Background')) + translate('AmendThemeForm', '&Background')) self.FontMainGroupBox.setTitle( - translate(u'AmendThemeForm', u'Main Font')) - self.FontMainlabel.setText(translate(u'AmendThemeForm', u'Font:')) + translate('AmendThemeForm', 'Main Font')) + self.FontMainlabel.setText(translate('AmendThemeForm', 'Font:')) self.FontMainColorLabel.setText( - translate(u'AmendThemeForm', u'Font Color:')) - self.FontMainSize.setText(translate(u'AmendThemeForm', u'Size:')) - self.FontMainSizeSpinBox.setSuffix(translate(u'AmendThemeForm', u'pt')) + translate('AmendThemeForm', 'Color:')) + self.FontMainSize.setText(translate('AmendThemeForm', 'Size:')) + self.FontMainSizeSpinBox.setSuffix(translate('AmendThemeForm', 'pt')) self.FontMainWrapIndentationLabel.setText( - translate(u'AmendThemeForm', u'Wrap Indentation')) + translate('AmendThemeForm', 'Wrap indentation:')) self.FontMainWrapLineAdjustmentLabel.setText( - translate(u'AmendThemeForm', u'Adjust Line Spacing')) + translate('AmendThemeForm', 'Adjust line spacing:')) self.FontMainWeightComboBox.setItemText(0, - translate(u'AmendThemeForm', u'Normal')) + translate('AmendThemeForm', 'Normal')) self.FontMainWeightComboBox.setItemText(1, - translate(u'AmendThemeForm', u'Bold')) + translate('AmendThemeForm', 'Bold')) self.FontMainWeightComboBox.setItemText(2, - translate(u'AmendThemeForm', u'Italics')) + translate('AmendThemeForm', 'Italics')) self.FontMainWeightComboBox.setItemText(3, - translate(u'AmendThemeForm', u'Bold/Italics')) + translate('AmendThemeForm', 'Bold/Italics')) self.FontMainWeightLabel.setText( - translate(u'AmendThemeForm', u'Font Weight:')) + translate('AmendThemeForm', 'Style:')) self.MainLocationGroupBox.setTitle( - translate(u'AmendThemeForm', u'Display Location')) + translate('AmendThemeForm', 'Display Location')) self.DefaultLocationLabel.setText( - translate(u'AmendThemeForm', u'Use Default Location:')) + translate('AmendThemeForm', 'Use default location:')) self.FontMainXLabel.setText( - translate(u'AmendThemeForm', u'X Position:')) + translate('AmendThemeForm', 'X position:')) self.FontMainYLabel.setText( - translate(u'AmendThemeForm', u'Y Position:')) + translate('AmendThemeForm', 'Y position:')) self.FontMainWidthLabel.setText( - translate(u'AmendThemeForm', u'Width:')) + translate('AmendThemeForm', 'Width:')) self.FontMainHeightLabel.setText( - translate(u'AmendThemeForm', u'Height:')) - self.FontMainXSpinBox.setSuffix(translate(u'AmendThemeForm', u'px')) - self.FontMainYSpinBox.setSuffix(translate(u'AmendThemeForm', u'px')) - self.FontMainWidthSpinBox.setSuffix(translate(u'AmendThemeForm', u'px')) - self.FontMainHeightSpinBox.setSuffix( - translate(u'AmendThemeForm', u'px')) + 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), - translate(u'AmendThemeForm', u'Font Main')) + translate('AmendThemeForm', '&Main Font')) self.FooterFontGroupBox.setTitle( - translate(u'AmendThemeForm', u'Footer Font')) - self.FontFooterLabel.setText(translate(u'AmendThemeForm', u'Font:')) + translate('AmendThemeForm', 'Footer Font')) + self.FontFooterLabel.setText(translate('AmendThemeForm', 'Font:')) self.FontFooterColorLabel.setText( - translate(u'AmendThemeForm', u'Font Color:')) - self.FontFooterSizeLabel.setText(translate(u'AmendThemeForm', u'Size:')) - self.FontFooterSizeSpinBox.setSuffix( - translate(u'AmendThemeForm', u'pt')) + translate('AmendThemeForm', 'Color:')) + self.FontFooterSizeLabel.setText(translate('AmendThemeForm', 'Size:')) + self.FontFooterSizeSpinBox.setSuffix(translate('AmendThemeForm', 'pt')) self.FontFooterWeightComboBox.setItemText(0, - translate(u'AmendThemeForm', u'Normal')) + translate('AmendThemeForm', 'Normal')) self.FontFooterWeightComboBox.setItemText(1, - translate(u'AmendThemeForm', u'Bold')) + translate('AmendThemeForm', 'Bold')) self.FontFooterWeightComboBox.setItemText(2, - translate(u'AmendThemeForm', u'Italics')) + translate('AmendThemeForm', 'Italics')) self.FontFooterWeightComboBox.setItemText(3, - translate(u'AmendThemeForm', u'Bold/Italics')) + translate('AmendThemeForm', 'Bold/Italics')) self.FontFooterWeightLabel.setText( - translate(u'AmendThemeForm', u'Font Weight:')) + translate('AmendThemeForm', 'Style:')) self.LocationFooterGroupBox.setTitle( - translate(u'AmendThemeForm', u'Display Location')) + translate('AmendThemeForm', 'Display Location')) self.FontFooterDefaultLabel.setText( - translate(u'AmendThemeForm', u'Use Default Location:')) + translate('AmendThemeForm', 'Use default location:')) self.FontFooterXLabel.setText( - translate(u'AmendThemeForm', u'X Position:')) + translate('AmendThemeForm', 'X position:')) self.FontFooterYLabel.setText( - translate(u'AmendThemeForm', u'Y Position:')) + translate('AmendThemeForm', 'Y position:')) self.FontFooterWidthLabel.setText( - translate(u'AmendThemeForm', u'Width:')) + translate('AmendThemeForm', 'Width:')) self.FontFooterHeightLabel.setText( - translate(u'AmendThemeForm', u'Height:')) - self.FontFooterXSpinBox.setSuffix( - translate(u'AmendThemeForm', u'px')) - self.FontFooterYSpinBox.setSuffix( - translate(u'AmendThemeForm', u'px')) - self.FontFooterWidthSpinBox.setSuffix( - translate(u'AmendThemeForm', u'px')) + 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(u'AmendThemeForm', u'px')) + translate('AmendThemeForm', 'px')) self.ThemeTabWidget.setTabText( self.ThemeTabWidget.indexOf(self.FontFooterTab), - translate(u'AmendThemeForm', u'Font Footer')) - self.OutlineGroupBox.setTitle(translate(u'AmendThemeForm', u'Outline')) + translate('AmendThemeForm', '&Footer Font')) + self.OutlineGroupBox.setTitle(translate('AmendThemeForm', 'Outline')) self.OutlineSpinBoxLabel.setText( - translate(u'AmendThemeForm', u'Outline Size:')) - self.OutlineSpinBox.setSuffix(translate(u'AmendThemeForm', u'px')) + translate('AmendThemeForm', 'Outline size:')) + self.OutlineSpinBox.setSuffix(translate('AmendThemeForm', 'px')) self.OutlineColorLabel.setText( - translate(u'AmendThemeForm', u'Outline Color:')) + translate('AmendThemeForm', 'Outline color:')) self.OutlineEnabledLabel.setText( - translate(u'AmendThemeForm', u'Show Outline:')) - self.ShadowGroupBox.setTitle(translate(u'AmendThemeForm', u'Shadow')) + translate('AmendThemeForm', 'Show outline:')) + self.ShadowGroupBox.setTitle(translate('AmendThemeForm', 'Shadow')) self.ShadowSpinBoxLabel.setText( - translate(u'AmendThemeForm', u'Shadow Size:')) - self.ShadowSpinBox.setSuffix(translate(u'AmendThemeForm', u'px')) + translate('AmendThemeForm', 'Shadow size:')) + self.ShadowSpinBox.setSuffix(translate('AmendThemeForm', 'px')) self.ShadowColorLabel.setText( - translate(u'AmendThemeForm', u'Shadow Color:')) + translate('AmendThemeForm', 'Shadow color:')) self.ShadowEnabledLabel.setText( - translate(u'AmendThemeForm', u'Show Shadow:')) + translate('AmendThemeForm', 'Show shadow:')) self.AlignmentGroupBox.setTitle( - translate(u'AmendThemeForm', u'Alignment')) + translate('AmendThemeForm', 'Alignment')) self.HorizontalLabel.setText( - translate(u'AmendThemeForm', u'Horizontal Align:')) + translate('AmendThemeForm', 'Horizontal align:')) self.HorizontalComboBox.setItemText(0, - translate(u'AmendThemeForm', u'Left')) + translate('AmendThemeForm', 'Left')) self.HorizontalComboBox.setItemText(1, - translate(u'AmendThemeForm', u'Right')) + translate('AmendThemeForm', 'Right')) self.HorizontalComboBox.setItemText(2, - translate(u'AmendThemeForm', u'Center')) + translate('AmendThemeForm', 'Center')) self.VerticalLabel.setText( - translate(u'AmendThemeForm', u'Vertical Align:')) + translate('AmendThemeForm', 'Vertical align:')) self.VerticalComboBox.setItemText(0, - translate(u'AmendThemeForm', u'Top')) + translate('AmendThemeForm', 'Top')) self.VerticalComboBox.setItemText(1, - translate(u'AmendThemeForm', u'Middle')) + translate('AmendThemeForm', 'Middle')) self.VerticalComboBox.setItemText(2, - translate(u'AmendThemeForm', u'Bottom')) + translate('AmendThemeForm', 'Bottom')) self.TransitionGroupBox.setTitle( - translate(u'AmendThemeForm', u'Slide Transition')) + translate('AmendThemeForm', 'Slide Transition')) self.SlideTransitionCheckedBoxLabel.setText( - translate(u'AmendThemeForm', u'Transition Active:')) + translate('AmendThemeForm', 'Transition active:')) self.ThemeTabWidget.setTabText( self.ThemeTabWidget.indexOf(self.OtherOptionsTab), - translate(u'AmendThemeForm', u'Other Options')) - self.PreviewGroupBox.setTitle(translate(u'AmendThemeForm', u'Preview')) + translate('AmendThemeForm', '&Other Options')) + self.PreviewGroupBox.setTitle(translate('AmendThemeForm', 'Preview')) diff --git a/openlp/core/ui/amendthemeform.py b/openlp/core/ui/amendthemeform.py index 9306a931c..20664c8e0 100644 --- a/openlp/core/ui/amendthemeform.py +++ b/openlp/core/ui/amendthemeform.py @@ -138,8 +138,8 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): def accept(self): new_theme = ThemeXML() - theme_name = unicode(self.ThemeNameEdit.displayText()) - new_theme.new_document(theme_name.encode('unicode-escape')) + theme_name = unicode(self.ThemeNameEdit.text()) + new_theme.new_document(theme_name) save_from = None save_to = None if self.theme.background_mode == u'transparent': @@ -209,8 +209,8 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.previewTheme() def onImageToolButtonClicked(self): - filename = QtGui.QFileDialog.getOpenFileName( - self, translate(u'AmendThemeForm', u'Open file')) + filename = unicode(QtGui.QFileDialog.getOpenFileName( + self, translate('AmendThemeForm', 'Open File'))) if filename: self.ImageLineEdit.setText(filename) self.theme.background_filename = filename @@ -647,7 +647,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.Color1PushButton.setStyleSheet( u'background-color: %s' % unicode(theme.background_color)) self.Color1Label.setText( - translate(u'AmendThemeForm', u'Background Color:')) + translate('AmendThemeForm', 'Color:')) self.Color1Label.setVisible(True) self.Color1PushButton.setVisible(True) self.Color2Label.setVisible(False) @@ -663,9 +663,9 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.Color2PushButton.setStyleSheet(u'background-color: %s' \ % unicode(theme.background_endColor)) self.Color1Label.setText( - translate(u'AmendThemeForm', u'First Color:')) + translate('AmendThemeForm', 'First color:')) self.Color2Label.setText( - translate(u'AmendThemeForm', u'Second Color:')) + translate('AmendThemeForm', 'Second color:')) self.Color1Label.setVisible(True) self.Color1PushButton.setVisible(True) self.Color2Label.setVisible(True) @@ -734,7 +734,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): (self.FontMainHeightSpinBox.value(), metrics.height(), page_length)) page_length_text = unicode( - translate(u'AmendThemeForm', u'Slide Height is %s rows')) + translate('AmendThemeForm', 'Slide height is %s rows.')) self.FontMainLinesPageLabel.setText(page_length_text % page_length) frame = self.thememanager.generateImage(self.theme) self.ThemePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) diff --git a/openlp/core/ui/displaytab.py b/openlp/core/ui/displaytab.py index 3ddbb8b08..8a028bbc8 100644 --- a/openlp/core/ui/displaytab.py +++ b/openlp/core/ui/displaytab.py @@ -42,7 +42,7 @@ class DisplayTab(SettingsTab): """ Set up the UI widgets to show the settings """ - self.tabTitleVisible = translate(u'DisplayTab', u'Displays') + self.tabTitleVisible = translate('DisplayTab', 'Displays') self.layoutWidget = QtGui.QWidget(self) self.layoutWidget.setGeometry(QtCore.QRect(0, 40, 241, 79)) self.layoutWidget.setObjectName(u'layoutWidget') @@ -164,25 +164,25 @@ class DisplayTab(SettingsTab): """ Provide i18n support for this UI """ - self.setWindowTitle(translate(u'DisplayTab', u'Amend Display Settings')) + self.setWindowTitle(translate('DisplayTab', 'Amend Display Settings')) self.CurrentGroupBox.setTitle( - translate(u'DisplayTab', u'Default Settings')) - self.XLabel.setText(translate(u'DisplayTab', u'X')) + translate('DisplayTab', 'Default Settings')) + self.XLabel.setText(translate('DisplayTab', 'X')) self.Xpos.setText(u'0') - self.YLabel.setText(translate(u'DisplayTab', u'Y')) + self.YLabel.setText(translate('DisplayTab', 'Y')) self.Ypos.setText(u'0') - self.HeightLabel.setText(translate(u'DisplayTab', u'Height')) + self.HeightLabel.setText(translate('DisplayTab', 'Height')) self.Height.setText(u'0') - self.WidthLabel.setText(translate(u'DisplayTab', u'Width')) + self.WidthLabel.setText(translate('DisplayTab', 'Width')) self.Width.setText(u'0') self.CurrentGroupBox_2.setTitle( - translate(u'DisplayTab', u'Amend Settings')) - self.XAmendLabel.setText(translate(u'DisplayTab', u'X')) - self.YAmendLabel.setText(translate(u'DisplayTab', u'Y')) - self.HeightAmendLabel.setText(translate(u'DisplayTab', u'Height')) - self.WidthAmendLabel.setText(translate(u'DisplayTab', u'Width')) + translate('DisplayTab', 'Amend Settings')) + self.XAmendLabel.setText(translate('DisplayTab', 'X')) + self.YAmendLabel.setText(translate('DisplayTab', 'Y')) + self.HeightAmendLabel.setText(translate('DisplayTab', 'Height')) + self.WidthAmendLabel.setText(translate('DisplayTab', 'Width')) self.OverrideCheckBox.setText( - translate(u'DisplayTab', u'Override Output Display')) + translate('DisplayTab', 'Override Output Display')) def load(self): """ diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index ae63f739f..4c42bf90c 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -54,7 +54,7 @@ class GeneralTab(SettingsTab): def setupUi(self): self.setObjectName(u'GeneralTab') - self.tabTitleVisible = translate(u'GeneralTab', u'General') + self.tabTitleVisible = translate('GeneralTab', 'General') self.GeneralLayout = QtGui.QHBoxLayout(self) self.GeneralLayout.setSpacing(8) self.GeneralLayout.setMargin(8) @@ -177,32 +177,32 @@ class GeneralTab(SettingsTab): QtCore.SIGNAL(u'editingFinished()'), self.onPasswordEditLostFocus) def retranslateUi(self): - self.MonitorGroupBox.setTitle(translate(u'GeneralTab', u'Monitors')) + self.MonitorGroupBox.setTitle(translate('GeneralTab', 'Monitors')) self.MonitorLabel.setText( - translate(u'GeneralTab', u'Select monitor for output display:')) + translate('GeneralTab', 'Select monitor for output display:')) self.DisplayOnMonitorCheck.setText( - translate(u'GeneralTab', u'Display if a single screen')) + translate('GeneralTab', 'Display if a single screen')) self.StartupGroupBox.setTitle( - translate(u'GeneralTab', u'Application Startup')) + translate('GeneralTab', 'Application Startup')) self.WarningCheckBox.setText( - translate(u'GeneralTab', u'Show blank screen warning')) + translate('GeneralTab', 'Show blank screen warning')) self.AutoOpenCheckBox.setText( - translate(u'GeneralTab', u'Automatically open the last service')) + translate('GeneralTab', 'Automatically open the last service')) self.ShowSplashCheckBox.setText( - translate(u'GeneralTab', u'Show the splash screen')) + translate('GeneralTab', 'Show the splash screen')) self.SettingsGroupBox.setTitle( - translate(u'GeneralTab', u'Application Settings')) + translate('GeneralTab', 'Application Settings')) self.SaveCheckServiceCheckBox.setText( - translate(u'GeneralTab', - u'Prompt to save Service before starting New')) + translate('GeneralTab', + 'Prompt to save Service before starting New')) self.AutoPreviewCheckBox.setText( - translate(u'GeneralTab', u'Preview Next Song from Service Manager')) - self.CCLIGroupBox.setTitle(translate(u'GeneralTab', u'CCLI Details')) - self.NumberLabel.setText(translate(u'GeneralTab', u'CCLI Number:')) + translate('GeneralTab', 'Preview Next Song from Service Manager')) + self.CCLIGroupBox.setTitle(translate('GeneralTab', 'CCLI Details')) + self.NumberLabel.setText(translate('GeneralTab', 'CCLI Number:')) self.UsernameLabel.setText( - translate(u'GeneralTab', u'SongSelect Username:')) + translate('GeneralTab', 'SongSelect Username:')) self.PasswordLabel.setText( - translate(u'GeneralTab', u'SongSelect Password:')) + translate('GeneralTab', 'SongSelect Password:')) def onMonitorComboBoxChanged(self): self.MonitorNumber = self.MonitorComboBox.currentIndex() @@ -238,11 +238,11 @@ class GeneralTab(SettingsTab): settings = QtCore.QSettings() settings.beginGroup(self.settingsSection) for screen in self.screens.screen_list: - screen_name = u'%s %d' % (translate(u'GeneralTab', u'Screen'), + screen_name = u'%s %d' % (translate('GeneralTab', 'Screen'), screen[u'number'] + 1) if screen[u'primary']: screen_name = u'%s (%s)' % (screen_name, - translate(u'GeneralTab', u'primary')) + translate('GeneralTab', 'primary')) self.MonitorComboBox.addItem(screen_name) # Get the configs self.Warning = settings.value( diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 9efadddd8..0f21b7307 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -354,113 +354,111 @@ class Ui_MainWindow(object): """ Set up the translation system """ - MainWindow.mainTitle = translate(u'MainWindow', u'OpenLP 2.0') - MainWindow.language = translate(u'MainWindow', u'English') - MainWindow.defaultThemeText = translate(u'MainWindow', - u'Default Theme: ') + MainWindow.mainTitle = translate('MainWindow', 'OpenLP 2.0') + MainWindow.language = translate('MainWindow', 'English') MainWindow.setWindowTitle(MainWindow.mainTitle) - self.FileMenu.setTitle(translate(u'MainWindow', u'&File')) - self.FileImportMenu.setTitle(translate(u'MainWindow', u'&Import')) - self.FileExportMenu.setTitle(translate(u'MainWindow', u'&Export')) - self.OptionsMenu.setTitle(translate(u'MainWindow', u'&Options')) - self.OptionsViewMenu.setTitle(translate(u'MainWindow', u'&View')) - self.ViewModeMenu.setTitle(translate(u'MainWindow', u'M&ode')) - self.OptionsLanguageMenu.setTitle(translate(u'MainWindow', - u'&Language')) - self.ToolsMenu.setTitle(translate(u'MainWindow', u'&Tools')) - self.HelpMenu.setTitle(translate(u'MainWindow', u'&Help')) + self.FileMenu.setTitle(translate('MainWindow', '&File')) + self.FileImportMenu.setTitle(translate('MainWindow', '&Import')) + self.FileExportMenu.setTitle(translate('MainWindow', '&Export')) + self.OptionsMenu.setTitle(translate('MainWindow', '&Options')) + self.OptionsViewMenu.setTitle(translate('MainWindow', '&View')) + self.ViewModeMenu.setTitle(translate('MainWindow', 'M&ode')) + self.OptionsLanguageMenu.setTitle(translate('MainWindow', + '&Language')) + self.ToolsMenu.setTitle(translate('MainWindow', '&Tools')) + self.HelpMenu.setTitle(translate('MainWindow', '&Help')) self.MediaManagerDock.setWindowTitle( - translate(u'MainWindow', u'Media Manager')) + translate('MainWindow', 'Media Manager')) self.ServiceManagerDock.setWindowTitle( - translate(u'MainWindow', u'Service Manager')) + translate('MainWindow', 'Service Manager')) self.ThemeManagerDock.setWindowTitle( - translate(u'MainWindow', u'Theme Manager')) - self.FileNewItem.setText(translate(u'MainWindow', u'&New')) - self.FileNewItem.setToolTip(translate(u'MainWindow', u'New Service')) + translate('MainWindow', 'Theme Manager')) + self.FileNewItem.setText(translate('MainWindow', '&New')) + self.FileNewItem.setToolTip(translate('MainWindow', 'New Service')) self.FileNewItem.setStatusTip( - translate(u'MainWindow', u'Create a new Service')) - self.FileNewItem.setShortcut(translate(u'MainWindow', u'Ctrl+N')) - self.FileOpenItem.setText(translate(u'MainWindow', u'&Open')) - self.FileOpenItem.setToolTip(translate(u'MainWindow', u'Open Service')) + 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(u'MainWindow', u'Open an existing service')) - self.FileOpenItem.setShortcut(translate(u'MainWindow', u'Ctrl+O')) - self.FileSaveItem.setText(translate(u'MainWindow', u'&Save')) - self.FileSaveItem.setToolTip(translate(u'MainWindow', u'Save Service')) + 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')) self.FileSaveItem.setStatusTip( - translate(u'MainWindow', u'Save the current service to disk')) - self.FileSaveItem.setShortcut(translate(u'MainWindow', u'Ctrl+S')) - self.FileSaveAsItem.setText(translate(u'MainWindow', u'Save &As...')) + 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(u'MainWindow', u'Save Service As')) - self.FileSaveAsItem.setStatusTip(translate(u'MainWindow', - u'Save the current service under a new name')) - self.FileSaveAsItem.setShortcut(translate(u'MainWindow', u'F12')) - self.FileExitItem.setText(translate(u'MainWindow', u'E&xit')) - self.FileExitItem.setStatusTip(translate(u'MainWindow', u'Quit OpenLP')) - self.FileExitItem.setShortcut(translate(u'MainWindow', u'Alt+F4')) - self.ImportThemeItem.setText(translate(u'MainWindow', u'&Theme')) - self.ImportLanguageItem.setText(translate(u'MainWindow', u'&Language')) - self.ExportThemeItem.setText(translate(u'MainWindow', u'&Theme')) - self.ExportLanguageItem.setText(translate(u'MainWindow', u'&Language')) - self.actionLook_Feel.setText(translate(u'MainWindow', u'Look && &Feel')) - self.OptionsSettingsItem.setText(translate(u'MainWindow', u'&Settings')) + 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')) + self.FileExitItem.setShortcut(translate('MainWindow', 'Alt+F4')) + self.ImportThemeItem.setText(translate('MainWindow', '&Theme')) + self.ImportLanguageItem.setText(translate('MainWindow', '&Language')) + self.ExportThemeItem.setText(translate('MainWindow', '&Theme')) + self.ExportLanguageItem.setText(translate('MainWindow', '&Language')) + self.actionLook_Feel.setText(translate('MainWindow', 'Look && &Feel')) + self.OptionsSettingsItem.setText(translate('MainWindow', '&Settings')) self.ViewMediaManagerItem.setText( - translate(u'MainWindow', u'&Media Manager')) + translate('MainWindow', '&Media Manager')) self.ViewMediaManagerItem.setToolTip( - translate(u'MainWindow', u'Toggle Media Manager')) - self.ViewMediaManagerItem.setStatusTip(translate(u'MainWindow', - u'Toggle the visibility of the Media Manager')) - self.ViewMediaManagerItem.setShortcut(translate(u'MainWindow', u'F8')) + translate('MainWindow', 'Toggle Media Manager')) + self.ViewMediaManagerItem.setStatusTip(translate('MainWindow', + 'Toggle the visibility of the Media Manager')) + self.ViewMediaManagerItem.setShortcut(translate('MainWindow', 'F8')) self.ViewThemeManagerItem.setText( - translate(u'MainWindow', u'&Theme Manager')) + translate('MainWindow', '&Theme Manager')) self.ViewThemeManagerItem.setToolTip( - translate(u'MainWindow', u'Toggle Theme Manager')) - self.ViewThemeManagerItem.setStatusTip(translate(u'MainWindow', - u'Toggle the visibility of the Theme Manager')) - self.ViewThemeManagerItem.setShortcut(translate(u'MainWindow', u'F10')) + translate('MainWindow', 'Toggle Theme Manager')) + self.ViewThemeManagerItem.setStatusTip(translate('MainWindow', + 'Toggle the visibility of the Theme Manager')) + self.ViewThemeManagerItem.setShortcut(translate('MainWindow', 'F10')) self.ViewServiceManagerItem.setText( - translate(u'MainWindow', u'&Service Manager')) + translate('MainWindow', '&Service Manager')) self.ViewServiceManagerItem.setToolTip( - translate(u'MainWindow', u'Toggle Service Manager')) - self.ViewServiceManagerItem.setStatusTip(translate(u'MainWindow', - u'Toggle the visibility of the Service Manager')) - self.ViewServiceManagerItem.setShortcut(translate(u'MainWindow', u'F9')) + translate('MainWindow', 'Toggle 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(u'MainWindow', u'&Preview Panel')) + translate('MainWindow', '&Preview Panel')) self.action_Preview_Panel.setToolTip( - translate(u'MainWindow', u'Toggle Preview Panel')) - self.action_Preview_Panel.setStatusTip(translate(u'MainWindow', - u'Toggle the visibility of the Preview Panel')) - self.action_Preview_Panel.setShortcut(translate(u'MainWindow', u'F11')) - self.PluginItem.setText(translate(u'MainWindow', u'&Plugin List')) + translate('MainWindow', 'Toggle 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(u'MainWindow', u'List the Plugins')) - self.PluginItem.setShortcut(translate(u'MainWindow', u'Alt+F7')) + translate('MainWindow', 'List the Plugins')) + self.PluginItem.setShortcut(translate('MainWindow', 'Alt+F7')) self.HelpDocumentationItem.setText( - translate(u'MainWindow', u'&User Guide')) - self.HelpAboutItem.setText(translate(u'MainWindow', u'&About')) + translate('MainWindow', '&User Guide')) + self.HelpAboutItem.setText(translate('MainWindow', '&About')) self.HelpAboutItem.setStatusTip( - translate(u'MainWindow', u'More information about OpenLP')) - self.HelpAboutItem.setShortcut(translate(u'MainWindow', u'Ctrl+F1')) + translate('MainWindow', 'More information about OpenLP')) + self.HelpAboutItem.setShortcut(translate('MainWindow', 'Ctrl+F1')) self.HelpOnlineHelpItem.setText( - translate(u'MainWindow', u'&Online Help')) - self.HelpWebSiteItem.setText(translate(u'MainWindow', u'&Web Site')) + translate('MainWindow', '&Online Help')) + self.HelpWebSiteItem.setText(translate('MainWindow', '&Web Site')) #i18n - self.AutoLanguageItem.setText(translate(u'MainWindow', u'&Auto Detect')) + self.AutoLanguageItem.setText(translate('MainWindow', '&Auto Detect')) self.AutoLanguageItem.setStatusTip( - translate(u'MainWindow', u'Choose System language, if available')) + translate('MainWindow', 'Choose System language, if available')) for item in self.LanguageGroup.actions(): item.setText(item.objectName()) - item.setStatusTip(unicode(translate(u'MainWindow', - u'Set the interface language to %s')) % item.objectName()) - self.ToolsAddToolItem.setText(translate(u'MainWindow', u'Add &Tool...')) + item.setStatusTip(unicode(translate('MainWindow', + 'Set the interface language to %s')) % item.objectName()) + self.ToolsAddToolItem.setText(translate('MainWindow', 'Add &Tool...')) self.ToolsAddToolItem.setStatusTip( - translate(u'MainWindow', - u'Add an application to the list of tools')) + translate('MainWindow', + 'Add an application to the list of tools')) self.action_Preview_Panel.setText( - translate(u'MainWindow', u'&Preview Pane')) - self.ModeLiveItem.setText(translate(u'MainWindow', u'&Live')) + translate('MainWindow', '&Preview Pane')) + self.ModeLiveItem.setText(translate('MainWindow', '&Live')) class MainWindow(QtGui.QMainWindow, Ui_MainWindow): @@ -620,12 +618,12 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): Triggered by delay thread. """ app_version = self.applicationVersion[u'full'] - version_text = unicode(translate(u'MainWindow', u'Version %s of OpenLP ' - u'is now available for download (you are currently running version ' - u' %s). \n\nYou can download the latest version from ' - u'http://openlp.org')) + version_text = unicode(translate('MainWindow', 'Version %s of OpenLP ' + 'is now available for download (you are currently running version ' + ' %s). \n\nYou can download the latest version from ' + 'http://openlp.org')) QtGui.QMessageBox.question(self, - translate(u'MainWindow', u'OpenLP Version Updated'), + translate('MainWindow', 'OpenLP Version Updated'), version_text % (version, app_version), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok), QtGui.QMessageBox.Ok) @@ -657,9 +655,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): if settings.value(u'blank warning', QtCore.QVariant(False)).toBool(): QtGui.QMessageBox.question(self, - translate(u'MainWindow', u'OpenLP Main Display Blanked'), - translate(u'MainWindow', - u'The Main Display has been blanked out')) + translate('MainWindow', 'OpenLP Main Display Blanked'), + translate('MainWindow', + 'The Main Display has been blanked out')) settings.endGroup() def versionThread(self): @@ -712,9 +710,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ if self.serviceNotSaved: ret = QtGui.QMessageBox.question(self, - translate(u'MainWindow', u'Save Changes to Service?'), - translate(u'MainWindow', u'Your service has changed. ' - u'Do you want to save those changes?'), + translate('MainWindow', 'Save Changes to Service?'), + translate('MainWindow', 'Your service has changed. ' + 'Do you want to save those changes?'), QtGui.QMessageBox.StandardButtons( QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Discard | @@ -774,7 +772,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): def defaultThemeChanged(self, theme): self.DefaultThemeLabel.setText( - u'%s %s' % (self.defaultThemeText, theme)) + unicode(translate('MainWindow', 'Default Theme: %s')) % theme) def toggleMediaManager(self, visible): if self.MediaManagerDock.isVisible() != visible: diff --git a/openlp/core/ui/settingsdialog.py b/openlp/core/ui/settingsdialog.py index c5874b84c..66501e380 100644 --- a/openlp/core/ui/settingsdialog.py +++ b/openlp/core/ui/settingsdialog.py @@ -60,4 +60,4 @@ class Ui_SettingsDialog(object): QtCore.QMetaObject.connectSlotsByName(SettingsDialog) def retranslateUi(self, SettingsDialog): - SettingsDialog.setWindowTitle(translate(u'SettingsForm', u'Settings')) + SettingsDialog.setWindowTitle(translate('SettingsForm', 'Settings')) diff --git a/openlp/core/ui/splashscreen.py b/openlp/core/ui/splashscreen.py index f49d73815..ff2be94df 100644 --- a/openlp/core/ui/splashscreen.py +++ b/openlp/core/ui/splashscreen.py @@ -32,7 +32,7 @@ class SplashScreen(object): self.splash_screen = QtGui.QSplashScreen() self.setupUi() self.message = translate( - u'Splashscreen', u'Starting')\ + 'Splashscreen', 'Starting')\ + '..... ' + version def setupUi(self): @@ -60,7 +60,7 @@ class SplashScreen(object): def retranslateUi(self): self.splash_screen.setWindowTitle( - translate(u'Splashscreen', u'Splash Screen')) + translate('Splashscreen', 'Splash Screen')) def show(self): self.splash_screen.show() diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index a5d6644de..431b1d450 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -54,25 +54,25 @@ class ThemeManager(QtGui.QWidget): self.amendThemeForm = AmendThemeForm(self) self.Toolbar = OpenLPToolbar(self) self.Toolbar.addToolbarButton( - translate(u'ThemeManager', u'New Theme'), u':/themes/theme_new.png', - translate(u'ThemeManager', u'Create a new theme'), self.onAddTheme) + translate('ThemeManager', 'New Theme'), u':/themes/theme_new.png', + translate('ThemeManager', 'Create a new theme.'), self.onAddTheme) self.Toolbar.addToolbarButton( - translate(u'ThemeManager', u'Edit Theme'), + translate('ThemeManager', 'Edit Theme'), u':/themes/theme_edit.png', - translate(u'ThemeManager', u'Edit a theme'), self.onEditTheme) + translate('ThemeManager', 'Edit a theme.'), self.onEditTheme) self.Toolbar.addToolbarButton( - translate(u'ThemeManager', u'Delete Theme'), + translate('ThemeManager', 'Delete Theme'), u':/general/general_delete.png', - translate(u'ThemeManager', u'Delete a theme'), self.onDeleteTheme) + translate('ThemeManager', 'Delete a theme.'), self.onDeleteTheme) self.Toolbar.addSeparator() self.Toolbar.addToolbarButton( - translate(u'ThemeManager', u'Import Theme'), + translate('ThemeManager', 'Import Theme'), u':/general/general_import.png', - translate(u'ThemeManager', u'Import a theme'), self.onImportTheme) + translate('ThemeManager', 'Import a theme.'), self.onImportTheme) self.Toolbar.addToolbarButton( - translate(u'ThemeManager', u'Export Theme'), + translate('ThemeManager', 'Export Theme'), u':/general/general_export.png', - translate(u'ThemeManager', u'Export a theme'), self.onExportTheme) + translate('ThemeManager', 'Export a theme.'), self.onExportTheme) self.ThemeWidget = QtGui.QWidgetAction(self.Toolbar) self.Layout.addWidget(self.Toolbar) self.ThemeListWidget = QtGui.QListWidget(self) @@ -83,23 +83,23 @@ class ThemeManager(QtGui.QWidget): self.ThemeListWidget.addAction( context_menu_action(self.ThemeListWidget, u':/themes/theme_edit.png', - translate(u'ThemeManager', u'Edit a theme'), self.onEditTheme)) + translate('ThemeManager', '&Edit Theme'), self.onEditTheme)) self.ThemeListWidget.addAction( context_menu_separator(self.ThemeListWidget)) self.ThemeListWidget.addAction( context_menu_action(self.ThemeListWidget, u':/general/general_delete.png', - translate(u'ThemeManager', u'Delete theme'), + translate('ThemeManager', '&Delete Theme'), self.onDeleteTheme)) self.ThemeListWidget.addAction( context_menu_action(self.ThemeListWidget, u':/general/general_export.png', - translate(u'ThemeManager', u'Make Global'), + translate('ThemeManager', 'Set As &Global Default'), self.changeGlobalFromScreen)) self.ThemeListWidget.addAction( context_menu_action(self.ThemeListWidget, u':/general/general_export.png', - translate(u'ThemeManager', u'Export theme'), + translate('ThemeManager', 'E&xport Theme'), self.onExportTheme)) self.ThemeListWidget.addAction( context_menu_separator(self.ThemeListWidget)) @@ -136,7 +136,7 @@ class ThemeManager(QtGui.QWidget): self.ThemeListWidget.item(count).setText(newName) #Set the new name if themeName == newName: - name = unicode(translate(u'ThemeManager', u'%s (default)')) % \ + name = unicode(translate('ThemeManager', '%s (default)')) % \ newName self.ThemeListWidget.item(count).setText(name) @@ -158,7 +158,7 @@ class ThemeManager(QtGui.QWidget): if count == selected_row: self.global_theme = unicode( self.ThemeListWidget.item(count).text()) - name = unicode(translate(u'ThemeManager', u'%s (default)')) % \ + name = unicode(translate('ThemeManager', '%s (default)')) % \ self.global_theme self.ThemeListWidget.item(count).setText(name) QtCore.QSettings().setValue( @@ -203,26 +203,26 @@ class ThemeManager(QtGui.QWidget): theme = unicode(item.text()) # should be the same unless default if theme != unicode(item.data(QtCore.Qt.UserRole).toString()): - QtGui.QMessageBox.critical( - self, translate(u'ThemeManager', u'Error'), - translate(u'ThemeManager', - u'You are unable to delete the default theme.'), + QtGui.QMessageBox.critical(self, + translate('ThemeManager', 'Error'), + translate('ThemeManager', + 'You are unable to delete the default theme.'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) else: for plugin in self.parent.plugin_manager.plugins: if not plugin.can_delete_theme(theme): QtGui.QMessageBox.critical(self, - translate(u'ThemeManager', u'Error'), - translate(u'ThemeManager', - u'Theme %s is use in %s plugin' % (theme, - plugin.name))) + translate('ThemeManager', 'Error'), + unicode(translate('ThemeManager', + 'Theme %s is use in %s plugin.')) % \ + (theme, plugin.name)) return if unicode(self.parent.ServiceManagerContents.ThemeComboBox \ .currentText()) == theme: QtGui.QMessageBox.critical(self, - translate(u'ThemeManager', u'Error'), - translate(u'ThemeManager', - u'Theme %s is use by Service Manager' % theme)) + translate('ThemeManager', 'Error'), + unicode(translate('ThemeManager', + 'Theme %s is use by the service manager.')) % theme) return self.themelist.remove(theme) th = theme + u'.png' @@ -249,12 +249,12 @@ class ThemeManager(QtGui.QWidget): item = self.ThemeListWidget.currentItem() if item is None: QtGui.QMessageBox.critical(self, - translate(u'ThemeManager', u'Error'), - translate(u'ThemeManager', u'You have not selected a theme.')) + translate('ThemeManager', 'Error'), + translate('ThemeManager', 'You have not selected a theme.')) return theme = unicode(item.data(QtCore.Qt.UserRole).toString()) path = QtGui.QFileDialog.getExistingDirectory(self, - unicode(translate(u'ThemeManager', u'Save Theme - (%s)')) % theme, + unicode(translate('ThemeManager', 'Save Theme - (%s)')) % theme, SettingsManager.get_last_dir(self.settingsSection, 1)) path = unicode(path) if path: @@ -270,15 +270,15 @@ class ThemeManager(QtGui.QWidget): os.path.join(source, name).encode(u'utf-8'), os.path.join(theme, name).encode(u'utf-8')) QtGui.QMessageBox.information(self, - translate(u'ThemeManager', u'Theme Exported'), - translate(u'ThemeManager', - u'Your theme has been successfully exported.')) + translate('ThemeManager', 'Theme Exported'), + translate('ThemeManager', + 'Your theme has been successfully exported.')) except (IOError, OSError): log.exception(u'Export Theme Failed') QtGui.QMessageBox.critical(self, - translate(u'ThemeManager', u'Theme Export Failed'), - translate(u'ThemeManager', - u'Your theme could not be exported due to an error.')) + translate('ThemeManager', 'Theme Export Failed'), + translate('ThemeManager', + 'Your theme could not be exported due to an error.')) finally: if zip: zip.close() @@ -289,9 +289,10 @@ class ThemeManager(QtGui.QWidget): attempting to extract OpenLP themes from those files. This process will load both OpenLP version 1 and version 2 themes. """ - files = QtGui.QFileDialog.getOpenFileNames( - self, translate(u'ThemeManager', u'Select Theme Import File'), - SettingsManager.get_last_dir(self.settingsSection), u'Theme (*.*)') + files = QtGui.QFileDialog.getOpenFileNames(self, + translate('ThemeManager', 'Select Theme Import File'), + SettingsManager.get_last_dir(self.settingsSection), + translate('ThemeManager', 'Theme (*.*)')) log.info(u'New Themes %s', unicode(files)) if files: for file in files: @@ -318,8 +319,8 @@ class ThemeManager(QtGui.QWidget): if os.path.exists(theme): textName = os.path.splitext(name)[0] if textName == self.global_theme: - name = unicode(translate(u'ThemeManager', - u'%s (default)')) % textName + name = unicode(translate('ThemeManager', + '%s (default)')) % textName else: name = textName thumb = os.path.join(self.thumbPath, u'%s.png' % textName) @@ -394,9 +395,9 @@ class ThemeManager(QtGui.QWidget): ucsfile = file.decode(u'utf-8') except UnicodeDecodeError: QtGui.QMessageBox.critical( - self, translate(u'ThemeManager', u'Error'), - translate(u'ThemeManager', u'File is not a valid ' - u'theme.\nThe content encoding is not UTF-8.')) + self, translate('ThemeManager', 'Error'), + translate('ThemeManager', 'File is not a valid theme.\n' + 'The content encoding is not UTF-8.')) log.exception(u'Filename "%s" is not valid UTF-8' % \ file.decode(u'utf-8', u'replace')) continue @@ -417,30 +418,36 @@ class ThemeManager(QtGui.QWidget): theme_dir = os.path.join(dir, names[0]) if not os.path.exists(theme_dir): os.mkdir(os.path.join(dir, names[0])) - xml_data = zip.read(file) if os.path.splitext(ucsfile)[1].lower() in [u'.xml']: + xml_data = zip.read(file) + try: + xml_data = xml_data.decode(u'utf-8') + except UnicodeDecodeError: + log.exception(u'Theme XML is not UTF-8 ' + 'encoded.') + break; if self.checkVersion1(xml_data): # upgrade theme xml filexml = self.migrateVersion122(xml_data) else: filexml = xml_data outfile = open(fullpath, u'w') - outfile.write(filexml) + outfile.write(filexml.encode(u'utf-8')) else: outfile = open(fullpath, u'wb') outfile.write(zip.read(file)) if filexml: self.generateAndSaveImage(dir, themename, filexml) else: - QtGui.QMessageBox.critical( - self, translate(u'ThemeManager', u'Error'), - translate(u'ThemeManager', u'File is not a valid theme.')) + QtGui.QMessageBox.critical(self, + translate('ThemeManager', 'Error'), + translate('ThemeManager', 'File is not a valid theme.')) log.exception(u'Theme file dosen\'t contain XML data %s' % filename) except (IOError, NameError): - QtGui.QMessageBox.critical( - self, translate(u'ThemeManager', u'Error'), - translate(u'ThemeManager', u'File is not a valid theme.')) + QtGui.QMessageBox.critical(self, + translate('ThemeManager', 'Error'), + translate('ThemeManager', 'File is not a valid theme.')) log.exception(u'Importing theme from zip file failed %s' % filename) finally: if zip: @@ -456,7 +463,7 @@ class ThemeManager(QtGui.QWidget): Theme XML to check the version of """ log.debug(u'checkVersion1 ') - theme = xmlfile + theme = xmlfile.encode(u'ascii', u'xmlcharrefreplace') tree = ElementTree(element=XML(theme)).getroot() if tree.find(u'BackgroundType') is None: return False @@ -526,11 +533,11 @@ class ThemeManager(QtGui.QWidget): result = QtGui.QMessageBox.Yes if self.saveThemeName != name: if os.path.exists(theme_file): - result = QtGui.QMessageBox.question( - self, translate(u'ThemeManager', u'Theme Exists'), - translate(u'ThemeManager', - u'A theme with this name already exists, ' - u'would you like to overwrite it?'), + result = QtGui.QMessageBox.question(self, + translate('ThemeManager', 'Theme Exists'), + translate('ThemeManager', + 'A theme with this name already exists. ' + 'Would you like to overwrite it?'), (QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.No) if result == QtGui.QMessageBox.Yes: @@ -598,7 +605,7 @@ class ThemeManager(QtGui.QWidget): """ log.debug(u'base theme created') newtheme = ThemeXML() - newtheme.new_document(unicode(translate(u'ThemeManager', u'New Theme'))) + newtheme.new_document(unicode(translate('ThemeManager', 'New Theme'))) newtheme.add_background_solid(unicode(u'#000000')) newtheme.add_font(unicode(QtGui.QFont().family()), unicode(u'#FFFFFF'), unicode(30), u'False') diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 5fd8d5119..73fbfeb88 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -37,7 +37,7 @@ class ThemesTab(SettingsTab): def setupUi(self): self.setObjectName(u'ThemesTab') - self.tabTitleVisible = translate(u'ThemesTab', u'Themes') + self.tabTitleVisible = translate('ThemesTab', 'Themes') self.ThemesTabLayout = QtGui.QHBoxLayout(self) self.ThemesTabLayout.setSpacing(8) self.ThemesTabLayout.setMargin(8) @@ -106,26 +106,26 @@ class ThemesTab(SettingsTab): QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList) def retranslateUi(self): - self.GlobalGroupBox.setTitle(translate(u'ThemesTab', u'Global theme')) - self.LevelGroupBox.setTitle(translate(u'ThemesTab', u'Theme level')) + self.GlobalGroupBox.setTitle(translate('ThemesTab', 'Global Theme')) + self.LevelGroupBox.setTitle(translate('ThemesTab', 'Theme Level')) self.SongLevelRadioButton.setText( - translate(u'ThemesTab', u'Song level')) + translate('ThemesTab', 'S&ong Level')) self.SongLevelLabel.setText( - translate(u'ThemesTab', u'Use the theme from each song ' - u'in the database. If a song doesn\'t have a theme associated with ' - u'it, then use the service\'s theme. If the service doesn\'t have ' - u'a theme, then use the global theme.')) + translate('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.')) self.ServiceLevelRadioButton.setText( - translate(u'ThemesTab', u'Service level')) + translate('ThemesTab', '&Service Level')) self.ServiceLevelLabel.setText( - translate(u'ThemesTab', u'Use the theme from the service, ' - u'overriding any of the individual songs\' themes. If the ' - u'service doesn\'t have a theme, then use the global theme.')) + translate('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.')) self.GlobalLevelRadioButton.setText( - translate(u'ThemesTab', u'Global level')) + translate('ThemesTab', '&Global Level')) self.GlobalLevelLabel.setText( - translate(u'ThemesTab', u'Use the global theme, overriding any ' - u'themes associated with either the service or the songs.')) + translate('ThemesTab', 'Use the global theme, overriding any ' + 'themes associated with either the service or the songs.')) def load(self): settings = QtCore.QSettings() diff --git a/openlp/migration/__init__.py b/openlp/migration/__init__.py deleted file mode 100644 index 1a348a0df..000000000 --- a/openlp/migration/__init__.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- 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 # -############################################################################### diff --git a/openlp/migration/display.py b/openlp/migration/display.py deleted file mode 100644 index abe991075..000000000 --- a/openlp/migration/display.py +++ /dev/null @@ -1,42 +0,0 @@ -# -*- 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 - -log = logging.getLogger(__name__) - -class Display(object): - log.info(u'Display Class loaded') - - @staticmethod - def output(string): - log.debug(string) - #print (string) - - @staticmethod - def sub_output(string): - if not string is None: - log.debug(u' '+string) - #print (u' '+string) diff --git a/openlp/migration/migratebibles.py b/openlp/migration/migratebibles.py deleted file mode 100644 index 89bb5ffdf..000000000 --- a/openlp/migration/migratebibles.py +++ /dev/null @@ -1,198 +0,0 @@ -# -*- 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 os -import sys -import sqlite3 - -from sqlalchemy.exceptions import InvalidRequestError -from sqlalchemy.orm import mapper - -from openlp.core.lib import BaseModel, SettingsManager -from openlp.core.utils import AppLocation -from openlp.plugins.bibles.lib.models import * - -class TBibleMeta(BaseModel): - """ - Bible Meta Data - """ - pass - -class TTestament(BaseModel): - """ - Bible Testaments - """ - pass - -class TBook(BaseModel): - """ - Song model - """ - pass - -class TVerse(BaseModel): - """ - Topic model - """ - pass - -temp_meta_table = Table(u'metadata_temp', metadata, - Column(u'key', types.Unicode(255), primary_key=True), - Column(u'value', types.Unicode(255)), -) -temp_testament_table = Table(u'testament_temp', metadata, - Column(u'id', types.Integer, primary_key=True), - Column(u'name', types.Unicode(30)), -) -temp_book_table = Table(u'book_temp', metadata, - Column(u'id', types.Integer, primary_key=True), - Column(u'testament_id', types.Integer), - Column(u'name', types.Unicode(30)), - Column(u'abbreviation', types.Unicode(5)), -) -temp_verse_table = Table(u'verse_temp', metadata, - Column(u'id', types.Integer, primary_key=True), - Column(u'book_id', types.Integer), - Column(u'chapter', types.Integer), - Column(u'verse', types.Integer), - Column(u'text', types.UnicodeText), -) - -mapper(TBibleMeta, temp_meta_table) -mapper(TTestament, temp_testament_table) -mapper(TBook, temp_book_table) -mapper(TVerse, temp_verse_table) - -class MigrateBibles(object): - def __init__(self, display): - self.display = display - self.data_path = AppLocation.get_section_data_path(u'bibles') - self.database_files = SettingsManager.get_files(u'bibles', u'.sqlite') - print self.database_files - - def progress(self, text): - print text - self.display.output(text) - - def process(self): - self.progress(u'Bibles processing started') - for db_file in self.database_files: - self.v_1_9_0(db_file) - self.progress(u'Bibles processing finished') - - def v_1_9_0(self, database): - self.progress(u'Migration 1.9.0 Started for ' + database) - self._v1_9_0_old(database) - self._v1_9_0_new(database) - self._v1_9_0_cleanup(database) - self.progress(u'Migration 1.9.0 Finished for ' + database) - - def _v1_9_0_old(self, database): - self.progress(u'Rename Tables ' + database) - conn = sqlite3.connect(os.path.join(self.data_path, database)) - conn.execute(u'alter table book rename to book_temp;') - conn.commit() - conn.execute(u'alter table testament rename to testament_temp;') - conn.commit() - conn.execute(u'alter table verse rename to verse_temp;') - conn.commit() - conn.execute(u'alter table metadata rename to metadata_temp;') - conn.commit() - - def _v1_9_0_new(self, database): - self.progress(u'Create new Tables ' + database) - self.db_url = u'sqlite:///' + self.data_path + u'/' + database - print self.db_url - self.session = init_models(self.db_url) - metadata.create_all(checkfirst=True) - self.progress(u'Create testament table') - results = self.session.query(TTestament).order_by(TTestament.id).all() - for testament_temp in results: - testament = Testament() - testament.id = testament_temp.id - testament.name = testament_temp.name - try: - self.session.add(testament) - self.session.commit() - except InvalidRequestError: - self.session.rollback() - print u'Error thrown = ', sys.exc_info()[1] - self.progress(u'Create book table') - results = self.session.query(TBook).order_by(TBook.id).all() - for book_temp in results: - book = Book() - book.id = book_temp.id - book.testament_id = book_temp.testament_id - book.name = book_temp.name - book.abbreviation = book_temp.abbreviation - try: - self.session.add(book) - self.session.commit() - except InvalidRequestError: - self.session.rollback() - print u'Error thrown = ', sys.exc_info()[1] - self.progress(u'Create verse table') - results = self.session.query(TVerse).order_by(TVerse.id).all() - for verse_temp in results: - verse = Verse() - verse.id = verse_temp.id - verse.book_id = verse_temp.book_id - verse.chapter = verse_temp.chapter - verse.verse = verse_temp.verse - verse.text = verse_temp.text - try: - self.session.add(verse) - self.session.commit() - except InvalidRequestError: - self.session.rollback() - print u'Error thrown = ', sys.exc_info()[1] - self.progress(u'Create metadata table') - results = self.session.query(TBibleMeta).order_by(TBibleMeta.key).all() - for biblemeta_temp in results: - biblemeta = BibleMeta() - biblemeta.key = biblemeta_temp.key - biblemeta.value = biblemeta_temp.value - try: - self.session.add(biblemeta) - self.session.commit() - except InvalidRequestError: - self.session.rollback() - print u'Error thrown = ', sys.exc_info()[1] - - def _v1_9_0_cleanup(self, database): - self.progress(u'Update Internal Data ' + database) - conn = sqlite3.connect(os.path.join(self.data_path, database)) - conn.commit() - conn.execute(u'drop table book_temp;') - conn.commit() - conn.execute(u'drop table testament_temp;') - conn.commit() - conn.execute(u'drop table verse_temp;') - conn.commit() - conn.execute(u'drop table metadata_temp;') - conn.commit() - conn.execute(u'vacuum;') - conn.commit() - diff --git a/openlp/migration/migratefiles.py b/openlp/migration/migratefiles.py deleted file mode 100644 index 91fff144d..000000000 --- a/openlp/migration/migratefiles.py +++ /dev/null @@ -1,54 +0,0 @@ -# -*- 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 openlp.core.utils import AppLocation - -class MigrateFiles(object): - def __init__(self, display): - self.display = display - - def process(self): - self.display.output(u'Files process started') - self._initial_setup() - self.display.output(u'Files process finished') - - def _initial_setup(self): - self.display.output(u'Initial Setup started') - data_path = AppLocation.get_data_path() - print data_path - self.display.sub_output(u'Config created') - bibles_path = AppLocation.get_section_data_path(u'bibles') - print bibles_path - self.display.sub_output(u'Config created') - # Media doesn't use a directory like the other plugins. - #media_path = AppLocation.get_section_data_path(u'media') - #self.display.sub_output(u'videos created') - images_path = AppLocation.get_section_data_path(u'images') - print images_path - self.display.sub_output(u'images created') - presentations_path = AppLocation.get_section_data_path(u'presentations') - print presentations_path - self.display.sub_output(u'presentations created') - self.display.output(u'Initial Setup finished') diff --git a/openlp/migration/migratesongs.py b/openlp/migration/migratesongs.py deleted file mode 100644 index 87d5de40b..000000000 --- a/openlp/migration/migratesongs.py +++ /dev/null @@ -1,186 +0,0 @@ -# -*- 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 os -import sys -import sqlite3 - -from sqlalchemy import create_engine -from sqlalchemy.exceptions import InvalidRequestError -from sqlalchemy.orm import scoped_session, sessionmaker, mapper, relation - -from openlp.core.lib import BaseModel, SettingsManager -from openlp.core.utils import AppLocation -from openlp.plugins.songs.lib.models import metadata, songs_table, Song, \ - Author, Topic, Book -from openlp.plugins.songs.lib.tables import * -from openlp.plugins.songs.lib.classes import * - -def init_models(url): - engine = create_engine(url) - metadata.bind = engine - session = scoped_session( - sessionmaker(autoflush=True, autocommit=False, bind=engine)) - mapper(Author, authors_table) - mapper(TAuthor, temp_authors_table) - mapper(Book, song_books_table) - mapper(Song, songs_table, - properties={'authors': relation(Author, backref='songs', - secondary=authors_songs_table), - 'book': relation(Book, backref='songs'), - 'topics': relation(Topic, backref='songs', - secondary=songs_topics_table)}) - mapper(TSong, temp_songs_table) - mapper(TSongAuthor, temp_authors_songs_table) - mapper(Topic, topics_table) - return session - -temp_authors_table = Table(u'authors_temp', metadata, - Column(u'authorid', types.Integer, primary_key=True), - Column(u'authorname', String(40)) -) - -temp_songs_table = Table(u'songs_temp', metadata, - Column(u'songid', types.Integer, primary_key=True), - Column(u'songtitle', String(60)), - Column(u'lyrics', types.UnicodeText), - Column(u'copyrightinfo', String(255)), - Column(u'settingsid', types.Integer) -) - -# Definition of the "authors_songs" table -temp_authors_songs_table = Table(u'songauthors_temp', metadata, - Column(u'authorid', types.Integer, primary_key=True), - Column(u'songid', types.Integer) -) - -class TAuthor(BaseModel): - """ - Author model - """ - pass - -class TSong(BaseModel): - """ - Author model - """ - pass - -class TSongAuthor(BaseModel): - """ - Author model - """ - pass - -class MigrateSongs(object): - def __init__(self, display): - self.display = display - self.data_path = AppLocation.get_section_data_path(u'songs') - self.database_files = SettingsManager.get_files(u'songs', u'.sqlite') - print self.database_files - - def process(self): - self.display.output(u'Songs processing started') - for f in self.database_files: - self.v_1_9_0(f) - self.display.output(u'Songs processing finished') - - def v_1_9_0(self, database): - self.display.output(u'Migration 1.9.0 Started for ' + database) - self._v1_9_0_old(database) - self._v1_9_0_new(database) - self._v1_9_0_cleanup(database) - self.display.output(u'Migration 1.9.0 Finished for ' + database) - - def _v1_9_0_old(self, database): - self.display.sub_output(u'Rename Tables ' + database) - conn = sqlite3.connect(self.data_path + os.sep + database) - conn.execute(u'alter table authors rename to authors_temp;') - conn.commit() - conn.execute(u'alter table songs rename to songs_temp;') - conn.commit() - conn.execute(u'alter table songauthors rename to songauthors_temp;') - conn.commit() - - def _v1_9_0_new(self, database): - self.display.sub_output(u'Create new Tables ' + database) - self.db_url = u'sqlite:///' + self.data_path + u'/songs.sqlite' - print self.db_url - self.session = init_models(self.db_url) - metadata.create_all(checkfirst=True) - results = self.session.query(TSong).order_by(TSong.songid).all() - for songs_temp in results: - song = Song() - song.title = songs_temp.songtitle - song.lyrics = songs_temp.lyrics.replace(u'\r\n', u'\n') - song.copyright = songs_temp.copyrightinfo - song.search_title = u'' - song.search_lyrics = u'' - print songs_temp.songtitle - aa = self.session.execute( - u'select * from songauthors_temp where songid =' + \ - unicode(songs_temp.songid)) - for row in aa: - a = row['authorid'] - authors_temp = self.session.query(TAuthor).get(a) - bb = self.session.execute( - u'select * from authors where display_name = \"%s\"' % \ - unicode(authors_temp.authorname)).fetchone() - if bb is None: - author = Author() - author.display_name = authors_temp.authorname - author.first_name = u'' - author.last_name = u'' - else: - author = self.session.query(Author).get(bb[0]) - song.authors.append(author) - try: - self.session.add(song) - self.session.commit() - except InvalidRequestError: - self.session.rollback() - print u'Error thrown = ', sys.exc_info()[1] - - def _v1_9_0_cleanup(self, database): - self.display.sub_output(u'Update Internal Data ' + database) - conn = sqlite3.connect(self.data_path + os.sep + database) - conn.execute("""update songs set search_title = - replace(replace(replace(replace(replace(replace(replace(replace( - replace(title, '&', 'and'), ',', ''), ';', ''), ':', ''), - '(u', ''), ')', ''), '{', ''), '}',''),'?','');""") - conn.execute("""update songs set search_lyrics = - replace(replace(replace(replace(replace(replace(replace(replace( - replace(lyrics, '&', 'and'), ',', ''), ';', ''), ':', ''), - '(u', ''), ')', ''), '{', ''), '}',''),'?','') - ;""") - conn.commit() - conn.execute(u'drop table authors_temp;') - conn.commit() - conn.execute(u'drop table songs_temp;') - conn.commit() - conn.execute(u'drop table songauthors_temp;') - conn.commit() - conn.execute(u'drop table settings;') - conn.commit() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index ae7569c10..5d8fe03a4 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -29,7 +29,7 @@ import os from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \ - ItemCapabilities, SettingsManager, context_menu_action, Receiver, translate + ItemCapabilities, SettingsManager, translate log = logging.getLogger(__name__) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index b7d6ffc7f..a3f5e0b4f 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -298,8 +298,10 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): last_name=text.rsplit(u' ', 1)[1], display_name=text) self.songmanager.save_author(author) self.song.authors.append(author) - author_item = QtGui.QListWidgetItem(unicode(author.display_name)) - author_item.setData(QtCore.Qt.UserRole, QtCore.QVariant(author.id)) + author_item = QtGui.QListWidgetItem( + unicode(author.display_name)) + author_item.setData(QtCore.Qt.UserRole, + QtCore.QVariant(author.id)) self.AuthorsListView.addItem(author_item) self.loadAuthors() self.AuthorsSelectionComboItem.setCurrentIndex(0) @@ -349,7 +351,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.songmanager.save_topic(topic) self.song.topics.append(topic) topic_item = QtGui.QListWidgetItem(unicode(topic.name)) - topic_item.setData(QtCore.Qt.UserRole, QtCore.QVariant(topic.id)) + topic_item.setData(QtCore.Qt.UserRole, + QtCore.QVariant(topic.id)) self.TopicsListView.addItem(topic_item) self.loadTopics() self.SongTopicCombo.setCurrentIndex(0)