summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/renderer/translate/translate_helper.cc18
-rw-r--r--chrome/renderer/translate/translate_helper.h5
-rw-r--r--chrome/renderer/translate/translate_helper_metrics.h1
-rw-r--r--chrome/renderer/translate/translate_helper_metrics_unittest.cc25
-rw-r--r--tools/metrics/histograms/histograms.xml11
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 &quot;complementing a language
+ subcode&quot;.
</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">