summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/translate/translate_manager.cc49
-rw-r--r--chrome/browser/translate/translate_manager.h5
-rw-r--r--chrome/browser/translate/translate_manager_browsertest.cc62
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.