Skip to content

国際化

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)

選択ルール:

  1. 要求されたロケールのテンプレートセットがあればそれを使用。
  2. ロケールが登録されていなければパッケージデフォルト(中国語)に フォールバック。
  3. 選ばれたロケール内に特定のテンプレートキーが無ければ、 _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) // → "邮箱不能为空"

呼び出しごとの探索順:

  1. 要求されたロケールの label-<lang>
  2. label
  3. 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)

MIT ライセンスのもとで公開されています。