Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Unified Diff: remoting/tools/json_to_grd.py

Issue 11275101: Fix branding in chromoting string resources (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « remoting/resources/string_resources_zh-TW.xtb ('k') | remoting/tools/remove_official_branding.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/tools/json_to_grd.py
diff --git a/remoting/tools/json_to_grd.py b/remoting/tools/json_to_grd.py
new file mode 100755
index 0000000000000000000000000000000000000000..36a26c9c54e0b268fd9cd55197a40563e0d424bf
--- /dev/null
+++ b/remoting/tools/json_to_grd.py
@@ -0,0 +1,190 @@
+#!/usr/bin/env python
+# Copyright (c) 2012 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# This script can be used to convert messages.json to grd translations.
+
+import codecs
+import json
+import optparse
+import os
+import string
+import sys
+import xml.dom.minidom as dom
+
+import sys
+sys.path.append('../../tools/grit')
+sys.path.append('../../tools/grit/grit')
+import tclib
+
+def camelCase2ALL_CAPS(s):
+ for c in string.ascii_uppercase:
+ s = s.replace(c, '_' + c)
+ return s.upper()
+
+def load_messages(filename):
+ import collections
+ def create_ordered_dict(list):
+ return collections.OrderedDict(list)
+ messages = json.load(file(filename), object_pairs_hook=create_ordered_dict)
+ ids = messages.keys()
+
+ result = {}
+ for id in ids:
+ text = messages[id]['message']
+ placeholders = []
+ if messages[id].has_key('placeholders'):
+ for name, p in messages[id]['placeholders'].items():
+ index = p['content']
+ caps_name = camelCase2ALL_CAPS(name)
+ placeholders.append(tclib.Placeholder(caps_name, index, p['example']))
+ text = text.replace('$' + name + '$', caps_name)
+
+ msg = tclib.Message(text, placeholders,
+ messages[id]['description'])
+ result[id] = msg
+
+ return ids, result
+
+def json_to_grd(input_dir, output_dir):
+ # load list of string IDs and placeholder names from the untranslated file
+ # because order of messages and placeholder names are not persisted in
+ # translations.
+ message_ids, messages = load_messages(
+ os.path.join(input_dir, '_locales/en', 'messages.json'))
+
+ grd_name = os.path.join(output_dir,
+ 'string_resources.grd')
+ grd_xml = dom.parse(grd_name)
+ grd_translations = grd_xml.getElementsByTagName('translations')[0]
+ grd_outputs = grd_xml.getElementsByTagName('outputs')[0]
+ grd_messages = grd_xml.getElementsByTagName('messages')[0]
+
+ for id in message_ids:
+ grit_id = 'IDR_' + id
+ message = grd_xml.createElement('message')
+ grd_messages.appendChild(grd_xml.createTextNode(' '))
+ grd_messages.appendChild(message)
+ grd_messages.appendChild(grd_xml.createTextNode('\n '))
+ message.setAttribute('name', grit_id)
+ message.setAttribute('desc', messages[id].description)
+ message.appendChild(grd_xml.createTextNode('\n '))
+ for part in messages[id].parts:
+ if isinstance(part, tclib.Placeholder):
+ ph = grd_xml.createElement('ph')
+ message.appendChild(ph)
+ ph.setAttribute('name', part.presentation)
+ ph.appendChild(grd_xml.createTextNode(part.original))
+ ex = grd_xml.createElement('ex')
+ ph.appendChild(ex)
+ ex.appendChild(grd_xml.createTextNode(part.example))
+ else:
+ message.appendChild(grd_xml.createTextNode(part))
+ message.appendChild(grd_xml.createTextNode('\n '))
+
+ translations_dir = os.path.join(input_dir, '_locales.official')
+ lang_list = os.listdir(translations_dir)
+ lang_list.sort()
+ for lang in lang_list:
+ # Convert locale name representation to the Grit format.
+ grit_lang = lang.replace('_', '-') if lang != 'en' else 'en_US'
+
+ # Load translations
+ translations_file = file(
+ os.path.join(translations_dir, lang, 'messages.json'))
+ translations = json.load(translations_file)
+ translations_file.close()
+
+ # Uppercase all string name.
+ translations = dict(zip(map(lambda x: x.upper(), translations.iterkeys()),
+ translations.values()))
+
+ doc = dom.Document()
+
+ bundle = doc.createElement('translationbundle')
+ doc.appendChild(bundle)
+ bundle.setAttribute('lang', grit_lang)
+ written_translations = {}
+ for id in message_ids:
+ bundle.appendChild(doc.createTextNode('\n'))
+
+ if not translations.has_key(id):
+ # Skip not translated messages.
+ continue
+ grit_id = 'IDR_' + id
+
+ placeholders = messages[id].placeholders
+ text = translations[id]['message']
+ for p in placeholders:
+ text = text.replace(p.original, p.presentation)
+
+ msg_id = messages[id].GetId()
+ if written_translations.has_key(msg_id):
+ # We've already written translation for this message.
+ continue
+ parsed_translation = tclib.Translation(text, msg_id, placeholders)
+ written_translations[msg_id] = 1
+
+ translation = doc.createElement('translation')
+ bundle.appendChild(translation)
+ translation.setAttribute('id', parsed_translation.GetId())
+ for part in parsed_translation.parts:
+ if isinstance(part, tclib.Placeholder):
+ ph = doc.createElement('ph')
+ translation.appendChild(ph)
+ ph.setAttribute('name', part.presentation)
+ else:
+ translation.appendChild(doc.createTextNode(part))
+ bundle.appendChild(doc.createTextNode('\n'))
+
+ out_name = os.path.join(output_dir,
+ 'string_resources_' + grit_lang + '.xtb')
+ out = codecs.open(out_name, mode='w', encoding = 'UTF-8')
+ out.write('<?xml version="1.0" ?>\n'
+ '<!DOCTYPE translationbundle>\n')
+ bundle.writexml(out)
+ out.close()
+
+ if grit_lang == 'en_US':
+ continue
+
+ t = grd_xml.createElement('file')
+ grd_translations.appendChild(grd_xml.createTextNode(' '))
+ grd_translations.appendChild(t)
+ grd_translations.appendChild(grd_xml.createTextNode('\n '))
+ t.setAttribute('path', 'string_resources_' + grit_lang + '.xtb')
+ t.setAttribute('lang', grit_lang)
+
+ t = grd_xml.createElement('output')
+ grd_outputs.appendChild(grd_xml.createTextNode(' '))
+ grd_outputs.appendChild(t)
+ grd_outputs.appendChild(grd_xml.createTextNode('\n '))
+ t.setAttribute('filename', 'remoting/resources/' + grit_lang + '.pak')
+ t.setAttribute('type', 'data_package')
+ t.setAttribute('lang', grit_lang)
+
+ t = grd_xml.createElement('output')
+ grd_outputs.appendChild(grd_xml.createTextNode(' '))
+ grd_outputs.appendChild(t)
+ grd_outputs.appendChild(grd_xml.createTextNode('\n '))
+ t.setAttribute('filename',
+ 'remoting/webapp/_locales/' + lang + '/messages.json')
+ t.setAttribute('type', 'chrome_messages_json')
+ t.setAttribute('lang', grit_lang)
+
+ grd_out = codecs.open(grd_name + '_new', mode='w', encoding = 'UTF-8')
+ grd_xml.writexml(grd_out, encoding = 'UTF-8')
+ grd_out.close()
+
+def main():
+ usage = 'Usage: json_to_grd <input_dir> <output_dir>'
+ parser = optparse.OptionParser(usage=usage)
+ options, args = parser.parse_args()
+ if len(args) != 2:
+ parser.error('two positional arguments expected')
+
+ return json_to_grd(args[0], args[1])
+
+if __name__ == '__main__':
+ sys.exit(main())
« no previous file with comments | « remoting/resources/string_resources_zh-TW.xtb ('k') | remoting/tools/remove_official_branding.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698