diff --git a/openlp/core/ui/amendthemeform.py b/openlp/core/ui/amendthemeform.py index 187d5f6e2..2ba1872ad 100644 --- a/openlp/core/ui/amendthemeform.py +++ b/openlp/core/ui/amendthemeform.py @@ -193,7 +193,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): def onImageToolButtonClicked(self): filename = QtGui.QFileDialog.getOpenFileName( - self, self.trUtf8('Open file')) + self, self.trUtf8(u'Open file')) if filename: self.ImageLineEdit.setText(filename) self.theme.background_filename = filename diff --git a/openlp-get-strings.py b/scripts/get-strings.py similarity index 75% rename from openlp-get-strings.py rename to scripts/get-strings.py index 02aa16772..df6db6369 100755 --- a/openlp-get-strings.py +++ b/scripts/get-strings.py @@ -24,7 +24,7 @@ ############################################################################### import os -import re +from ast import parse, NodeVisitor, Str ts_file = u""" @@ -42,27 +42,37 @@ ts_message = u""" """ -find_trUtf8 = re.compile(r"trUtf8\(u?(['\"])([^\1]+)\1\)", re.UNICODE) -strings = {} -def parse_file(filename): - global strings +class StringExtractor(NodeVisitor): + + def __init__(self, strings, filename): + self.filename = filename + self.strings = strings + self.classname = 'unknown' + + def visit_ClassDef(self, node): + self.classname = node.name + self.generic_visit(node) + + def visit_Call(self, node): + if hasattr(node.func, 'attr') and node.func.attr == 'trUtf8' and isinstance(node.args[0], Str): + string = node.args[0].s + key = '%s-%s' % (self.classname, string) + self.strings[key] = [self.classname, self.filename, node.lineno, string] + self.generic_visit(node) + +def parse_file(filename, strings): file = open(filename, u'r') - class_name = u'' - line_number = 0 - for line in file: - line_number += 1 - if line[:5] == u'class': - class_name = line[6:line.find(u'(')] - continue - for match in find_trUtf8.finditer(line): - key = u'%s-%s' % (class_name, match.group(2)) - if not key in strings: - strings[key] = [class_name, filename, line_number, match.group(2)] + try: + ast = parse(file.read()) + except SyntaxError, e: + print "Unable to parse %s: %s" % (filename, e) + return file.close() -def write_file(filename): - global strings + StringExtractor(strings, filename).visit(ast) + +def write_file(filename, strings): translation_file = u'' translation_contexts = [] translation_messages = [] @@ -79,18 +89,19 @@ def write_file(filename): translation_contexts.append(current_context) translation_file = ts_file % (u''.join(translation_contexts)) file = open(filename, u'w') - file.write(translation_file) + file.write(translation_file.encode('utf8')) file.close() def main(): + strings = {} start_dir = u'.' for root, dirs, files in os.walk(start_dir): for file in files: if file.endswith(u'.py'): print u'Parsing "%s"' % file - parse_file(os.path.join(root, file)) + parse_file(os.path.join(root, file), strings) print u'Generating TS file...', - write_file(os.path.join(start_dir, u'i18n', u'openlp_en.ts')) + write_file(os.path.join(start_dir, u'i18n', u'openlp_en.ts'), strings) print u'done.' if __name__ == u'__main__':