You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
2 years ago
|
package i18n
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"net/http"
|
||
|
)
|
||
|
|
||
|
type HttpKeyConfig struct {
|
||
|
ParamKey string `json:",optional,default=lang"` // 参数中的语言Key
|
||
|
HeaderKey string `json:",optional,default=X-LANG"` // Header中的语言Key
|
||
|
}
|
||
|
|
||
|
var (
|
||
|
paramKey = "lang"
|
||
|
headerKey = "X-LANG"
|
||
|
)
|
||
|
|
||
|
// WithHttpConfig 基于配置文件设置Keys
|
||
|
func WithHttpConfig(config HttpKeyConfig) {
|
||
|
WithHttpParamKey(config.ParamKey)
|
||
|
WithHttpHeaderKey(config.HeaderKey)
|
||
|
}
|
||
|
|
||
|
// WithHttpParamKey 设置参数key
|
||
|
func WithHttpParamKey(key string) {
|
||
|
paramKey = key
|
||
|
}
|
||
|
|
||
|
// WithHttpHeaderKey 设置头Key
|
||
|
func WithHttpHeaderKey(key string) {
|
||
|
headerKey = key
|
||
|
}
|
||
|
|
||
|
// WithRequest 包装 http.Request, 接受客户端传递的lang并存入其 context 中
|
||
|
func WithRequest(r *http.Request) *http.Request {
|
||
|
paramLang := r.FormValue(paramKey)
|
||
|
headerLang := r.Header.Get(headerKey)
|
||
|
|
||
|
acceptLanguage := r.Header.Get(KeyAcceptLanguage)
|
||
|
ConfigLanguages(acceptLanguage, paramLang, headerLang)
|
||
|
|
||
|
// 参数中的lang优先级大于header中
|
||
|
lang := headerLang
|
||
|
if len(paramLang) != 0 {
|
||
|
lang = paramLang
|
||
|
}
|
||
|
|
||
|
ctx := r.Context()
|
||
|
if len(lang) > 0 {
|
||
|
ctx = context.WithValue(ctx, KeyLang, lang)
|
||
|
}
|
||
|
return r.WithContext(ctx)
|
||
|
}
|
||
|
|
||
|
// WithI18nMiddleware i18n中间件
|
||
|
func WithI18nMiddleware() func(next http.HandlerFunc) http.HandlerFunc {
|
||
|
return func(next http.HandlerFunc) http.HandlerFunc {
|
||
|
return func(writer http.ResponseWriter, request *http.Request) {
|
||
|
req := WithRequest(request)
|
||
|
next.ServeHTTP(writer, req)
|
||
|
}
|
||
|
}
|
||
|
}
|