summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cocoa/ui_localizer.mm
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/cocoa/ui_localizer.mm')
-rw-r--r--chrome/browser/cocoa/ui_localizer.mm80
1 files changed, 80 insertions, 0 deletions
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