V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
aababc
V2EX  ›  程序员

go validator 多语言支持

  •  
  •   aababc · 3 天前 · 615 次点击

    当前我在使用 gin + validator 的过程中,想实现 validator 根据 accept-language 自动切换验证的错误信息,看了一下 validator 的示例代码,感觉完全没有看明白要怎么用?

    import (
    	"fmt"
    
    	"github.com/go-playground/locales/en"
        "github.com/go-playground/locales/zh"
    	ut "github.com/go-playground/universal-translator"
    	"github.com/go-playground/validator/v10"
    	en_translations "github.com/go-playground/validator/v10/translations/en"
        zh_translations "github.com/go-playground/validator/v10/translations/zh"
    )
    ...
    en := en.New()
    uni = ut.New(en, zh.New())
    
    // this is usually know or extracted from http 'Accept-Language' header
    // also see uni.FindTranslator(...)
    trans, _ := uni.GetTranslator("en")
    
    validate = validator.New()
    en_translations.RegisterDefaultTranslations(validate, trans)
    

    我按照这个代码测试之后,发现完全不能正常的工作,需有变成这种模式

    switch locale {
    case "en":
    err = enTranslations.RegisterDefaultTranslations(v, trans)
    case "zh":
    err = zhTranslations.RegisterDefaultTranslations(v, trans)
    default:
    err = enTranslations.RegisterDefaultTranslations(v, trans)
    }
    

    但是这样写就需要构造多个 validator 实例,大家平常在使用这个库的时候是怎么配置的

    第 1 条附言  ·  3 天前
    下午尝试了一下,正确的用法应该是这样的
    ```
    uni = ut.New(en.New(), zh.New())
    // 注册支持的所有语言类型
    transEn, _ := uni.GetTranslator("en")
    transZh, _ := uni.GetTranslator("zh")
    enTranslations.RegisterDefaultTranslations(validate, transEn)
    zhTranslations.RegisterDefaultTranslations(validate, transZh)

    // 在 http handler 中
    lang := parseAcceptLanguage(c.GetHeader("Accept-Language"))
    trans, _ := uni.GetTranslator(lang)

    var user User
    if err := c.ShouldBindJSON(&user); err != nil {
    errors := make([]string, 0)
    for _, err := range err.(validator.ValidationErrors) {
    errors = append(errors, err.Translate(trans))
    }
    c.JSON( http.StatusBadRequest, gin.H{"errors": errors, "dd": "d"})
    return
    }
    ```
    2 条回复    2025-03-06 18:50:10 +08:00
    Ayanokouji
        1
    Ayanokouji  
       3 天前
    自己写: https://zog.dev/packages/i18n
    反正自带我是用不了一点
    aababc
        2
    aababc  
    OP
       3 天前
    @Ayanokouji #1 哎,现在就像看看能不能直接用它提供的回调,现在看来是不行的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2453 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 15:52 · PVG 23:52 · LAX 08:52 · JFK 11:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.