Bug 1832281 [wpt PR 39923] - Remove duplicate resolutions from the resolved image...
[gecko.git] / intl / l10n / test / test_localization_sync.js
blobbdd9f97bc401ea089d46bd1d80737bedd7833962
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();
9   const fs = [
10     { path: "/localization/de/browser/menu.ftl", source: `
11 key-value1 = [de] Value2
12 ` },
13     { path: "/localization/en-US/browser/menu.ftl", source: `
14 key-value1 = [en] Value2
15 key-value2 = [en] Value3
16 key-attr =
17     .label = [en] Label 3
18 ` },
19   ];
21   const source = L10nFileSource.createMock("test", "app", ["de", "en-US"], "/localization/{locale}", fs);
22   l10nReg.registerSources([source]);
24   const l10n = new Localization([
25     "/browser/menu.ftl",
26   ], true, l10nReg, ["de", "en-US"]);
29   {
30     let values = l10n.formatValuesSync([
31       {id: "key-value1"},
32       {id: "key-value2"},
33       {id: "key-missing"},
34       {id: "key-attr"}
35     ]);
37     strictEqual(values[0], "[de] Value2");
38     strictEqual(values[1], "[en] Value3");
39     strictEqual(values[2], null);
40     strictEqual(values[3], null);
41   }
43   {
44     let values = l10n.formatValuesSync([
45       "key-value1",
46       "key-value2",
47       "key-missing",
48       "key-attr"
49     ]);
51     strictEqual(values[0], "[de] Value2");
52     strictEqual(values[1], "[en] Value3");
53     strictEqual(values[2], null);
54     strictEqual(values[3], null);
55   }
57   {
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);
62   }
64   {
65     let messages = l10n.formatMessagesSync([
66       {id: "key-value1"},
67       {id: "key-missing"},
68       {id: "key-value2"},
69       {id: "key-attr"},
70     ]);
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);
76   }
77 });
79 add_task(function test_builtins() {
80   const known_platforms = {
81     "linux": "linux",
82     "win": "windows",
83     "macosx": "macos",
84     "android": "android",
85   };
87   const fs = [
88     { path: "/localization/en-US/test.ftl", source: `
89 key = { PLATFORM() ->
90         ${ Object.values(known_platforms).map(
91               name => `      [${ name }] ${ name.toUpperCase() } Value\n`).join("") }
92        *[other] OTHER Value
93     }` },
94   ];
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([
101     "/test.ftl",
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() {
111   const fs = [
112     { path: "/localization/en-US/browser/menu.ftl", source: "key1 = Value1" },
113     { path: "/localization/en-US/toolkit/menu.ftl", source: "key2 = Value2" },
114   ];
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.
172  */
173 add_task(function test_format_from_missing_required_resource() {
174   const l10nReg = new L10nRegistry();
176   const fs = [
177     { path: "/localization/de/browser/menu.ftl", source: `
178 key-value = [de] Value1
179 ` },
180     { path: "/localization/de/browser/missing-in-en-US.ftl", source: `
181 key-missing = [de] MissingValue
182 ` },
183     { path: "/localization/en-US/browser/menu.ftl", source: `
184 key-value = [en] Value1
185 ` },
186   ];
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([
194     "/browser/menu.ftl",
195     "/browser/missing-in-en-US.ftl",
196   ], true, l10nReg, ["en-US", "de"]);
198   {
199     let values = l10n.formatValuesSync([
200       {id: "key-value"},
201       {id: "key-missing"},
202     ]);
204     strictEqual(values[0], "[de] Value1");
205     strictEqual(values[1], "[de] MissingValue");
206   }
208   // returns correct contexts for [de, en-US]
210   l10n = new Localization([
211     "/browser/menu.ftl",
212     {path: "/browser/missing-in-en-US.ftl", optional: false},
213   ], true, l10nReg, ["de", "en-US"]);
215   {
216     let values = l10n.formatValuesSync([
217       {id: "key-value"},
218       {id: "key-missing"},
219     ]);
221     strictEqual(values[0], "[de] Value1");
222     strictEqual(values[1], "[de] MissingValue");
223   }
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.
230  */
231 add_task(function test_format_from_missing_optional_resource() {
232   const l10nReg = new L10nRegistry();
234   const fs = [
235     { path: "/localization/de/browser/menu.ftl", source: `
236 key-value = [de] Value1
237 ` },
238     { path: "/localization/de/browser/missing-in-en-US.ftl", source: `
239 key-missing = [de] MissingValue
240 ` },
241     { path: "/localization/en-US/browser/menu.ftl", source: `
242 key-value = [en] Value1
243 ` },
244   ];
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"]);
256   {
257     let values = l10n.formatValuesSync([
258       {id: "key-value"},
259       {id: "key-missing"},
260     ]);
262     strictEqual(values[0], "[en] Value1");
263     strictEqual(values[1], "[de] MissingValue");
264   }
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"]);
273   {
274     let values = l10n.formatValuesSync([
275       {id: "key-value"},
276       {id: "key-missing"},
277     ]);
279     strictEqual(values[0], "[de] Value1");
280     strictEqual(values[1], "[de] MissingValue");
281   }