@prosopo/locale 3.4.3 → 3.6.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.
- package/.turbo/turbo-build$colon$cjs.log +15 -13
- package/.turbo/turbo-build$colon$tsc.log +8 -5
- package/.turbo/turbo-build.log +17 -15
- package/CHANGELOG.md +74 -0
- package/dist/cjs/i18SharedOptions.cjs +2 -2
- package/dist/cjs/i18nBackend.cjs +1 -1
- package/dist/cjs/i18nFrontend.cjs +167 -53
- package/dist/cjs/i18nMiddleware.cjs +5 -2
- package/dist/cjs/index.cjs +5 -4
- package/dist/cjs/locales/en/translation.cjs +1 -0
- package/dist/cjs/translationKey.cjs +2 -3
- package/dist/cjs/translations.cjs +4 -5
- package/dist/cjs/translator.cjs +29 -0
- package/dist/i18SharedOptions.d.ts +2 -2
- package/dist/i18SharedOptions.js +3 -3
- package/dist/i18SharedOptions.js.map +1 -1
- package/dist/i18nBackend.js +1 -1
- package/dist/i18nFrontend.d.ts +2 -2
- package/dist/i18nFrontend.d.ts.map +1 -1
- package/dist/i18nFrontend.js +167 -47
- package/dist/i18nFrontend.js.map +1 -1
- package/dist/i18nMiddleware.d.ts.map +1 -1
- package/dist/i18nMiddleware.js +3 -1
- package/dist/i18nMiddleware.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/loadI18next.d.ts +2 -3
- package/dist/loadI18next.d.ts.map +1 -1
- package/dist/loadI18next.js.map +1 -1
- package/dist/locales/ar/translation.json +1 -0
- package/dist/locales/az/translation.json +1 -0
- package/dist/locales/cs/translation.json +1 -0
- package/dist/locales/de/translation.json +1 -0
- package/dist/locales/el/translation.json +1 -0
- package/dist/locales/en/translation.js +1 -0
- package/dist/locales/en/translation.json +1 -0
- package/dist/locales/es/translation.json +1 -0
- package/dist/locales/fi/translation.json +1 -0
- package/dist/locales/fr/translation.json +1 -0
- package/dist/locales/hi/translation.json +1 -0
- package/dist/locales/hu/translation.json +1 -0
- package/dist/locales/id/translation.json +1 -0
- package/dist/locales/it/translation.json +1 -0
- package/dist/locales/ja/translation.json +1 -0
- package/dist/locales/jv/translation.json +1 -0
- package/dist/locales/ko/translation.json +1 -0
- package/dist/locales/ml/translation.json +1 -0
- package/dist/locales/ms/translation.json +1 -0
- package/dist/locales/nl/translation.json +1 -0
- package/dist/locales/no/translation.json +1 -0
- package/dist/locales/pl/translation.json +1 -0
- package/dist/locales/pt/translation.json +1 -0
- package/dist/locales/pt-BR/translation.json +1 -0
- package/dist/locales/ro/translation.json +1 -0
- package/dist/locales/ru/translation.json +1 -0
- package/dist/locales/sr/translation.json +1 -0
- package/dist/locales/sv/translation.json +1 -0
- package/dist/locales/th/translation.json +1 -0
- package/dist/locales/tr/translation.json +1 -0
- package/dist/locales/uk/translation.json +1 -0
- package/dist/locales/vi/translation.json +1 -0
- package/dist/locales/zh-CN/translation.json +1 -0
- package/dist/tests/i18nFrontend.unit.test.js +218 -173
- package/dist/tests/i18nFrontend.unit.test.js.map +1 -1
- package/dist/tests/i18nMiddleware.unit.test.js +11 -2
- package/dist/tests/i18nMiddleware.unit.test.js.map +1 -1
- package/dist/tests/loadI18next.unit.test.js.map +1 -1
- package/dist/tests/locale.test-d.js +27 -20
- package/dist/tests/locale.test-d.js.map +1 -1
- package/dist/tests/translationKey.unit.test.js +11 -33
- package/dist/tests/translationKey.unit.test.js.map +1 -1
- package/dist/tests/translations.unit.test.js +12 -22
- package/dist/tests/translations.unit.test.js.map +1 -1
- package/dist/tests/translator.unit.test.d.ts +2 -0
- package/dist/tests/translator.unit.test.d.ts.map +1 -0
- package/dist/tests/translator.unit.test.js +134 -0
- package/dist/tests/translator.unit.test.js.map +1 -0
- package/dist/translationKey.d.ts +2 -3
- package/dist/translationKey.d.ts.map +1 -1
- package/dist/translationKey.js +2 -3
- package/dist/translationKey.js.map +1 -1
- package/dist/translations.d.ts +3 -2
- package/dist/translations.d.ts.map +1 -1
- package/dist/translations.js +3 -3
- package/dist/translations.js.map +1 -1
- package/dist/translator.d.ts +9 -0
- package/dist/translator.d.ts.map +1 -0
- package/dist/translator.js +29 -0
- package/dist/translator.js.map +1 -0
- package/dist/types.d.ts +16 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +4 -9
- package/src/i18SharedOptions.ts +3 -3
- package/src/i18nFrontend.ts +240 -78
- package/src/i18nMiddleware.ts +6 -1
- package/src/index.ts +11 -4
- package/src/loadI18next.ts +8 -9
- package/src/locales/ar/translation.json +1 -0
- package/src/locales/az/translation.json +1 -0
- package/src/locales/cs/translation.json +1 -0
- package/src/locales/de/translation.json +1 -0
- package/src/locales/el/translation.json +1 -0
- package/src/locales/en/translation.json +1 -0
- package/src/locales/es/translation.json +1 -0
- package/src/locales/fi/translation.json +1 -0
- package/src/locales/fr/translation.json +1 -0
- package/src/locales/hi/translation.json +1 -0
- package/src/locales/hu/translation.json +1 -0
- package/src/locales/id/translation.json +1 -0
- package/src/locales/it/translation.json +1 -0
- package/src/locales/ja/translation.json +1 -0
- package/src/locales/jv/translation.json +1 -0
- package/src/locales/ko/translation.json +1 -0
- package/src/locales/ml/translation.json +1 -0
- package/src/locales/ms/translation.json +1 -0
- package/src/locales/nl/translation.json +1 -0
- package/src/locales/no/translation.json +1 -0
- package/src/locales/pl/translation.json +1 -0
- package/src/locales/pt/translation.json +1 -0
- package/src/locales/pt-BR/translation.json +1 -0
- package/src/locales/ro/translation.json +1 -0
- package/src/locales/ru/translation.json +1 -0
- package/src/locales/sr/translation.json +1 -0
- package/src/locales/sv/translation.json +1 -0
- package/src/locales/th/translation.json +1 -0
- package/src/locales/tr/translation.json +1 -0
- package/src/locales/uk/translation.json +1 -0
- package/src/locales/vi/translation.json +1 -0
- package/src/locales/zh-CN/translation.json +1 -0
- package/src/tests/i18nFrontend.unit.test.ts +310 -219
- package/src/tests/i18nMiddleware.unit.test.ts +21 -2
- package/src/tests/loadI18next.unit.test.ts +11 -11
- package/src/tests/locale.test-d.ts +36 -32
- package/src/tests/translationKey.unit.test.ts +12 -38
- package/src/tests/translations.unit.test.ts +18 -31
- package/src/tests/translator.unit.test.ts +213 -0
- package/src/translationKey.ts +10 -9
- package/src/translations.ts +6 -5
- package/src/translator.ts +68 -0
- package/src/types.ts +42 -0
- package/tsconfig.cjs.json +3 -0
- package/tsconfig.json +3 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/cjs/useTranslation.cjs +0 -12
- package/dist/tests/useTranslation.unit.test.d.ts +0 -2
- package/dist/tests/useTranslation.unit.test.d.ts.map +0 -1
- package/dist/tests/useTranslation.unit.test.js +0 -81
- package/dist/tests/useTranslation.unit.test.js.map +0 -1
- package/dist/useTranslation.d.ts +0 -7
- package/dist/useTranslation.d.ts.map +0 -1
- package/dist/useTranslation.js +0 -11
- package/dist/useTranslation.js.map +0 -1
- package/src/tests/useTranslation.unit.test.ts +0 -134
- package/src/useTranslation.ts +0 -31
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Слишком много отправок с этого адреса электронной почты",
|
|
48
48
|
"VPN_BLOCKED": "Запросы через VPN-подключения не разрешены для этого сайта",
|
|
49
49
|
"PROXY_BLOCKED": "Запросы через прокси-серверы не разрешены для этого сайта",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Слишком много запросов CAPTCHA с localhost для этого ключа сайта",
|
|
50
51
|
"TOR_BLOCKED": "Запросы через выходные узлы Tor не разрешены для этого сайта",
|
|
51
52
|
"ABUSER_BLOCKED": "Запросы из сетей, отмеченных за злоупотребления, не разрешены для этого сайта",
|
|
52
53
|
"DATACENTER_BLOCKED": "Запросы с IP-адресов центров обработки данных не разрешены для этого сайта",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Превише слања са ове адресе е-поште",
|
|
48
48
|
"VPN_BLOCKED": "Захтеви са VPN конекција нису дозвољени за овај сајт",
|
|
49
49
|
"PROXY_BLOCKED": "З��хтеви са прокси сервера нису дозвољени за овај сајт",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Превише CAPTCHA захтева са localhost-а за овај кључ сајта",
|
|
50
51
|
"TOR_BLOCKED": "Захтеви са Tor излазних чворова нису дозвољени за овај сајт",
|
|
51
52
|
"ABUSER_BLOCKED": "Захтеви са мрежа означених за злоупотребу нису дозвољени за овај сајт",
|
|
52
53
|
"DATACENTER_BLOCKED": "Захтеви са IP адреса центара података нису дозвољени за овај сајт",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "För många inskickningar från denna e-postadress",
|
|
48
48
|
"VPN_BLOCKED": "Förfrågningar från VPN-anslutningar är inte tillåtna för denna webbplats",
|
|
49
49
|
"PROXY_BLOCKED": "Förfrågningar från proxyservrar är inte tillåtna för denna webbplats",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "För många CAPTCHA-förfrågningar från localhost för denna webbplatsnyckel",
|
|
50
51
|
"TOR_BLOCKED": "Förfrågningar från Tor-utgångsnoder är inte tillåtna för denna webbplats",
|
|
51
52
|
"ABUSER_BLOCKED": "Förfrågningar från nätverk markerade för missbruk är inte tillåtna för denna webbplats",
|
|
52
53
|
"DATACENTER_BLOCKED": "Förfrågningar från datacenter-IP-adresser är inte tillåtna för denna webbplats",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "มีการส่งจากที่อยู่อีเมลนี้มากเกินไป",
|
|
48
48
|
"VPN_BLOCKED": "คำขอจากการเชื่อมต่อ VPN ไม่ได้รับอนุญาตสำหรับเว็บไซต์นี้",
|
|
49
49
|
"PROXY_BLOCKED": "คำขอจากเซิร์ฟเวอร์พร็อกซีไม่ได้รับอนุญาตสำหรับเว็บไซต์นี้",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "มีคำขอ CAPTCHA จาก localhost มากเกินไปสำหรับคีย์ไซต์นี้",
|
|
50
51
|
"TOR_BLOCKED": "คำขอจากโหนดทางออก Tor ไม่ได้รับอนุญาตสำหรับเว็บไซต์นี้",
|
|
51
52
|
"ABUSER_BLOCKED": "คำขอจากเครือข่ายที่ถูกระบุว่ามีการใช้งานในทางที่ผิดไม่ได้รับอนุญาตสำหรับเว็บไซต์นี้",
|
|
52
53
|
"DATACENTER_BLOCKED": "คำขอจากที่อยู่ IP ของศูนย์ข้อมูลไม่ได้รับอนุญาตสำหรับเว็บไซต์นี้",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Bu e-posta adresinden çok fazla gönderi",
|
|
48
48
|
"VPN_BLOCKED": "Bu site için VPN bağlantılarından gelen isteklere izin verilmiyor",
|
|
49
49
|
"PROXY_BLOCKED": "Bu site için proxy sunucularından gelen isteklere izin verilmiyor",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Bu site anahtarı için localhost'tan çok fazla CAPTCHA isteği",
|
|
50
51
|
"TOR_BLOCKED": "Bu site için Tor çıkış düğümlerinden gelen isteklere izin verilmiyor",
|
|
51
52
|
"ABUSER_BLOCKED": "Bu site için kötüye kullanım olarak işaretlenen ağlardan gelen isteklere izin verilmiyor",
|
|
52
53
|
"DATACENTER_BLOCKED": "Bu site için veri merkezi IP adreslerinden gelen isteklere izin verilmiyor",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Забагато надсилань з цієї адреси електронної пошти",
|
|
48
48
|
"VPN_BLOCKED": "Запити з VPN-з'єднань не дозволені для цього сайту",
|
|
49
49
|
"PROXY_BLOCKED": "Запити з проксі-серверів не дозволені для цього сайту",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Забагато запитів CAPTCHA з localhost для цього ключа сайту",
|
|
50
51
|
"TOR_BLOCKED": "Запити з вихідних вузлів Tor не дозволені для цього сайту",
|
|
51
52
|
"ABUSER_BLOCKED": "Запити з мереж, позначених за зловживання, не дозволені для цього сайту",
|
|
52
53
|
"DATACENTER_BLOCKED": "Запити з IP-адрес дата-центрів не дозволені для цього сайту",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Quá nhiều lượt gửi từ địa chỉ email này",
|
|
48
48
|
"VPN_BLOCKED": "Các yêu cầu từ kết nối VPN không được phép cho trang web này",
|
|
49
49
|
"PROXY_BLOCKED": "Các yêu cầu từ máy chủ proxy không được phép cho trang web này",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Quá nhiều yêu cầu CAPTCHA từ localhost cho khóa trang web này",
|
|
50
51
|
"TOR_BLOCKED": "Các yêu cầu từ nút thoát Tor không được phép cho trang web này",
|
|
51
52
|
"ABUSER_BLOCKED": "Các yêu cầu từ mạng bị gắn cờ lạm dụng không được phép cho trang web này",
|
|
52
53
|
"DATACENTER_BLOCKED": "Các yêu cầu từ địa chỉ IP trung tâm dữ liệu không được phép cho trang web này",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "该电子邮件地址提交次数过多",
|
|
48
48
|
"VPN_BLOCKED": "此网站不允许来自VPN连接的请求",
|
|
49
49
|
"PROXY_BLOCKED": "此网站不允许来自代理服务器的请求",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "此站点密钥来自 localhost 的 CAPTCHA 请求过多",
|
|
50
51
|
"TOR_BLOCKED": "此网站不允许来自Tor出口节点的请求",
|
|
51
52
|
"ABUSER_BLOCKED": "此网站不允许来自被标记为滥用的网络的请求",
|
|
52
53
|
"DATACENTER_BLOCKED": "此网站不允许来自数据中心IP地址的请求",
|
|
@@ -1,199 +1,244 @@
|
|
|
1
|
-
import { afterEach, describe, expect, test, vi } from "vitest";
|
|
2
|
-
const load = async (
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
|
+
const load = async (options) => {
|
|
3
3
|
vi.resetModules();
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
detectorOptions,
|
|
29
|
-
emit: (event) => {
|
|
30
|
-
for (const listener of listeners.get(event) ?? []) {
|
|
31
|
-
listener();
|
|
32
|
-
}
|
|
4
|
+
const requested = [];
|
|
5
|
+
const store = options.stored
|
|
6
|
+
? { i18nextLng: options.stored }
|
|
7
|
+
: {};
|
|
8
|
+
let cookie = options.cookie ? `i18next=${options.cookie}` : "";
|
|
9
|
+
vi.stubGlobal("fetch", vi.fn(async (url) => {
|
|
10
|
+
requested.push(url);
|
|
11
|
+
if (options.never) {
|
|
12
|
+
return new Promise(() => undefined);
|
|
13
|
+
}
|
|
14
|
+
if (options.fetchFails) {
|
|
15
|
+
throw new Error("network down");
|
|
16
|
+
}
|
|
17
|
+
const language = url.split("/").at(-2) ?? "";
|
|
18
|
+
const body = options.catalogues?.[language];
|
|
19
|
+
return {
|
|
20
|
+
ok: body !== undefined,
|
|
21
|
+
json: async () => body,
|
|
22
|
+
};
|
|
23
|
+
}));
|
|
24
|
+
vi.stubGlobal("localStorage", {
|
|
25
|
+
getItem: (key) => store[key] ?? null,
|
|
26
|
+
setItem: (key, value) => {
|
|
27
|
+
store[key] = value;
|
|
33
28
|
},
|
|
34
|
-
};
|
|
35
|
-
vi.
|
|
36
|
-
vi.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
default: class {
|
|
40
|
-
constructor(_services, opts) {
|
|
41
|
-
detectorOptions.push(opts);
|
|
42
|
-
}
|
|
29
|
+
});
|
|
30
|
+
vi.stubGlobal("navigator", { languages: options.languages ?? ["en"] });
|
|
31
|
+
vi.stubGlobal("document", {
|
|
32
|
+
get cookie() {
|
|
33
|
+
return cookie;
|
|
43
34
|
},
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
default: (loader) => {
|
|
47
|
-
resourceLoaders.push(loader);
|
|
48
|
-
return "InMemoryBackend";
|
|
35
|
+
set cookie(value) {
|
|
36
|
+
cookie = value;
|
|
49
37
|
},
|
|
50
|
-
})
|
|
51
|
-
vi.doMock("react-i18next", () => ({ initReactI18next: "initReactI18next" }));
|
|
38
|
+
});
|
|
52
39
|
const imported = await import("../i18nFrontend.js");
|
|
53
|
-
return {
|
|
40
|
+
return {
|
|
41
|
+
initializeI18n: imported.default,
|
|
42
|
+
requested,
|
|
43
|
+
cookie: () => cookie,
|
|
44
|
+
stored: () => store,
|
|
45
|
+
};
|
|
54
46
|
};
|
|
55
|
-
const
|
|
47
|
+
const initialised = async (harness, lng) => new Promise((resolve) => {
|
|
48
|
+
harness.initializeI18n(resolve, lng);
|
|
49
|
+
});
|
|
56
50
|
afterEach(() => {
|
|
51
|
+
vi.unstubAllGlobals();
|
|
57
52
|
vi.resetModules();
|
|
58
|
-
for (const module of [
|
|
59
|
-
"i18next",
|
|
60
|
-
"i18next-chained-backend",
|
|
61
|
-
"i18next-http-backend",
|
|
62
|
-
"i18next-browser-languagedetector",
|
|
63
|
-
"i18next-resources-to-backend",
|
|
64
|
-
"react-i18next",
|
|
65
|
-
]) {
|
|
66
|
-
vi.doUnmock(module);
|
|
67
|
-
}
|
|
68
53
|
});
|
|
69
|
-
describe("
|
|
70
|
-
test("
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
54
|
+
describe("choosing a language", () => {
|
|
55
|
+
test("uses the language the caller asked for", async () => {
|
|
56
|
+
const harness = await load({
|
|
57
|
+
catalogues: { fr: {}, en: {} },
|
|
58
|
+
languages: ["de"],
|
|
59
|
+
});
|
|
60
|
+
const i18n = await initialised(harness, "fr");
|
|
61
|
+
expect(i18n.language).toBe("fr");
|
|
62
|
+
});
|
|
63
|
+
test("prefers a cookie over the browser", async () => {
|
|
64
|
+
const harness = await load({
|
|
65
|
+
catalogues: { es: {}, en: {} },
|
|
66
|
+
cookie: "es",
|
|
67
|
+
stored: "de",
|
|
68
|
+
languages: ["it"],
|
|
69
|
+
});
|
|
70
|
+
expect((await initialised(harness)).language).toBe("es");
|
|
71
|
+
});
|
|
72
|
+
test("prefers stored over the browser", async () => {
|
|
73
|
+
const harness = await load({
|
|
74
|
+
catalogues: { de: {}, en: {} },
|
|
75
|
+
stored: "de",
|
|
76
|
+
languages: ["it"],
|
|
77
|
+
});
|
|
78
|
+
expect((await initialised(harness)).language).toBe("de");
|
|
79
|
+
});
|
|
80
|
+
test("falls back to the browser when nothing is remembered", async () => {
|
|
81
|
+
const harness = await load({
|
|
82
|
+
catalogues: { it: {}, en: {} },
|
|
83
|
+
languages: ["it"],
|
|
84
|
+
});
|
|
85
|
+
expect((await initialised(harness)).language).toBe("it");
|
|
86
|
+
});
|
|
87
|
+
test("resolves a regional tag to its base language", async () => {
|
|
88
|
+
const harness = await load({
|
|
89
|
+
catalogues: { en: {} },
|
|
90
|
+
languages: ["de-AT"],
|
|
91
|
+
});
|
|
92
|
+
expect((await initialised(harness)).language).toBe("de");
|
|
93
|
+
});
|
|
94
|
+
test("ignores a language with no catalogue", async () => {
|
|
95
|
+
const harness = await load({ catalogues: { en: {} }, languages: ["xx"] });
|
|
96
|
+
expect((await initialised(harness)).language).toBe("en");
|
|
97
|
+
});
|
|
98
|
+
test("remembers the language in both cookie and storage", async () => {
|
|
99
|
+
const harness = await load({ catalogues: { fr: {}, en: {} } });
|
|
100
|
+
await initialised(harness, "fr");
|
|
101
|
+
expect(harness.stored().i18nextLng).toBe("fr");
|
|
102
|
+
expect(harness.cookie()).toContain("i18next=fr");
|
|
93
103
|
});
|
|
94
104
|
});
|
|
95
|
-
describe("
|
|
96
|
-
test("
|
|
97
|
-
const {
|
|
98
|
-
|
|
99
|
-
expect(harness.
|
|
100
|
-
});
|
|
101
|
-
test("
|
|
102
|
-
const {
|
|
103
|
-
|
|
104
|
-
expect(harness.
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
105
|
+
describe("fetching catalogues", () => {
|
|
106
|
+
test("loads the active language from the directory the module came from", async () => {
|
|
107
|
+
const harness = await load({ catalogues: { fr: {}, en: {} } });
|
|
108
|
+
await initialised(harness, "fr");
|
|
109
|
+
expect(harness.requested.some((url) => url.endsWith("/locales/fr/translation.json"))).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
test("loads English alongside it, for keys a translation is missing", async () => {
|
|
112
|
+
const harness = await load({ catalogues: { fr: {}, en: {} } });
|
|
113
|
+
await initialised(harness, "fr");
|
|
114
|
+
expect(harness.requested).toHaveLength(2);
|
|
115
|
+
expect(harness.requested.some((url) => url.endsWith("/locales/en/translation.json"))).toBe(true);
|
|
116
|
+
});
|
|
117
|
+
test("fetches once when the active language is already English", async () => {
|
|
118
|
+
const harness = await load({ catalogues: { en: {} } });
|
|
119
|
+
await initialised(harness, "en");
|
|
120
|
+
expect(harness.requested).toHaveLength(1);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
describe("translating", () => {
|
|
124
|
+
test("reads a nested key by its dotted path", async () => {
|
|
125
|
+
const harness = await load({
|
|
126
|
+
catalogues: { en: { WIDGET: { I_AM_HUMAN: "I am human" } } },
|
|
127
|
+
});
|
|
128
|
+
expect((await initialised(harness)).t("WIDGET.I_AM_HUMAN")).toBe("I am human");
|
|
129
|
+
});
|
|
130
|
+
test("substitutes interpolation values", async () => {
|
|
131
|
+
const harness = await load({
|
|
132
|
+
catalogues: { en: { POSITION: "{{x}} across, {{y}} down" } },
|
|
117
133
|
});
|
|
134
|
+
expect((await initialised(harness)).t("POSITION", { x: 10, y: 20 })).toBe("10 across, 20 down");
|
|
118
135
|
});
|
|
119
|
-
test("
|
|
120
|
-
const
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
136
|
+
test("falls back to English when the translation lacks the key", async () => {
|
|
137
|
+
const harness = await load({
|
|
138
|
+
catalogues: { fr: { KEPT: "gardé" }, en: { KEPT: "kept", ONLY: "only" } },
|
|
139
|
+
});
|
|
140
|
+
const i18n = await initialised(harness, "fr");
|
|
141
|
+
expect(i18n.t("KEPT")).toBe("gardé");
|
|
142
|
+
expect(i18n.t("ONLY")).toBe("only");
|
|
143
|
+
});
|
|
144
|
+
test("falls back to the caller's default when no catalogue has the key", async () => {
|
|
145
|
+
const harness = await load({ catalogues: { en: {} } });
|
|
146
|
+
expect((await initialised(harness)).t("WIDGET.CHECKING", {
|
|
147
|
+
defaultValue: "Checking that you are human",
|
|
148
|
+
})).toBe("Checking that you are human");
|
|
149
|
+
});
|
|
150
|
+
test("interpolates the default too", async () => {
|
|
151
|
+
const harness = await load({ catalogues: { en: {} } });
|
|
152
|
+
expect((await initialised(harness)).t("POSITION", {
|
|
153
|
+
defaultValue: "{{x}} across",
|
|
154
|
+
x: 7,
|
|
155
|
+
})).toBe("7 across");
|
|
156
|
+
});
|
|
157
|
+
test("falls back to the key when there is no default either", async () => {
|
|
158
|
+
const harness = await load({ catalogues: { en: {} } });
|
|
159
|
+
expect((await initialised(harness)).t("WIDGET.MISSING")).toBe("WIDGET.MISSING");
|
|
160
|
+
});
|
|
161
|
+
test("leaves a placeholder alone when no value was supplied for it", async () => {
|
|
162
|
+
const harness = await load({
|
|
163
|
+
catalogues: { en: { GREET: "hello {{name}}" } },
|
|
124
164
|
});
|
|
165
|
+
expect((await initialised(harness)).t("GREET", { other: 1 })).toBe("hello {{name}}");
|
|
125
166
|
});
|
|
126
167
|
});
|
|
127
|
-
describe("
|
|
128
|
-
test("
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
expect(
|
|
133
|
-
});
|
|
134
|
-
test("
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
const backend = backendOf(harness.initOptions[0]);
|
|
138
|
-
const loadPath = backend.backendOptions?.[0]?.loadPath;
|
|
139
|
-
expect(loadPath).toContain("/locales/{{lng}}/{{ns}}.json");
|
|
140
|
-
});
|
|
141
|
-
test("derives the load path from the module URL, not the page URL", async () => {
|
|
142
|
-
const { initializeI18n, harness } = await load();
|
|
143
|
-
initializeI18n();
|
|
144
|
-
const loadPath = backendOf(harness.initOptions[0]).backendOptions?.[0]
|
|
145
|
-
?.loadPath;
|
|
146
|
-
expect(loadPath).toMatch(/^[a-z]+:\/\//);
|
|
147
|
-
expect(loadPath).not.toContain("i18nFrontend");
|
|
148
|
-
});
|
|
149
|
-
test("hands resourcesToBackend a loader that resolves a language and namespace", async () => {
|
|
150
|
-
const { initializeI18n, harness } = await load();
|
|
151
|
-
initializeI18n();
|
|
152
|
-
const loader = harness.resourceLoaders[0];
|
|
153
|
-
expect(loader).toBeTypeOf("function");
|
|
154
|
-
await expect(Promise.resolve(loader?.("en", "translation")).catch(() => undefined)).resolves.not.toThrow();
|
|
168
|
+
describe("when the catalogue cannot be fetched", () => {
|
|
169
|
+
test("still initialises, so the widget renders untranslated", async () => {
|
|
170
|
+
const harness = await load({ catalogues: {}, fetchFails: true });
|
|
171
|
+
const i18n = await initialised(harness);
|
|
172
|
+
expect(i18n.isInitialized).toBe(true);
|
|
173
|
+
expect(i18n.t("WIDGET.CHECKING", { defaultValue: "Checking" })).toBe("Checking");
|
|
174
|
+
});
|
|
175
|
+
test("reports the namespace as loaded so callers stop waiting", async () => {
|
|
176
|
+
const harness = await load({ catalogues: {}, fetchFails: true });
|
|
177
|
+
expect((await initialised(harness)).hasLoadedNamespace("translation")).toBe(true);
|
|
155
178
|
});
|
|
156
179
|
});
|
|
157
|
-
describe("
|
|
158
|
-
test("
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
expect(
|
|
180
|
+
describe("switching language", () => {
|
|
181
|
+
test("loads the new catalogue and translates against it", async () => {
|
|
182
|
+
const harness = await load({
|
|
183
|
+
catalogues: { en: { YES: "yes" }, de: { YES: "ja" } },
|
|
184
|
+
});
|
|
185
|
+
const i18n = await initialised(harness, "en");
|
|
186
|
+
await i18n.changeLanguage("de");
|
|
187
|
+
expect(i18n.language).toBe("de");
|
|
188
|
+
expect(i18n.t("YES")).toBe("ja");
|
|
189
|
+
});
|
|
190
|
+
test("notifies subscribers", async () => {
|
|
191
|
+
const harness = await load({ catalogues: { en: {}, de: {} } });
|
|
192
|
+
const i18n = await initialised(harness, "en");
|
|
193
|
+
const listener = vi.fn();
|
|
194
|
+
i18n.on("languageChanged", listener);
|
|
195
|
+
await i18n.changeLanguage("de");
|
|
196
|
+
expect(listener).toHaveBeenCalled();
|
|
197
|
+
});
|
|
198
|
+
test("does nothing when the language is already active", async () => {
|
|
199
|
+
const harness = await load({ catalogues: { en: {} } });
|
|
200
|
+
const i18n = await initialised(harness, "en");
|
|
201
|
+
const before = harness.requested.length;
|
|
202
|
+
await i18n.changeLanguage("en");
|
|
203
|
+
expect(harness.requested).toHaveLength(before);
|
|
204
|
+
});
|
|
205
|
+
test("unsubscribed listeners stop being called", async () => {
|
|
206
|
+
const harness = await load({ catalogues: { en: {}, de: {} } });
|
|
207
|
+
const i18n = await initialised(harness, "en");
|
|
208
|
+
const listener = vi.fn();
|
|
209
|
+
i18n.on("languageChanged", listener);
|
|
210
|
+
i18n.off("languageChanged", listener);
|
|
211
|
+
await i18n.changeLanguage("de");
|
|
212
|
+
expect(listener).not.toHaveBeenCalled();
|
|
165
213
|
});
|
|
166
|
-
|
|
214
|
+
});
|
|
215
|
+
describe("the singleton", () => {
|
|
216
|
+
test("a second call reuses the instance rather than refetching", async () => {
|
|
217
|
+
const harness = await load({ catalogues: { en: {} } });
|
|
218
|
+
const first = await initialised(harness);
|
|
219
|
+
const before = harness.requested.length;
|
|
220
|
+
const second = harness.initializeI18n();
|
|
221
|
+
expect(second).toBe(first);
|
|
222
|
+
expect(harness.requested).toHaveLength(before);
|
|
223
|
+
});
|
|
224
|
+
test("a second call still fires its callback", async () => {
|
|
225
|
+
const harness = await load({ catalogues: { en: {} } });
|
|
226
|
+
await initialised(harness);
|
|
167
227
|
const callback = vi.fn();
|
|
168
|
-
|
|
169
|
-
initializeI18n(callback);
|
|
170
|
-
harness.emit("loaded");
|
|
171
|
-
harness.emit("loaded");
|
|
228
|
+
harness.initializeI18n(callback);
|
|
172
229
|
expect(callback).toHaveBeenCalledTimes(1);
|
|
173
230
|
});
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
231
|
+
});
|
|
232
|
+
describe("before the catalogue arrives", () => {
|
|
233
|
+
let harness;
|
|
234
|
+
beforeEach(async () => {
|
|
235
|
+
harness = await load({ never: true });
|
|
178
236
|
});
|
|
179
|
-
test("
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
expect(harness.
|
|
184
|
-
expect(callback).toHaveBeenCalledTimes(1);
|
|
185
|
-
expect(callback).toHaveBeenCalledWith(harness.fake);
|
|
186
|
-
expect(returned).toBe(harness.fake);
|
|
187
|
-
});
|
|
188
|
-
test("registers no plugins when already initialised", async () => {
|
|
189
|
-
const { initializeI18n, harness } = await load(true);
|
|
190
|
-
initializeI18n();
|
|
191
|
-
expect(harness.plugins).toHaveLength(0);
|
|
192
|
-
});
|
|
193
|
-
test("ignores lng when already initialised — the caller reconciles instead", async () => {
|
|
194
|
-
const { initializeI18n, harness } = await load(true);
|
|
195
|
-
initializeI18n(undefined, "fr");
|
|
196
|
-
expect(harness.initOptions).toHaveLength(0);
|
|
237
|
+
test("reports itself uninitialised", () => {
|
|
238
|
+
expect(harness.initializeI18n().isInitialized).toBe(false);
|
|
239
|
+
});
|
|
240
|
+
test("reports the namespace as not loaded", () => {
|
|
241
|
+
expect(harness.initializeI18n().hasLoadedNamespace("translation")).toBe(false);
|
|
197
242
|
});
|
|
198
243
|
});
|
|
199
244
|
//# sourceMappingURL=i18nFrontend.unit.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18nFrontend.unit.test.js","sourceRoot":"","sources":["../../src/tests/i18nFrontend.unit.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"i18nFrontend.unit.test.js","sourceRoot":"","sources":["../../src/tests/i18nFrontend.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ const load = async (options) => {
|
|
|
5
5
|
const instance = asI18n({ name: "the singleton" });
|
|
6
6
|
const handleCalls = [];
|
|
7
7
|
const handler = (() => { });
|
|
8
|
+
let loaded = false;
|
|
9
|
+
vi.doMock("i18next", () => ({ default: instance }));
|
|
8
10
|
vi.doMock("i18next-http-middleware", () => ({
|
|
9
11
|
handle: (i18next, opts) => {
|
|
10
12
|
handleCalls.push([i18next, opts]);
|
|
@@ -16,28 +18,35 @@ const load = async (options) => {
|
|
|
16
18
|
if (options.loadRejects) {
|
|
17
19
|
throw new Error("i18n failed to load");
|
|
18
20
|
}
|
|
21
|
+
loaded = true;
|
|
19
22
|
return instance;
|
|
20
23
|
},
|
|
21
24
|
}));
|
|
22
25
|
const imported = await import("../i18nMiddleware.js");
|
|
23
26
|
return {
|
|
24
27
|
i18nMiddleware: imported.default,
|
|
25
|
-
harness: { instance, handleCalls, handler },
|
|
28
|
+
harness: { instance, handleCalls, handler, loaded: () => loaded },
|
|
26
29
|
};
|
|
27
30
|
};
|
|
28
31
|
afterEach(() => {
|
|
29
32
|
vi.resetModules();
|
|
30
33
|
vi.doUnmock("i18next-http-middleware");
|
|
31
34
|
vi.doUnmock("../loadI18next.js");
|
|
35
|
+
vi.doUnmock("i18next");
|
|
32
36
|
});
|
|
33
37
|
describe("i18nMiddleware", () => {
|
|
34
|
-
test("builds the handler from the
|
|
38
|
+
test("builds the handler from the i18next singleton", async () => {
|
|
35
39
|
const { i18nMiddleware, harness } = await load({});
|
|
36
40
|
const handler = await i18nMiddleware({});
|
|
37
41
|
expect(harness.handleCalls).toHaveLength(1);
|
|
38
42
|
expect(harness.handleCalls[0]?.[0]).toBe(harness.instance);
|
|
39
43
|
expect(handler).toBe(harness.handler);
|
|
40
44
|
});
|
|
45
|
+
test("waits for the resources before handing the instance over", async () => {
|
|
46
|
+
const { i18nMiddleware, harness } = await load({});
|
|
47
|
+
await i18nMiddleware({});
|
|
48
|
+
expect(harness.loaded()).toBe(true);
|
|
49
|
+
});
|
|
41
50
|
test("forwards the caller's options", async () => {
|
|
42
51
|
const { i18nMiddleware, harness } = await load({});
|
|
43
52
|
const options = { ignoreRoutes: ["/healthz"] };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18nMiddleware.unit.test.js","sourceRoot":"","sources":["../../src/tests/i18nMiddleware.unit.test.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAK/D,MAAM,MAAM,GAAG,CAAC,KAAa,EAAQ,EAAE,CAAC,KAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"i18nMiddleware.unit.test.js","sourceRoot":"","sources":["../../src/tests/i18nMiddleware.unit.test.ts"],"names":[],"mappings":"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"}
|