国際化
govalid はエンドツーエンドでロケールを意識しています:ルール メッセージ、フィールドラベル、診断テンプレートのすべてを本地化 できます。
同梱ロケール
| ロケール | Tag |
|---|---|
| 中国語(デフォルト) | language.Chinese |
| 英語 | language.English |
デフォルトロケールは中国語です。govalid.defaultTemplateLanguage は 公開されていません——呼び出し単位でロケールを選んでください。
呼び出しごとのロケール
Check はオプションで language.Tag を受け付けます:
go
import "golang.org/x/text/language"
errs, ok := govalid.Check(form, language.English)選択ルール:
- 要求されたロケールのテンプレートセットがあればそれを使用。
- ロケールが登録されていなければパッケージデフォルト(中国語)に フォールバック。
- 選ばれたロケール内に特定のテンプレートキーが無ければ、
_unknownErrorTemplateにフォールバック。
ローカライズされたフィールドラベル
label-<lang> タグで、デフォルトの label と並べてロケール別の ラベルを付けられます。lang サフィックスは language.Tag.String() に対応します:
go
type Form struct {
Email string `valid:"required" label:"邮箱" label-en:"Email"`
}
govalid.Check(form, language.English) // → "Email can not be empty"
govalid.Check(form, language.Chinese) // → "邮箱不能为空"呼び出しごとの探索順:
- 要求されたロケールの
label-<lang> label- Go フィールド名
新しいロケールを追加する
SetMessageTemplates は最初の呼び出し時にロケールを作ります:
go
import "golang.org/x/text/language"
govalid.SetMessageTemplates(map[string]string{
"required": " は必須です",
"min": " は %v 以上である必要があります",
}, language.Japanese)エントリは選択的に上書きできます——あなたが提供したキーだけが置換 され、残りは上のルールに従ってデフォルトロケールにフォールバック します。
実行時にロケールを選ぶ
よくあるパターンは HTTP リクエストからロケールを推定することです:
go
func handler(w http.ResponseWriter, r *http.Request) {
var form Form
_ = json.NewDecoder(r.Body).Decode(&form)
matcher := language.NewMatcher([]language.Tag{
language.Chinese, language.English, language.Japanese,
})
accept, _, _ := language.ParseAcceptLanguage(r.Header.Get("Accept-Language"))
tag, _, _ := matcher.Match(accept...)
errs, ok := govalid.Check(form, tag)
if !ok {
// errs をクライアントへ描画
}
}ロケール別の診断テンプレート
_ プレフィックスの 5 つの診断テンプレートも本地化されます。通常の ルールテンプレートと同じく、ロケールごとに上書きできます:
go
govalid.SetMessageTemplates(map[string]string{
"_checkerNotFound": "Unknown rule",
"_paramError": "Bad rule parameters",
"_valueTypeError": "Wrong field type",
"_fieldNotFound": "Referenced field not found",
"_unknownErrorTemplate": "Validation failed",
}, language.English)