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 /chrome/browser/cocoa | |
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 'chrome/browser/cocoa')
-rw-r--r-- | chrome/browser/cocoa/menu_localizer.h | 19 | ||||
-rw-r--r-- | chrome/browser/cocoa/menu_localizer.mm | 33 | ||||
-rw-r--r-- | chrome/browser/cocoa/ui_localizer.h | 31 | ||||
-rw-r--r-- | chrome/browser/cocoa/ui_localizer.mm | 80 | ||||
-rw-r--r-- | chrome/browser/cocoa/ui_localizer_unittest.mm | 46 |
5 files changed, 157 insertions, 52 deletions
diff --git a/chrome/browser/cocoa/menu_localizer.h b/chrome/browser/cocoa/menu_localizer.h deleted file mode 100644 index 862ba20..0000000 --- a/chrome/browser/cocoa/menu_localizer.h +++ /dev/null @@ -1,19 +0,0 @@ -// 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. - -#ifndef CHROME_BROWSER_COCOA_MENU_LOCALIZER_H_ -#define CHROME_BROWSER_COCOA_MENU_LOCALIZER_H_ - -#import <Cocoa/Cocoa.h> - -#import "third_party/GTM/AppKit/GTMUILocalizer.h" - -// A subclass of GTMUILocalizer that handles localizing our main menus. It maps -// from the ^-prefixed strings in the nib into the strings bundles. - -@interface MenuLocalizer : GTMUILocalizer { -} -@end - -#endif // CHROME_BROWSER_COCOA_MENU_LOCALIZER_H_ diff --git a/chrome/browser/cocoa/menu_localizer.mm b/chrome/browser/cocoa/menu_localizer.mm deleted file mode 100644 index 7b09520..0000000 --- a/chrome/browser/cocoa/menu_localizer.mm +++ /dev/null @@ -1,33 +0,0 @@ -// 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. - -#import "chrome/browser/cocoa/menu_localizer.h" - -#include "app/l10n_util.h" -#include "base/sys_string_conversions.h" -#include "grit/chromium_strings.h" - -@implementation MenuLocalizer - -// Override to map into our string bundles instead of strings plists. -// TODO(pinkerton): This should use a string lookup table to map the string to -// a constant. -- (NSString *)localizedStringForString:(NSString *)string { - if ([string isEqualToString:@"^Quit Chromium"]) { - std::wstring quitString = l10n_util::GetString(IDS_EXIT_MAC); - return base::SysWideToNSString(quitString); - } else if ([string isEqualToString:@"^About Chromium"]) { - std::wstring quitString = l10n_util::GetString(IDS_ABOUT_CHROME_TITLE); - return base::SysWideToNSString(quitString); - } else if ([string isEqualToString:@"^Hide Chromium"]) { - std::wstring quitString = l10n_util::GetString(IDS_HIDE_MAC); - return base::SysWideToNSString(quitString); - } else if ([string isEqualToString:@"^Chromium Help"]) { - std::wstring quitString = l10n_util::GetString(IDS_HELP_MAC); - return base::SysWideToNSString(quitString); - } - return [super localizedStringForString:string]; -} - -@end diff --git a/chrome/browser/cocoa/ui_localizer.h b/chrome/browser/cocoa/ui_localizer.h new file mode 100644 index 0000000..b4702ad --- /dev/null +++ b/chrome/browser/cocoa/ui_localizer.h @@ -0,0 +1,31 @@ +// 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. + +#ifndef CHROME_BROWSER_COCOA_UI_LOCALIZER_H_ +#define CHROME_BROWSER_COCOA_UI_LOCALIZER_H_ + +#include "base/basictypes.h" +#include "base/string16.h" + +@class NSString; + +namespace ui_localizer { + +// Remove the Windows-style accelerator marker and change "..." into an +// ellipsis. Returns the result in an autoreleased NSString. +NSString* FixUpWindowsStyleLabel(const string16& label); + +struct ResourceMap { + const char* const name; + unsigned int label_id; + unsigned int label_arg_id; +}; + +NSString* LocalizedStringForKeyFromMapList(NSString* key, + const ResourceMap* map_list, + size_t map_list_len); + +} // namespace ui_localizer + +#endif // CHROME_BROWSER_COCOA_UI_LOCALIZER_H_ diff --git a/chrome/browser/cocoa/ui_localizer.mm b/chrome/browser/cocoa/ui_localizer.mm new file mode 100644 index 0000000..e9be6dc --- /dev/null +++ b/chrome/browser/cocoa/ui_localizer.mm @@ -0,0 +1,80 @@ +// 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. + +#import "chrome/browser/cocoa/ui_localizer.h" + +#import <Foundation/Foundation.h> + +#include "app/l10n_util.h" +#include "base/sys_string_conversions.h" +#include "base/logging.h" + +namespace ui_localizer { + +NSString* FixUpWindowsStyleLabel(const string16& label) { + const char16 kEllipsisUTF16 = 0x2026; + string16 ret; + size_t label_len = label.length(); + ret.reserve(label_len); + for (size_t i = 0; i < label_len; ++i) { + char16 c = label[i]; + if (c == '&') { + if (i + 1 < label_len && label[i + 1] == '&') { + ret.push_back(c); + ++i; + } + } else if (c == '.' && i + 2 < label_len && label[i + 1] == '.' + && label[i + 2] == '.') { + ret.push_back(kEllipsisUTF16); + i += 2; + } else { + ret.push_back(c); + } + } + + return base::SysUTF16ToNSString(ret); +} + +NSString* LocalizedStringForKeyFromMapList(NSString* key, + const ResourceMap* map_list, + size_t map_list_len) { + DCHECK(key != nil); + DCHECK(map_list != NULL); + + // Look up the string for the resource id to fetch. + const char* utf8_key = [key UTF8String]; + if (utf8_key) { + // If we end up with enough string constants in here, look at using bsearch + // to speed up the searching. + for (size_t i = 0; i < map_list_len; ++i) { + int strcmp_result = strcmp(utf8_key, map_list[i].name); + if (strcmp_result == 0) { + // Do we need to build the string, or just fetch it? + if (map_list[i].label_arg_id != 0) { + const string16 label_arg( + l10n_util::GetStringUTF16(map_list[i].label_arg_id)); + return FixUpWindowsStyleLabel( + l10n_util::GetStringFUTF16(map_list[i].label_id, label_arg)); + } + + return FixUpWindowsStyleLabel( + l10n_util::GetStringUTF16(map_list[i].label_id)); + } + + // If we've passed where the string would be, give up. + if (strcmp_result < 0) + break; + } + } + + // Sanity check, there shouldn't be any strings with this id that aren't + // in our map. + DLOG_IF(WARNING, [key hasPrefix:@"^ID"]) << "Key '" << utf8_key + << "' wasn't in the resource map?"; + + // If we didn't find anything, this string doesn't need localizing. + return nil; +} + +} // namespace ui_localizer diff --git a/chrome/browser/cocoa/ui_localizer_unittest.mm b/chrome/browser/cocoa/ui_localizer_unittest.mm new file mode 100644 index 0000000..a6756a9 --- /dev/null +++ b/chrome/browser/cocoa/ui_localizer_unittest.mm @@ -0,0 +1,46 @@ +// 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. + +#import <Foundation/Foundation.h> + +#include "base/sys_string_conversions.h" +#include "chrome/browser/cocoa/ui_localizer.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" + +typedef PlatformTest UILocalizerTest; + +TEST_F(UILocalizerTest, FixUpWindowsStyleLabel) { + struct TestData { + NSString* input; + NSString* output; + }; + + TestData data[] = { + { @"", @"" }, + { @"nothing", @"nothing" }, + { @"foo &bar", @"foo bar" }, + { @"foo &&bar", @"foo &bar" }, + { @"foo &&&bar", @"foo &bar" }, + { @"&foo &&bar", @"foo &bar" }, + { @"&foo &bar", @"foo bar" }, + { @"foo bar.", @"foo bar." }, + { @"foo bar..", @"foo bar.." }, + { @"foo bar...", @"foo bar\u2026" }, + { @"foo.bar", @"foo.bar" }, + { @"foo..bar", @"foo..bar" }, + { @"foo...bar", @"foo\u2026bar" }, + { @"foo...bar...", @"foo\u2026bar\u2026" }, + }; + for (size_t idx = 0; idx < ARRAYSIZE_UNSAFE(data); ++idx) { + string16 input16(base::SysNSStringToUTF16(data[idx].input)); + + NSString* result = ui_localizer::FixUpWindowsStyleLabel(input16); + EXPECT_TRUE(result != nil) << "Fixup Failed, idx = " << idx; + + EXPECT_TRUE([data[idx].output isEqualTo:result]) + << "For idx " << idx << ", expected '" << [data[idx].output UTF8String] + << "', got '" << [result UTF8String] << "'"; + } +} |