--- tags: zeta-dom-react --- # Customizing error message Often validation message are required to be customized or translated. To accomplish, it is recommended to return a `ValidationError` instance in validators. ```typescript function required() { return (value?: string) => { return value ? '' : new ValidationError('required'); }; } ``` The error then can be customized in 3 scopes: 1. Field level: ```typescript! <Textbox required formatError={(err, name, props, form) => 'My custom error'} /> ``` 2. Form level: ```typescript! <Form formatError={(err, name, props, form) => 'My custom error'}>{/* ... */}</Form> ``` 3. Global level: ```typescript! FormContext.formatError = ((err, name, props, form) => 'My custom error'}); ``` The `formatError` callback takes the following parameters: - `err`: The `ValidationError` instance returned from validator - `name`: The name of validated field - `props`: The props passed to the React component for that field - `form`: The associated `FormContext` object ## Accessing validator arguments ```typescript! function range(min, max) { return (value) => { return value ? '' : new ValidationError('range', '...', { min, max }); }; } ``` ```typescript! FormContext.formatError = (err, name, props, form) => { switch (err.kind) { case 'range': return `Value must be between ${err.args.min} and ${err.args.max}`; } }; ``` ## For 0.4.0 and before The return value of validators can be an object where it is implicitly converted to a string or a function that returns a string: ```typescript function required() { return (value?: string) => { return value ? '' : ( /* props is whatever props passed to useFormField hook */ (props: any) => translate('required') ) } } ``` In case the validation fails and the function is returned to form field's hook, the callback is called every time when the component re-rendered. ```typescript function TextField(props: FormFieldProps<string>) { // add hook to re-render whe language changes useI18n(); useFormField(props, ''); } ```