i18n:国际化。 L10N:本地化。
国际化:就是根据特定的locale信息,提取与之相应的字符串或其他一些东西。
1、如何确定locale。2、如何保存与locale相关的字符串或其他信息。3、如何根据Locale提取字符串和其他相应的信息。
什么是Locale@H_301_7@Locale是一组描述世界上某一特定区域文本格式和语言习惯的设置的集合。
Locale通常由三个部分组成:
第一部分是一个强制性的表示语言的缩写。
第二部分是跟在有一个下划线之后,是一个可选的国家说明符,列如en_US表示美国英语,en_UK表示英国英语。
第三部分跟在一个句点之后是可选的字符集说明符,例如”zh_CN.gb2312“表示中国使用gb2312字符集
GO语言默认采用“UTF-8”编码集
$ locale -a
设置Locale通过域名来设置Locale设置Locale的办法之一是在应用运行的时候采用域名分级的方式。
.com表示英文站,.cn表示中文站。
if r.Hsot == "www.asta.com" { i18n.SetLocale("en")} else if r.Host == "www.asta.cn" { i18n.SetLocale("zh-CN")}
从域名参数设置Locale目前最常用的方式是URL里面带上参数,例如www.asta.com/hellow?locale=zh
从客户端设置地区Accept-Language
客户端请求的时候在http头信息里面有Accept-Language。
AL := r.header.Get("Accept-Language")if AL == "en" { i18n.SetLocale("en")} else if AL == "zh-CN" { i18n.SetLocale("zh-CN")}
IP地址另一种根据客户端来设定地区的就是用户访问的IP,根据相应的IP库,就可以得到对应的IP地区。
用户Profile根据用户输入的信息保存到账号相关的profile中。
本地化资源@H_301_7@本地化文本消息建立需要的语言相应的MAP来维护一个key-value的关系,在输出之前按需从适合的map中去获取相应的文本。
本地化日期和时间1、时区问题。2、格式问题。
en["time_zone"]="America/Chicago"cn["time_zone"]="Asia/Shanghai"loc,_:=time.LoadLocation(msg(lang,"time_zone"))t:=time.Now()t = t.In(loc)fmt.Println(t.Format(time.RFC3339))
本地化货币值en["money"] ="USD %d"cn["money"] ="¥%d元"fmt.Println(money_format(msg(lang,"date_format"),100))func money_format(fomate string,money int64) string{ return fmt.Sprintf(fomate,money)}
国际化站点@H_301_7@使用一个国际化相关的包——go-i18n,首先我们向go-i18n包注册config/locales这个目录,以加载所有的Locale文件。
Tr := i18n.NewLocale()Tr.Loadpath("config/locales")
fmt.Println(Tr.Translate("submit"))//输出submitTr.SetLocale("zh")fmt.Println(Tr.Translate("submit"))//输出“提交”
自动加载本地包// 加载默认配置文件,这些文件都放在 go-i18n/locales 下面// 文件命名 zh.Json、en.Json、en-US.Json 等,可以不断的扩展支持更多的语言func (il *IL) loadDefaultTranslations(dirPath string) error { dir, err := os.Open(dirPath) if err != nil { return err } defer dir.Close() names, err := dir.Readdirnames(-1) if err != nil { return err } for _, name := range names { fullPath := path.Join(dirPath, name) fi, err := os.Stat(fullPath) if err != nil { return err } if fi.IsDir() { if err := il.loadTranslations(fullPath); err != nil { return err } } else if locale := il.matchingLocaleFromfilename(name); locale != "" { file, err := os.Open(fullPath) if err != nil { return err } defer file.Close() if err := il.loadTranslation(file, locale); err != nil { return err } } } return nil}
获取对应的信息:
// locale=zh 的情况下,执行如下代码:fmt.Println(Tr.Time(time.Now()))// 输出:2009 年 1 月 08 日 星期四 20:37:58 CSTfmt.Println(Tr.Time(time.Now(),"long"))// 输出:2009 年 1 月 08 日fmt.Println(Tr.Money(11.11))// 输出: ¥11.11
template mapfunc1、文本信息。文本信息调用Tr.Translate来实现相应的信息转换
func I18nT(args ...interface{}) string { ok := false var s string if len(args) == 1 { s, ok = args[0].(string) } if !ok { s = fmt.Sprint(args...) } return Tr.Translate(s)}
注册函数:
t.Funcs(template.FuncMap{"T": I18nT})
模板中使用如下:
{{.V.submit | T}}
2、时间日期
func I18nTimeDate(args ...interface{}) string { ok := false var s string if len(args) == 1 { s, ok = args[0].(string) } if !ok { s = fmt.Sprint(args...) } return Tr.Time(s)}
注册函数:
t.Funcs(template.FuncMap{"TD": I18nTimeDate})
模板中使用:
{{.V.Now | TD}}
3、货币信息
func I18nMoney(args ...interface{}) string { ok := false var s string if len(args) == 1 { s, ok = args[0].(string) } if !ok { s = fmt.Sprint(args...) } return Tr.Money(s)}
注册函数:
t.Funcs(template.FuncMap{"M": I18nMoney})
模板中使用:
{{.V.Money | M}}
总结 以上是内存溢出为你收集整理的Go Web编程(十——国际化与本地化)全部内容,希望文章能够帮你解决Go Web编程(十——国际化与本地化)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)