| Index: build.py | 
| diff --git a/build.py b/build.py | 
| index 518577d88904aee6ff9c1502aab400809f54cad1..ff6620bf4096e13da637c62ac68b059321b4768a 100644 | 
| --- a/build.py | 
| +++ b/build.py | 
| @@ -9,7 +9,7 @@ from getopt import getopt, GetoptError | 
| from StringIO import StringIO | 
| from zipfile import ZipFile | 
| -knownTypes = ('gecko', 'chrome', 'opera', 'safari') | 
| +knownTypes = ('gecko', 'chrome', 'opera', 'safari', 'generic') | 
| class Command(object): | 
| name = property(lambda self: self._name) | 
| @@ -236,6 +236,47 @@ def createDevEnv(baseDir, scriptName, opts, args, type): | 
| zip_file.extractall(devenv_dir) | 
| +def readLocaleConfig(baseDir, type, metadata, includeIncomplete=False): | 
| + if type == 'gecko': | 
| + import buildtools.packagerGecko as packager | 
| + localeDir = packager.getLocalesDir(baseDir) | 
| + localeConfig = { | 
| + 'name_format': 'BCP-47', | 
| + 'file_format': 'gecko-dtd', | 
| + 'target_platforms': {'gecko'}, | 
| + 'default_locale': packager.defaultLocale | 
| + } | 
| + elif type == 'chrome' or type == 'opera': | 
| + import buildtools.packagerChrome as packager | 
| + localeDir = os.path.join(baseDir, '_locales') | 
| + localeConfig = { | 
| + 'name_format': 'ISO-15897', | 
| + 'file_format': 'chrome-json', | 
| + 'target_platforms': {'chrome'}, | 
| + 'default_locale': packager.defaultLocale, | 
| + } | 
| + else: | 
| + localeDir = os.path.join(baseDir, | 
| + *metadata.get('locales', 'base_path').split('/')) | 
| + localeConfig = { | 
| + 'name_format': metadata.get('locales', 'name_format'), | 
| + 'file_format': metadata.get('locales', 'file_format'), | 
| + 'target_platforms': set(metadata.get('locales', | 
| + 'target_platforms').split()), | 
| + 'default_locale': metadata.get('locales', 'default_locale') | 
| + } | 
| + | 
| + localeConfig['base_path'] = localeDir | 
| + | 
| + locales = [(locale, os.path.join(localeDir, locale)) | 
| + for locale in os.listdir(localeDir)] | 
| 
 
Wladimir Palant
2016/02/12 19:49:34
This is actually fine for the use cases so far, bu
 
kzar
2016/02/12 20:05:36
Done but I omitted this parameter accidentally, ar
 
 | 
| + if localeConfig['name_format'] == 'ISO-15897': | 
| + locales = [(locale.replace('_', '-'), localePath) | 
| + for locale, localePath in locales] | 
| + localeConfig['locales'] = dict(locales) | 
| + | 
| + return localeConfig | 
| + | 
| def setupTranslations(baseDir, scriptName, opts, args, type): | 
| if len(args) < 1: | 
| print 'Project key is required to update translation master files.' | 
| @@ -246,18 +287,12 @@ def setupTranslations(baseDir, scriptName, opts, args, type): | 
| from buildtools.packager import readMetadata | 
| metadata = readMetadata(baseDir, type) | 
| - basename = metadata.get('general', 'basename') | 
| - if type == 'chrome' or type == 'opera': | 
| - import buildtools.packagerChrome as packager | 
| - locales = os.listdir(os.path.join(baseDir, '_locales')) | 
| - locales = map(lambda locale: locale.replace('_', '-'), locales) | 
| - else: | 
| - import buildtools.packagerGecko as packager | 
| - locales = packager.getLocales(baseDir, True) | 
| + basename = metadata.get('general', 'basename') | 
| + localeConfig = readLocaleConfig(baseDir, type, metadata, True) | 
| import buildtools.localeTools as localeTools | 
| - localeTools.setupTranslations(type, locales, basename, key) | 
| + localeTools.setupTranslations(localeConfig, basename, key) | 
| def updateTranslationMaster(baseDir, scriptName, opts, args, type): | 
| @@ -270,17 +305,16 @@ def updateTranslationMaster(baseDir, scriptName, opts, args, type): | 
| from buildtools.packager import readMetadata | 
| metadata = readMetadata(baseDir, type) | 
| + | 
| basename = metadata.get('general', 'basename') | 
| + localeConfig = readLocaleConfig(baseDir, type, metadata) | 
| - if type == 'chrome' or type == 'opera': | 
| - import buildtools.packagerChrome as packager | 
| - defaultLocaleDir = os.path.join(baseDir, '_locales', packager.defaultLocale) | 
| - else: | 
| - import buildtools.packagerGecko as packager | 
| - defaultLocaleDir = os.path.join(packager.getLocalesDir(baseDir), packager.defaultLocale) | 
| + defaultLocaleDir = os.path.join(localeConfig['base_path'], | 
| + localeConfig['default_locale']) | 
| import buildtools.localeTools as localeTools | 
| - localeTools.updateTranslationMaster(type, metadata, defaultLocaleDir, basename, key) | 
| + localeTools.updateTranslationMaster(localeConfig, metadata, defaultLocaleDir, | 
| + basename, key) | 
| def uploadTranslations(baseDir, scriptName, opts, args, type): | 
| @@ -293,23 +327,15 @@ def uploadTranslations(baseDir, scriptName, opts, args, type): | 
| from buildtools.packager import readMetadata | 
| metadata = readMetadata(baseDir, type) | 
| - basename = metadata.get('general', 'basename') | 
| - if type == 'chrome' or type == 'opera': | 
| - import buildtools.packagerChrome as packager | 
| - localesDir = os.path.join(baseDir, '_locales') | 
| - locales = os.listdir(localesDir) | 
| - locales = map(lambda locale: (locale.replace('_', '-'), os.path.join(localesDir, locale)), locales) | 
| - else: | 
| - import buildtools.packagerGecko as packager | 
| - localesDir = packager.getLocalesDir(baseDir) | 
| - locales = packager.getLocales(baseDir, True) | 
| - locales = map(lambda locale: (locale, os.path.join(localesDir, locale)), locales) | 
| + basename = metadata.get('general', 'basename') | 
| + localeConfig = readLocaleConfig(baseDir, type, metadata, True) | 
| import buildtools.localeTools as localeTools | 
| - for locale, localeDir in locales: | 
| - if locale != packager.defaultLocale: | 
| - localeTools.uploadTranslations(type, metadata, localeDir, locale, basename, key) | 
| + for locale, localeDir in localeConfig['locales'].iteritems(): | 
| + if locale != localeConfig['default_locale']: | 
| + localeTools.uploadTranslations(localeConfig, metadata, localeDir, locale, | 
| + basename, key) | 
| def getTranslations(baseDir, scriptName, opts, args, type): | 
| @@ -318,20 +344,16 @@ def getTranslations(baseDir, scriptName, opts, args, type): | 
| usage(scriptName, type, 'translate') | 
| return | 
| + key = args[0] | 
| + | 
| from buildtools.packager import readMetadata | 
| metadata = readMetadata(baseDir, type) | 
| - basename = metadata.get('general', 'basename') | 
| - key = args[0] | 
| - if type == 'chrome' or type == 'opera': | 
| - import buildtools.packagerChrome as packager | 
| - localesDir = os.path.join(baseDir, '_locales') | 
| - else: | 
| - import buildtools.packagerGecko as packager | 
| - localesDir = packager.getLocalesDir(baseDir) | 
| + basename = metadata.get('general', 'basename') | 
| + localeConfig = readLocaleConfig(baseDir, type, metadata) | 
| import buildtools.localeTools as localeTools | 
| - localeTools.getTranslations(type, localesDir, packager.defaultLocale.replace('_', '-'), basename, key) | 
| + localeTools.getTranslations(localeConfig, basename, key) | 
| def showDescriptions(baseDir, scriptName, opts, args, type): | 
| @@ -459,25 +481,25 @@ with addCommand(setupTranslations, 'setuptrans') as command: | 
| command.shortDescription = 'Sets up translation languages' | 
| command.description = 'Sets up translation languages for the project on crowdin.net.' | 
| command.params = '[options] project-key' | 
| - command.supportedTypes = ('gecko', 'chrome', 'opera') | 
| + command.supportedTypes = ('gecko', 'chrome', 'opera', 'generic') | 
| with addCommand(updateTranslationMaster, 'translate') as command: | 
| command.shortDescription = 'Updates translation master files' | 
| command.description = 'Updates the translation master files in the project on crowdin.net.' | 
| command.params = '[options] project-key' | 
| - command.supportedTypes = ('gecko', 'chrome', 'opera') | 
| + command.supportedTypes = ('gecko', 'chrome', 'opera', 'generic') | 
| with addCommand(uploadTranslations, 'uploadtrans') as command: | 
| command.shortDescription = 'Uploads existing translations' | 
| command.description = 'Uploads already existing translations to the project on crowdin.net.' | 
| command.params = '[options] project-key' | 
| - command.supportedTypes = ('gecko', 'chrome', 'opera') | 
| + command.supportedTypes = ('gecko', 'chrome', 'opera', 'generic') | 
| with addCommand(getTranslations, 'gettranslations') as command: | 
| command.shortDescription = 'Downloads translation updates' | 
| command.description = 'Downloads updated translations from crowdin.net.' | 
| command.params = '[options] project-key' | 
| - command.supportedTypes = ('gecko', 'chrome', 'opera') | 
| + command.supportedTypes = ('gecko', 'chrome', 'opera', 'generic') | 
| with addCommand(showDescriptions, 'showdesc') as command: | 
| command.shortDescription = 'Print description strings for all locales' |