diff options
Diffstat (limited to 'build/mac')
-rwxr-xr-x | build/mac/generate_localizer | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/build/mac/generate_localizer b/build/mac/generate_localizer new file mode 100755 index 0000000..4620b99 --- /dev/null +++ b/build/mac/generate_localizer @@ -0,0 +1,175 @@ +#!/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! +// +// Generated by %(generate_localizer)s. +// Generated from %(xib_file)s. +// + +#ifndef %(class_name)s_LOCALIZER_H_ +#define %(class_name)s_LOCALIZER_H_ + +#import "third_party/GTM/AppKit/GTMUILocalizer.h" + +// A subclass of GTMUILocalizer that handles localizes based on resource +// constants. + +@interface %(class_name)sLocalizer : GTMUILocalizer { +} +@end + +#endif // %(class_name)s_LOCALIZER_H_ +''' + +localizer_template_mm = \ +'''// ---------- WARNING ---------- +// THIS IS A GENERATED FILE, DO NOT EDIT IT DIRECTLY! +// +// Generated by '%(generate_localizer)s'. +// Generated from '%(xib_file)s'. +// + +#import "%(header_name)s" + +#import "chrome/browser/cocoa/ui_localizer.h" +#include "grit/chromium_strings.h" +#include "grit/generated_resources.h" + +@implementation %(class_name)sLocalizer + +- (NSString *)localizedStringForString:(NSString *)string { + + static const ui_localizer::ResourceMap kUIResources[] = { +%(resource_map_list)s }; + static const size_t kUIResourcesSize = arraysize(kUIResources); + + return ui_localizer::LocalizedStringForKeyFromMapList(string, + kUIResources, + kUIResourcesSize); +} + +@end +''' + +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_files_contents(class_name, constants_list, header_name, xib_path): + """Generates a localizer files contents from the list of constants.""" + # Copy and sort the list, then build the strings we need from it. + constants_list = constants_list[:] + constants_list.sort() + 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 = { + 'class_name': class_name, + 'header_name': header_name, + 'resource_map_list': constant_list_str, + 'generate_localizer': generate_localizer, + 'xib_file': xib_path, + } + h_file = localizer_template_h % values_dict + mm_file = localizer_template_mm % values_dict + return (h_file, mm_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 xib and output file arguments\n' % + generate_localizer); + return 1 + xib_path, output_h_path, output_mm_path = argv[1:] + + # 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); + + # Name the class based on the output file + class_name = os.path.splitext(os.path.basename(output_h_path))[0] + suffix = '_localizer' + if class_name.endswith(suffix): + class_name = class_name[:-len(suffix)]; + class_name = class_name.replace('_', ' ').title().replace(' ', ''); + + # Generate our file contents + (h_file_content, mm_file_content) = \ + generate_files_contents(class_name, constants_list, + os.path.basename(output_h_path), + xib_path) + + # Write out the files + file_fd = open(output_h_path, 'w') + file_fd.write(h_file_content) + file_fd.close() + file_fd = open(output_mm_path, 'w') + file_fd.write(mm_file_content) + file_fd.close() + + return 0 + +if __name__ == '__main__': + sys.exit(Main(sys.argv)) |