##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后面带参数的方式,请看下面的介绍。 ###从域名参数设置地区 ###从客户端设置地区 - Accept-Language - IP地址 - 用户profile ## links * [目录]() * 上一节: [国际化和本地化](<10.md>) * 下一节: [本地化资源](<10.2.md>) ## LastModified * $Id$