@prosopo/locale 3.4.3 → 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.
- package/.turbo/turbo-build$colon$cjs.log +6 -6
- package/.turbo/turbo-build$colon$tsc.log +5 -5
- package/.turbo/turbo-build.log +6 -6
- package/CHANGELOG.md +27 -0
- package/dist/cjs/i18nFrontend.cjs +11 -15
- package/dist/cjs/index.cjs +2 -2
- package/dist/cjs/locales/en/translation.cjs +1 -0
- package/dist/cjs/translator.cjs +30 -0
- package/dist/i18nFrontend.d.ts.map +1 -1
- package/dist/i18nFrontend.js +11 -15
- package/dist/i18nFrontend.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.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 +2 -5
- package/dist/tests/i18nFrontend.unit.test.js.map +1 -1
- package/dist/tests/locale.test-d.js +13 -10
- package/dist/tests/locale.test-d.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/translator.d.ts +10 -0
- package/dist/translator.d.ts.map +1 -0
- package/dist/translator.js +30 -0
- package/dist/translator.js.map +1 -0
- package/package.json +2 -3
- package/src/i18nFrontend.ts +3 -8
- package/src/index.ts +2 -1
- package/src/loadI18next.ts +1 -1
- 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 +2 -5
- package/src/tests/locale.test-d.ts +12 -9
- package/src/tests/translator.unit.test.ts +213 -0
- package/src/translator.ts +69 -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": "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地址的请求",
|
|
@@ -48,7 +48,6 @@ const load = async (isInitialized = false) => {
|
|
|
48
48
|
return "InMemoryBackend";
|
|
49
49
|
},
|
|
50
50
|
}));
|
|
51
|
-
vi.doMock("react-i18next", () => ({ initReactI18next: "initReactI18next" }));
|
|
52
51
|
const imported = await import("../i18nFrontend.js");
|
|
53
52
|
return { initializeI18n: imported.default, harness };
|
|
54
53
|
};
|
|
@@ -61,7 +60,6 @@ afterEach(() => {
|
|
|
61
60
|
"i18next-http-backend",
|
|
62
61
|
"i18next-browser-languagedetector",
|
|
63
62
|
"i18next-resources-to-backend",
|
|
64
|
-
"react-i18next",
|
|
65
63
|
]) {
|
|
66
64
|
vi.doUnmock(module);
|
|
67
65
|
}
|
|
@@ -72,12 +70,11 @@ describe("i18nFrontend, first initialisation", () => {
|
|
|
72
70
|
initializeI18n();
|
|
73
71
|
expect(harness.initOptions).toHaveLength(1);
|
|
74
72
|
});
|
|
75
|
-
test("registers the chained backend
|
|
73
|
+
test("registers the chained backend and the language detector", async () => {
|
|
76
74
|
const { initializeI18n, harness } = await load();
|
|
77
75
|
initializeI18n();
|
|
78
|
-
expect(harness.plugins).toHaveLength(
|
|
76
|
+
expect(harness.plugins).toHaveLength(2);
|
|
79
77
|
expect(harness.plugins[0]).toBe("ChainedBackend");
|
|
80
|
-
expect(harness.plugins[2]).toBe("initReactI18next");
|
|
81
78
|
});
|
|
82
79
|
test("carries the shared options through to init", async () => {
|
|
83
80
|
const { initializeI18n, harness } = await load();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18nFrontend.unit.test.js","sourceRoot":"","sources":["../../src/tests/i18nFrontend.unit.test.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAyB/D,MAAM,IAAI,GAAG,KAAK,EACjB,aAAa,GAAG,KAAK,EAInB,EAAE;IACJ,EAAE,CAAC,YAAY,EAAE,CAAC;IAElB,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAkB,EAAE,CAAC;IACtC,MAAM,eAAe,GAAqB,EAAE,CAAC;IAC7C,MAAM,eAAe,GAAc,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEhD,MAAM,IAAI,GAAa;QACtB,aAAa;QACb,GAAG,EAAE,CAAC,MAAe,EAAY,EAAE;YAClC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,IAAI,EAAE,CAAC,OAAoB,EAAY,EAAE;YACxC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1B,OAAO,IAAI,CAAC;QACb,CAAC;QACD,EAAE,EAAE,CAAC,KAAa,EAAE,QAAkB,EAAQ,EAAE;YAC/C,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACnE,CAAC;KACD,CAAC;IAEF,MAAM,OAAO,GAAY;QACxB,IAAI;QACJ,OAAO;QACP,WAAW;QACX,eAAe;QACf,eAAe;QACf,IAAI,EAAE,CAAC,KAAa,EAAQ,EAAE;YAC7B,KAAK,MAAM,QAAQ,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;gBACnD,QAAQ,EAAE,CAAC;YACZ,CAAC;QACF,CAAC;KACD,CAAC;IAEF,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,EAAE,CAAC,MAAM,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;IAC5E,EAAE,CAAC,MAAM,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;IACtE,EAAE,CAAC,MAAM,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC,CAAC;QACpD,OAAO,EAAE;YACR,YAAY,SAAkB,EAAE,IAAa;gBAC5C,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;SACD;KACD,CAAC,CAAC,CAAC;IACJ,EAAE,CAAC,MAAM,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC;QAChD,OAAO,EAAE,CAAC,MAAsB,EAAU,EAAE;YAC3C,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC7B,OAAO,iBAAiB,CAAC;QAC1B,CAAC;KACD,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"i18nFrontend.unit.test.js","sourceRoot":"","sources":["../../src/tests/i18nFrontend.unit.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { assertType, describe, expectTypeOf, it } from "vitest";
|
|
2
|
-
import { LanguageSchema, Languages, TranslationKeysSchema, i18nMiddleware, isClientSide, loadI18next,
|
|
2
|
+
import { LanguageSchema, Languages, TranslationKeysSchema, createTranslator, i18nMiddleware, isClientSide, loadI18next, } from "../index.js";
|
|
3
3
|
describe("Languages", () => {
|
|
4
4
|
it("is a frozen const map of name to code, not a widened record", () => {
|
|
5
5
|
expectTypeOf(Languages.english).toEqualTypeOf();
|
|
@@ -74,15 +74,18 @@ describe("i18nMiddleware", () => {
|
|
|
74
74
|
i18nMiddleware();
|
|
75
75
|
});
|
|
76
76
|
});
|
|
77
|
-
describe("
|
|
78
|
-
it("is callable with no
|
|
79
|
-
expectTypeOf(
|
|
80
|
-
});
|
|
81
|
-
it("returns
|
|
82
|
-
expectTypeOf(
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
77
|
+
describe("createTranslator", () => {
|
|
78
|
+
it("is callable with no instance, so a standalone widget can boot one", () => {
|
|
79
|
+
expectTypeOf(createTranslator).toBeCallableWith();
|
|
80
|
+
});
|
|
81
|
+
it("returns the translator surface the widgets render against", () => {
|
|
82
|
+
expectTypeOf(createTranslator).returns.toHaveProperty("t");
|
|
83
|
+
expectTypeOf(createTranslator).returns.toHaveProperty("isReady");
|
|
84
|
+
expectTypeOf(createTranslator).returns.toHaveProperty("subscribe");
|
|
85
|
+
expectTypeOf(createTranslator).returns.toHaveProperty("i18n");
|
|
86
|
+
});
|
|
87
|
+
it("rejects anything that is not an i18next instance", () => {
|
|
88
|
+
createTranslator({ notAnInstance: 1 });
|
|
86
89
|
});
|
|
87
90
|
});
|
|
88
91
|
//# sourceMappingURL=locale.test-d.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"locale.test-d.js","sourceRoot":"","sources":["../../src/tests/locale.test-d.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,EACN,cAAc,EACd,SAAS,EAGT,qBAAqB,EACrB,cAAc,EACd,YAAY,EACZ,WAAW,
|
|
1
|
+
{"version":3,"file":"locale.test-d.js","sourceRoot":"","sources":["../../src/tests/locale.test-d.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAChE,OAAO,EACN,cAAc,EACd,SAAS,EAGT,qBAAqB,EACrB,gBAAgB,EAChB,cAAc,EACd,YAAY,EACZ,WAAW,GACX,MAAM,aAAa,CAAC;AAErB,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QAItE,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,aAAa,EAAQ,CAAC;QACtD,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,aAAa,EAAW,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QAEvC,SAAS,CAAC,OAAO,GAAG,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAE3D,SAAS,CAAC,OAAO,CAAC;IACnB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAI7B,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAU,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC7C,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,QAAQ,EAA0B,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACtD,YAAY,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,YAAY,EAAkB,CAAC,aAAa,EAEzC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAGlE,UAAU,CAAiB,aAAa,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAG1D,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAqB,CAAC;IAC3E,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QACnD,YAAY,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,aAAa,EAAM,CAAC;QAC1D,YAAY,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,aAAa,EAAW,CAAC;IAC7D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACpC,YAAY,CAAC,WAAW,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACjD,YAAY,CAAC,WAAW,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAE3C,WAAW,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAG/C,WAAW,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACvE,YAAY,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,aAAa,EAAkB,CAAC;IACnE,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACrD,YAAY,EAAS,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC1C,YAAY,EAAS,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACjD,YAAY,EAAS,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QACnE,YAAY,CAAC,cAAc,CAAC,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAClD,YAAY,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAoB,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QAEpC,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAE/C,cAAc,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC5E,YAAY,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACpE,YAAY,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QAC3D,YAAY,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACjE,YAAY,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC;QACnE,YAAY,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAE3D,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translator.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/translator.unit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { afterEach, describe, expect, test, vi } from "vitest";
|
|
2
|
+
const fakeI18n = () => {
|
|
3
|
+
const handlers = new Map();
|
|
4
|
+
const fake = {
|
|
5
|
+
handlers,
|
|
6
|
+
isInitialized: true,
|
|
7
|
+
loadedNamespaces: ["translation"],
|
|
8
|
+
translations: {},
|
|
9
|
+
instance: {
|
|
10
|
+
t: (key) => fake.translations[key] ?? key,
|
|
11
|
+
get isInitialized() {
|
|
12
|
+
return fake.isInitialized;
|
|
13
|
+
},
|
|
14
|
+
hasLoadedNamespace: (namespace) => fake.loadedNamespaces.includes(namespace),
|
|
15
|
+
on: (event, listener) => {
|
|
16
|
+
const existing = handlers.get(event) ?? new Set();
|
|
17
|
+
existing.add(listener);
|
|
18
|
+
handlers.set(event, existing);
|
|
19
|
+
},
|
|
20
|
+
off: (event, listener) => {
|
|
21
|
+
handlers.get(event)?.delete(listener);
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
return fake;
|
|
26
|
+
};
|
|
27
|
+
const emit = (fake, event) => {
|
|
28
|
+
for (const listener of fake.handlers.get(event) ?? []) {
|
|
29
|
+
listener();
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
const load = async () => {
|
|
33
|
+
vi.resetModules();
|
|
34
|
+
const packageInstance = fakeI18n().instance;
|
|
35
|
+
let initCalls = 0;
|
|
36
|
+
vi.doMock("../i18nFrontend.js", () => ({
|
|
37
|
+
default: () => {
|
|
38
|
+
initCalls += 1;
|
|
39
|
+
return packageInstance;
|
|
40
|
+
},
|
|
41
|
+
}));
|
|
42
|
+
const imported = await import("../translator.js");
|
|
43
|
+
return {
|
|
44
|
+
createTranslator: imported.createTranslator,
|
|
45
|
+
packageInstance,
|
|
46
|
+
initCount: () => initCalls,
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
afterEach(() => {
|
|
50
|
+
vi.resetModules();
|
|
51
|
+
vi.doUnmock("../i18nFrontend.js");
|
|
52
|
+
});
|
|
53
|
+
describe("which i18next instance the translator talks to", () => {
|
|
54
|
+
test("initialises the package's own instance when given none", async () => {
|
|
55
|
+
const { createTranslator, packageInstance, initCount } = await load();
|
|
56
|
+
const translator = createTranslator();
|
|
57
|
+
expect(translator.i18n).toBe(packageInstance);
|
|
58
|
+
expect(initCount()).toBe(1);
|
|
59
|
+
});
|
|
60
|
+
test("adopts an instance the caller already has", async () => {
|
|
61
|
+
const { createTranslator, initCount } = await load();
|
|
62
|
+
const existing = fakeI18n().instance;
|
|
63
|
+
const translator = createTranslator(existing);
|
|
64
|
+
expect(translator.i18n).toBe(existing);
|
|
65
|
+
expect(initCount()).toBe(0);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
describe("translating", () => {
|
|
69
|
+
test("delegates to the instance", async () => {
|
|
70
|
+
const { createTranslator } = await load();
|
|
71
|
+
const fake = fakeI18n();
|
|
72
|
+
fake.translations = { "WIDGET.SUBMIT": "Submit" };
|
|
73
|
+
expect(createTranslator(fake.instance).t("WIDGET.SUBMIT")).toBe("Submit");
|
|
74
|
+
});
|
|
75
|
+
test("reads the instance at call time, not at creation time", async () => {
|
|
76
|
+
const { createTranslator } = await load();
|
|
77
|
+
const fake = fakeI18n();
|
|
78
|
+
const translator = createTranslator(fake.instance);
|
|
79
|
+
fake.translations = { "WIDGET.SUBMIT": "Envoyer" };
|
|
80
|
+
expect(translator.t("WIDGET.SUBMIT")).toBe("Envoyer");
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe("readiness", () => {
|
|
84
|
+
test("is ready once the instance has loaded the translation namespace", async () => {
|
|
85
|
+
const { createTranslator } = await load();
|
|
86
|
+
const fake = fakeI18n();
|
|
87
|
+
expect(createTranslator(fake.instance).isReady()).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
test("is not ready before initialisation", async () => {
|
|
90
|
+
const { createTranslator } = await load();
|
|
91
|
+
const fake = fakeI18n();
|
|
92
|
+
fake.isInitialized = false;
|
|
93
|
+
expect(createTranslator(fake.instance).isReady()).toBe(false);
|
|
94
|
+
});
|
|
95
|
+
test("is not ready while the namespace is still loading", async () => {
|
|
96
|
+
const { createTranslator } = await load();
|
|
97
|
+
const fake = fakeI18n();
|
|
98
|
+
fake.loadedNamespaces = [];
|
|
99
|
+
expect(createTranslator(fake.instance).isReady()).toBe(false);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
describe("subscribing", () => {
|
|
103
|
+
test.each(["initialized", "loaded", "languageChanged"])("notifies the listener on %s", async (event) => {
|
|
104
|
+
const { createTranslator } = await load();
|
|
105
|
+
const fake = fakeI18n();
|
|
106
|
+
const listener = vi.fn();
|
|
107
|
+
createTranslator(fake.instance).subscribe(listener);
|
|
108
|
+
emit(fake, event);
|
|
109
|
+
expect(listener).toHaveBeenCalledTimes(1);
|
|
110
|
+
});
|
|
111
|
+
test("stops notifying once unsubscribed", async () => {
|
|
112
|
+
const { createTranslator } = await load();
|
|
113
|
+
const fake = fakeI18n();
|
|
114
|
+
const listener = vi.fn();
|
|
115
|
+
const unsubscribe = createTranslator(fake.instance).subscribe(listener);
|
|
116
|
+
unsubscribe();
|
|
117
|
+
emit(fake, "languageChanged");
|
|
118
|
+
expect(listener).not.toHaveBeenCalled();
|
|
119
|
+
});
|
|
120
|
+
test("keeps independent subscriptions apart", async () => {
|
|
121
|
+
const { createTranslator } = await load();
|
|
122
|
+
const fake = fakeI18n();
|
|
123
|
+
const first = vi.fn();
|
|
124
|
+
const second = vi.fn();
|
|
125
|
+
const translator = createTranslator(fake.instance);
|
|
126
|
+
const unsubscribeFirst = translator.subscribe(first);
|
|
127
|
+
translator.subscribe(second);
|
|
128
|
+
unsubscribeFirst();
|
|
129
|
+
emit(fake, "loaded");
|
|
130
|
+
expect(first).not.toHaveBeenCalled();
|
|
131
|
+
expect(second).toHaveBeenCalledTimes(1);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
//# sourceMappingURL=translator.unit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translator.unit.test.js","sourceRoot":"","sources":["../../src/tests/translator.unit.test.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAgB/D,MAAM,QAAQ,GAAG,GAAa,EAAE;IAC/B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA2B,CAAC;IACpD,MAAM,IAAI,GAAa;QACtB,QAAQ;QACR,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE,CAAC,aAAa,CAAC;QACjC,YAAY,EAAE,EAAE;QAChB,QAAQ,EAAE;YACT,CAAC,EAAE,CAAC,GAAW,EAAU,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG;YACzD,IAAI,aAAa;gBAChB,OAAO,IAAI,CAAC,aAAa,CAAC;YAC3B,CAAC;YACD,kBAAkB,EAAE,CAAC,SAAiB,EAAW,EAAE,CAClD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC1C,EAAE,EAAE,CAAC,KAAa,EAAE,QAAoB,EAAQ,EAAE;gBACjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,EAAc,CAAC;gBAC9D,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC/B,CAAC;YACD,GAAG,EAAE,CAAC,KAAa,EAAE,QAAoB,EAAQ,EAAE;gBAClD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;SACkB;KACpB,CAAC;IACF,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,IAAc,EAAE,KAAa,EAAQ,EAAE;IACpD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QACvD,QAAQ,EAAE,CAAC;IACZ,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,KAAK,IAIf,EAAE;IACJ,EAAE,CAAC,YAAY,EAAE,CAAC;IAElB,MAAM,eAAe,GAAG,QAAQ,EAAE,CAAC,QAAQ,CAAC;IAC5C,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,EAAE,CAAC,MAAM,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;QACtC,OAAO,EAAE,GAAS,EAAE;YACnB,SAAS,IAAI,CAAC,CAAC;YACf,OAAO,eAAe,CAAC;QACxB,CAAC;KACD,CAAC,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAClD,OAAO;QACN,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;QAC3C,eAAe;QACf,SAAS,EAAE,GAAW,EAAE,CAAC,SAAS;KAClC,CAAC;AACH,CAAC,CAAC;AAEF,SAAS,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,YAAY,EAAE,CAAC;IAClB,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC/D,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QAGzE,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAEtE,MAAM,UAAU,GAAG,gBAAgB,EAAE,CAAC;QAEtC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QAG5D,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,QAAQ,EAAE,CAAC,QAAQ,CAAC;QAErC,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE9C,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC5B,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,YAAY,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;QAElD,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QAGxE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnD,IAAI,CAAC,YAAY,GAAG,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC;QAEnD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IAC1B,IAAI,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QAExB,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAE3B,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAGpE,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;QAE3B,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC5B,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,iBAAiB,CAAC,CAAC,CACtD,6BAA6B,EAC7B,KAAK,EAAE,KAAa,EAAE,EAAE;QACvB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAc,CAAC;QAErC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAElB,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CACD,CAAC;IAEF,IAAI,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAGpD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAc,CAAC;QAErC,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxE,WAAW,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;QAE9B,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,EAAE,CAAC,EAAE,EAAc,CAAC;QAClC,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,EAAc,CAAC;QACnC,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEnD,MAAM,gBAAgB,GAAG,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACrD,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC7B,gBAAgB,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAErB,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TOptions } from "i18next";
|
|
2
|
+
import type { Ti18n } from "./loadI18next.js";
|
|
3
|
+
export interface Translator {
|
|
4
|
+
t(key: string, options?: TOptions): string;
|
|
5
|
+
isReady(): boolean;
|
|
6
|
+
subscribe(listener: () => void): () => void;
|
|
7
|
+
readonly i18n: Ti18n;
|
|
8
|
+
}
|
|
9
|
+
export declare const createTranslator: (existing?: Ti18n) => Translator;
|
|
10
|
+
//# sourceMappingURL=translator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAI9C,MAAM,WAAW,UAAU;IAM1B,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAM3C,OAAO,IAAI,OAAO,CAAC;IAKnB,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;CACrB;AAOD,eAAO,MAAM,gBAAgB,cAAe,KAAK,KAAG,UAsBnD,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import initializeI18n from "./i18nFrontend.js";
|
|
2
|
+
//#region src/translator.ts
|
|
3
|
+
var NAMESPACE = "translation";
|
|
4
|
+
/**
|
|
5
|
+
* Vanilla replacement for the `useTranslation` hook. i18next is already
|
|
6
|
+
* framework-agnostic and event-driven; this just exposes its `t` plus the three
|
|
7
|
+
* events that used to trigger a React re-render.
|
|
8
|
+
*/
|
|
9
|
+
var createTranslator = (existing) => {
|
|
10
|
+
const i18n = existing ?? initializeI18n();
|
|
11
|
+
const isReady = () => i18n.isInitialized && i18n.hasLoadedNamespace(NAMESPACE);
|
|
12
|
+
return {
|
|
13
|
+
t: (key, options) => i18n.t(key, options),
|
|
14
|
+
isReady,
|
|
15
|
+
i18n,
|
|
16
|
+
subscribe: (listener) => {
|
|
17
|
+
const events = [
|
|
18
|
+
"initialized",
|
|
19
|
+
"loaded",
|
|
20
|
+
"languageChanged"
|
|
21
|
+
];
|
|
22
|
+
for (const event of events) i18n.on(event, listener);
|
|
23
|
+
return () => {
|
|
24
|
+
for (const event of events) i18n.off(event, listener);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { createTranslator };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translator.js","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"AAeA,OAAO,cAAc,MAAM,mBAAmB,CAAC;AAG/C,MAAM,SAAS,GAAG,aAAa,CAAC;AA4BhC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAc,EAAE;IAChE,MAAM,IAAI,GAAU,QAAQ,IAAI,cAAc,EAAE,CAAC;IAEjD,MAAM,OAAO,GAAG,GAAY,EAAE,CAC7B,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAE1D,OAAO;QACN,CAAC,EAAE,CAAC,GAAW,EAAE,OAAkB,EAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC;QACpE,OAAO;QACP,IAAI;QACJ,SAAS,EAAE,CAAC,QAAoB,EAAgB,EAAE;YACjD,MAAM,MAAM,GAAG,CAAC,aAAa,EAAE,QAAQ,EAAE,iBAAiB,CAAU,CAAC;YACrE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC5B,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC1B,CAAC;YACD,OAAO,GAAG,EAAE;gBACX,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC5B,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;gBAC3B,CAAC;YACF,CAAC,CAAC;QACH,CAAC;KACD,CAAC;AACH,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/locale",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
4
|
"description": "Prosopo locale library",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -39,11 +39,10 @@
|
|
|
39
39
|
"i18next-http-backend": "3.0.2",
|
|
40
40
|
"i18next-http-middleware": "3.9.9",
|
|
41
41
|
"i18next-resources-to-backend": "1.2.3",
|
|
42
|
-
"react-i18next": "17.0.13",
|
|
43
42
|
"zod": "3.23.8"
|
|
44
43
|
},
|
|
45
44
|
"devDependencies": {
|
|
46
|
-
"@prosopo/config": "3.
|
|
45
|
+
"@prosopo/config": "3.4.0",
|
|
47
46
|
"@types/node": "22.10.2",
|
|
48
47
|
"@vitest/coverage-v8": "4.1.11",
|
|
49
48
|
"concurrently": "9.0.1",
|
package/src/i18nFrontend.ts
CHANGED
|
@@ -17,13 +17,9 @@ import I18nextBrowserLanguageDetector from "i18next-browser-languagedetector";
|
|
|
17
17
|
import ChainedBackend from "i18next-chained-backend";
|
|
18
18
|
import HttpBackend from "i18next-http-backend";
|
|
19
19
|
import resourcesToBackend from "i18next-resources-to-backend";
|
|
20
|
-
import { initReactI18next } from "react-i18next";
|
|
21
20
|
import { i18nSharedOptions } from "./i18SharedOptions.js";
|
|
22
21
|
|
|
23
|
-
const
|
|
24
|
-
react: {
|
|
25
|
-
useSuspense: true,
|
|
26
|
-
},
|
|
22
|
+
const detectionOptions: InitOptions = {
|
|
27
23
|
detection: {
|
|
28
24
|
order: ["navigator", "htmlTag", "path", "subdomain"],
|
|
29
25
|
caches: ["localStorage", "cookie"],
|
|
@@ -52,7 +48,6 @@ export function initializeI18n(
|
|
|
52
48
|
caches: ["localStorage", "cookie"],
|
|
53
49
|
}),
|
|
54
50
|
)
|
|
55
|
-
.use(initReactI18next)
|
|
56
51
|
.init({
|
|
57
52
|
...i18nSharedOptions,
|
|
58
53
|
// When the site owner has resolved a language upfront (via widget
|
|
@@ -77,7 +72,7 @@ export function initializeI18n(
|
|
|
77
72
|
},
|
|
78
73
|
],
|
|
79
74
|
},
|
|
80
|
-
...
|
|
75
|
+
...detectionOptions,
|
|
81
76
|
} as InitOptions);
|
|
82
77
|
// "loaded" fires once per namespace, and again after changeLanguage(),
|
|
83
78
|
// so the raw event is not the one-shot signal the callback expects.
|
|
@@ -92,7 +87,7 @@ export function initializeI18n(
|
|
|
92
87
|
i18nLoadedCallback?.(i18n);
|
|
93
88
|
});
|
|
94
89
|
} else {
|
|
95
|
-
// Already initialised (e.g.
|
|
90
|
+
// Already initialised (e.g. createTranslator() ran first, or a second
|
|
96
91
|
// widget mounted). The `loaded` handler is only registered in the init
|
|
97
92
|
// branch, so the callback has to fire here or loadI18next() never
|
|
98
93
|
// settles. Resources are already present, so resolving immediately is
|
package/src/index.ts
CHANGED
|
@@ -18,5 +18,6 @@ export { Languages, LanguageSchema } from "./translations.js";
|
|
|
18
18
|
export { isClientSide } from "./util.js";
|
|
19
19
|
export { TranslationKeysSchema } from "./translationKey.js";
|
|
20
20
|
export type { TranslationKey } from "./translationKey.js";
|
|
21
|
-
export {
|
|
21
|
+
export { createTranslator } from "./translator.js";
|
|
22
|
+
export type { Translator } from "./translator.js";
|
|
22
23
|
export type { Ti18n } from "./loadI18next.js";
|
package/src/loadI18next.ts
CHANGED
|
@@ -118,7 +118,7 @@ async function loadI18next(backend: boolean, lng?: string): Promise<i18n> {
|
|
|
118
118
|
}, lng);
|
|
119
119
|
} else {
|
|
120
120
|
// Singleton already exists (e.g. a prior widget mounted with a
|
|
121
|
-
// different language, or a
|
|
121
|
+
// different language, or a direct consumer initialised earlier).
|
|
122
122
|
// Reconcile before resolving so callers can render synchronously
|
|
123
123
|
// against the requested language instead of seeing a flash of
|
|
124
124
|
// the previous one.
|
|
@@ -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-poçt ünvanından çox sayda göndəriş",
|
|
48
48
|
"VPN_BLOCKED": "Bu sayt üçün VPN bağlantılarından sorğulara icazə verilmir",
|
|
49
49
|
"PROXY_BLOCKED": "Bu sayt üçün proksi serverlərdən sorğulara icazə verilmir",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Bu sayt açarı üçün localhost-dan həddindən artıq çox CAPTCHA sorğusu",
|
|
50
51
|
"TOR_BLOCKED": "Bu sayt üçün Tor çıxış qovşaqlarından sorğulara icazə verilmir",
|
|
51
52
|
"ABUSER_BLOCKED": "Bu sayt üçün sui-istifadə üçün işarələnmiş şəbəkələrdən sorğulara icazə verilmir",
|
|
52
53
|
"DATACENTER_BLOCKED": "Bu sayt üçün məlumat mərkəzi IP ünvanlarından sorğulara icazə verilmir",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Příliš mnoho odeslání z této e-mailové adresy",
|
|
48
48
|
"VPN_BLOCKED": "Požadavky z VPN připojení nejsou pro tento web povoleny",
|
|
49
49
|
"PROXY_BLOCKED": "Požadavky z proxy serverů nejsou pro tento web povoleny",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Příliš mnoho požadavků CAPTCHA z localhost pro tento klíč webu",
|
|
50
51
|
"TOR_BLOCKED": "Požadavky z výstupních uzlů Tor nejsou pro tento web povoleny",
|
|
51
52
|
"ABUSER_BLOCKED": "Požadavky ze sítí označených za zneužívající nejsou pro tento web povoleny",
|
|
52
53
|
"DATACENTER_BLOCKED": "Požadavky z IP adres datových center nejsou pro tento web povoleny",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Zu viele Einsendungen von dieser E-Mail-Adresse",
|
|
48
48
|
"VPN_BLOCKED": "Anfragen über VPN-Verbindungen sind für diese Website nicht erlaubt",
|
|
49
49
|
"PROXY_BLOCKED": "Anfragen über Proxy-Server sind für diese Website nicht erlaubt",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Zu viele CAPTCHA-Anfragen von localhost für diesen Site-Key",
|
|
50
51
|
"TOR_BLOCKED": "Anfragen über Tor-Exit-Knoten sind für diese Website nicht erlaubt",
|
|
51
52
|
"ABUSER_BLOCKED": "Anfragen von als missbräuchlich markierten Netzwerken sind für diese Website nicht erlaubt",
|
|
52
53
|
"DATACENTER_BLOCKED": "Anfragen von Rechenzentrum-IP-Adressen sind für diese Website nicht erlaubt",
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Πάρα πολλές υποβολές από αυτή τη διεύθυνση email",
|
|
35
35
|
"VPN_BLOCKED": "Αιτήματα από συνδέσεις VPN δεν επιτρέπονται για αυτόν τον ιστότοπο",
|
|
36
36
|
"PROXY_BLOCKED": "Αιτήματα από διακομιστές proxy δεν επιτρέπονται για αυτόν τον ιστότοπο",
|
|
37
|
+
"TOO_MANY_LOCALHOST": "Πάρα πολλά αιτήματα CAPTCHA από το localhost για αυτό το κλειδί ιστότοπου",
|
|
37
38
|
"TOR_BLOCKED": "Αιτήματα από κόμβους εξόδου Tor δεν επιτρέπονται για αυτόν τον ιστότοπο",
|
|
38
39
|
"ABUSER_BLOCKED": "Αιτήματα από δίκτυα που έχουν επισημανθεί για κατάχρηση δεν επιτρέπονται για αυτόν τον ιστότοπο",
|
|
39
40
|
"DATACENTER_BLOCKED": "Αιτήματα από διευθύνσεις IP κέντρων δεδομένων δεν επιτρέπονται για αυτόν τον ιστότοπο",
|
|
@@ -139,6 +139,7 @@
|
|
|
139
139
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Too many submissions from this email address",
|
|
140
140
|
"VPN_BLOCKED": "Requests from VPN connections are not allowed for this site",
|
|
141
141
|
"PROXY_BLOCKED": "Requests from proxy servers are not allowed for this site",
|
|
142
|
+
"TOO_MANY_LOCALHOST": "Too many CAPTCHA requests from localhost for this site key",
|
|
142
143
|
"TOR_BLOCKED": "Requests from Tor exit nodes are not allowed for this site",
|
|
143
144
|
"ABUSER_BLOCKED": "Requests from networks flagged for abuse are not allowed for this site",
|
|
144
145
|
"DATACENTER_BLOCKED": "Requests from datacenter IP addresses are not allowed for this site",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Demasiados envíos desde esta dirección de correo electrónico",
|
|
48
48
|
"VPN_BLOCKED": "Las solicitudes desde conexiones VPN no están permitidas para este sitio",
|
|
49
49
|
"PROXY_BLOCKED": "Las solicitudes desde servidores proxy no están permitidas para este sitio",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Demasiadas solicitudes de CAPTCHA desde localhost para esta clave de sitio",
|
|
50
51
|
"TOR_BLOCKED": "Las solicitudes desde nodos de salida Tor no están permitidas para este sitio",
|
|
51
52
|
"ABUSER_BLOCKED": "Las solicitudes desde redes marcadas por abuso no están permitidas para este sitio",
|
|
52
53
|
"DATACENTER_BLOCKED": "Las solicitudes desde direcciones IP de centros de datos no están permitidas para este sitio",
|
|
@@ -53,6 +53,7 @@
|
|
|
53
53
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Liian monta lähetystä tästä sähköpostiosoitteesta",
|
|
54
54
|
"VPN_BLOCKED": "VPN-yhteyksien pyynnöt eivät ole sallittuja tälle sivustolle",
|
|
55
55
|
"PROXY_BLOCKED": "Välityspalvelimien pyynnöt eivät ole sallittuja tälle sivustolle",
|
|
56
|
+
"TOO_MANY_LOCALHOST": "Liian monta CAPTCHA-pyyntöä localhostista tälle sivustoavaimelle",
|
|
56
57
|
"TOR_BLOCKED": "Tor-poistumissolmujen pyynnöt eivät ole sallittuja tälle sivustolle",
|
|
57
58
|
"ABUSER_BLOCKED": "Väärinkäytöstä merkittyjen verkkojen pyynnöt eivät ole sallittuja tälle sivustolle",
|
|
58
59
|
"DATACENTER_BLOCKED": "Datakeskusten IP-osoitteiden pyynnöt eivät ole sallittuja tälle sivustolle",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Trop de soumissions depuis cette adresse e-mail",
|
|
48
48
|
"VPN_BLOCKED": "Les requêtes provenant de connexions VPN ne sont pas autorisées pour ce site",
|
|
49
49
|
"PROXY_BLOCKED": "Les requêtes provenant de serveurs proxy ne sont pas autorisées pour ce site",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Trop de requêtes CAPTCHA provenant de localhost pour cette clé de site",
|
|
50
51
|
"TOR_BLOCKED": "Les requêtes provenant de nœuds de sortie Tor ne sont pas autorisées pour ce site",
|
|
51
52
|
"ABUSER_BLOCKED": "Les requêtes provenant de réseaux signalés pour abus ne sont pas autorisées pour ce site",
|
|
52
53
|
"DATACENTER_BLOCKED": "Les requêtes provenant d'adresses IP de centres de données ne sont pas autorisées pour ce site",
|
|
@@ -346,6 +346,7 @@
|
|
|
346
346
|
"SPAM_EMAIL_COUNT_EXCEEDED": "इस ईमेल पते से बहुत अधिक सबमिशन",
|
|
347
347
|
"VPN_BLOCKED": "इस साइट के लिए VPN कनेक्शन से अनुरोध की अनुमति नहीं है",
|
|
348
348
|
"PROXY_BLOCKED": "इस साइट के लिए प्रॉक्सी सर्वर से अनुरोध की अनुमति नहीं है",
|
|
349
|
+
"TOO_MANY_LOCALHOST": "इस साइट कुंजी के लिए localhost से बहुत अधिक CAPTCHA अनुरोध",
|
|
349
350
|
"TOR_BLOCKED": "इस साइट के लिए Tor एक्ज़िट नोड्स से अनुरोध की अनुमति नहीं है",
|
|
350
351
|
"ABUSER_BLOCKED": "दुरुपयोग के लिए चिह्नित नेटवर्क से अनुरोध इस साइट के लिए अनुमत नहीं हैं",
|
|
351
352
|
"DATACENTER_BLOCKED": "इस साइट के लिए डेटासेंटर IP पतों से अनुरोध की अनुमति नहीं है",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Túl sok beküldés erről az e-mail címről",
|
|
48
48
|
"VPN_BLOCKED": "VPN-kapcsolatokról érkező kérések nem engedélyezettek ezen az oldalon",
|
|
49
49
|
"PROXY_BLOCKED": "Proxy szerverekről érkező kérések nem engedélyezettek ezen az oldalon",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Túl sok CAPTCHA-kérés a localhostról ehhez a webhelykulcshoz",
|
|
50
51
|
"TOR_BLOCKED": "Tor kilépési csomópontokról érkező kérések nem engedélyezettek ezen az oldalon",
|
|
51
52
|
"ABUSER_BLOCKED": "Visszaélésért megjelölt hálózatokról érkező kérések nem engedélyezettek ezen az oldalon",
|
|
52
53
|
"DATACENTER_BLOCKED": "Adatközponti IP-címekről érkező kérések nem engedélyezettek ezen az oldalon",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Terlalu banyak pengiriman dari alamat email ini",
|
|
48
48
|
"VPN_BLOCKED": "Permintaan dari koneksi VPN tidak diizinkan untuk situs ini",
|
|
49
49
|
"PROXY_BLOCKED": "Permintaan dari server proxy tidak diizinkan untuk situs ini",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Terlalu banyak permintaan CAPTCHA dari localhost untuk kunci situs ini",
|
|
50
51
|
"TOR_BLOCKED": "Permintaan dari node keluar Tor tidak diizinkan untuk situs ini",
|
|
51
52
|
"ABUSER_BLOCKED": "Permintaan dari jaringan yang ditandai karena penyalahgunaan tidak diizinkan untuk situs ini",
|
|
52
53
|
"DATACENTER_BLOCKED": "Permintaan dari alamat IP pusat data tidak diizinkan untuk situs ini",
|
|
@@ -47,6 +47,7 @@
|
|
|
47
47
|
"SPAM_EMAIL_COUNT_EXCEEDED": "Troppi invii da questo indirizzo email",
|
|
48
48
|
"VPN_BLOCKED": "Le richieste da connessioni VPN non sono consentite per questo sito",
|
|
49
49
|
"PROXY_BLOCKED": "Le richieste da server proxy non sono consentite per questo sito",
|
|
50
|
+
"TOO_MANY_LOCALHOST": "Troppe richieste CAPTCHA da localhost per questa chiave del sito",
|
|
50
51
|
"TOR_BLOCKED": "Le richieste da nodi di uscita Tor non sono consentite per questo sito",
|
|
51
52
|
"ABUSER_BLOCKED": "Le richieste da reti segnalate per abuso non sono consentite per questo sito",
|
|
52
53
|
"DATACENTER_BLOCKED": "Le richieste da indirizzi IP di data center non sono consentite per questo sito",
|