-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
-
76
-
77
-
78
-
79
-
80
-
81
-
82
-
83
-
84
-
85
-
86
-
87
-
88
-
89
-
90
-
91
-
92
-
93
-
94
-
95
-
96
-
97
-
98
-
99
-
100
-
101
-
102
import type * as yup from "yup";
// NOTE: `notType` is omitted because it's too hard to users to understand the
// concept and what's happening. Write your own if you need that one.
// NOTE: @types/yup currently missing `mixed.defined` field definition.
export const mixed: yup.MixedLocale & {
defined: yup.MixedLocale["default"];
} = {
default: ({ label }) =>
(label ? label + "には" : "") + "正しい値を入力してください",
required: ({ label }) =>
(label ? label + "には" : "") + "値を入力してください",
oneOf: ({ label, values }) =>
(label ? label + "には" : "") + `${values}のいずれかを入力してください`,
notOneOf: ({ label, values }) =>
(label ? label + "には" : "") + `${values}以外のものを入力してください`,
// From user's perspective, defined and default is essentially same.
defined: ({ label }) =>
(label ? label + "には" : "") + "値を入力してください",
};
// NOTE: @types/yup currently missing `string.uuid` field definition.
export const string: yup.StringLocale & { uuid: yup.StringLocale["email"] } = {
length: ({ label, length }) =>
(label ? label + "は" : "") + `${length}文字で入力してください`,
min: ({ label, min }) =>
(label ? label + "は" : "") + `${min}文字以上入力してください`,
max: ({ label, max }) =>
(label ? label + "は" : "") + `${max}文字以下にしてください`,
matches: ({ label, regex }) =>
(label ? label + "は" : "") + `以下の形式で入力してください: ${regex}`,
email: ({ label }) =>
(label ? label + "には" : "") + "正しいメールアドレスを入力してください",
url: ({ label }) =>
(label ? label + "には" : "") + "正しいURLを入力してください",
uuid: ({ label }) =>
(label ? label + "には" : "") + "正しいUUIDを入力してください",
trim: ({ label }) =>
(label ? label + "の" : "") + "前後の空白を取り除いてください",
lowercase: ({ label }) =>
(label ? label + "には" : "") + "小文字のみ入力してください",
uppercase: ({ label }) =>
(label ? label + "には" : "") + "大文字のみ入力してください",
};
// NOTE: @types/yup currently missing `string.notEqual` field definition.
export const number: yup.NumberLocale & {
notEqual(ctx: { notEqual: number } & Partial<yup.TestMessageParams>): any;
} = {
min: ({ label, min }) =>
(label ? label + "は" : "") + `${min}以上にしてください`,
max: ({ label, max }) =>
(label ? label + "は" : "") + `${max}以下にしてください`,
lessThan: ({ label, less }) =>
(label ? label + "は" : "") + `${less}未満にしてください`,
moreThan: ({ label, more }) =>
(label ? label + "は" : "") + `${more}より大きい数にしてください`,
notEqual: ({ label, notEqual }) =>
(label ? label + "は" : "") + `${notEqual}以外の数にしてください`,
positive: ({ label }) => (label ? label + "は" : "") + "正の数にしてください",
negative: ({ label }) => (label ? label + "は" : "") + "負の数にしてください",
integer: ({ label }) =>
(label ? label + "には" : "") + "整数を入力してください",
};
// To format date, use the second argument of yup.date().min/max.
export const date: yup.DateLocale = {
min: ({ label, min }) =>
(label ? label + "には" : "") + `${min}以降の日付を入力してください`,
max: ({ label, max }) =>
(label ? label + "には" : "") + `${max}以前の日付を入力してください`,
};
export const object: yup.ObjectLocale = {
// There is no way to describe `noUnknown` message in suggestive way, right?
noUnknown: ({
label,
unknown,
}: { unknown?: string } & Partial<yup.TestMessageParams>) =>
(label ? label + "には" : "") +
"登録されていないキーは入力できません" +
(unknown ? ": " + unknown : ""),
};
export const array: yup.ArrayLocale = {
min: ({ label, min }) =>
(label ? label + "は" : "") + `${min}つ以上入力してください`,
max: ({ label, max }) =>
(label ? label + "は" : "") + `${max}つ以下にしてください`,
};
/**
* Suggestive messages.
*/
export const suggestive: yup.LocaleObject = {
mixed,
string,
number,
date,
object,
array,
};