1// Copyright 2013 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.
4
5#include "components/translate/common/translate_util.h"
6
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/common/translate_switches.h"
12#include "url/gurl.h"
13
14namespace {
15
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'.
18void SplitIntoMainAndTail(const std::string& language,
19                          std::string* main_part,
20                          std::string* tail_part) {
21  DCHECK(main_part);
22  DCHECK(tail_part);
23
24  std::vector<std::string> chunks;
25  base::SplitString(language, '-', &chunks);
26  if (chunks.size() == 0u)
27    return;
28
29  *main_part = chunks[0];
30  *tail_part = language.substr(main_part->size());
31}
32
33}  // namespace
34
35namespace translate {
36
37struct LanguageCodePair {
38  // Code used in supporting list of Translate.
39  const char* const translate_language;
40
41  // Code used in Chrome internal.
42  const char* const chrome_language;
43};
44
45// Some languages are treated as same languages in Translate even though they
46// are different to be exact.
47//
48// If this table is updated, please sync this with the synonym table in
49// chrome/browser/resources/options/language_options.js
50const LanguageCodePair kLanguageCodeSimilitudes[] = {
51  {"no", "nb"},
52  {"tl", "fil"},
53};
54
55// Some languages have changed codes over the years and sometimes the older
56// codes are used, so we must see them as synonyms.
57//
58// If this table is updated, please sync this with the synonym table in
59// chrome/browser/resources/options/language_options.js
60const LanguageCodePair kLanguageCodeSynonyms[] = {
61  {"iw", "he"},
62  {"jw", "jv"},
63};
64
65const char kSecurityOrigin[] = "https://translate.googleapis.com/";
66
67void 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;
71      return;
72    }
73  }
74
75  std::string main_part, tail_part;
76  SplitIntoMainAndTail(*language, &main_part, &tail_part);
77  if (main_part.empty())
78    return;
79
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);
84      break;
85    }
86  }
87
88  *language = main_part + tail_part;
89}
90
91void 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;
95      return;
96    }
97  }
98
99  std::string main_part, tail_part;
100  SplitIntoMainAndTail(*language, &main_part, &tail_part);
101  if (main_part.empty())
102    return;
103
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);
108      break;
109    }
110  }
111
112  *language = main_part + tail_part;
113}
114
115GURL GetTranslateSecurityOrigin() {
116  std::string security_origin(kSecurityOrigin);
117  CommandLine* command_line = CommandLine::ForCurrentProcess();
118  if (command_line->HasSwitch(switches::kTranslateSecurityOrigin)) {
119    security_origin =
120        command_line->GetSwitchValueASCII(switches::kTranslateSecurityOrigin);
121  }
122  return GURL(security_origin);
123}
124
125}  // namespace translate
126