diff options
-rw-r--r-- | chrome/browser/translate/translate_manager.cc | 49 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager.h | 5 | ||||
-rw-r--r-- | chrome/browser/translate/translate_manager_browsertest.cc | 62 |
3 files changed, 108 insertions, 8 deletions
diff --git a/chrome/browser/translate/translate_manager.cc b/chrome/browser/translate/translate_manager.cc index 8fd0c4f..5c383d8 100644 --- a/chrome/browser/translate/translate_manager.cc +++ b/chrome/browser/translate/translate_manager.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -56,7 +56,8 @@ using content::WebContents; namespace { -// The list of languages the Google translation server supports. +// The default list of languages the Google translation server supports. +// We use this list until we receive the list that the server exposes. // For information, here is the list of languages that Chrome can be run in // but that the translation server does not support: // am Amharic @@ -67,7 +68,7 @@ namespace { // mr Marathi // ta Tamil // te Telugu -const char* const kSupportedLanguages[] = { +const char* const kDefaultSupportedLanguages[] = { "af", // Afrikaans "az", // Azerbaijani "sq", // Albanian @@ -93,6 +94,7 @@ const char* const kSupportedLanguages[] = { "el", // Greek "ht", // Haitian Creole "he", // Hebrew + "iw", // Hebrew Synonym "hi", // Hindi "hu", // Hungarian "is", // Icelandic @@ -108,6 +110,7 @@ const char* const kSupportedLanguages[] = { "ms", // Malay "mt", // Maltese "nb", // Norwegian + "no", // Norwegian synonym "fa", // Persian "pl", // Polish "pt", // Portuguese @@ -128,6 +131,24 @@ const char* const kSupportedLanguages[] = { "yi", // Yiddish }; +// Language code synonyms. Some languages have changed codes over the years +// and sometimes the older codes are used, so we must see them as synonyms. +// Duplicated in TranslateManagerTest::LanguageCodeSynonyms. +// Note that we use code_1 and code_2 as opposed to old/new because of cases +// where both codes are still valid (like no & nb) but we still treat them +// as the same since they are close enough from the translate server point of +// view. +struct LanguageCodeSynonym { + const char* const code_1; + const char* const code_2; +}; + +const LanguageCodeSynonym kLanguageCodeSynonyms[] = { + {"no", "nb"}, + {"iw", "he"}, + {"jw", "jv"}, +}; + const char* const kTranslateScriptURL = "http://translate.google.com/translate_a/element.js?" "cb=cr.googleTranslate.onTranslateElementLoad"; @@ -214,15 +235,31 @@ void TranslateManager::SetSupportedLanguages(const std::string& language_list) { DictionaryValue::key_iterator iter = target_languages->begin_keys(); for (; iter != target_languages->end_keys(); ++iter) supported_languages_.Pointer()->insert(*iter); + + // Now add synonyms if one and only one of the pair element is in the list... + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kLanguageCodeSynonyms); ++i) { + if (supported_languages_.Pointer()->count( + kLanguageCodeSynonyms[i].code_1) != 0) { + if (supported_languages_.Pointer()->count( + kLanguageCodeSynonyms[i].code_2) == 0) { + supported_languages_.Pointer()->insert( + kLanguageCodeSynonyms[i].code_2); + } + } else if (supported_languages_.Pointer()->count( + kLanguageCodeSynonyms[i].code_2) != 0) { + supported_languages_.Pointer()->insert( + kLanguageCodeSynonyms[i].code_1); + } + } } // static void TranslateManager::InitSupportedLanguages() { // If our list of supported languages have not been set yet, we default - // to our hard coded list of languages in kSupportedLanguages. + // to our hard coded list of languages in kDefaultSupportedLanguages. if (supported_languages_.Pointer()->empty()) { - for (size_t i = 0; i < arraysize(kSupportedLanguages); ++i) - supported_languages_.Pointer()->insert(kSupportedLanguages[i]); + for (size_t i = 0; i < arraysize(kDefaultSupportedLanguages); ++i) + supported_languages_.Pointer()->insert(kDefaultSupportedLanguages[i]); } } diff --git a/chrome/browser/translate/translate_manager.h b/chrome/browser/translate/translate_manager.h index 5e7f089..0dcf695 100644 --- a/chrome/browser/translate/translate_manager.h +++ b/chrome/browser/translate/translate_manager.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -11,6 +11,7 @@ #include <string> #include <vector> +#include "base/gtest_prod_util.h" #include "base/lazy_instance.h" #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" @@ -111,6 +112,8 @@ class TranslateManager : public content::NotificationObserver, private: friend struct DefaultSingletonTraits<TranslateManager>; + friend class TranslateManagerTest; + FRIEND_TEST_ALL_PREFIXES(TranslateManagerTest, LanguageCodeSynonyms); // Structure that describes a translate request. // Translation may be deferred while the translate script is being retrieved diff --git a/chrome/browser/translate/translate_manager_browsertest.cc b/chrome/browser/translate/translate_manager_browsertest.cc index 67e44c0..1057705 100644 --- a/chrome/browser/translate/translate_manager_browsertest.cc +++ b/chrome/browser/translate/translate_manager_browsertest.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,8 +7,11 @@ #include <set> #include <vector> +#include "base/json/json_writer.h" +#include "base/memory/scoped_ptr.h" #include "base/stringprintf.h" #include "base/utf_string_conversions.h" +#include "base/values.h" #include "chrome/app/chrome_command_ids.h" #include "chrome/browser/infobars/infobar.h" #include "chrome/browser/infobars/infobar_tab_helper.h" @@ -618,6 +621,63 @@ TEST_F(TranslateManagerTest, FetchLanguagesFromTranslateServer) { SimulateSupportedLanguagesURLFetch(true, default_supported_languages); } +std::string GetLanguageListString( + const std::vector<std::string>& language_list) { + // The translate manager is expecting a JSON string like: + // sl({'sl': {'XX': 'LanguageName', ...}, 'tl': {'XX': 'LanguageName', ...}}) + // We only need to set the tl (target languages) dictionary. + scoped_ptr<DictionaryValue> target_languages_dict(new DictionaryValue); + for (size_t i = 0; i < language_list.size(); ++i) { + // The value is ignored, we only use the key. + target_languages_dict->Set(language_list[i], Value::CreateNullValue()); + } + + DictionaryValue language_list_dict; + language_list_dict.Set("tl", target_languages_dict.release()); + std::string language_list_json_str; + base::JSONWriter::Write(&language_list_dict, false, &language_list_json_str); + std::string language_list_str("sl("); + language_list_str += language_list_json_str; + language_list_str += ")"; + return language_list_str; +} + +// Test Language Code synonyms. +TEST_F(TranslateManagerTest, LanguageCodeSynonyms) { + // The current set of synonyms are {"nb", "no"}, {"he", "iw"}, {"jw", "jv"}. + + std::vector<std::string> language_list; + // Add some values around ht potential synonyms. + language_list.push_back("fr"); + language_list.push_back("nb"); + language_list.push_back("en"); + TranslateManager::SetSupportedLanguages(GetLanguageListString(language_list)); + + EXPECT_TRUE(TranslateManager::IsSupportedLanguage("no")); + EXPECT_TRUE(TranslateManager::IsSupportedLanguage("nb")); + + EXPECT_FALSE(TranslateManager::IsSupportedLanguage("he")); + EXPECT_FALSE(TranslateManager::IsSupportedLanguage("iw")); + EXPECT_FALSE(TranslateManager::IsSupportedLanguage("jw")); + EXPECT_FALSE(TranslateManager::IsSupportedLanguage("jv")); + + language_list.push_back("iw"); + TranslateManager::SetSupportedLanguages(GetLanguageListString(language_list)); + EXPECT_TRUE(TranslateManager::IsSupportedLanguage("he")); + EXPECT_TRUE(TranslateManager::IsSupportedLanguage("iw")); + + language_list.clear(); + language_list.push_back("jw"); + TranslateManager::SetSupportedLanguages(GetLanguageListString(language_list)); + EXPECT_TRUE(TranslateManager::IsSupportedLanguage("jw")); + EXPECT_TRUE(TranslateManager::IsSupportedLanguage("jv")); + + EXPECT_FALSE(TranslateManager::IsSupportedLanguage("no")); + EXPECT_FALSE(TranslateManager::IsSupportedLanguage("nb")); + EXPECT_FALSE(TranslateManager::IsSupportedLanguage("he")); + EXPECT_FALSE(TranslateManager::IsSupportedLanguage("iw")); +} + // Tests auto-translate on page. TEST_F(TranslateManagerTest, AutoTranslateOnNavigate) { // Simulate navigating to a page and getting its language. |