Skip to content

Commit 1c1ecdb

Browse files
authored
fix(!): Chinese language support (#16)
* chinese language support * Update test coverage badge * "en" fallback language * tests * assume navigator is defined * Update test coverage badge --------- Co-authored-by: ChekTek <[email protected]>
1 parent bfc3dc6 commit 1c1ecdb

File tree

6 files changed

+102
-28
lines changed

6 files changed

+102
-28
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,4 +120,7 @@ src/**/*.js*
120120
dist/**/*.txt
121121

122122
# Local
123-
example/pi/sdpi-components.js.map
123+
example/pi/sdpi-components.js.map
124+
125+
# OS
126+
.DS_Store

assets/coverage.svg

Lines changed: 1 addition & 1 deletion
Loading

dist/sdpi-components.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

example/pi/sdpi-components.js

Lines changed: 13 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/core/__tests__/i18n.test.ts

Lines changed: 71 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -10,36 +10,84 @@ describe("i18n", () => {
1010

1111
describe("default language", () => {
1212
afterAll(() => jest.spyOn(window.navigator, "language", "get").mockReturnValue("en-GB"));
13+
afterEach(() => jest.resetModules());
1314

14-
const testCases = [
15-
{
16-
name: "should read window.navigator.language when localized",
17-
navigator: "es-ES",
18-
language: "es",
19-
},
20-
{
21-
name: "should read window.navigator.language when not localized",
22-
navigator: "fr",
23-
language: "fr",
24-
},
25-
{
26-
name: "should fallback to en when empty",
27-
navigator: "",
28-
language: "en",
29-
},
30-
];
31-
32-
testCases.map((testCase) => {
33-
it(testCase.name, async () => {
15+
it("should read window.navigator.language when localized", async () => {
16+
// given.
17+
jest.spyOn(window.navigator, "language", "get").mockReturnValue("es-ES");
18+
19+
// when
20+
const i18n = (await import("../i18n")).default;
21+
22+
// then.
23+
expect(i18n.language).toBe("es");
24+
});
25+
26+
it("should read window.navigator.language when not localized", async () => {
27+
// given.
28+
jest.spyOn(window.navigator, "language", "get").mockReturnValue("fr");
29+
30+
// when
31+
const i18n = (await import("../i18n")).default;
32+
33+
// then.
34+
expect(i18n.language).toBe("fr");
35+
});
36+
37+
it("should fallback to en when empty", async () => {
38+
// given.
39+
jest.spyOn(window.navigator, "language", "get").mockReturnValue("");
40+
41+
// when
42+
const i18n = (await import("../i18n")).default;
43+
44+
// then.
45+
expect(i18n.language).toBe("en");
46+
});
47+
48+
describe("Simplified/Traditional Chinese", () => {
49+
it("should map traditional Chinese zh-TW to zh_TW", async () => {
50+
// given.
51+
jest.spyOn(window.navigator, "language", "get").mockReturnValue("zh-TW");
52+
53+
// when
54+
const i18n = (await import("../i18n")).default;
55+
56+
// then.
57+
expect(i18n.language).toBe("zh_TW");
58+
});
59+
60+
it("should map traditional Chinese zh-Hant to zh_TW", async () => {
61+
// given.
62+
jest.spyOn(window.navigator, "language", "get").mockReturnValue("zh-Hant");
63+
64+
// when
65+
const i18n = (await import("../i18n")).default;
66+
67+
// then.
68+
expect(i18n.language).toBe("zh_TW");
69+
});
70+
71+
it("should map simplified Chinese zh-CN to zh_CN", async () => {
72+
// given.
73+
jest.spyOn(window.navigator, "language", "get").mockReturnValue("zh-CN");
74+
75+
// when
76+
const i18n = (await import("../i18n")).default;
77+
78+
// then.
79+
expect(i18n.language).toBe("zh_CN");
80+
});
81+
82+
it("should map simplified Chinese zh-Hans to zh_CN", async () => {
3483
// given.
35-
jest.spyOn(window.navigator, "language", "get").mockReturnValue(testCase.navigator);
84+
jest.spyOn(window.navigator, "language", "get").mockReturnValue("zh-Hans");
3685

3786
// when
3887
const i18n = (await import("../i18n")).default;
39-
jest.resetModules();
4088

4189
// then.
42-
expect(i18n.language).toBe(testCase.language);
90+
expect(i18n.language).toBe("zh_CN");
4391
});
4492
});
4593
});

src/core/i18n.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ export class Internationalization {
4040
* {@link https://developer.chrome.com/docs/extensions/reference/i18n/#method-getUILanguage}
4141
*/
4242
public getUILanguage(): string {
43+
const language = window.navigator.language;
44+
45+
// Chinese Traditional
46+
if (language === "zh-Hant" || language === "zh-TW") {
47+
return "zh_TW";
48+
}
49+
50+
// Chinese Simplified
51+
if (language === "zh-Hans" || language === "zh-CN") {
52+
return "zh_CN";
53+
}
54+
4355
return window.navigator.language ? window.navigator.language.split("-")[0] : "en";
4456
}
4557
}

0 commit comments

Comments
 (0)