@prosopo/locale 3.2.8 → 3.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 (159) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +10 -9
  2. package/.turbo/turbo-build$colon$tsc.log +5 -5
  3. package/.turbo/turbo-build.log +11 -10
  4. package/CHANGELOG.md +36 -0
  5. package/dist/cjs/i18SharedOptions.cjs +1 -1
  6. package/dist/cjs/i18nBackend.cjs +4 -1
  7. package/dist/cjs/i18nFrontend.cjs +4 -1
  8. package/dist/cjs/loadI18next.cjs +41 -14
  9. package/dist/cjs/locales/en/translation.cjs +1 -0
  10. package/dist/cjs/process.cjs +17 -0
  11. package/dist/cjs/translationKey.cjs +2 -0
  12. package/dist/i18SharedOptions.js +2 -1
  13. package/dist/i18SharedOptions.js.map +1 -1
  14. package/dist/i18nBackend.d.ts.map +1 -1
  15. package/dist/i18nBackend.js +4 -1
  16. package/dist/i18nBackend.js.map +1 -1
  17. package/dist/i18nFrontend.d.ts.map +1 -1
  18. package/dist/i18nFrontend.js +4 -1
  19. package/dist/i18nFrontend.js.map +1 -1
  20. package/dist/loadI18next.d.ts +1 -0
  21. package/dist/loadI18next.d.ts.map +1 -1
  22. package/dist/loadI18next.js +41 -15
  23. package/dist/loadI18next.js.map +1 -1
  24. package/dist/locales/ar/translation.json +1 -0
  25. package/dist/locales/az/translation.json +1 -0
  26. package/dist/locales/cs/translation.json +1 -0
  27. package/dist/locales/de/translation.json +1 -0
  28. package/dist/locales/el/translation.json +1 -0
  29. package/dist/locales/en/translation.js +1 -0
  30. package/dist/locales/en/translation.json +1 -0
  31. package/dist/locales/es/translation.json +1 -0
  32. package/dist/locales/fi/translation.json +1 -0
  33. package/dist/locales/fr/translation.json +1 -0
  34. package/dist/locales/hi/translation.json +1 -0
  35. package/dist/locales/hu/translation.json +1 -0
  36. package/dist/locales/id/translation.json +1 -0
  37. package/dist/locales/it/translation.json +1 -0
  38. package/dist/locales/ja/translation.json +1 -0
  39. package/dist/locales/jv/translation.json +1 -0
  40. package/dist/locales/ko/translation.json +1 -0
  41. package/dist/locales/ml/translation.json +1 -0
  42. package/dist/locales/ms/translation.json +1 -0
  43. package/dist/locales/nl/translation.json +1 -0
  44. package/dist/locales/no/translation.json +1 -0
  45. package/dist/locales/pl/translation.json +1 -0
  46. package/dist/locales/pt/translation.json +1 -0
  47. package/dist/locales/pt-BR/translation.json +1 -0
  48. package/dist/locales/ro/translation.json +1 -0
  49. package/dist/locales/ru/translation.json +1 -0
  50. package/dist/locales/sr/translation.json +1 -0
  51. package/dist/locales/sv/translation.json +1 -0
  52. package/dist/locales/th/translation.json +1 -0
  53. package/dist/locales/tr/translation.json +1 -0
  54. package/dist/locales/uk/translation.json +1 -0
  55. package/dist/locales/vi/translation.json +1 -0
  56. package/dist/locales/zh-CN/translation.json +1 -0
  57. package/dist/process.d.ts +2 -0
  58. package/dist/process.d.ts.map +1 -0
  59. package/dist/process.js +17 -0
  60. package/dist/process.js.map +1 -0
  61. package/dist/tests/i18SharedOptions.unit.test.d.ts +2 -0
  62. package/dist/tests/i18SharedOptions.unit.test.d.ts.map +1 -0
  63. package/dist/tests/i18SharedOptions.unit.test.js +91 -0
  64. package/dist/tests/i18SharedOptions.unit.test.js.map +1 -0
  65. package/dist/tests/i18nBackend.unit.test.d.ts +2 -0
  66. package/dist/tests/i18nBackend.unit.test.d.ts.map +1 -0
  67. package/dist/tests/i18nBackend.unit.test.js +153 -0
  68. package/dist/tests/i18nBackend.unit.test.js.map +1 -0
  69. package/dist/tests/i18nFrontend.unit.test.d.ts +2 -0
  70. package/dist/tests/i18nFrontend.unit.test.d.ts.map +1 -0
  71. package/dist/tests/i18nFrontend.unit.test.js +199 -0
  72. package/dist/tests/i18nFrontend.unit.test.js.map +1 -0
  73. package/dist/tests/i18nMiddleware.unit.test.d.ts +2 -0
  74. package/dist/tests/i18nMiddleware.unit.test.d.ts.map +1 -0
  75. package/dist/tests/i18nMiddleware.unit.test.js +80 -0
  76. package/dist/tests/i18nMiddleware.unit.test.js.map +1 -0
  77. package/dist/tests/loadI18next.unit.test.d.ts +2 -0
  78. package/dist/tests/loadI18next.unit.test.d.ts.map +1 -0
  79. package/dist/tests/loadI18next.unit.test.js +270 -0
  80. package/dist/tests/loadI18next.unit.test.js.map +1 -0
  81. package/dist/tests/locale.test-d.d.ts +2 -0
  82. package/dist/tests/locale.test-d.d.ts.map +1 -0
  83. package/dist/tests/locale.test-d.js +88 -0
  84. package/dist/tests/locale.test-d.js.map +1 -0
  85. package/dist/tests/process.unit.test.d.ts +2 -0
  86. package/dist/tests/process.unit.test.d.ts.map +1 -0
  87. package/dist/tests/process.unit.test.js +14 -0
  88. package/dist/tests/process.unit.test.js.map +1 -0
  89. package/dist/tests/translationKey.unit.test.d.ts +2 -0
  90. package/dist/tests/translationKey.unit.test.d.ts.map +1 -0
  91. package/dist/tests/translationKey.unit.test.js +108 -0
  92. package/dist/tests/translationKey.unit.test.js.map +1 -0
  93. package/dist/tests/translations.unit.test.d.ts +2 -0
  94. package/dist/tests/translations.unit.test.d.ts.map +1 -0
  95. package/dist/tests/translations.unit.test.js +74 -0
  96. package/dist/tests/translations.unit.test.js.map +1 -0
  97. package/dist/tests/useTranslation.unit.test.d.ts +2 -0
  98. package/dist/tests/useTranslation.unit.test.d.ts.map +1 -0
  99. package/dist/tests/useTranslation.unit.test.js +81 -0
  100. package/dist/tests/useTranslation.unit.test.js.map +1 -0
  101. package/dist/tests/util.unit.test.d.ts +2 -0
  102. package/dist/tests/util.unit.test.d.ts.map +1 -0
  103. package/dist/tests/util.unit.test.js +66 -0
  104. package/dist/tests/util.unit.test.js.map +1 -0
  105. package/dist/translationKey.d.ts +4 -0
  106. package/dist/translationKey.d.ts.map +1 -1
  107. package/dist/translationKey.js +2 -1
  108. package/dist/translationKey.js.map +1 -1
  109. package/package.json +2 -2
  110. package/src/i18SharedOptions.ts +4 -4
  111. package/src/i18nBackend.ts +16 -0
  112. package/src/i18nFrontend.ts +16 -0
  113. package/src/loadI18next.ts +83 -15
  114. package/src/locales/ar/translation.json +1 -0
  115. package/src/locales/az/translation.json +1 -0
  116. package/src/locales/cs/translation.json +1 -0
  117. package/src/locales/de/translation.json +1 -0
  118. package/src/locales/el/translation.json +1 -0
  119. package/src/locales/en/translation.json +1 -0
  120. package/src/locales/es/translation.json +1 -0
  121. package/src/locales/fi/translation.json +1 -0
  122. package/src/locales/fr/translation.json +1 -0
  123. package/src/locales/hi/translation.json +1 -0
  124. package/src/locales/hu/translation.json +1 -0
  125. package/src/locales/id/translation.json +1 -0
  126. package/src/locales/it/translation.json +1 -0
  127. package/src/locales/ja/translation.json +1 -0
  128. package/src/locales/jv/translation.json +1 -0
  129. package/src/locales/ko/translation.json +1 -0
  130. package/src/locales/ml/translation.json +1 -0
  131. package/src/locales/ms/translation.json +1 -0
  132. package/src/locales/nl/translation.json +1 -0
  133. package/src/locales/no/translation.json +1 -0
  134. package/src/locales/pl/translation.json +1 -0
  135. package/src/locales/pt/translation.json +1 -0
  136. package/src/locales/pt-BR/translation.json +1 -0
  137. package/src/locales/ro/translation.json +1 -0
  138. package/src/locales/ru/translation.json +1 -0
  139. package/src/locales/sr/translation.json +1 -0
  140. package/src/locales/sv/translation.json +1 -0
  141. package/src/locales/th/translation.json +1 -0
  142. package/src/locales/tr/translation.json +1 -0
  143. package/src/locales/uk/translation.json +1 -0
  144. package/src/locales/vi/translation.json +1 -0
  145. package/src/locales/zh-CN/translation.json +1 -0
  146. package/src/process.ts +29 -0
  147. package/src/tests/i18SharedOptions.unit.test.ts +139 -0
  148. package/src/tests/i18nBackend.unit.test.ts +241 -0
  149. package/src/tests/i18nFrontend.unit.test.ts +302 -0
  150. package/src/tests/i18nMiddleware.unit.test.ts +140 -0
  151. package/src/tests/loadI18next.unit.test.ts +443 -0
  152. package/src/tests/locale.test-d.ts +156 -0
  153. package/src/tests/process.unit.test.ts +33 -0
  154. package/src/tests/translationKey.unit.test.ts +166 -0
  155. package/src/tests/translations.unit.test.ts +110 -0
  156. package/src/tests/useTranslation.unit.test.ts +134 -0
  157. package/src/tests/util.unit.test.ts +102 -0
  158. package/src/translationKey.ts +18 -3
  159. package/tsconfig.tsbuildinfo +1 -1
@@ -342,6 +342,7 @@
342
342
  "INVALID_BODY": "無効な本体",
343
343
  "PARSE_ERROR": "リクエストの解析エラー",
344
344
  "SPAM_EMAIL_RULE": "スパムフィルタールールによりメールアドレスがブロックされました",
345
+ "SPAM_EMAIL_COUNT_EXCEEDED": "このメールアドレスからの送信が多すぎます",
345
346
  "VPN_BLOCKED": "このサイトではVPN接続からのリクエストは許可されていません",
346
347
  "PROXY_BLOCKED": "このサイトではプロキシサーバーからのリクエストは許可されていません",
347
348
  "TOR_BLOCKED": "このサイトではTor出口ノードからのリクエストは許可されていません",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Badan tidak valid",
44
44
  "PARSE_ERROR": "Kesalahan parsing permintaan",
45
45
  "SPAM_EMAIL_RULE": "Alamat email diblokir dening aturan filter spam",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Kakehen kiriman saka alamat email iki",
46
47
  "VPN_BLOCKED": "Panjaluk saka sambungan VPN ora diidini kanggo situs iki",
47
48
  "PROXY_BLOCKED": "Panjaluk saka server proxy ora diidini kanggo situs iki",
48
49
  "TOR_BLOCKED": "Panjaluk saka simpul metu Tor ora diidini kanggo situs iki",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "유효하지 않은 본문",
44
44
  "PARSE_ERROR": "요청 구문 분석 오류",
45
45
  "SPAM_EMAIL_RULE": "스팸 필터 규칙에 의해 이메일 주소가 차단되었습니다",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "이 이메일 주소에서 너무 많은 제출이 있었습니다",
46
47
  "VPN_BLOCKED": "이 사이트에서는 VPN 연결의 요청이 허용되지 않습니다",
47
48
  "PROXY_BLOCKED": "이 사이트에서는 프록시 서버의 요청이 허용되지 않습니다",
48
49
  "TOR_BLOCKED": "이 사이트에서는 Tor 출구 노드의 요청이 허용되지 않습니다",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Hindi wastong body",
44
44
  "PARSE_ERROR": "Error sa pagsasalin ng request",
45
45
  "SPAM_EMAIL_RULE": "സ്പാം ഫിൽട്ടർ നിയമങ്ങളാൽ ഇമെയിൽ വിലാസം തടഞ്ഞു",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "ഈ ഇമെയിൽ വിലാസത്തിൽ നിന്ന് വളരെയധികം സമർപ്പണങ്ങൾ",
46
47
  "VPN_BLOCKED": "ഈ സൈറ്റിന് VPN കണക്ഷനുകളിൽ നിന്നുള്ള അഭ്യർത്ഥനകൾ അനുവദനീയമല്ല",
47
48
  "PROXY_BLOCKED": "ഈ സൈറ്റിന് പ്രോക്സി സെർവറുകളിൽ നിന്നുള്ള അഭ്യർത്ഥനകൾ അനുവദനീയമല്ല",
48
49
  "TOR_BLOCKED": "ഈ സൈറ്റിന് Tor എക്സിറ്റ് നോഡുകളിൽ നിന്നുള്ള അഭ്യർത്ഥനകൾ അനുവദനീയമല്ല",
@@ -342,6 +342,7 @@
342
342
  "INVALID_BODY": "Invalid body",
343
343
  "PARSE_ERROR": "Error parsing request",
344
344
  "SPAM_EMAIL_RULE": "Alamat e-mel disekat oleh peraturan penapis spam",
345
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Terlalu banyak penghantaran dari alamat e-mel ini",
345
346
  "VPN_BLOCKED": "Permintaan daripada sambungan VPN tidak dibenarkan untuk laman ini",
346
347
  "PROXY_BLOCKED": "Permintaan daripada pelayan proksi tidak dibenarkan untuk laman ini",
347
348
  "TOR_BLOCKED": "Permintaan daripada nod keluar Tor tidak dibenarkan untuk laman ini",
@@ -342,6 +342,7 @@
342
342
  "INVALID_BODY": "Ongeldige body",
343
343
  "PARSE_ERROR": "Fout bij parsen van aanvraag",
344
344
  "SPAM_EMAIL_RULE": "E-mailadres geblokkeerd door spamfilterregels",
345
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Te veel inzendingen vanaf dit e-mailadres",
345
346
  "VPN_BLOCKED": "Verzoeken via VPN-verbindingen zijn niet toegestaan voor deze site",
346
347
  "PROXY_BLOCKED": "Verzoeken via proxyservers zijn niet toegestaan voor deze site",
347
348
  "TOR_BLOCKED": "Verzoeken via Tor-exitnodes zijn niet toegestaan voor deze site",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Ugyldig kropp",
44
44
  "PARSE_ERROR": "Feil ved å tolke forespørsel",
45
45
  "SPAM_EMAIL_RULE": "E-postadresse blokkert av spamfilterregler",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "For mange innsendinger fra denne e-postadressen",
46
47
  "VPN_BLOCKED": "Forespørsler fra VPN-tilkoblinger er ikke tillatt for dette nettstedet",
47
48
  "PROXY_BLOCKED": "Forespørsler fra proxyservere er ikke tillatt for dette nettstedet",
48
49
  "TOR_BLOCKED": "Forespørsler fra Tor-utgangsnoder er ikke tillatt for dette nettstedet",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Nieprawidłowe ciało",
44
44
  "PARSE_ERROR": "Błąd parsowania żądania",
45
45
  "SPAM_EMAIL_RULE": "Adres e-mail zablokowany przez reguły filtra spamu",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Zbyt wiele zgłoszeń z tego adresu e-mail",
46
47
  "VPN_BLOCKED": "Żądania z połączeń VPN nie są dozwolone dla tej strony",
47
48
  "PROXY_BLOCKED": "Żądania z serwerów proxy nie są dozwolone dla tej strony",
48
49
  "TOR_BLOCKED": "Żądania z węzłów wyjściowych Tor nie są dozwolone dla tej strony",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Corpo inválido",
44
44
  "PARSE_ERROR": "Erro ao analisar a resposta",
45
45
  "SPAM_EMAIL_RULE": "Endereço de e-mail bloqueado pelas regras do filtro de spam",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Demasiados envios deste endereço de e-mail",
46
47
  "VPN_BLOCKED": "Pedidos a partir de ligações VPN não são permitidos para este site",
47
48
  "PROXY_BLOCKED": "Pedidos a partir de servidores proxy não são permitidos para este site",
48
49
  "TOR_BLOCKED": "Pedidos a partir de nós de saída Tor não são permitidos para este site",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Corpo inválido",
44
44
  "PARSE_ERROR": "Erro ao analisar a solicitação",
45
45
  "SPAM_EMAIL_RULE": "Endereço de e-mail bloqueado pelas regras do filtro de spam",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Muitos envios deste endereço de e-mail",
46
47
  "VPN_BLOCKED": "Solicitações de conexões VPN não são permitidas para este site",
47
48
  "PROXY_BLOCKED": "Solicitações de servidores proxy não são permitidas para este site",
48
49
  "TOR_BLOCKED": "Solicitações de nós de saída Tor não são permitidas para este site",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Corp invalid",
44
44
  "PARSE_ERROR": "Eroare la parsare",
45
45
  "SPAM_EMAIL_RULE": "Adresa de e-mail blocată de regulile filtrului de spam",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Prea multe trimiteri de la această adresă de e-mail",
46
47
  "VPN_BLOCKED": "Solicitările de la conexiuni VPN nu sunt permise pentru acest site",
47
48
  "PROXY_BLOCKED": "Solicitările de la servere proxy nu sunt permise pentru acest site",
48
49
  "TOR_BLOCKED": "Solicitările de la noduri de ieșire Tor nu sunt permise pentru acest site",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Недопустимое тело запроса",
44
44
  "PARSE_ERROR": "Ошибка разбора запроса",
45
45
  "SPAM_EMAIL_RULE": "Адрес электронной почты заблокирован правилами спам-фильтра",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Слишком много отправок с этого адреса электронной почты",
46
47
  "VPN_BLOCKED": "Запросы через VPN-подключения не разрешены для этого сайта",
47
48
  "PROXY_BLOCKED": "Запросы через прокси-серверы не разрешены для этого сайта",
48
49
  "TOR_BLOCKED": "Запросы через выходные узлы Tor не разрешены для этого сайта",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Неважеће тело захтева",
44
44
  "PARSE_ERROR": "Грешка при рашчлањивању захтева",
45
45
  "SPAM_EMAIL_RULE": "Адреса е-поште блокирана правилима филтера за нежељену пошту",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Превише слања са ове адресе е-поште",
46
47
  "VPN_BLOCKED": "Захтеви са VPN конекција нису дозвољени за овај сајт",
47
48
  "PROXY_BLOCKED": "З��хтеви са прокси сервера нису дозвољени за овај сајт",
48
49
  "TOR_BLOCKED": "Захтеви са Tor излазних чворова нису дозвољени за овај сајт",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Ogiltig body",
44
44
  "PARSE_ERROR": "Fel vid tolkning av förfrågan",
45
45
  "SPAM_EMAIL_RULE": "E-postadressen blockerad av spamfilterregler",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "För många inskickningar från denna e-postadress",
46
47
  "VPN_BLOCKED": "Förfrågningar från VPN-anslutningar är inte tillåtna för denna webbplats",
47
48
  "PROXY_BLOCKED": "Förfrågningar från proxyservrar är inte tillåtna för denna webbplats",
48
49
  "TOR_BLOCKED": "Förfrågningar från Tor-utgångsnoder är inte tillåtna för denna webbplats",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "ข้อมูลไม่ถูกต้อง",
44
44
  "PARSE_ERROR": "ข้อผิดพลาดในการแปลคำขอ",
45
45
  "SPAM_EMAIL_RULE": "ที่อยู่อีเมลถูกบล็อกโดยกฎตัวกรองสแปม",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "มีการส่งจากที่อยู่อีเมลนี้มากเกินไป",
46
47
  "VPN_BLOCKED": "คำขอจากการเชื่อมต่อ VPN ไม่ได้รับอนุญาตสำหรับเว็บไซต์นี้",
47
48
  "PROXY_BLOCKED": "คำขอจากเซิร์ฟเวอร์พร็อกซีไม่ได้รับอนุญาตสำหรับเว็บไซต์นี้",
48
49
  "TOR_BLOCKED": "คำขอจากโหนดทางออก Tor ไม่ได้รับอนุญาตสำหรับเว็บไซต์นี้",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Geçersiz gövde",
44
44
  "PARSE_ERROR": "İstek ayrıştırma hatası",
45
45
  "SPAM_EMAIL_RULE": "E-posta adresi spam filtresi kuralları tarafından engellendi",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Bu e-posta adresinden çok fazla gönderi",
46
47
  "VPN_BLOCKED": "Bu site için VPN bağlantılarından gelen isteklere izin verilmiyor",
47
48
  "PROXY_BLOCKED": "Bu site için proxy sunucularından gelen isteklere izin verilmiyor",
48
49
  "TOR_BLOCKED": "Bu site için Tor çıkış düğümlerinden gelen isteklere izin verilmiyor",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Invalid body",
44
44
  "PARSE_ERROR": "Error parsing request",
45
45
  "SPAM_EMAIL_RULE": "Адресу електронної пошти заблоковано правилами спам-фільтра",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Забагато надсилань з цієї адреси електронної пошти",
46
47
  "VPN_BLOCKED": "Запити з VPN-з'єднань не дозволені для цього сайту",
47
48
  "PROXY_BLOCKED": "Запити з проксі-серверів не дозволені для цього сайту",
48
49
  "TOR_BLOCKED": "Запити з вихідних вузлів Tor не дозволені для цього сайту",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "Nội dung không hợp lệ",
44
44
  "PARSE_ERROR": "Lỗi phân tích yêu cầu",
45
45
  "SPAM_EMAIL_RULE": "Địa chỉ email bị chặn bởi quy tắc bộ lọc spam",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Quá nhiều lượt gửi từ địa chỉ email này",
46
47
  "VPN_BLOCKED": "Các yêu cầu từ kết nối VPN không được phép cho trang web này",
47
48
  "PROXY_BLOCKED": "Các yêu cầu từ máy chủ proxy không được phép cho trang web này",
48
49
  "TOR_BLOCKED": "Các yêu cầu từ nút thoát Tor không được phép cho trang web này",
@@ -43,6 +43,7 @@
43
43
  "INVALID_BODY": "无效的主体",
44
44
  "PARSE_ERROR": "解析请求时出错",
45
45
  "SPAM_EMAIL_RULE": "电子邮件地址被垃圾邮件过滤规则拦截",
46
+ "SPAM_EMAIL_COUNT_EXCEEDED": "该电子邮件地址提交次数过多",
46
47
  "VPN_BLOCKED": "此网站不允许来自VPN连接的请求",
47
48
  "PROXY_BLOCKED": "此网站不允许来自代理服务器的请求",
48
49
  "TOR_BLOCKED": "此网站不允许来自Tor出口节点的请求",
@@ -0,0 +1,2 @@
1
+ export declare const getProcess: () => NodeJS.Process | undefined;
2
+ //# sourceMappingURL=process.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.d.ts","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"AA2BA,eAAO,MAAM,UAAU,QAAO,MAAM,CAAC,OAAO,GAAG,SACM,CAAC"}
@@ -0,0 +1,17 @@
1
+ //#region src/process.ts
2
+ /**
3
+ * The `process` global, or undefined where there is none.
4
+ *
5
+ * This package is reached transitively from browser bundles, where `process`
6
+ * may be missing entirely or present but stripped down. A bare `process.env`
7
+ * read throws a ReferenceError in that case and takes the whole page down.
8
+ *
9
+ * It is a function, and it lives in its own module, so callers can be tested
10
+ * against a runtime that has no `process` at all. Inlining the `typeof` check
11
+ * at the point of use makes that branch untestable: vitest calls
12
+ * `process.memoryUsage()` between suites, so stubbing the real global away
13
+ * fails the run rather than the module under test.
14
+ */
15
+ var getProcess = () => typeof process !== "undefined" ? process : void 0;
16
+ //#endregion
17
+ export { getProcess };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process.js","sourceRoot":"","sources":["../src/process.ts"],"names":[],"mappings":"AA2BA,MAAM,CAAC,MAAM,UAAU,GAAG,GAA+B,EAAE,CAC1D,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=i18SharedOptions.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18SharedOptions.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/i18SharedOptions.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,91 @@
1
+ import { afterEach, beforeEach, describe, expect, test, vi } from "vitest";
2
+ import { Languages } from "../translations.js";
3
+ const loadOptions = async () => {
4
+ vi.resetModules();
5
+ const { i18nSharedOptions } = await import("../i18SharedOptions.js");
6
+ return i18nSharedOptions;
7
+ };
8
+ const originalLogLevel = process.env.PROSOPO_LOG_LEVEL;
9
+ beforeEach(() => {
10
+ Reflect.deleteProperty(process.env, "PROSOPO_LOG_LEVEL");
11
+ });
12
+ afterEach(() => {
13
+ vi.doUnmock("../process.js");
14
+ vi.resetModules();
15
+ if (originalLogLevel === undefined) {
16
+ Reflect.deleteProperty(process.env, "PROSOPO_LOG_LEVEL");
17
+ }
18
+ else {
19
+ process.env.PROSOPO_LOG_LEVEL = originalLogLevel;
20
+ }
21
+ });
22
+ describe("i18nSharedOptions", () => {
23
+ test("falls back to English", async () => {
24
+ const options = await loadOptions();
25
+ expect(options.fallbackLng).toBe("en");
26
+ });
27
+ test("uses the single translation namespace", async () => {
28
+ const options = await loadOptions();
29
+ expect(options.namespace).toBe("translation");
30
+ });
31
+ test("supports exactly the declared language codes", async () => {
32
+ const options = await loadOptions();
33
+ expect(new Set(options.supportedLngs)).toEqual(new Set(Object.values(Languages)));
34
+ });
35
+ test("does not accept non-explicit regional variants", async () => {
36
+ const options = await loadOptions();
37
+ expect(options.nonExplicitSupportedLngs).toBe(false);
38
+ });
39
+ describe("debug flag", () => {
40
+ test("is off when PROSOPO_LOG_LEVEL is unset", async () => {
41
+ const options = await loadOptions();
42
+ expect(options.debug).toBe(false);
43
+ });
44
+ test("is on only for the exact value 'debug'", async () => {
45
+ process.env.PROSOPO_LOG_LEVEL = "debug";
46
+ expect((await loadOptions()).debug).toBe(true);
47
+ });
48
+ test("is off for any other log level", async () => {
49
+ for (const level of ["info", "warn", "error", "trace", ""]) {
50
+ process.env.PROSOPO_LOG_LEVEL = level;
51
+ expect((await loadOptions()).debug, level).toBe(false);
52
+ }
53
+ });
54
+ test("is case sensitive — 'DEBUG' does not enable it", async () => {
55
+ process.env.PROSOPO_LOG_LEVEL = "DEBUG";
56
+ expect((await loadOptions()).debug).toBe(false);
57
+ });
58
+ });
59
+ describe("browser runtime, where process may be absent or partial", () => {
60
+ const mockProcess = (value) => {
61
+ vi.resetModules();
62
+ vi.doMock("../process.js", () => ({
63
+ getProcess: () => value,
64
+ }));
65
+ };
66
+ test("loads when there is no process at all", async () => {
67
+ mockProcess(undefined);
68
+ const { i18nSharedOptions } = await import("../i18SharedOptions.js");
69
+ expect(i18nSharedOptions.debug).toBe(false);
70
+ expect(i18nSharedOptions.fallbackLng).toBe("en");
71
+ });
72
+ test("loads when process exists but exposes no env", async () => {
73
+ const partial = Object.create(process);
74
+ Reflect.defineProperty(partial, "env", {
75
+ value: undefined,
76
+ configurable: true,
77
+ });
78
+ mockProcess(partial);
79
+ const { i18nSharedOptions } = await import("../i18SharedOptions.js");
80
+ expect(i18nSharedOptions.debug).toBe(false);
81
+ expect(i18nSharedOptions.fallbackLng).toBe("en");
82
+ });
83
+ test("still reads the log level when process is present", async () => {
84
+ process.env.PROSOPO_LOG_LEVEL = "debug";
85
+ mockProcess(process);
86
+ const { i18nSharedOptions } = await import("../i18SharedOptions.js");
87
+ expect(i18nSharedOptions.debug).toBe(true);
88
+ });
89
+ });
90
+ });
91
+ //# sourceMappingURL=i18SharedOptions.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18SharedOptions.unit.test.js","sourceRoot":"","sources":["../../src/tests/i18SharedOptions.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=i18nBackend.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18nBackend.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/i18nBackend.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,153 @@
1
+ import { afterEach, describe, expect, test, vi } from "vitest";
2
+ const makeHarness = (isInitialized) => {
3
+ const plugins = [];
4
+ const initOptions = [];
5
+ const listeners = new Map();
6
+ const fake = {
7
+ isInitialized,
8
+ use: (plugin) => {
9
+ plugins.push(plugin);
10
+ return fake;
11
+ },
12
+ init: (options) => {
13
+ initOptions.push(options);
14
+ return fake;
15
+ },
16
+ on: (event, listener) => {
17
+ listeners.set(event, [...(listeners.get(event) ?? []), listener]);
18
+ },
19
+ };
20
+ return {
21
+ fake,
22
+ plugins,
23
+ initOptions,
24
+ listeners,
25
+ emit: (event) => {
26
+ for (const listener of listeners.get(event) ?? []) {
27
+ listener();
28
+ }
29
+ },
30
+ };
31
+ };
32
+ const load = async (options) => {
33
+ vi.resetModules();
34
+ const harness = makeHarness(options.isInitialized ?? false);
35
+ vi.doMock("i18next", () => ({ default: harness.fake }));
36
+ vi.doMock("i18next-fs-backend/cjs", () => ({ default: "FSBackend" }));
37
+ vi.doMock("i18next-http-middleware", () => ({
38
+ LanguageDetector: class {
39
+ constructor(_services, opts) {
40
+ this.options = opts;
41
+ }
42
+ },
43
+ }));
44
+ vi.doMock("../util.js", () => ({
45
+ isServerSide: () => options.serverSide ?? true,
46
+ isClientSide: () => !(options.serverSide ?? true),
47
+ }));
48
+ const imported = await import("../i18nBackend.js");
49
+ return { initializeI18n: imported.default, harness };
50
+ };
51
+ afterEach(() => {
52
+ vi.resetModules();
53
+ vi.doUnmock("i18next");
54
+ vi.doUnmock("i18next-fs-backend/cjs");
55
+ vi.doUnmock("i18next-http-middleware");
56
+ vi.doUnmock("../util.js");
57
+ });
58
+ describe("i18nBackend on a server, not yet initialised", () => {
59
+ test("initialises i18next exactly once", async () => {
60
+ const { initializeI18n, harness } = await load({});
61
+ initializeI18n();
62
+ expect(harness.initOptions).toHaveLength(1);
63
+ });
64
+ test("registers the filesystem backend and the header language detector", async () => {
65
+ const { initializeI18n, harness } = await load({});
66
+ initializeI18n();
67
+ expect(harness.plugins).toHaveLength(2);
68
+ expect(harness.plugins[0]).toBe("FSBackend");
69
+ });
70
+ test("carries the shared options through to init", async () => {
71
+ const { initializeI18n, harness } = await load({});
72
+ initializeI18n();
73
+ const options = harness.initOptions[0];
74
+ expect(options?.fallbackLng).toBe("en");
75
+ expect(options?.supportedLngs).toContain("en");
76
+ expect(options?.nonExplicitSupportedLngs).toBe(false);
77
+ });
78
+ test("declares the translation namespace", async () => {
79
+ const { initializeI18n, harness } = await load({});
80
+ initializeI18n();
81
+ expect(harness.initOptions[0]?.ns).toEqual(["translation"]);
82
+ });
83
+ test("points the backend at a filesystem path, not a file:// URL", async () => {
84
+ const { initializeI18n, harness } = await load({});
85
+ initializeI18n();
86
+ const backend = harness.initOptions[0]?.backend;
87
+ expect(backend?.loadPath).toBeDefined();
88
+ expect(backend?.loadPath).not.toContain("file://");
89
+ expect(backend?.loadPath).toContain("/locales/{{lng}}/{{ns}}.json");
90
+ });
91
+ test("defers the callback until resources have loaded", async () => {
92
+ const callback = vi.fn();
93
+ const { initializeI18n, harness } = await load({});
94
+ initializeI18n(callback);
95
+ expect(callback).not.toHaveBeenCalled();
96
+ harness.emit("loaded");
97
+ expect(callback).toHaveBeenCalledTimes(1);
98
+ });
99
+ test("fires the callback once, however often `loaded` is emitted", async () => {
100
+ const callback = vi.fn();
101
+ const { initializeI18n, harness } = await load({});
102
+ initializeI18n(callback);
103
+ harness.emit("loaded");
104
+ harness.emit("loaded");
105
+ harness.emit("loaded");
106
+ expect(callback).toHaveBeenCalledTimes(1);
107
+ });
108
+ test("hands the i18next instance to the callback", async () => {
109
+ const callback = vi.fn();
110
+ const { initializeI18n, harness } = await load({});
111
+ initializeI18n(callback);
112
+ harness.emit("loaded");
113
+ expect(callback).toHaveBeenCalledWith(harness.fake);
114
+ });
115
+ test("returns the i18next instance", async () => {
116
+ const { initializeI18n, harness } = await load({});
117
+ expect(initializeI18n()).toBe(harness.fake);
118
+ });
119
+ test("tolerates being called with no callback at all", async () => {
120
+ const { initializeI18n, harness } = await load({});
121
+ initializeI18n();
122
+ expect(() => harness.emit("loaded")).not.toThrow();
123
+ });
124
+ });
125
+ describe("i18nBackend when there is nothing to initialise", () => {
126
+ test("fires the callback immediately when i18next is already up", async () => {
127
+ const callback = vi.fn();
128
+ const { initializeI18n, harness } = await load({ isInitialized: true });
129
+ const returned = initializeI18n(callback);
130
+ expect(harness.initOptions).toHaveLength(0);
131
+ expect(callback).toHaveBeenCalledTimes(1);
132
+ expect(callback).toHaveBeenCalledWith(harness.fake);
133
+ expect(returned).toBe(harness.fake);
134
+ });
135
+ test("fires the callback immediately when running client side", async () => {
136
+ const callback = vi.fn();
137
+ const { initializeI18n, harness } = await load({ serverSide: false });
138
+ const returned = initializeI18n(callback);
139
+ expect(harness.initOptions).toHaveLength(0);
140
+ expect(callback).toHaveBeenCalledTimes(1);
141
+ expect(returned).toBe(harness.fake);
142
+ });
143
+ test("registers no plugins when initialisation is skipped", async () => {
144
+ const { initializeI18n, harness } = await load({ isInitialized: true });
145
+ initializeI18n();
146
+ expect(harness.plugins).toHaveLength(0);
147
+ });
148
+ test("tolerates no callback when initialisation is skipped", async () => {
149
+ const { initializeI18n } = await load({ isInitialized: true });
150
+ expect(() => initializeI18n()).not.toThrow();
151
+ });
152
+ });
153
+ //# sourceMappingURL=i18nBackend.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18nBackend.unit.test.js","sourceRoot":"","sources":["../../src/tests/i18nBackend.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=i18nFrontend.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18nFrontend.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/i18nFrontend.unit.test.ts"],"names":[],"mappings":""}