| // Copyright 2013 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. |
| |
| #include "components/translate/common/translate_util.h" |
| |
| #include "base/basictypes.h" |
| #include "base/command_line.h" |
| #include "base/logging.h" |
| #include "base/strings/string_split.h" |
| #include "components/translate/common/translate_switches.h" |
| #include "url/gurl.h" |
| |
| namespace { |
| |
| // Split the |language| into two parts. For example, if |language| is 'en-US', |
| // this will be split into the main part 'en' and the tail part '-US'. |
| void SplitIntoMainAndTail(const std::string& language, |
| std::string* main_part, |
| std::string* tail_part) { |
| DCHECK(main_part); |
| DCHECK(tail_part); |
| |
| std::vector<std::string> chunks; |
| base::SplitString(language, '-', &chunks); |
| if (chunks.size() == 0u) |
| return; |
| |
| *main_part = chunks[0]; |
| *tail_part = language.substr(main_part->size()); |
| } |
| |
| } // namespace |
| |
| namespace translate { |
| |
| struct LanguageCodePair { |
| // Code used in supporting list of Translate. |
| const char* const translate_language; |
| |
| // Code used in Chrome internal. |
| const char* const chrome_language; |
| }; |
| |
| // Some languages are treated as same languages in Translate even though they |
| // are different to be exact. |
| // |
| // If this table is updated, please sync this with the synonym table in |
| // chrome/browser/resources/options/language_options.js |
| const LanguageCodePair kLanguageCodeSimilitudes[] = { |
| {"no", "nb"}, |
| {"tl", "fil"}, |
| }; |
| |
| // Some languages have changed codes over the years and sometimes the older |
| // codes are used, so we must see them as synonyms. |
| // |
| // If this table is updated, please sync this with the synonym table in |
| // chrome/browser/resources/options/language_options.js |
| const LanguageCodePair kLanguageCodeSynonyms[] = { |
| {"iw", "he"}, |
| {"jw", "jv"}, |
| }; |
| |
| const char kSecurityOrigin[] = "https://translate.googleapis.com/"; |
| |
| void ToTranslateLanguageSynonym(std::string* language) { |
| for (size_t i = 0; i < arraysize(kLanguageCodeSimilitudes); ++i) { |
| if (*language == kLanguageCodeSimilitudes[i].chrome_language) { |
| *language = kLanguageCodeSimilitudes[i].translate_language; |
| return; |
| } |
| } |
| |
| std::string main_part, tail_part; |
| SplitIntoMainAndTail(*language, &main_part, &tail_part); |
| if (main_part.empty()) |
| return; |
| |
| // Apply linear search here because number of items in the list is just four. |
| for (size_t i = 0; i < arraysize(kLanguageCodeSynonyms); ++i) { |
| if (main_part == kLanguageCodeSynonyms[i].chrome_language) { |
| main_part = std::string(kLanguageCodeSynonyms[i].translate_language); |
| break; |
| } |
| } |
| |
| *language = main_part + tail_part; |
| } |
| |
| void ToChromeLanguageSynonym(std::string* language) { |
| for (size_t i = 0; i < arraysize(kLanguageCodeSimilitudes); ++i) { |
| if (*language == kLanguageCodeSimilitudes[i].translate_language) { |
| *language = kLanguageCodeSimilitudes[i].chrome_language; |
| return; |
| } |
| } |
| |
| std::string main_part, tail_part; |
| SplitIntoMainAndTail(*language, &main_part, &tail_part); |
| if (main_part.empty()) |
| return; |
| |
| // Apply liner search here because number of items in the list is just four. |
| for (size_t i = 0; i < arraysize(kLanguageCodeSynonyms); ++i) { |
| if (main_part == kLanguageCodeSynonyms[i].translate_language) { |
| main_part = std::string(kLanguageCodeSynonyms[i].chrome_language); |
| break; |
| } |
| } |
| |
| *language = main_part + tail_part; |
| } |
| |
| GURL GetTranslateSecurityOrigin() { |
| std::string security_origin(kSecurityOrigin); |
| CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| if (command_line->HasSwitch(switches::kTranslateSecurityOrigin)) { |
| security_origin = |
| command_line->GetSwitchValueASCII(switches::kTranslateSecurityOrigin); |
| } |
| return GURL(security_origin); |
| } |
| |
| } // namespace translate |