blob: 27ac36135f40b727c36fd669bc34902ef407781b [file]
#!/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.
"""Formats as a .json file that can be used to localize Google Chrome
extensions."""
from json import JSONEncoder
import re
import types
from grit import util
from grit.node import message
def Format(root, lang='en', output_dir='.'):
"""Format the messages as JSON."""
yield '{\n'
encoder = JSONEncoder();
format = (' "%s": {\n'
' "message": %s%s\n'
' }')
placeholder_format = (' "%i": {\n'
' "content": "$%i"\n'
' }')
first = True
for child in root.ActiveDescendants():
if isinstance(child, message.MessageNode):
id = child.attrs['name']
if id.startswith('IDR_') or id.startswith('IDS_'):
id = id[4:]
loc_message = encoder.encode(child.ws_at_start + child.Translate(lang) +
child.ws_at_end)
# Replace $n place-holders with $n$ and add an appropriate "placeholders"
# entry. Note that chrome.i18n.getMessage only supports 9 placeholders:
# https://developer.chrome.com/extensions/i18n#method-getMessage
placeholders = ''
for i in range(1, 10):
if loc_message.find('$%d' % i) == -1:
break
loc_message = loc_message.replace('$%d' % i, '$%d$' % i)
if placeholders:
placeholders += ',\n'
placeholders += placeholder_format % (i, i)
if not first:
yield ',\n'
first = False
if placeholders:
placeholders = ',\n "placeholders": {\n%s\n }' % placeholders
yield format % (id, loc_message, placeholders)
yield '\n}\n'