I have following components:
import { Formik, Form, useField, ErrorMessage } from "formik";
import * as Yup from "yup";
import Select from "react-select";
const iceCreamOptions = [
{ value: "chocolate", label: "Chocolate" },
{ value: "strawberry", label: "Strawberry" },
{ value: "vanilla", label: "Vanilla" }
];
const FormSelect = ({ name, options }) => {
const [field, meta, helpers] = useField(name);
return (
<>
<Select
name={name}
value={field.value}
onChange={(value) => helpers.setValue(value)}
options={options}
onBlur={() => helpers.setTouched(true)}
/>
<ErrorMessage name={name} />
</>
);
};
const initialValues = {
icecream: null
};
const validationSchema = Yup.object().shape({
icecream: Yup.object()
.shape({
value: Yup.string(),
label: Yup.string()
})
.required("Please select a value")
.nullable()
});
export default function App() {
return (
<Formik
initialValues={initialValues}
onSubmit={(values) => console.log(values)}
validationSchema={validationSchema}
>
{(props) => {
return (
<Form>
<FormSelect name="icecream" options={iceCreamOptions} />
</Form>
);
}}
</Formik>
);
}
Now I would like to add tranlations to my application, so i will use React i18next. Basic example is something like that:
const { t } = useTranslation();
<p>{t('message')}</p>
Now, How can i use this translations with my ErrorMessage component? I am sure, I can't do something like that :D
t(<ErrorMessage name={name} />)
So if there is no way to handle it with t
and ErrorMessage
, I think I need to do following thing:
{meta.touched && meta.error ? (
<div className="error">{t(meta.error)}</div>
) : null}
CodePudding user response:
I think you can directly translate the validationSchema
like this;
const validationSchema = (t) => Yup.object().shape({
icecream: Yup.object()
.shape({
value: Yup.string(),
label: Yup.string()
})
.required(t("RequiredValueTranslation"))
.nullable()
});
and use it
const [t] = useTranslation()
const schema = () => validationSchema(t)
CodePudding user response:
Another approach would be to use the render
function from formik
, but in the same way you would have to change the yup
message to be the translation key.
const validationSchema = Yup.object().shape({
icecream: Yup.object()
.shape({
value: Yup.string(),
label: Yup.string()
})
.required("requiredTranslationKey")
.nullable()
});
and then, in the component body
<ErrorMessage name={name} render={key => t(key)} />