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: http://src.chromium.org/svn/trunk/src/build@21272 4ff67af0-8c30-449e-8e8b-ad334ec8d88c
This commit is contained in:
thomasvl@chromium.org 2009-07-22 14:04:27 +00:00
Родитель c7d08a3502
Коммит aadbe274c9
1 изменённых файлов: 175 добавлений и 0 удалений

175
mac/generate_localizer Executable file
Просмотреть файл

@ -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))