diff options
-rw-r--r-- | chrome/renderer/translate/translate_helper.cc | 18 | ||||
-rw-r--r-- | chrome/renderer/translate/translate_helper.h | 5 | ||||
-rw-r--r-- | chrome/renderer/translate/translate_helper_metrics.h | 1 | ||||
-rw-r--r-- | chrome/renderer/translate/translate_helper_metrics_unittest.cc | 25 | ||||
-rw-r--r-- | tools/metrics/histograms/histograms.xml | 11 |
5 files changed, 50 insertions, 10 deletions
diff --git a/chrome/renderer/translate/translate_helper.cc b/chrome/renderer/translate/translate_helper.cc index 4428b53..34b4afe 100644 --- a/chrome/renderer/translate/translate_helper.cc +++ b/chrome/renderer/translate/translate_helper.cc @@ -392,6 +392,16 @@ bool TranslateHelper::MaybeServerWrongConfiguration( } // static +bool TranslateHelper::CanCLDComplementSubCode( + const std::string& page_language, const std::string& cld_language) { + // Translate server cannot treat general Chinese. If Content-Language and + // CLD agree that the language is Chinese and Content-Language doesn't know + // which dialect is used, CLD language has priority. + // TODO(hajimehoshi): How about the other dialects like zh-MO? + return page_language == "zh" && StartsWithASCII(cld_language, "zh-", false); +} + +// static std::string TranslateHelper::DeterminePageLanguage(const std::string& code, const std::string& html_lang, const string16& contents, @@ -445,13 +455,19 @@ std::string TranslateHelper::DeterminePageLanguage(const std::string& code, if (cld_language == chrome::kUnknownLanguageCode) { TranslateHelperMetrics::ReportLanguageVerification( TranslateHelperMetrics::LANGUAGE_VERIFICATION_UNKNOWN); + return language; } else if (IsSameOrSimilarLanguages(language, cld_language)) { TranslateHelperMetrics::ReportLanguageVerification( TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_AGREE); + return language; } else if (MaybeServerWrongConfiguration(language, cld_language)) { - language = cld_language; TranslateHelperMetrics::ReportLanguageVerification( TranslateHelperMetrics::LANGUAGE_VERIFICATION_TRUST_CLD); + return cld_language; + } else if (CanCLDComplementSubCode(language, cld_language)) { + TranslateHelperMetrics::ReportLanguageVerification( + TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE); + return cld_language; } else { TranslateHelperMetrics::ReportLanguageVerification( TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_DISAGREE); diff --git a/chrome/renderer/translate/translate_helper.h b/chrome/renderer/translate/translate_helper.h index fa2b0b0..7118475 100644 --- a/chrome/renderer/translate/translate_helper.h +++ b/chrome/renderer/translate/translate_helper.h @@ -123,6 +123,11 @@ class TranslateHelper : public content::RenderViewObserver { static bool MaybeServerWrongConfiguration(const std::string& page_language, const std::string& cld_language); + // Checks if CLD can complement a sub code when the page language doesn't + // know the sub code. + static bool CanCLDComplementSubCode(const std::string& page_language, + const std::string& cld_language); + // Determines content page language from Content-Language code and contents. static std::string DeterminePageLanguage(const std::string& code, const std::string& html_lang, diff --git a/chrome/renderer/translate/translate_helper_metrics.h b/chrome/renderer/translate/translate_helper_metrics.h index 89d4de5..d0d5f1a 100644 --- a/chrome/renderer/translate/translate_helper_metrics.h +++ b/chrome/renderer/translate/translate_helper_metrics.h @@ -45,6 +45,7 @@ enum LanguageVerificationType { LANGUAGE_VERIFICATION_CLD_AGREE, LANGUAGE_VERIFICATION_CLD_DISAGREE, LANGUAGE_VERIFICATION_TRUST_CLD, + LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE, LANGUAGE_VERIFICATION_MAX, }; diff --git a/chrome/renderer/translate/translate_helper_metrics_unittest.cc b/chrome/renderer/translate/translate_helper_metrics_unittest.cc index 0851528..b0d4585 100644 --- a/chrome/renderer/translate/translate_helper_metrics_unittest.cc +++ b/chrome/renderer/translate/translate_helper_metrics_unittest.cc @@ -57,7 +57,8 @@ class MetricsRecorder { int expected_unknown, int expected_cld_agree, int expected_cld_disagree, - int expected_trust_cld) { + int expected_trust_cld, + int expected_cld_complement_sub_code) { ASSERT_EQ(TranslateHelperMetrics::GetMetricsName( TranslateHelperMetrics::UMA_LANGUAGE_VERIFICATION), key_); @@ -87,6 +88,11 @@ class MetricsRecorder { expected_trust_cld, GetCountWithoutSnapshot( TranslateHelperMetrics::LANGUAGE_VERIFICATION_TRUST_CLD)); + EXPECT_EQ( + expected_cld_complement_sub_code, + GetCountWithoutSnapshot( + TranslateHelperMetrics:: + LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE)); } void CheckScheme(int expected_http, int expected_https, int expected_others) { @@ -194,25 +200,28 @@ TEST(TranslateHelperMetricsTest, ReportLanguageVerification) { MetricsRecorder recorder(TranslateHelperMetrics::GetMetricsName( TranslateHelperMetrics::UMA_LANGUAGE_VERIFICATION)); - recorder.CheckLanguageVerification(0, 0, 0, 0, 0, 0); + recorder.CheckLanguageVerification(0, 0, 0, 0, 0, 0, 0); TranslateHelperMetrics::ReportLanguageVerification( TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_DISABLED); - recorder.CheckLanguageVerification(1, 0, 0, 0, 0, 0); + recorder.CheckLanguageVerification(1, 0, 0, 0, 0, 0, 0); TranslateHelperMetrics::ReportLanguageVerification( TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_ONLY); - recorder.CheckLanguageVerification(1, 1, 0, 0, 0, 0); + recorder.CheckLanguageVerification(1, 1, 0, 0, 0, 0, 0); TranslateHelperMetrics::ReportLanguageVerification( TranslateHelperMetrics::LANGUAGE_VERIFICATION_UNKNOWN); - recorder.CheckLanguageVerification(1, 1, 1, 0, 0, 0); + recorder.CheckLanguageVerification(1, 1, 1, 0, 0, 0, 0); TranslateHelperMetrics::ReportLanguageVerification( TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_AGREE); - recorder.CheckLanguageVerification(1, 1, 1, 1, 0, 0); + recorder.CheckLanguageVerification(1, 1, 1, 1, 0, 0, 0); TranslateHelperMetrics::ReportLanguageVerification( TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_DISAGREE); - recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 0); + recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 0, 0); TranslateHelperMetrics::ReportLanguageVerification( TranslateHelperMetrics::LANGUAGE_VERIFICATION_TRUST_CLD); - recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 1); + recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 1, 0); + TranslateHelperMetrics::ReportLanguageVerification( + TranslateHelperMetrics::LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE); + recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 1, 1); } TEST(TranslateHelperMetricsTest, ReportTimeToBeReady) { diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 6dd5ec6..fa831e7 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml @@ -11288,7 +11288,14 @@ other types of suffix sets. enum="TranslateLanguageVerification"> <summary> For each page load, measures whether the provided Content-Language header - matches the language determined by CLD. + matches the language determined by CLD. Beyond directly matching or + mismatching the Content-Language header, CLD can complement the + Content-Language. For example, suppose the Content-Language header + specifies 'zh' (general Chinese), a language code that the Translate server + does not support. In this case, CLD can detect a subcode like '-TW' or + '-CN', resulting in language codes 'zh-TW' and 'zh-CN', which the Translate + server supports. This is referred to as "complementing a language + subcode". </summary> </histogram> @@ -17952,6 +17959,8 @@ other types of suffix sets. <int value="2" label="CLD can not determine a language"/> <int value="3" label="CLD agrees with Content-Language"/> <int value="4" label="CLD disagrees with Content-Language"/> + <int value="5" label="CLD can be trusted"/> + <int value="6" label="CLD can complement a sub code"/> </enum> <enum name="TranslateScheme" type="int"> |