Update the translation script to use argparse instead of optparse.

Add this to your merge proposal:
--------------------------------
lp:~raoul-snyman/openlp/fix-translation-script (revision 2579)
[SUCCESS] https://ci.openlp.io/job/Branch-01-Pull/1200/
[SUCCESS] https://ci.openlp.io/job/Branch-02-Functional-Tests/1125/
[SUCCESS] https://ci.openlp.io/job/Branch-03-Interface-Tests/1064/
[FAILURE] https://ci.openlp.io/job/Branch-04a-Windows_Functional_Tests/910/
Stopping after failure

bzr-revno: 2578
This commit is contained in:
raoul@snyman.info 2015-12-24 19:30:44 +00:00 committed by Tim Bentley
commit 6e684cab6c
1 changed files with 58 additions and 48 deletions

View File

@ -45,21 +45,22 @@ This is done easily via the ``-d``, ``-p`` and ``-u`` options::
@:~$ ./translation_utils.py -dpu @:~$ ./translation_utils.py -dpu
""" """
import os from argparse import ArgumentParser
import urllib.request
import urllib.error
import urllib.parse
from getpass import getpass from getpass import getpass
import base64 import base64
import json
import webbrowser
import glob import glob
import json
import os
import sys
import urllib.error
import urllib.parse
import urllib.request
import webbrowser
from lxml import etree, objectify
from optparse import OptionParser
from PyQt5 import QtCore from PyQt5 import QtCore
from lxml import etree, objectify
SERVER_URL = 'http://www.transifex.net/api/2/project/openlp/resource/openlp-22x/' SERVER_URL = 'http://www.transifex.net/api/2/project/openlp/resource/openlp-24x/'
IGNORED_PATHS = ['scripts'] IGNORED_PATHS = ['scripts']
IGNORED_FILES = ['setup.py'] IGNORED_FILES = ['setup.py']
@ -300,6 +301,7 @@ def check_format_strings():
This method runs through the ts-files and looks for mismatches between format strings in the original text This method runs through the ts-files and looks for mismatches between format strings in the original text
and in the translations. and in the translations.
""" """
is_ok = True
path = os.path.join(os.path.abspath('..'), 'resources', 'i18n', '*.ts') path = os.path.join(os.path.abspath('..'), 'resources', 'i18n', '*.ts')
file_list = glob.glob(path) file_list = glob.glob(path)
for filename in file_list: for filename in file_list:
@ -317,14 +319,17 @@ def check_format_strings():
print_verbose('parsed numerusform: location: %s, source: %s, translation: %s' % ( print_verbose('parsed numerusform: location: %s, source: %s, translation: %s' % (
location, org_text, num.text)) location, org_text, num.text))
if num and org_text.count('%') != num.text.count('%'): if num and org_text.count('%') != num.text.count('%'):
is_ok = False
print_quiet( print_quiet(
'ERROR: Translation from %s at line %s has a mismatch of format input:\n%s\n%s\n' % ( 'ERROR: Translation from %s at line %s has a mismatch of format input:\n%s\n%s\n' % (
location, line, org_text, num.text)) location, line, org_text, num.text))
else: else:
print_verbose('parsed: location: %s, source: %s, translation: %s' % (location, org_text, translation)) print_verbose('parsed: location: %s, source: %s, translation: %s' % (location, org_text, translation))
if org_text.count('%') != translation.count('%'): if org_text.count('%') != translation.count('%'):
is_ok = False
print_quiet('ERROR: Translation from %s at line %s has a mismatch of format input:\n%s\n%s\n' % ( print_quiet('ERROR: Translation from %s at line %s has a mismatch of format input:\n%s\n%s\n' % (
location, line, org_text, translation)) location, line, org_text, translation))
return is_ok
def process_stack(command_stack): def process_stack(command_stack):
@ -335,6 +340,7 @@ def process_stack(command_stack):
``command_stack`` ``command_stack``
The command stack to process. The command stack to process.
""" """
is_success = True
if command_stack: if command_stack:
print_quiet('Processing %d commands...' % len(command_stack)) print_quiet('Processing %d commands...' % len(command_stack))
for command in command_stack: for command in command_stack:
@ -351,70 +357,74 @@ def process_stack(command_stack):
elif command == Command.Create: elif command == Command.Create:
create_translation() create_translation()
elif command == Command.Check: elif command == Command.Check:
check_format_strings() is_success = check_format_strings()
print_quiet('Finished processing commands.') print_quiet('Finished processing commands.')
else: else:
print_quiet('No commands to process.') print_quiet('No commands to process.')
return is_success
def main(): def main():
global verbose_mode, quiet_mode, username, password global verbose_mode, quiet_mode, username, password
# Set up command line options. # Set up command line options.
usage = '%prog [options]\nOptions are parsed in the order they are ' + \ usage = '%(prog)s [options]\nOptions are parsed in the order they are ' + \
'listed below. If no options are given, "-dpug" will be used.\n\n' + \ 'listed below. If no options are given, "-dpug" will be used.\n\n' + \
'This script is used to manage OpenLP\'s translation files.' 'This script is used to manage OpenLP\'s translation files.'
parser = OptionParser(usage=usage) parser = ArgumentParser(usage=usage)
parser.add_option('-U', '--username', dest='username', metavar='USERNAME', parser.add_argument('-U', '--username', dest='username', metavar='USERNAME',
help='Transifex username, used for authentication') help='Transifex username, used for authentication')
parser.add_option('-P', '--password', dest='password', metavar='PASSWORD', parser.add_argument('-P', '--password', dest='password', metavar='PASSWORD',
help='Transifex password, used for authentication') help='Transifex password, used for authentication')
parser.add_option('-d', '--download-ts', dest='download', parser.add_argument('-d', '--download-ts', dest='download',
action='store_true', help='download language files from Transifex') action='store_true', help='download language files from Transifex')
parser.add_option('-c', '--create', dest='create', action='store_true', parser.add_argument('-c', '--create', dest='create', action='store_true',
help='go to Transifex to request a new translation file') help='go to Transifex to request a new translation file')
parser.add_option('-p', '--prepare', dest='prepare', action='store_true', parser.add_argument('-p', '--prepare', dest='prepare', action='store_true',
help='generate a project file, used to update the translations') help='generate a project file, used to update the translations')
parser.add_option('-u', '--update', action='store_true', dest='update', parser.add_argument('-u', '--update', action='store_true', dest='update',
help='update translation files (needs a project file)') help='update translation files (needs a project file)')
parser.add_option('-g', '--generate', dest='generate', action='store_true', parser.add_argument('-g', '--generate', dest='generate', action='store_true',
help='compile .ts files into .qm files') help='compile .ts files into .qm files')
parser.add_option('-v', '--verbose', dest='verbose', action='store_true', parser.add_argument('-v', '--verbose', dest='verbose', action='store_true',
help='show extra information while processing translations') help='show extra information while processing translations')
parser.add_option('-q', '--quiet', dest='quiet', action='store_true', parser.add_argument('-q', '--quiet', dest='quiet', action='store_true',
help='suppress all output other than errors') help='suppress all output other than errors')
parser.add_option('-f', '--check-format-strings', dest='check', action='store_true', parser.add_argument('-f', '--check-format-strings', dest='check', action='store_true',
help='check that format strings are matching in translations') help='check that format strings are matching in translations')
(options, args) = parser.parse_args() args = parser.parse_args()
# Create and populate the command stack # Create and populate the command stack
command_stack = CommandStack() command_stack = CommandStack()
if options.download: if args.download:
command_stack.append(Command.Download) command_stack.append(Command.Download)
if options.create: if args.create:
command_stack.append(Command.Create, arguments=[options.create]) command_stack.append(Command.Create, arguments=[args.create])
if options.prepare: if args.prepare:
command_stack.append(Command.Prepare) command_stack.append(Command.Prepare)
if options.update: if args.update:
command_stack.append(Command.Update) command_stack.append(Command.Update)
if options.generate: if args.generate:
command_stack.append(Command.Generate) command_stack.append(Command.Generate)
if options.check: if args.check:
command_stack.append(Command.Check) command_stack.append(Command.Check)
verbose_mode = options.verbose verbose_mode = args.verbose
quiet_mode = options.quiet quiet_mode = args.quiet
if options.username: if args.username:
username = options.username username = args.username
if options.password: if args.password:
password = options.password password = args.password
if not command_stack: if not command_stack:
command_stack.append(Command.Download) command_stack.append(Command.Download)
command_stack.append(Command.Prepare) command_stack.append(Command.Prepare)
command_stack.append(Command.Update) command_stack.append(Command.Update)
command_stack.append(Command.Generate) command_stack.append(Command.Generate)
# Process the commands # Process the commands
process_stack(command_stack) return process_stack(command_stack)
if __name__ == '__main__': if __name__ == '__main__':
if os.path.split(os.path.abspath('.'))[1] != 'scripts': if os.path.split(os.path.abspath('.'))[1] != 'scripts':
print('You need to run this script from the scripts directory.') print('You need to run this script from the scripts directory.')
else: else:
main() if not main():
sys.exit(1)