diff options
author | thomasvl@chromium.org <thomasvl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-22 14:04:27 +0000 |
---|---|---|
committer | thomasvl@chromium.org <thomasvl@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-22 14:04:27 +0000 |
commit | b0a2f0c8a46bafa7e3d47dfc05748d2dc71271eb (patch) | |
tree | 1bde297a35e7f360fec17fb8d1ac598b53f9c4f6 /build/mac | |
parent | 1d775f6c60b825702fd638503e8e630b49ef7bef (diff) | |
download | chromium_src-b0a2f0c8a46bafa7e3d47dfc05748d2dc71271eb.zip chromium_src-b0a2f0c8a46bafa7e3d47dfc05748d2dc71271eb.tar.gz chromium_src-b0a2f0c8a46bafa7e3d47dfc05748d2dc71271eb.tar.bz2 |
Starting mac l10n:
Added a script to process a xib file and generate a localizer out of the resource constants it finds in the xib.
Update the MainMenu.xib to use a generated localizer.
Kill off the menu_localizer in favor of a generated one.
ui_localizer is a helper so each "localizer" is as small as possible.
Build some menus out of base strings and the product name like windows.
Added the dir generated for the localizers so we can load the header to directly create them (menubar one).
Enable the other 3 languages we were building to help test.
Made the context menu code use the new code for handling window's accelerators and ellipsis.
Added unittest for ui_localizer.
Opened http://crbug.com/17380 to track the problem with the menu titles so I can move on to other parts of the UI for now.
TEST=The main menu will have some items localized now (and more will be localizable in the TC).
BUG=16764
Review URL: http://codereview.chromium.org/155774
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@21272 0039d316-1c4b-4281-b951-d872f2087c98
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)) |