数据校验组件支持i18n特性,内部使用了goframe框架统一的i18n组件实现。默认使用默认的i18n单例对象,即g.I18n()对象。

在进一步使用之前,关于i18n国际化功能配置及使用请参考章节:I18N国际化

配置示例

默认i18n错误提示

默认的英文国际化语言配置文件参考:https://github.com/gogf/gf/tree/master/util/gvalid/i18n/en

中文错误提示

我们提供了建议的中文i18n国际化语言配置文件:https://github.com/gogf/gf/tree/master/util/gvalid/i18n/cn 

默认 错误提示

当在i18n中找不到对应规则的错误提示时,将会使用__default__配置的错误提示信息。往往使用在自定义规则中。

开发示例

我们通过中间件统一设置请求的错误提示i18n语言。

目录结构

注意工程目录结构,以便于默认的g.i18n()对象能自动读取配置。有相当一部分同学倒在了这里。

├── main.go
└── i18n
    ├── en.toml
    └── zh-CN.toml

i18n文件

en.toml

"ReuiredUserName" = "Please input user name"
"ReuiredUserType" = "Please select user type"

zh-CN.toml

"ReuiredUserName" = "请输入用户名称"
"ReuiredUserType" = "请选择用户类型"

示例代码

package main

import (
	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/i18n/gi18n"
	"github.com/gogf/gf/v2/os/gctx"
	"github.com/gogf/gf/v2/util/gconv"
)

func main() {
	type User struct {
		Name string `v:"required#ReuiredUserName"`
		Type int    `v:"required#ReuiredUserType"`
	}
	var (
		ctx  = gctx.New()
		data = g.Map{
			"name": "john",
		}
		user  = User{}
		ctxEn = gi18n.WithLanguage(ctx, "en")
		ctxCh = gi18n.WithLanguage(ctx, "zh-CN")
	)

	if err := gconv.Scan(data, &user); err != nil {
		panic(err)
	}
	// 英文 
	if err := g.Validator().Assoc(data).Data(user).Run(ctxEn); err != nil {   
		g.Dump(err.String())
	}
	// 中文 
	if err := g.Validator().Assoc(data).Data(user).Run(ctxCh); err != nil {   
		g.Dump(err.String())
	}
}

执行后,终端输出:

Please select user type
请选择用户类型
Content Menu

  • No labels

9 Comments

  1. 默认的中文错误提示如何在config.toml中配置?

      1. 我想问的是有没有类似这种配置项

        [i18n]

            lang = zh-CN

        然后默认错误信息就显示成了中文

        1. 没,全局设置的话,目前需要手动调用方法设置。

  2. 我想让入参校验提示的错误信息变成中文,然后我在全局中间件里手动设置了本地化语言

    g.I18n().SetLanguage("zh-CN")

    ,随后测试入参校验时错误提示的还是默认的英文,那么应该怎么样设置让错误信息切换中文,这里没有通过自定义配置多语言包,使用的框架里自带验证规则错误信息

    另外怎么获取本地化的语言方法

    1. 你在中间件中 r.SetCtx(gi18n.WithLanguage(r.Context(), "zh-CN")) 就可以了

      1. 多谢,我通过把框架里带的 util/gvalid/i18n/  下的 cn 目录拷贝到 i18n 目录下重命名为 zh-CN 解决了

      2. 我也遇到同样的问题了   但是用了这位同学的解决方案  依然还是英文

        )



        var (
            Main = gcmd.Command{
                Name:  "main",
                Usage: "main",
                Brief: "start http server",
                Func: func(ctx context.Context, parser *gcmd.Parser) (err error) {
                    s := g.Server()
                    s.Group("/home", func(group *ghttp.RouterGroup) {
                        group.Middleware(func(r *ghttp.Request) {
                            r.SetCtx(gi18n.WithLanguage(r.Context(), "zh-CN"))
                            r.Middleware.Next()
                        })
                        group.Middleware(ghttp.MiddlewareHandlerResponse)
                        group.Group("/index", func(group *ghttp.RouterGroup) {
                            group.Bind(
                                home.NewIndex(),
                            )
                        })
                    })
                    s.Run()
                    return nil
                },
            }
        )

        1. 我也是这样,大佬解决没