internationalization,取开头和结尾字母,算一下字母数18,组合一下就是i18n,这是一个约定俗称的叫法。在其他语言中,做国际化的相关包一般也会以这个名字命名。GitHub - ExcitingFrog/go-pangu: rest api web server based on go(High availability, high security, high performance)internationalization,取开头和结尾字母,算一下字母数18,组合一下就是i18n,这是一个约定俗称的叫法。在其他语言中,做国际化的相关包一般也会以这个名字命名。

开始

为了使开发的软件能够国际化,需要做各种语言的适配,但是不可能对不同语言进行开发不同的页面或是接口。因此我们需要对文字的部分进行处理,常见的方法就是,建立不同语言的文件,他们记录着一些词语在不同语言下的翻译,通过关键词索引来完成对应。当要使用的时候,通过调用不同语言文件里的索引就可以引用出来。

我这里使用的是

https://github.com/gogf/gf

这个底下的i18n包

安装过后,在根目录建一个i18n的文件夹,新建两个不同语言的文件。

en.toml

City_SuZhou="SuZhou"
City_Peking="Peking"

zh.toml

City_SuZhou="苏州"
City_Peking="北京"

如何使用

我们这里建一个接口来测试,接收前端传来的language参数:en或者zh

这里的handler通过SetLanguage函数设置语言后,来通过Translate函数来调用出关键词所对应的翻译

var cities = []string{
        "City_SuZhou",
        "City_Peking",
}

func CityListHandler(c *gin.Context) {
        t := gi18n.New()
        var list []string
        //绑定数据
        var params map[string]string
        if err := c.ShouldBindJSON(&params); err != nil {
                c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
                return
        }

        language := params["language"]
        t.SetLanguage(language)
        //循环引出所有城市
        for _, city := range cities {
                list = append(list, t.Translate(city))
        }
        c.JSON(http.StatusOK, gin.H{
                "status":      "success",
                "cities_list": list,
        })
}

当参数是 zh 时,结果就是

{
    "cities_list": [
        "苏州",
        "北京"
    ],
    "status": "success"
}

当参数是 en 时,结果就是

{
    "cities_list": [
        "SuZhou",
        "Peking"
    ],
    "status": "success"
}

这是一种在后端实现的方法,不同情况需要具体来看,如果是前端显示的内容,还是在前端使用i18n相关包比较好。当涉及到返回的数据需要不同语言时,还是在后端直接处理好返回给前端。

转自:https://zhuanlan.zhihu.com/p/336401644