Index: chrome/browser/cocoa/ui_localizer.mm |
=================================================================== |
--- chrome/browser/cocoa/ui_localizer.mm (revision 23016) |
+++ chrome/browser/cocoa/ui_localizer.mm (working copy) |
@@ -6,53 +6,33 @@ |
#import <Foundation/Foundation.h> |
+#include <stdlib.h> |
#include "app/l10n_util_mac.h" |
#include "base/sys_string_conversions.h" |
#include "base/logging.h" |
+#include "grit/app_strings.h" |
+#include "grit/chromium_strings.h" |
+#include "grit/generated_resources.h" |
-namespace ui_localizer { |
+struct UILocalizerResourceMap { |
+ 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) { |
- 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 l10n_util::GetNSStringFWithFixup(map_list[i].label_id, |
- label_arg); |
- } |
+namespace { |
- return l10n_util::GetNSStringWithFixup(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; |
+// Utility function for bsearch on a ResourceMap table |
+int ResourceMapCompare(const void* utf8Void, |
+ const void* resourceMapVoid) { |
+ const char* utf8_key = reinterpret_cast<const char*>(utf8Void); |
+ const UILocalizerResourceMap* res_map = |
+ reinterpret_cast<const UILocalizerResourceMap*> (resourceMapVoid); |
+ return strcmp(utf8_key, res_map->name); |
} |
-} // namespace ui_localizer |
+} // namespace |
@interface GTMUILocalizer (PrivateAdditions) |
- (void)localizedObjects; |
@@ -69,17 +49,49 @@ |
@end |
@implementation ChromeUILocalizer |
+ |
- (void)awakeFromNib { |
// The GTM base is bundle based, since don't need the bundle, use this |
// override to bypass the bundle lookup and directly do the localization |
// calls. |
[self localizedObjects]; |
} |
-#ifndef NDEBUG |
-// Catch anyone that uses this directly. |
+ |
- (NSString *)localizedStringForString:(NSString *)string { |
- LOG(FATAL) << "Don't use ChromeUILocalizer directly."; |
- return @"Don't use ChromeUILocalizer directly."; |
+ |
+ // Include the table here so it is a local static. This header provides |
+ // kUIResources and kUIResourcesSize. |
+#include "ui_localizer_table.h" |
+ |
+ // Look up the string for the resource id to fetch. |
+ const char* utf8_key = [string UTF8String]; |
+ if (utf8_key) { |
+ const void* valVoid = bsearch(utf8_key, |
+ kUIResources, |
+ kUIResourcesSize, |
+ sizeof(UILocalizerResourceMap), |
+ ResourceMapCompare); |
+ const UILocalizerResourceMap* val = |
+ reinterpret_cast<const UILocalizerResourceMap*>(valVoid); |
+ if (val) { |
+ // Do we need to build the string, or just fetch it? |
+ if (val->label_arg_id != 0) { |
+ const string16 label_arg(l10n_util::GetStringUTF16(val->label_arg_id)); |
+ return l10n_util::GetNSStringFWithFixup(val->label_id, |
+ label_arg); |
+ } |
+ |
+ return l10n_util::GetNSStringWithFixup(val->label_id); |
+ } |
+ |
+ // Sanity check, there shouldn't be any strings with this id that aren't |
+ // in our map. |
+ DLOG_IF(WARNING, [string 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; |
} |
-#endif |
+ |
@end |