@itwin/core-i18n 3.5.0-dev.8 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,9 +8,80 @@ const chai_1 = require("chai");
8
8
  const ITwinLocalization_1 = require("../ITwinLocalization");
9
9
  describe("ITwinLocalization", () => {
10
10
  let localization;
11
+ let germanLocalization;
12
+ describe("#constructor", () => {
13
+ let itwinLocalization;
14
+ it("set default namespace", async () => {
15
+ itwinLocalization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { defaultNS: "Default" } });
16
+ await itwinLocalization.initialize([]);
17
+ chai_1.assert.equal(itwinLocalization.i18next.options.defaultNS, "Default");
18
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("FirstTrivial"), "First level string (default)");
19
+ });
20
+ it("set default language as english", async () => {
21
+ itwinLocalization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { defaultNS: "Default", lng: "en" } });
22
+ await itwinLocalization.initialize([]);
23
+ chai_1.assert.equal(itwinLocalization.i18next.options.lng, "en");
24
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("FirstTrivial"), "First level string (default)");
25
+ });
26
+ it("set default language as NOT english", async () => {
27
+ itwinLocalization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { defaultNS: "Default", lng: "de" } });
28
+ await itwinLocalization.initialize([]);
29
+ chai_1.assert.equal(itwinLocalization.i18next.options.lng, "de");
30
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("FirstTrivial"), "First level string (default german)");
31
+ });
32
+ it("set fallback language as NOT english", async () => {
33
+ itwinLocalization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { defaultNS: "Default", fallbackLng: "de" } });
34
+ await itwinLocalization.initialize([]);
35
+ chai_1.assert.equal(itwinLocalization.i18next.options.fallbackLng, "de");
36
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("OnlyGerman"), "Hallo");
37
+ });
38
+ });
11
39
  describe("#initialize", () => {
12
- describe("with default namespace provided in constructor", () => {
13
- let itwinLocalization;
40
+ let itwinLocalization;
41
+ it("cannot fetch from unregistered namespaces", async () => {
42
+ localization = new ITwinLocalization_1.ITwinLocalization();
43
+ await localization.initialize([]);
44
+ chai_1.assert.equal(localization.getEnglishString("Default", "FirstTrivial"), "FirstTrivial");
45
+ chai_1.assert.equal(localization.getLocalizedString("Test:FirstTrivial"), "FirstTrivial");
46
+ });
47
+ describe("with no default namespace predefined", () => {
48
+ before(() => {
49
+ itwinLocalization = new ITwinLocalization_1.ITwinLocalization();
50
+ });
51
+ it("no default namespace set when initialized with empty array", async () => {
52
+ await itwinLocalization.initialize([]);
53
+ chai_1.assert.equal(itwinLocalization.i18next.options.defaultNS, undefined);
54
+ });
55
+ it("initialize with single namespace", async () => {
56
+ var _a;
57
+ await itwinLocalization.initialize(["Test"]);
58
+ chai_1.assert.equal(itwinLocalization.i18next.options.defaultNS, "Test");
59
+ chai_1.assert.isTrue((_a = itwinLocalization.i18next.options.ns) === null || _a === void 0 ? void 0 : _a.includes("Test"));
60
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("Test:FirstTrivial"), "First level string (test)");
61
+ });
62
+ it("initialize with two namespaces recognizes both namespaces", async () => {
63
+ var _a, _b;
64
+ await itwinLocalization.initialize(["Default", "Test"]);
65
+ chai_1.assert.isTrue((_a = itwinLocalization.i18next.options.ns) === null || _a === void 0 ? void 0 : _a.includes("Default"));
66
+ chai_1.assert.isTrue((_b = itwinLocalization.i18next.options.ns) === null || _b === void 0 ? void 0 : _b.includes("Test"));
67
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("Default:FirstTrivial"), "First level string (default)");
68
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("Test:FirstTrivial"), "First level string (test)");
69
+ });
70
+ it("initialize with two namespaces sets first as default", async () => {
71
+ await itwinLocalization.initialize(["Default", "Test"]);
72
+ chai_1.assert.equal(itwinLocalization.i18next.options.defaultNS, "Default");
73
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("FirstTrivial"), "First level string (default)");
74
+ });
75
+ it("initialize with duplicate namespace values does not break anything", async () => {
76
+ var _a;
77
+ await itwinLocalization.initialize(["Default", "Default"]);
78
+ chai_1.assert.equal(itwinLocalization.i18next.options.defaultNS, "Default");
79
+ chai_1.assert.isTrue((_a = itwinLocalization.i18next.options.ns) === null || _a === void 0 ? void 0 : _a.includes("Default"));
80
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("FirstTrivial"), "First level string (default)");
81
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("Default:FirstTrivial"), "First level string (default)");
82
+ });
83
+ });
84
+ describe("with default namespace", () => {
14
85
  before(() => {
15
86
  itwinLocalization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { defaultNS: "Default" } });
16
87
  });
@@ -42,6 +113,93 @@ describe("ITwinLocalization", () => {
42
113
  });
43
114
  });
44
115
  });
116
+ describe("#getLocalizedKeys", () => {
117
+ before(async () => {
118
+ localization = new ITwinLocalization_1.ITwinLocalization();
119
+ await localization.initialize(["Default", "Test"]);
120
+ germanLocalization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { lng: "de" } });
121
+ await germanLocalization.initialize(["Default", "Test"]);
122
+ });
123
+ it("no substitution", () => {
124
+ chai_1.assert.equal(localization.getLocalizedKeys("MyString"), "MyString");
125
+ });
126
+ describe("Default Namespace", () => {
127
+ it("first level string", () => {
128
+ chai_1.assert.equal(localization.getLocalizedKeys("hi %{FirstTrivial}"), "hi First level string (default)");
129
+ chai_1.assert.equal(germanLocalization.getLocalizedKeys("hi %{FirstTrivial}"), "hi First level string (default german)");
130
+ });
131
+ it("second level string", () => {
132
+ chai_1.assert.equal(localization.getLocalizedKeys("%{SecondTrivial.Test1}"), "Second level string 1 (default)");
133
+ chai_1.assert.equal(localization.getLocalizedKeys("bye %{SecondTrivial.Test2}"), "bye Second level string 2 (default)");
134
+ chai_1.assert.equal(germanLocalization.getLocalizedKeys("%{SecondTrivial.Test1}"), "Second level string 1 (default german)");
135
+ chai_1.assert.equal(germanLocalization.getLocalizedKeys("bye %{SecondTrivial.Test2}"), "bye Second level string 2 (default german)");
136
+ });
137
+ it("first level string with keys", () => {
138
+ chai_1.assert.equal(localization.getLocalizedKeys("%{FirstSubstitution1}"), "First level {{str}} (default)");
139
+ chai_1.assert.equal(localization.getLocalizedKeys("bye %{FirstSubstitution2}"), "bye First level {{str1}} and {{str2}} (default)");
140
+ chai_1.assert.equal(germanLocalization.getLocalizedKeys("%{FirstSubstitution1}"), "First level {{str}} (default german)");
141
+ chai_1.assert.equal(germanLocalization.getLocalizedKeys("bye %{FirstSubstitution2}"), "bye First level {{str1}} and {{str2}} (default german)");
142
+ });
143
+ it("second level string with keys", () => {
144
+ chai_1.assert.equal(localization.getLocalizedKeys("%{SecondSubstitution.Test1}"), "Substitute {{varA}} and {{varB}} (default)");
145
+ chai_1.assert.equal(localization.getLocalizedKeys("hi %{SecondSubstitution.Test2}"), "hi Reverse substitute {{varB}} and {{varA}} (default)");
146
+ chai_1.assert.equal(germanLocalization.getLocalizedKeys("%{SecondSubstitution.Test1}"), "Substitute {{varA}} and {{varB}} (default german)");
147
+ chai_1.assert.equal(germanLocalization.getLocalizedKeys("hi %{SecondSubstitution.Test2}"), "hi Reverse substitute {{varB}} and {{varA}} (default german)");
148
+ });
149
+ it("first level missing key doesn't find a value", () => {
150
+ chai_1.assert.equal(localization.getLocalizedKeys("no %{MissingKeyString}"), "no MissingKeyString");
151
+ chai_1.assert.equal(localization.getLocalizedKeys("no %{MissingKeyString}"), "no MissingKeyString");
152
+ });
153
+ it("second level missing key doesn't find a value", () => {
154
+ chai_1.assert.equal(localization.getLocalizedKeys("hi %{SecondTrivial.MissingString}"), "hi SecondTrivial.MissingString");
155
+ chai_1.assert.equal(localization.getLocalizedKeys("%{MissingKeyObject.MissingString}"), "MissingKeyObject.MissingString");
156
+ });
157
+ });
158
+ describe("Given Namespace", () => {
159
+ it("first level string", () => {
160
+ chai_1.assert.equal(localization.getLocalizedKeys("hi %{Default:FirstTrivial}"), "hi First level string (default)");
161
+ chai_1.assert.equal(localization.getLocalizedKeys("hi %{Test:FirstTrivial}"), "hi First level string (test)");
162
+ });
163
+ it("second level string", () => {
164
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Default:SecondTrivial.Test1}"), "Second level string 1 (default)");
165
+ chai_1.assert.equal(localization.getLocalizedKeys("bye %{Default:SecondTrivial.Test2}"), "bye Second level string 2 (default)");
166
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Test:SecondTrivial.Test1}"), "Second level string 1 (test)");
167
+ chai_1.assert.equal(localization.getLocalizedKeys("bye %{Test:SecondTrivial.Test2}"), "bye Second level string 2 (test)");
168
+ });
169
+ it("first level string with keys", () => {
170
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Default:FirstSubstitution1}"), "First level {{str}} (default)");
171
+ chai_1.assert.equal(localization.getLocalizedKeys("bye %{Default:FirstSubstitution2}"), "bye First level {{str1}} and {{str2}} (default)");
172
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Test:FirstSubstitution1}"), "First level {{str}} (test)");
173
+ chai_1.assert.equal(localization.getLocalizedKeys("bye %{Test:FirstSubstitution2}"), "bye First level {{str1}} and {{str2}} (test)");
174
+ });
175
+ it("second level string with keys", () => {
176
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Default:SecondSubstitution.Test1}"), "Substitute {{varA}} and {{varB}} (default)");
177
+ chai_1.assert.equal(localization.getLocalizedKeys("hi %{Default:SecondSubstitution.Test2}"), "hi Reverse substitute {{varB}} and {{varA}} (default)");
178
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Test:SecondSubstitution.Test1}"), "Substitute {{varA}} and {{varB}} (test)");
179
+ chai_1.assert.equal(localization.getLocalizedKeys("hi %{Test:SecondSubstitution.Test2}"), "hi Reverse substitute {{varB}} and {{varA}} (test)");
180
+ });
181
+ it("first level missing key doesn't find a value", () => {
182
+ chai_1.assert.equal(localization.getLocalizedKeys("no %{Default:MissingKeyString}"), "no MissingKeyString");
183
+ chai_1.assert.equal(localization.getLocalizedKeys("no %{Test:MissingKeyString}"), "no MissingKeyString");
184
+ });
185
+ it("second level missing key doesn't find a value", () => {
186
+ chai_1.assert.equal(localization.getLocalizedKeys("hi %{Default:SecondTrivial.MissingString}"), "hi SecondTrivial.MissingString");
187
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Default:MissingKeyObject.MissingString}"), "MissingKeyObject.MissingString");
188
+ chai_1.assert.equal(localization.getLocalizedKeys("hi %{Test:SecondTrivial.MissingString}"), "hi SecondTrivial.MissingString");
189
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Test:MissingKeyObject.MissingString}"), "MissingKeyObject.MissingString");
190
+ });
191
+ });
192
+ describe("Nonexisting Namespace", () => {
193
+ it("first level fails", () => {
194
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Nonexisting:FirstTrivial}"), "FirstTrivial");
195
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Nonexisting:MissingKeyString}"), "MissingKeyString");
196
+ });
197
+ it("second level fails", () => {
198
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Nonexisting:SecondTrivial.Test1}"), "SecondTrivial.Test1");
199
+ chai_1.assert.equal(localization.getLocalizedKeys("%{Nonexisting:Missing.String}"), "Missing.String");
200
+ });
201
+ });
202
+ });
45
203
  // The goal is not to test i18next's interpolation,
46
204
  // but just to have some simple tests to make sure the
47
205
  // basics work through the ITwinLocalization class.
@@ -50,30 +208,106 @@ describe("ITwinLocalization", () => {
50
208
  before(async () => {
51
209
  localization = new ITwinLocalization_1.ITwinLocalization();
52
210
  await localization.initialize(["Default", "Test"]);
211
+ germanLocalization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { lng: "de" } });
212
+ await germanLocalization.initialize(["Default", "Test"]);
53
213
  });
54
214
  describe("Default Namespace", () => {
55
215
  it("first level with no substitution", () => {
56
216
  chai_1.assert.equal(localization.getLocalizedString("FirstTrivial"), "First level string (default)");
57
217
  });
218
+ it("first level with no substitution with fallback keys", () => {
219
+ chai_1.assert.equal(localization.getLocalizedString(["FirstTrivial", "NotExist"]), "First level string (default)");
220
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "FirstTrivial"]), "First level string (default)");
221
+ });
222
+ it("more than two fallback keys succeeds", () => {
223
+ chai_1.assert.equal(localization.getLocalizedString(["FirstTrivial", "NotExist1", "NotExist2"]), "First level string (default)");
224
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist1", "FirstTrivial", "NotExist2"]), "First level string (default)");
225
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist1", "NotExist2", "FirstTrivial"]), "First level string (default)");
226
+ chai_1.assert.equal(localization.getLocalizedString(["1", "2", "3", "4", "5", "FirstTrivial"]), "First level string (default)");
227
+ });
58
228
  it("second level with no substitution", () => {
59
229
  chai_1.assert.equal(localization.getLocalizedString("SecondTrivial.Test1"), "Second level string 1 (default)");
60
230
  chai_1.assert.equal(localization.getLocalizedString("SecondTrivial.Test2"), "Second level string 2 (default)");
61
231
  });
232
+ it("second level with no substitution with fallback keys", () => {
233
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "SecondTrivial.Test1"]), "Second level string 1 (default)");
234
+ chai_1.assert.equal(localization.getLocalizedString(["SecondTrivial.Test2", "NotExist"]), "Second level string 2 (default)");
235
+ });
62
236
  it("first level with substitution", () => {
63
237
  chai_1.assert.equal(localization.getLocalizedString("FirstSubstitution1", { str: "CUSTOM1" }), "First level CUSTOM1 (default)");
64
238
  chai_1.assert.equal(localization.getLocalizedString("FirstSubstitution1", { str: "CUSTOM2" }), "First level CUSTOM2 (default)");
65
239
  chai_1.assert.equal(localization.getLocalizedString("FirstSubstitution2", { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (default)");
66
240
  });
241
+ it("first level with substitution with fallback keys", () => {
242
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "FirstSubstitution1"], { str: "CUSTOM1" }), "First level CUSTOM1 (default)");
243
+ chai_1.assert.equal(localization.getLocalizedString(["FirstSubstitution1", "NotExist"], { str: "CUSTOM2" }), "First level CUSTOM2 (default)");
244
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "FirstSubstitution2"], { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (default)");
245
+ });
67
246
  it("second level with substitution", () => {
68
247
  chai_1.assert.equal(localization.getLocalizedString("SecondSubstitution.Test1", { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default)");
69
248
  chai_1.assert.equal(localization.getLocalizedString("SecondSubstitution.Test2", { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (default)");
70
249
  });
250
+ it("second level with substitution with fallback keys", () => {
251
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "SecondSubstitution.Test1"], { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default)");
252
+ chai_1.assert.equal(localization.getLocalizedString(["SecondSubstitution.Test2", "NotExist"], { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (default)");
253
+ });
71
254
  it("first level missing key doesn't find a value", () => {
72
255
  chai_1.assert.equal(localization.getLocalizedString("MissingKeyString"), "MissingKeyString");
73
256
  });
257
+ it("first level missing all keys doesn't find a value", () => {
258
+ chai_1.assert.equal(localization.getLocalizedString(["MissingKeyString", "MissingString2"]), "MissingString2");
259
+ });
74
260
  it("second level missing key doesn't find a value", () => {
75
261
  chai_1.assert.equal(localization.getLocalizedString("SecondTrivial.MissingString"), "SecondTrivial.MissingString");
76
- chai_1.assert.equal(localization.getLocalizedString("MissingKeyObject.MissingString"), "MissingKeyObject.MissingString");
262
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "MissingKeyObject.MissingString"]), "MissingKeyObject.MissingString");
263
+ });
264
+ it("read from en-US fallback", () => {
265
+ chai_1.assert.equal(localization.getLocalizedString("OnlyEnglishUS"), "HelloUS");
266
+ });
267
+ });
268
+ describe("Default Namespace (German)", () => {
269
+ it("first level with no substitution", () => {
270
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstTrivial"), "First level string (default german)");
271
+ });
272
+ it("first level with no substitution with fallback keys", () => {
273
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["FirstTrivial", "NotExist"]), "First level string (default german)");
274
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["NotExist", "FirstTrivial"]), "First level string (default german)");
275
+ });
276
+ it("second level with no substitution", () => {
277
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondTrivial.Test1"), "Second level string 1 (default german)");
278
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondTrivial.Test2"), "Second level string 2 (default german)");
279
+ });
280
+ it("second level with no substitution with fallback keys", () => {
281
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["NotExist", "SecondTrivial.Test1"]), "Second level string 1 (default german)");
282
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["SecondTrivial.Test2", "NotExist"]), "Second level string 2 (default german)");
283
+ });
284
+ it("first level with substitution", () => {
285
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstSubstitution1", { str: "CUSTOM1" }), "First level CUSTOM1 (default german)");
286
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstSubstitution1", { str: "CUSTOM2" }), "First level CUSTOM2 (default german)");
287
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstSubstitution2", { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (default german)");
288
+ });
289
+ it("first level with substitution with fallback keys", () => {
290
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["NotExist", "FirstSubstitution1"], { str: "CUSTOM1" }), "First level CUSTOM1 (default german)");
291
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["FirstSubstitution1", "NotExist"], { str: "CUSTOM2" }), "First level CUSTOM2 (default german)");
292
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["NotExist", "FirstSubstitution2"], { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (default german)");
293
+ });
294
+ it("second level with substitution", () => {
295
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondSubstitution.Test1", { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default german)");
296
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondSubstitution.Test2", { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (default german)");
297
+ });
298
+ it("second level with substitution with fallback keys", () => {
299
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["NotExist", "SecondSubstitution.Test1"], { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default german)");
300
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["SecondSubstitution.Test2", "NotExist"], { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (default german)");
301
+ });
302
+ it("first level missing key doesn't find a value", () => {
303
+ chai_1.assert.equal(germanLocalization.getLocalizedString("MissingKeyString"), "MissingKeyString");
304
+ });
305
+ it("first level missing all keys doesn't find a value", () => {
306
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["MissingKeyString", "MissingString2"]), "MissingString2");
307
+ });
308
+ it("second level missing key doesn't find a value", () => {
309
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondTrivial.MissingString"), "SecondTrivial.MissingString");
310
+ chai_1.assert.equal(germanLocalization.getLocalizedString("MissingKeyObject.MissingString"), "MissingKeyObject.MissingString");
77
311
  });
78
312
  });
79
313
  describe("Given Namespace", () => {
@@ -81,12 +315,20 @@ describe("ITwinLocalization", () => {
81
315
  chai_1.assert.equal(localization.getLocalizedString("Default:FirstTrivial"), "First level string (default)");
82
316
  chai_1.assert.equal(localization.getLocalizedString("Test:FirstTrivial"), "First level string (test)");
83
317
  });
318
+ it("first level with no substitution with fallback keys", () => {
319
+ chai_1.assert.equal(localization.getLocalizedString(["Default:FirstTrivial", "Not:NotExist"]), "First level string (default)");
320
+ chai_1.assert.equal(localization.getLocalizedString(["Default:NotExist", "Test:FirstTrivial"]), "First level string (test)");
321
+ });
84
322
  it("second level with no substitution", () => {
85
323
  chai_1.assert.equal(localization.getLocalizedString("Default:SecondTrivial.Test1"), "Second level string 1 (default)");
86
324
  chai_1.assert.equal(localization.getLocalizedString("Default:SecondTrivial.Test2"), "Second level string 2 (default)");
87
325
  chai_1.assert.equal(localization.getLocalizedString("Test:SecondTrivial.Test1"), "Second level string 1 (test)");
88
326
  chai_1.assert.equal(localization.getLocalizedString("Test:SecondTrivial.Test2"), "Second level string 2 (test)");
89
327
  });
328
+ it("second level with no substitution with fallback keys", () => {
329
+ chai_1.assert.equal(localization.getLocalizedString(["Test:NotExist", "Default:SecondTrivial.Test1"]), "Second level string 1 (default)");
330
+ chai_1.assert.equal(localization.getLocalizedString(["Test:SecondTrivial.Test2", "NotExist"]), "Second level string 2 (test)");
331
+ });
90
332
  it("first level with substitution", () => {
91
333
  chai_1.assert.equal(localization.getLocalizedString("Default:FirstSubstitution1", { str: "CUSTOM1" }), "First level CUSTOM1 (default)");
92
334
  chai_1.assert.equal(localization.getLocalizedString("Default:FirstSubstitution1", { str: "CUSTOM2" }), "First level CUSTOM2 (default)");
@@ -95,12 +337,21 @@ describe("ITwinLocalization", () => {
95
337
  chai_1.assert.equal(localization.getLocalizedString("Test:FirstSubstitution1", { str: "CUSTOM2" }), "First level CUSTOM2 (test)");
96
338
  chai_1.assert.equal(localization.getLocalizedString("Test:FirstSubstitution2", { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (test)");
97
339
  });
340
+ it("first level with substitution with fallback keys", () => {
341
+ chai_1.assert.equal(localization.getLocalizedString(["Test:NotExist", "Default:FirstSubstitution1"], { str: "CUSTOM1" }), "First level CUSTOM1 (default)");
342
+ chai_1.assert.equal(localization.getLocalizedString(["Test:FirstSubstitution1", "Default:NotExist"], { str: "CUSTOM2" }), "First level CUSTOM2 (test)");
343
+ chai_1.assert.equal(localization.getLocalizedString(["Test:NotExist", "Default:FirstSubstitution2"], { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (default)");
344
+ });
98
345
  it("second level with substitution", () => {
99
346
  chai_1.assert.equal(localization.getLocalizedString("Default:SecondSubstitution.Test1", { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default)");
100
347
  chai_1.assert.equal(localization.getLocalizedString("Default:SecondSubstitution.Test2", { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (default)");
101
348
  chai_1.assert.equal(localization.getLocalizedString("Test:SecondSubstitution.Test1", { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (test)");
102
349
  chai_1.assert.equal(localization.getLocalizedString("Test:SecondSubstitution.Test2", { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (test)");
103
350
  });
351
+ it("second level with substitution with fallback keys", () => {
352
+ chai_1.assert.equal(localization.getLocalizedString(["Test:NotExist", "Default:SecondSubstitution.Test1"], { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default)");
353
+ chai_1.assert.equal(localization.getLocalizedString(["Test:SecondSubstitution.Test2", "Default:NotExist"], { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (test)");
354
+ });
104
355
  it("first level missing key doesn't find a value", () => {
105
356
  chai_1.assert.equal(localization.getLocalizedString("Default:MissingKeyString"), "MissingKeyString");
106
357
  chai_1.assert.equal(localization.getLocalizedString("Test:MissingKeyString"), "MissingKeyString");
@@ -109,6 +360,43 @@ describe("ITwinLocalization", () => {
109
360
  chai_1.assert.equal(localization.getLocalizedString("Test:SecondTrivial.MissingString"), "SecondTrivial.MissingString");
110
361
  chai_1.assert.equal(localization.getLocalizedString("Test:MissingKeyObject.MissingString"), "MissingKeyObject.MissingString");
111
362
  });
363
+ it("read from en-US fallback", () => {
364
+ chai_1.assert.equal(localization.getLocalizedString("Default:OnlyEnglishUS"), "HelloUS");
365
+ });
366
+ });
367
+ describe("Given Namespace (German)", () => {
368
+ it("first level with no substitution", () => {
369
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Default:FirstTrivial"), "First level string (default german)");
370
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:FirstTrivial"), "First level string (german)");
371
+ });
372
+ it("second level with no substitution", () => {
373
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Default:SecondTrivial.Test1"), "Second level string 1 (default german)");
374
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Default:SecondTrivial.Test2"), "Second level string 2 (default german)");
375
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:SecondTrivial.Test1"), "Second level string 1 (german)");
376
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:SecondTrivial.Test2"), "Second level string 2 (german)");
377
+ });
378
+ it("first level with substitution", () => {
379
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Default:FirstSubstitution1", { str: "CUSTOM1" }), "First level CUSTOM1 (default german)");
380
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Default:FirstSubstitution1", { str: "CUSTOM2" }), "First level CUSTOM2 (default german)");
381
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Default:FirstSubstitution2", { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (default german)");
382
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:FirstSubstitution1", { str: "CUSTOM1" }), "First level CUSTOM1 (german)");
383
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:FirstSubstitution1", { str: "CUSTOM2" }), "First level CUSTOM2 (german)");
384
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:FirstSubstitution2", { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (german)");
385
+ });
386
+ it("second level with substitution", () => {
387
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Default:SecondSubstitution.Test1", { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default german)");
388
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Default:SecondSubstitution.Test2", { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (default german)");
389
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:SecondSubstitution.Test1", { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (german)");
390
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:SecondSubstitution.Test2", { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (german)");
391
+ });
392
+ it("first level missing key doesn't find a value", () => {
393
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Default:MissingKeyString"), "MissingKeyString");
394
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:MissingKeyString"), "MissingKeyString");
395
+ });
396
+ it("second level missing key doesn't find a value", () => {
397
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:SecondTrivial.MissingString"), "SecondTrivial.MissingString");
398
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Test:MissingKeyObject.MissingString"), "MissingKeyObject.MissingString");
399
+ });
112
400
  });
113
401
  describe("Nonexisting Namespace", () => {
114
402
  it("first level fails", () => {
@@ -119,7 +407,463 @@ describe("ITwinLocalization", () => {
119
407
  chai_1.assert.equal(localization.getLocalizedString("Nonexisting:SecondTrivial.Test1"), "SecondTrivial.Test1");
120
408
  chai_1.assert.equal(localization.getLocalizedString("Nonexisting:Missing.String"), "Missing.String");
121
409
  });
410
+ it("fallback key fails", () => {
411
+ chai_1.assert.equal(localization.getLocalizedString(["Nonexisting:FirstTrivial", "NotExist"]), "NotExist");
412
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "Nonexisting:Missing.String"]), "Missing.String");
413
+ });
414
+ });
415
+ // Test a few options to make sure they get passed through correctly
416
+ describe("With Options", () => {
417
+ it("returnDetails throws error", () => {
418
+ chai_1.assert.throws(() => {
419
+ localization.getLocalizedString("X", { returnDetails: true });
420
+ }, "Translation key must map to a string, but the given options will result in an object");
421
+ });
422
+ it("returnObjects throws error", () => {
423
+ chai_1.assert.throws(() => {
424
+ localization.getLocalizedString("X", { returnObjects: true });
425
+ }, "Translation key must map to a string, but the given options will result in an object");
426
+ });
427
+ it("returnDetails and returnObjects throws error", () => {
428
+ chai_1.assert.throws(() => {
429
+ localization.getLocalizedString("X", { returnDetails: true, returnObjects: true });
430
+ }, "Translation key must map to a string, but the given options will result in an object");
431
+ });
432
+ it("default value", () => {
433
+ chai_1.assert.equal(localization.getLocalizedString("Missing", { defaultValue: "default" }), "default");
434
+ });
435
+ it("override fallback language", () => {
436
+ // Doesn't fallback to English
437
+ chai_1.assert.equal(germanLocalization.getLocalizedString("OnlyEnglish", { fallbackLng: "de" }), "OnlyEnglish");
438
+ });
439
+ it("set namespace", () => {
440
+ chai_1.assert.equal(localization.getLocalizedString("FirstTrivial", { ns: "Test" }), "First level string (test)");
441
+ chai_1.assert.equal(localization.getLocalizedString("FirstSubstitution1", { str: "CUSTOM1", ns: "Test" }), "First level CUSTOM1 (test)");
442
+ });
443
+ });
444
+ });
445
+ describe("#getLocalizedString with namespace passed in as an option", () => {
446
+ before(async () => {
447
+ localization = new ITwinLocalization_1.ITwinLocalization();
448
+ await localization.initialize(["Default", "Test"]);
449
+ germanLocalization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { lng: "de" } });
450
+ await germanLocalization.initialize(["Default", "Test"]);
451
+ });
452
+ describe("Keys Without Namespaces", () => {
453
+ it("first level with no substitution", () => {
454
+ chai_1.assert.equal(localization.getLocalizedString("FirstTrivial", { ns: "Default" }), "First level string (default)");
455
+ chai_1.assert.equal(localization.getLocalizedString("FirstTrivial", { ns: "Test" }), "First level string (test)");
456
+ });
457
+ it("first level with no substitution with fallback keys", () => {
458
+ chai_1.assert.equal(localization.getLocalizedString(["FirstTrivial", "NotExist"], { ns: "Default" }), "First level string (default)");
459
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "FirstTrivial"], { ns: "Test" }), "First level string (test)");
460
+ });
461
+ it("second level with no substitution", () => {
462
+ chai_1.assert.equal(localization.getLocalizedString("SecondTrivial.Test1", { ns: "Default" }), "Second level string 1 (default)");
463
+ chai_1.assert.equal(localization.getLocalizedString("SecondTrivial.Test2", { ns: "Default" }), "Second level string 2 (default)");
464
+ chai_1.assert.equal(localization.getLocalizedString("SecondTrivial.Test1", { ns: "Test" }), "Second level string 1 (test)");
465
+ chai_1.assert.equal(localization.getLocalizedString("SecondTrivial.Test2", { ns: "Test" }), "Second level string 2 (test)");
466
+ });
467
+ it("second level with no substitution with fallback keys", () => {
468
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "SecondTrivial.Test1"], { ns: "Default" }), "Second level string 1 (default)");
469
+ chai_1.assert.equal(localization.getLocalizedString(["SecondTrivial.Test2", "NotExist"], { ns: "Test" }), "Second level string 2 (test)");
470
+ });
471
+ it("first level with substitution", () => {
472
+ chai_1.assert.equal(localization.getLocalizedString("FirstSubstitution1", { ns: "Default", str: "CUSTOM1" }), "First level CUSTOM1 (default)");
473
+ chai_1.assert.equal(localization.getLocalizedString("FirstSubstitution1", { ns: "Default", str: "CUSTOM2" }), "First level CUSTOM2 (default)");
474
+ chai_1.assert.equal(localization.getLocalizedString("FirstSubstitution2", { ns: "Default", str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (default)");
475
+ chai_1.assert.equal(localization.getLocalizedString("FirstSubstitution1", { ns: "Test", str: "CUSTOM1" }), "First level CUSTOM1 (test)");
476
+ chai_1.assert.equal(localization.getLocalizedString("FirstSubstitution1", { ns: "Test", str: "CUSTOM2" }), "First level CUSTOM2 (test)");
477
+ chai_1.assert.equal(localization.getLocalizedString("FirstSubstitution2", { ns: "Test", str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (test)");
478
+ });
479
+ it("first level with substitution with fallback keys", () => {
480
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "FirstSubstitution1"], { ns: "Default", str: "CUSTOM1" }), "First level CUSTOM1 (default)");
481
+ chai_1.assert.equal(localization.getLocalizedString(["FirstSubstitution1", "NotExist"], { ns: "Test", str: "CUSTOM2" }), "First level CUSTOM2 (test)");
482
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "FirstSubstitution2"], { ns: "Test", str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (test)");
483
+ });
484
+ it("second level with substitution", () => {
485
+ chai_1.assert.equal(localization.getLocalizedString("SecondSubstitution.Test1", { ns: "Default", varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default)");
486
+ chai_1.assert.equal(localization.getLocalizedString("SecondSubstitution.Test2", { ns: "Default", varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (default)");
487
+ chai_1.assert.equal(localization.getLocalizedString("SecondSubstitution.Test1", { ns: "Test", varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (test)");
488
+ chai_1.assert.equal(localization.getLocalizedString("SecondSubstitution.Test2", { ns: "Test", varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (test)");
489
+ });
490
+ it("second level with substitution with fallback keys", () => {
491
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "SecondSubstitution.Test1"], { ns: "Default", varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default)");
492
+ chai_1.assert.equal(localization.getLocalizedString(["SecondSubstitution.Test2", "NotExist"], { ns: "Test", varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (test)");
493
+ });
494
+ it("first level missing key doesn't find a value", () => {
495
+ chai_1.assert.equal(localization.getLocalizedString("MissingKeyString", { ns: "Default" }), "MissingKeyString");
496
+ chai_1.assert.equal(localization.getLocalizedString("MissingKeyString", { ns: "Test" }), "MissingKeyString");
497
+ });
498
+ it("second level missing key doesn't find a value", () => {
499
+ chai_1.assert.equal(localization.getLocalizedString("SecondTrivial.MissingString", { ns: "Test" }), "SecondTrivial.MissingString");
500
+ chai_1.assert.equal(localization.getLocalizedString("MissingKeyObject.MissingString", { ns: "Test" }), "MissingKeyObject.MissingString");
501
+ });
502
+ });
503
+ describe("Keys Without Namespaces (German)", () => {
504
+ it("first level with no substitution", () => {
505
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstTrivial", { ns: "Default" }), "First level string (default german)");
506
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstTrivial", { ns: "Test" }), "First level string (german)");
507
+ });
508
+ it("second level with no substitution", () => {
509
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondTrivial.Test1", { ns: "Default" }), "Second level string 1 (default german)");
510
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondTrivial.Test2", { ns: "Default" }), "Second level string 2 (default german)");
511
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondTrivial.Test1", { ns: "Test" }), "Second level string 1 (german)");
512
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondTrivial.Test2", { ns: "Test" }), "Second level string 2 (german)");
513
+ });
514
+ it("first level with substitution", () => {
515
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstSubstitution1", { ns: "Default", str: "CUSTOM1" }), "First level CUSTOM1 (default german)");
516
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstSubstitution1", { ns: "Default", str: "CUSTOM2" }), "First level CUSTOM2 (default german)");
517
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstSubstitution2", { ns: "Default", str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (default german)");
518
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstSubstitution1", { ns: "Test", str: "CUSTOM1" }), "First level CUSTOM1 (german)");
519
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstSubstitution1", { ns: "Test", str: "CUSTOM2" }), "First level CUSTOM2 (german)");
520
+ chai_1.assert.equal(germanLocalization.getLocalizedString("FirstSubstitution2", { ns: "Test", str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (german)");
521
+ });
522
+ it("second level with substitution", () => {
523
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondSubstitution.Test1", { ns: "Default", varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default german)");
524
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondSubstitution.Test2", { ns: "Default", varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (default german)");
525
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondSubstitution.Test1", { ns: "Test", varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (german)");
526
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondSubstitution.Test2", { ns: "Test", varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (german)");
527
+ });
528
+ it("first level missing key doesn't find a value", () => {
529
+ chai_1.assert.equal(germanLocalization.getLocalizedString("MissingKeyString", { ns: "Default" }), "MissingKeyString");
530
+ chai_1.assert.equal(germanLocalization.getLocalizedString("MissingKeyString", { ns: "Test" }), "MissingKeyString");
531
+ });
532
+ it("second level missing key doesn't find a value", () => {
533
+ chai_1.assert.equal(germanLocalization.getLocalizedString("SecondTrivial.MissingString", { ns: "Test" }), "SecondTrivial.MissingString");
534
+ chai_1.assert.equal(germanLocalization.getLocalizedString("MissingKeyObject.MissingString", { ns: "Test" }), "MissingKeyObject.MissingString");
535
+ });
536
+ });
537
+ describe("Keys With Namespaces", () => {
538
+ it("key with same namespace works", () => {
539
+ chai_1.assert.equal(localization.getLocalizedString("Default:FirstTrivial", { ns: "Default" }), "First level string (default)");
540
+ chai_1.assert.equal(localization.getLocalizedString("Test:SecondTrivial.Test1", { ns: "Test" }), "Second level string 1 (test)");
541
+ });
542
+ it("key with different namespace overrides given namespace", () => {
543
+ chai_1.assert.equal(localization.getLocalizedString("Test:FirstTrivial", { ns: "Default" }), "First level string (test)");
544
+ chai_1.assert.equal(localization.getLocalizedString("Default:FirstTrivial", { ns: "Test" }), "First level string (default)");
545
+ });
546
+ it("key with same namespace works with fallback keys", () => {
547
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist:FirstTrivial", "Default:FirstTrivial"], { ns: "Default" }), "First level string (default)");
548
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist:FirstTrivial", "Test:FirstTrivial"], { ns: "Test" }), "First level string (test)");
549
+ });
550
+ it("key with different namespace overrides given namespace with fallback keys", () => {
551
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist:FirstTrivial", "Test:FirstTrivial"], { ns: "Default" }), "First level string (test)");
552
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist:FirstTrivial", "Default:FirstTrivial"], { ns: "Test" }), "First level string (default)");
553
+ });
554
+ it("missing key does not find a value", () => {
555
+ chai_1.assert.equal(germanLocalization.getLocalizedString("Default:MissingKeyString", { ns: "Default" }), "MissingKeyString");
556
+ chai_1.assert.equal(germanLocalization.getLocalizedString(["Missing1", "MissingKeyObject.MissingString"], { ns: "Test" }), "MissingKeyObject.MissingString");
557
+ });
558
+ });
559
+ describe("Nonexisting Namespace", () => {
560
+ it("first level fails", () => {
561
+ chai_1.assert.equal(localization.getLocalizedString("FirstTrivial", { ns: "Nonexisting" }), "FirstTrivial");
562
+ chai_1.assert.equal(localization.getLocalizedString("MissingKeyString", { ns: "Nonexisting" }), "MissingKeyString");
563
+ });
564
+ it("second level fails", () => {
565
+ chai_1.assert.equal(localization.getLocalizedString("SecondTrivial.Test1", { ns: "Nonexisting" }), "SecondTrivial.Test1");
566
+ chai_1.assert.equal(localization.getLocalizedString("Missing.String", { ns: "Nonexisting" }), "Missing.String");
567
+ });
568
+ it("empty string namespace falls back to default namespace", () => {
569
+ chai_1.assert.equal(localization.getLocalizedString("FirstTrivial", { ns: "" }), "First level string (default)");
570
+ chai_1.assert.equal(localization.getLocalizedString("SecondTrivial.Test1", { ns: "" }), "Second level string 1 (default)");
571
+ });
572
+ it("fallback key fails", () => {
573
+ chai_1.assert.equal(localization.getLocalizedString(["FirstTrivial", "NotExist"], { ns: "Nonexisting" }), "NotExist");
574
+ chai_1.assert.equal(localization.getLocalizedString(["NotExist", "Missing.String"], { ns: "Nonexisting" }), "Missing.String");
575
+ });
576
+ it("use key with valid namespace instead", () => {
577
+ chai_1.assert.equal(localization.getLocalizedString("Default:FirstTrivial", { ns: "Nonexisting" }), "First level string (default)");
578
+ chai_1.assert.equal(localization.getLocalizedString("Test:FirstTrivial", { ns: "Nonexisting" }), "First level string (test)");
579
+ });
580
+ it("providing key with invalid namespace fails", () => {
581
+ chai_1.assert.equal(localization.getLocalizedString("Nonexisting2:FirstTrivial", { ns: "Nonexisting1" }), "FirstTrivial");
582
+ });
583
+ });
584
+ // Test a few options to make sure they get passed through correctly
585
+ describe("With Options", () => {
586
+ it("returnDetails throws error", () => {
587
+ chai_1.assert.throws(() => {
588
+ localization.getLocalizedString("X", { ns: "Default", returnDetails: true });
589
+ }, "Translation key must map to a string, but the given options will result in an object");
590
+ });
591
+ it("returnObjects throws error", () => {
592
+ chai_1.assert.throws(() => {
593
+ localization.getLocalizedString("X", { ns: "Default", returnObjects: true });
594
+ }, "Translation key must map to a string, but the given options will result in an object");
595
+ });
596
+ it("returnDetails and returnObjects throws error", () => {
597
+ chai_1.assert.throws(() => {
598
+ localization.getLocalizedString("X", { ns: "Default", returnDetails: true, returnObjects: true });
599
+ }, "Translation key must map to a string, but the given options will result in an object");
600
+ });
601
+ it("default value", () => {
602
+ chai_1.assert.equal(localization.getLocalizedString("Missing", { ns: "Default", defaultValue: "default" }), "default");
603
+ });
604
+ it("override fallback language", () => {
605
+ // Doesn't fallback to English
606
+ chai_1.assert.equal(germanLocalization.getLocalizedString("OnlyEnglish", { ns: "Default", fallbackLng: "de" }), "OnlyEnglish");
607
+ });
608
+ });
609
+ });
610
+ describe("#getEnglishString", () => {
611
+ before(async () => {
612
+ localization = new ITwinLocalization_1.ITwinLocalization();
613
+ await localization.initialize(["Default", "Test"]);
614
+ germanLocalization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { lng: "de" } });
615
+ await germanLocalization.initialize(["Default", "Test"]);
616
+ });
617
+ describe("Given Namespace", () => {
618
+ it("first level with no substitution", () => {
619
+ chai_1.assert.equal(localization.getEnglishString("Default", "FirstTrivial"), "First level string (default)");
620
+ chai_1.assert.equal(localization.getEnglishString("Test", "FirstTrivial"), "First level string (test)");
621
+ });
622
+ it("first level with no substitution with fallback keys", () => {
623
+ chai_1.assert.equal(localization.getEnglishString("Default", ["FirstTrivial", "NotExist"]), "First level string (default)");
624
+ chai_1.assert.equal(localization.getEnglishString("Test", ["NotExist", "FirstTrivial"]), "First level string (test)");
625
+ });
626
+ it("second level with no substitution", () => {
627
+ chai_1.assert.equal(localization.getEnglishString("Default", "SecondTrivial.Test1"), "Second level string 1 (default)");
628
+ chai_1.assert.equal(localization.getEnglishString("Default", "SecondTrivial.Test2"), "Second level string 2 (default)");
629
+ chai_1.assert.equal(localization.getEnglishString("Test", "SecondTrivial.Test1"), "Second level string 1 (test)");
630
+ chai_1.assert.equal(localization.getEnglishString("Test", "SecondTrivial.Test2"), "Second level string 2 (test)");
631
+ });
632
+ it("second level with no substitution with fallback keys", () => {
633
+ chai_1.assert.equal(localization.getEnglishString("Default", ["NotExist", "SecondTrivial.Test1"]), "Second level string 1 (default)");
634
+ chai_1.assert.equal(localization.getEnglishString("Test", ["SecondTrivial.Test2", "NotExist"]), "Second level string 2 (test)");
635
+ });
636
+ it("first level with substitution", () => {
637
+ chai_1.assert.equal(localization.getEnglishString("Default", "FirstSubstitution1", { str: "CUSTOM1" }), "First level CUSTOM1 (default)");
638
+ chai_1.assert.equal(localization.getEnglishString("Default", "FirstSubstitution1", { str: "CUSTOM2" }), "First level CUSTOM2 (default)");
639
+ chai_1.assert.equal(localization.getEnglishString("Default", "FirstSubstitution2", { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (default)");
640
+ chai_1.assert.equal(localization.getEnglishString("Test", "FirstSubstitution1", { str: "CUSTOM1" }), "First level CUSTOM1 (test)");
641
+ chai_1.assert.equal(localization.getEnglishString("Test", "FirstSubstitution1", { str: "CUSTOM2" }), "First level CUSTOM2 (test)");
642
+ chai_1.assert.equal(localization.getEnglishString("Test", "FirstSubstitution2", { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (test)");
643
+ });
644
+ it("first level with substitution with fallback keys", () => {
645
+ chai_1.assert.equal(localization.getEnglishString("Default", ["NotExist", "FirstSubstitution1"], { str: "CUSTOM1" }), "First level CUSTOM1 (default)");
646
+ chai_1.assert.equal(localization.getEnglishString("Test", ["FirstSubstitution1", "NotExist"], { str: "CUSTOM2" }), "First level CUSTOM2 (test)");
647
+ chai_1.assert.equal(localization.getEnglishString("Test", ["NotExist", "FirstSubstitution2"], { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (test)");
648
+ });
649
+ it("second level with substitution", () => {
650
+ chai_1.assert.equal(localization.getEnglishString("Default", "SecondSubstitution.Test1", { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default)");
651
+ chai_1.assert.equal(localization.getEnglishString("Default", "SecondSubstitution.Test2", { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (default)");
652
+ chai_1.assert.equal(localization.getEnglishString("Test", "SecondSubstitution.Test1", { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (test)");
653
+ chai_1.assert.equal(localization.getEnglishString("Test", "SecondSubstitution.Test2", { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (test)");
654
+ });
655
+ it("second level with substitution with fallback keys", () => {
656
+ chai_1.assert.equal(localization.getEnglishString("Default", ["NotExist", "SecondSubstitution.Test1"], { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default)");
657
+ chai_1.assert.equal(localization.getEnglishString("Test", ["SecondSubstitution.Test2", "NotExist"], { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (test)");
658
+ });
659
+ it("first level missing key doesn't find a value", () => {
660
+ chai_1.assert.equal(localization.getEnglishString("Default", "MissingKeyString"), "MissingKeyString");
661
+ chai_1.assert.equal(localization.getEnglishString("Test", "MissingKeyString"), "MissingKeyString");
662
+ });
663
+ it("second level missing key doesn't find a value", () => {
664
+ chai_1.assert.equal(localization.getEnglishString("Test", "SecondTrivial.MissingString"), "SecondTrivial.MissingString");
665
+ chai_1.assert.equal(localization.getEnglishString("Test", "MissingKeyObject.MissingString"), "MissingKeyObject.MissingString");
666
+ });
667
+ });
668
+ describe("Given Namespace with German default language returns English strings", () => {
669
+ it("first level with no substitution", () => {
670
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", "FirstTrivial"), "First level string (default)");
671
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "FirstTrivial"), "First level string (test)");
672
+ });
673
+ it("first level with no substitution with fallback keys", () => {
674
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", ["FirstTrivial", "NotExist"]), "First level string (default)");
675
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", ["NotExist", "FirstTrivial"]), "First level string (test)");
676
+ });
677
+ it("second level with no substitution", () => {
678
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", "SecondTrivial.Test1"), "Second level string 1 (default)");
679
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", "SecondTrivial.Test2"), "Second level string 2 (default)");
680
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "SecondTrivial.Test1"), "Second level string 1 (test)");
681
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "SecondTrivial.Test2"), "Second level string 2 (test)");
682
+ });
683
+ it("second level with no substitution with fallback keys", () => {
684
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", ["NotExist", "SecondTrivial.Test1"]), "Second level string 1 (default)");
685
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", ["SecondTrivial.Test2", "NotExist"]), "Second level string 2 (test)");
686
+ });
687
+ it("first level with substitution", () => {
688
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", "FirstSubstitution1", { str: "CUSTOM1" }), "First level CUSTOM1 (default)");
689
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", "FirstSubstitution1", { str: "CUSTOM2" }), "First level CUSTOM2 (default)");
690
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", "FirstSubstitution2", { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (default)");
691
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "FirstSubstitution1", { str: "CUSTOM1" }), "First level CUSTOM1 (test)");
692
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "FirstSubstitution1", { str: "CUSTOM2" }), "First level CUSTOM2 (test)");
693
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "FirstSubstitution2", { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (test)");
694
+ });
695
+ it("first level with substitution with fallback keys", () => {
696
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", ["NotExist", "FirstSubstitution1"], { str: "CUSTOM1" }), "First level CUSTOM1 (default)");
697
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", ["FirstSubstitution1", "NotExist"], { str: "CUSTOM2" }), "First level CUSTOM2 (test)");
698
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", ["NotExist", "FirstSubstitution2"], { str1: "CUSTOM1", str2: "CUSTOM2" }), "First level CUSTOM1 and CUSTOM2 (test)");
699
+ });
700
+ it("second level with substitution", () => {
701
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", "SecondSubstitution.Test1", { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default)");
702
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", "SecondSubstitution.Test2", { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (default)");
703
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "SecondSubstitution.Test1", { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (test)");
704
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "SecondSubstitution.Test2", { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (test)");
705
+ });
706
+ it("second level with substitution with fallback keys", () => {
707
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", ["NotExist", "SecondSubstitution.Test1"], { varA: "Variable1", varB: "Variable2" }), "Substitute Variable1 and Variable2 (default)");
708
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", ["SecondSubstitution.Test2", "NotExist"], { varA: "Variable1", varB: "Variable2" }), "Reverse substitute Variable2 and Variable1 (test)");
709
+ });
710
+ it("first level missing key doesn't find a value", () => {
711
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", "MissingKeyString"), "MissingKeyString");
712
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "MissingKeyString"), "MissingKeyString");
713
+ });
714
+ it("second level missing key doesn't find a value", () => {
715
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "SecondTrivial.MissingString"), "SecondTrivial.MissingString");
716
+ chai_1.assert.equal(germanLocalization.getEnglishString("Test", "MissingKeyObject.MissingString"), "MissingKeyObject.MissingString");
717
+ });
718
+ });
719
+ describe("Nonexisting Namespace", () => {
720
+ it("first level fails", () => {
721
+ chai_1.assert.equal(localization.getEnglishString("Nonexisting", "FirstTrivial"), "FirstTrivial");
722
+ chai_1.assert.equal(localization.getEnglishString("Nonexisting", "MissingKeyString"), "MissingKeyString");
723
+ });
724
+ it("second level fails", () => {
725
+ chai_1.assert.equal(localization.getEnglishString("Nonexisting", "SecondTrivial.Test1"), "SecondTrivial.Test1");
726
+ chai_1.assert.equal(localization.getEnglishString("Nonexisting", "Missing.String"), "Missing.String");
727
+ });
728
+ it("empty string namespace is treated as default namespace", () => {
729
+ chai_1.assert.equal(localization.getEnglishString("", "FirstTrivial"), "First level string (default)");
730
+ chai_1.assert.equal(localization.getEnglishString("", "SecondTrivial.Test1"), "Second level string 1 (default)");
731
+ });
732
+ });
733
+ // Test a few options to make sure they get passed through correctly
734
+ describe("With Options", () => {
735
+ it("returnDetails throws error", () => {
736
+ chai_1.assert.throws(() => {
737
+ localization.getEnglishString("Default", "X", { returnDetails: true });
738
+ }, "Translation key must map to a string, but the given options will result in an object");
739
+ });
740
+ it("returnObjects throws error", () => {
741
+ chai_1.assert.throws(() => {
742
+ localization.getEnglishString("Default", "X", { returnObjects: true });
743
+ }, "Translation key must map to a string, but the given options will result in an object");
744
+ });
745
+ it("returnDetails and returnObjects throws error", () => {
746
+ chai_1.assert.throws(() => {
747
+ localization.getEnglishString("Default", "X", { returnDetails: true, returnObjects: true });
748
+ }, "Translation key must map to a string, but the given options will result in an object");
749
+ });
750
+ it("default value", () => {
751
+ chai_1.assert.equal(localization.getEnglishString("Default", "Missing", { defaultValue: "default" }), "default");
752
+ });
753
+ it("english takes priority over fallback language", () => {
754
+ chai_1.assert.equal(germanLocalization.getEnglishString("Default", "OnlyEnglish", { fallbackLng: "de" }), "Hello");
755
+ });
756
+ // White box test
757
+ it("given namespace overrides namespace translation option", () => {
758
+ chai_1.assert.equal(localization.getEnglishString("Default", "FirstTrivial", { ns: "Test" }), "First level string (default)");
759
+ chai_1.assert.equal(localization.getEnglishString("Default", "FirstSubstitution1", { str: "CUSTOM1", ns: "Test" }), "First level CUSTOM1 (default)");
760
+ });
761
+ });
762
+ });
763
+ // Returned promises never have anything of substance, being only empty or resolving to null...
764
+ // describe("#getNamespacePromise", () => {
765
+ // });
766
+ describe("#getLanguageList", () => {
767
+ let languages;
768
+ it("english language list includes en and en-US", async () => {
769
+ localization = new ITwinLocalization_1.ITwinLocalization();
770
+ await localization.initialize([]);
771
+ languages = localization.getLanguageList();
772
+ chai_1.assert.isTrue(languages.includes("en-US"));
773
+ chai_1.assert.isTrue(languages.includes("en"));
774
+ });
775
+ it("when non-english language is set as default, that language and english are included in langauge list", async () => {
776
+ germanLocalization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { lng: "de" } });
777
+ await germanLocalization.initialize([]);
778
+ languages = germanLocalization.getLanguageList();
779
+ chai_1.assert.isTrue(languages.includes("en"));
780
+ chai_1.assert.isTrue(languages.includes("de"));
781
+ });
782
+ });
783
+ describe("#changeLanguage", () => {
784
+ it("change from english to another language", async () => {
785
+ localization = new ITwinLocalization_1.ITwinLocalization();
786
+ await localization.initialize(["Default"]);
787
+ chai_1.assert.equal(localization.getLocalizedString("FirstTrivial"), "First level string (default)"); // english
788
+ await localization.changeLanguage("de");
789
+ chai_1.assert.equal(localization.getLocalizedString("FirstTrivial"), "First level string (default german)"); // german
790
+ });
791
+ it("change from another language to english", async () => {
792
+ localization = new ITwinLocalization_1.ITwinLocalization({ initOptions: { lng: "de" } });
793
+ await localization.initialize(["Default"]);
794
+ chai_1.assert.equal(localization.getLocalizedString("FirstTrivial"), "First level string (default german)"); // german
795
+ await localization.changeLanguage("en");
796
+ chai_1.assert.equal(localization.getLocalizedString("FirstTrivial"), "First level string (default)"); // english
797
+ });
798
+ });
799
+ describe("#registerNamespace", () => {
800
+ let itwinLocalization;
801
+ beforeEach(async () => {
802
+ itwinLocalization = new ITwinLocalization_1.ITwinLocalization();
803
+ });
804
+ it("can read from namespace after it is registered", async () => {
805
+ await itwinLocalization.initialize([]);
806
+ await itwinLocalization.registerNamespace("Test");
807
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("Test"));
808
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("Test:FirstTrivial"), "First level string (test)");
809
+ });
810
+ it("zero initial, register one", async () => {
811
+ await itwinLocalization.initialize([]);
812
+ await itwinLocalization.registerNamespace("test1");
813
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("test1"));
814
+ });
815
+ it("zero initial, register two", async () => {
816
+ await itwinLocalization.initialize([]);
817
+ await itwinLocalization.registerNamespace("test1");
818
+ await itwinLocalization.registerNamespace("test2");
819
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("test1"));
820
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("test2"));
821
+ });
822
+ it("one initial, register one", async () => {
823
+ await itwinLocalization.initialize(["initial1"]);
824
+ await itwinLocalization.registerNamespace("test1");
825
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("test1"));
826
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("initial1"));
827
+ });
828
+ it("one initial, register two", async () => {
829
+ await itwinLocalization.initialize(["initial1"]);
830
+ await itwinLocalization.registerNamespace("test1");
831
+ await itwinLocalization.registerNamespace("test2");
832
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("test1"));
833
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("test2"));
834
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("initial1"));
835
+ });
836
+ it("two initial, register one", async () => {
837
+ await itwinLocalization.initialize(["initial1", "initial2"]);
838
+ await itwinLocalization.registerNamespace("test1");
839
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("test1"));
840
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("initial1"));
841
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("initial2"));
842
+ });
843
+ it("two initial, register two", async () => {
844
+ await itwinLocalization.initialize(["initial1", "initial2"]);
845
+ await itwinLocalization.registerNamespace("test1");
846
+ await itwinLocalization.registerNamespace("test2");
847
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("test1"));
848
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("initial1"));
849
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("initial2"));
850
+ });
851
+ it("register duplicate namespaces", async () => {
852
+ await itwinLocalization.initialize([]);
853
+ await itwinLocalization.registerNamespace("Test");
854
+ await itwinLocalization.registerNamespace("Test");
855
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("Test"));
856
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("Test:FirstTrivial"), "First level string (test)");
857
+ });
858
+ it("register duplicate namespace of initial namespace doesn't break anything", async () => {
859
+ await itwinLocalization.initialize(["Test"]);
860
+ await itwinLocalization.registerNamespace("Test");
861
+ chai_1.assert.isTrue(itwinLocalization.i18next.hasLoadedNamespace("Test"));
862
+ chai_1.assert.equal(itwinLocalization.getLocalizedString("Test:FirstTrivial"), "First level string (test)");
122
863
  });
123
864
  });
865
+ // unregisterNamespace() isn't used and basically does nothing
866
+ // describe("#unregisterNamespace", () => {
867
+ // });
124
868
  });
125
869
  //# sourceMappingURL=ITwinLocalization.test.js.map