Files
build-web-application-with-…/10.1.md
2012-10-22 22:58:24 +08:00

85 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
##10.1 设置默认地区
##什么是地区
地区是一组描述世界上某一特定区域文本格式和语言习惯的设置集合。地区名通常由三个部分组成:第一部分,是一个强制性的,表示语言的缩写,例如"en"表示英文或"zh"表示中文。第二部分,跟在一个下划线之后,是一个可选的国家说明符,用于区分将同一种语言的不同国家,例如"en_US"表示美国英语,而"en_UK"表示英国英语。最后一部分,跟在一个句点之后,是一个可选的字符集说明符,例如"zh_CN.gb2312"表示中国实用gb2312字符集。
GO语言默认是"UTF-8"字符集所以我们这一章实现的i18n不考虑地区的第三部分接下来我们都采用地区描述的前面两部分来作为i18n标准的地区名。
>在Linux和Solaris系统中可以通过`locale -a`命令列举所有支持的地区名读者可以看到这些地区名的命名规范。对于BSD等系统没有locale命令但是地区信息存储在/usr/share/locale中。
##设置地区
有了上面对地区的定义,那么我们就需要根据用户的信息(访问信息、个人信息、访问域名等)来设置地区,我们可以通过如下几种方式来设置用户的地区。
###通过域名设置地区
我们设置地区有一个办法就是在应用运行的时候才用域名分级的方式例如我们采用www.asta.com当做我们的英文站(默认站)而把域名www.asta.cn当做中文站点的域名。这样在我们应用里面设置对应的域名和地区的对应关系就可以设置好地区。这样处理有几点好处
- 通过URL就可以很明显的识别
- 用户可以通过域名很直观的知道将访问那种语言的站点
- 在Go程序中实现非常的简单方便通过一个map就可以实现
- 有利于搜索引擎抓取能够提高站点的SEO
我们可以通过下面的代码来实现域名的对应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")
}
通过域名设置地区有如上所示的优点但是我们一般开发Web应用的时候不会采用这种方式因为首先域名成本比较高开发一个就需要一个域名而且往往统一名称的域名不一定能申请的到其次我们不愿意为每个愿意去本地化一个配置而更多的是采用url后面带参数的方式请看下面的介绍。
###从域名参数设置地区
目前最常用的设置地区的方式是在URL里面带上参数例如www.asta.com/hello?locale=zh或者www.asta.com/zh/hello。这样我们就可以设置地区`i18n.SetLocale(params["locale"])`
这种设置地区方式几乎拥有上面通过域名设置地区的优点他采用RESTful的方式这种方式使得我们不需要增加额外的方式来处理他。但是这种方式需要我们在每一个我们的link里面增加相应的参数locale这也许有点复杂而且有时候可能做起来相当的繁琐。不过我们可以写一个通用的函数url让所有的link地址都通过这个函数来生成然后在这个函数里面增加`locale=params["locale"]`参数。
也许我们希望URL地址看上去更加的RESTful一点例如www.asta.com/en/books(英文站点)和www.asta.com/zh/books(中文站点)这种方式的URL更加有利于SEO而且对于用户也比较友好能够通过URL直观的知道访问的站点。那么这样的URL地址可以通过router来获取locale(参考REST小节里面介绍的router插件实现)
mux.Get("/:locale/books", listbook)
###从客户端设置地区
在一些特殊的情况下我们需要根据客户端的信息来设置地区而不是通过URL这些信息可能来自于客户端设置的喜好语言(浏览器中设置)也可能根据用户访问站点时的IP地址也可能根据用户在注册的时候填写的所在地信息。这种方式比较适合Web为基础的应用。
- Accept-Language
客户端请求的时候在HTTP头信息里面有`Accept-Language`一般的客户端都会设置该信息下面是Go语言实现的一个简单的根据`Accept-Language`实现设置地区的代码:
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地址
另一种根据客户端来设定地区就是用户访问的IP我们根据相应的IP库对应访问的IP到地区目前全球比较常用的就是这个库GeoIP Lite Country。这种设置地区的机制非常简单我们只需要根据IP数据库查询用户的IP然后返回国家地区根据返回的结果设置对应的地区。
- 用户profile
当然你也可以在你的Web应用中让用户来设置相应的地区用户根据你提供的下来菜单或者别的选择相应的地区设置Web中保存相应的设置当用户再次登陆的时候把这个设置复写到地区设置中这样就可以保证该用户每次访问都是基于自己先前设置的地区访问。
##总结
通过上面的介绍,设置地区可以有很多种方式,根据应用程序的不同来选择不同的方式设置地区,但是我们最终期望达到的目的就是让用户访问正确的地区语言,让英语用户访问英文站点,让中文用户访问中文站点。
## links
* [目录](<preface.md>)
* 上一节: [国际化和本地化](<10.md>)
* 下一节: [本地化资源](<10.2.md>)
## LastModified
* $Id$