1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "components/translate/core/common/translate_util.h"
7 #include "base/basictypes.h"
8 #include "base/command_line.h"
9 #include "base/logging.h"
10 #include "base/strings/string_split.h"
11 #include "components/translate/core/common/translate_switches.h"
16 // Split the |language| into two parts. For example, if |language| is 'en-US',
17 // this will be split into the main part 'en' and the tail part '-US'.
18 void SplitIntoMainAndTail(const std::string
& language
,
19 std::string
* main_part
,
20 std::string
* tail_part
) {
24 std::vector
<std::string
> chunks
;
25 base::SplitString(language
, '-', &chunks
);
26 if (chunks
.size() == 0u)
29 *main_part
= chunks
[0];
30 *tail_part
= language
.substr(main_part
->size());
37 struct LanguageCodePair
{
38 // Code used in supporting list of Translate.
39 const char* const translate_language
;
41 // Code used in Chrome internal.
42 const char* const chrome_language
;
45 // Some languages are treated as same languages in Translate even though they
46 // are different to be exact.
48 // If this table is updated, please sync this with the synonym table in
49 // chrome/browser/resources/options/language_options.js
50 const LanguageCodePair kLanguageCodeSimilitudes
[] = {
55 // Some languages have changed codes over the years and sometimes the older
56 // codes are used, so we must see them as synonyms.
58 // If this table is updated, please sync this with the synonym table in
59 // chrome/browser/resources/options/language_options.js
60 const LanguageCodePair kLanguageCodeSynonyms
[] = {
65 const char kSecurityOrigin
[] = "https://translate.googleapis.com/";
67 void ToTranslateLanguageSynonym(std::string
* language
) {
68 for (size_t i
= 0; i
< arraysize(kLanguageCodeSimilitudes
); ++i
) {
69 if (*language
== kLanguageCodeSimilitudes
[i
].chrome_language
) {
70 *language
= kLanguageCodeSimilitudes
[i
].translate_language
;
75 std::string main_part
, tail_part
;
76 SplitIntoMainAndTail(*language
, &main_part
, &tail_part
);
77 if (main_part
.empty())
80 // Apply linear search here because number of items in the list is just four.
81 for (size_t i
= 0; i
< arraysize(kLanguageCodeSynonyms
); ++i
) {
82 if (main_part
== kLanguageCodeSynonyms
[i
].chrome_language
) {
83 main_part
= std::string(kLanguageCodeSynonyms
[i
].translate_language
);
88 *language
= main_part
+ tail_part
;
91 void ToChromeLanguageSynonym(std::string
* language
) {
92 for (size_t i
= 0; i
< arraysize(kLanguageCodeSimilitudes
); ++i
) {
93 if (*language
== kLanguageCodeSimilitudes
[i
].translate_language
) {
94 *language
= kLanguageCodeSimilitudes
[i
].chrome_language
;
99 std::string main_part
, tail_part
;
100 SplitIntoMainAndTail(*language
, &main_part
, &tail_part
);
101 if (main_part
.empty())
104 // Apply liner search here because number of items in the list is just four.
105 for (size_t i
= 0; i
< arraysize(kLanguageCodeSynonyms
); ++i
) {
106 if (main_part
== kLanguageCodeSynonyms
[i
].translate_language
) {
107 main_part
= std::string(kLanguageCodeSynonyms
[i
].chrome_language
);
112 *language
= main_part
+ tail_part
;
115 GURL
GetTranslateSecurityOrigin() {
116 std::string
security_origin(kSecurityOrigin
);
117 CommandLine
* command_line
= CommandLine::ForCurrentProcess();
118 if (command_line
->HasSwitch(switches::kTranslateSecurityOrigin
)) {
120 command_line
->GetSwitchValueASCII(switches::kTranslateSecurityOrigin
);
122 return GURL(security_origin
);
125 } // namespace translate