OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/translate/translate_language_list.h" | 5 #include "chrome/browser/translate/translate_language_list.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/json/json_reader.h" | 10 #include "base/json/json_reader.h" |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
104 | 104 |
105 // Retry parameter for fetching supporting language list. | 105 // Retry parameter for fetching supporting language list. |
106 const int kMaxRetryLanguageListFetch = 5; | 106 const int kMaxRetryLanguageListFetch = 5; |
107 | 107 |
108 } // namespace | 108 } // namespace |
109 | 109 |
110 // This must be kept in sync with the &cb= value in the kLanguageListFetchURL. | 110 // This must be kept in sync with the &cb= value in the kLanguageListFetchURL. |
111 const char TranslateLanguageList::kLanguageListCallbackName[] = "sl("; | 111 const char TranslateLanguageList::kLanguageListCallbackName[] = "sl("; |
112 const char TranslateLanguageList::kTargetLanguagesKey[] = "tl"; | 112 const char TranslateLanguageList::kTargetLanguagesKey[] = "tl"; |
113 | 113 |
114 TranslateLanguageList::TranslateLanguageList() { | 114 TranslateLanguageList::TranslateLanguageList() : requesting_alpha_(false) { |
115 // We default to our hard coded list of languages in | 115 // We default to our hard coded list of languages in |
116 // |kDefaultSupportedLanguages|. This list will be overriden by a server | 116 // |kDefaultSupportedLanguages|. This list will be overriden by a server |
117 // providing supported langauges list. | 117 // providing supported langauges list. |
118 for (size_t i = 0; i < arraysize(kDefaultSupportedLanguages); ++i) | 118 for (size_t i = 0; i < arraysize(kDefaultSupportedLanguages); ++i) |
119 supported_languages_.insert(kDefaultSupportedLanguages[i]); | 119 supported_languages_.insert(kDefaultSupportedLanguages[i]); |
120 } | 120 } |
121 | 121 |
122 TranslateLanguageList::~TranslateLanguageList() {} | 122 TranslateLanguageList::~TranslateLanguageList() {} |
123 | 123 |
124 void TranslateLanguageList::OnURLFetchComplete(const net::URLFetcher* source) { | 124 void TranslateLanguageList::OnURLFetchComplete(const net::URLFetcher* source) { |
125 DCHECK(url_fetcher_.get() == source); | 125 DCHECK(url_fetcher_.get() == source); |
126 scoped_ptr<const net::URLFetcher> delete_ptr(url_fetcher_.release()); | 126 scoped_ptr<const net::URLFetcher> delete_ptr(url_fetcher_.release()); |
127 | 127 |
128 if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS && | 128 if (source->GetStatus().status() == net::URLRequestStatus::SUCCESS && |
129 source->GetResponseCode() == net::HTTP_OK) { | 129 source->GetResponseCode() == net::HTTP_OK) { |
130 std::string data; | 130 std::string data; |
131 source->GetResponseAsString(&data); | 131 source->GetResponseAsString(&data); |
132 SetSupportedLanguages(data); | 132 SetSupportedLanguages(data); |
133 if (requesting_alpha_) | |
134 return; | |
135 scoped_ptr<const net::URLFetcher> delete_ptr(url_fetcher_.release()); | |
MAD
2013/05/29 14:09:32
I don't understand why you need this. url_fetcher_
Takashi Toyoshima
2013/05/30 06:25:31
Sorry, this looks mistakenly added on rebasing.
| |
136 FetchLanguageList(true); | |
MAD
2013/05/29 14:09:32
I don't like this chaining either... I would prefe
Takashi Toyoshima
2013/05/30 06:25:31
agreed.
| |
133 } else { | 137 } else { |
134 // TODO(toyoshim): Try again. http://crbug.com/244202 . | 138 // TODO(toyoshim): Try again. http://crbug.com/244202 . |
139 // Also In CrOS, FetchLanguageList is not called at launching Chrome. It | |
140 // will solve this problem that check if FetchLanguageList is already | |
141 // called, and call it if needed in InitSupportedLanguage(). | |
135 VLOG(9) << "Failed to Fetch languages from: " << kLanguageListFetchURL; | 142 VLOG(9) << "Failed to Fetch languages from: " << kLanguageListFetchURL; |
136 } | 143 } |
137 } | 144 } |
138 | 145 |
139 void TranslateLanguageList::GetSupportedLanguages( | 146 void TranslateLanguageList::GetSupportedLanguages( |
140 std::vector<std::string>* languages) { | 147 std::vector<std::string>* languages) { |
141 DCHECK(languages && languages->empty()); | 148 DCHECK(languages && languages->empty()); |
142 std::set<std::string>::const_iterator iter = supported_languages_.begin(); | 149 std::set<std::string>::const_iterator iter = supported_languages_.begin(); |
143 for (; iter != supported_languages_.end(); ++iter) | 150 for (; iter != supported_languages_.end(); ++iter) |
144 languages->push_back(*iter); | 151 languages->push_back(*iter); |
145 } | 152 } |
146 | 153 |
147 std::string TranslateLanguageList::GetLanguageCode( | 154 std::string TranslateLanguageList::GetLanguageCode( |
148 const std::string& chrome_locale) { | 155 const std::string& chrome_locale) { |
149 // Only remove the country code for country specific languages we don't | 156 // Only remove the country code for country specific languages we don't |
150 // support specifically yet. | 157 // support specifically yet. |
151 if (IsSupportedLanguage(chrome_locale)) | 158 if (IsSupportedLanguage(chrome_locale)) |
152 return chrome_locale; | 159 return chrome_locale; |
153 | 160 |
154 size_t hypen_index = chrome_locale.find('-'); | 161 size_t hypen_index = chrome_locale.find('-'); |
155 if (hypen_index == std::string::npos) | 162 if (hypen_index == std::string::npos) |
156 return chrome_locale; | 163 return chrome_locale; |
157 return chrome_locale.substr(0, hypen_index); | 164 return chrome_locale.substr(0, hypen_index); |
158 } | 165 } |
159 | 166 |
160 bool TranslateLanguageList::IsSupportedLanguage( | 167 bool TranslateLanguageList::IsSupportedLanguage(const std::string& language) { |
161 const std::string& page_language) { | 168 return supported_languages_.count(language) != 0; |
162 return supported_languages_.count(page_language) != 0; | 169 } |
170 | |
171 bool TranslateLanguageList::IsAlphaLanguage(const std::string& language) { | |
172 return supported_alpha_languages_.count(language) != 0; | |
163 } | 173 } |
164 | 174 |
165 void TranslateLanguageList::RequestLanguageList() { | 175 void TranslateLanguageList::RequestLanguageList() { |
166 if (url_fetcher_.get()) | 176 FetchLanguageList(false); |
167 return; | |
168 | |
169 GURL language_list_fetch_url = GURL(kLanguageListFetchURL); | |
170 language_list_fetch_url = | |
171 TranslateURLUtil::AddHostLocaleToUrl(language_list_fetch_url); | |
172 language_list_fetch_url = | |
173 TranslateURLUtil::AddApiKeyToUrl(language_list_fetch_url); | |
174 | |
175 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | |
176 if (command_line.HasSwitch(switches::kEnableTranslateAlphaLanguages)) { | |
177 language_list_fetch_url = net::AppendQueryParameter( | |
178 language_list_fetch_url, | |
179 kAlphaLanguageQueryName, | |
180 kAlphaLanguageQueryValue); | |
181 } | |
182 | |
183 VLOG(9) << "Fetch supporting language list from: " | |
184 << language_list_fetch_url.spec().c_str(); | |
185 | |
186 url_fetcher_.reset(net::URLFetcher::Create(1, | |
187 language_list_fetch_url, | |
188 net::URLFetcher::GET, | |
189 this)); | |
190 url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | | |
191 net::LOAD_DO_NOT_SAVE_COOKIES); | |
192 url_fetcher_->SetRequestContext(g_browser_process->system_request_context()); | |
193 url_fetcher_->SetMaxRetriesOn5xx(kMaxRetryLanguageListFetch); | |
194 url_fetcher_->Start(); | |
195 } | 177 } |
196 | 178 |
197 void TranslateLanguageList::SetSupportedLanguages( | 179 void TranslateLanguageList::SetSupportedLanguages( |
198 const std::string& language_list) { | 180 const std::string& language_list) { |
199 // The format is: | 181 // The format is: |
200 // sl({"sl": {"XX": "LanguageName", ...}, "tl": {"XX": "LanguageName", ...}}) | 182 // sl({"sl": {"XX": "LanguageName", ...}, "tl": {"XX": "LanguageName", ...}}) |
201 // Where "sl(" is set in kLanguageListCallbackName | 183 // Where "sl(" is set in kLanguageListCallbackName |
202 // and "tl" is kTargetLanguagesKey | 184 // and "tl" is kTargetLanguagesKey |
203 if (!StartsWithASCII(language_list, | 185 if (!StartsWithASCII(language_list, |
204 TranslateLanguageList::kLanguageListCallbackName, | 186 TranslateLanguageList::kLanguageListCallbackName, |
(...skipping 19 matching lines...) Expand all Loading... | |
224 // and the other for target languages, we want to use the target languages. | 206 // and the other for target languages, we want to use the target languages. |
225 DictionaryValue* language_dict = | 207 DictionaryValue* language_dict = |
226 static_cast<DictionaryValue*>(json_value.get()); | 208 static_cast<DictionaryValue*>(json_value.get()); |
227 DictionaryValue* target_languages = NULL; | 209 DictionaryValue* target_languages = NULL; |
228 if (!language_dict->GetDictionary(TranslateLanguageList::kTargetLanguagesKey, | 210 if (!language_dict->GetDictionary(TranslateLanguageList::kTargetLanguagesKey, |
229 &target_languages) || | 211 &target_languages) || |
230 target_languages == NULL) { | 212 target_languages == NULL) { |
231 NOTREACHED(); | 213 NOTREACHED(); |
232 return; | 214 return; |
233 } | 215 } |
234 // Now we can clear our current state... | 216 |
235 supported_languages_.clear(); | 217 if (!requesting_alpha_) { |
MAD
2013/05/29 14:09:32
SetSupportedLanguages should receive an argument a
Takashi Toyoshima
2013/05/30 06:25:31
Done.
| |
236 // ... and replace it with the values we just fetched from the server. | 218 // Now we can clear language list. |
237 for (DictionaryValue::Iterator iter(*target_languages); | 219 supported_languages_.clear(); |
238 !iter.IsAtEnd(); | 220 // ... and replace it with the values we just fetched from the server. |
239 iter.Advance()) { | 221 for (DictionaryValue::Iterator iter(*target_languages); |
240 supported_languages_.insert(iter.key()); | 222 !iter.IsAtEnd(); |
223 iter.Advance()) { | |
224 supported_languages_.insert(iter.key()); | |
225 } | |
226 } else { | |
227 // Now we can clear alpha language list. | |
228 supported_alpha_languages_.clear(); | |
229 // ... and add languages they are not in the supporting list to alpha | |
230 // language list. | |
231 for (DictionaryValue::Iterator iter(*target_languages); | |
232 !iter.IsAtEnd(); | |
233 iter.Advance()) { | |
234 if (IsSupportedLanguage(iter.key())) | |
235 continue; | |
236 // TODO(toyoshim): Check if UI libraries support adding locale. | |
237 supported_alpha_languages_.insert(iter.key()); | |
238 supported_languages_.insert(iter.key()); | |
MAD
2013/05/30 14:17:59
You used to add alpha languages to both lists, and
Takashi Toyoshima
2013/05/30 14:41:38
Original logic is expected that stable list is fet
| |
239 } | |
241 } | 240 } |
242 } | 241 } |
242 | |
243 void TranslateLanguageList::FetchLanguageList(bool alpha) { | |
244 if (url_fetcher_.get()) | |
245 return; | |
246 | |
247 GURL language_list_fetch_url = GURL(kLanguageListFetchURL); | |
248 language_list_fetch_url = | |
249 TranslateURLUtil::AddHostLocaleToUrl(language_list_fetch_url); | |
250 language_list_fetch_url = | |
251 TranslateURLUtil::AddApiKeyToUrl(language_list_fetch_url); | |
252 | |
253 if (alpha) { | |
254 const CommandLine& command_line = *CommandLine::ForCurrentProcess(); | |
255 if (!command_line.HasSwitch(switches::kEnableTranslateAlphaLanguages)) | |
256 return; | |
257 | |
258 language_list_fetch_url = net::AppendQueryParameter( | |
259 language_list_fetch_url, | |
260 kAlphaLanguageQueryName, | |
261 kAlphaLanguageQueryValue); | |
262 | |
263 requesting_alpha_ = true; | |
264 } | |
265 | |
266 VLOG(9) << "Fetch supporting language list from: " | |
267 << language_list_fetch_url.spec().c_str(); | |
268 | |
269 url_fetcher_.reset(net::URLFetcher::Create(1, | |
270 language_list_fetch_url, | |
271 net::URLFetcher::GET, | |
272 this)); | |
273 url_fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SEND_COOKIES | | |
274 net::LOAD_DO_NOT_SAVE_COOKIES); | |
275 url_fetcher_->SetRequestContext(g_browser_process->system_request_context()); | |
276 url_fetcher_->SetMaxRetriesOn5xx(kMaxRetryLanguageListFetch); | |
277 url_fetcher_->Start(); | |
278 } | |
OLD | NEW |