Skip to content

Instantly share code, notes, and snippets.

@k-maru
Created September 22, 2023 23:52
Show Gist options
  • Save k-maru/546aefc4aa90e143fe077bb05a1da261 to your computer and use it in GitHub Desktop.
Save k-maru/546aefc4aa90e143fe077bb05a1da261 to your computer and use it in GitHub Desktop.
zodのメッセージの日本語化
// 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)
})
@k-maru
Copy link
Author

k-maru commented Sep 22, 2023

とりあえず単純にもとのものを日本語に置きなおしただけなので、全ケースで動かしていない。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment