/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ const originalValues = { requested: Services.locale.requestedLocales, }; const l10nReg = new L10nRegistry(); function getMockRegistry() { const mockSource = L10nFileSource.createMock("test", "app", ["en-US"], "/localization/{locale}/", [ { path: "/localization/en-US/mock.ftl", source: ` key = This is a single message .tooltip = This is a tooltip .accesskey = f ` } ]); let registry = new L10nRegistry(); registry.registerSources([mockSource]); return registry; } function getAttributeByName(attributes, name) { return attributes.find(attr => attr.name === name); } /** * This test verifies that as we switch between * different pseudo strategies, the Localization object * follows and formats using the given strategy. * * We test values and attributes and make sure that * a single-character attributes, commonly used for access keys * don't get transformed. */ add_task(async function test_pseudo_works() { Services.prefs.setStringPref("intl.l10n.pseudo", ""); let mockRegistry = getMockRegistry(); const l10n = new Localization([ "mock.ftl", ], false, mockRegistry); { // 1. Start with no pseudo let message = (await l10n.formatMessages([{id: "key"}]))[0]; ok(message.value.includes("This is a single message")); let attr0 = getAttributeByName(message.attributes, "tooltip"); ok(attr0.value.includes("This is a tooltip")); let attr1 = getAttributeByName(message.attributes, "accesskey"); equal(attr1.value, "f"); } { // 2. Set Accented Pseudo Services.prefs.setStringPref("intl.l10n.pseudo", "accented"); let message = (await l10n.formatMessages([{id: "key"}]))[0]; ok(message.value.includes("[Ŧħiş iş aa şiƞɠŀee ḿeeşşaaɠee]")); let attr0 = getAttributeByName(message.attributes, "tooltip"); ok(attr0.value.includes("[Ŧħiş iş aa ŧooooŀŧiƥ]")); let attr1 = getAttributeByName(message.attributes, "accesskey"); equal(attr1.value, "f"); } { // 3. Set Bidi Pseudo Services.prefs.setStringPref("intl.l10n.pseudo", "bidi"); let message = (await l10n.formatMessages([{id: "key"}]))[0]; ok(message.value.includes("iş a şiƞɠŀe ḿeşşaɠe")); let attr0 = getAttributeByName(message.attributes, "tooltip"); ok(attr0.value.includes("Ŧħiş iş a ŧooŀŧiƥ")); let attr1 = getAttributeByName(message.attributes, "accesskey"); equal(attr1.value, "f"); } { // 4. Remove pseudo Services.prefs.setStringPref("intl.l10n.pseudo", ""); let message = (await l10n.formatMessages([{id: "key"}]))[0]; ok(message.value.includes("This is a single message")); let attr0 = getAttributeByName(message.attributes, "tooltip"); ok(attr0.value.includes("This is a tooltip")); let attr1 = getAttributeByName(message.attributes, "accesskey"); equal(attr1.value, "f"); } Services.locale.requestedLocales = originalValues.requested; }); /** * This test verifies that setting a bogus pseudo locale * strategy doesn't break anything. */ add_task(async function test_unavailable_strategy_works() { Services.prefs.setStringPref("intl.l10n.pseudo", ""); let mockRegistry = getMockRegistry(); const l10n = new Localization([ "mock.ftl", ], false, mockRegistry); { // 1. Set unavailable pseudo strategy Services.prefs.setStringPref("intl.l10n.pseudo", "unknown-strategy"); let message = (await l10n.formatMessages([{id: "key"}]))[0]; ok(message.value.includes("This is a single message")); let attr0 = getAttributeByName(message.attributes, "tooltip"); ok(attr0.value.includes("This is a tooltip")); let attr1 = getAttributeByName(message.attributes, "accesskey"); equal(attr1.value, "f"); } Services.prefs.setStringPref("intl.l10n.pseudo", ""); Services.locale.requestedLocales = originalValues.requested; });