refactor: support i18n
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
package i18nx
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"golang.org/x/text/language"
|
||||
)
|
||||
|
||||
const (
|
||||
LocaleZhCN = "zh-CN"
|
||||
LocaleEnUS = "en-US"
|
||||
)
|
||||
|
||||
var supportedLocales = map[string]string{
|
||||
"zh": LocaleZhCN,
|
||||
"zh-cn": LocaleZhCN,
|
||||
"zh_cn": LocaleZhCN,
|
||||
"zh-hans": LocaleZhCN,
|
||||
"en": LocaleEnUS,
|
||||
"en-us": LocaleEnUS,
|
||||
"en_us": LocaleEnUS,
|
||||
}
|
||||
|
||||
func NormalizeLocale(value string) string {
|
||||
key := strings.ToLower(strings.TrimSpace(value))
|
||||
if key == "" {
|
||||
return LocaleZhCN
|
||||
}
|
||||
if locale, ok := supportedLocales[key]; ok {
|
||||
return locale
|
||||
}
|
||||
return LocaleZhCN
|
||||
}
|
||||
|
||||
func ResolveRequestLocale(req *http.Request) string {
|
||||
if req == nil {
|
||||
return LocaleZhCN
|
||||
}
|
||||
if locale := normalizeSupportedLocale(req.Header.Get("X-Locale")); locale != "" {
|
||||
return locale
|
||||
}
|
||||
if locale := resolveAcceptLanguage(req.Header.Get("Accept-Language")); locale != "" {
|
||||
return locale
|
||||
}
|
||||
if locale := normalizeSupportedLocale(req.URL.Query().Get("locale")); locale != "" {
|
||||
return locale
|
||||
}
|
||||
return LocaleZhCN
|
||||
}
|
||||
|
||||
func Middleware() gin.HandlerFunc {
|
||||
return func(ctx *gin.Context) {
|
||||
SetLocale(ctx, ResolveRequestLocale(ctx.Request))
|
||||
ctx.Next()
|
||||
}
|
||||
}
|
||||
|
||||
func normalizeSupportedLocale(value string) string {
|
||||
key := strings.ToLower(strings.TrimSpace(value))
|
||||
if key == "" {
|
||||
return ""
|
||||
}
|
||||
if locale, ok := supportedLocales[key]; ok {
|
||||
return locale
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func resolveAcceptLanguage(value string) string {
|
||||
tags, _, err := language.ParseAcceptLanguage(value)
|
||||
if err != nil {
|
||||
return ""
|
||||
}
|
||||
for _, tag := range tags {
|
||||
if locale := normalizeSupportedLocale(tag.String()); locale != "" {
|
||||
return locale
|
||||
}
|
||||
base, _ := tag.Base()
|
||||
if locale := normalizeSupportedLocale(base.String()); locale != "" {
|
||||
return locale
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
Reference in New Issue
Block a user