Bean Validation (Hibernate Validator) の日本語メッセージを考えてみませんか？

# このエントリについて

Java EE を構成する仕様の一つに [Bean Validation](https://beanvalidation.org/) があります。これはその名の通り、JavaBean のプロパティをバリデーションするためのもので、Java EE だけでなく、Spring Framework など様々な場所で利用されています。

Bean Validation の参照実装は [Hibernate Validator](https://hibernate.org/validator/) です。この Hibernate Validator、バリデーションに引っ掛かった時に表示するメッセージリソースも様々な言語に翻訳されているのですが、GitHub の次のページを見ると分かるように何と日本語のメッセージリソースが未だに無いのです！

https://github.com/hibernate/hibernate-validator/tree/master/engine/src/main/resources/org/hibernate/validator

実は以前、[Bean Validation の JavaFX 対応についての blog](https://aoe-tk.hatenablog.com/entry/2017/12/19/000437) を書いたのですが、その blog を Hibernate Validator の開発者の方にも読んで頂き、日本語のメッセージリソースがまだ存在しないことをその時に教えてもらいました。

[Twitter で本件について呼びかけも行った](https://twitter.com/aoetk/status/943067416082268160) のですが、現時点で特にコントリビュートもなく、やはりここは言い出しっぺの法則ということで、自分がドラフトを作ってみました。

こういうのは個人でがっとプルリクを出すより、みんなで内容を考えたものをコントリビュートした方がいいのかなと思い、Qiita で公開して意見を募ることにしました (実は Qiita 初投稿) 。

# 日本語メッセージリソースのドラフト

```properties
javax.validation.constraints.AssertFalse.message     = false にしてください
javax.validation.constraints.AssertTrue.message      = true にしてください
javax.validation.constraints.DecimalMax.message      = {value} ${inclusive == true ? '以下の値にしてください' : 'より小さな値にしてください'}
javax.validation.constraints.DecimalMin.message      = {value} ${inclusive == true ? '以上の値にしてください' : 'より大きな値にしてください'}
javax.validation.constraints.Digits.message          = 値は次の範囲にしてください (<整数 {integer} 桁>.<小数点以下 {fraction} 桁>)
javax.validation.constraints.Email.message           = 電子メールアドレスとして正しい形式にしてください
javax.validation.constraints.Future.message          = 未来の日付にしてください
javax.validation.constraints.FutureOrPresent.message = 現在もしくは未来の日付にしてください
javax.validation.constraints.Max.message             = {value} 以下の値にしてください
javax.validation.constraints.Min.message             = {value} 以上の値にしてください
javax.validation.constraints.Negative.message        = 0 より小さな値にしてください
javax.validation.constraints.NegativeOrZero.message  = 0 以下の値にしてください
javax.validation.constraints.NotBlank.message        = 空白は許可されていません
javax.validation.constraints.NotEmpty.message        = 空要素は許可されていません
javax.validation.constraints.NotNull.message         = null は許可されていません
javax.validation.constraints.Null.message            = null にしてください
javax.validation.constraints.Past.message            = 過去の日付にしてください
javax.validation.constraints.PastOrPresent.message   = 現在もしくは過去の日付にしてください
javax.validation.constraints.Pattern.message         = 正規表現 "{regexp}" にマッチさせてください
javax.validation.constraints.Positive.message        = 0 より大きな値にしてください
javax.validation.constraints.PositiveOrZero.message  = 0 以上の値にしてください
javax.validation.constraints.Size.message            = {min} から {max} の間のサイズにしてください

org.hibernate.validator.constraints.CreditCardNumber.message        = 正しくないクレジットカードの番号です
org.hibernate.validator.constraints.Currency.message                = 正しくない通貨単位です ({value} の中から選んでください)
org.hibernate.validator.constraints.EAN.message                     = 正しくない {type} バーコードです
org.hibernate.validator.constraints.Email.message                   = 電子メールとして正しい形式にしてください
org.hibernate.validator.constraints.ISBN.message                    = 正しくない ISBN です
org.hibernate.validator.constraints.Length.message                  = {min} から {max} の間の長さにしてください
org.hibernate.validator.constraints.CodePointLength.message         = {min} から {max} の間の長さにしてください
org.hibernate.validator.constraints.LuhnCheck.message               = ${validatedValue} のチェックデジットが正しくありません (Luhn モデュラス10アルゴリズム)
org.hibernate.validator.constraints.Mod10Check.message              = ${validatedValue} のチェックデジットが正しくありません (モデュラス10)
org.hibernate.validator.constraints.Mod11Check.message              = ${validatedValue} のチェックデジットが正しくありません (モデュラス11)
org.hibernate.validator.constraints.ModCheck.message                = ${validatedValue} のチェックデジットが正しくありません (${modType} のチェックサムが失敗しました)
org.hibernate.validator.constraints.NotBlank.message                = 空白は許可されてません
org.hibernate.validator.constraints.NotEmpty.message                = 空要素は許可されていません
org.hibernate.validator.constraints.ParametersScriptAssert.message  = 次のスクリプト式 "{script}" による評価結果が true になりませんでした
org.hibernate.validator.constraints.Range.message                   = {min} から {max} の間にしてください
org.hibernate.validator.constraints.SafeHtml.message                = 安全ではない HTML コンテンツです
org.hibernate.validator.constraints.ScriptAssert.message            = 次のスクリプト式 "{script}" による評価結果が true になりませんでした
org.hibernate.validator.constraints.UniqueElements.message          = 要素は全てユニークにしてください
org.hibernate.validator.constraints.URL.message                     = URL として正しい形式にしてください

org.hibernate.validator.constraints.br.CNPJ.message                 = 正しくないブラジル法人用税務登記番号 (CNPJ) です
org.hibernate.validator.constraints.br.CPF.message                  = 正しくないブラジル個人用納税者番号 (CPF) です
org.hibernate.validator.constraints.br.TituloEleitoral.message      = 正しくないブラジル投票者IDカード番号です

org.hibernate.validator.constraints.pl.REGON.message                = 正しくないポーランド国内経済登録番号 (REGON) です
org.hibernate.validator.constraints.pl.NIP.message                  = 正しくないポーランド納税者番号 (NIP) です
org.hibernate.validator.constraints.pl.PESEL.message                = 正しくないポーランド個人ID番号 (PESEL) です

org.hibernate.validator.constraints.time.DurationMax.message        = ${days == 0 ? '' : days == 1 ? ' 1 day' : ' ' += days += ' days'}${hours == 0 ? '' : hours == 1 ? ' 1 hour' : ' ' += hours += ' hours'}${minutes == 0 ? '' : minutes == 1 ? ' 1 minute' : ' ' += minutes += ' minutes'}${seconds == 0 ? '' : seconds == 1 ? ' 1 second' : ' ' += seconds += ' seconds'}${millis == 0 ? '' : millis == 1 ? ' 1 milli' : ' ' += millis += ' millis'}${nanos == 0 ? '' : nanos == 1 ? ' 1 nano' : ' ' += nanos += ' nanos'} ${inclusive == true ? 'と同じかより短い時間にしてください' : 'より短い時間にしてください'}
org.hibernate.validator.constraints.time.DurationMin.message        = ${days == 0 ? '' : days == 1 ? ' 1 day' : ' ' += days += ' days'}${hours == 0 ? '' : hours == 1 ? ' 1 hour' : ' ' += hours += ' hours'}${minutes == 0 ? '' : minutes == 1 ? ' 1 minute' : ' ' += minutes += ' minutes'}${seconds == 0 ? '' : seconds == 1 ? ' 1 second' : ' ' += seconds += ' seconds'}${millis == 0 ? '' : millis == 1 ? ' 1 milli' : ' ' += millis += ' millis'}${nanos == 0 ? '' : nanos == 1 ? ' 1 nano' : ' ' += nanos += ' nanos'} ${inclusive == true ? 'と同じかより長い時間にしてください' : 'より長い時間にしてください'}
```

原文は [こちら](https://github.com/hibernate/hibernate-validator/blob/master/engine/src/main/resources/org/hibernate/validator/ValidationMessages.properties) になります。

# このドラフトの扱いについて

このドラフトについて皆さんから意見を頂きたいと考えています。1ヶ月ほど様子を見て、皆さんから頂いた意見を反映したプルリクエストを出すつもりです。

特に次の点について意見を聞きたいなと思っています。

* 全体的な語調
    * ですます調で揃えている点など
* チェックデジットについてのメッセージ
    * 業界用語的にもっとふさわしいメッセージがありそう
* ブラジルやポーランドといった国固有のバリデーションメッセージがある
    * 訳す必要あるかなあ？ とも思いましたが、一応自分で調べた範囲で書いてみました
    * もし滞在経験者とかいたら是非ご意見を聞きたいです

というわけで皆さんどしどしご意見ください。

# (2018/10/01 追記)

1ヶ月経過しましたので、変更を締め切ってプルリクエストを出しました。今後のご意見は以下の PR の方に投げてください。

https://github.com/hibernate/hibernate-validator/pull/988

# (2018/10/25 追記)

無事プルリクエストが取り込まれました。皆様ありがとうございました。