OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
3 # Use of this source code is governed by a BSD-style license that can be | |
4 # found in the LICENSE file. | |
5 | |
6 """Formats as a .json file that can be used to localize Google Chrome | |
7 extensions.""" | |
8 | |
9 from json import JSONEncoder | |
10 import re | |
11 import types | |
12 | |
13 from grit import util | |
14 from grit.node import message | |
15 | |
16 def Format(root, lang='en', output_dir='.'): | |
17 """Format the messages as JSON.""" | |
18 yield '{\n' | |
19 | |
20 encoder = JSONEncoder(); | |
21 format = (' "%s": {\n' | |
22 ' "message": %s%s\n' | |
23 ' }') | |
24 placeholder_format = (' "%i": {\n' | |
25 ' "content": "$%i"\n' | |
26 ' }') | |
27 first = True | |
28 for child in root.ActiveDescendants(): | |
29 if isinstance(child, message.MessageNode): | |
30 id = child.attrs['name'] | |
31 if id.startswith('IDR_') or id.startswith('IDS_'): | |
32 id = id[4:] | |
33 | |
34 loc_message = encoder.encode(child.ws_at_start + child.Translate(lang) + | |
35 child.ws_at_end) | |
36 | |
37 # Replace $n place-holders with $n$ and add an appropriate "placeholders" | |
38 # entry. Note that chrome.i18n.getMessage only supports 9 placeholders: | |
39 # https://developer.chrome.com/extensions/i18n#method-getMessage | |
40 placeholders = '' | |
41 for i in range(1, 10): | |
42 if loc_message.find('$%d' % i) == -1: | |
43 break | |
44 loc_message = loc_message.replace('$%d' % i, '$%d$' % i) | |
45 if placeholders: | |
46 placeholders += ',\n' | |
47 placeholders += placeholder_format % (i, i) | |
48 | |
49 if not first: | |
50 yield ',\n' | |
51 first = False | |
52 | |
53 if placeholders: | |
54 placeholders = ',\n "placeholders": {\n%s\n }' % placeholders | |
55 yield format % (id, loc_message, placeholders) | |
56 | |
57 yield '\n}\n' | |
OLD | NEW |