openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #03550
[Merge] lp:~raoul-snyman/openlp/windows-fixes into lp:openlp
Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/windows-fixes into lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
Some more fixes for the Windows World:
- Fixed location of .qm files, so that they can be found in a Windows build
- Added PyEnchant to the build process
- Fixed up langaugemanager.py so that it conforms to coding standards
--
https://code.launchpad.net/~raoul-snyman/openlp/windows-fixes/+merge/35737
Your team OpenLP Core is requested to review the proposed merge of lp:~raoul-snyman/openlp/windows-fixes into lp:openlp.
=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py 2010-08-28 23:52:10 +0000
+++ openlp/core/ui/mainwindow.py 2010-09-16 20:46:44 +0000
@@ -250,7 +250,7 @@
self.LanguageGroup = QtGui.QActionGroup(MainWindow)
qmList = LanguageManager.get_qm_list()
savedLanguage = LanguageManager.get_language()
- self.AutoLanguageItem.setChecked(LanguageManager.AutoLanguage)
+ self.AutoLanguageItem.setChecked(LanguageManager.auto_language)
for key in sorted(qmList.keys()):
languageItem = QtGui.QAction(MainWindow)
languageItem.setObjectName(key)
@@ -258,7 +258,7 @@
if qmList[key] == savedLanguage:
languageItem.setChecked(True)
add_actions(self.LanguageGroup, [languageItem])
- self.LanguageGroup.setDisabled(LanguageManager.AutoLanguage)
+ self.LanguageGroup.setDisabled(LanguageManager.auto_language)
self.ToolsAddToolItem = QtGui.QAction(MainWindow)
self.ToolsAddToolItem.setIcon(build_icon(u':/tools/tools_add.png'))
self.ToolsAddToolItem.setObjectName(u'ToolsAddToolItem')
@@ -640,7 +640,7 @@
def setAutoLanguage(self, value):
self.LanguageGroup.setDisabled(value)
- LanguageManager.AutoLanguage = value
+ LanguageManager.auto_language = value
LanguageManager.set_language(self.LanguageGroup.checkedAction())
def versionNotice(self, version):
=== modified file 'openlp/core/utils/__init__.py'
--- openlp/core/utils/__init__.py 2010-09-14 14:43:21 +0000
+++ openlp/core/utils/__init__.py 2010-09-16 20:46:44 +0000
@@ -102,6 +102,7 @@
PluginsDir = 4
VersionDir = 5
CacheDir = 6
+ LanguageDir = 7
@staticmethod
def get_directory(dir_type=1):
@@ -173,6 +174,13 @@
except ImportError:
path = os.path.join(os.getenv(u'HOME'), u'.openlp')
return path
+ if dir_type == AppLocation.LanguageDir:
+ if hasattr(sys, u'frozen') and sys.frozen == 1:
+ app_path = os.path.abspath(os.path.split(sys.argv[0])[0])
+ else:
+ app_path = os.path.split(openlp.__file__)[0]
+ return os.path.join(app_path, u'i18n')
+
@staticmethod
def get_data_path():
=== modified file 'openlp/core/utils/languagemanager.py'
--- openlp/core/utils/languagemanager.py 2010-09-12 09:14:02 +0000
+++ openlp/core/utils/languagemanager.py 2010-09-16 20:46:44 +0000
@@ -35,14 +35,14 @@
from openlp.core.utils import AppLocation
from openlp.core.lib import translate
-log = logging.getLogger()
+log = logging.getLogger(__name__)
class LanguageManager(object):
"""
Helper for Language selection
"""
- __qmList__ = None
- AutoLanguage = False
+ __qm_list__ = {}
+ auto_language = False
@staticmethod
def get_translator(language):
@@ -52,12 +52,11 @@
``language``
The language to load into the translator
"""
- if LanguageManager.AutoLanguage:
+ if LanguageManager.auto_language:
language = QtCore.QLocale.system().name()
- lang_path = AppLocation.get_directory(AppLocation.AppDir)
- lang_path = os.path.join(lang_path, u'i18n')
+ lang_path = AppLocation.get_directory(AppLocation.LanguageDir)
app_translator = QtCore.QTranslator()
- if app_translator.load("openlp_" + language, lang_path):
+ if app_translator.load(language, lang_path):
return app_translator
@staticmethod
@@ -65,8 +64,8 @@
"""
Find all available language files in this OpenLP install
"""
- trans_dir = AppLocation.get_directory(AppLocation.AppDir)
- trans_dir = QtCore.QDir(os.path.join(trans_dir, u'i18n'))
+ trans_dir = QtCore.QDir(AppLocation.get_directory(
+ AppLocation.LanguageDir))
file_names = trans_dir.entryList(QtCore.QStringList("*.qm"),
QtCore.QDir.Files, QtCore.QDir.Name)
for name in file_names:
@@ -96,7 +95,7 @@
log.info(u'Language file: \'%s\' Loaded from conf file' % language)
reg_ex = QtCore.QRegExp("^\[(.*)\]")
if reg_ex.exactMatch(language):
- LanguageManager.AutoLanguage = True
+ LanguageManager.auto_language = True
language = reg_ex.cap(1)
return language
@@ -110,7 +109,7 @@
"""
action_name = u'%s' % action.objectName()
qm_list = LanguageManager.get_qm_list()
- if LanguageManager.AutoLanguage:
+ if LanguageManager.auto_language:
language = u'[%s]' % qm_list[action_name]
else:
language = u'%s' % qm_list[action_name]
@@ -127,20 +126,18 @@
"""
Initialise the list of available translations
"""
- LanguageManager.__qmList__ = {}
+ LanguageManager.__qm_list__ = {}
qm_files = LanguageManager.find_qm_files()
- for i, qmf in enumerate(qm_files):
- reg_ex = QtCore.QRegExp("^.*openlp_(.*).qm")
- if reg_ex.exactMatch(qmf):
- lang_name = reg_ex.cap(1)
- LanguageManager.__qmList__[u'%#2i %s' % (i+1,
- LanguageManager.language_name(qmf))] = lang_name
+ for counter, qmf in enumerate(qm_files):
+ name = unicode(qmf).split(u'.')[0]
+ LanguageManager.__qm_list__[u'%#2i %s' % (counter + 1,
+ LanguageManager.language_name(qmf))] = name
@staticmethod
def get_qm_list():
"""
Return the list of available translations
"""
- if LanguageManager.__qmList__ is None:
+ if not LanguageManager.__qm_list__:
LanguageManager.init_qm_list()
- return LanguageManager.__qmList__
+ return LanguageManager.__qm_list__
=== modified file 'scripts/windows-builder.py'
--- scripts/windows-builder.py 2010-07-27 09:32:52 +0000
+++ scripts/windows-builder.py 2010-09-16 20:46:44 +0000
@@ -31,6 +31,18 @@
This script is used to build the Windows binary and the accompanying installer.
For this script to work out of the box, it depends on a number of things:
+Python 2.6
+ This build script only works with Python 2.6.
+
+PyQt4
+ You should already have this installed, OpenLP doesn't work without it. The
+ version the script expects is the packaged one available from River Bank
+ Computing.
+
+PyEnchant
+ This script expects the precompiled, installable version of PyEnchant to be
+ installed. You can find this on the PyEnchant site.
+
Inno Setup 5
Inno Setup should be installed into "C:\%PROGRAMFILES%\Inno Setup 5"
@@ -41,9 +53,10 @@
add that directory to your PATH environment variable.
PyInstaller
- PyInstaller should be a checkout of trunk, and in a directory called,
- "pyinstaller" on the same level as OpenLP's Bazaar shared repository
- directory.
+ PyInstaller should be a checkout of revision 844 of trunk, and in a
+ directory called, "pyinstaller" on the same level as OpenLP's Bazaar shared
+ repository directory. The revision is very important as there is currently
+ a major regression in HEAD.
To install PyInstaller, first checkout trunk from Subversion. The easiest
way is to install TortoiseSVN and then checkout the following URL to a
@@ -80,17 +93,32 @@
script_path = os.path.split(os.path.abspath(__file__))[0]
branch_path = os.path.abspath(os.path.join(script_path, u'..'))
source_path = os.path.join(branch_path, u'openlp')
+i18n_path = os.path.join(branch_path, u'resources', u'i18n')
+build_path = os.path.join(branch_path, u'build', u'pyi.win32', u'OpenLP')
dist_path = os.path.join(branch_path, u'dist', u'OpenLP')
pyinstaller_path = os.path.abspath(os.path.join(branch_path, u'..', u'..', u'pyinstaller'))
innosetup_path = os.path.join(os.getenv(u'PROGRAMFILES'), 'Inno Setup 5')
iss_path = os.path.join(branch_path, u'resources', u'innosetup')
+lrelease_path = u'C:\\Python26\\Lib\\site-packages\\PyQt4\\bin\\lrelease.exe'
+enchant_path = u'C:\\Python26\\Lib\\site-packages\\enchant'
+def clean_build_directories():
+ #if not os.path.exists(build_path)
+ for root, dirs, files in os.walk(build_path, topdown=False):
+ print root
+ for file in files:
+ os.remove(os.path.join(root, file))
+ #os.removedirs(build_path)
+ for root, dirs, files in os.walk(dist_path, topdown=False):
+ for file in files:
+ os.remove(os.path.join(root, file))
+ #os.removedirs(dist_path)
def run_pyinstaller():
print u'Running PyInstaller...'
os.chdir(branch_path)
pyinstaller = Popen((u'python', os.path.join(pyinstaller_path, u'Build.py'),
- u'OpenLP.spec'))
+ u'-y', u'OpenLP.spec'))
code = pyinstaller.wait()
if code != 0:
raise Exception(u'Error running PyInstaller Build.py')
@@ -120,6 +148,19 @@
f.write(versionstring)
f.close()
+def copy_enchant():
+ print u'Copying enchant/pyenchant...'
+ source = enchant_path
+ dest = os.path.join(dist_path, u'enchant')
+ for root, dirs, files in os.walk(source):
+ for filename in files:
+ if not filename.endswith(u'.pyc') and not filename.endswith(u'.pyo'):
+ dest_path = os.path.join(dest, root[len(source)+1:])
+ if not os.path.exists(dest_path):
+ os.makedirs(dest_path)
+ copy(os.path.join(root, filename),
+ os.path.join(dest_path, filename))
+
def copy_plugins():
print u'Copying plugins...'
source = os.path.join(source_path, u'plugins')
@@ -138,6 +179,21 @@
copy(os.path.join(iss_path, u'OpenLP.ico'), os.path.join(dist_path, u'OpenLP.ico'))
copy(os.path.join(iss_path, u'LICENSE.txt'), os.path.join(dist_path, u'LICENSE.txt'))
+def compile_translations():
+ files = os.listdir(i18n_path)
+ if not os.path.exists(os.path.join(dist_path, u'i18n')):
+ os.makedirs(os.path.join(dist_path, u'i18n'))
+ for file in files:
+ if file.endswith(u'.ts'):
+ source_path = os.path.join(i18n_path, file)
+ dest_path = os.path.join(dist_path, u'i18n',
+ file.replace(u'.ts', u'.qm'))
+ lconvert = Popen(u'"%s" "%s" -qm "%s"' % (lrelease_path, \
+ source_path, dest_path))
+ code = lconvert.wait()
+ if code != 0:
+ print 'Error running lconvert on %s' % source_path
+
def run_innosetup():
print u'Running Inno Setup...'
os.chdir(iss_path)
@@ -150,17 +206,22 @@
raise Exception(u'Error running Inno Setup')
def main():
- print "Script path:", script_path
- print "Branch path:", branch_path
- print "Source path:", source_path
- print "\"dist\" path:", dist_path
- print "PyInstaller path:", pyinstaller_path
- print "Inno Setup path:", innosetup_path
- print "ISS file path:", iss_path
+ import sys
+ if len(sys.argv) > 1 and (sys.argv[1] == u'-v' or sys.argv[1] == u'--verbose'):
+ print "Script path:", script_path
+ print "Branch path:", branch_path
+ print "Source path:", source_path
+ print "\"dist\" path:", dist_path
+ print "PyInstaller path:", pyinstaller_path
+ print "Inno Setup path:", innosetup_path
+ print "ISS file path:", iss_path
+ #clean_build_directories()
run_pyinstaller()
write_version_file()
+ copy_enchant()
copy_plugins()
copy_windows_files()
+ compile_translations()
run_innosetup()
print "Done."
Follow ups