OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "ui/base/l10n/l10n_util.h" | 5 #include "ui/base/l10n/l10n_util.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cstdlib> | 8 #include <cstdlib> |
9 #include <iterator> | 9 #include <iterator> |
10 #include <string> | 10 #include <string> |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 resolved_locale->swap(tmp_locale); | 394 resolved_locale->swap(tmp_locale); |
395 return true; | 395 return true; |
396 } | 396 } |
397 } | 397 } |
398 } | 398 } |
399 | 399 |
400 return false; | 400 return false; |
401 #endif | 401 #endif |
402 } | 402 } |
403 | 403 |
404 std::string GetApplicationLocale(const std::string& pref_locale) { | 404 std::string GetApplicationLocaleInternal(const std::string& pref_locale) { |
405 #if defined(OS_MACOSX) | 405 #if defined(OS_MACOSX) |
406 | 406 |
407 // Use any override (Cocoa for the browser), otherwise use the preference | 407 // Use any override (Cocoa for the browser), otherwise use the preference |
408 // passed to the function. | 408 // passed to the function. |
409 std::string app_locale = l10n_util::GetLocaleOverride(); | 409 std::string app_locale = l10n_util::GetLocaleOverride(); |
410 if (app_locale.empty()) | 410 if (app_locale.empty()) |
411 app_locale = pref_locale; | 411 app_locale = pref_locale; |
412 | 412 |
413 // The above should handle all of the cases Chrome normally hits, but for some | 413 // The above should handle all of the cases Chrome normally hits, but for some |
414 // unit tests, we need something to fall back too. | 414 // unit tests, we need something to fall back too. |
415 if (app_locale.empty()) | 415 if (app_locale.empty()) |
416 app_locale = "en-US"; | 416 app_locale = "en-US"; |
417 | 417 |
418 // Windows/Linux call SetICUDefaultLocale after determining the actual locale | |
419 // with CheckAndResolveLocal to make ICU APIs work in that locale. | |
420 // Mac doesn't use a locale directory tree of resources (it uses Mac style | |
421 // resources), so mirror the Windows/Linux behavior of calling | |
422 // SetICUDefaultLocale. | |
423 base::i18n::SetICUDefaultLocale(app_locale); | |
424 return app_locale; | 418 return app_locale; |
425 | 419 |
426 #else | 420 #else |
427 | 421 |
428 std::string resolved_locale; | 422 std::string resolved_locale; |
429 std::vector<std::string> candidates; | 423 std::vector<std::string> candidates; |
430 | 424 |
431 // We only use --lang and the app pref on Windows. On Linux, we only | 425 // We only use --lang and the app pref on Windows. On Linux, we only |
432 // look at the LC_*/LANG environment variables. We do, however, pass --lang | 426 // look at the LC_*/LANG environment variables. We do, however, pass --lang |
433 // to renderer and plugin processes so they know what language the parent | 427 // to renderer and plugin processes so they know what language the parent |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 // By default, use the application locale preference. This applies to ChromeOS | 469 // By default, use the application locale preference. This applies to ChromeOS |
476 // and linux systems without glib. | 470 // and linux systems without glib. |
477 if (!pref_locale.empty()) | 471 if (!pref_locale.empty()) |
478 candidates.push_back(pref_locale); | 472 candidates.push_back(pref_locale); |
479 | 473 |
480 #endif | 474 #endif |
481 | 475 |
482 std::vector<std::string>::const_iterator i = candidates.begin(); | 476 std::vector<std::string>::const_iterator i = candidates.begin(); |
483 for (; i != candidates.end(); ++i) { | 477 for (; i != candidates.end(); ++i) { |
484 if (CheckAndResolveLocale(*i, &resolved_locale)) { | 478 if (CheckAndResolveLocale(*i, &resolved_locale)) { |
485 base::i18n::SetICUDefaultLocale(resolved_locale); | |
486 return resolved_locale; | 479 return resolved_locale; |
487 } | 480 } |
488 } | 481 } |
489 | 482 |
490 // Fallback on en-US. | 483 // Fallback on en-US. |
491 const std::string fallback_locale("en-US"); | 484 const std::string fallback_locale("en-US"); |
492 if (IsLocaleAvailable(fallback_locale)) { | 485 if (IsLocaleAvailable(fallback_locale)) { |
493 base::i18n::SetICUDefaultLocale(fallback_locale); | |
494 return fallback_locale; | 486 return fallback_locale; |
495 } | 487 } |
496 | 488 |
497 return std::string(); | 489 return std::string(); |
498 | 490 |
499 #endif | 491 #endif |
500 } | 492 } |
501 | 493 |
| 494 std::string GetApplicationLocale(const std::string& pref_locale, |
| 495 bool set_icu_locale) { |
| 496 const std::string locale = GetApplicationLocaleInternal(pref_locale); |
| 497 if (set_icu_locale && !locale.empty()) |
| 498 base::i18n::SetICUDefaultLocale(locale); |
| 499 return locale; |
| 500 } |
| 501 |
| 502 std::string GetApplicationLocale(const std::string& pref_locale) { |
| 503 return GetApplicationLocale(pref_locale, true /* set_icu_locale */); |
| 504 } |
| 505 |
502 bool IsLocaleNameTranslated(const char* locale, | 506 bool IsLocaleNameTranslated(const char* locale, |
503 const std::string& display_locale) { | 507 const std::string& display_locale) { |
504 base::string16 display_name = | 508 base::string16 display_name = |
505 l10n_util::GetDisplayNameForLocale(locale, display_locale, false); | 509 l10n_util::GetDisplayNameForLocale(locale, display_locale, false); |
506 // Because ICU sets the error code to U_USING_DEFAULT_WARNING whether or not | 510 // Because ICU sets the error code to U_USING_DEFAULT_WARNING whether or not |
507 // uloc_getDisplayName returns the actual translation or the default | 511 // uloc_getDisplayName returns the actual translation or the default |
508 // value (locale code), we have to rely on this hack to tell whether | 512 // value (locale code), we have to rely on this hack to tell whether |
509 // the translation is available or not. If ICU doesn't have a translated | 513 // the translation is available or not. If ICU doesn't have a translated |
510 // name for this locale, GetDisplayNameForLocale will just return the | 514 // name for this locale, GetDisplayNameForLocale will just return the |
511 // locale code. | 515 // locale code. |
(...skipping 371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
883 | 887 |
884 const char* const* GetAcceptLanguageListForTesting() { | 888 const char* const* GetAcceptLanguageListForTesting() { |
885 return kAcceptLanguageList; | 889 return kAcceptLanguageList; |
886 } | 890 } |
887 | 891 |
888 size_t GetAcceptLanguageListSizeForTesting() { | 892 size_t GetAcceptLanguageListSizeForTesting() { |
889 return arraysize(kAcceptLanguageList); | 893 return arraysize(kAcceptLanguageList); |
890 } | 894 } |
891 | 895 |
892 } // namespace l10n_util | 896 } // namespace l10n_util |
OLD | NEW |