schema-dsl 1.2.5 → 2.0.1

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 (243) hide show
  1. package/CHANGELOG.md +130 -238
  2. package/LICENSE +21 -21
  3. package/README.md +628 -2486
  4. package/dist/DslBuilder-BIgQOAXp.d.ts +343 -0
  5. package/dist/DslBuilder-CjHTucNQ.d.cts +343 -0
  6. package/dist/Validator-CllRdrY0.d.ts +192 -0
  7. package/dist/Validator-D6okG9tr.d.cts +192 -0
  8. package/dist/index.cjs +6640 -0
  9. package/dist/index.d.cts +1151 -0
  10. package/dist/index.d.ts +1151 -0
  11. package/dist/index.js +6574 -0
  12. package/dist/plugin-CIKtTMtS.d.cts +246 -0
  13. package/dist/plugin-CIKtTMtS.d.ts +246 -0
  14. package/dist/plugins/custom-format.cjs +3818 -0
  15. package/dist/plugins/custom-format.d.cts +12 -0
  16. package/dist/plugins/custom-format.d.ts +12 -0
  17. package/dist/plugins/custom-format.js +3788 -0
  18. package/dist/plugins/custom-type-example.cjs +3811 -0
  19. package/dist/plugins/custom-type-example.d.cts +8 -0
  20. package/dist/plugins/custom-type-example.d.ts +8 -0
  21. package/dist/plugins/custom-type-example.js +3781 -0
  22. package/dist/plugins/custom-validator.cjs +144 -0
  23. package/dist/plugins/custom-validator.d.cts +10 -0
  24. package/dist/plugins/custom-validator.d.ts +10 -0
  25. package/dist/plugins/custom-validator.js +119 -0
  26. package/docs/FEATURE-INDEX.md +553 -519
  27. package/docs/add-custom-locale.md +496 -483
  28. package/docs/add-keyword.md +24 -0
  29. package/docs/api-reference.md +1047 -805
  30. package/docs/api.md +13 -0
  31. package/docs/best-practices-project-structure.md +417 -408
  32. package/docs/best-practices.md +712 -672
  33. package/docs/cache-manager.md +344 -336
  34. package/docs/compile.md +45 -0
  35. package/docs/conditional-api.md +1307 -1278
  36. package/docs/custom-extensions-guide.md +339 -411
  37. package/docs/design-philosophy.md +606 -601
  38. package/docs/doc-index.md +324 -0
  39. package/docs/dsl-syntax.md +714 -664
  40. package/docs/dynamic-locale.md +608 -598
  41. package/docs/enum.md +482 -475
  42. package/docs/error-handling.md +1975 -1966
  43. package/docs/export-guide.md +501 -462
  44. package/docs/export-limitations.md +567 -551
  45. package/docs/faq.md +596 -577
  46. package/docs/frontend-i18n-guide.md +307 -293
  47. package/docs/i18n-user-guide.md +487 -474
  48. package/docs/i18n.md +476 -457
  49. package/docs/index.md +48 -0
  50. package/docs/json-schema-basics.md +40 -0
  51. package/docs/label-vs-description.md +271 -262
  52. package/docs/markdown-exporter.md +406 -397
  53. package/docs/mongodb-exporter.md +302 -295
  54. package/docs/multi-language.md +26 -0
  55. package/docs/multi-type-support.md +322 -329
  56. package/docs/mysql-exporter.md +280 -273
  57. package/docs/number-operators.md +449 -442
  58. package/docs/optional-marker-guide.md +326 -321
  59. package/docs/performance-guide.md +49 -0
  60. package/docs/plugin-system.md +381 -542
  61. package/docs/plugin-type-registration.md +34 -0
  62. package/docs/postgresql-exporter.md +311 -304
  63. package/docs/public/favicon.svg +5 -0
  64. package/docs/quick-start.md +435 -761
  65. package/docs/runtime-locale-support.md +532 -521
  66. package/docs/schema-helper.md +345 -340
  67. package/docs/schema-utils-advanced-issues.md +23 -0
  68. package/docs/schema-utils-best-practices.md +20 -0
  69. package/docs/schema-utils-chaining.md +150 -143
  70. package/docs/schema-utils.md +524 -490
  71. package/docs/security-checklist.md +20 -0
  72. package/docs/string-extensions.md +488 -480
  73. package/docs/troubleshooting.md +486 -471
  74. package/docs/type-converter.md +310 -319
  75. package/docs/type-reference.md +242 -219
  76. package/docs/typescript-guide.md +584 -573
  77. package/docs/union-type-guide.md +157 -147
  78. package/docs/union-types.md +284 -277
  79. package/docs/validate-async.md +491 -480
  80. package/docs/validate-batch.md +49 -0
  81. package/docs/validate-dsl-object-support.md +578 -573
  82. package/docs/validate.md +506 -486
  83. package/docs/validation-guide.md +502 -484
  84. package/docs/validator.md +39 -0
  85. package/package.json +131 -73
  86. package/plugins/custom-format.cjs +8 -0
  87. package/plugins/custom-type-example.cjs +8 -0
  88. package/plugins/custom-validator.cjs +8 -0
  89. package/src/adapters/DslAdapter.ts +111 -0
  90. package/src/adapters/index.ts +1 -0
  91. package/src/config/constants.ts +83 -0
  92. package/src/config/index.ts +2 -0
  93. package/src/config/patterns.ts +77 -0
  94. package/src/core/CacheManager.ts +169 -0
  95. package/src/core/ConditionalBuilder.ts +382 -0
  96. package/src/core/ConditionalRuntime.ts +28 -0
  97. package/src/core/ConditionalValidator.ts +255 -0
  98. package/src/core/DslBuilder.ts +687 -0
  99. package/src/core/ErrorCodes.ts +38 -0
  100. package/src/core/ErrorFormatter.ts +271 -0
  101. package/src/core/JSONSchemaCore.ts +65 -0
  102. package/src/core/Locale.ts +187 -0
  103. package/src/core/MessageTemplate.ts +42 -0
  104. package/src/core/ObjectDslBuilder.ts +64 -0
  105. package/src/core/PluginManager.ts +326 -0
  106. package/src/core/StringExtensions.ts +140 -0
  107. package/src/core/TemplateEngine.ts +44 -0
  108. package/src/core/Validator.ts +448 -0
  109. package/src/errors/I18nError.ts +159 -0
  110. package/src/errors/ValidationError.ts +105 -0
  111. package/src/exporters/BaseExporter.ts +60 -0
  112. package/src/exporters/MarkdownExporter.ts +305 -0
  113. package/src/exporters/MongoDBExporter.ts +126 -0
  114. package/src/exporters/MySQLExporter.ts +156 -0
  115. package/src/exporters/PostgreSQLExporter.ts +222 -0
  116. package/src/exporters/index.ts +18 -0
  117. package/src/index.ts +651 -0
  118. package/{lib/locales/en-US.js → src/locales/en-US.ts} +160 -176
  119. package/{lib/locales/es-ES.js → src/locales/es-ES.ts} +160 -113
  120. package/{lib/locales/fr-FR.js → src/locales/fr-FR.ts} +160 -113
  121. package/src/locales/index.ts +103 -0
  122. package/{lib/locales/ja-JP.js → src/locales/ja-JP.ts} +160 -118
  123. package/src/locales/types.ts +156 -0
  124. package/{lib/locales/zh-CN.js → src/locales/zh-CN.ts} +160 -177
  125. package/src/parser/ConstraintParser.ts +101 -0
  126. package/src/parser/DslParser.ts +470 -0
  127. package/src/parser/SchemaCompiler.ts +66 -0
  128. package/src/parser/TypeRegistry.ts +250 -0
  129. package/src/parser/index.ts +6 -0
  130. package/src/plugins/custom-format.ts +124 -0
  131. package/src/plugins/custom-type-example.ts +106 -0
  132. package/src/plugins/custom-validator.ts +138 -0
  133. package/src/types/conditional.ts +28 -0
  134. package/src/types/config.ts +59 -0
  135. package/src/types/dsl.ts +131 -0
  136. package/src/types/error.ts +60 -0
  137. package/src/types/index.ts +17 -0
  138. package/src/types/infer.ts +128 -0
  139. package/src/types/plugin.ts +58 -0
  140. package/src/types/safe-regex.d.ts +9 -0
  141. package/src/types/schema.ts +66 -0
  142. package/src/types/validate.ts +71 -0
  143. package/src/utils/SchemaHelper.ts +196 -0
  144. package/src/utils/SchemaUtils.ts +365 -0
  145. package/src/utils/TypeConverter.ts +215 -0
  146. package/src/utils/index.ts +10 -0
  147. package/src/validators/CustomKeywords.ts +477 -0
  148. package/.eslintignore +0 -11
  149. package/.eslintrc.json +0 -27
  150. package/CONTRIBUTING.md +0 -368
  151. package/STATUS.md +0 -491
  152. package/changelogs/v1.0.0.md +0 -328
  153. package/changelogs/v1.0.9.md +0 -367
  154. package/changelogs/v1.1.0.md +0 -389
  155. package/changelogs/v1.1.1.md +0 -308
  156. package/changelogs/v1.1.2.md +0 -183
  157. package/changelogs/v1.1.3.md +0 -161
  158. package/changelogs/v1.1.4.md +0 -432
  159. package/changelogs/v1.1.5.md +0 -493
  160. package/changelogs/v1.1.6.md +0 -211
  161. package/changelogs/v1.1.8.md +0 -376
  162. package/changelogs/v1.2.3.md +0 -124
  163. package/docs/INDEX.md +0 -252
  164. package/docs/issues-resolved-summary.md +0 -196
  165. package/docs/performance-benchmark-report.md +0 -179
  166. package/docs/performance-quick-reference.md +0 -123
  167. package/docs/user-questions-answered.md +0 -353
  168. package/docs/validation-rules-v1.0.2.md +0 -1608
  169. package/examples/README.md +0 -81
  170. package/examples/array-dsl-example.js +0 -227
  171. package/examples/conditional-example.js +0 -288
  172. package/examples/conditional-non-object.js +0 -129
  173. package/examples/conditional-validate-example.js +0 -321
  174. package/examples/custom-extension.js +0 -85
  175. package/examples/dsl-match-example.js +0 -74
  176. package/examples/dsl-style.js +0 -118
  177. package/examples/dynamic-locale-configuration.js +0 -348
  178. package/examples/dynamic-locale-example.js +0 -287
  179. package/examples/enum.examples.js +0 -324
  180. package/examples/export-demo.js +0 -130
  181. package/examples/express-integration.js +0 -376
  182. package/examples/i18n-error-handling-complete.js +0 -381
  183. package/examples/i18n-error-handling-quickstart.md +0 -0
  184. package/examples/i18n-error.examples.js +0 -181
  185. package/examples/i18n-full-demo.js +0 -301
  186. package/examples/i18n-memory-safety.examples.js +0 -268
  187. package/examples/markdown-export.js +0 -71
  188. package/examples/middleware-usage.js +0 -93
  189. package/examples/new-features-comparison.js +0 -315
  190. package/examples/password-reset/README.md +0 -153
  191. package/examples/password-reset/schema.js +0 -26
  192. package/examples/password-reset/test.js +0 -101
  193. package/examples/plugin-system.examples.js +0 -205
  194. package/examples/schema-utils-chaining.examples.js +0 -250
  195. package/examples/simple-example.js +0 -122
  196. package/examples/slug.examples.js +0 -179
  197. package/examples/string-extensions.js +0 -297
  198. package/examples/union-type-example.js +0 -127
  199. package/examples/union-types-example.js +0 -77
  200. package/examples/user-registration/README.md +0 -156
  201. package/examples/user-registration/routes.js +0 -92
  202. package/examples/user-registration/schema.js +0 -150
  203. package/examples/user-registration/server.js +0 -74
  204. package/index.d.ts +0 -3658
  205. package/index.js +0 -475
  206. package/index.mjs +0 -60
  207. package/lib/adapters/DslAdapter.js +0 -995
  208. package/lib/adapters/index.js +0 -20
  209. package/lib/config/constants.js +0 -286
  210. package/lib/config/patterns/common.js +0 -47
  211. package/lib/config/patterns/creditCard.js +0 -9
  212. package/lib/config/patterns/idCard.js +0 -9
  213. package/lib/config/patterns/index.js +0 -9
  214. package/lib/config/patterns/licensePlate.js +0 -4
  215. package/lib/config/patterns/passport.js +0 -4
  216. package/lib/config/patterns/phone.js +0 -9
  217. package/lib/config/patterns/postalCode.js +0 -5
  218. package/lib/core/CacheManager.js +0 -376
  219. package/lib/core/ConditionalBuilder.js +0 -503
  220. package/lib/core/DslBuilder.js +0 -1589
  221. package/lib/core/ErrorCodes.js +0 -233
  222. package/lib/core/ErrorFormatter.js +0 -445
  223. package/lib/core/JSONSchemaCore.js +0 -347
  224. package/lib/core/Locale.js +0 -130
  225. package/lib/core/MessageTemplate.js +0 -98
  226. package/lib/core/PluginManager.js +0 -448
  227. package/lib/core/StringExtensions.js +0 -240
  228. package/lib/core/Validator.js +0 -654
  229. package/lib/errors/I18nError.js +0 -328
  230. package/lib/errors/ValidationError.js +0 -191
  231. package/lib/exporters/MarkdownExporter.js +0 -420
  232. package/lib/exporters/MongoDBExporter.js +0 -162
  233. package/lib/exporters/MySQLExporter.js +0 -212
  234. package/lib/exporters/PostgreSQLExporter.js +0 -289
  235. package/lib/exporters/index.js +0 -24
  236. package/lib/locales/index.js +0 -8
  237. package/lib/utils/LRUCache.js +0 -174
  238. package/lib/utils/SchemaHelper.js +0 -240
  239. package/lib/utils/SchemaUtils.js +0 -445
  240. package/lib/utils/TypeConverter.js +0 -245
  241. package/lib/utils/index.js +0 -13
  242. package/lib/validators/CustomKeywords.js +0 -616
  243. package/lib/validators/index.js +0 -11
@@ -1,113 +1,160 @@
1
- module.exports = {
2
- // Generic
3
- required: '{{#label}} es obligatorio',
4
- type: '{{#label}} debe ser de tipo {{#expected}}, pero se obtuvo {{#actual}}',
5
- min: 'La longitud de {{#label}} debe ser al menos {{#limit}}',
6
- max: 'La longitud de {{#label}} debe ser como máximo {{#limit}}',
7
- length: 'La longitud de {{#label}} debe ser exactamente {{#expected}}',
8
- pattern: 'El formato de {{#label}} no es válido',
9
- enum: '{{#label}} debe ser uno de: {{#allowed}}',
10
- custom: 'Validación fallida para {{#label}}: {{#message}}',
11
- circular: 'Referencia circular detectada en {{#label}}',
12
- 'max-depth': 'Profundidad máxima de recursión ({{#depth}}) excedida en {{#label}}',
13
- exception: 'Excepción de validación en {{#label}}: {{#message}}',
14
-
15
- // Formats
16
- 'format.email': '{{#label}} debe ser una dirección de correo electrónico válida',
17
- 'format.url': '{{#label}} debe ser una URL válida',
18
- 'format.uuid': '{{#label}} debe ser un UUID válido',
19
- 'format.date': '{{#label}} debe ser una fecha válida (YYYY-MM-DD)',
20
- 'format.datetime': '{{#label}} debe ser una fecha y hora válida (ISO 8601)',
21
- 'format.time': '{{#label}} debe ser una hora válida (HH:mm:ss)',
22
- 'format.ipv4': '{{#label}} debe ser una dirección IPv4 válida',
23
- 'format.ipv6': '{{#label}} debe ser una dirección IPv6 válida',
24
- 'format.binary': '{{#label}} debe ser una cadena base64 válida',
25
-
26
- // String
27
- 'string.hostname': '{{#label}} debe ser un nombre de host válido',
28
- 'string.pattern': 'El formato de {{#label}} no coincide con el patrón requerido',
29
- 'string.enum': '{{#label}} debe ser uno de: {{#valids}}',
30
-
31
- // Number
32
- 'number.base': '{{#label}} debe ser un número',
33
- 'number.min': '{{#label}} debe ser mayor o igual a {{#limit}}',
34
- 'number.max': '{{#label}} debe ser menor o igual a {{#limit}}',
35
- 'number.integer': '{{#label}} debe ser un número entero',
36
- 'number.positive': '{{#label}} debe ser un número positivo',
37
- 'number.negative': '{{#label}} debe ser un número negativo',
38
-
39
- // Boolean
40
- 'boolean.base': '{{#label}} debe ser un booleano',
41
-
42
- // Object
43
- 'object.base': '{{#label}} debe ser un objeto',
44
- 'object.min': '{{#label}} debe tener al menos {{#limit}} propiedades',
45
- 'object.max': '{{#label}} debe tener como máximo {{#limit}} propiedades',
46
- 'object.unknown': '{{#label}} contiene una propiedad desconocida: {{#key}}',
47
- // v1.1.6 - additionalProperties
48
- 'additionalProperties': '{{#label}} NO debe tener propiedades adicionales: {{#key}}',
49
-
50
- // Array
51
- 'array.base': '{{#label}} debe ser un array',
52
- 'array.min': '{{#label}} debe tener al menos {{#limit}} elementos',
53
- 'array.max': '{{#label}} debe tener como máximo {{#limit}} elementos',
54
- 'array.length': '{{#label}} debe tener exactamente {{#limit}} elementos',
55
- 'array.unique': '{{#label}} no debe contener elementos duplicados',
56
-
57
- // Date
58
- 'date.base': '{{#label}} debe ser una fecha válida',
59
- 'date.min': '{{#label}} no debe ser anterior a {{#limit}}',
60
- 'date.max': '{{#label}} no debe ser posterior a {{#limit}}',
61
-
62
- // Any
63
- 'any.required': '{{#label}} es obligatorio',
64
- 'any.invalid': '{{#label}} contiene un valor no válido',
65
- 'any.only': '{{#label}} debe coincidir con {{#valids}}',
66
- 'any.unknown': 'El campo {{#key}} no está permitido',
67
-
68
- // Patterns (Legacy/Specific)
69
- 'pattern.phone': 'Número de teléfono no válido',
70
- 'pattern.phone.international': 'Número de teléfono internacional no válido',
71
- 'pattern.idCard': 'Número de tarjeta de identificación no válido',
72
- 'pattern.creditCard': 'Número de tarjeta de crédito no válido',
73
- 'pattern.creditCard.visa': 'Número de tarjeta Visa no válido',
74
- 'pattern.creditCard.mastercard': 'Número de Mastercard no válido',
75
- 'pattern.creditCard.amex': 'Número de tarjeta American Express no válido',
76
- 'pattern.creditCard.discover': 'Número de tarjeta Discover no válido',
77
- 'pattern.creditCard.jcb': 'Número de tarjeta JCB no válido',
78
- 'pattern.creditCard.unionpay': 'Número de tarjeta UnionPay no válido',
79
- 'pattern.licensePlate': 'Número de matrícula no válido',
80
- 'pattern.postalCode': 'Código postal no válido',
81
- 'pattern.passport': 'Número de pasaporte no válido',
82
- 'pattern.objectId': 'ObjectId no válido',
83
- 'pattern.hexColor': 'Color hexadecimal no válido',
84
- 'pattern.macAddress': 'Dirección MAC no válida',
85
- 'pattern.cron': 'Expresión Cron no válida',
86
- 'pattern.slug': 'El slug de URL solo puede contener letras minúsculas, números y guiones',
87
- // v1.0.2 新增
88
- 'pattern.domain': '{{#label}} debe ser un nombre de dominio válido',
89
- 'pattern.ip': '{{#label}} debe ser una dirección IP válida',
90
- 'pattern.base64': '{{#label}} debe ser una cadena Base64 válida',
91
- 'pattern.jwt': '{{#label}} debe ser un token JWT válido',
92
- 'pattern.json': '{{#label}} debe ser una cadena JSON válida',
93
-
94
- // Username & Password
95
- 'pattern.username': 'El nombre de usuario debe comenzar con una letra y contener solo letras, números y guiones bajos',
96
- 'pattern.password.weak': 'La contraseña debe tener al menos 6 caracteres',
97
- 'pattern.password.medium': 'La contraseña debe tener al menos 8 caracteres y contener letras y números',
98
- 'pattern.password.strong': 'La contraseña debe tener al menos 8 caracteres y contener letras mayúsculas, minúsculas y números',
99
- 'pattern.password.veryStrong': 'La contraseña debe tener al menos 10 caracteres y contener letras mayúsculas, minúsculas, números y caracteres especiales',
100
-
101
- // Unknown error fallback
102
- 'UNKNOWN_ERROR': 'Error de validación desconocido',
103
-
104
- // oneOf (unión entre tipos) - v1.1.0
105
- oneOf: '{{#label}} debe coincidir con uno de los siguientes tipos',
106
- 'oneOf.invalid': 'El valor de {{#label}} no coincide con ningún tipo permitido',
107
-
108
- // Custom validation
109
- 'CUSTOM_VALIDATION_FAILED': 'Validación fallida',
110
- 'ASYNC_VALIDATION_NOT_SUPPORTED': 'La validación asíncrona no es compatible en validate() síncrono',
111
- 'VALIDATE_MUST_BE_FUNCTION': 'validate debe ser una función'
112
- };
113
-
1
+ import type { LocaleMessages } from './types.js'
2
+
3
+ const esES: LocaleMessages = {
4
+ // Generic
5
+ required: '{{#label}} es obligatorio',
6
+ type: '{{#label}} debe ser de tipo {{#expected}}, pero se obtuvo {{#actual}}',
7
+ min: 'La longitud de {{#label}} debe ser al menos {{#limit}}',
8
+ max: 'La longitud de {{#label}} debe ser como máximo {{#limit}}',
9
+ length: 'La longitud de {{#label}} debe ser exactamente {{#expected}}',
10
+ pattern: 'El formato de {{#label}} no es válido',
11
+ enum: '{{#label}} debe ser uno de: {{#allowed}}',
12
+ custom: 'Validación fallida para {{#label}}: {{#message}}',
13
+ circular: 'Referencia circular detectada en {{#label}}',
14
+ 'max-depth': 'Profundidad máxima de recursión ({{#depth}}) excedida en {{#label}}',
15
+ exception: 'Excepción de validación en {{#label}}: {{#message}}',
16
+
17
+ // Conditional (v2 additions)
18
+ 'conditional.underAge': 'Los menores de edad no pueden registrarse',
19
+ 'conditional.blocked': 'La cuenta ha sido bloqueada',
20
+ 'conditional.notAllowed': 'El registro no está permitido',
21
+
22
+ // I18nError generic (v2 additions)
23
+ 'error.notFound': '{{#resource}} no encontrado',
24
+ 'error.forbidden': 'Acceso a {{#resource}} está prohibido',
25
+ 'error.unauthorized': 'No autorizado, por favor inicie sesión',
26
+ 'error.invalid': '{{#field}} no es válido',
27
+ 'error.duplicate': '{{#resource}} ya existe',
28
+ 'error.conflict': 'Conflicto de operación: {{#reason}}',
29
+
30
+ // Account (v2 additions)
31
+ 'account.notFound': { code: 'ACCOUNT_NOT_FOUND', message: 'Cuenta no encontrada' },
32
+ 'account.inactive': 'La cuenta está inactiva',
33
+ 'account.banned': 'La cuenta ha sido suspendida',
34
+ 'account.insufficientBalance': {
35
+ code: 'INSUFFICIENT_BALANCE',
36
+ message: 'Saldo insuficiente, actual: {{#balance}}, requerido: {{#required}}',
37
+ },
38
+ 'account.insufficientCredits': 'Créditos insuficientes, actual: {{#credits}}, requerido: {{#required}}',
39
+
40
+ // User (v2 additions)
41
+ 'user.notFound': 'Usuario no encontrado',
42
+ 'user.notVerified': 'El usuario no está verificado',
43
+ 'user.noPermission': 'Sin permisos de administrador',
44
+
45
+ // Order (v2 additions)
46
+ 'order.notPaid': { code: 'ORDER_NOT_PAID', message: 'Pedido no pagado' },
47
+ 'order.paymentMissing': 'Falta información de pago',
48
+ 'order.addressMissing': 'Falta la dirección de envío',
49
+
50
+ // Format
51
+ 'format.email': '{{#label}} debe ser una dirección de correo electrónico válida',
52
+ 'format.url': '{{#label}} debe ser una URL válida',
53
+ 'format.uuid': '{{#label}} debe ser un UUID válido',
54
+ 'format.date': '{{#label}} debe ser una fecha válida (YYYY-MM-DD)',
55
+ 'format.datetime': '{{#label}} debe ser una fecha y hora válida (ISO 8601)',
56
+ 'format.time': '{{#label}} debe ser una hora válida (HH:mm:ss)',
57
+ 'format.ipv4': '{{#label}} debe ser una dirección IPv4 válida',
58
+ 'format.ipv6': '{{#label}} debe ser una dirección IPv6 válida',
59
+ 'format.binary': '{{#label}} debe ser una cadena base64 válida',
60
+
61
+ // String
62
+ 'string.hostname': '{{#label}} debe ser un nombre de host válido',
63
+ 'string.pattern': 'El formato de {{#label}} no coincide con el patrón requerido',
64
+ 'string.enum': '{{#label}} debe ser uno de: {{#valids}}',
65
+ 'string.length': 'La longitud de {{#label}} debe ser exactamente {{#limit}} caracteres',
66
+ 'string.alphanum': '{{#label}} solo puede contener caracteres alfanuméricos',
67
+ 'string.trim': '{{#label}} no debe tener espacios al principio ni al final',
68
+ 'string.lowercase': '{{#label}} debe estar en minúsculas',
69
+ 'string.uppercase': '{{#label}} debe estar en mayúsculas',
70
+
71
+ // Number
72
+ 'number.base': '{{#label}} debe ser un número',
73
+ 'number.min': '{{#label}} debe ser mayor o igual a {{#limit}}',
74
+ 'number.max': '{{#label}} debe ser menor o igual a {{#limit}}',
75
+ 'number.integer': '{{#label}} debe ser un número entero',
76
+ 'number.positive': '{{#label}} debe ser un número positivo',
77
+ 'number.negative': '{{#label}} debe ser un número negativo',
78
+ 'number.precision': '{{#label}} debe tener como máximo {{#limit}} decimales',
79
+ 'number.port': '{{#label}} debe ser un número de puerto válido (1-65535)',
80
+
81
+ // Boolean
82
+ 'boolean.base': '{{#label}} debe ser un booleano',
83
+
84
+ // Object
85
+ 'object.base': '{{#label}} debe ser un objeto',
86
+ 'object.min': '{{#label}} debe tener al menos {{#limit}} propiedades',
87
+ 'object.max': '{{#label}} debe tener como máximo {{#limit}} propiedades',
88
+ 'object.unknown': '{{#label}} contiene una propiedad desconocida: {{#key}}',
89
+ 'object.missing': 'A {{#label}} le faltan propiedades requeridas',
90
+ 'object.schema': '{{#label}} contiene propiedades adicionales',
91
+ 'additionalProperties': '{{#label}} NO debe tener propiedades adicionales: {{#key}}',
92
+
93
+ // Array
94
+ 'array.base': '{{#label}} debe ser un array',
95
+ 'array.min': '{{#label}} debe tener al menos {{#limit}} elementos',
96
+ 'array.max': '{{#label}} debe tener como máximo {{#limit}} elementos',
97
+ 'array.length': '{{#label}} debe tener exactamente {{#limit}} elementos',
98
+ 'array.unique': '{{#label}} no debe contener elementos duplicados',
99
+ 'array.sparse': '{{#label}} no debe ser un array disperso',
100
+ 'array.includesRequired': '{{#label}} debe incluir los elementos requeridos',
101
+
102
+ // Date
103
+ 'date.base': '{{#label}} debe ser una fecha válida',
104
+ 'date.min': '{{#label}} no debe ser anterior a {{#limit}}',
105
+ 'date.max': '{{#label}} no debe ser posterior a {{#limit}}',
106
+ 'date.format': 'El formato de fecha de {{#label}} no es válido',
107
+ 'date.greater': '{{#label}} debe ser posterior a {{#limit}}',
108
+ 'date.less': '{{#label}} debe ser anterior a {{#limit}}',
109
+
110
+ // Any
111
+ 'any.required': '{{#label}} es obligatorio',
112
+ 'any.invalid': '{{#label}} contiene un valor no válido',
113
+ 'any.only': '{{#label}} debe coincidir con {{#valids}}',
114
+ 'any.unknown': 'El campo {{#key}} no está permitido',
115
+
116
+ // Patterns
117
+ 'pattern.phone': 'Número de teléfono no válido',
118
+ 'pattern.phone.international': 'Número de teléfono internacional no válido',
119
+ 'pattern.idCard': 'Número de tarjeta de identificación no válido',
120
+ 'pattern.creditCard': 'Número de tarjeta de crédito no válido',
121
+ 'pattern.creditCard.visa': 'Número de tarjeta Visa no válido',
122
+ 'pattern.creditCard.mastercard': 'Número de Mastercard no válido',
123
+ 'pattern.creditCard.amex': 'Número de tarjeta American Express no válido',
124
+ 'pattern.creditCard.discover': 'Número de tarjeta Discover no válido',
125
+ 'pattern.creditCard.jcb': 'Número de tarjeta JCB no válido',
126
+ 'pattern.creditCard.unionpay': 'Número de tarjeta UnionPay no válido',
127
+ 'pattern.licensePlate': 'Número de matrícula no válido',
128
+ 'pattern.postalCode': 'Código postal no válido',
129
+ 'pattern.passport': 'Número de pasaporte no válido',
130
+ 'pattern.objectId': 'ObjectId no válido',
131
+ 'pattern.hexColor': 'Color hexadecimal no válido',
132
+ 'pattern.macAddress': 'Dirección MAC no válida',
133
+ 'pattern.cron': 'Expresión Cron no válida',
134
+ 'pattern.slug': 'El slug de URL solo puede contener letras minúsculas, números y guiones',
135
+ 'pattern.domain': '{{#label}} debe ser un nombre de dominio válido',
136
+ 'pattern.ip': '{{#label}} debe ser una dirección IP válida',
137
+ 'pattern.base64': '{{#label}} debe ser una cadena Base64 válida',
138
+ 'pattern.jwt': '{{#label}} debe ser un token JWT válido',
139
+ 'pattern.json': '{{#label}} debe ser una cadena JSON válida',
140
+ 'pattern.username': 'El nombre de usuario debe comenzar con una letra y contener solo letras, números y guiones bajos',
141
+ 'pattern.password.weak': 'La contraseña debe tener al menos 6 caracteres',
142
+ 'pattern.password.medium': 'La contraseña debe tener al menos 8 caracteres y contener letras y números',
143
+ 'pattern.password.strong': 'La contraseña debe tener al menos 8 caracteres y contener letras mayúsculas, minúsculas y números',
144
+ 'pattern.password.veryStrong': 'La contraseña debe tener al menos 10 caracteres y contener letras mayúsculas, minúsculas, números y caracteres especiales',
145
+ 'pattern.emailOrPhone': 'Debe ser un correo electrónico o número de teléfono',
146
+ 'pattern.usernameOrEmail': 'Debe ser un nombre de usuario o correo electrónico',
147
+ 'pattern.httpOrHttps': 'Debe ser una URL que comience con http o https',
148
+
149
+ // oneOf
150
+ oneOf: '{{#label}} debe coincidir con uno de los siguientes tipos',
151
+ 'oneOf.invalid': 'El valor de {{#label}} no coincide con ningún tipo permitido',
152
+
153
+ // Error fallback
154
+ UNKNOWN_ERROR: 'Error de validación desconocido',
155
+ CUSTOM_VALIDATION_FAILED: 'Validación fallida',
156
+ ASYNC_VALIDATION_NOT_SUPPORTED: 'La validación asíncrona no es compatible en validate() síncrono',
157
+ VALIDATE_MUST_BE_FUNCTION: 'validate debe ser una función',
158
+ }
159
+
160
+ export default esES
@@ -1,113 +1,160 @@
1
- module.exports = {
2
- // Generic
3
- required: '{{#label}} est requis',
4
- type: '{{#label}} doit être de type {{#expected}}, mais {{#actual}} a été reçu',
5
- min: 'La longueur de {{#label}} doit être d\'au moins {{#limit}}',
6
- max: 'La longueur de {{#label}} doit être d\'au plus {{#limit}}',
7
- length: 'La longueur de {{#label}} doit être exactement {{#expected}}',
8
- pattern: 'Le format de {{#label}} n\'est pas valide',
9
- enum: '{{#label}} doit être l\'un de : {{#allowed}}',
10
- custom: 'Validation échouée pour {{#label}} : {{#message}}',
11
- circular: 'Référence circulaire détectée dans {{#label}}',
12
- 'max-depth': 'Profondeur maximale de récursion ({{#depth}}) dépassée dans {{#label}}',
13
- exception: 'Exception de validation dans {{#label}} : {{#message}}',
14
-
15
- // Formats
16
- 'format.email': '{{#label}} doit être une adresse e-mail valide',
17
- 'format.url': '{{#label}} doit être une URL valide',
18
- 'format.uuid': '{{#label}} doit être un UUID valide',
19
- 'format.date': '{{#label}} doit être une date valide (YYYY-MM-DD)',
20
- 'format.datetime': '{{#label}} doit être une date et heure valide (ISO 8601)',
21
- 'format.time': '{{#label}} doit être une heure valide (HH:mm:ss)',
22
- 'format.ipv4': '{{#label}} doit être une adresse IPv4 valide',
23
- 'format.ipv6': '{{#label}} doit être une adresse IPv6 valide',
24
- 'format.binary': '{{#label}} doit être une chaîne base64 valide',
25
-
26
- // String
27
- 'string.hostname': '{{#label}} doit être un nom d\'hôte valide',
28
- 'string.pattern': 'Le format de {{#label}} ne correspond pas au modèle requis',
29
- 'string.enum': '{{#label}} doit être l\'un de : {{#valids}}',
30
-
31
- // Number
32
- 'number.base': '{{#label}} doit être un nombre',
33
- 'number.min': '{{#label}} doit être supérieur ou égal à {{#limit}}',
34
- 'number.max': '{{#label}} doit être inférieur ou égal à {{#limit}}',
35
- 'number.integer': '{{#label}} doit être un nombre entier',
36
- 'number.positive': '{{#label}} doit être un nombre positif',
37
- 'number.negative': '{{#label}} doit être un nombre négatif',
38
-
39
- // Boolean
40
- 'boolean.base': '{{#label}} doit être un booléen',
41
-
42
- // Object
43
- 'object.base': '{{#label}} doit être un objet',
44
- 'object.min': '{{#label}} doit avoir au moins {{#limit}} propriétés',
45
- 'object.max': '{{#label}} doit avoir au plus {{#limit}} propriétés',
46
- 'object.unknown': '{{#label}} contient une propriété inconnue : {{#key}}',
47
- // v1.1.6 - additionalProperties
48
- 'additionalProperties': '{{#label}} NE doit PAS avoir de propriétés supplémentaires : {{#key}}',
49
-
50
- // Array
51
- 'array.base': '{{#label}} doit être un tableau',
52
- 'array.min': '{{#label}} doit avoir au moins {{#limit}} éléments',
53
- 'array.max': '{{#label}} doit avoir au plus {{#limit}} éléments',
54
- 'array.length': '{{#label}} doit avoir exactement {{#limit}} éléments',
55
- 'array.unique': '{{#label}} ne doit pas contenir d\'éléments en double',
56
-
57
- // Date
58
- 'date.base': '{{#label}} doit être une date valide',
59
- 'date.min': '{{#label}} ne doit pas être antérieur à {{#limit}}',
60
- 'date.max': '{{#label}} ne doit pas être postérieur à {{#limit}}',
61
-
62
- // Any
63
- 'any.required': '{{#label}} est requis',
64
- 'any.invalid': '{{#label}} contient une valeur non valide',
65
- 'any.only': '{{#label}} doit correspondre à {{#valids}}',
66
- 'any.unknown': 'Le champ {{#key}} n\'est pas autorisé',
67
-
68
- // Patterns (Legacy/Specific)
69
- 'pattern.phone': 'Numéro de téléphone non valide',
70
- 'pattern.phone.international': 'Numéro de téléphone international non valide',
71
- 'pattern.idCard': 'Numéro de carte d\'identité non valide',
72
- 'pattern.creditCard': 'Numéro de carte de crédit non valide',
73
- 'pattern.creditCard.visa': 'Numéro de carte Visa non valide',
74
- 'pattern.creditCard.mastercard': 'Numéro Mastercard non valide',
75
- 'pattern.creditCard.amex': 'Numéro de carte American Express non valide',
76
- 'pattern.creditCard.discover': 'Numéro de carte Discover non valide',
77
- 'pattern.creditCard.jcb': 'Numéro de carte JCB non valide',
78
- 'pattern.creditCard.unionpay': 'Numéro de carte UnionPay non valide',
79
- 'pattern.licensePlate': 'Numéro de plaque d\'immatriculation non valide',
80
- 'pattern.postalCode': 'Code postal non valide',
81
- 'pattern.passport': 'Numéro de passeport non valide',
82
- 'pattern.objectId': 'ObjectId non valide',
83
- 'pattern.hexColor': 'Couleur hexadécimale non valide',
84
- 'pattern.macAddress': 'Adresse MAC non valide',
85
- 'pattern.cron': 'Expression Cron non valide',
86
- 'pattern.slug': 'Le slug d\'URL ne peut contenir que des lettres minuscules, des chiffres et des tirets',
87
- // v1.0.2 新增
88
- 'pattern.domain': '{{#label}} doit être un nom de domaine valide',
89
- 'pattern.ip': '{{#label}} doit être une adresse IP valide',
90
- 'pattern.base64': '{{#label}} doit être une chaîne Base64 valide',
91
- 'pattern.jwt': '{{#label}} doit être un token JWT valide',
92
- 'pattern.json': '{{#label}} doit être une chaîne JSON valide',
93
-
94
- // Username & Password
95
- 'pattern.username': 'Le nom d\'utilisateur doit commencer par une lettre et contenir uniquement des lettres, des chiffres et des tirets bas',
96
- 'pattern.password.weak': 'Le mot de passe doit contenir au moins 6 caractères',
97
- 'pattern.password.medium': 'Le mot de passe doit contenir au moins 8 caractères et inclure des lettres et des chiffres',
98
- 'pattern.password.strong': 'Le mot de passe doit contenir au moins 8 caractères et inclure des lettres majuscules, minuscules et des chiffres',
99
- 'pattern.password.veryStrong': 'Le mot de passe doit contenir au moins 10 caractères et inclure des lettres majuscules, minuscules, des chiffres et des caractères spéciaux',
100
-
101
- // Unknown error fallback
102
- 'UNKNOWN_ERROR': 'Erreur de validation inconnue',
103
-
104
- // oneOf (union de types) - v1.1.0
105
- oneOf: '{{#label}} doit correspondre à l\'un des types suivants',
106
- 'oneOf.invalid': 'La valeur de {{#label}} ne correspond à aucun type autorisé',
107
-
108
- // Custom validation
109
- 'CUSTOM_VALIDATION_FAILED': 'Validation échouée',
110
- 'ASYNC_VALIDATION_NOT_SUPPORTED': 'La validation asynchrone n\'est pas prise en charge dans validate() synchrone',
111
- 'VALIDATE_MUST_BE_FUNCTION': 'validate doit être une fonction'
112
- };
113
-
1
+ import type { LocaleMessages } from './types.js'
2
+
3
+ const frFR: LocaleMessages = {
4
+ // Generic
5
+ required: '{{#label}} est requis',
6
+ type: "{{#label}} doit être de type {{#expected}}, mais {{#actual}} a été reçu",
7
+ min: "La longueur de {{#label}} doit être d'au moins {{#limit}}",
8
+ max: "La longueur de {{#label}} doit être d'au plus {{#limit}}",
9
+ length: 'La longueur de {{#label}} doit être exactement {{#expected}}',
10
+ pattern: "Le format de {{#label}} n'est pas valide",
11
+ enum: '{{#label}} doit être l\'un de : {{#allowed}}',
12
+ custom: 'Validation échouée pour {{#label}} : {{#message}}',
13
+ circular: 'Référence circulaire détectée dans {{#label}}',
14
+ 'max-depth': 'Profondeur maximale de récursion ({{#depth}}) dépassée dans {{#label}}',
15
+ exception: 'Exception de validation dans {{#label}} : {{#message}}',
16
+
17
+ // Conditional (v2 additions)
18
+ 'conditional.underAge': 'Les mineurs ne peuvent pas s\'inscrire',
19
+ 'conditional.blocked': 'Le compte a été bloqué',
20
+ 'conditional.notAllowed': 'L\'inscription n\'est pas autorisée',
21
+
22
+ // I18nError generic (v2 additions)
23
+ 'error.notFound': '{{#resource}} introuvable',
24
+ 'error.forbidden': 'Accès à {{#resource}} interdit',
25
+ 'error.unauthorized': 'Non autorisé, veuillez vous connecter',
26
+ 'error.invalid': '{{#field}} n\'est pas valide',
27
+ 'error.duplicate': '{{#resource}} existe déjà',
28
+ 'error.conflict': 'Conflit d\'opération : {{#reason}}',
29
+
30
+ // Account (v2 additions)
31
+ 'account.notFound': { code: 'ACCOUNT_NOT_FOUND', message: 'Compte introuvable' },
32
+ 'account.inactive': 'Le compte est inactif',
33
+ 'account.banned': 'Le compte a été banni',
34
+ 'account.insufficientBalance': {
35
+ code: 'INSUFFICIENT_BALANCE',
36
+ message: 'Solde insuffisant, actuel : {{#balance}}, requis : {{#required}}',
37
+ },
38
+ 'account.insufficientCredits': 'Crédits insuffisants, actuels : {{#credits}}, requis : {{#required}}',
39
+
40
+ // User (v2 additions)
41
+ 'user.notFound': 'Utilisateur introuvable',
42
+ 'user.notVerified': "L'utilisateur n'est pas vérifié",
43
+ 'user.noPermission': 'Pas de permission d\'administrateur',
44
+
45
+ // Order (v2 additions)
46
+ 'order.notPaid': { code: 'ORDER_NOT_PAID', message: 'Commande non payée' },
47
+ 'order.paymentMissing': 'Informations de paiement manquantes',
48
+ 'order.addressMissing': 'Adresse de livraison manquante',
49
+
50
+ // Format
51
+ 'format.email': '{{#label}} doit être une adresse e-mail valide',
52
+ 'format.url': '{{#label}} doit être une URL valide',
53
+ 'format.uuid': '{{#label}} doit être un UUID valide',
54
+ 'format.date': '{{#label}} doit être une date valide (YYYY-MM-DD)',
55
+ 'format.datetime': '{{#label}} doit être une date et heure valide (ISO 8601)',
56
+ 'format.time': '{{#label}} doit être une heure valide (HH:mm:ss)',
57
+ 'format.ipv4': '{{#label}} doit être une adresse IPv4 valide',
58
+ 'format.ipv6': '{{#label}} doit être une adresse IPv6 valide',
59
+ 'format.binary': '{{#label}} doit être une chaîne base64 valide',
60
+
61
+ // String
62
+ 'string.hostname': "{{#label}} doit être un nom d'hôte valide",
63
+ 'string.pattern': 'Le format de {{#label}} ne correspond pas au modèle requis',
64
+ 'string.enum': '{{#label}} doit être l\'un de : {{#valids}}',
65
+ 'string.length': 'La longueur de {{#label}} doit être exactement {{#limit}} caractères',
66
+ 'string.alphanum': '{{#label}} ne doit contenir que des caractères alphanumériques',
67
+ 'string.trim': '{{#label}} ne doit pas avoir d\'espaces en début ou en fin',
68
+ 'string.lowercase': '{{#label}} doit être en minuscules',
69
+ 'string.uppercase': '{{#label}} doit être en majuscules',
70
+
71
+ // Number
72
+ 'number.base': '{{#label}} doit être un nombre',
73
+ 'number.min': '{{#label}} doit être supérieur ou égal à {{#limit}}',
74
+ 'number.max': '{{#label}} doit être inférieur ou égal à {{#limit}}',
75
+ 'number.integer': '{{#label}} doit être un nombre entier',
76
+ 'number.positive': '{{#label}} doit être un nombre positif',
77
+ 'number.negative': '{{#label}} doit être un nombre négatif',
78
+ 'number.precision': '{{#label}} doit avoir au plus {{#limit}} décimales',
79
+ 'number.port': '{{#label}} doit être un numéro de port valide (1-65535)',
80
+
81
+ // Boolean
82
+ 'boolean.base': '{{#label}} doit être un booléen',
83
+
84
+ // Object
85
+ 'object.base': '{{#label}} doit être un objet',
86
+ 'object.min': '{{#label}} doit avoir au moins {{#limit}} propriétés',
87
+ 'object.max': '{{#label}} doit avoir au plus {{#limit}} propriétés',
88
+ 'object.unknown': '{{#label}} contient une propriété inconnue : {{#key}}',
89
+ 'object.missing': '{{#label}} est manquant les propriétés requises',
90
+ 'object.schema': '{{#label}} contient des propriétés supplémentaires',
91
+ 'additionalProperties': '{{#label}} NE doit PAS avoir de propriétés supplémentaires : {{#key}}',
92
+
93
+ // Array
94
+ 'array.base': '{{#label}} doit être un tableau',
95
+ 'array.min': '{{#label}} doit avoir au moins {{#limit}} éléments',
96
+ 'array.max': '{{#label}} doit avoir au plus {{#limit}} éléments',
97
+ 'array.length': '{{#label}} doit avoir exactement {{#limit}} éléments',
98
+ 'array.unique': '{{#label}} ne doit pas contenir d\'éléments en double',
99
+ 'array.sparse': '{{#label}} ne doit pas être un tableau clairsemé',
100
+ 'array.includesRequired': '{{#label}} doit inclure les éléments requis',
101
+
102
+ // Date
103
+ 'date.base': '{{#label}} doit être une date valide',
104
+ 'date.min': '{{#label}} ne doit pas être antérieur à {{#limit}}',
105
+ 'date.max': '{{#label}} ne doit pas être postérieur à {{#limit}}',
106
+ 'date.format': "Le format de date de {{#label}} n'est pas valide",
107
+ 'date.greater': '{{#label}} doit être après {{#limit}}',
108
+ 'date.less': '{{#label}} doit être avant {{#limit}}',
109
+
110
+ // Any
111
+ 'any.required': '{{#label}} est requis',
112
+ 'any.invalid': '{{#label}} contient une valeur non valide',
113
+ 'any.only': '{{#label}} doit correspondre à {{#valids}}',
114
+ 'any.unknown': 'Le champ {{#key}} n\'est pas autorisé',
115
+
116
+ // Patterns
117
+ 'pattern.phone': 'Numéro de téléphone non valide',
118
+ 'pattern.phone.international': 'Numéro de téléphone international non valide',
119
+ 'pattern.idCard': "Numéro de carte d'identité non valide",
120
+ 'pattern.creditCard': 'Numéro de carte de crédit non valide',
121
+ 'pattern.creditCard.visa': 'Numéro de carte Visa non valide',
122
+ 'pattern.creditCard.mastercard': 'Numéro Mastercard non valide',
123
+ 'pattern.creditCard.amex': 'Numéro de carte American Express non valide',
124
+ 'pattern.creditCard.discover': 'Numéro de carte Discover non valide',
125
+ 'pattern.creditCard.jcb': 'Numéro de carte JCB non valide',
126
+ 'pattern.creditCard.unionpay': 'Numéro de carte UnionPay non valide',
127
+ "pattern.licensePlate": "Numéro de plaque d'immatriculation non valide",
128
+ 'pattern.postalCode': 'Code postal non valide',
129
+ 'pattern.passport': 'Numéro de passeport non valide',
130
+ 'pattern.objectId': 'ObjectId non valide',
131
+ 'pattern.hexColor': 'Couleur hexadécimale non valide',
132
+ 'pattern.macAddress': 'Adresse MAC non valide',
133
+ 'pattern.cron': 'Expression Cron non valide',
134
+ "pattern.slug": "Le slug d'URL ne peut contenir que des lettres minuscules, des chiffres et des tirets",
135
+ 'pattern.domain': '{{#label}} doit être un nom de domaine valide',
136
+ 'pattern.ip': '{{#label}} doit être une adresse IP valide',
137
+ 'pattern.base64': '{{#label}} doit être une chaîne Base64 valide',
138
+ 'pattern.jwt': '{{#label}} doit être un token JWT valide',
139
+ 'pattern.json': '{{#label}} doit être une chaîne JSON valide',
140
+ "pattern.username": "Le nom d'utilisateur doit commencer par une lettre et contenir uniquement des lettres, des chiffres et des tirets bas",
141
+ 'pattern.password.weak': 'Le mot de passe doit contenir au moins 6 caractères',
142
+ 'pattern.password.medium': 'Le mot de passe doit contenir au moins 8 caractères et inclure des lettres et des chiffres',
143
+ 'pattern.password.strong': 'Le mot de passe doit contenir au moins 8 caractères et inclure des lettres majuscules, minuscules et des chiffres',
144
+ 'pattern.password.veryStrong': 'Le mot de passe doit contenir au moins 10 caractères et inclure des lettres majuscules, minuscules, des chiffres et des caractères spéciaux',
145
+ 'pattern.emailOrPhone': 'Doit être un e-mail ou un numéro de téléphone',
146
+ 'pattern.usernameOrEmail': "Doit être un nom d'utilisateur ou un e-mail",
147
+ 'pattern.httpOrHttps': 'Doit être une URL commençant par http ou https',
148
+
149
+ // oneOf
150
+ oneOf: "{{#label}} doit correspondre à l'un des types suivants",
151
+ 'oneOf.invalid': '{{#label}} ne correspond à aucun type autorisé',
152
+
153
+ // Error fallback
154
+ UNKNOWN_ERROR: 'Erreur de validation inconnue',
155
+ CUSTOM_VALIDATION_FAILED: 'Validation échouée',
156
+ ASYNC_VALIDATION_NOT_SUPPORTED: 'La validation asynchrone n\'est pas prise en charge dans validate() synchrone',
157
+ VALIDATE_MUST_BE_FUNCTION: 'validate doit être une fonction',
158
+ }
159
+
160
+ export default frFR