@prosopo/locale 3.11.1 → 3.12.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 (125) hide show
  1. package/.turbo/turbo-build$colon$cjs.log +6 -6
  2. package/.turbo/turbo-build$colon$tsc.log +5 -5
  3. package/.turbo/turbo-build.log +18 -18
  4. package/CHANGELOG.md +47 -0
  5. package/README.md +11 -9
  6. package/dist/cjs/errorMessage.cjs +11 -10
  7. package/dist/cjs/index.cjs +2 -1
  8. package/dist/cjs/locales/en/widget.cjs +44 -1
  9. package/dist/cjs/translationKey.cjs +3 -3
  10. package/dist/errorMessage.d.ts +6 -4
  11. package/dist/errorMessage.d.ts.map +1 -1
  12. package/dist/errorMessage.js +10 -10
  13. package/dist/errorMessage.js.map +1 -1
  14. package/dist/index.d.ts +2 -2
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +2 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/locales/af/widget.json +41 -0
  19. package/dist/locales/am/widget.json +41 -0
  20. package/dist/locales/an/widget.json +41 -0
  21. package/dist/locales/ar/widget.json +41 -0
  22. package/dist/locales/as/widget.json +41 -0
  23. package/dist/locales/ast/widget.json +41 -0
  24. package/dist/locales/az/widget.json +41 -0
  25. package/dist/locales/be/widget.json +41 -0
  26. package/dist/locales/bg/widget.json +41 -0
  27. package/dist/locales/bn/widget.json +41 -0
  28. package/dist/locales/bs/widget.json +41 -0
  29. package/dist/locales/ca/widget.json +41 -0
  30. package/dist/locales/cs/widget.json +41 -0
  31. package/dist/locales/cy/widget.json +41 -0
  32. package/dist/locales/da/widget.json +41 -0
  33. package/dist/locales/de/widget.json +41 -0
  34. package/dist/locales/el/widget.json +41 -0
  35. package/dist/locales/en/widget.js +44 -2
  36. package/dist/locales/en/widget.json +41 -0
  37. package/dist/locales/eo/widget.json +41 -0
  38. package/dist/locales/es/widget.json +41 -0
  39. package/dist/locales/et/widget.json +41 -0
  40. package/dist/locales/eu/widget.json +41 -0
  41. package/dist/locales/fa/widget.json +41 -0
  42. package/dist/locales/fi/widget.json +41 -0
  43. package/dist/locales/fil/widget.json +41 -0
  44. package/dist/locales/fr/widget.json +41 -0
  45. package/dist/locales/fy/widget.json +41 -0
  46. package/dist/locales/ga/widget.json +41 -0
  47. package/dist/locales/gd/widget.json +41 -0
  48. package/dist/locales/gl/widget.json +41 -0
  49. package/dist/locales/gu/widget.json +41 -0
  50. package/dist/locales/he/widget.json +41 -0
  51. package/dist/locales/hi/widget.json +41 -0
  52. package/dist/locales/hr/widget.json +41 -0
  53. package/dist/locales/hu/widget.json +41 -0
  54. package/dist/locales/hy/widget.json +41 -0
  55. package/dist/locales/ia/widget.json +41 -0
  56. package/dist/locales/id/widget.json +41 -0
  57. package/dist/locales/is/widget.json +41 -0
  58. package/dist/locales/it/widget.json +41 -0
  59. package/dist/locales/ja/widget.json +41 -0
  60. package/dist/locales/jv/widget.json +41 -0
  61. package/dist/locales/ka/widget.json +41 -0
  62. package/dist/locales/kk/widget.json +41 -0
  63. package/dist/locales/km/widget.json +41 -0
  64. package/dist/locales/kn/widget.json +41 -0
  65. package/dist/locales/ko/widget.json +41 -0
  66. package/dist/locales/ky/widget.json +41 -0
  67. package/dist/locales/lo/widget.json +41 -0
  68. package/dist/locales/lt/widget.json +41 -0
  69. package/dist/locales/lv/widget.json +41 -0
  70. package/dist/locales/mk/widget.json +41 -0
  71. package/dist/locales/ml/widget.json +41 -0
  72. package/dist/locales/mn/widget.json +41 -0
  73. package/dist/locales/mr/widget.json +41 -0
  74. package/dist/locales/ms/widget.json +41 -0
  75. package/dist/locales/my/widget.json +41 -0
  76. package/dist/locales/ne/widget.json +41 -0
  77. package/dist/locales/nl/widget.json +41 -0
  78. package/dist/locales/nn/widget.json +41 -0
  79. package/dist/locales/no/widget.json +41 -0
  80. package/dist/locales/oc/widget.json +41 -0
  81. package/dist/locales/or/widget.json +41 -0
  82. package/dist/locales/pa/widget.json +41 -0
  83. package/dist/locales/pl/widget.json +41 -0
  84. package/dist/locales/pt/widget.json +41 -0
  85. package/dist/locales/pt-BR/widget.json +41 -0
  86. package/dist/locales/rm/widget.json +41 -0
  87. package/dist/locales/ro/widget.json +41 -0
  88. package/dist/locales/ru/widget.json +41 -0
  89. package/dist/locales/sco/widget.json +41 -0
  90. package/dist/locales/si/widget.json +41 -0
  91. package/dist/locales/sk/widget.json +41 -0
  92. package/dist/locales/sl/widget.json +41 -0
  93. package/dist/locales/sq/widget.json +41 -0
  94. package/dist/locales/sr/widget.json +41 -0
  95. package/dist/locales/sv/widget.json +41 -0
  96. package/dist/locales/sw/widget.json +41 -0
  97. package/dist/locales/ta/widget.json +41 -0
  98. package/dist/locales/te/widget.json +41 -0
  99. package/dist/locales/tg/widget.json +41 -0
  100. package/dist/locales/th/widget.json +41 -0
  101. package/dist/locales/tr/widget.json +41 -0
  102. package/dist/locales/uk/widget.json +41 -0
  103. package/dist/locales/ur/widget.json +41 -0
  104. package/dist/locales/uz/widget.json +41 -0
  105. package/dist/locales/vi/widget.json +41 -0
  106. package/dist/locales/xh/widget.json +41 -0
  107. package/dist/locales/zh/widget.json +41 -0
  108. package/dist/locales/zh-CN/widget.json +41 -0
  109. package/dist/locales/zh-HK/widget.json +41 -0
  110. package/dist/locales/zh-TW/widget.json +41 -0
  111. package/dist/locales/zu/widget.json +41 -0
  112. package/dist/tests/errorMessage.unit.test.js +41 -31
  113. package/dist/tests/errorMessage.unit.test.js.map +1 -1
  114. package/dist/tests/resultReasonKeys.unit.test.d.ts +2 -0
  115. package/dist/tests/resultReasonKeys.unit.test.d.ts.map +1 -0
  116. package/dist/tests/resultReasonKeys.unit.test.js +26 -0
  117. package/dist/tests/resultReasonKeys.unit.test.js.map +1 -0
  118. package/dist/tests/translationKey.unit.test.js +1 -0
  119. package/dist/tests/translationKey.unit.test.js.map +1 -1
  120. package/dist/translationKey.js +3 -3
  121. package/package.json +10 -10
  122. package/dist/tests/thrownErrorKeys.unit.test.d.ts +0 -2
  123. package/dist/tests/thrownErrorKeys.unit.test.d.ts.map +0 -1
  124. package/dist/tests/thrownErrorKeys.unit.test.js +0 -51
  125. package/dist/tests/thrownErrorKeys.unit.test.js.map +0 -1
@@ -145,5 +145,46 @@
145
145
  "MISSING_ENV_VARIABLE": "ماحولیاتی متغیر موجود نہیں",
146
146
  "GENERAL": "عمومی ڈیولپمنٹ خرابی، سیاق دیکھیں",
147
147
  "METHOD_NOT_IMPLEMENTED": "طریقہ نافذ نہیں کیا گیا"
148
+ },
149
+ "ERRORS": {
150
+ "BACKEND_ERROR": "سرور کی اندرونی خرابی",
151
+ "FRONTEND_ERROR": "نامعلوم API خرابی",
152
+ "INVALID_REQUEST": "غلط درخواست",
153
+ "UNAUTHORIZED": "غیر مجاز",
154
+ "FORBIDDEN": "ممنوع",
155
+ "SITE_KEY_INVALID": "غلط سائٹ کلید",
156
+ "SITE_KEY_NOT_REGISTERED": "سائٹ کلید رجسٹرڈ نہیں ہے",
157
+ "ORIGIN_NOT_ALLOWED": "غیر مجاز ماخذ URL",
158
+ "INVALID_IP": "غلط IP",
159
+ "INVALID_SOLUTION": "غلط حل",
160
+ "INVALID_SALT": "غلط سالٹ",
161
+ "INVALID_TIMESTAMP": "غلط ٹائم اسٹیمپ",
162
+ "TIMESTAMP_TOO_OLD": "ٹائم اسٹیمپ بہت پرانا ہے",
163
+ "NO_SESSION_FOUND": "کوئی سیشن نہیں ملا",
164
+ "SOLUTION_NOT_FOUND": "حل نہیں ملا",
165
+ "INCORRECT_CAPTCHA_TYPE": "غلط CAPTCHA قسم",
166
+ "CAPTCHA_FAILED": "آپ نے ایک یا زیادہ captcha کا غلط جواب دیا۔ براہ کرم دوبارہ کوشش کریں",
167
+ "CLIENT_SESSION_MISMATCH": "سیشن میں عدم مطابقت۔ captcha اس سیشن میں مکمل نہیں ہوا۔",
168
+ "DECISION_MACHINE_DENIED": "فیصلہ ساز نظام نے مسترد کر دیا",
169
+ "WALLET_NOT_FOUND": "کوئی ایکسٹینشن نہیں ملی",
170
+ "SITE_KEY_MISSING": "سائٹ کلید موجود نہیں",
171
+ "INSECURE_CONTEXT": "Procaptcha کو محفوظ (HTTPS) کنکشن درکار ہے",
172
+ "ACCOUNT_NOT_FOUND": "اکاؤنٹ نہیں ملا",
173
+ "FAILED_IP_VALIDATION": "IP کی توثیق ناکام ہو گئی",
174
+ "ACCESS_POLICY_BLOCK": "پالیسی کے تحت رسائی مسدود",
175
+ "ABUSER_BLOCKED": "اس سائٹ کے لیے غلط استعمال کے لیے نشان زدہ نیٹ ورکس سے درخواستوں کی اجازت نہیں ہے",
176
+ "CRAWLER_BLOCKED": "اس سائٹ کے لیے معروف کرالرز سے درخواستوں کی اجازت نہیں ہے",
177
+ "DATACENTER_BLOCKED": "اس سائٹ کے لیے ڈیٹا سینٹر کے IP پتوں سے درخواستوں کی اجازت نہیں ہے",
178
+ "DISALLOWED_WEBVIEW": "اس سائٹ کے لیے ایپ کے اندر کے براؤزرز (WebView) سے درخواستوں کی اجازت نہیں ہے",
179
+ "MOBILE_BLOCKED": "اس سائٹ کے لیے موبائل نیٹ ورک کنکشنز سے درخواستوں کی اجازت نہیں ہے",
180
+ "PROXY_BLOCKED": "اس سائٹ کے لیے پراکسی سرورز سے درخواستوں کی اجازت نہیں ہے",
181
+ "SATELLITE_BLOCKED": "اس سائٹ کے لیے سیٹلائٹ کنکشنز سے درخواستوں کی اجازت نہیں ہے",
182
+ "TOR_BLOCKED": "اس سائٹ کے لیے Tor ایگزٹ نوڈز سے درخواستوں کی اجازت نہیں ہے",
183
+ "VPN_BLOCKED": "اس سائٹ کے لیے VPN کنکشنز سے درخواستوں کی اجازت نہیں ہے",
184
+ "TOO_MANY_LOCALHOST": "اس سائٹ کلید کے لیے localhost سے بہت زیادہ CAPTCHA درخواستیں",
185
+ "SPAM_EMAIL_DOMAIN": "ای میل ڈومین کی اجازت نہیں ہے",
186
+ "SPAM_EMAIL_RULE": "ای میل پتہ اسپام فلٹر کے قواعد کے تحت مسدود ہے",
187
+ "SPAM_EMAIL_COUNT_EXCEEDED": "اس ای میل پتے سے بہت زیادہ جمع کرائیاں",
188
+ "PROVIDER_VERIFY_FAILED": "فراہم کنندہ کی تصدیق ناکام ہو گئی"
148
189
  }
149
190
  }
@@ -145,5 +145,46 @@
145
145
  "MISSING_ENV_VARIABLE": "Muhit o‘zgaruvchisi yo‘q",
146
146
  "GENERAL": "Umumiy ishlab chiqish xatosi, kontekstga qarang",
147
147
  "METHOD_NOT_IMPLEMENTED": "Usul amalga oshirilmagan"
148
+ },
149
+ "ERRORS": {
150
+ "BACKEND_ERROR": "Serverning ichki xatosi",
151
+ "FRONTEND_ERROR": "Noma’lum API xatosi",
152
+ "INVALID_REQUEST": "Noto‘g‘ri so‘rov",
153
+ "UNAUTHORIZED": "Ruxsat berilmagan",
154
+ "FORBIDDEN": "Taqiqlangan",
155
+ "SITE_KEY_INVALID": "Yaroqsiz sayt kaliti",
156
+ "SITE_KEY_NOT_REGISTERED": "Sayt kaliti ro‘yxatdan o‘tmagan",
157
+ "ORIGIN_NOT_ALLOWED": "Ruxsatsiz manba URL",
158
+ "INVALID_IP": "Yaroqsiz IP",
159
+ "INVALID_SOLUTION": "Yaroqsiz yechim",
160
+ "INVALID_SALT": "Yaroqsiz tuz",
161
+ "INVALID_TIMESTAMP": "Yaroqsiz vaqt belgisi",
162
+ "TIMESTAMP_TOO_OLD": "Vaqt belgisi juda eski",
163
+ "NO_SESSION_FOUND": "Seans topilmadi",
164
+ "SOLUTION_NOT_FOUND": "Yechim topilmadi",
165
+ "INCORRECT_CAPTCHA_TYPE": "Noto‘g‘ri CAPTCHA turi",
166
+ "CAPTCHA_FAILED": "Bir yoki bir nechta captchaga noto‘g‘ri javob berdingiz. Qayta urinib ko‘ring",
167
+ "CLIENT_SESSION_MISMATCH": "Seans nomuvofiqligi. Captcha ushbu seansda bajarilmagan.",
168
+ "DECISION_MACHINE_DENIED": "Qaror mashinasi tomonidan rad etildi",
169
+ "WALLET_NOT_FOUND": "Kengaytma topilmadi",
170
+ "SITE_KEY_MISSING": "SAYT KALITI yo‘q",
171
+ "INSECURE_CONTEXT": "Procaptcha xavfsiz (HTTPS) ulanishni talab qiladi",
172
+ "ACCOUNT_NOT_FOUND": "Hisob topilmadi",
173
+ "FAILED_IP_VALIDATION": "IP tekshiruvi muvaffaqiyatsiz tugadi",
174
+ "ACCESS_POLICY_BLOCK": "Kirish siyosat tomonidan bloklandi",
175
+ "ABUSER_BLOCKED": "Bu sayt uchun suiiste’mol uchun belgilangan tarmoqlardan so‘rovlarga ruxsat berilmaydi",
176
+ "CRAWLER_BLOCKED": "Bu sayt uchun ma’lum qidiruv robotlaridan so‘rovlarga ruxsat berilmaydi",
177
+ "DATACENTER_BLOCKED": "Bu sayt uchun ma’lumotlar markazlari IP manzillaridan so‘rovlarga ruxsat berilmaydi",
178
+ "DISALLOWED_WEBVIEW": "Bu sayt uchun ilovalarga o‘rnatilgan brauzerlardan (WebView) so‘rovlarga ruxsat berilmaydi",
179
+ "MOBILE_BLOCKED": "Bu sayt uchun mobil tarmoq ulanishlaridan so‘rovlarga ruxsat berilmaydi",
180
+ "PROXY_BLOCKED": "Bu sayt uchun proksi serverlardan so‘rovlarga ruxsat berilmaydi",
181
+ "SATELLITE_BLOCKED": "Bu sayt uchun sun’iy yo‘ldosh ulanishlaridan so‘rovlarga ruxsat berilmaydi",
182
+ "TOR_BLOCKED": "Bu sayt uchun Tor chiqish tugunlaridan so‘rovlarga ruxsat berilmaydi",
183
+ "VPN_BLOCKED": "Bu sayt uchun VPN ulanishlaridan so‘rovlarga ruxsat berilmaydi",
184
+ "TOO_MANY_LOCALHOST": "Bu sayt kaliti uchun localhost’dan juda ko‘p CAPTCHA so‘rovlari",
185
+ "SPAM_EMAIL_DOMAIN": "Elektron pochta domeniga ruxsat berilmagan",
186
+ "SPAM_EMAIL_RULE": "Elektron pochta manzili spam filtri qoidalari bilan bloklangan",
187
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Bu elektron pochta manzilidan juda ko‘p yuborishlar",
188
+ "PROVIDER_VERIFY_FAILED": "Provayderni tekshirish muvaffaqiyatsiz tugadi"
148
189
  }
149
190
  }
@@ -145,5 +145,46 @@
145
145
  "MISSING_ENV_VARIABLE": "Thiếu biến môi trường",
146
146
  "GENERAL": "Lỗi phát triển chung, xem ngữ cảnh",
147
147
  "METHOD_NOT_IMPLEMENTED": "Phương thức chưa được triển khai"
148
+ },
149
+ "ERRORS": {
150
+ "BACKEND_ERROR": "Lỗi máy chủ nội bộ",
151
+ "FRONTEND_ERROR": "Lỗi API không xác định",
152
+ "INVALID_REQUEST": "Yêu cầu không hợp lệ",
153
+ "UNAUTHORIZED": "Không được phép",
154
+ "FORBIDDEN": "Bị cấm",
155
+ "SITE_KEY_INVALID": "Khóa trang web không hợp lệ",
156
+ "SITE_KEY_NOT_REGISTERED": "Khóa trang web chưa được đăng ký",
157
+ "ORIGIN_NOT_ALLOWED": "URL nguồn không được ủy quyền",
158
+ "INVALID_IP": "IP không hợp lệ",
159
+ "INVALID_SOLUTION": "Giải pháp không hợp lệ",
160
+ "INVALID_SALT": "Salt không hợp lệ",
161
+ "INVALID_TIMESTAMP": "Thời điểm không hợp lệ",
162
+ "TIMESTAMP_TOO_OLD": "Mốc thời gian quá cũ",
163
+ "NO_SESSION_FOUND": "Không tìm thấy phiên",
164
+ "SOLUTION_NOT_FOUND": "Không tìm thấy lời giải",
165
+ "INCORRECT_CAPTCHA_TYPE": "Loại CAPTCHA không đúng",
166
+ "CAPTCHA_FAILED": "Bạn đã trả lời một hoặc nhiều CAPTCHA không đúng. Vui lòng thử lại",
167
+ "CLIENT_SESSION_MISMATCH": "Phiên không khớp. Captcha không được hoàn thành trong phiên này.",
168
+ "DECISION_MACHINE_DENIED": "Bị máy quyết định từ chối",
169
+ "WALLET_NOT_FOUND": "Không tìm thấy tiện ích",
170
+ "SITE_KEY_MISSING": "SITE KEY thiếu",
171
+ "INSECURE_CONTEXT": "Procaptcha yêu cầu kết nối an toàn (HTTPS)",
172
+ "ACCOUNT_NOT_FOUND": "Không tìm thấy tài khoản",
173
+ "FAILED_IP_VALIDATION": "Xác thực IP thất bại",
174
+ "ACCESS_POLICY_BLOCK": "Truy cập bị chặn bởi chính sách",
175
+ "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",
176
+ "CRAWLER_BLOCKED": "Các yêu cầu từ trình thu thập dữ liệu đã biết không được phép cho trang web này",
177
+ "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",
178
+ "DISALLOWED_WEBVIEW": "Yêu cầu từ trình duyệt trong ứng dụng (WebView) không được phép cho trang web này",
179
+ "MOBILE_BLOCKED": "Các yêu cầu từ kết nối mạng di động không được phép cho trang web này",
180
+ "PROXY_BLOCKED": "Các yêu cầu từ máy chủ proxy không được phép cho trang web này",
181
+ "SATELLITE_BLOCKED": "Các yêu cầu từ kết nối vệ tinh không được phép cho trang web này",
182
+ "TOR_BLOCKED": "Các yêu cầu từ nút thoát Tor không được phép cho trang web này",
183
+ "VPN_BLOCKED": "Các yêu cầu từ kết nối VPN không được phép cho trang web này",
184
+ "TOO_MANY_LOCALHOST": "Quá nhiều yêu cầu CAPTCHA từ localhost cho khóa trang web này",
185
+ "SPAM_EMAIL_DOMAIN": "Tên miền email không được phép",
186
+ "SPAM_EMAIL_RULE": "Địa chỉ email bị chặn bởi quy tắc bộ lọc spam",
187
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Quá nhiều lượt gửi từ địa chỉ email này",
188
+ "PROVIDER_VERIFY_FAILED": "Xác thực nhà cung cấp không thành công"
148
189
  }
149
190
  }
@@ -145,5 +145,46 @@
145
145
  "MISSING_ENV_VARIABLE": "Into eguquguqukayo yokusingqongileyo ayikho",
146
146
  "GENERAL": "Impazamo jikelele yophuhliso, jonga umxholo",
147
147
  "METHOD_NOT_IMPLEMENTED": "Indlela ayiphunyezwanga"
148
+ },
149
+ "ERRORS": {
150
+ "BACKEND_ERROR": "Impazamo yangaphakathi yeseva",
151
+ "FRONTEND_ERROR": "Impazamo ye-API engaziwayo",
152
+ "INVALID_REQUEST": "Isicelo esibi",
153
+ "UNAUTHORIZED": "Akugunyaziswanga",
154
+ "FORBIDDEN": "Akuvumelekanga",
155
+ "SITE_KEY_INVALID": "Isitshixo sesiza esingasebenziyo",
156
+ "SITE_KEY_NOT_REGISTERED": "Isitshixo sesiza asibhaliswanga",
157
+ "ORIGIN_NOT_ALLOWED": "I-URL yemvelaphi engagunyaziswanga",
158
+ "INVALID_IP": "I-IP engasebenziyo",
159
+ "INVALID_SOLUTION": "Isisombululo esingasebenziyo",
160
+ "INVALID_SALT": "I-salt engasebenziyo",
161
+ "INVALID_TIMESTAMP": "Isitampu sexesha esingasebenziyo",
162
+ "TIMESTAMP_TOO_OLD": "Isitampu sexesha sidala kakhulu",
163
+ "NO_SESSION_FOUND": "Akukho seshoni ifumanekileyo",
164
+ "SOLUTION_NOT_FOUND": "Isisombululo asifumanekanga",
165
+ "INCORRECT_CAPTCHA_TYPE": "Uhlobo lwe-CAPTCHA olungachanekanga",
166
+ "CAPTCHA_FAILED": "Uphendule i-captcha enye okanye ngaphezulu ngendlela engachanekanga. Nceda uzame kwakhona",
167
+ "CLIENT_SESSION_MISMATCH": "Iseshoni ayihambelani. I-captcha ayigqitywanga kule seshoni.",
168
+ "DECISION_MACHINE_DENIED": "Kwaliwe yinjini yezigqibo",
169
+ "WALLET_NOT_FOUND": "Akukho songezelelo sifumanekileyo",
170
+ "SITE_KEY_MISSING": "Isitshixo sesiza asikho",
171
+ "INSECURE_CONTEXT": "I-Procaptcha ifuna uqhagamshelo olukhuselekileyo (HTTPS)",
172
+ "ACCOUNT_NOT_FOUND": "I-akhawunti ayifumanekanga",
173
+ "FAILED_IP_VALIDATION": "Ukuqinisekiswa kwe-IP kusilele",
174
+ "ACCESS_POLICY_BLOCK": "Ukufikelela kuvaliwe ngumgaqo-nkqubo",
175
+ "ABUSER_BLOCKED": "Izicelo ezivela kuthungelwano oluphawulwe ngokuxhaphaza azivumelekanga kule sayithi",
176
+ "CRAWLER_BLOCKED": "Izicelo ezivela kwii-crawler ezaziwayo azivumelekanga kule sayithi",
177
+ "DATACENTER_BLOCKED": "Izicelo ezivela kwiidilesi ze-IP zeziko ledatha azivumelekanga kule sayithi",
178
+ "DISALLOWED_WEBVIEW": "Izicelo ezivela kwiibhrawuza ezingaphakathi kwii-app (WebView) azivumelekanga kule sayithi",
179
+ "MOBILE_BLOCKED": "Izicelo ezivela kuqhagamshelo lothungelwano lweselula azivumelekanga kule sayithi",
180
+ "PROXY_BLOCKED": "Izicelo ezivela kwiiseva ze-proxy azivumelekanga kule sayithi",
181
+ "SATELLITE_BLOCKED": "Izicelo ezivela kuqhagamshelo lwesathelayithi azivumelekanga kule sayithi",
182
+ "TOR_BLOCKED": "Izicelo ezivela kwii-node zokuphuma ze-Tor azivumelekanga kule sayithi",
183
+ "VPN_BLOCKED": "Izicelo ezivela kuqhagamshelo lwe-VPN azivumelekanga kule sayithi",
184
+ "TOO_MANY_LOCALHOST": "Zininzi kakhulu izicelo ze-CAPTCHA ezivela ku-localhost zesi sitshixo sesiza",
185
+ "SPAM_EMAIL_DOMAIN": "Idomeyini ye-imeyile ayivumelekanga",
186
+ "SPAM_EMAIL_RULE": "Idilesi ye-imeyile ivalwe ngumthetho wokucoca ugaxekile",
187
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Zininzi kakhulu iingeniso ezivela kule dilesi ye-imeyile",
188
+ "PROVIDER_VERIFY_FAILED": "Ukujonga komboneleli kusilele"
148
189
  }
149
190
  }
@@ -145,5 +145,46 @@
145
145
  "MISSING_ENV_VARIABLE": "缺少环境变量",
146
146
  "GENERAL": "一般开发错误,请参考上下文",
147
147
  "METHOD_NOT_IMPLEMENTED": "方法未实现"
148
+ },
149
+ "ERRORS": {
150
+ "BACKEND_ERROR": "服务器内部错误",
151
+ "FRONTEND_ERROR": "未知API错误",
152
+ "INVALID_REQUEST": "错误的请求",
153
+ "UNAUTHORIZED": "未授权",
154
+ "FORBIDDEN": "禁止",
155
+ "SITE_KEY_INVALID": "无效的站点密钥",
156
+ "SITE_KEY_NOT_REGISTERED": "站点密钥未注册",
157
+ "ORIGIN_NOT_ALLOWED": "未授权的来源URL",
158
+ "INVALID_IP": "无效的IP",
159
+ "INVALID_SOLUTION": "无效的解决方案",
160
+ "INVALID_SALT": "盐值无效",
161
+ "INVALID_TIMESTAMP": "无效的时间戳",
162
+ "TIMESTAMP_TOO_OLD": "时间戳过旧",
163
+ "NO_SESSION_FOUND": "找不到会话",
164
+ "SOLUTION_NOT_FOUND": "未找到解答",
165
+ "INCORRECT_CAPTCHA_TYPE": "CAPTCHA类型不正确",
166
+ "CAPTCHA_FAILED": "您回答了一个或多个验证码不正确。请重试",
167
+ "CLIENT_SESSION_MISMATCH": "会话不匹配。此验证码不是在本会话中完成的。",
168
+ "DECISION_MACHINE_DENIED": "被决策机拒绝",
169
+ "WALLET_NOT_FOUND": "找不到扩展",
170
+ "SITE_KEY_MISSING": "缺少SITE KEY",
171
+ "INSECURE_CONTEXT": "Procaptcha 需要安全连接 (HTTPS)",
172
+ "ACCOUNT_NOT_FOUND": "找不到帐户",
173
+ "FAILED_IP_VALIDATION": "IP验证失败",
174
+ "ACCESS_POLICY_BLOCK": "访问被策略阻止",
175
+ "ABUSER_BLOCKED": "此网站不允许来自被标记为滥用的网络的请求",
176
+ "CRAWLER_BLOCKED": "此网站不允许来自已知爬虫的请求",
177
+ "DATACENTER_BLOCKED": "此网站不允许来自数据中心IP地址的请求",
178
+ "DISALLOWED_WEBVIEW": "此站点不允许来自应用内浏览器 (WebView) 的请求",
179
+ "MOBILE_BLOCKED": "此网站不允许来自移动网络连接的请求",
180
+ "PROXY_BLOCKED": "此网站不允许来自代理服务器的请求",
181
+ "SATELLITE_BLOCKED": "此网站不允许来自卫星连接的请求",
182
+ "TOR_BLOCKED": "此网站不允许来自Tor出口节点的请求",
183
+ "VPN_BLOCKED": "此网站不允许来自VPN连接的请求",
184
+ "TOO_MANY_LOCALHOST": "此站点密钥来自 localhost 的 CAPTCHA 请求过多",
185
+ "SPAM_EMAIL_DOMAIN": "不允许此电子邮件域名",
186
+ "SPAM_EMAIL_RULE": "电子邮件地址被垃圾邮件过滤规则拦截",
187
+ "SPAM_EMAIL_COUNT_EXCEEDED": "该电子邮件地址提交次数过多",
188
+ "PROVIDER_VERIFY_FAILED": "提供商验证失败"
148
189
  }
149
190
  }
@@ -145,5 +145,46 @@
145
145
  "MISSING_ENV_VARIABLE": "缺少环境变量",
146
146
  "GENERAL": "一般开发错误,请参考上下文",
147
147
  "METHOD_NOT_IMPLEMENTED": "方法未实现"
148
+ },
149
+ "ERRORS": {
150
+ "BACKEND_ERROR": "服务器内部错误",
151
+ "FRONTEND_ERROR": "未知API错误",
152
+ "INVALID_REQUEST": "错误的请求",
153
+ "UNAUTHORIZED": "未授权",
154
+ "FORBIDDEN": "禁止",
155
+ "SITE_KEY_INVALID": "无效的站点密钥",
156
+ "SITE_KEY_NOT_REGISTERED": "站点密钥未注册",
157
+ "ORIGIN_NOT_ALLOWED": "未授权的来源URL",
158
+ "INVALID_IP": "无效的IP",
159
+ "INVALID_SOLUTION": "无效的解决方案",
160
+ "INVALID_SALT": "盐值无效",
161
+ "INVALID_TIMESTAMP": "无效的时间戳",
162
+ "TIMESTAMP_TOO_OLD": "时间戳过旧",
163
+ "NO_SESSION_FOUND": "找不到会话",
164
+ "SOLUTION_NOT_FOUND": "未找到解答",
165
+ "INCORRECT_CAPTCHA_TYPE": "CAPTCHA类型不正确",
166
+ "CAPTCHA_FAILED": "您回答了一个或多个验证码不正确。请重试",
167
+ "CLIENT_SESSION_MISMATCH": "会话不匹配。此验证码不是在本会话中完成的。",
168
+ "DECISION_MACHINE_DENIED": "被决策机拒绝",
169
+ "WALLET_NOT_FOUND": "找不到扩展",
170
+ "SITE_KEY_MISSING": "缺少SITE KEY",
171
+ "INSECURE_CONTEXT": "Procaptcha 需要安全连接 (HTTPS)",
172
+ "ACCOUNT_NOT_FOUND": "找不到帐户",
173
+ "FAILED_IP_VALIDATION": "IP验证失败",
174
+ "ACCESS_POLICY_BLOCK": "访问被策略阻止",
175
+ "ABUSER_BLOCKED": "此网站不允许来自被标记为滥用的网络的请求",
176
+ "CRAWLER_BLOCKED": "此网站不允许来自已知爬虫的请求",
177
+ "DATACENTER_BLOCKED": "此网站不允许来自数据中心IP地址的请求",
178
+ "DISALLOWED_WEBVIEW": "此站点不允许来自应用内浏览器 (WebView) 的请求",
179
+ "MOBILE_BLOCKED": "此网站不允许来自移动网络连接的请求",
180
+ "PROXY_BLOCKED": "此网站不允许来自代理服务器的请求",
181
+ "SATELLITE_BLOCKED": "此网站不允许来自卫星连接的请求",
182
+ "TOR_BLOCKED": "此网站不允许来自Tor出口节点的请求",
183
+ "VPN_BLOCKED": "此网站不允许来自VPN连接的请求",
184
+ "TOO_MANY_LOCALHOST": "此站点密钥来自 localhost 的 CAPTCHA 请求过多",
185
+ "SPAM_EMAIL_DOMAIN": "不允许此电子邮件域名",
186
+ "SPAM_EMAIL_RULE": "电子邮件地址被垃圾邮件过滤规则拦截",
187
+ "SPAM_EMAIL_COUNT_EXCEEDED": "该电子邮件地址提交次数过多",
188
+ "PROVIDER_VERIFY_FAILED": "提供商验证失败"
148
189
  }
149
190
  }
@@ -145,5 +145,46 @@
145
145
  "MISSING_ENV_VARIABLE": "缺少環境變數",
146
146
  "GENERAL": "一般開發錯誤,請參考上下文",
147
147
  "METHOD_NOT_IMPLEMENTED": "方法未實現"
148
+ },
149
+ "ERRORS": {
150
+ "BACKEND_ERROR": "伺服器內部錯誤",
151
+ "FRONTEND_ERROR": "未知API錯誤",
152
+ "INVALID_REQUEST": "錯誤的請求",
153
+ "UNAUTHORIZED": "未授權",
154
+ "FORBIDDEN": "禁止",
155
+ "SITE_KEY_INVALID": "無效的網站金鑰",
156
+ "SITE_KEY_NOT_REGISTERED": "網站金鑰未註冊",
157
+ "ORIGIN_NOT_ALLOWED": "未授權的來源URL",
158
+ "INVALID_IP": "無效的IP",
159
+ "INVALID_SOLUTION": "無效的解決方案",
160
+ "INVALID_SALT": "鹽值無效",
161
+ "INVALID_TIMESTAMP": "無效的時間戳",
162
+ "TIMESTAMP_TOO_OLD": "時間戳過舊",
163
+ "NO_SESSION_FOUND": "找不到工作階段",
164
+ "SOLUTION_NOT_FOUND": "未找到解答",
165
+ "INCORRECT_CAPTCHA_TYPE": "CAPTCHA類型不正確",
166
+ "CAPTCHA_FAILED": "您回答了一個或多個驗證碼不正確。請重試",
167
+ "CLIENT_SESSION_MISMATCH": "工作階段不匹配。此驗證碼不是在本工作階段中完成的。",
168
+ "DECISION_MACHINE_DENIED": "被決策機拒絕",
169
+ "WALLET_NOT_FOUND": "找不到擴充功能",
170
+ "SITE_KEY_MISSING": "缺少SITE KEY",
171
+ "INSECURE_CONTEXT": "Procaptcha 需要安全連線 (HTTPS)",
172
+ "ACCOUNT_NOT_FOUND": "找不到帳戶",
173
+ "FAILED_IP_VALIDATION": "IP驗證失敗",
174
+ "ACCESS_POLICY_BLOCK": "存取被策略阻止",
175
+ "ABUSER_BLOCKED": "此網站不允許來自被標記為濫用的網路的請求",
176
+ "CRAWLER_BLOCKED": "此網站不允許來自已知爬蟲的請求",
177
+ "DATACENTER_BLOCKED": "此網站不允許來自資料中心IP 位址的請求",
178
+ "DISALLOWED_WEBVIEW": "此網站不允許來自應用內瀏覽器 (WebView) 的請求",
179
+ "MOBILE_BLOCKED": "此網站不允許來自行動網路連線的請求",
180
+ "PROXY_BLOCKED": "此網站不允許來自代理伺服器的請求",
181
+ "SATELLITE_BLOCKED": "此網站不允許來自衛星連線的請求",
182
+ "TOR_BLOCKED": "此網站不允許來自Tor出口節點的請求",
183
+ "VPN_BLOCKED": "此網站不允許來自VPN連線的請求",
184
+ "TOO_MANY_LOCALHOST": "此網站金鑰來自 localhost 的 CAPTCHA 請求過多",
185
+ "SPAM_EMAIL_DOMAIN": "不允許此電子郵件域名",
186
+ "SPAM_EMAIL_RULE": "電子郵件地址被垃圾郵件過濾規則攔截",
187
+ "SPAM_EMAIL_COUNT_EXCEEDED": "該電子郵件地址提交次數過多",
188
+ "PROVIDER_VERIFY_FAILED": "提供商驗證失敗"
148
189
  }
149
190
  }
@@ -145,5 +145,46 @@
145
145
  "MISSING_ENV_VARIABLE": "缺少環境變數",
146
146
  "GENERAL": "一般開發錯誤,請參考上下文",
147
147
  "METHOD_NOT_IMPLEMENTED": "方法未實現"
148
+ },
149
+ "ERRORS": {
150
+ "BACKEND_ERROR": "伺服器內部錯誤",
151
+ "FRONTEND_ERROR": "未知API錯誤",
152
+ "INVALID_REQUEST": "錯誤的請求",
153
+ "UNAUTHORIZED": "未授權",
154
+ "FORBIDDEN": "禁止",
155
+ "SITE_KEY_INVALID": "無效的網站金鑰",
156
+ "SITE_KEY_NOT_REGISTERED": "網站金鑰未註冊",
157
+ "ORIGIN_NOT_ALLOWED": "未授權的來源URL",
158
+ "INVALID_IP": "無效的IP",
159
+ "INVALID_SOLUTION": "無效的解決方案",
160
+ "INVALID_SALT": "鹽值無效",
161
+ "INVALID_TIMESTAMP": "無效的時間戳",
162
+ "TIMESTAMP_TOO_OLD": "時間戳過舊",
163
+ "NO_SESSION_FOUND": "找不到工作階段",
164
+ "SOLUTION_NOT_FOUND": "未找到解答",
165
+ "INCORRECT_CAPTCHA_TYPE": "CAPTCHA類型不正確",
166
+ "CAPTCHA_FAILED": "您回答了一個或多個驗證碼不正確。請重試",
167
+ "CLIENT_SESSION_MISMATCH": "工作階段不匹配。此驗證碼不是在本工作階段中完成的。",
168
+ "DECISION_MACHINE_DENIED": "被決策機拒絕",
169
+ "WALLET_NOT_FOUND": "找不到擴充功能",
170
+ "SITE_KEY_MISSING": "缺少SITE KEY",
171
+ "INSECURE_CONTEXT": "Procaptcha 需要安全連線 (HTTPS)",
172
+ "ACCOUNT_NOT_FOUND": "找不到帳戶",
173
+ "FAILED_IP_VALIDATION": "IP驗證失敗",
174
+ "ACCESS_POLICY_BLOCK": "存取被策略阻止",
175
+ "ABUSER_BLOCKED": "此網站不允許來自被標記為濫用的網路的請求",
176
+ "CRAWLER_BLOCKED": "此網站不允許來自已知爬蟲的請求",
177
+ "DATACENTER_BLOCKED": "此網站不允許來自資料中心IP 位址的請求",
178
+ "DISALLOWED_WEBVIEW": "此網站不允許來自應用內瀏覽器 (WebView) 的請求",
179
+ "MOBILE_BLOCKED": "此網站不允許來自行動網路連線的請求",
180
+ "PROXY_BLOCKED": "此網站不允許來自代理伺服器的請求",
181
+ "SATELLITE_BLOCKED": "此網站不允許來自衛星連線的請求",
182
+ "TOR_BLOCKED": "此網站不允許來自Tor出口節點的請求",
183
+ "VPN_BLOCKED": "此網站不允許來自VPN連線的請求",
184
+ "TOO_MANY_LOCALHOST": "此網站金鑰來自 localhost 的 CAPTCHA 請求過多",
185
+ "SPAM_EMAIL_DOMAIN": "不允許此電子郵件域名",
186
+ "SPAM_EMAIL_RULE": "電子郵件地址被垃圾郵件過濾規則攔截",
187
+ "SPAM_EMAIL_COUNT_EXCEEDED": "該電子郵件地址提交次數過多",
188
+ "PROVIDER_VERIFY_FAILED": "提供商驗證失敗"
148
189
  }
149
190
  }
@@ -145,5 +145,46 @@
145
145
  "MISSING_ENV_VARIABLE": "Okuguquguqukayo kwemvelo akukho",
146
146
  "GENERAL": "Iphutha elijwayelekile lokuthuthukisa, bheka umongo",
147
147
  "METHOD_NOT_IMPLEMENTED": "Indlela ayisetshenziswanga"
148
+ },
149
+ "ERRORS": {
150
+ "BACKEND_ERROR": "Iphutha leseva langaphakathi",
151
+ "FRONTEND_ERROR": "Iphutha le-API elingaziwa",
152
+ "INVALID_REQUEST": "Isicelo esibi",
153
+ "UNAUTHORIZED": "Akugunyaziwe",
154
+ "FORBIDDEN": "Kunqatshelwe",
155
+ "SITE_KEY_INVALID": "Ukhiye wesayithi ongavumelekile",
156
+ "SITE_KEY_NOT_REGISTERED": "Ukhiye wesayithi awubhalisiwe",
157
+ "ORIGIN_NOT_ALLOWED": "I-URL yomsuka engagunyaziwe",
158
+ "INVALID_IP": "I-IP engavumelekile",
159
+ "INVALID_SOLUTION": "Isixazululo esingavumelekile",
160
+ "INVALID_SALT": "I-salt engavumelekile",
161
+ "INVALID_TIMESTAMP": "Isitembu sesikhathi esingavumelekile",
162
+ "TIMESTAMP_TOO_OLD": "Isitembu sesikhathi sidala kakhulu",
163
+ "NO_SESSION_FOUND": "Ayikho iseshini etholakele",
164
+ "SOLUTION_NOT_FOUND": "Isixazululo asitholakalanga",
165
+ "INCORRECT_CAPTCHA_TYPE": "Uhlobo lwe-CAPTCHA olungalungile",
166
+ "CAPTCHA_FAILED": "Uphendule i-captcha eyodwa noma ngaphezulu ngokungalungile. Sicela uzame futhi",
167
+ "CLIENT_SESSION_MISMATCH": "Iseshini ayifani. I-captcha ayiqedwanga kule seshini.",
168
+ "DECISION_MACHINE_DENIED": "Kwenqatshwe yinjini yezinqumo",
169
+ "WALLET_NOT_FOUND": "Asikho isandiso esitholakele",
170
+ "SITE_KEY_MISSING": "Ukhiye wesayithi awukho",
171
+ "INSECURE_CONTEXT": "I-Procaptcha idinga uxhumano oluvikelekile (HTTPS)",
172
+ "ACCOUNT_NOT_FOUND": "I-akhawunti ayitholakalanga",
173
+ "FAILED_IP_VALIDATION": "Ukuqinisekiswa kwe-IP kwehlulekile",
174
+ "ACCESS_POLICY_BLOCK": "Ukufinyelela kuvinjelwe yinqubomgomo",
175
+ "ABUSER_BLOCKED": "Izicelo ezivela kumanethiwekhi aphawulwe ngokuhlukumeza azivunyelwe kule sayithi",
176
+ "CRAWLER_BLOCKED": "Izicelo ezivela kuma-crawler aziwayo azivunyelwe kule sayithi",
177
+ "DATACENTER_BLOCKED": "Izicelo ezivela kumakheli e-IP esikhungo sedatha azivunyelwe kule sayithi",
178
+ "DISALLOWED_WEBVIEW": "Izicelo ezivela eziphequlini ezingaphakathi kwezinhlelo zokusebenza (WebView) azivunyelwe kule sayithi",
179
+ "MOBILE_BLOCKED": "Izicelo ezivela ekuxhumekeni kwenethiwekhi yeselula azivunyelwe kule sayithi",
180
+ "PROXY_BLOCKED": "Izicelo ezivela kumaseva e-proxy azivunyelwe kule sayithi",
181
+ "SATELLITE_BLOCKED": "Izicelo ezivela ekuxhumekeni kwesathelayithi azivunyelwe kule sayithi",
182
+ "TOR_BLOCKED": "Izicelo ezivela kuma-node okuphuma e-Tor azivunyelwe kule sayithi",
183
+ "VPN_BLOCKED": "Izicelo ezivela ekuxhumekeni kwe-VPN azivunyelwe kule sayithi",
184
+ "TOO_MANY_LOCALHOST": "Kunezicelo eziningi kakhulu ze-CAPTCHA ezivela ku-localhost zalo khiye wesayithi",
185
+ "SPAM_EMAIL_DOMAIN": "Isizinda se-imeyili asivunyelwe",
186
+ "SPAM_EMAIL_RULE": "Ikheli le-imeyili livinjelwe yimithetho yokuhlunga ugaxekile",
187
+ "SPAM_EMAIL_COUNT_EXCEEDED": "Kunezithumelo eziningi kakhulu ezivela kuleli kheli le-imeyili",
188
+ "PROVIDER_VERIFY_FAILED": "Ukuhlola komhlinzeki kwehlulekile"
148
189
  }
149
190
  }
@@ -1,7 +1,11 @@
1
+ import { readFileSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
1
4
  import { flatten } from "@prosopo/util";
2
5
  import { describe, expect, test } from "vitest";
3
- import { localiseErrorMessage } from "../errorMessage.js";
6
+ import { FALLBACK_ERROR_TEXT, localiseError } from "../errorMessage.js";
4
7
  import de from "../locales/de/widget.json" with { type: "json" };
8
+ import en from "../locales/en/widget.json" with { type: "json" };
5
9
  const i18nIn = (catalogue, isInitialized = true) => {
6
10
  const flat = flatten(catalogue);
7
11
  return {
@@ -16,42 +20,48 @@ const i18nIn = (catalogue, isInitialized = true) => {
16
20
  };
17
21
  };
18
22
  const germanI18n = () => i18nIn(de);
19
- describe("localiseErrorMessage", () => {
20
- test("translates a catalogue key into the widget's language, not the server's", () => {
21
- const i18n = germanI18n();
22
- expect(localiseErrorMessage(i18n, {
23
+ describe("localiseError", () => {
24
+ test("translates the code into the widget's language", () => {
25
+ expect(localiseError(germanI18n(), {
26
+ code: "SITE_KEY_INVALID",
27
+ errorId: "SITE_KEY_INVALID:PROV-31",
23
28
  message: "Invalid site key",
24
- key: "API.INVALID_SITE_KEY",
25
- })).toBe("Ungültiger Site-Schlüssel");
29
+ })).toBe("Ungültiger Site-Schlüssel (SITE_KEY_INVALID:PROV-31)");
26
30
  });
27
- test("keeps the server message when the key is not in the catalogue", () => {
28
- const i18n = germanI18n();
29
- expect(localiseErrorMessage(i18n, {
30
- message: "upstream timed out",
31
- key: "API.NOT_A_REAL_KEY",
32
- })).toBe("upstream timed out");
31
+ test("translates the origin of a hidden error and keeps its errorId", () => {
32
+ expect(localiseError(germanI18n(), {
33
+ code: "BACKEND_ERROR",
34
+ errorId: "BACKEND_ERROR:PROV-12",
35
+ })).toBe("Interner Serverfehler (BACKEND_ERROR:PROV-12)");
33
36
  });
34
- test("keeps the server message for a key outside the widget namespace", () => {
35
- const i18n = germanI18n();
36
- expect(localiseErrorMessage(i18n, {
37
- message: "Datenbankfehler",
38
- key: "DATABASE.UNKNOWN",
39
- })).toBe("Datenbankfehler");
37
+ test("keeps the provider's message for a code the catalogue lacks", () => {
38
+ expect(localiseError(germanI18n(), {
39
+ code: "DOMAIN_LIMIT_REACHED",
40
+ errorId: "DOMAIN_LIMIT_REACHED:PORT-3",
41
+ message: "Domain limit reached",
42
+ })).toBe("Domain limit reached (DOMAIN_LIMIT_REACHED:PORT-3)");
40
43
  });
41
- test("keeps the server message when there is no key", () => {
42
- const i18n = germanI18n();
43
- expect(localiseErrorMessage(i18n, { message: "Invalid site key" })).toBe("Invalid site key");
44
+ test("falls back to generic text when there is no message", () => {
45
+ expect(localiseError(germanI18n(), { code: "NOPE", errorId: "NOPE:X-1" })).toBe(`${FALLBACK_ERROR_TEXT} (NOPE:X-1)`);
44
46
  });
45
- test("keeps the server message until i18n is initialised", () => {
46
- const i18n = i18nIn(de, false);
47
- expect(localiseErrorMessage(i18n, {
47
+ test("keeps the provider's message until i18n is initialised", () => {
48
+ const error = {
49
+ code: "SITE_KEY_INVALID",
50
+ errorId: "SITE_KEY_INVALID:PROV-31",
48
51
  message: "Invalid site key",
49
- key: "API.INVALID_SITE_KEY",
50
- })).toBe("Invalid site key");
51
- expect(localiseErrorMessage(undefined, {
52
- message: "Invalid site key",
53
- key: "API.INVALID_SITE_KEY",
54
- })).toBe("Invalid site key");
52
+ };
53
+ expect(localiseError(i18nIn(de, false), error)).toBe("Invalid site key (SITE_KEY_INVALID:PROV-31)");
54
+ expect(localiseError(undefined, error)).toBe("Invalid site key (SITE_KEY_INVALID:PROV-31)");
55
+ });
56
+ });
57
+ describe("the ERRORS catalogue", () => {
58
+ test("every locale translates every error the English catalogue has", () => {
59
+ const localesDir = fileURLToPath(new URL("../locales/", import.meta.url));
60
+ const codes = Object.keys(en.ERRORS).sort();
61
+ for (const locale of readdirSync(localesDir)) {
62
+ const catalogue = JSON.parse(readFileSync(join(localesDir, locale, "widget.json"), "utf8"));
63
+ expect(Object.keys(catalogue.ERRORS ?? {}).sort(), locale).toEqual(codes);
64
+ }
55
65
  });
56
66
  });
57
67
  //# sourceMappingURL=errorMessage.unit.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errorMessage.unit.test.js","sourceRoot":"","sources":["../../src/tests/errorMessage.unit.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errorMessage.unit.test.js","sourceRoot":"","sources":["../../src/tests/errorMessage.unit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resultReasonKeys.unit.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resultReasonKeys.unit.test.d.ts","sourceRoot":"","sources":["../../src/tests/resultReasonKeys.unit.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { describe, expect, test } from "vitest";
4
+ import { isTranslationKey } from "../serverTranslationKeys.js";
5
+ const PACKAGES_DIR = path.resolve("..");
6
+ const REASON_KEY = /=\s*"([A-Z][A-Z_]*\.[A-Z0-9_]+)"/g;
7
+ const isCatalogueKey = (key) => isTranslationKey(key);
8
+ const uncataloguedKeys = (files, pattern) => {
9
+ const missing = new Set();
10
+ for (const file of files) {
11
+ for (const match of fs.readFileSync(file, "utf8").matchAll(pattern)) {
12
+ const key = match[1];
13
+ if (key && !isCatalogueKey(key)) {
14
+ missing.add(`${key} (${path.relative(PACKAGES_DIR, file)})`);
15
+ }
16
+ }
17
+ }
18
+ return [...missing].sort();
19
+ };
20
+ describe("ResultReason keys", () => {
21
+ test("every ResultReason is in the catalogue", () => {
22
+ const reasons = path.join(PACKAGES_DIR, "types/src/provider/reasons.ts");
23
+ expect(uncataloguedKeys([reasons], REASON_KEY)).toEqual([]);
24
+ });
25
+ });
26
+ //# sourceMappingURL=resultReasonKeys.unit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resultReasonKeys.unit.test.js","sourceRoot":"","sources":["../../src/tests/resultReasonKeys.unit.test.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAM/D,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AACxC,MAAM,UAAU,GAAG,mCAAmC,CAAC;AAGvD,MAAM,cAAc,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;AAEvE,MAAM,gBAAgB,GAAG,CAAC,KAAe,EAAE,OAAe,EAAY,EAAE;IACvE,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACrE,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC9D,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC,CAAC;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;QACnD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,+BAA+B,CAAC,CAAC;QACzE,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -12,6 +12,7 @@ const widgetSections = [
12
12
  "GENERAL",
13
13
  "ACCOUNT",
14
14
  "DEVELOPER",
15
+ "ERRORS",
15
16
  ];
16
17
  describe("getLeafFieldPath", () => {
17
18
  test("returns no paths for a bare string, which is a leaf and not a container", () => {