From 6f42ad94c1ba13f6ad3f9db748d014521291a8e9 Mon Sep 17 00:00:00 2001 From: astaxie Date: Mon, 22 Oct 2012 17:57:17 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B0=8F=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 10.1.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/10.1.md b/10.1.md index 0969f306..e54c6b0d 100644 --- a/10.1.md +++ b/10.1.md @@ -7,9 +7,43 @@ GO语言默认是"UTF-8"字符集,所以我们这一章实现的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地址