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