15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstdlib> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/environment.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/case_conversion.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/stl_util.h" 185e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/test/scoped_path_override.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/platform_test.h" 23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/common/unicode/locid.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util_collator.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_paths.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/test/data/resource.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UTF8ToUTF16; 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringWrapper { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) explicit StringWrapper(const base::string16& string) : string_(string) {} 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& string() const { return string_; } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 string_; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(StringWrapper); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class L10nUtilTest : public PlatformTest { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(beng): disabled until app strings move to app. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, DISABLED_GetString) { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string s = l10n_util::GetStringUTF8(IDS_SIMPLE); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Hello World!"), s); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) s = l10n_util::GetStringFUTF8(IDS_PLACEHOLDERS, 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16("chrome"), 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UTF8ToUTF16("10")); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string("Hello, chrome. Your number is 10."), s); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 s16 = l10n_util::GetStringFUTF16Int(IDS_PLACEHOLDERS_2, 20); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(UTF8ToUTF16("You owe me $20."), s16); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) && !defined(OS_ANDROID) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On Mac, we are disabling this test because GetApplicationLocale() as an 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// API isn't something that we'll easily be able to unit test in this manner. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The meaning of that API, on the Mac, is "the locale used by Cocoa's main 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// nib file", which clearly can't be stubbed by a test app that doesn't use 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Cocoa. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// On Android, we are disabling this test since GetApplicationLocale() just 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// returns the system's locale, which, similarly, is not easily unit tested. 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_POSIX) && defined(USE_GLIB) && !defined(OS_CHROMEOS) 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kPlatformHasDefaultLocale = 1; 85f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kUseLocaleFromEnvironment = 1; 86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kSupportsLocalePreference = 0; 87f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#elif defined(OS_WIN) 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kPlatformHasDefaultLocale = 1; 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kUseLocaleFromEnvironment = 0; 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kSupportsLocalePreference = 1; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 92f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kPlatformHasDefaultLocale = 0; 93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kUseLocaleFromEnvironment = 0; 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)const bool kSupportsLocalePreference = 1; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SetDefaultLocaleForTest(const std::string& tag, base::Environment* env) { 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (kUseLocaleFromEnvironment) 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->SetVar("LANGUAGE", tag); 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) else 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::i18n::SetICUDefaultLocale(tag); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetAppLocale) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<base::Environment> env; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Use a temporary locale dir so we don't have to actually build the locale 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // pak files for this test. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ScopedPathOverride locale_dir_override(ui::DIR_LOCALES); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath new_locale_dir; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PathService::Get(ui::DIR_LOCALES, &new_locale_dir)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make fake locale files. 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string filenames[] = { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "en-US", 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "en-GB", 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "fr", 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "es-419", 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "es", 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "zh-TW", 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "zh-CN", 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "he", 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "fil", 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "nb", 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "am", 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ca", 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ca@valencia", 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(filenames); ++i) { 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath filename = new_locale_dir.AppendASCII( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filenames[i] + ".pak"); 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WriteFile(filename, "", 0); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a copy of ICU's default locale before we overwrite it. 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string original_locale = base::i18n::GetConfiguredLocale(); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (kPlatformHasDefaultLocale && kUseLocaleFromEnvironment) { 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env.reset(base::Environment::Create()); 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Test the support of LANGUAGE environment variable. 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->SetVar("LANGUAGE", "xx:fr_CA"); 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale(std::string())); 14403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage()); 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->SetVar("LANGUAGE", "xx:yy:en_gb.utf-8@quot"); 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string())); 14803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->SetVar("LANGUAGE", "xx:zh-hk"); 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("zh-TW", l10n_util::GetApplicationLocale(std::string())); 15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("zh", icu::Locale::getDefault().getLanguage()); 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We emulate gettext's behavior here, which ignores LANG/LC_MESSAGES/LC_ALL 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // when LANGUAGE is specified. If no language specified in LANGUAGE is 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // valid, 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // then just fallback to the default language, which is en-US for us. 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::i18n::SetICUDefaultLocale("fr-FR"); 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->SetVar("LANGUAGE", "xx:yy"); 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(std::string())); 16103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->SetVar("LANGUAGE", "/fr:zh_CN"); 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("zh-CN", l10n_util::GetApplicationLocale(std::string())); 16503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("zh", icu::Locale::getDefault().getLanguage()); 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Test prioritization of the different environment variables. 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->SetVar("LANGUAGE", "fr"); 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->SetVar("LC_ALL", "es"); 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->SetVar("LC_MESSAGES", "he"); 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->SetVar("LANG", "nb"); 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale(std::string())); 17303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage()); 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->UnSetVar("LANGUAGE"); 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("es", l10n_util::GetApplicationLocale(std::string())); 17603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("es", icu::Locale::getDefault().getLanguage()); 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->UnSetVar("LC_ALL"); 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("he", l10n_util::GetApplicationLocale(std::string())); 17903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("he", icu::Locale::getDefault().getLanguage()); 180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->UnSetVar("LC_MESSAGES"); 181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("nb", l10n_util::GetApplicationLocale(std::string())); 18203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("nb", icu::Locale::getDefault().getLanguage()); 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) env->UnSetVar("LANG"); 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("ca", env.get()); 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("ca", l10n_util::GetApplicationLocale(std::string())); 18703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("ca", icu::Locale::getDefault().getLanguage()); 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("ca-ES", env.get()); 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("ca", l10n_util::GetApplicationLocale(std::string())); 19103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("ca", icu::Locale::getDefault().getLanguage()); 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("ca@valencia", env.get()); 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale(std::string())); 19503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("ca", icu::Locale::getDefault().getLanguage()); 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("ca_ES@valencia", env.get()); 198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale(std::string())); 19903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("ca", icu::Locale::getDefault().getLanguage()); 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("ca_ES.UTF8@valencia", env.get()); 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("ca@valencia", l10n_util::GetApplicationLocale(std::string())); 20303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("ca", icu::Locale::getDefault().getLanguage()); 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("en-US", env.get()); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(std::string())); 20803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetDefaultLocaleForTest("xx", env.get()); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(std::string())); 21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!kPlatformHasDefaultLocale) { 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ChromeOS & embedded use only browser prefs in GetApplicationLocale(), 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // ignoring the environment, and default to en-US. Other platforms honor 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the default locale from the OS or environment. 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-GB", env.get()); 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("")); 22003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-US", env.get()); 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-GB")); 22403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-US", env.get()); 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-AU")); 22803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-US", env.get()); 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-NZ")); 23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-US", env.get()); 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-CA")); 23603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-US", env.get()); 239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("en-ZA")); 24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Most platforms have an OS-provided locale. This locale is preferred. 243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-GB", env.get()); 244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string())); 24503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("fr-CA", env.get()); 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale(std::string())); 24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("es-MX", env.get()); 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("es-419", l10n_util::GetApplicationLocale(std::string())); 25303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("es", icu::Locale::getDefault().getLanguage()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("es-AR", env.get()); 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("es-419", l10n_util::GetApplicationLocale(std::string())); 25703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("es", icu::Locale::getDefault().getLanguage()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("es-ES", env.get()); 260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("es", l10n_util::GetApplicationLocale(std::string())); 26103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("es", icu::Locale::getDefault().getLanguage()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("es", env.get()); 264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("es", l10n_util::GetApplicationLocale(std::string())); 26503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("es", icu::Locale::getDefault().getLanguage()); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("zh-HK", env.get()); 268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("zh-TW", l10n_util::GetApplicationLocale(std::string())); 26903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("zh", icu::Locale::getDefault().getLanguage()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("zh-MO", env.get()); 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("zh-TW", l10n_util::GetApplicationLocale(std::string())); 27303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("zh", icu::Locale::getDefault().getLanguage()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("zh-SG", env.get()); 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("zh-CN", l10n_util::GetApplicationLocale(std::string())); 27703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("zh", icu::Locale::getDefault().getLanguage()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-CA", env.get()); 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string())); 28103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-AU", env.get()); 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string())); 28503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-NZ", env.get()); 288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string())); 28903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) SetDefaultLocaleForTest("en-ZA", env.get()); 292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale(std::string())); 29303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) SetDefaultLocaleForTest("en-US", env.get()); 29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (kSupportsLocalePreference) { 299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // On windows, the user can override the locale in preferences. 300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale("fr")); 30203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage()); 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale("fr-CA")); 30403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage()); 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::i18n::SetICUDefaultLocale("en-US"); 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Aliases iw, no, tl to he, nb, fil. 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("he", l10n_util::GetApplicationLocale("iw")); 30903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("he", icu::Locale::getDefault().getLanguage()); 310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("nb", l10n_util::GetApplicationLocale("no")); 31103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("nb", icu::Locale::getDefault().getLanguage()); 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("fil", l10n_util::GetApplicationLocale("tl")); 31303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("fil", icu::Locale::getDefault().getLanguage()); 314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // es-419 and es-XX (where XX is not Spain) should be 315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // mapped to es-419 (Latin American Spanish). 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("es-419", l10n_util::GetApplicationLocale("es-419")); 31703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("es", icu::Locale::getDefault().getLanguage()); 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("es", l10n_util::GetApplicationLocale("es-ES")); 31903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("es", icu::Locale::getDefault().getLanguage()); 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("es-419", l10n_util::GetApplicationLocale("es-AR")); 32103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("es", icu::Locale::getDefault().getLanguage()); 322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::i18n::SetICUDefaultLocale("es-AR"); 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("es", l10n_util::GetApplicationLocale("es")); 32503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("es", icu::Locale::getDefault().getLanguage()); 326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::i18n::SetICUDefaultLocale("zh-HK"); 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("zh-CN", l10n_util::GetApplicationLocale("zh-CN")); 32903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("zh", icu::Locale::getDefault().getLanguage()); 330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::i18n::SetICUDefaultLocale("he"); 332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("en")); 33303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 33403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 33503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::i18n::SetICUDefaultLocale("he"); 33603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("en", false)); 33703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("he", icu::Locale::getDefault().getLanguage()); 33803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 33903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::i18n::SetICUDefaultLocale("de"); 34003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("xx", false)); 34103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("de", icu::Locale::getDefault().getLanguage()); 34203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 34303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::i18n::SetICUDefaultLocale("de"); 34403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("fr", l10n_util::GetApplicationLocale("fr", false)); 34503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("de", icu::Locale::getDefault().getLanguage()); 34603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 34703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::i18n::SetICUDefaultLocale("de"); 34803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("en", false)); 34903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("de", icu::Locale::getDefault().getLanguage()); 35003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 35103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::i18n::SetICUDefaultLocale("de"); 35203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("en-US", true)); 35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 35403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } else { 35503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::i18n::SetICUDefaultLocale("de"); 35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(std::string(), false)); 35703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("de", icu::Locale::getDefault().getLanguage()); 35803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 35903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::i18n::SetICUDefaultLocale("de"); 36003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale(std::string(), true)); 36103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Amharic should be blocked unless OS is Vista or newer. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (base::win::GetVersion() < base::win::VERSION_VISTA) { 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("am"); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-US", l10n_util::GetApplicationLocale("")); 36903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-GB"); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("en-GB", l10n_util::GetApplicationLocale("am")); 37203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("am"); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("am", l10n_util::GetApplicationLocale("")); 37603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("am", icu::Locale::getDefault().getLanguage()); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("en-GB"); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("am", l10n_util::GetApplicationLocale("am")); 37903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) EXPECT_STREQ("am", icu::Locale::getDefault().getLanguage()); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up. 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::i18n::SetICUDefaultLocale(original_locale); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // !defined(OS_MACOSX) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, SortStringsUsingFunction) { 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<StringWrapper*> strings; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strings.push_back(new StringWrapper(UTF8ToUTF16("C"))); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strings.push_back(new StringWrapper(UTF8ToUTF16("d"))); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strings.push_back(new StringWrapper(UTF8ToUTF16("b"))); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) strings.push_back(new StringWrapper(UTF8ToUTF16("a"))); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::SortStringsUsingMethod("en-US", 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &strings, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &StringWrapper::string); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(UTF8ToUTF16("a") == strings[0]->string()); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(UTF8ToUTF16("b") == strings[1]->string()); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(UTF8ToUTF16("C") == strings[2]->string()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(UTF8ToUTF16("d") == strings[3]->string()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) STLDeleteElements(&strings); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/** 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Helper method for validating strings that require direcitonal markup. 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Checks that parentheses are enclosed in appropriate direcitonal markers. 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckUiDisplayNameForLocale(const std::string& locale, 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& display_locale, 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool is_rtl) { 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(true, base::i18n::IsRTL()); 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 result = l10n_util::GetDisplayNameForLocale(locale, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) display_locale, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* is_for_ui */ true); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool rtl_direction = true; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < result.length() - 1; i++) { 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::char16 ch = result.at(i); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (ch) { 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::i18n::kLeftToRightMark: 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::i18n::kLeftToRightEmbeddingMark: 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rtl_direction = false; 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::i18n::kRightToLeftMark: 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case base::i18n::kRightToLeftEmbeddingMark: 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rtl_direction = true; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case '(': 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case ')': 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(is_rtl, rtl_direction); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetDisplayNameForLocale) { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jungshik): Make this test more extensive. 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test zh-CN and zh-TW are treated as zh-Hans and zh-Hant. 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 result = 4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) l10n_util::GetDisplayNameForLocale("zh-CN", "en", false); 4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Chinese (Simplified)"), result); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("zh-TW", "en", false); 4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Chinese (Traditional)"), result); 4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // tl and fil are not identical to be strict, but we treat them as 4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // synonyms. 4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("tl", "en", false); 4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(l10n_util::GetDisplayNameForLocale("fil", "en", false), result); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("pt-BR", "en", false); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Portuguese (Brazil)"), result); 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("es-419", "en", false); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Spanish (Latin America)"), result); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("-BR", "en", false); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Brazil"), result); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForLocale("xyz-xyz", "en", false); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("xyz (XYZ)"), result); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check for directional markers when using RTL languages to ensure that 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // direction neutral characters such as parentheses are properly formatted. 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Keep a copy of ICU's default locale before we overwrite it. 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string original_locale = base::i18n::GetConfiguredLocale(); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("he"); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckUiDisplayNameForLocale("en-US", "en", false); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckUiDisplayNameForLocale("en-US", "he", true); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up. 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::i18n::SetICUDefaultLocale(original_locale); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ToUpper and ToLower should work with embedded NULLs. 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const size_t length_with_null = 4; 4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::char16 buf_with_null[length_with_null] = { 0, 'a', 0, 'b' }; 4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 string16_with_null(buf_with_null, length_with_null); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 upper_with_null = base::i18n::ToUpper(string16_with_null); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(length_with_null, upper_with_null.size()); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(upper_with_null[0] == 0 && upper_with_null[1] == 'A' && 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) upper_with_null[2] == 0 && upper_with_null[3] == 'B'); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 lower_with_null = base::i18n::ToLower(upper_with_null); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(length_with_null, upper_with_null.size()); 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(lower_with_null[0] == 0 && lower_with_null[1] == 'a' && 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) lower_with_null[2] == 0 && lower_with_null[3] == 'b'); 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetDisplayNameForCountry) { 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 result = l10n_util::GetDisplayNameForCountry("BR", "en"); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Brazil"), result); 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForCountry("419", "en"); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("Latin America"), result); 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = l10n_util::GetDisplayNameForCountry("xyz", "en"); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("XYZ"), result); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, GetParentLocales) { 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> locales; 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string top_locale("sr_Cyrl_RS"); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetParentLocales(top_locale, &locales); 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(3U, locales.size()); 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("sr_Cyrl_RS", locales[0]); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("sr_Cyrl", locales[1]); 5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("sr", locales[2]); 5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(L10nUtilTest, IsValidLocaleSyntax) { 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test valid locales. 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en")); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fr")); 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("de")); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("pt")); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh")); 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fil")); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("haw")); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en-US")); 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_US")); 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_GB")); 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("pt-BR")); 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_CN")); 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hans")); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hans_CN")); 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hant")); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zh_Hant_TW")); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fr_CA")); 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("i-klingon")); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("es-419")); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_IE_PREEURO")); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_IE_u_cu_IEP")); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("en_IE@currency=IEP")); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("fr@x=y")); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax("zn_CN@foo=bar")); 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax( 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "fr@collation=phonebook;calendar=islamic-civil")); 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(l10n_util::IsValidLocaleSyntax( 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "sr_Latn_RS_REVISED@currency=USD")); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test invalid locales. 545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax(std::string())); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("x")); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("12")); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("456")); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("a1")); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("enUS")); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("zhcn")); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en.US")); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en#US")); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("-en-US")); 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US-")); 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("123-en-US")); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("Latin")); 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("German")); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("pt--BR")); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("sl-macedonia")); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("@")); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@")); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@x")); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@x=")); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(l10n_util::IsValidLocaleSyntax("en-US@=y")); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 567