OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "app/l10n_util.h" | 5 #include "app/l10n_util.h" |
6 | 6 |
7 #include <cstdlib> | 7 #include <cstdlib> |
8 #include "app/app_paths.h" | 8 #include "app/app_paths.h" |
9 #include "app/app_switches.h" | 9 #include "app/app_switches.h" |
10 #include "app/gfx/canvas.h" | 10 #include "app/gfx/canvas.h" |
11 #include "app/resource_bundle.h" | 11 #include "app/resource_bundle.h" |
12 #include "base/command_line.h" | 12 #include "base/command_line.h" |
13 #include "base/file_util.h" | 13 #include "base/file_util.h" |
14 #include "base/i18n/file_util_icu.h" | 14 #include "base/i18n/file_util_icu.h" |
15 #include "base/path_service.h" | 15 #include "base/path_service.h" |
16 #include "base/scoped_ptr.h" | 16 #include "base/scoped_ptr.h" |
17 #include "base/string16.h" | 17 #include "base/string16.h" |
18 #include "base/string_piece.h" | 18 #include "base/string_piece.h" |
19 #include "base/string_util.h" | 19 #include "base/string_util.h" |
20 #include "base/sys_string_conversions.h" | 20 #include "base/sys_string_conversions.h" |
21 #include "build/build_config.h" | 21 #include "build/build_config.h" |
22 #include "unicode/uscript.h" | 22 #include "unicode/uscript.h" |
23 | 23 |
24 #if defined(TOOLKIT_GTK) | 24 #if defined(TOOLKIT_GTK) |
25 #include <gtk/gtk.h> | 25 #include <gtk/gtk.h> |
26 #endif | 26 #endif |
27 | 27 |
| 28 #if defined(OS_MACOSX) |
| 29 #include "app/l10n_util_mac.h" |
| 30 #endif |
| 31 |
28 // TODO(playmobil): remove this undef once SkPostConfig.h is fixed. | 32 // TODO(playmobil): remove this undef once SkPostConfig.h is fixed. |
29 // skia/include/corecg/SkPostConfig.h #defines strcasecmp() so we can't use | 33 // skia/include/corecg/SkPostConfig.h #defines strcasecmp() so we can't use |
30 // base::strcasecmp() without #undefing it here. | 34 // base::strcasecmp() without #undefing it here. |
31 #undef strcasecmp | 35 #undef strcasecmp |
32 | 36 |
33 namespace { | 37 namespace { |
34 | 38 |
35 #if defined(OS_WIN) | 39 #if defined(OS_WIN) |
36 static const FilePath::CharType kLocaleFileExtension[] = L".dll"; | 40 static const FilePath::CharType kLocaleFileExtension[] = L".dll"; |
37 #elif defined(OS_POSIX) | 41 #elif defined(OS_POSIX) |
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 } | 419 } |
416 #endif | 420 #endif |
417 | 421 |
418 } // namespace | 422 } // namespace |
419 | 423 |
420 namespace l10n_util { | 424 namespace l10n_util { |
421 | 425 |
422 // Represents the locale-specific text direction. | 426 // Represents the locale-specific text direction. |
423 static TextDirection g_text_direction = UNKNOWN_DIRECTION; | 427 static TextDirection g_text_direction = UNKNOWN_DIRECTION; |
424 | 428 |
425 // On the Mac, we don't want to test preferences or ICU for the language, | 429 std::string GetApplicationLocale(const std::wstring& pref_locale) { |
426 // we want to use whatever Cocoa is using when it loaded the main nib file. | |
427 // It handles all the mapping and fallbacks for us, we just need to ask. | |
428 // See l10n_util_mac for that implementation. | |
429 #if !defined(OS_MACOSX) | 430 #if !defined(OS_MACOSX) |
430 std::string GetApplicationLocale(const std::wstring& pref_locale) { | 431 |
431 FilePath locale_path; | 432 FilePath locale_path; |
432 PathService::Get(app::DIR_LOCALES, &locale_path); | 433 PathService::Get(app::DIR_LOCALES, &locale_path); |
433 std::string resolved_locale; | 434 std::string resolved_locale; |
434 std::vector<std::string> candidates; | 435 std::vector<std::string> candidates; |
435 const std::string system_locale = GetSystemLocale(); | 436 const std::string system_locale = GetSystemLocale(); |
436 | 437 |
437 // We only use --lang and the app pref on Windows. On Linux/Mac, we only | 438 // We only use --lang and the app pref on Windows. On Linux, we only |
438 // look at the LC_*/LANG environment variables. We do, however, pass --lang | 439 // look at the LC_*/LANG environment variables. We do, however, pass --lang |
439 // to renderer and plugin processes so they know what language the parent | 440 // to renderer and plugin processes so they know what language the parent |
440 // process decided to use. | 441 // process decided to use. |
441 #if defined(OS_WIN) | 442 #if defined(OS_WIN) |
442 // First, check to see if there's a --lang flag. | 443 // First, check to see if there's a --lang flag. |
443 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); | 444 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); |
444 const std::string& lang_arg = WideToASCII( | 445 const std::string& lang_arg = WideToASCII( |
445 parsed_command_line.GetSwitchValue(switches::kLang)); | 446 parsed_command_line.GetSwitchValue(switches::kLang)); |
446 if (!lang_arg.empty()) | 447 if (!lang_arg.empty()) |
447 candidates.push_back(lang_arg); | 448 candidates.push_back(lang_arg); |
(...skipping 27 matching lines...) Expand all Loading... |
475 | 476 |
476 // Fallback on en-US. | 477 // Fallback on en-US. |
477 const std::string fallback_locale("en-US"); | 478 const std::string fallback_locale("en-US"); |
478 if (IsLocaleAvailable(fallback_locale, locale_path)) | 479 if (IsLocaleAvailable(fallback_locale, locale_path)) |
479 return fallback_locale; | 480 return fallback_locale; |
480 | 481 |
481 // No locale data file was found; we shouldn't get here. | 482 // No locale data file was found; we shouldn't get here. |
482 NOTREACHED(); | 483 NOTREACHED(); |
483 | 484 |
484 return std::string(); | 485 return std::string(); |
| 486 |
| 487 #else // !defined(OS_MACOSX) |
| 488 |
| 489 // Use any override (Cocoa for the browser), otherwise use the command line |
| 490 // argument. |
| 491 std::string app_locale = l10n_util::GetLocaleOverride(); |
| 492 if (app_locale.empty()) { |
| 493 const CommandLine& parsed_command_line = *CommandLine::ForCurrentProcess(); |
| 494 app_locale = parsed_command_line.GetSwitchValueASCII(switches::kLang); |
| 495 } |
| 496 |
| 497 // The above should handle all of the cases Chrome normally hits, but for some |
| 498 // unit tests, we need something to fall back too. |
| 499 if (app_locale.empty()) |
| 500 app_locale = "en-US"; |
| 501 |
| 502 // Windows/Linux call CheckAndResolveLocale which calls IsLocaleAvailable |
| 503 // which calls SetICUDefaultLocale to let ICU use the same locale. Mac |
| 504 // doesn't use a locale directory tree of resources (it uses Mac style |
| 505 // resources), so mirror that ICU behavior by calling SetICUDefaultLocale |
| 506 // directly. |
| 507 UBool icu_set = SetICUDefaultLocale(app_locale); |
| 508 DCHECK(icu_set); |
| 509 return app_locale; |
| 510 #endif // !defined(OS_MACOSX) |
485 } | 511 } |
486 #endif // !defined(OS_MACOSX) | |
487 | 512 |
488 string16 GetDisplayNameForLocale(const std::string& locale_code, | 513 string16 GetDisplayNameForLocale(const std::string& locale_code, |
489 const std::string& display_locale, | 514 const std::string& display_locale, |
490 bool is_for_ui) { | 515 bool is_for_ui) { |
491 UErrorCode error = U_ZERO_ERROR; | 516 UErrorCode error = U_ZERO_ERROR; |
492 const int buffer_size = 1024; | 517 const int buffer_size = 1024; |
493 | 518 |
494 string16 display_name; | 519 string16 display_name; |
495 int actual_size = uloc_getDisplayName(locale_code.c_str(), | 520 int actual_size = uloc_getDisplayName(locale_code.c_str(), |
496 display_locale.c_str(), | 521 display_locale.c_str(), |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1035 } | 1060 } |
1036 | 1061 |
1037 void BiDiLineIterator::GetLogicalRun(int start, | 1062 void BiDiLineIterator::GetLogicalRun(int start, |
1038 int* end, | 1063 int* end, |
1039 UBiDiLevel* level) { | 1064 UBiDiLevel* level) { |
1040 DCHECK(bidi_ != NULL); | 1065 DCHECK(bidi_ != NULL); |
1041 ubidi_getLogicalRun(bidi_, start, end, level); | 1066 ubidi_getLogicalRun(bidi_, start, end, level); |
1042 } | 1067 } |
1043 | 1068 |
1044 } // namespace l10n_util | 1069 } // namespace l10n_util |
OLD | NEW |