你如何优雅的解决i18n问题
由于Go的常驻进程模式,在写web服务的时候,不能搞个全局的locale对象每次请求的时候替换。
我能想到的方案列一下,抛砖引玉。
- 修改框架的context
// 比如gin框架
package main
import (
"github.com/gin-gonic/gin"
"log"
)
type locale struct {.....}
type Ctx struct {
*gin.Context
Locale locale
}
func main() {
app := gin.New()
app.GET("/", wrapFunc(func(ctx *Ctx) {
ctx.Writer.Write([]byte("hello"))
}))
log.Fatal(app.Run(":8000"))
}
func wrapFunc(f func(myCtx *Ctx)) func(ctx *gin.Context) {
return func(ctx *gin.Context) {
tempLocale := locale{}
tempLocale.Load("header里取accept-language")
myCtx := &Ctx{
Context: ctx,
Locale: tempLocale,
}
f(myCtx)
}
}
这样可以在控制器里调用ctx.Locale.T("翻译内容")
来获取输出结果。对于用户设置的场景比如登录后的要根据用户自己的设置(如果有设计这种功能的话)显示内容,如法炮制如果用户登录取用户的配置语言包等。
- 定义util方法
单独写个 locale
方法,如func Locale(language, content string)
需要的地方调用util.Locale("zh-cn", "翻译内容")
。