Skip to content
Snippets Groups Projects
Commit 7a0d0815 authored by Greg Tatum's avatar Greg Tatum
Browse files

Bug 1835163 - Look up pivot languages for language detection; r=nordzilla

Depends on D179485

Differential Revision: https://phabricator.services.mozilla.com/D179486
parent 3bf633f3
No related merge requests found
......@@ -43,6 +43,8 @@ const DOC_LANGUAGE_DETECTION_THRESHOLD = 0.65;
*/
const DOC_TEXT_TO_IDENTIFY_LENGTH = 1024;
const PIVOT_LANGUAGE = "en";
import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
ChromeUtils.defineESModuleGetters(lazy, {
......@@ -677,22 +679,42 @@ export class TranslationsChild extends JSWindowActorChild {
break;
}
if (!langTags.isDocLangTagSupported) {
if (languagePairs.some(({ toLang }) => toLang === preferredLangTag)) {
// Only match the "to" language, since the "from" is not supported.
langTags.userLangTag = preferredLangTag;
}
break;
}
// Is there a direct language pair match?
if (
languagePairs.some(({ fromLang, toLang }) => {
if (langTags.isDocLangTagSupported) {
// Match both from and to languages.
return (
fromLang === langTags.docLangTag && toLang === preferredLangTag
);
}
// Only match the to language, since the "from" is not supported.
return toLang === preferredLangTag;
})
languagePairs.some(
({ fromLang, toLang }) =>
fromLang === langTags.docLangTag && toLang === preferredLangTag
)
) {
// A match was found in one of the preferred languages.
langTags.userLangTag = preferredLangTag;
break;
}
// Is there a pivot language match?
if (
// Match doc -> pivot
languagePairs.some(
({ fromLang, toLang }) =>
fromLang === langTags.docLangTag && toLang === PIVOT_LANGUAGE
) &&
// Match pivot -> preferred language
languagePairs.some(
({ fromLang, toLang }) =>
fromLang === PIVOT_LANGUAGE && toLang === preferredLangTag
)
) {
langTags.userLangTag = preferredLangTag;
break;
}
}
if (!langTags.userLangTag) {
......
......@@ -19,3 +19,4 @@ skip-if =
[browser_translation_document.js]
[browser_translations_actor.js]
[browser_translations_actor_preferred_language.js]
[browser_translations_lang_tags.js]
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const PIVOT_LANGUAGE = "en";
const LANGUAGE_PAIRS = [
{ fromLang: PIVOT_LANGUAGE, toLang: "es" },
{ fromLang: "es", toLang: PIVOT_LANGUAGE },
{ fromLang: PIVOT_LANGUAGE, toLang: "fr" },
{ fromLang: "fr", toLang: PIVOT_LANGUAGE },
{ fromLang: PIVOT_LANGUAGE, toLang: "pl" },
{ fromLang: "pl", toLang: PIVOT_LANGUAGE },
];
async function runLangTagsTest(
{
systemLocales,
appLocales,
webLanguages,
page,
languagePairs = LANGUAGE_PAIRS,
},
langTags
) {
const cleanupLocales = await mockLocales({
systemLocales,
appLocales,
webLanguages,
});
const { cleanup: cleanupTestPage } = await loadTestPage({
page,
languagePairs,
});
const actor = getTranslationsParent();
await TestUtils.waitForCondition(
async () => (await actor.getLangTagsForTranslation())?.docLangTag,
"Waiting for a document language tag to be found."
);
Assert.deepEqual(await actor.getLangTagsForTranslation(), langTags);
await cleanupLocales();
await cleanupTestPage();
}
add_task(async function test_lang_tags_direct_translations() {
info(
"Test the detected languages for translations when a translation pair is available"
);
await runLangTagsTest(
{
systemLocales: ["en"],
appLocales: ["en"],
webLanguages: ["en"],
page: TRANSLATIONS_TESTER_ES,
},
{
docLangTag: "es",
userLangTag: "en",
isDocLangTagSupported: true,
}
);
});
add_task(async function test_lang_tags_with_pivots() {
info("Test the detected languages for translations when a pivot is needed.");
await runLangTagsTest(
{
systemLocales: ["fr"],
appLocales: ["fr", "en"],
webLanguages: ["fr", "en"],
page: TRANSLATIONS_TESTER_ES,
},
{
docLangTag: "es",
userLangTag: "fr",
isDocLangTagSupported: true,
}
);
});
add_task(async function test_lang_tags_with_pivots_second_preferred() {
info(
"Test using a pivot language when the first preferred lang tag doesn't match"
);
await runLangTagsTest(
{
systemLocales: ["it"],
appLocales: ["it", "en"],
webLanguages: ["it", "en"],
page: TRANSLATIONS_TESTER_ES,
},
{
docLangTag: "es",
userLangTag: "en",
isDocLangTagSupported: true,
}
);
});
add_task(async function test_lang_tags_with_non_supported_doc_language() {
info("Test using a pivot language when the doc language isn't supported");
await runLangTagsTest(
{
systemLocales: ["fr"],
appLocales: ["fr", "en"],
webLanguages: ["fr", "en"],
page: TRANSLATIONS_TESTER_ES,
languagePairs: [
{ fromLang: PIVOT_LANGUAGE, toLang: "fr" },
{ fromLang: "fr", toLang: PIVOT_LANGUAGE },
// No Spanish support.
],
},
{
docLangTag: "es",
userLangTag: "fr",
isDocLangTagSupported: false,
}
);
});
......@@ -275,6 +275,15 @@ async function reorderingTranslator(message) {
return [translatedDoc.body.innerHTML];
}
/**
* @returns {import("../../actors/TranslationsParent.sys.mjs").TranslationsParent}
*/
function getTranslationsParent() {
return gBrowser.selectedBrowser.browsingContext.currentWindowGlobal.getActor(
"Translations"
);
}
/**
* This is for tests that don't need a browser page to run.
*/
......@@ -306,14 +315,8 @@ async function setupActorTest({
true // waitForLoad
);
/** @type {import("../../actors/TranslationsParent.sys.mjs").TranslationsParent} */
const actor =
gBrowser.selectedBrowser.browsingContext.currentWindowGlobal.getActor(
"Translations"
);
return {
actor,
actor: getTranslationsParent(),
remoteClients,
cleanup() {
BrowserTestUtils.removeTab(tab);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment