| Index: build/mac/generate_localizer
|
| ===================================================================
|
| --- build/mac/generate_localizer (revision 0)
|
| +++ build/mac/generate_localizer (revision 0)
|
| @@ -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))
|
|
|
| Property changes on: build/mac/generate_localizer
|
| ___________________________________________________________________
|
| Name: svn:executable
|
| + *
|
| Name: svn:eol-style
|
| + LF
|
|
|
|
|