Day23 Gin with i18n

What is i18n?

i18nInternationalization的缩许,取概要和结尾文字,算一下字母数字18,组合就是一下i18n,这是一个约定俗成的叫法。 ,取概要和总结,字母算一下字母数18,组合一下就是i18n,这是一个约定俗成的叫法。在其他语言中,做国际化的相关包一般也会以这个名字命名。

国际化最重要的一点就是locale 地区资讯,Locale可由一个语言编碥(Language code)与可选的区域编码(Country code)来指定,其中语言编码是 ISO-639 定义,由两个小写字母代表,例如"ca"表示嘉泰罗尼亚文(Catalan),"zh"表示中文(Chinese)。区域编码则由两个大写字母表示,定义 在ISO-3166, 例如IT表示义大利(Italy)、TW表示台湾(Taiwan)。

locale判定方式

  1. 根据子网域名的来源判定,像是123.com.tw的tw就是来自台湾
  2. 根据用户IP位置判定
  3. 根据用户在database资讯或是cookies中保存的讯息判定
  4. 根据用户客户端的浏览器设定判定
  5. 根据用户Request中的parameters判定

gogf

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

我这里用的是 https://github.com/gogf/gf 底下的i18n包

go get -u [github.com/gogf/gf](https://github.com/gogf/gf)

Gin with gogf

Step1

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

en.toml

Response_Success="Success"
Response_Failed="Failed"

zh.toml

Response_Success="成功"
Response_Failed="失败"

Step2

接下来我们将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
}

Summary

虽说大部分的网站都是将i18n做在前端,但还是会有後端的API直接开放给外界使用的时候,所以i18n相关技术还是必须了解一下!

相关程序码依样会放在下方连结提供参考

https://github.com/Neskem/Ironman-2021/tree/Day-23


<<:  第23天~又是JSON+ListView

>>:  Vuex实作

Raspberry pi 的影片拍摄- Python

开门见山 是code import picamera camera = picamera.PiCam...

JAVA - JAVA Log4j 专门用於 Java 语言的日志记录工具

JAVA - JAVA Log4j 专门用於 Java 语言的日志记录工具 参考资料 参考资料1:L...

[Day11] [笔记]React Hooks - UseRef

UseRef useRef 会回传一个 mutable 的 ref object,.current ...

时事-虚拟硬碟档案消失

今天聊一下时事 - 虚拟硬碟档案消失 聊时事 ...

Day30 铁人赛後心得

真的很感谢 ITHOME 的团队,办这次的比赛,我也没有想到第一次打铁人文就报双主题,而且都挑战成功...