1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
#!/usr/bin/python
# Copyright (c) 2009 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.
# Usage: generate_localizer [xib_path] [output_dot_h_path] [output_dot_mm_path]
#
# Extracts all the localizable strings that start with "^IDS" from the given
# xib file, and then generates a localizer to process those strings.
import os.path
import plistlib
import subprocess
import sys
generate_localizer = "me"
localizer_template_h = \
'''// ---------- WARNING ----------
// THIS IS A GENERATED FILE, DO NOT EDIT IT DIRECTLY!
//
// This header includes the table used by ui_localizer.mm. Nothing else should
// be including this file.
//
// Generated by %(generate_localizer)s.
// Generated from:
// %(xib_files)s
//
#ifndef UI_LOCALIZER_TABLE_H_
#define UI_LOCALIZER_TABLE_H_
static const UILocalizerResourceMap kUIResources[] = {
%(resource_map_list)s };
static const size_t kUIResourcesSize = arraysize(kUIResources);
#endif // UI_LOCALIZER_TABLE_H_
'''
def xib_localizable_strings(xib_path):
"""Runs ibtool to extract the localizable strings data from the xib."""
ibtool_cmd = subprocess.Popen(['/usr/bin/ibtool', '--localizable-strings',
xib_path],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(cmd_out, cmd_err) = ibtool_cmd.communicate()
if ibtool_cmd.returncode:
sys.stderr.write('%s:0: error: ibtool on "%s" failed (%d):\n%s\n' %
(generate_localizer, xib_path, ibtool_cmd.returncode,
cmd_err))
return None
return cmd_out
def extract_resource_constants(plist_localizable_strings_dict, xib_path):
"""Extracts all the values that start with ^IDS from the localizable
strings plist entry."""
constants_list = []
for item_dict in plist_localizable_strings_dict.itervalues():
for item_value in item_dict.itervalues():
if item_value.startswith('^IDS'):
constants_list.append(item_value)
elif item_value.startswith('IDS'):
sys.stderr.write(
'%s:0: warning: %s found a string with questionable prefix, "%s"\n'
% (xib_path, generate_localizer, item_value));
return constants_list
def generate_file_contents(constants_list, xib_paths):
"""Generates the header listing the constants."""
# Bounce through a set to uniq the strings, sort the list, then build the
# values we need from it.
constants_list = sorted(set(constants_list))
constant_list_str = ''
for item in constants_list:
parts = item.split('$', 1)
label_id = parts[0]
if len(parts) == 2:
label_arg_id = parts[1]
else:
label_arg_id = '0'
constant_list_str += ' { "%s", %s, %s },\n' % \
( item, label_id[1:], label_arg_id)
# Assemble the contents from the templates.
values_dict = {
'resource_map_list': constant_list_str,
'generate_localizer': generate_localizer,
'xib_files': "\n// ".join(xib_paths),
}
h_file = localizer_template_h % values_dict
return h_file
def Main(argv=None):
global generate_localizer
generate_localizer = os.path.basename(argv[0])
# Args
if len(argv) < 4:
sys.stderr.write('%s:0: error: Expected output file and then xibs\n' %
generate_localizer);
return 1
output_path = argv[1];
xib_paths = argv[2:]
full_constants_list = []
for xib_path in xib_paths:
# Run ibtool and convert to something Python can deal with
plist_string = xib_localizable_strings(xib_path)
if not plist_string:
return 2
plist = plistlib.readPlistFromString(plist_string)
# Extract the resource constant strings
localizable_strings = plist['com.apple.ibtool.document.localizable-strings']
constants_list = extract_resource_constants(localizable_strings, xib_path)
if not constants_list:
sys.stderr.write("%s:0: warning: %s didn't find any resource strings\n" %
(xib_path, generate_localizer));
full_constants_list.extend(constants_list)
# Generate our file contents
h_file_content = \
generate_file_contents(full_constants_list, xib_paths)
# Write out the file
file_fd = open(output_path, 'w')
file_fd.write(h_file_content)
file_fd.close()
return 0
if __name__ == '__main__':
sys.exit(Main(sys.argv))
|