Index: localeSyncChrome.py |
=================================================================== |
new file mode 100644 |
--- /dev/null |
+++ b/localeSyncChrome.py |
@@ -0,0 +1,124 @@ |
+#!/usr/bin/env python |
+# coding: utf-8 |
+ |
+# This Source Code is subject to the terms of the Mozilla Public License |
+# version 2.0 (the "License"). You can obtain a copy of the License at |
+# http://mozilla.org/MPL/2.0/. |
+ |
+import sys, os, json, re, codecs |
+import buildtools.localeTools as localeTools |
+ |
+firefoxToChrome = { |
+ 'ar': 'ar', |
+ 'bg': 'bg', |
+ 'ca': 'ca', |
+ 'cs': 'cs', |
+ 'da': 'da', |
+ 'de': 'de', |
+ 'el': 'el', |
+ 'en-US': 'en_US', |
+ 'en-GB': 'en_GB', |
+ 'es-ES': 'es', |
+ 'es-AR': 'es_419', |
+ 'et': 'et', |
+ 'fi': 'fi', |
+# '': 'fil', ??? |
+ 'fr': 'fr', |
+ 'he': 'he', |
+ 'hi-IN': 'hi', |
+ 'hr': 'hr', |
+ 'hu': 'hu', |
+ 'id': 'id', |
+ 'it': 'it', |
+ 'ja': 'ja', |
+ 'ko': 'ko', |
+ 'lt': 'lt', |
+ 'lv': 'lv', |
+ 'nl': 'nl', |
+# 'nb-NO': 'no', ??? |
+ 'pl': 'pl', |
+ 'pt-BR': 'pt_BR', |
+ 'pt-PT': 'pt_PT', |
+ 'ro': 'ro', |
+ 'ru': 'ru', |
+ 'sk': 'sk', |
+ 'sl': 'sl', |
+ 'sr': 'sr', |
+ 'sv-SE': 'sv', |
+ 'th': 'th', |
+ 'tr': 'tr', |
+ 'uk': 'uk', |
+ 'vi': 'vi', |
+ 'zh-CN': 'zh_CN', |
+ 'zh-TW': 'zh_TW', |
+} |
+ |
+def syncLocales(sourceLocales, targetLocales, removed, imported): |
+ for source, target in firefoxToChrome.iteritems(): |
+ targetFile = os.path.join(targetLocales, target, 'messages.json') |
+ hasSource = os.path.exists(os.path.join(sourceLocales, source)) |
+ if hasSource and os.path.exists(os.path.join(sourceLocales, source, '.incomplete')): |
+ hasSource = False |
+ if not hasSource and not os.path.exists(targetFile): |
+ continue |
+ |
+ data = {} |
+ if os.path.exists(targetFile): |
+ file = codecs.open(targetFile, 'rb', encoding='utf-8') |
+ data = json.load(file) |
+ file.close() |
+ |
+ for entry in removed: |
+ if entry in data: |
+ del data[entry] |
+ |
+ if hasSource: |
+ for fileName, stringIDs in imported: |
+ sourceFile = os.path.join(sourceLocales, source, fileName) |
+ try: |
+ sourceData = localeTools.readFile(sourceFile) |
+ for stringID in stringIDs: |
+ if stringID in sourceData: |
+ key = re.sub(r'\..*', '', fileName) + '_' + re.sub(r'\W', '_', stringID) |
+ data[key] = {'message': sourceData[stringID]} |
+ except: |
+ pass |
+ |
+ sourceFile = os.path.join(sourceLocales, source, 'meta.properties') |
+ try: |
+ sourceData = localeTools.readFile(sourceFile) |
+ if 'name' in sourceData: |
+ data['name'] = {'message': sourceData['name']} |
+ except: |
+ pass |
+ |
+ try: |
+ os.makedirs(os.path.dirname(targetFile)) |
+ except: |
+ pass |
+ file = codecs.open(targetFile, 'wb', encoding='utf-8') |
+ json.dump(data, file, ensure_ascii=False, sort_keys=True, indent=2, separators=(',', ': ')) |
+ print >>file |
+ file.close() |
+ |
+def run(baseDir, sourceDir): |
+ import buildtools.packagerGecko as packagerGecko |
+ import buildtools.packagerChrome as packagerChrome |
+ |
+ sourceLocales = packagerGecko.getLocalesDir(sourceDir) |
+ if not os.path.isdir(sourceLocales): |
+ raise IOError('Directory %s not found' % sourceLocales) |
+ targetLocales = os.path.join(baseDir, '_locales') |
+ |
+ metadata = packagerChrome.readMetadata(baseDir) |
+ removed = [] |
+ if metadata.has_option('locale_sync', 'remove'): |
+ for key in re.split(r'\s+', metadata.get('locale_sync', 'remove')): |
+ removed.append(key) |
+ |
+ imported = [] |
+ for file, keys in metadata.items('locale_sync'): |
+ if file == 'remove': |
+ continue |
+ imported.append((file, re.split(r'\s+', keys))) |
+ syncLocales(sourceLocales, targetLocales, removed, imported) |