ajv-i18n icon indicating copy to clipboard operation
ajv-i18n copied to clipboard

Introduction of the "_defaultMessage" overrides messages defined in schema

Open karlguillotte opened this issue 3 years ago • 3 comments

Hi!

Thanks for this great library!

I am in the process of upgrading to v8 as well as errors, i18n and formats plugins. I am noticing that one thing that works differently is the uses of default messages in i18n.

const schema = {/* ... */} // valid draft-07 schema
const data = {/* ... */} // valid data object, but not validating against the schema

const ajv = new Ajv({  allErrors: true })
const validate = ajv.compile(schema)

if (!validate(data)) {
    localize.en(validate.errors)
    console.log(validate.errors)
}

The console outputs lots of "must pass "errorMessage" keyword validation", even though I have defined "errorMessage" in the schema. It used to work in v7 with plugins.

https://github.com/ajv-validator/ajv-i18n/blob/master/messages/index.js#L80 generate a default case to the switch statements that override every single message.

The code definitely works, it is not a bug. However, the behaviour is totally different from the previous version, and wondering if it is the desired behaviour. If it is, wondering how to provide error messages from schema (using "errorMessage") as well as from the i18n plugin. Messages within "errorMessage" in my schema are translated.

EDIT I am noticing that #220 is probably a similar issue.

karlguillotte avatar Dec 05 '21 07:12 karlguillotte

So any solution on this so far? Why should this thing replace custom messages with translated default ones? =/

Megumin2k17 avatar Feb 16 '23 19:02 Megumin2k17

So any solution on this so far? Why should this thing replace custom messages with translated default ones? =/

I avoid this with the following workaround by filtering errors for specific keywords (e.g. "errorMessage") and only localize the others.

For example:

if (!validate(data)) {
    localize.en(validate.errors.filter((err) => err.keyword !== 'errorMessage'))
    console.log(validate.errors)
}

maspendig avatar May 08 '23 13:05 maspendig

I get the same issue. How to solve it?

So any solution on this so far? Why should this thing replace custom messages with translated default ones? =/

I avoid this with the following workaround by filtering errors for specific keywords (e.g. "errorMessage") and only localize the others.

For example:

if (!validate(data)) {
    localize.en(validate.errors.filter((err) => err.keyword !== 'errorMessage'))
    console.log(validate.errors)
}

it work, thanks this reply.

jingyuLin1999 avatar Aug 17 '23 08:08 jingyuLin1999