i18n 本土化
最后更新于:2022-04-02 02:36:58
[TOC]
> [参考网站](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/10.2.md)
## 设置Locale
### 通过后缀
```
if r.Host == "www.asta.com" {
i18n.SetLocale("en")
} else if r.Host == "www.asta.cn" {
i18n.SetLocale("zh-CN")
} else if r.Host == "www.asta.tw" {
i18n.SetLocale("zh-TW")
}
```
### 通过三级域名
`en.asta.com` 表示英文站点,`cn.asta.com`表示中文
```
prefix := strings.Split(r.Host,".")
if prefix[0] == "en" {
i18n.SetLocale("en")
} else if prefix[0] == "cn" {
i18n.SetLocale("zh-CN")
} else if prefix[0] == "tw" {
i18n.SetLocale("zh-TW")
}
```
### 通过 url参数
方式一
` www.asta.com/hello?locale=zh`
`i18n.SetLocale(params["locale"])`
方式二
`www.asta.com/en/books`
`mux.Get("/:locale/books", listbook)`
### 客户端设置地区
```
AL := r.Header.Get("Accept-Language")
if AL == "en" {
i18n.SetLocale("en")
} else if AL == "zh-CN" {
i18n.SetLocale("zh-CN")
} else if AL == "zh-TW" {
i18n.SetLocale("zh-TW")
}
```
### 通过IP地址
通过 `GeoIP Lite Country` 这个库
### 通过用户设置
通过下拉菜单或者别的什么方式的设置相应的locale
## 本地化资源
```
var locales map[string]map[string]string
func main() {
//====== 设置语言=====//
locales = make(map[string]map[string]string, 2)
en := make(map[string]string, 10)
en["pea"] = "pea"
en["bean"] = "bean"
locales["en"] = en
cn := make(map[string]string, 10)
cn["pea"] = "豌豆"
cn["bean"] = "毛豆"
locales["zh-CN"] = cn
lang := "zh-CN"
fmt.Println(msg(lang, "bean")) //毛豆
//====== 设置语言=====//
//====== 设置地区=======//
en["time_zone"] = "America/Chicago"
cn["time_zone"] = "Asia/Shanghai"
loc, _ := time.LoadLocation(msg(lang, "time_zone"))
//====== 设置地区=======//
//====== 设置时间=======//
t := time.Now()
t = t.In(loc)
en["date_format"] = "%d-%d-%d %d:%d:%d"
cn["date_format"] = "%d年%d月%d日 %d时%d分%d秒"
fmt.Println(date(msg(lang, "date_format"), t)) //2018年8月2日 9时47分36秒
//====== 设置时间=======//
//====== 设置货币=======//
en["money"] = "USD %d"
cn["money"] = "¥%d元"
fmt.Println(money_format(msg(lang, "money"), 100)) //¥100元
//====== 设置货币=======//
}
//格式化 时间
func date(fomate string, t time.Time) string {
year, month, day := t.Date()
hour, min, sec := t.Clock()
return fmt.Sprintf(fomate, year, month, day, hour, min, sec)
}
//格式化money 格式
func money_format(fomate string, money int64) string {
return fmt.Sprintf(fomate, money)
}
//输出语言
func msg(locale, key string) string {
if v, ok := locales[locale]; ok {
if v2, ok := v[key]; ok {
return v2
}
}
return ""
}
```
## 本地化视图和资源
[跳转查看](https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/10.2.md)
';