up
This commit is contained in:
141
cmd/apimain.go
141
cmd/apimain.go
@@ -12,19 +12,8 @@ import (
|
|||||||
"Gwen/model"
|
"Gwen/model"
|
||||||
"Gwen/service"
|
"Gwen/service"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/BurntSushi/toml"
|
|
||||||
"github.com/gin-gonic/gin"
|
|
||||||
"github.com/go-playground/locales/en"
|
|
||||||
"github.com/go-playground/locales/zh_Hans_CN"
|
|
||||||
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"
|
|
||||||
"github.com/go-redis/redis/v8"
|
"github.com/go-redis/redis/v8"
|
||||||
"github.com/nicksnyder/go-i18n/v2/i18n"
|
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||||
"golang.org/x/text/language"
|
|
||||||
nethttp "net/http"
|
|
||||||
"reflect"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// @title 管理系统API
|
// @title 管理系统API
|
||||||
@@ -48,7 +37,7 @@ func main() {
|
|||||||
ReportCaller: global.Config.Logger.ReportCaller,
|
ReportCaller: global.Config.Logger.ReportCaller,
|
||||||
})
|
})
|
||||||
|
|
||||||
InitI18n()
|
global.InitI18n()
|
||||||
|
|
||||||
//redis
|
//redis
|
||||||
global.Redis = redis.NewClient(&redis.Options{
|
global.Redis = redis.NewClient(&redis.Options{
|
||||||
@@ -87,7 +76,7 @@ func main() {
|
|||||||
DatabaseAutoUpdate()
|
DatabaseAutoUpdate()
|
||||||
|
|
||||||
//validator
|
//validator
|
||||||
ApiInitValidator()
|
global.ApiInitValidator()
|
||||||
|
|
||||||
//oss
|
//oss
|
||||||
global.Oss = &upload.Oss{
|
global.Oss = &upload.Oss{
|
||||||
@@ -111,94 +100,6 @@ func main() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func ApiInitValidator() {
|
|
||||||
validate := validator.New()
|
|
||||||
|
|
||||||
// 定义不同的语言翻译
|
|
||||||
enT := en.New()
|
|
||||||
cn := zh_Hans_CN.New()
|
|
||||||
|
|
||||||
uni := ut.New(enT, cn)
|
|
||||||
|
|
||||||
enTrans, _ := uni.GetTranslator("en")
|
|
||||||
zhTrans, _ := uni.GetTranslator("zh_Hans_CN")
|
|
||||||
|
|
||||||
err := zh_translations.RegisterDefaultTranslations(validate, zhTrans)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
err = en_translations.RegisterDefaultTranslations(validate, enTrans)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
validate.RegisterTagNameFunc(func(field reflect.StructField) string {
|
|
||||||
label := field.Tag.Get("label")
|
|
||||||
if label == "" {
|
|
||||||
return field.Name
|
|
||||||
}
|
|
||||||
return label
|
|
||||||
})
|
|
||||||
global.Validator.Validate = validate
|
|
||||||
global.Validator.UT = uni // 存储 Universal Translator
|
|
||||||
global.Validator.VTrans = zhTrans
|
|
||||||
|
|
||||||
global.Validator.ValidStruct = func(ctx *gin.Context, i interface{}) []string {
|
|
||||||
err := global.Validator.Validate.Struct(i)
|
|
||||||
lang := ctx.GetHeader("Accept-Language")
|
|
||||||
if lang == "" {
|
|
||||||
lang = global.Config.Lang
|
|
||||||
}
|
|
||||||
trans := getTranslatorForLang(lang)
|
|
||||||
errList := make([]string, 0, 10)
|
|
||||||
if err != nil {
|
|
||||||
if _, ok := err.(*validator.InvalidValidationError); ok {
|
|
||||||
errList = append(errList, err.Error())
|
|
||||||
return errList
|
|
||||||
}
|
|
||||||
for _, err2 := range err.(validator.ValidationErrors) {
|
|
||||||
errList = append(errList, err2.Translate(trans))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return errList
|
|
||||||
}
|
|
||||||
global.Validator.ValidVar = func(ctx *gin.Context, field interface{}, tag string) []string {
|
|
||||||
err := global.Validator.Validate.Var(field, tag)
|
|
||||||
lang := ctx.GetHeader("Accept-Language")
|
|
||||||
if lang == "" {
|
|
||||||
lang = global.Config.Lang
|
|
||||||
}
|
|
||||||
trans := getTranslatorForLang(lang)
|
|
||||||
errList := make([]string, 0, 10)
|
|
||||||
if err != nil {
|
|
||||||
if _, ok := err.(*validator.InvalidValidationError); ok {
|
|
||||||
errList = append(errList, err.Error())
|
|
||||||
return errList
|
|
||||||
}
|
|
||||||
for _, err2 := range err.(validator.ValidationErrors) {
|
|
||||||
errList = append(errList, err2.Translate(trans))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return errList
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
func getTranslatorForLang(lang string) ut.Translator {
|
|
||||||
switch lang {
|
|
||||||
case "zh_CN":
|
|
||||||
fallthrough
|
|
||||||
case "zh-CN":
|
|
||||||
fallthrough
|
|
||||||
case "zh":
|
|
||||||
trans, _ := global.Validator.UT.GetTranslator("zh_Hans_CN")
|
|
||||||
return trans
|
|
||||||
case "en":
|
|
||||||
fallthrough
|
|
||||||
default:
|
|
||||||
trans, _ := global.Validator.UT.GetTranslator("en")
|
|
||||||
return trans
|
|
||||||
}
|
|
||||||
}
|
|
||||||
func DatabaseAutoUpdate() {
|
func DatabaseAutoUpdate() {
|
||||||
version := 235
|
version := 235
|
||||||
|
|
||||||
@@ -273,9 +174,7 @@ func Migrate(version uint) {
|
|||||||
var vc int64
|
var vc int64
|
||||||
global.DB.Model(&model.Version{}).Count(&vc)
|
global.DB.Model(&model.Version{}).Count(&vc)
|
||||||
if vc == 1 {
|
if vc == 1 {
|
||||||
localizer := global.Localizer(&gin.Context{
|
localizer := global.Localizer("")
|
||||||
Request: &nethttp.Request{},
|
|
||||||
})
|
|
||||||
defaultGroup, _ := localizer.LocalizeMessage(&i18n.Message{
|
defaultGroup, _ := localizer.LocalizeMessage(&i18n.Message{
|
||||||
ID: "DefaultGroup",
|
ID: "DefaultGroup",
|
||||||
})
|
})
|
||||||
@@ -307,37 +206,3 @@ func Migrate(version uint) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func InitI18n() {
|
|
||||||
bundle := i18n.NewBundle(language.English)
|
|
||||||
bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
|
|
||||||
bundle.LoadMessageFile(global.Config.Gin.ResourcesPath + "/i18n/en.toml")
|
|
||||||
bundle.LoadMessageFile(global.Config.Gin.ResourcesPath + "/i18n/zh_CN.toml")
|
|
||||||
global.Localizer = func(ctx *gin.Context) *i18n.Localizer {
|
|
||||||
lang := ctx.GetHeader("Accept-Language")
|
|
||||||
if lang == "" {
|
|
||||||
lang = global.Config.Lang
|
|
||||||
}
|
|
||||||
if lang == "en" {
|
|
||||||
return i18n.NewLocalizer(bundle, "en")
|
|
||||||
} else {
|
|
||||||
return i18n.NewLocalizer(bundle, lang, "en")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//personUnreadEmails := localizer.MustLocalize(&i18n.LocalizeConfig{
|
|
||||||
// DefaultMessage: &i18n.Message{
|
|
||||||
// ID: "PersonUnreadEmails",
|
|
||||||
// },
|
|
||||||
// PluralCount: 6,
|
|
||||||
// TemplateData: map[string]interface{}{
|
|
||||||
// "Name": "LE",
|
|
||||||
// "PluralCount": 6,
|
|
||||||
// },
|
|
||||||
//})
|
|
||||||
//personUnreadEmails, err := global.Localizer.LocalizeMessage(&i18n.Message{
|
|
||||||
// ID: "ParamsError",
|
|
||||||
//})
|
|
||||||
//fmt.Println(err, personUnreadEmails)
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|||||||
101
global/apiValidator.go
Normal file
101
global/apiValidator.go
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
package global
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"github.com/go-playground/locales/en"
|
||||||
|
"github.com/go-playground/locales/zh_Hans_CN"
|
||||||
|
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"
|
||||||
|
"reflect"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ApiInitValidator() {
|
||||||
|
validate := validator.New()
|
||||||
|
|
||||||
|
// 定义不同的语言翻译
|
||||||
|
enT := en.New()
|
||||||
|
cn := zh_Hans_CN.New()
|
||||||
|
|
||||||
|
uni := ut.New(enT, cn)
|
||||||
|
|
||||||
|
enTrans, _ := uni.GetTranslator("en")
|
||||||
|
zhTrans, _ := uni.GetTranslator("zh_Hans_CN")
|
||||||
|
|
||||||
|
err := zh_translations.RegisterDefaultTranslations(validate, zhTrans)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
err = en_translations.RegisterDefaultTranslations(validate, enTrans)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
validate.RegisterTagNameFunc(func(field reflect.StructField) string {
|
||||||
|
label := field.Tag.Get("label")
|
||||||
|
if label == "" {
|
||||||
|
return field.Name
|
||||||
|
}
|
||||||
|
return label
|
||||||
|
})
|
||||||
|
Validator.Validate = validate
|
||||||
|
Validator.UT = uni // 存储 Universal Translator
|
||||||
|
Validator.VTrans = zhTrans
|
||||||
|
|
||||||
|
Validator.ValidStruct = func(ctx *gin.Context, i interface{}) []string {
|
||||||
|
err := Validator.Validate.Struct(i)
|
||||||
|
lang := ctx.GetHeader("Accept-Language")
|
||||||
|
if lang == "" {
|
||||||
|
lang = Config.Lang
|
||||||
|
}
|
||||||
|
trans := getTranslatorForLang(lang)
|
||||||
|
errList := make([]string, 0, 10)
|
||||||
|
if err != nil {
|
||||||
|
if _, ok := err.(*validator.InvalidValidationError); ok {
|
||||||
|
errList = append(errList, err.Error())
|
||||||
|
return errList
|
||||||
|
}
|
||||||
|
for _, err2 := range err.(validator.ValidationErrors) {
|
||||||
|
errList = append(errList, err2.Translate(trans))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return errList
|
||||||
|
}
|
||||||
|
Validator.ValidVar = func(ctx *gin.Context, field interface{}, tag string) []string {
|
||||||
|
err := Validator.Validate.Var(field, tag)
|
||||||
|
lang := ctx.GetHeader("Accept-Language")
|
||||||
|
if lang == "" {
|
||||||
|
lang = Config.Lang
|
||||||
|
}
|
||||||
|
trans := getTranslatorForLang(lang)
|
||||||
|
errList := make([]string, 0, 10)
|
||||||
|
if err != nil {
|
||||||
|
if _, ok := err.(*validator.InvalidValidationError); ok {
|
||||||
|
errList = append(errList, err.Error())
|
||||||
|
return errList
|
||||||
|
}
|
||||||
|
for _, err2 := range err.(validator.ValidationErrors) {
|
||||||
|
errList = append(errList, err2.Translate(trans))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return errList
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
func getTranslatorForLang(lang string) ut.Translator {
|
||||||
|
switch lang {
|
||||||
|
case "zh_CN":
|
||||||
|
fallthrough
|
||||||
|
case "zh-CN":
|
||||||
|
fallthrough
|
||||||
|
case "zh":
|
||||||
|
trans, _ := Validator.UT.GetTranslator("zh_Hans_CN")
|
||||||
|
return trans
|
||||||
|
case "en":
|
||||||
|
fallthrough
|
||||||
|
default:
|
||||||
|
trans, _ := Validator.UT.GetTranslator("en")
|
||||||
|
return trans
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,5 +33,5 @@ var (
|
|||||||
Oss *upload.Oss
|
Oss *upload.Oss
|
||||||
Jwt *jwt.Jwt
|
Jwt *jwt.Jwt
|
||||||
Lock lock.Locker
|
Lock lock.Locker
|
||||||
Localizer func(ctx *gin.Context) *i18n.Localizer
|
Localizer func(lang string) *i18n.Localizer
|
||||||
)
|
)
|
||||||
|
|||||||
53
global/i18n.go
Normal file
53
global/i18n.go
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
package global
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/BurntSushi/toml"
|
||||||
|
"github.com/nicksnyder/go-i18n/v2/i18n"
|
||||||
|
"golang.org/x/text/language"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func InitI18n() {
|
||||||
|
bundle := i18n.NewBundle(language.English)
|
||||||
|
bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
|
||||||
|
//读取global.Config.Gin.ResourcesPath下的所有语言文件
|
||||||
|
dir := Config.Gin.ResourcesPath + "/i18n"
|
||||||
|
fileInfos, err := os.ReadDir(dir)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
for _, fileInfo := range fileInfos {
|
||||||
|
//如果文件名不是.toml结尾
|
||||||
|
if fileInfo.IsDir() || fileInfo.Name()[len(fileInfo.Name())-5:] != ".toml" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
bundle.LoadMessageFile(Config.Gin.ResourcesPath + "/i18n/" + fileInfo.Name())
|
||||||
|
}
|
||||||
|
Localizer = func(lang string) *i18n.Localizer {
|
||||||
|
if lang == "" {
|
||||||
|
lang = Config.Lang
|
||||||
|
}
|
||||||
|
if lang == "en" {
|
||||||
|
return i18n.NewLocalizer(bundle, "en")
|
||||||
|
} else {
|
||||||
|
return i18n.NewLocalizer(bundle, lang, "en")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//personUnreadEmails := localizer.MustLocalize(&i18n.LocalizeConfig{
|
||||||
|
// DefaultMessage: &i18n.Message{
|
||||||
|
// ID: "PersonUnreadEmails",
|
||||||
|
// },
|
||||||
|
// PluralCount: 6,
|
||||||
|
// TemplateData: map[string]interface{}{
|
||||||
|
// "Name": "LE",
|
||||||
|
// "PluralCount": 6,
|
||||||
|
// },
|
||||||
|
//})
|
||||||
|
//personUnreadEmails, err := global.Localizer.LocalizeMessage(&i18n.Message{
|
||||||
|
// ID: "ParamsError",
|
||||||
|
//})
|
||||||
|
//fmt.Println(err, personUnreadEmails)
|
||||||
|
|
||||||
|
}
|
||||||
@@ -56,7 +56,7 @@ type ServerConfigResponse struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TranslateMsg(c *gin.Context, messageId string) string {
|
func TranslateMsg(c *gin.Context, messageId string) string {
|
||||||
localizer := global.Localizer(c)
|
localizer := global.Localizer(c.GetHeader("Accept-Language"))
|
||||||
errMsg, err := localizer.LocalizeMessage(&i18n.Message{
|
errMsg, err := localizer.LocalizeMessage(&i18n.Message{
|
||||||
ID: messageId,
|
ID: messageId,
|
||||||
})
|
})
|
||||||
@@ -67,7 +67,7 @@ func TranslateMsg(c *gin.Context, messageId string) string {
|
|||||||
return errMsg
|
return errMsg
|
||||||
}
|
}
|
||||||
func TranslateTempMsg(c *gin.Context, messageId string, templateData map[string]interface{}) string {
|
func TranslateTempMsg(c *gin.Context, messageId string, templateData map[string]interface{}) string {
|
||||||
localizer := global.Localizer(c)
|
localizer := global.Localizer(c.GetHeader("Accept-Language"))
|
||||||
errMsg, err := localizer.Localize(&i18n.LocalizeConfig{
|
errMsg, err := localizer.Localize(&i18n.LocalizeConfig{
|
||||||
DefaultMessage: &i18n.Message{
|
DefaultMessage: &i18n.Message{
|
||||||
ID: messageId,
|
ID: messageId,
|
||||||
@@ -81,7 +81,7 @@ func TranslateTempMsg(c *gin.Context, messageId string, templateData map[string]
|
|||||||
return errMsg
|
return errMsg
|
||||||
}
|
}
|
||||||
func TranslateParamMsg(c *gin.Context, messageId string, params ...string) string {
|
func TranslateParamMsg(c *gin.Context, messageId string, params ...string) string {
|
||||||
localizer := global.Localizer(c)
|
localizer := global.Localizer(c.GetHeader("Accept-Language"))
|
||||||
templateData := make(map[string]interface{})
|
templateData := make(map[string]interface{})
|
||||||
for i, v := range params {
|
for i, v := range params {
|
||||||
k := fmt.Sprintf("P%d", i)
|
k := fmt.Sprintf("P%d", i)
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ func WebInit(g *gin.Engine) {
|
|||||||
|
|
||||||
if global.Config.App.WebClient == 1 {
|
if global.Config.App.WebClient == 1 {
|
||||||
g.StaticFS("/webclient", http.Dir(global.Config.Gin.ResourcesPath+"/web"))
|
g.StaticFS("/webclient", http.Dir(global.Config.Gin.ResourcesPath+"/web"))
|
||||||
|
g.StaticFS("/webclient2", http.Dir(global.Config.Gin.ResourcesPath+"/web2"))
|
||||||
}
|
}
|
||||||
g.StaticFS("/_admin", http.Dir(global.Config.Gin.ResourcesPath+"/admin"))
|
g.StaticFS("/_admin", http.Dir(global.Config.Gin.ResourcesPath+"/admin"))
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user