OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/renderer/translate_helper.h" | 5 #include "chrome/renderer/translate_helper.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 // Get the document language as set by WebKit from the http-equiv | 86 // Get the document language as set by WebKit from the http-equiv |
87 // meta tag for "content-language". This may or may not also | 87 // meta tag for "content-language". This may or may not also |
88 // have a value derived from the actual Content-Language HTTP | 88 // have a value derived from the actual Content-Language HTTP |
89 // header. The two actually have different meanings (despite the | 89 // header. The two actually have different meanings (despite the |
90 // original intent of http-equiv to be an equivalent) with the former | 90 // original intent of http-equiv to be an equivalent) with the former |
91 // being the language of the document and the latter being the | 91 // being the language of the document and the latter being the |
92 // language of the intended audience (a distinction really only | 92 // language of the intended audience (a distinction really only |
93 // relevant for things like langauge textbooks). This distinction | 93 // relevant for things like langauge textbooks). This distinction |
94 // shouldn't affect translation. | 94 // shouldn't affect translation. |
95 std::string language = document.contentLanguage().utf8(); | 95 std::string language = document.contentLanguage().utf8(); |
96 size_t coma_index = language.find(','); | 96 CorrectLanguageCodeTypo(&language); |
97 if (coma_index != std::string::npos) { | |
98 // There are more than 1 language specified, just keep the first one. | |
99 language = language.substr(0, coma_index); | |
100 } | |
101 TrimWhitespaceASCII(language, TRIM_ALL, &language); | |
102 | |
103 // An underscore instead of a dash is a frequent mistake. | |
104 size_t underscore_index = language.find('_'); | |
105 if (underscore_index != std::string::npos) | |
106 language[underscore_index] = '-'; | |
107 | |
108 // Change everything up to a dash to lower-case and everything after to upper. | |
109 size_t dash_index = language.find('-'); | |
110 if (dash_index != std::string::npos) { | |
111 language = StringToLowerASCII(language.substr(0, dash_index)) + | |
112 StringToUpperASCII(language.substr(dash_index)); | |
113 } else { | |
114 language = StringToLowerASCII(language); | |
115 } | |
116 | 97 |
117 #if defined(ENABLE_LANGUAGE_DETECTION) | 98 #if defined(ENABLE_LANGUAGE_DETECTION) |
118 if (language.empty()) { | 99 if (language.empty()) { |
119 base::TimeTicks begin_time = base::TimeTicks::Now(); | 100 base::TimeTicks begin_time = base::TimeTicks::Now(); |
120 language = DetermineTextLanguage(contents); | 101 language = DetermineTextLanguage(contents); |
121 UMA_HISTOGRAM_MEDIUM_TIMES("Renderer4.LanguageDetection", | 102 UMA_HISTOGRAM_MEDIUM_TIMES("Renderer4.LanguageDetection", |
122 base::TimeTicks::Now() - begin_time); | 103 base::TimeTicks::Now() - begin_time); |
123 } else { | 104 } else { |
124 VLOG(9) << "PageLanguageFromMetaTag: " << language; | 105 VLOG(9) << "PageLanguageFromMetaTag: " << language; |
125 } | 106 } |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 } | 216 } |
236 | 217 |
237 bool TranslateHelper::DontDelayTasks() { | 218 bool TranslateHelper::DontDelayTasks() { |
238 return false; | 219 return false; |
239 } | 220 } |
240 | 221 |
241 //////////////////////////////////////////////////////////////////////////////// | 222 //////////////////////////////////////////////////////////////////////////////// |
242 // TranslateHelper, private: | 223 // TranslateHelper, private: |
243 // | 224 // |
244 // static | 225 // static |
| 226 void TranslateHelper::CorrectLanguageCodeTypo(std::string* code) { |
| 227 DCHECK(code); |
| 228 |
| 229 size_t coma_index = code->find(','); |
| 230 if (coma_index != std::string::npos) { |
| 231 // There are more than 1 language specified, just keep the first one. |
| 232 *code = code->substr(0, coma_index); |
| 233 } |
| 234 TrimWhitespaceASCII(*code, TRIM_ALL, code); |
| 235 |
| 236 // An underscore instead of a dash is a frequent mistake. |
| 237 size_t underscore_index = code->find('_'); |
| 238 if (underscore_index != std::string::npos) |
| 239 (*code)[underscore_index] = '-'; |
| 240 |
| 241 // Change everything up to a dash to lower-case and everything after to upper. |
| 242 size_t dash_index = code->find('-'); |
| 243 if (dash_index != std::string::npos) { |
| 244 *code = StringToLowerASCII(code->substr(0, dash_index)) + |
| 245 StringToUpperASCII(code->substr(dash_index)); |
| 246 } else { |
| 247 *code = StringToLowerASCII(*code); |
| 248 } |
| 249 } |
| 250 |
| 251 // static |
245 void TranslateHelper::ConvertLanguageCodeSynonym(std::string* code) { | 252 void TranslateHelper::ConvertLanguageCodeSynonym(std::string* code) { |
| 253 DCHECK(code); |
| 254 |
246 // Apply liner search here because number of items in the list is just four. | 255 // Apply liner search here because number of items in the list is just four. |
247 for (size_t i = 0; i < arraysize(kLanguageCodeSynonyms); ++i) { | 256 for (size_t i = 0; i < arraysize(kLanguageCodeSynonyms); ++i) { |
248 if (code->compare(kLanguageCodeSynonyms[i].from) == 0) { | 257 if (code->compare(kLanguageCodeSynonyms[i].from) == 0) { |
249 *code = std::string(kLanguageCodeSynonyms[i].to); | 258 *code = std::string(kLanguageCodeSynonyms[i].to); |
250 break; | 259 break; |
251 } | 260 } |
252 } | 261 } |
253 } | 262 } |
254 | 263 |
255 // static | 264 // static |
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
479 WebView* web_view = render_view()->GetWebView(); | 488 WebView* web_view = render_view()->GetWebView(); |
480 if (!web_view) { | 489 if (!web_view) { |
481 // When the WebView is going away, the render view should have called | 490 // When the WebView is going away, the render view should have called |
482 // CancelPendingTranslation() which should have stopped any pending work, so | 491 // CancelPendingTranslation() which should have stopped any pending work, so |
483 // that case should not happen. | 492 // that case should not happen. |
484 NOTREACHED(); | 493 NOTREACHED(); |
485 return NULL; | 494 return NULL; |
486 } | 495 } |
487 return web_view->mainFrame(); | 496 return web_view->mainFrame(); |
488 } | 497 } |
OLD | NEW |