Created
September 22, 2023 23:52
-
-
Save k-maru/546aefc4aa90e143fe077bb05a1da261 to your computer and use it in GitHub Desktop.
zodのメッセージの日本語化
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// original | |
// https://github.com/colinhacks/zod/blob/792b3ef0d41c144cd10641c6966b98dae1222d82/src/locales/en.ts | |
// MIT License | |
// Copyright (c) 2020 Colin McDonnell | |
// reference | |
// https://github.com/aiji42/zod-i18n/blob/07067fbc9193d0a2d25c9ba3bd5911d6d67c8878/packages/core/locales/ja/zod.json | |
// MIT License | |
// Copyright (c) 2021 AijiUejima | |
import * as zod from 'zod' | |
export default defineNuxtPlugin(() => { | |
/** | |
* zodエラーメッセージ(日本語) | |
*/ | |
const jaErrorMap: zod.ZodErrorMap = (issue, _ctx) => { | |
let message: string | |
switch (issue.code) { | |
case zod.ZodIssueCode.invalid_type: | |
if (issue.received === zod.ZodParsedType.undefined) { | |
message = '必ず入力してください。' | |
} else { | |
message = `${issue.expected} の入力を期待していますが、${issue.received} が入力されました。` | |
} | |
break | |
case zod.ZodIssueCode.invalid_literal: | |
message = `無効なリテラル値です。 ${JSON.stringify( | |
issue.expected, | |
zod.util.jsonStringifyReplacer, | |
)} を入力してください。` | |
break | |
case zod.ZodIssueCode.unrecognized_keys: | |
message = `オブジェクトのキー '${zod.util.joinValues( | |
issue.keys, | |
', ', | |
)}' が識別できません。` | |
break | |
case zod.ZodIssueCode.invalid_union: | |
message = '入力形式が間違っています。' | |
break | |
case zod.ZodIssueCode.invalid_union_discriminator: | |
message = `無効な識別子です。${zod.util.joinValues( | |
issue.options, | |
)} で入力してください。` | |
break | |
case zod.ZodIssueCode.invalid_enum_value: | |
message = `'${issue.received}' は無効な値です。${zod.util.joinValues( | |
issue.options, | |
)} で入力してください。` | |
break | |
case zod.ZodIssueCode.invalid_arguments: | |
message = '引数が間違っています。' | |
break | |
case zod.ZodIssueCode.invalid_return_type: | |
message = '戻り値の型が間違っています。' | |
break | |
case zod.ZodIssueCode.invalid_date: | |
message = '日付が間違っています。' | |
break | |
case zod.ZodIssueCode.invalid_string: | |
if (typeof issue.validation === 'object') { | |
if ('includes' in issue.validation) { | |
message = `"${issue.validation.includes}"を含む文字列を入力してください。` | |
if (typeof issue.validation.position === 'number') { | |
message = `${message} "${issue.validation.includes}"は ${issue.validation.position + 1}文字目以降である必要があります。` | |
} | |
} else if ('startsWith' in issue.validation) { | |
message = `"${issue.validation.startsWith}"で始まる文字列を入力してください。` | |
} else if ('endsWith' in issue.validation) { | |
message = `"${issue.validation.endsWith}"で終わる文字列を入力してください。` | |
} else { | |
zod.util.assertNever(issue.validation) | |
} | |
} else if (issue.validation !== 'regex') { | |
message = `${issue.validation} の形式で入力してください。` | |
} else { | |
message = '入力形式が間違っています。' | |
} | |
break | |
case zod.ZodIssueCode.too_small: | |
if (issue.type === 'array') { | |
if (issue.exact) message = `${issue.minimum}個の要素を設定する必要があります。` | |
else if (issue.inclusive) message = `${issue.minimum}個以上の要素を設定する必要があります。` | |
else message = `${issue.minimum}個より多くの要素を設定する必要があります。` | |
} else if (issue.type === 'string') { | |
if (issue.exact) message = `${issue.minimum}文字を入力してください。。` | |
else if (issue.inclusive) message = `${issue.minimum}文字以上で入力してください。` | |
else message = `${issue.minimum}文字より多く入力してください。` | |
} else if (issue.type === 'number') { | |
if (issue.exact) message = `${issue.minimum}の数値を入力してください。` | |
else if (issue.inclusive) message = `${issue.minimum}以上の数値を入力してください。` | |
else message = `${issue.minimum}より多い数値を入力してください。` | |
} else if (issue.type === 'date') { | |
if (issue.exact) message = `${new Date(Number(issue.minimum))} の日時を入力してください。` | |
else if (issue.inclusive) message = `${new Date(Number(issue.minimum))} 以降の日時を入力してください。` | |
else message = `${new Date(Number(issue.minimum))}より後の日時を入力してください。` | |
} else message = '無効な入力です。' | |
break | |
case zod.ZodIssueCode.too_big: | |
if (issue.type === 'array') { | |
if (issue.exact) message = `${issue.maximum}個の要素を設定する必要があります。` | |
else if (issue.inclusive) message = `${issue.maximum}個以下の要素を設定する必要があります。` | |
else message = `${issue.maximum}個より少ない要素を設定する必要があります。` | |
} else if (issue.type === 'string') { | |
if (issue.exact) message = `${issue.maximum}文字を入力してください。` | |
else if (issue.inclusive) message = `${issue.maximum}文字以下で入力してください。` | |
else message = `${issue.maximum}文字より少なく入力してください。` | |
} else if (issue.type === 'number') { | |
if (issue.exact) message = `${issue.maximum}の数値を入力してください。` | |
else if (issue.inclusive) message = `${issue.maximum}以下の数値を入力してください。` | |
else message = `${issue.maximum}より小さい数値を入力してください。` | |
} else if (issue.type === 'bigint') { | |
if (issue.exact) message = `${issue.maximum}の数値を入力してください。` | |
else if (issue.inclusive) message = `${issue.maximum}以下の数値を入力してください。` | |
else message = `${issue.maximum}より小さい数値を入力してください。` | |
} else if (issue.type === 'date') { | |
if (issue.exact) message = `${new Date(Number(issue.maximum))}の日時を入力してください。` | |
else if (issue.inclusive) message = `${new Date(Number(issue.maximum))}以前の日時を入力してください。` | |
else message = `${new Date(Number(issue.maximum))}より前の日時を入力してください。` | |
} else message = '無効な入力です。' | |
break | |
case zod.ZodIssueCode.custom: | |
message = '無効な入力です。' | |
break | |
case zod.ZodIssueCode.invalid_intersection_types: | |
message = 'インターセクションの結果をマージできませんでした。' | |
break | |
case zod.ZodIssueCode.not_multiple_of: | |
message = `数値は${issue.multipleOf}の倍数を入力してください。` | |
break | |
case zod.ZodIssueCode.not_finite: | |
message = '有限の数値を入力してください。' | |
break | |
default: | |
message = _ctx.defaultError | |
zod.util.assertNever(issue) | |
} | |
return { message } | |
} | |
zod.setErrorMap(jaErrorMap) | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
とりあえず単純にもとのものを日本語に置きなおしただけなので、全ケースで動かしていない。