i18n为Internationalization的缩许,取概要和结尾文字,算一下字母数字18,组合就是一下i18n,这是一个约定俗成的叫法。 ,取概要和总结,字母算一下字母数18,组合一下就是i18n,这是一个约定俗成的叫法。在其他语言中,做国际化的相关包一般也会以这个名字命名。
国际化最重要的一点就是locale 地区资讯,Locale可由一个语言编碥(Language code)与可选的区域编码(Country code)来指定,其中语言编码是 ISO-639 定义,由两个小写字母代表,例如"ca"表示嘉泰罗尼亚文(Catalan),"zh"表示中文(Chinese)。区域编码则由两个大写字母表示,定义 在ISO-3166, 例如IT表示义大利(Italy)、TW表示台湾(Taiwan)。
123.com.tw
的tw就是来自台湾为了使开发的软件能够国际化,需要做各种语言的适配,但不可能对不同的语言进行不同的页面特性开发。因此我们需要对文字的部分进行处理,常见的方法就是,建立不同的语言的文件,他们记录了一些词在不同语言下的翻译,通过关键词来完成对应。当要使用的时候,通过调用不同语言文件里的索引就可以引用出来。
我这里用的是 https://github.com/gogf/gf 底下的i18n包
go get -u [github.com/gogf/gf](https://github.com/gogf/gf)
安装过後,在根目录建立一个i18n的文件夹,并新建两个不同语言的文件。
en.toml
Response_Success="Success"
Response_Failed="Failed"
zh.toml
Response_Success="成功"
Response_Failed="失败"
接下来我们将gi18n.New()
与相关code放进POST /v1/users
API试试
/app/controller/user.go
// CreateUser @Summary
// @Tags user
// @version 1.0
// @produce application/json
// @param language header string true "language"
// @param register body Register true "register"
// @Success 200 string successful return value
// @Router /v1/users [post]
func (u UsersController) CreateUser(c *gin.Context) {
t := gi18n.New()
var form Register
bindErr := c.BindJSON(&form)
lan := c.Request.Header.Get("language")
if lan == "" {
lan = "en"
}
t.SetLanguage(lan)
if bindErr == nil {
err := service.RegisterOneUser(form.Account, form.Password, form.Email)
if err == nil {
c.JSON(http.StatusOK, gin.H{
"status": 1,
"msg": t.Translate(c, "Response_Success"),
"data": nil,
})
} else {
c.JSON(http.StatusInternalServerError, gin.H{
"status": -1,
"msg": "Register Failed" + err.Error(),
"data": nil,
})
}
} else {
c.JSON(http.StatusBadRequest, gin.H{
"status": -1,
"msg": "Failed to parse register data" + bindErr.Error(),
"data": nil,
})
}
}
gi18n会去跟目录底下找寻i18n
资料夹,之後我们就可以透过t.SetLanguage()
的function去找寻相关的语系并带入其中的变数。
当参数为zh时,结果就是
{
"data": null,
"msg": "成功",
"status": 1
}
当参数为en时,结果就是
{
"data": null,
"msg": "Success",
"status": 1
}
虽说大部分的网站都是将i18n做在前端,但还是会有後端的API直接开放给外界使用的时候,所以i18n相关技术还是必须了解一下!
相关程序码依样会放在下方连结提供参考
https://github.com/Neskem/Ironman-2021/tree/Day-23
开门见山 是code import picamera camera = picamera.PiCam...
JAVA - JAVA Log4j 专门用於 Java 语言的日志记录工具 参考资料 参考资料1:L...
UseRef useRef 会回传一个 mutable 的 ref object,.current ...
今天聊一下时事 - 虚拟硬碟档案消失 聊时事 ...
真的很感谢 ITHOME 的团队,办这次的比赛,我也没有想到第一次打铁人文就报双主题,而且都挑战成功...