@swetrix/captcha 2.0.1 → 2.3.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.
Files changed (46) hide show
  1. package/README.md +72 -5
  2. package/dist/captcha-loader.cjs +333 -0
  3. package/dist/captcha-loader.cjs.map +1 -0
  4. package/dist/captcha-loader.esm.js +327 -0
  5. package/dist/captcha-loader.esm.js.map +1 -0
  6. package/dist/captcha-loader.js +1 -1
  7. package/dist/captcha-loader.js.map +1 -1
  8. package/dist/captcha.js +1 -1
  9. package/dist/captcha.js.map +1 -1
  10. package/dist/esnext/captcha-loader.d.ts +10 -0
  11. package/dist/esnext/captcha-loader.js +315 -0
  12. package/dist/esnext/captcha-loader.js.map +1 -0
  13. package/dist/esnext/captcha.d.ts +10 -0
  14. package/dist/esnext/captcha.js +491 -0
  15. package/dist/esnext/captcha.js.map +1 -0
  16. package/dist/esnext/i18n.d.ts +22 -0
  17. package/dist/esnext/i18n.js +110 -0
  18. package/dist/esnext/i18n.js.map +1 -0
  19. package/dist/esnext/index.d.ts +7 -0
  20. package/dist/esnext/index.js +7 -0
  21. package/dist/esnext/index.js.map +1 -0
  22. package/dist/esnext/logger.d.ts +6 -0
  23. package/dist/esnext/logger.js +8 -0
  24. package/dist/esnext/logger.js.map +1 -0
  25. package/dist/esnext/pow-worker.d.ts +1 -0
  26. package/dist/esnext/pow-worker.js +127 -0
  27. package/dist/esnext/pow-worker.js.map +1 -0
  28. package/dist/pages/dark.html +461 -276
  29. package/dist/pages/light.html +463 -278
  30. package/dist/pages/test.html +26 -27
  31. package/package.json +58 -32
  32. package/.nvmrc +0 -1
  33. package/.prettierrc.js +0 -13
  34. package/dist/assets/logo_blue.png +0 -0
  35. package/dist/assets/logo_white.png +0 -0
  36. package/rollup.config.mjs +0 -83
  37. package/src/assets/logo_blue.png +0 -0
  38. package/src/assets/logo_white.png +0 -0
  39. package/src/captcha-loader.ts +0 -212
  40. package/src/captcha.ts +0 -358
  41. package/src/pages/dark.html +0 -284
  42. package/src/pages/light.html +0 -286
  43. package/src/pages/test.html +0 -33
  44. package/src/pow-worker.ts +0 -178
  45. package/tsconfig.esnext.json +0 -15
  46. package/tsconfig.json +0 -14
@@ -0,0 +1,491 @@
1
+ import { getTranslations, normalizeLocale, detectBrowserLocale } from './i18n';
2
+ import { logger } from './logger';
3
+ const DEFAULT_ASSET_BASE_URL = 'https://cdn.swetrixcaptcha.com/dist/';
4
+ const getWindow = () => (typeof window === 'undefined' ? undefined : window);
5
+ const isDevelopment = getWindow()?.__SWETRIX_CAPTCHA_DEV || false;
6
+ const DEFAULT_API_URL = isDevelopment ? 'http://localhost:5005/v1/captcha' : 'https://api.swetrixcaptcha.com/v1/captcha';
7
+ const API_URL = getWindow()?.__SWETRIX_API_URL || DEFAULT_API_URL;
8
+ const normalizeAssetBaseURL = (assetBaseUrl) => {
9
+ const fallbackBase = getWindow()?.location.href;
10
+ try {
11
+ const url = fallbackBase ? new URL(assetBaseUrl, fallbackBase) : new URL(assetBaseUrl);
12
+ return url.href.endsWith('/') ? url.href : `${url.href}/`;
13
+ }
14
+ catch {
15
+ return DEFAULT_ASSET_BASE_URL;
16
+ }
17
+ };
18
+ const getScriptAssetBaseURL = () => {
19
+ if (typeof document === 'undefined') {
20
+ return DEFAULT_ASSET_BASE_URL;
21
+ }
22
+ const currentScript = document.currentScript;
23
+ if (!currentScript?.src) {
24
+ return DEFAULT_ASSET_BASE_URL;
25
+ }
26
+ return normalizeAssetBaseURL(new URL('.', currentScript.src).href);
27
+ };
28
+ const getAssetBaseURL = () => normalizeAssetBaseURL(getWindow()?.__SWETRIX_CAPTCHA_ASSET_URL || getScriptAssetBaseURL());
29
+ const WORKER_URL = new URL('pow-worker.js', getAssetBaseURL()).toString();
30
+ const MSG_IDENTIFIER = 'swetrix-captcha';
31
+ const CAPTCHA_TOKEN_LIFETIME = 300; // seconds (5 minutes).
32
+ // Main-thread fallback limits (same as worker)
33
+ const MAX_ITERATIONS = 100000000; // 100 million attempts
34
+ const TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
35
+ const ENDPOINTS = {
36
+ GENERATE: '/generate',
37
+ VERIFY: '/verify',
38
+ };
39
+ var IFRAME_MESSAGE_TYPES;
40
+ (function (IFRAME_MESSAGE_TYPES) {
41
+ IFRAME_MESSAGE_TYPES["SUCCESS"] = "success";
42
+ IFRAME_MESSAGE_TYPES["FAILURE"] = "failure";
43
+ IFRAME_MESSAGE_TYPES["TOKEN_EXPIRED"] = "tokenExpired";
44
+ })(IFRAME_MESSAGE_TYPES || (IFRAME_MESSAGE_TYPES = {}));
45
+ var ACTION;
46
+ (function (ACTION) {
47
+ ACTION["checkbox"] = "checkbox";
48
+ ACTION["failure"] = "failure";
49
+ ACTION["completed"] = "completed";
50
+ ACTION["loading"] = "loading";
51
+ })(ACTION || (ACTION = {}));
52
+ let activeAction = ACTION.checkbox;
53
+ let powWorker = null;
54
+ const getLocaleFromUrl = () => {
55
+ const urlParams = new URLSearchParams(window.location.search);
56
+ const lang = urlParams.get('lang');
57
+ if (lang) {
58
+ return normalizeLocale(lang);
59
+ }
60
+ return detectBrowserLocale();
61
+ };
62
+ const currentLocale = getLocaleFromUrl();
63
+ const t = getTranslations(currentLocale);
64
+ const sendMessageToLoader = (event, data = {}) => {
65
+ window.parent.postMessage({
66
+ event,
67
+ type: MSG_IDENTIFIER,
68
+ cid: getWindow()?.__SWETRIX_CAPTCHA_ID,
69
+ ...data,
70
+ }, '*');
71
+ };
72
+ /**
73
+ * Updates the progress bar
74
+ * @param progress - Progress value between 0 and 100, or -1 for indeterminate
75
+ */
76
+ const updateProgressBar = (progress) => {
77
+ const progressBarContainer = document.querySelector('#progress-bar-container');
78
+ const progressBar = document.querySelector('#progress-bar');
79
+ if (!progressBarContainer || !progressBar)
80
+ return;
81
+ if (progress < 0) {
82
+ // Indeterminate state
83
+ progressBarContainer.classList.add('show');
84
+ progressBar.classList.add('indeterminate');
85
+ progressBar.style.width = '';
86
+ progressBarContainer.setAttribute('aria-valuenow', '0');
87
+ progressBarContainer.removeAttribute('aria-valuenow');
88
+ }
89
+ else if (progress === 0) {
90
+ // Hide progress bar
91
+ progressBarContainer.classList.remove('show');
92
+ progressBar.classList.remove('indeterminate');
93
+ progressBar.style.width = '0%';
94
+ progressBarContainer.setAttribute('aria-valuenow', '0');
95
+ }
96
+ else if (progress >= 100) {
97
+ // Complete - fade out while staying at 100%
98
+ progressBar.classList.remove('indeterminate');
99
+ progressBar.style.width = '100%';
100
+ progressBarContainer.setAttribute('aria-valuenow', '100');
101
+ // Fade out after a brief moment at 100%
102
+ setTimeout(() => {
103
+ progressBarContainer.classList.remove('show');
104
+ // Reset width only after fade out completes (for next use)
105
+ setTimeout(() => {
106
+ progressBar.style.width = '0%';
107
+ }, 300);
108
+ }, 400);
109
+ }
110
+ else {
111
+ // Show determinate progress
112
+ progressBarContainer.classList.add('show');
113
+ progressBar.classList.remove('indeterminate');
114
+ progressBar.style.width = `${Math.min(progress, 95)}%`; // Cap at 95% until complete
115
+ progressBarContainer.setAttribute('aria-valuenow', String(Math.round(progress)));
116
+ }
117
+ };
118
+ /**
119
+ * Updates ARIA attributes based on current state
120
+ */
121
+ const updateAriaState = (action) => {
122
+ const captchaComponent = document.querySelector('#swetrix-captcha');
123
+ if (!captchaComponent)
124
+ return;
125
+ switch (action) {
126
+ case ACTION.checkbox:
127
+ captchaComponent.setAttribute('role', 'checkbox');
128
+ captchaComponent.setAttribute('aria-checked', 'false');
129
+ captchaComponent.setAttribute('aria-busy', 'false');
130
+ captchaComponent.setAttribute('aria-label', t.ariaCheckbox);
131
+ break;
132
+ case ACTION.loading:
133
+ captchaComponent.setAttribute('role', 'status');
134
+ captchaComponent.setAttribute('aria-checked', 'mixed');
135
+ captchaComponent.setAttribute('aria-busy', 'true');
136
+ captchaComponent.setAttribute('aria-label', t.ariaVerifying);
137
+ break;
138
+ case ACTION.completed:
139
+ captchaComponent.setAttribute('role', 'checkbox');
140
+ captchaComponent.setAttribute('aria-checked', 'true');
141
+ captchaComponent.setAttribute('aria-busy', 'false');
142
+ captchaComponent.setAttribute('aria-label', t.ariaSuccess);
143
+ break;
144
+ case ACTION.failure:
145
+ captchaComponent.setAttribute('role', 'checkbox');
146
+ captchaComponent.setAttribute('aria-checked', 'false');
147
+ captchaComponent.setAttribute('aria-busy', 'false');
148
+ captchaComponent.setAttribute('aria-label', t.ariaFailed);
149
+ break;
150
+ }
151
+ // Announce to screen readers
152
+ const srStatus = document.querySelector('#sr-status');
153
+ if (srStatus) {
154
+ switch (action) {
155
+ case ACTION.loading:
156
+ srStatus.textContent = t.srLoading;
157
+ break;
158
+ case ACTION.completed:
159
+ srStatus.textContent = t.srSuccess;
160
+ break;
161
+ case ACTION.failure:
162
+ srStatus.textContent = t.srFailed;
163
+ break;
164
+ default:
165
+ srStatus.textContent = '';
166
+ }
167
+ }
168
+ };
169
+ /**
170
+ * Sets the provided action visible and the rest hidden with smooth transitions
171
+ * @param {*} action checkbox | failure | completed | loading
172
+ */
173
+ const activateAction = (action) => {
174
+ activeAction = action;
175
+ const statusDefault = document.querySelector('#status-default');
176
+ const statusFailure = document.querySelector('#status-failure');
177
+ const statusComputing = document.querySelector('#status-computing');
178
+ const actions = {
179
+ checkbox: document.querySelector('#checkbox'),
180
+ failure: document.querySelector('#failure'),
181
+ completed: document.querySelector('#completed'),
182
+ loading: document.querySelector('#loading'),
183
+ };
184
+ // Hide all action elements with transitions
185
+ // Checkbox uses fade-out class for smooth transition
186
+ if (action !== ACTION.checkbox) {
187
+ actions.checkbox?.classList.add('fade-out');
188
+ }
189
+ else {
190
+ actions.checkbox?.classList.remove('fade-out');
191
+ }
192
+ // Loading, failure, completed use .show class for visibility
193
+ actions.loading?.classList.remove('show');
194
+ actions.failure?.classList.remove('show');
195
+ actions.completed?.classList.remove('show');
196
+ // Change the status text
197
+ statusDefault?.classList.add('hidden');
198
+ statusFailure?.classList.add('hidden');
199
+ statusComputing?.classList.add('hidden');
200
+ if (action === 'failure') {
201
+ statusFailure?.classList.remove('hidden');
202
+ updateProgressBar(0); // Hide progress bar on failure
203
+ }
204
+ else if (action === 'loading') {
205
+ statusComputing?.classList.remove('hidden');
206
+ updateProgressBar(-1); // Start with indeterminate progress
207
+ }
208
+ else if (action === 'completed') {
209
+ statusDefault?.classList.remove('hidden');
210
+ updateProgressBar(100); // Complete the progress bar
211
+ }
212
+ else {
213
+ statusDefault?.classList.remove('hidden');
214
+ updateProgressBar(0); // Hide progress bar
215
+ }
216
+ // Show the active action element with animation
217
+ if (action !== ACTION.checkbox) {
218
+ // Small delay to ensure CSS transitions work properly
219
+ requestAnimationFrame(() => {
220
+ actions[action]?.classList.add('show');
221
+ });
222
+ }
223
+ // Update ARIA state
224
+ updateAriaState(action);
225
+ };
226
+ const setLifetimeTimeout = () => {
227
+ setTimeout(() => {
228
+ sendMessageToLoader(IFRAME_MESSAGE_TYPES.TOKEN_EXPIRED);
229
+ activateAction(ACTION.checkbox);
230
+ }, CAPTCHA_TOKEN_LIFETIME * 1000);
231
+ };
232
+ const generateChallenge = async () => {
233
+ try {
234
+ const response = await fetch(`${API_URL}${ENDPOINTS.GENERATE}`, {
235
+ method: 'POST',
236
+ headers: {
237
+ 'Content-Type': 'application/json',
238
+ },
239
+ body: JSON.stringify({
240
+ pid: getWindow()?.__SWETRIX_PROJECT_ID,
241
+ }),
242
+ });
243
+ if (!response.ok) {
244
+ throw new Error('Failed to generate challenge');
245
+ }
246
+ return await response.json();
247
+ }
248
+ catch (reason) {
249
+ logger.error('Failed to generate challenge:', reason);
250
+ sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
251
+ activateAction(ACTION.failure);
252
+ return null;
253
+ }
254
+ };
255
+ const verifySolution = async (challenge, nonce, solution) => {
256
+ try {
257
+ const response = await fetch(`${API_URL}${ENDPOINTS.VERIFY}`, {
258
+ method: 'POST',
259
+ headers: {
260
+ 'Content-Type': 'application/json',
261
+ },
262
+ body: JSON.stringify({
263
+ challenge,
264
+ nonce,
265
+ solution,
266
+ pid: getWindow()?.__SWETRIX_PROJECT_ID,
267
+ }),
268
+ });
269
+ if (!response.ok) {
270
+ throw new Error('Verification failed');
271
+ }
272
+ const data = await response.json();
273
+ if (!data.success) {
274
+ throw new Error('Verification failed');
275
+ }
276
+ return data.token;
277
+ }
278
+ catch (reason) {
279
+ logger.error('Failed to verify solution:', reason);
280
+ sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
281
+ activateAction(ACTION.failure);
282
+ return null;
283
+ }
284
+ };
285
+ /**
286
+ * Calculate estimated progress based on difficulty and attempts
287
+ * Uses a logarithmic scale to provide smooth progress feedback
288
+ */
289
+ const calculateProgress = (attempts, difficulty) => {
290
+ // Estimate expected iterations based on difficulty
291
+ // For difficulty d, expected iterations is roughly 16^d / 2
292
+ const expectedIterations = Math.pow(16, difficulty) / 2;
293
+ // Use a logarithmic scale for smoother progress
294
+ // This ensures progress feels more linear to the user
295
+ const rawProgress = (attempts / expectedIterations) * 100;
296
+ // Apply easing to make early progress more visible
297
+ // and slow down as we approach completion
298
+ const easedProgress = Math.min(95, Math.sqrt(rawProgress) * 10);
299
+ return easedProgress;
300
+ };
301
+ const solveChallenge = async (challenge) => {
302
+ return new Promise((resolve, reject) => {
303
+ // Terminate any existing worker
304
+ if (powWorker) {
305
+ powWorker.terminate();
306
+ }
307
+ try {
308
+ powWorker = new Worker(WORKER_URL);
309
+ }
310
+ catch (reason) {
311
+ logger.warn('Failed to create worker:', reason);
312
+ // Fallback: solve in main thread if worker fails
313
+ solveInMainThread(challenge).then(resolve).catch(reject);
314
+ return;
315
+ }
316
+ powWorker.onmessage = async (event) => {
317
+ const data = event.data;
318
+ if (data.type === 'progress') {
319
+ // Update progress bar based on attempts
320
+ const progressData = data;
321
+ const progress = calculateProgress(progressData.attempts, challenge.difficulty);
322
+ updateProgressBar(progress);
323
+ return;
324
+ }
325
+ if (data.type === 'timeout') {
326
+ // Worker timed out or hit max iterations
327
+ logger.error('PoW worker timeout:', data.reason);
328
+ sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
329
+ activateAction(ACTION.failure);
330
+ powWorker?.terminate();
331
+ powWorker = null;
332
+ resolve();
333
+ return;
334
+ }
335
+ if (data.type === 'result') {
336
+ // Worker found the solution
337
+ updateProgressBar(100); // Complete progress bar
338
+ const token = await verifySolution(challenge.challenge, data.nonce, data.solution);
339
+ if (token) {
340
+ sendMessageToLoader(IFRAME_MESSAGE_TYPES.SUCCESS, { token });
341
+ setLifetimeTimeout();
342
+ activateAction(ACTION.completed);
343
+ }
344
+ powWorker?.terminate();
345
+ powWorker = null;
346
+ resolve();
347
+ return;
348
+ }
349
+ // Handle error message from worker
350
+ if (data.type === 'error') {
351
+ const errorData = data;
352
+ logger.error('PoW worker error message:', errorData.message || 'Unknown error');
353
+ sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
354
+ activateAction(ACTION.failure);
355
+ powWorker?.terminate();
356
+ powWorker = null;
357
+ resolve();
358
+ return;
359
+ }
360
+ // Fallback for unexpected message types
361
+ logger.warn('PoW worker received unexpected message type:', data.type, 'Raw data:', data);
362
+ sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
363
+ activateAction(ACTION.failure);
364
+ powWorker?.terminate();
365
+ powWorker = null;
366
+ resolve();
367
+ };
368
+ powWorker.onerror = (error) => {
369
+ logger.error('PoW worker error:', error);
370
+ powWorker?.terminate();
371
+ powWorker = null;
372
+ // Fallback to main thread
373
+ solveInMainThread(challenge).then(resolve).catch(reject);
374
+ };
375
+ // Start the worker
376
+ powWorker.postMessage({
377
+ challenge: challenge.challenge,
378
+ difficulty: challenge.difficulty,
379
+ });
380
+ });
381
+ };
382
+ // Fallback solution for environments where workers don't work
383
+ const solveInMainThread = async (challenge) => {
384
+ const { challenge: challengeStr, difficulty } = challenge;
385
+ let nonce = 0;
386
+ const startTime = Date.now();
387
+ const progressInterval = 1000; // Update progress every 1k iterations
388
+ const sha256 = async (message) => {
389
+ const encoder = new TextEncoder();
390
+ const data = encoder.encode(message);
391
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
392
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
393
+ return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');
394
+ };
395
+ const hasValidPrefix = (hash, diff) => {
396
+ for (let i = 0; i < diff; i++) {
397
+ if (hash[i] !== '0')
398
+ return false;
399
+ }
400
+ return true;
401
+ };
402
+ while (nonce < MAX_ITERATIONS) {
403
+ // Check overall timeout
404
+ const elapsedMs = Date.now() - startTime;
405
+ if (elapsedMs >= TIMEOUT_MS) {
406
+ logger.error(`PoW main-thread timeout: ${TIMEOUT_MS}ms elapsed after ${nonce} attempts`);
407
+ sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
408
+ activateAction(ACTION.failure);
409
+ return;
410
+ }
411
+ const input = `${challengeStr}:${nonce}`;
412
+ const hash = await sha256(input);
413
+ if (hasValidPrefix(hash, difficulty)) {
414
+ updateProgressBar(100); // Complete progress bar
415
+ const token = await verifySolution(challengeStr, nonce, hash);
416
+ if (token) {
417
+ sendMessageToLoader(IFRAME_MESSAGE_TYPES.SUCCESS, { token });
418
+ setLifetimeTimeout();
419
+ activateAction(ACTION.completed);
420
+ }
421
+ return;
422
+ }
423
+ nonce++;
424
+ // Update progress bar periodically
425
+ if (nonce % progressInterval === 0) {
426
+ const progress = calculateProgress(nonce, difficulty);
427
+ updateProgressBar(progress);
428
+ }
429
+ }
430
+ // Max iterations reached without finding solution
431
+ logger.error(`PoW main-thread max iterations reached: ${MAX_ITERATIONS} attempts`);
432
+ sendMessageToLoader(IFRAME_MESSAGE_TYPES.FAILURE);
433
+ activateAction(ACTION.failure);
434
+ };
435
+ /**
436
+ * Handles the captcha activation (click or keyboard)
437
+ */
438
+ const handleCaptchaActivation = async () => {
439
+ if (activeAction === ACTION.loading || activeAction === ACTION.completed) {
440
+ return;
441
+ }
442
+ if (activeAction === ACTION.failure) {
443
+ activateAction(ACTION.checkbox);
444
+ return;
445
+ }
446
+ activateAction(ACTION.loading);
447
+ const challenge = await generateChallenge();
448
+ if (!challenge) {
449
+ return;
450
+ }
451
+ await solveChallenge(challenge);
452
+ };
453
+ const applyTranslations = () => {
454
+ const statusDefault = document.querySelector('#status-default');
455
+ const statusFailure = document.querySelector('#status-failure');
456
+ const statusComputing = document.querySelector('#status-computing span');
457
+ const progressBarContainer = document.querySelector('#progress-bar-container');
458
+ if (statusDefault)
459
+ statusDefault.textContent = t.iAmHuman;
460
+ if (statusFailure)
461
+ statusFailure.textContent = t.verificationFailed;
462
+ if (statusComputing)
463
+ statusComputing.textContent = t.verifying;
464
+ if (progressBarContainer)
465
+ progressBarContainer.setAttribute('aria-label', t.ariaProgress);
466
+ document.documentElement.lang = currentLocale;
467
+ };
468
+ document.addEventListener('DOMContentLoaded', () => {
469
+ const captchaComponent = document.querySelector('#swetrix-captcha');
470
+ const branding = document.querySelector('#branding');
471
+ applyTranslations();
472
+ branding?.addEventListener('click', (e) => {
473
+ e.stopPropagation();
474
+ });
475
+ captchaComponent?.addEventListener('click', handleCaptchaActivation);
476
+ captchaComponent?.addEventListener('keydown', (e) => {
477
+ const keyboardEvent = e;
478
+ if (keyboardEvent.key === 'Enter' || keyboardEvent.key === ' ') {
479
+ e.preventDefault();
480
+ handleCaptchaActivation();
481
+ }
482
+ });
483
+ captchaComponent?.addEventListener('keyup', (e) => {
484
+ const keyboardEvent = e;
485
+ if (keyboardEvent.key === ' ') {
486
+ e.preventDefault();
487
+ }
488
+ });
489
+ updateAriaState(ACTION.checkbox);
490
+ });
491
+ //# sourceMappingURL=captcha.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../src/captcha.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export declare const SUPPORTED_LOCALES: readonly ["en", "de", "fr", "pl", "uk", "hu"];
2
+ export type SupportedLocale = (typeof SUPPORTED_LOCALES)[number];
3
+ export declare const DEFAULT_LOCALE: SupportedLocale;
4
+ interface Translations {
5
+ iAmHuman: string;
6
+ verificationFailed: string;
7
+ verifying: string;
8
+ ariaCheckbox: string;
9
+ ariaVerifying: string;
10
+ ariaSuccess: string;
11
+ ariaFailed: string;
12
+ srLoading: string;
13
+ srSuccess: string;
14
+ srFailed: string;
15
+ ariaProgress: string;
16
+ }
17
+ export declare const translations: Record<SupportedLocale, Translations>;
18
+ export declare const isSupportedLocale: (locale: string) => locale is SupportedLocale;
19
+ export declare const normalizeLocale: (locale: string) => SupportedLocale;
20
+ export declare const detectBrowserLocale: () => SupportedLocale;
21
+ export declare const getTranslations: (locale: SupportedLocale) => Translations;
22
+ export {};
@@ -0,0 +1,110 @@
1
+ export const SUPPORTED_LOCALES = ['en', 'de', 'fr', 'pl', 'uk', 'hu'];
2
+ export const DEFAULT_LOCALE = 'en';
3
+ export const translations = {
4
+ en: {
5
+ iAmHuman: 'I am human',
6
+ verificationFailed: 'Verification failed, click to retry',
7
+ verifying: 'Verifying...',
8
+ ariaCheckbox: 'Human verification checkbox. Press Enter or Space to verify you are human.',
9
+ ariaVerifying: 'Verifying that you are human. Please wait.',
10
+ ariaSuccess: 'Verification successful. You have been verified as human.',
11
+ ariaFailed: 'Verification failed. Press Enter or Space to try again.',
12
+ srLoading: 'Verification in progress. Please wait.',
13
+ srSuccess: 'Verification successful!',
14
+ srFailed: 'Verification failed. Please try again.',
15
+ ariaProgress: 'Verification progress',
16
+ },
17
+ de: {
18
+ iAmHuman: 'Ich bin ein Mensch',
19
+ verificationFailed: 'Verifizierung fehlgeschlagen, klicken Sie zum Wiederholen',
20
+ verifying: 'Verifizierung...',
21
+ ariaCheckbox: 'Kontrollkästchen zur menschlichen Verifizierung. Drücken Sie Enter oder Leertaste, um zu bestätigen, dass Sie ein Mensch sind.',
22
+ ariaVerifying: 'Verifizierung, dass Sie ein Mensch sind. Bitte warten.',
23
+ ariaSuccess: 'Verifizierung erfolgreich. Sie wurden als Mensch verifiziert.',
24
+ ariaFailed: 'Verifizierung fehlgeschlagen. Drücken Sie Enter oder Leertaste, um es erneut zu versuchen.',
25
+ srLoading: 'Verifizierung läuft. Bitte warten.',
26
+ srSuccess: 'Verifizierung erfolgreich!',
27
+ srFailed: 'Verifizierung fehlgeschlagen. Bitte versuchen Sie es erneut.',
28
+ ariaProgress: 'Verifizierungsfortschritt',
29
+ },
30
+ fr: {
31
+ iAmHuman: 'Je suis humain',
32
+ verificationFailed: 'Vérification échouée, cliquez pour réessayer',
33
+ verifying: 'Vérification...',
34
+ ariaCheckbox: 'Case de vérification humaine. Appuyez sur Entrée ou Espace pour confirmer que vous êtes humain.',
35
+ ariaVerifying: 'Vérification en cours. Veuillez patienter.',
36
+ ariaSuccess: 'Vérification réussie. Vous avez été vérifié comme humain.',
37
+ ariaFailed: 'Vérification échouée. Appuyez sur Entrée ou Espace pour réessayer.',
38
+ srLoading: 'Vérification en cours. Veuillez patienter.',
39
+ srSuccess: 'Vérification réussie !',
40
+ srFailed: 'Vérification échouée. Veuillez réessayer.',
41
+ ariaProgress: 'Progression de la vérification',
42
+ },
43
+ pl: {
44
+ iAmHuman: 'Jestem człowiekiem',
45
+ verificationFailed: 'Weryfikacja nie powiodła się, kliknij, aby spróbować ponownie',
46
+ verifying: 'Weryfikacja...',
47
+ ariaCheckbox: 'Pole wyboru weryfikacji człowieka. Naciśnij Enter lub Spację, aby potwierdzić, że jesteś człowiekiem.',
48
+ ariaVerifying: 'Trwa weryfikacja, że jesteś człowiekiem. Proszę czekać.',
49
+ ariaSuccess: 'Weryfikacja zakończona pomyślnie. Zostałeś zweryfikowany jako człowiek.',
50
+ ariaFailed: 'Weryfikacja nie powiodła się. Naciśnij Enter lub Spację, aby spróbować ponownie.',
51
+ srLoading: 'Weryfikacja w toku. Proszę czekać.',
52
+ srSuccess: 'Weryfikacja zakończona pomyślnie!',
53
+ srFailed: 'Weryfikacja nie powiodła się. Spróbuj ponownie.',
54
+ ariaProgress: 'Postęp weryfikacji',
55
+ },
56
+ uk: {
57
+ iAmHuman: 'Я людина',
58
+ verificationFailed: 'Перевірка не вдалася, натисніть, щоб спробувати знову',
59
+ verifying: 'Перевірка...',
60
+ ariaCheckbox: 'Прапорець перевірки людини. Натисніть Enter або Пробіл, щоб підтвердити, що ви людина.',
61
+ ariaVerifying: 'Перевіряємо, що ви людина. Будь ласка, зачекайте.',
62
+ ariaSuccess: 'Перевірка успішна. Вас підтверджено як людину.',
63
+ ariaFailed: 'Перевірка не вдалася. Натисніть Enter або Пробіл, щоб спробувати знову.',
64
+ srLoading: 'Перевірка триває. Будь ласка, зачекайте.',
65
+ srSuccess: 'Перевірка успішна!',
66
+ srFailed: 'Перевірка не вдалася. Будь ласка, спробуйте ще раз.',
67
+ ariaProgress: 'Прогрес перевірки',
68
+ },
69
+ hu: {
70
+ iAmHuman: 'Ember vagyok',
71
+ verificationFailed: 'Az ellenőrzés sikertelen, kattints az újrapróbálkozáshoz',
72
+ verifying: 'Ellenőrzés...',
73
+ ariaCheckbox: 'Emberi ellenőrző jelölőnégyzet. Nyomd meg az Entert vagy a Szóközt, hogy megerősítsd, ember vagy.',
74
+ ariaVerifying: 'Annak ellenőrzése, hogy ember vagy. Kérlek, várj.',
75
+ ariaSuccess: 'Az ellenőrzés sikeres. Emberként lettél megerősítve.',
76
+ ariaFailed: 'Az ellenőrzés sikertelen. Nyomd meg az Entert vagy a Szóközt az újrapróbálkozáshoz.',
77
+ srLoading: 'Az ellenőrzés folyamatban van. Kérlek, várj.',
78
+ srSuccess: 'Az ellenőrzés sikeres!',
79
+ srFailed: 'Az ellenőrzés sikertelen. Kérlek, próbáld újra.',
80
+ ariaProgress: 'Ellenőrzési folyamat',
81
+ },
82
+ };
83
+ export const isSupportedLocale = (locale) => {
84
+ return SUPPORTED_LOCALES.includes(locale);
85
+ };
86
+ export const normalizeLocale = (locale) => {
87
+ const lowered = locale.toLowerCase();
88
+ const primary = lowered.split('-')[0].split('_')[0];
89
+ if (isSupportedLocale(primary)) {
90
+ return primary;
91
+ }
92
+ return DEFAULT_LOCALE;
93
+ };
94
+ export const detectBrowserLocale = () => {
95
+ if (typeof navigator === 'undefined') {
96
+ return DEFAULT_LOCALE;
97
+ }
98
+ const languages = navigator.languages || [navigator.language];
99
+ for (const lang of languages) {
100
+ const normalized = normalizeLocale(lang);
101
+ if (normalized !== DEFAULT_LOCALE || lang.toLowerCase().startsWith('en')) {
102
+ return normalized;
103
+ }
104
+ }
105
+ return DEFAULT_LOCALE;
106
+ };
107
+ export const getTranslations = (locale) => {
108
+ return translations[locale] || translations[DEFAULT_LOCALE];
109
+ };
110
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../../src/i18n.ts"],"names":[],"mappings":"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"}