你如何优雅的解决i18n问题

由于Go的常驻进程模式,在写web服务的时候,不能搞个全局的locale对象每次请求的时候替换。

我能想到的方案列一下,抛砖引玉。

  1. 修改框架的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("翻译内容")来获取输出结果。对于用户设置的场景比如登录后的要根据用户自己的设置(如果有设计这种功能的话)显示内容,如法炮制如果用户登录取用户的配置语言包等。

  1. 定义util方法

单独写个 locale方法,如func Locale(language, content string)需要的地方调用util.Locale("zh-cn", "翻译内容")

讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!