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)
';