1 /* Any copyright is dedicated to the Public Domain.
2 http://creativecommons.org/publicdomain/zero/1.0/ */
4 const { AppConstants } = ChromeUtils.importESModule("resource://gre/modules/AppConstants.sys.mjs");
6 add_task(function test_methods_calling() {
7 const l10nReg = new L10nRegistry();
10 { path: "/localization/de/browser/menu.ftl", source: `
11 key-value1 = [de] Value2
13 { path: "/localization/en-US/browser/menu.ftl", source: `
14 key-value1 = [en] Value2
15 key-value2 = [en] Value3
21 const source = L10nFileSource.createMock("test", "app", ["de", "en-US"], "/localization/{locale}", fs);
22 l10nReg.registerSources([source]);
24 const l10n = new Localization([
26 ], true, l10nReg, ["de", "en-US"]);
30 let values = l10n.formatValuesSync([
37 strictEqual(values[0], "[de] Value2");
38 strictEqual(values[1], "[en] Value3");
39 strictEqual(values[2], null);
40 strictEqual(values[3], null);
44 let values = l10n.formatValuesSync([
51 strictEqual(values[0], "[de] Value2");
52 strictEqual(values[1], "[en] Value3");
53 strictEqual(values[2], null);
54 strictEqual(values[3], null);
58 strictEqual(l10n.formatValueSync("key-missing"), null);
59 strictEqual(l10n.formatValueSync("key-value1"), "[de] Value2");
60 strictEqual(l10n.formatValueSync("key-value2"), "[en] Value3");
61 strictEqual(l10n.formatValueSync("key-attr"), null);
65 let messages = l10n.formatMessagesSync([
72 strictEqual(messages[0].value, "[de] Value2");
73 strictEqual(messages[1], null);
74 strictEqual(messages[2].value, "[en] Value3");
75 strictEqual(messages[3].value, null);
79 add_task(function test_builtins() {
80 const known_platforms = {
88 { path: "/localization/en-US/test.ftl", source: `
90 ${ Object.values(known_platforms).map(
91 name => ` [${ name }] ${ name.toUpperCase() } Value\n`).join("") }
96 const source = L10nFileSource.createMock("test", "app", ["en-US"], "/localization/{locale}", fs);
97 const l10nReg = new L10nRegistry();
98 l10nReg.registerSources([source]);
100 const l10n = new Localization([
102 ], true, l10nReg, ["en-US"]);
104 let values = l10n.formatValuesSync([{id: "key"}]);
106 ok(values[0].includes(
107 `${ known_platforms[AppConstants.platform].toUpperCase() } Value`));
110 add_task(function test_add_remove_resourceIds() {
112 { path: "/localization/en-US/browser/menu.ftl", source: "key1 = Value1" },
113 { path: "/localization/en-US/toolkit/menu.ftl", source: "key2 = Value2" },
115 const originalRequested = Services.locale.requestedLocales;
117 const source = L10nFileSource.createMock("test", "app", ["en-US"], "/localization/{locale}", fs);
118 const l10nReg = new L10nRegistry();
119 l10nReg.registerSources([source]);
121 const l10n = new Localization(["/browser/menu.ftl"], true, l10nReg, ["en-US"]);
123 let values = l10n.formatValuesSync([{id: "key1"}, {id: "key2"}]);
125 strictEqual(values[0], "Value1");
126 strictEqual(values[1], null);
128 l10n.addResourceIds(["/toolkit/menu.ftl"]);
130 values = l10n.formatValuesSync([{id: "key1"}, {id: "key2"}]);
132 strictEqual(values[0], "Value1");
133 strictEqual(values[1], "Value2");
135 values = l10n.formatValuesSync(["key1", {id: "key2"}]);
137 strictEqual(values[0], "Value1");
138 strictEqual(values[1], "Value2");
140 values = l10n.formatValuesSync([{id: "key1"}, "key2"]);
142 strictEqual(values[0], "Value1");
143 strictEqual(values[1], "Value2");
145 l10n.removeResourceIds(["/browser/menu.ftl"]);
147 values = l10n.formatValuesSync([{id: "key1"}, {id: "key2"}]);
149 strictEqual(values[0], null);
150 strictEqual(values[1], "Value2");
153 add_task(function test_calling_sync_methods_in_async_mode_fails() {
154 const l10n = new Localization(["/browser/menu.ftl"], false);
156 Assert.throws(() => {
157 l10n.formatValuesSync([{ id: "key1" }, { id: "key2" }]);
158 }, /Can't use formatValuesSync when state is async./);
160 Assert.throws(() => {
161 l10n.formatValueSync("key1");
162 }, /Can't use formatValueSync when state is async./);
164 Assert.throws(() => {
165 l10n.formatMessagesSync([{ id: "key1"}]);
166 }, /Can't use formatMessagesSync when state is async./);
170 * This test verifies that when a required resource is missing,
171 * we fallback entirely to the next locale for all entries.
173 add_task(function test_format_from_missing_required_resource() {
174 const l10nReg = new L10nRegistry();
177 { path: "/localization/de/browser/menu.ftl", source: `
178 key-value = [de] Value1
180 { path: "/localization/de/browser/missing-in-en-US.ftl", source: `
181 key-missing = [de] MissingValue
183 { path: "/localization/en-US/browser/menu.ftl", source: `
184 key-value = [en] Value1
188 const source = L10nFileSource.createMock("test", "app", ["de", "en-US"], "/localization/{locale}", fs);
189 l10nReg.registerSources([source]);
191 // returns correct contexts for [en-US, de]
193 let l10n = new Localization([
195 "/browser/missing-in-en-US.ftl",
196 ], true, l10nReg, ["en-US", "de"]);
199 let values = l10n.formatValuesSync([
204 strictEqual(values[0], "[de] Value1");
205 strictEqual(values[1], "[de] MissingValue");
208 // returns correct contexts for [de, en-US]
210 l10n = new Localization([
212 {path: "/browser/missing-in-en-US.ftl", optional: false},
213 ], true, l10nReg, ["de", "en-US"]);
216 let values = l10n.formatValuesSync([
221 strictEqual(values[0], "[de] Value1");
222 strictEqual(values[1], "[de] MissingValue");
227 * This test verifies that when an optional resource is missing
228 * we continue to populate entires from other resources in the same locale
229 * and only fallback entries from the optional resource to the next locale.
231 add_task(function test_format_from_missing_optional_resource() {
232 const l10nReg = new L10nRegistry();
235 { path: "/localization/de/browser/menu.ftl", source: `
236 key-value = [de] Value1
238 { path: "/localization/de/browser/missing-in-en-US.ftl", source: `
239 key-missing = [de] MissingValue
241 { path: "/localization/en-US/browser/menu.ftl", source: `
242 key-value = [en] Value1
246 const source = L10nFileSource.createMock("test", "app", ["de", "en-US"], "/localization/{locale}", fs);
247 l10nReg.registerSources([source]);
249 // returns correct contexts for [en-US, de]
251 let l10n = new Localization([
252 {path: "/browser/menu.ftl", optional: false},
253 {path: "/browser/missing-in-en-US.ftl", optional: true},
254 ], true, l10nReg, ["en-US", "de"]);
257 let values = l10n.formatValuesSync([
262 strictEqual(values[0], "[en] Value1");
263 strictEqual(values[1], "[de] MissingValue");
266 // returns correct contexts for [de, en-US]
268 l10n = new Localization([
269 {path: "/browser/menu.ftl", optional: false},
270 {path: "/browser/missing-in-en-US.ftl", optional: true},
271 ], true, l10nReg, ["de", "en-US"]);
274 let values = l10n.formatValuesSync([
279 strictEqual(values[0], "[de] Value1");
280 strictEqual(values[1], "[de] MissingValue");