ljw 1 год назад
Родитель
Сommit
6fb1235dd8
6 измененных файлов с 162 добавлено и 142 удалено
  1. 3 138
      cmd/apimain.go
  2. 101 0
      global/apiValidator.go
  3. 1 1
      global/global.go
  4. 53 0
      global/i18n.go
  5. 3 3
      http/response/response.go
  6. 1 0
      http/router/router.go

+ 3 - 138
cmd/apimain.go

@@ -12,19 +12,8 @@ import (
12 12
 	"Gwen/model"
13 13
 	"Gwen/service"
14 14
 	"fmt"
15
-	"github.com/BurntSushi/toml"
16
-	"github.com/gin-gonic/gin"
17
-	"github.com/go-playground/locales/en"
18
-	"github.com/go-playground/locales/zh_Hans_CN"
19
-	ut "github.com/go-playground/universal-translator"
20
-	"github.com/go-playground/validator/v10"
21
-	en_translations "github.com/go-playground/validator/v10/translations/en"
22
-	zh_translations "github.com/go-playground/validator/v10/translations/zh"
23 15
 	"github.com/go-redis/redis/v8"
24 16
 	"github.com/nicksnyder/go-i18n/v2/i18n"
25
-	"golang.org/x/text/language"
26
-	nethttp "net/http"
27
-	"reflect"
28 17
 )
29 18
 
30 19
 // @title 管理系统API
@@ -48,7 +37,7 @@ func main() {
48 37
 		ReportCaller: global.Config.Logger.ReportCaller,
49 38
 	})
50 39
 
51
-	InitI18n()
40
+	global.InitI18n()
52 41
 
53 42
 	//redis
54 43
 	global.Redis = redis.NewClient(&redis.Options{
@@ -87,7 +76,7 @@ func main() {
87 76
 	DatabaseAutoUpdate()
88 77
 
89 78
 	//validator
90
-	ApiInitValidator()
79
+	global.ApiInitValidator()
91 80
 
92 81
 	//oss
93 82
 	global.Oss = &upload.Oss{
@@ -111,94 +100,6 @@ func main() {
111 100
 
112 101
 }
113 102
 
114
-func ApiInitValidator() {
115
-	validate := validator.New()
116
-
117
-	// 定义不同的语言翻译
118
-	enT := en.New()
119
-	cn := zh_Hans_CN.New()
120
-
121
-	uni := ut.New(enT, cn)
122
-
123
-	enTrans, _ := uni.GetTranslator("en")
124
-	zhTrans, _ := uni.GetTranslator("zh_Hans_CN")
125
-
126
-	err := zh_translations.RegisterDefaultTranslations(validate, zhTrans)
127
-	if err != nil {
128
-		panic(err)
129
-	}
130
-	err = en_translations.RegisterDefaultTranslations(validate, enTrans)
131
-	if err != nil {
132
-		panic(err)
133
-	}
134
-
135
-	validate.RegisterTagNameFunc(func(field reflect.StructField) string {
136
-		label := field.Tag.Get("label")
137
-		if label == "" {
138
-			return field.Name
139
-		}
140
-		return label
141
-	})
142
-	global.Validator.Validate = validate
143
-	global.Validator.UT = uni // 存储 Universal Translator
144
-	global.Validator.VTrans = zhTrans
145
-
146
-	global.Validator.ValidStruct = func(ctx *gin.Context, i interface{}) []string {
147
-		err := global.Validator.Validate.Struct(i)
148
-		lang := ctx.GetHeader("Accept-Language")
149
-		if lang == "" {
150
-			lang = global.Config.Lang
151
-		}
152
-		trans := getTranslatorForLang(lang)
153
-		errList := make([]string, 0, 10)
154
-		if err != nil {
155
-			if _, ok := err.(*validator.InvalidValidationError); ok {
156
-				errList = append(errList, err.Error())
157
-				return errList
158
-			}
159
-			for _, err2 := range err.(validator.ValidationErrors) {
160
-				errList = append(errList, err2.Translate(trans))
161
-			}
162
-		}
163
-		return errList
164
-	}
165
-	global.Validator.ValidVar = func(ctx *gin.Context, field interface{}, tag string) []string {
166
-		err := global.Validator.Validate.Var(field, tag)
167
-		lang := ctx.GetHeader("Accept-Language")
168
-		if lang == "" {
169
-			lang = global.Config.Lang
170
-		}
171
-		trans := getTranslatorForLang(lang)
172
-		errList := make([]string, 0, 10)
173
-		if err != nil {
174
-			if _, ok := err.(*validator.InvalidValidationError); ok {
175
-				errList = append(errList, err.Error())
176
-				return errList
177
-			}
178
-			for _, err2 := range err.(validator.ValidationErrors) {
179
-				errList = append(errList, err2.Translate(trans))
180
-			}
181
-		}
182
-		return errList
183
-	}
184
-
185
-}
186
-func getTranslatorForLang(lang string) ut.Translator {
187
-	switch lang {
188
-	case "zh_CN":
189
-		fallthrough
190
-	case "zh-CN":
191
-		fallthrough
192
-	case "zh":
193
-		trans, _ := global.Validator.UT.GetTranslator("zh_Hans_CN")
194
-		return trans
195
-	case "en":
196
-		fallthrough
197
-	default:
198
-		trans, _ := global.Validator.UT.GetTranslator("en")
199
-		return trans
200
-	}
201
-}
202 103
 func DatabaseAutoUpdate() {
203 104
 	version := 235
204 105
 
@@ -273,9 +174,7 @@ func Migrate(version uint) {
273 174
 	var vc int64
274 175
 	global.DB.Model(&model.Version{}).Count(&vc)
275 176
 	if vc == 1 {
276
-		localizer := global.Localizer(&gin.Context{
277
-			Request: &nethttp.Request{},
278
-		})
177
+		localizer := global.Localizer("")
279 178
 		defaultGroup, _ := localizer.LocalizeMessage(&i18n.Message{
280 179
 			ID: "DefaultGroup",
281 180
 		})
@@ -307,37 +206,3 @@ func Migrate(version uint) {
307 206
 	}
308 207
 
309 208
 }
310
-
311
-func InitI18n() {
312
-	bundle := i18n.NewBundle(language.English)
313
-	bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
314
-	bundle.LoadMessageFile(global.Config.Gin.ResourcesPath + "/i18n/en.toml")
315
-	bundle.LoadMessageFile(global.Config.Gin.ResourcesPath + "/i18n/zh_CN.toml")
316
-	global.Localizer = func(ctx *gin.Context) *i18n.Localizer {
317
-		lang := ctx.GetHeader("Accept-Language")
318
-		if lang == "" {
319
-			lang = global.Config.Lang
320
-		}
321
-		if lang == "en" {
322
-			return i18n.NewLocalizer(bundle, "en")
323
-		} else {
324
-			return i18n.NewLocalizer(bundle, lang, "en")
325
-		}
326
-	}
327
-
328
-	//personUnreadEmails := localizer.MustLocalize(&i18n.LocalizeConfig{
329
-	//	DefaultMessage: &i18n.Message{
330
-	//		ID: "PersonUnreadEmails",
331
-	//	},
332
-	//	PluralCount: 6,
333
-	//	TemplateData: map[string]interface{}{
334
-	//		"Name":        "LE",
335
-	//		"PluralCount": 6,
336
-	//	},
337
-	//})
338
-	//personUnreadEmails, err := global.Localizer.LocalizeMessage(&i18n.Message{
339
-	//	ID: "ParamsError",
340
-	//})
341
-	//fmt.Println(err, personUnreadEmails)
342
-
343
-}

+ 101 - 0
global/apiValidator.go

@@ -0,0 +1,101 @@
1
+package global
2
+
3
+import (
4
+	"github.com/gin-gonic/gin"
5
+	"github.com/go-playground/locales/en"
6
+	"github.com/go-playground/locales/zh_Hans_CN"
7
+	ut "github.com/go-playground/universal-translator"
8
+	"github.com/go-playground/validator/v10"
9
+	en_translations "github.com/go-playground/validator/v10/translations/en"
10
+	zh_translations "github.com/go-playground/validator/v10/translations/zh"
11
+	"reflect"
12
+)
13
+
14
+func ApiInitValidator() {
15
+	validate := validator.New()
16
+
17
+	// 定义不同的语言翻译
18
+	enT := en.New()
19
+	cn := zh_Hans_CN.New()
20
+
21
+	uni := ut.New(enT, cn)
22
+
23
+	enTrans, _ := uni.GetTranslator("en")
24
+	zhTrans, _ := uni.GetTranslator("zh_Hans_CN")
25
+
26
+	err := zh_translations.RegisterDefaultTranslations(validate, zhTrans)
27
+	if err != nil {
28
+		panic(err)
29
+	}
30
+	err = en_translations.RegisterDefaultTranslations(validate, enTrans)
31
+	if err != nil {
32
+		panic(err)
33
+	}
34
+
35
+	validate.RegisterTagNameFunc(func(field reflect.StructField) string {
36
+		label := field.Tag.Get("label")
37
+		if label == "" {
38
+			return field.Name
39
+		}
40
+		return label
41
+	})
42
+	Validator.Validate = validate
43
+	Validator.UT = uni // 存储 Universal Translator
44
+	Validator.VTrans = zhTrans
45
+
46
+	Validator.ValidStruct = func(ctx *gin.Context, i interface{}) []string {
47
+		err := Validator.Validate.Struct(i)
48
+		lang := ctx.GetHeader("Accept-Language")
49
+		if lang == "" {
50
+			lang = Config.Lang
51
+		}
52
+		trans := getTranslatorForLang(lang)
53
+		errList := make([]string, 0, 10)
54
+		if err != nil {
55
+			if _, ok := err.(*validator.InvalidValidationError); ok {
56
+				errList = append(errList, err.Error())
57
+				return errList
58
+			}
59
+			for _, err2 := range err.(validator.ValidationErrors) {
60
+				errList = append(errList, err2.Translate(trans))
61
+			}
62
+		}
63
+		return errList
64
+	}
65
+	Validator.ValidVar = func(ctx *gin.Context, field interface{}, tag string) []string {
66
+		err := Validator.Validate.Var(field, tag)
67
+		lang := ctx.GetHeader("Accept-Language")
68
+		if lang == "" {
69
+			lang = Config.Lang
70
+		}
71
+		trans := getTranslatorForLang(lang)
72
+		errList := make([]string, 0, 10)
73
+		if err != nil {
74
+			if _, ok := err.(*validator.InvalidValidationError); ok {
75
+				errList = append(errList, err.Error())
76
+				return errList
77
+			}
78
+			for _, err2 := range err.(validator.ValidationErrors) {
79
+				errList = append(errList, err2.Translate(trans))
80
+			}
81
+		}
82
+		return errList
83
+	}
84
+
85
+}
86
+func getTranslatorForLang(lang string) ut.Translator {
87
+	switch lang {
88
+	case "zh_CN":
89
+		fallthrough
90
+	case "zh-CN":
91
+		fallthrough
92
+	case "zh":
93
+		trans, _ := Validator.UT.GetTranslator("zh_Hans_CN")
94
+		return trans
95
+	case "en":
96
+		fallthrough
97
+	default:
98
+		trans, _ := Validator.UT.GetTranslator("en")
99
+		return trans
100
+	}
101
+}

+ 1 - 1
global/global.go

@@ -33,5 +33,5 @@ var (
33 33
 	Oss       *upload.Oss
34 34
 	Jwt       *jwt.Jwt
35 35
 	Lock      lock.Locker
36
-	Localizer func(ctx *gin.Context) *i18n.Localizer
36
+	Localizer func(lang string) *i18n.Localizer
37 37
 )

+ 53 - 0
global/i18n.go

@@ -0,0 +1,53 @@
1
+package global
2
+
3
+import (
4
+	"github.com/BurntSushi/toml"
5
+	"github.com/nicksnyder/go-i18n/v2/i18n"
6
+	"golang.org/x/text/language"
7
+	"os"
8
+)
9
+
10
+func InitI18n() {
11
+	bundle := i18n.NewBundle(language.English)
12
+	bundle.RegisterUnmarshalFunc("toml", toml.Unmarshal)
13
+	//读取global.Config.Gin.ResourcesPath下的所有语言文件
14
+	dir := Config.Gin.ResourcesPath + "/i18n"
15
+	fileInfos, err := os.ReadDir(dir)
16
+	if err != nil {
17
+		panic(err)
18
+		return
19
+	}
20
+	for _, fileInfo := range fileInfos {
21
+		//如果文件名不是.toml结尾
22
+		if fileInfo.IsDir() || fileInfo.Name()[len(fileInfo.Name())-5:] != ".toml" {
23
+			continue
24
+		}
25
+		bundle.LoadMessageFile(Config.Gin.ResourcesPath + "/i18n/" + fileInfo.Name())
26
+	}
27
+	Localizer = func(lang string) *i18n.Localizer {
28
+		if lang == "" {
29
+			lang = Config.Lang
30
+		}
31
+		if lang == "en" {
32
+			return i18n.NewLocalizer(bundle, "en")
33
+		} else {
34
+			return i18n.NewLocalizer(bundle, lang, "en")
35
+		}
36
+	}
37
+
38
+	//personUnreadEmails := localizer.MustLocalize(&i18n.LocalizeConfig{
39
+	//	DefaultMessage: &i18n.Message{
40
+	//		ID: "PersonUnreadEmails",
41
+	//	},
42
+	//	PluralCount: 6,
43
+	//	TemplateData: map[string]interface{}{
44
+	//		"Name":        "LE",
45
+	//		"PluralCount": 6,
46
+	//	},
47
+	//})
48
+	//personUnreadEmails, err := global.Localizer.LocalizeMessage(&i18n.Message{
49
+	//	ID: "ParamsError",
50
+	//})
51
+	//fmt.Println(err, personUnreadEmails)
52
+
53
+}

+ 3 - 3
http/response/response.go

@@ -56,7 +56,7 @@ type ServerConfigResponse struct {
56 56
 }
57 57
 
58 58
 func TranslateMsg(c *gin.Context, messageId string) string {
59
-	localizer := global.Localizer(c)
59
+	localizer := global.Localizer(c.GetHeader("Accept-Language"))
60 60
 	errMsg, err := localizer.LocalizeMessage(&i18n.Message{
61 61
 		ID: messageId,
62 62
 	})
@@ -67,7 +67,7 @@ func TranslateMsg(c *gin.Context, messageId string) string {
67 67
 	return errMsg
68 68
 }
69 69
 func TranslateTempMsg(c *gin.Context, messageId string, templateData map[string]interface{}) string {
70
-	localizer := global.Localizer(c)
70
+	localizer := global.Localizer(c.GetHeader("Accept-Language"))
71 71
 	errMsg, err := localizer.Localize(&i18n.LocalizeConfig{
72 72
 		DefaultMessage: &i18n.Message{
73 73
 			ID: messageId,
@@ -81,7 +81,7 @@ func TranslateTempMsg(c *gin.Context, messageId string, templateData map[string]
81 81
 	return errMsg
82 82
 }
83 83
 func TranslateParamMsg(c *gin.Context, messageId string, params ...string) string {
84
-	localizer := global.Localizer(c)
84
+	localizer := global.Localizer(c.GetHeader("Accept-Language"))
85 85
 	templateData := make(map[string]interface{})
86 86
 	for i, v := range params {
87 87
 		k := fmt.Sprintf("P%d", i)

+ 1 - 0
http/router/router.go

@@ -17,6 +17,7 @@ func WebInit(g *gin.Engine) {
17 17
 
18 18
 	if global.Config.App.WebClient == 1 {
19 19
 		g.StaticFS("/webclient", http.Dir(global.Config.Gin.ResourcesPath+"/web"))
20
+		g.StaticFS("/webclient2", http.Dir(global.Config.Gin.ResourcesPath+"/web2"))
20 21
 	}
21 22
 	g.StaticFS("/_admin", http.Dir(global.Config.Gin.ResourcesPath+"/admin"))
22 23
 }