← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~m2j/openlp/work into lp:openlp

 

m2j has proposed merging lp:~m2j/openlp/work into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)


1. String cleanups in the themes area
2. Unicode rules theme background image file names
-- 
https://code.launchpad.net/~m2j/openlp/work/+merge/27989
Your team OpenLP Core is requested to review the proposed merge of lp:~m2j/openlp/work into lp:openlp.
=== modified file 'openlp/core/lib/__init__.py'
--- openlp/core/lib/__init__.py	2010-06-15 15:22:26 +0000
+++ openlp/core/lib/__init__.py	2010-06-19 12:04:27 +0000
@@ -52,9 +52,10 @@
 
 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 @@
     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:

=== modified file 'openlp/core/lib/themexmlhandler.py'
--- openlp/core/lib/themexmlhandler.py	2010-05-29 19:50:50 +0000
+++ openlp/core/lib/themexmlhandler.py	2010-06-19 12:04:27 +0000
@@ -96,9 +96,8 @@
             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 @@
         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 @@
         ``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:

=== modified file 'openlp/core/theme/theme.py'
--- openlp/core/theme/theme.py	2010-06-12 20:22:58 +0000
+++ openlp/core/theme/theme.py	2010-06-19 12:04:27 +0000
@@ -175,7 +175,7 @@
         ``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

=== modified file 'openlp/core/ui/amendthemedialog.py'
--- openlp/core/ui/amendthemedialog.py	2010-06-08 15:38:09 +0000
+++ openlp/core/ui/amendthemedialog.py	2010-06-19 12:04:27 +0000
@@ -750,158 +750,153 @@
 
     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'<Color1>'))
-        self.Color2Label.setText(translate(u'AmendThemeForm', u'<Color2>'))
-        self.ImageLabel.setText(translate(u'AmendThemeForm', u'Image:'))
-        self.GradientLabel.setText(translate(u'AmendThemeForm', u'Gradient :'))
+            translate('AmendThemeForm', 'Image'))
+        self.Color1Label.setText(u'<Color1>:')
+        self.Color2Label.setText(u'<Color2>:')
+        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'))
 

=== modified file 'openlp/core/ui/amendthemeform.py'
--- openlp/core/ui/amendthemeform.py	2010-06-15 15:22:26 +0000
+++ openlp/core/ui/amendthemeform.py	2010-06-19 12:04:27 +0000
@@ -138,8 +138,8 @@
 
     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 @@
         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 @@
                 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 @@
                 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 @@
                 (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))

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2010-06-18 23:48:16 +0000
+++ openlp/core/ui/mainwindow.py	2010-06-19 12:04:27 +0000
@@ -356,8 +356,6 @@
         """
         MainWindow.mainTitle = translate('MainWindow', 'OpenLP 2.0')
         MainWindow.language = translate('MainWindow', 'English')
-        MainWindow.defaultThemeText = translate('MainWindow',
-            'Default Theme: ')
         MainWindow.setWindowTitle(MainWindow.mainTitle)
         self.FileMenu.setTitle(translate('MainWindow', '&File'))
         self.FileImportMenu.setTitle(translate('MainWindow', '&Import'))
@@ -774,7 +772,7 @@
 
     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:

=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py	2010-06-17 21:07:01 +0000
+++ openlp/core/ui/thememanager.py	2010-06-19 12:04:27 +0000
@@ -54,25 +54,25 @@
         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 @@
         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 @@
                 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 @@
             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 @@
             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 @@
         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 @@
                             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 @@
         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 @@
                 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 @@
                     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 @@
                             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 @@
             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 @@
         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 @@
         """
         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')

=== modified file 'openlp/core/ui/themestab.py'
--- openlp/core/ui/themestab.py	2010-06-06 09:52:11 +0000
+++ openlp/core/ui/themestab.py	2010-06-19 12:04:27 +0000
@@ -37,7 +37,7 @@
 
     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 @@
             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()


Follow ups