Commit a5dc5abb authored by Varun Varada's avatar Varun Varada Committed by Commit Bot

Add en-GB-oxendict locale

This commit adds the Oxford English Dictionary variant of the
British English (en-GB) locale to allow for strict spellchecking
when using the corresponding locale (en-GB-oxendict) as distinguished
from the generic British English (en-GB) locale.

Bug: chromium:1064659
Change-Id: Ia625a3566b7d89475c4853562ebbdb3afe7f9ffc
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2140610
Commit-Queue: Guillaume Jenkins <gujen@google.com>
Reviewed-by: default avataredchin <edchin@chromium.org>
Reviewed-by: default avatarGuillaume Jenkins <gujen@google.com>
Reviewed-by: default avataranthonyvd <anthonyvd@chromium.org>
Reviewed-by: default avatarAvi Drissman <avi@chromium.org>
Reviewed-by: default avatarRouslan Solomakhin <rouslan@chromium.org>
Reviewed-by: default avatarFrank Tang <ftang@chromium.org>
Cr-Commit-Position: refs/heads/master@{#784165}
parent 8f39775a
...@@ -1009,7 +1009,7 @@ deps = { ...@@ -1009,7 +1009,7 @@ deps = {
}, },
'src/third_party/hunspell_dictionaries': 'src/third_party/hunspell_dictionaries':
Var('chromium_git') + '/chromium/deps/hunspell_dictionaries.git' + '@' + '6fdad5388130757e1efb58a14b8e7f9494625691', Var('chromium_git') + '/chromium/deps/hunspell_dictionaries.git' + '@' + '18e09b9197a3b1d771c077c530d1a4ebad04c167',
'src/third_party/icu': 'src/third_party/icu':
Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '79326efe26e5440f530963704c3c0ff965b3a4ac', Var('chromium_git') + '/chromium/deps/icu.git' + '@' + '79326efe26e5440f530963704c3c0ff965b3a4ac',
......
...@@ -28,13 +28,29 @@ struct LocaleUIFallbackPair { ...@@ -28,13 +28,29 @@ struct LocaleUIFallbackPair {
// Note that no (Norwegian) is an alias, and should fallback to Norwegian // Note that no (Norwegian) is an alias, and should fallback to Norwegian
// Bokmål (nb) // Bokmål (nb)
const LocaleUIFallbackPair kLocaleUIFallbackTable[] = { const LocaleUIFallbackPair kLocaleUIFallbackTable[] = {
{"en", "en-US"}, {"en-AU", "en-GB"}, {"en-CA", "en-GB"}, // clang-format off
{"en-IN", "en-GB"}, {"en-NZ", "en-GB"}, {"en-ZA", "en-GB"}, {"en", "en-US"},
{"es-AR", "es-419"}, {"es-CL", "es-419"}, {"es-CO", "es-419"}, {"en-AU", "en-GB"},
{"es-CR", "es-419"}, {"es-HN", "es-419"}, {"es-MX", "es-419"}, {"en-CA", "en-GB"},
{"es-PE", "es-419"}, {"es-US", "es-419"}, {"es-UY", "es-419"}, {"en-GB-oxendict", "en-GB"},
{"es-VE", "es-419"}, {"it-CH", "it"}, {"no", "nb"}, {"en-IN", "en-GB"},
{"pt", "pt-PT"}}; {"en-NZ", "en-GB"},
{"en-ZA", "en-GB"},
{"es-AR", "es-419"},
{"es-CL", "es-419"},
{"es-CO", "es-419"},
{"es-CR", "es-419"},
{"es-HN", "es-419"},
{"es-MX", "es-419"},
{"es-PE", "es-419"},
{"es-US", "es-419"},
{"es-UY", "es-419"},
{"es-VE", "es-419"},
{"it-CH", "it"},
{"no", "nb"},
{"pt", "pt-PT"}
// clang-format on
};
bool LocaleCompare(const LocaleUIFallbackPair& p1, const std::string& p2) { bool LocaleCompare(const LocaleUIFallbackPair& p1, const std::string& p2) {
return p1.chosen_locale < p2; return p1.chosen_locale < p2;
......
...@@ -78,7 +78,7 @@ TEST_F(LocaleUtilTest, ContainsSameBaseLanguage) { ...@@ -78,7 +78,7 @@ TEST_F(LocaleUtilTest, ContainsSameBaseLanguage) {
EXPECT_EQ(true, language::ContainsSameBaseLanguage(list, "fr-FR")); EXPECT_EQ(true, language::ContainsSameBaseLanguage(list, "fr-FR"));
// Multiple elements, no match. // Multiple elements, no match.
list = {"en-US", "es-AR", "en-UK"}; list = {"en-US", "es-AR", "en-GB"};
EXPECT_EQ(false, language::ContainsSameBaseLanguage(list, "fr-FR")); EXPECT_EQ(false, language::ContainsSameBaseLanguage(list, "fr-FR"));
// Multiple elements, with match. // Multiple elements, with match.
...@@ -187,6 +187,11 @@ TEST_F(LocaleUtilTest, ConvertToActualUILocale) { ...@@ -187,6 +187,11 @@ TEST_F(LocaleUtilTest, ConvertToActualUILocale) {
EXPECT_TRUE(is_ui); EXPECT_TRUE(is_ui);
EXPECT_EQ("en-GB", locale); EXPECT_EQ("en-GB", locale);
locale = "en-GB-oxendict";
is_ui = language::ConvertToActualUILocale(&locale);
EXPECT_TRUE(is_ui);
EXPECT_EQ("en-GB", locale);
locale = "en-IN"; locale = "en-IN";
is_ui = language::ConvertToActualUILocale(&locale); is_ui = language::ConvertToActualUILocale(&locale);
EXPECT_TRUE(is_ui); EXPECT_TRUE(is_ui);
......
...@@ -29,6 +29,7 @@ struct LanguageVersion { ...@@ -29,6 +29,7 @@ struct LanguageVersion {
static constexpr LanguageRegion kSupportedSpellCheckerLanguages[] = { static constexpr LanguageRegion kSupportedSpellCheckerLanguages[] = {
// Several languages are not to be included in the spellchecker list: // Several languages are not to be included in the spellchecker list:
// th-TH, vi-VI. // th-TH, vi-VI.
// clang-format off
{"af", "af-ZA"}, {"af", "af-ZA"},
{"bg", "bg-BG"}, {"bg", "bg-BG"},
{"ca", "ca-ES"}, {"ca", "ca-ES"},
...@@ -40,6 +41,7 @@ static constexpr LanguageRegion kSupportedSpellCheckerLanguages[] = { ...@@ -40,6 +41,7 @@ static constexpr LanguageRegion kSupportedSpellCheckerLanguages[] = {
{"en-AU", "en-AU"}, {"en-AU", "en-AU"},
{"en-CA", "en-CA"}, {"en-CA", "en-CA"},
{"en-GB", "en-GB"}, {"en-GB", "en-GB"},
{"en-GB-oxendict", "en-GB-oxendict"},
{"en-US", "en-US"}, {"en-US", "en-US"},
{"es", "es-ES"}, {"es", "es-ES"},
{"es-419", "es-ES"}, {"es-419", "es-ES"},
...@@ -79,6 +81,7 @@ static constexpr LanguageRegion kSupportedSpellCheckerLanguages[] = { ...@@ -79,6 +81,7 @@ static constexpr LanguageRegion kSupportedSpellCheckerLanguages[] = {
{"tr", "tr-TR"}, {"tr", "tr-TR"},
{"uk", "uk-UA"}, {"uk", "uk-UA"},
{"vi", "vi-VN"}, {"vi", "vi-VN"},
// clang-format on
}; };
bool IsValidRegion(const std::string& region) { bool IsValidRegion(const std::string& region) {
...@@ -136,6 +139,9 @@ base::FilePath GetVersionedFileName(base::StringPiece input_language, ...@@ -136,6 +139,9 @@ base::FilePath GetVersionedFileName(base::StringPiece input_language,
// March 2020: Update uk-UA dictionary from upstream. // March 2020: Update uk-UA dictionary from upstream.
{"uk-UA", "-4-0"}, {"uk-UA", "-4-0"},
// June 2020: Add the en-GB-oxendict dictionary.
{"en-GB-oxendict", "-9-0"},
}; };
// Generate the bdict file name using default version string or special // Generate the bdict file name using default version string or special
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include <vector> #include <vector>
#include "base/json/json_reader.h" #include "base/json/json_reader.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_feature_list.h" #include "base/test/scoped_feature_list.h"
#include "base/test/test_timeouts.h" #include "base/test/test_timeouts.h"
#include "base/values.h" #include "base/values.h"
...@@ -26,6 +27,7 @@ ...@@ -26,6 +27,7 @@
#include "testing/gmock/include/gmock/gmock.h" #include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h" #include "ui/base/l10n/l10n_util.h"
#include "ui/base/l10n/l10n_util_collator.h"
namespace { namespace {
...@@ -138,11 +140,11 @@ class TranslatePrefsTest : public testing::Test { ...@@ -138,11 +140,11 @@ class TranslatePrefsTest : public testing::Test {
// Returns a vector of display names from the elements of the given // Returns a vector of display names from the elements of the given
// |language_list|. // |language_list|.
std::vector<std::string> ExtractDisplayNames( std::vector<base::string16> ExtractDisplayNames(
const std::vector<TranslateLanguageInfo>& language_list) const { const std::vector<TranslateLanguageInfo>& language_list) const {
std::vector<std::string> output; std::vector<base::string16> output;
for (const auto& item : language_list) { for (const auto& item : language_list) {
output.push_back(item.display_name); output.push_back(base::UTF8ToUTF16(item.display_name));
} }
return output; return output;
} }
...@@ -362,10 +364,11 @@ TEST_F(TranslatePrefsTest, GetLanguageInfoListOutput) { ...@@ -362,10 +364,11 @@ TEST_F(TranslatePrefsTest, GetLanguageInfoListOutput) {
language_list.clear(); language_list.clear();
TranslatePrefs::GetLanguageInfoList("en-US", true /* translate_enabled */, TranslatePrefs::GetLanguageInfoList("en-US", true /* translate_enabled */,
&language_list); &language_list);
const std::vector<std::string> display_names = const std::vector<base::string16> display_names =
ExtractDisplayNames(language_list); ExtractDisplayNames(language_list);
std::vector<std::string> sorted(display_names); std::vector<base::string16> sorted(display_names);
std::sort(sorted.begin(), sorted.end()); l10n_util::SortVectorWithStringKey("en-US", &sorted, false);
EXPECT_THAT(display_names, ElementsAreArray(sorted)); EXPECT_THAT(display_names, ElementsAreArray(sorted));
} }
......
...@@ -87,7 +87,9 @@ source_set("unit_tests") { ...@@ -87,7 +87,9 @@ source_set("unit_tests") {
"//ios/chrome/browser/translate", "//ios/chrome/browser/translate",
"//ios/chrome/browser/ui/settings/language", "//ios/chrome/browser/ui/settings/language",
"//ios/chrome/browser/ui/settings/language/cells", "//ios/chrome/browser/ui/settings/language/cells",
"//testing/gmock",
"//testing/gtest", "//testing/gtest",
"//ui/base:base",
] ]
} }
......
...@@ -23,8 +23,10 @@ ...@@ -23,8 +23,10 @@
#import "ios/chrome/browser/ui/settings/language/cells/language_item.h" #import "ios/chrome/browser/ui/settings/language/cells/language_item.h"
#import "ios/chrome/browser/ui/settings/language/language_settings_consumer.h" #import "ios/chrome/browser/ui/settings/language/language_settings_consumer.h"
#import "ios/chrome/browser/ui/settings/language/language_settings_mediator.h" #import "ios/chrome/browser/ui/settings/language/language_settings_mediator.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest_mac.h" #include "testing/gtest_mac.h"
#include "testing/platform_test.h" #include "testing/platform_test.h"
#include "ui/base/l10n/l10n_util_collator.h"
#if !defined(__has_feature) || !__has_feature(objc_arc) #if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support." #error "This file requires ARC support."
...@@ -35,18 +37,19 @@ using language::prefs::kAcceptLanguages; ...@@ -35,18 +37,19 @@ using language::prefs::kAcceptLanguages;
using sync_preferences::PrefServiceMockFactory; using sync_preferences::PrefServiceMockFactory;
using sync_preferences::PrefServiceSyncable; using sync_preferences::PrefServiceSyncable;
using user_prefs::PrefRegistrySyncable; using user_prefs::PrefRegistrySyncable;
using ::testing::ElementsAreArray;
namespace { namespace {
// Constant for timeout while waiting for asynchronous sync operations. // Constant for timeout while waiting for asynchronous sync operations.
const NSTimeInterval kSyncOperationTimeout = 10.0; const NSTimeInterval kSyncOperationTimeout = 10.0;
std::vector<std::string> ExtractDisplayNamesFromLanguageItems( std::vector<base::string16> ExtractDisplayNamesFromLanguageItems(
NSArray<LanguageItem*>* language_items) { NSArray<LanguageItem*>* language_items) {
__block std::vector<std::string> output; __block std::vector<base::string16> output;
[language_items enumerateObjectsUsingBlock:^(LanguageItem* item, [language_items enumerateObjectsUsingBlock:^(LanguageItem* item,
NSUInteger index, BOOL* stop) { NSUInteger index, BOOL* stop) {
output.push_back(base::SysNSStringToUTF8(item.text)); output.push_back(base::SysNSStringToUTF16(item.text));
}]; }];
return output; return output;
} }
...@@ -182,9 +185,11 @@ TEST_F(LanguageSettingsMediatorTest, TestPrefsChanged) { ...@@ -182,9 +185,11 @@ TEST_F(LanguageSettingsMediatorTest, TestPrefsChanged) {
// and excludes languages already in the accept languages list. // and excludes languages already in the accept languages list.
TEST_F(LanguageSettingsMediatorTest, TestSupportedLanguagesItems) { TEST_F(LanguageSettingsMediatorTest, TestSupportedLanguagesItems) {
NSArray<LanguageItem*>* language_items = [mediator() supportedLanguagesItems]; NSArray<LanguageItem*>* language_items = [mediator() supportedLanguagesItems];
std::vector<std::string> display_names = std::vector<base::string16> display_names =
ExtractDisplayNamesFromLanguageItems(language_items); ExtractDisplayNamesFromLanguageItems(language_items);
EXPECT_TRUE(std::is_sorted(display_names.begin(), display_names.end())); std::vector<base::string16> sorted(display_names);
l10n_util::SortVectorWithStringKey("en-US", &sorted, false);
EXPECT_THAT(display_names, ElementsAreArray(sorted));
std::vector<std::string> language_codes = std::vector<std::string> language_codes =
ExtractLanguageCodesFromLanguageItems(language_items); ExtractLanguageCodesFromLanguageItems(language_items);
......
...@@ -52,40 +52,41 @@ ...@@ -52,40 +52,41 @@
namespace { namespace {
static const char* const kAcceptLanguageList[] = { static const char* const kAcceptLanguageList[] = {
"af", // Afrikaans "af", // Afrikaans
"am", // Amharic "am", // Amharic
"an", // Aragonese "an", // Aragonese
"ar", // Arabic "ar", // Arabic
"ast", // Asturian "ast", // Asturian
"az", // Azerbaijani "az", // Azerbaijani
"be", // Belarusian "be", // Belarusian
"bg", // Bulgarian "bg", // Bulgarian
"bh", // Bihari "bh", // Bihari
"bn", // Bengali "bn", // Bengali
"br", // Breton "br", // Breton
"bs", // Bosnian "bs", // Bosnian
"ca", // Catalan "ca", // Catalan
"ceb", // Cebuano "ceb", // Cebuano
"ckb", // Kurdish (Arabci), Sorani "ckb", // Kurdish (Arabic), Sorani
"co", // Corsican "co", // Corsican
"cs", // Czech "cs", // Czech
"cy", // Welsh "cy", // Welsh
"da", // Danish "da", // Danish
"de", // German "de", // German
"de-AT", // German (Austria) "de-AT", // German (Austria)
"de-CH", // German (Switzerland) "de-CH", // German (Switzerland)
"de-DE", // German (Germany) "de-DE", // German (Germany)
"de-LI", // German (Liechtenstein) "de-LI", // German (Liechtenstein)
"el", // Greek "el", // Greek
"en", // English "en", // English
"en-AU", // English (Australia) "en-AU", // English (Australia)
"en-CA", // English (Canada) "en-CA", // English (Canada)
"en-GB", // English (UK) "en-GB", // English (UK)
"en-IN", // English (India) "en-GB-oxendict", // English (UK, OED spelling)
"en-NZ", // English (New Zealand) "en-IN", // English (India)
"en-US", // English (US) "en-NZ", // English (New Zealand)
"en-ZA", // English (South Africa) "en-US", // English (US)
"eo", // Esperanto "en-ZA", // English (South Africa)
"eo", // Esperanto
// TODO(jungshik) : Do we want to list all es-Foo for Latin-American // TODO(jungshik) : Do we want to list all es-Foo for Latin-American
// Spanish speaking countries? // Spanish speaking countries?
"es", // Spanish "es", // Spanish
...@@ -383,18 +384,15 @@ bool CheckAndResolveLocale(const std::string& locale, ...@@ -383,18 +384,15 @@ bool CheckAndResolveLocale(const std::string& locale,
tmp_locale.append("-CN"); tmp_locale.append("-CN");
} }
} else if (base::LowerCaseEqualsASCII(lang, "en")) { } else if (base::LowerCaseEqualsASCII(lang, "en")) {
// Map Australian, Canadian, Indian, New Zealand and South African // Map Liberian and Filipino English to US English, and everything
// English to British English for now. // else to British English.
// TODO(jungshik): en-CA may have to change sides once // TODO(jungshik): en-CA may have to change sides once
// we have OS locale separate from app locale (Chrome's UI language). // we have OS locale separate from app locale (Chrome's UI language).
if (base::LowerCaseEqualsASCII(region, "au") || if (base::LowerCaseEqualsASCII(region, "lr") ||
base::LowerCaseEqualsASCII(region, "ca") || base::LowerCaseEqualsASCII(region, "ph")) {
base::LowerCaseEqualsASCII(region, "in") ||
base::LowerCaseEqualsASCII(region, "nz") ||
base::LowerCaseEqualsASCII(region, "za")) {
tmp_locale.append("-GB");
} else {
tmp_locale.append("-US"); tmp_locale.append("-US");
} else {
tmp_locale.append("-GB");
} }
} }
if (IsLocaleAvailable(tmp_locale)) { if (IsLocaleAvailable(tmp_locale)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment