| Index: app/l10n_util_mac.mm
|
| ===================================================================
|
| --- app/l10n_util_mac.mm (revision 32429)
|
| +++ app/l10n_util_mac.mm (working copy)
|
| @@ -5,16 +5,59 @@
|
| #import <Foundation/Foundation.h>
|
| #include "app/l10n_util_mac.h"
|
| #include "base/sys_string_conversions.h"
|
| +#include "base/lazy_instance.h"
|
|
|
| +namespace {
|
| +
|
| +class OverrideLocaleHolder {
|
| + public:
|
| + OverrideLocaleHolder() {}
|
| + const std::string& value() const { return value_; }
|
| + void set_value(const std::string override_value) { value_ = override_value; }
|
| + private:
|
| + DISALLOW_COPY_AND_ASSIGN(OverrideLocaleHolder);
|
| + std::string value_;
|
| +};
|
| +
|
| +base::LazyInstance<OverrideLocaleHolder>
|
| + override_locale_holder(base::LINKER_INITIALIZED);
|
| +
|
| +} // namespace
|
| +
|
| namespace l10n_util {
|
|
|
| -std::string GetApplicationLocale(const std::wstring& pref_locale) {
|
| - // NOTE: The Win/Linux version of this calls out to CheckAndResolveLocale
|
| - // to do some remapping. Since Mac is using real locales that Cocoa has
|
| - // to be able to load, that shouldn't be needed.
|
| - return [[[NSLocale currentLocale] localeIdentifier] UTF8String];
|
| +const std::string& GetLocaleOverride() {
|
| + return override_locale_holder.Get().value();
|
| }
|
|
|
| +void OverrideLocaleWithCocoaLocale() {
|
| + // NSBundle really should only be called on the main thread.
|
| + DCHECK([NSThread isMainThread]);
|
| +
|
| + // Chrome really only has one concept of locale, but Mac OS X has locale and
|
| + // language that can be set independently. After talking with Chrome UX folks
|
| + // (Cole), the best path from an experience point of view is to map the Mac OS
|
| + // X language into the Chrome locale. This way strings like "Yesterday" and
|
| + // "Today" are in the same language as raw dates like "March 20, 1999" (Chrome
|
| + // strings resources vs ICU generated strings). This also makes the Mac acts
|
| + // like other Chrome platforms.
|
| + NSArray* languageList = [[NSBundle mainBundle] preferredLocalizations];
|
| + NSString* firstLocale = [languageList objectAtIndex:0];
|
| + // Mac OS X uses "_" instead of "-", so swap to get a real locale value.
|
| + std::string locale_value =
|
| + [[firstLocale stringByReplacingOccurrencesOfString:@"_"
|
| + withString:@"-"] UTF8String];
|
| +
|
| + // On disk the "en-US" resources are just "en" (http://crbug.com/25578), so
|
| + // the reverse mapping is done here to continue to feed Chrome the same values
|
| + // in all cases on all platforms. (l10n_util maps en to en-US if it gets
|
| + // passed this on the command line)
|
| + if (locale_value == "en")
|
| + locale_value = "en-US";
|
| +
|
| + override_locale_holder.Get().set_value(locale_value);
|
| +}
|
| +
|
| // Remove the Windows-style accelerator marker and change "..." into an
|
| // ellipsis. Returns the result in an autoreleased NSString.
|
| NSString* FixUpWindowsStyleLabel(const string16& label) {
|
|
|