10.2 本地化资源

    文本信息是编写Web应用中最常用到的,也是本地化资源中最多的信息,想要以适合本地语言的方式来显示文本信息,可行的一种方案是:建立需要的语言相应的map来维护一个key-value的关系,在输出之前按需从适合的map中去获取相应的文本,如下是一个简单的示例:

    上面示例演示了不同locale的文本翻译,实现了中文和英文对于同一个key显示不同语言的实现,上面实现了中文的文本消息,如果想切换到英文版本,只需要把lang设置为en即可。

    有些时候仅是key-value替换是不能满足需要的,例如”I am 30 years old”,中文表达是”我今年30岁了”,而此处的30是一个变量,该怎么办呢?这个时候,我们可以结合函数来实现,请看下面的代码:

    1. en["how old"] ="I am %d years old"
    2. cn["how old"] ="我今年%d岁了"
    3. fmt.Printf(msg(lang, "how old"), 30)

    本地化日期和时间

    因为时区的关系,同一时刻,在不同的地区,表示是不一样的,而且因为Locale的关系,时间格式也不尽相同,例如中文环境下可能显示:2012年10月24日 星期三 23时11分13秒 CST,而在英文环境下可能显示:Wed Oct 24 23:11:13 CST 2012。这里面我们需要解决两点:

    1. 时区问题
    2. 格式问题

    $GOROOT/lib/time包中的timeinfo.zip含有locale对应的时区的定义,为了获得对应于当前locale的时间,我们应首先使用time.LoadLocation(name string)获取相应于地区的locale,比如Asia/ShanghaiAmerica/Chicago对应的时区信息,然后再利用此信息与调用time.Now获得的Time对象协作来获得最终的时间。详细的请看下面的例子(该例子采用上面例子的一些变量):

    我们可以通过类似处理文本格式的方式来解决时间格式的问题,举例如下:

    1. en["date_format"]="%Y-%m-%d %H:%M:%S"
    2. cn["date_format"]="%Y年%m月%d日 %H时%M分%S秒"
    3. fmt.Println(date(msg(lang,"date_format"),t))
    4. func date(fomate string,t time.Time) string{
    5. year, month, day = t.Date()
    6. hour, min, sec = t.Clock()
    7. //解析相应的%Y %m %d %H %M %S然后返回信息
    8. //%Y 替换成2012
    9. //%m 替换成10
    10. //%d 替换成24
    11. }

    本地化视图和资源

    我们可能会根据Locale的不同来展示视图,这些视图包含不同的图片、css、js等各种静态资源。那么应如何来处理这些信息呢?首先我们应按locale来组织文件信息,请看下面的文件目录安排:

    1. views
    2. |--en //英文模板
    3. |--images //存储图片信息
    4. |--js //存储JS文件
    5. login.tpl //登陆首页
    6. |--zh-CN //中文模板
    7. |--images
    8. |--js
    9. |--css
    10. index.tpl
    11. login.tpl

    有了这个目录结构后我们就可以在渲染的地方这样来实现代码:

    而对于里面的index.tpl里面的资源设置如下:

    1. // js文件
    2. <script type="text/javascript" src="views/{{.VV.Lang}}/js/jquery/jquery-1.8.0.min.js"></script>
    3. // css文件
    4. <link href="views/{{.VV.Lang}}/css/bootstrap-responsive.min.css" rel="stylesheet">
    5. // 图片文件
    6. <img src="views/{{.VV.Lang}}/images/btn.png">

    本小节介绍了如何使用及存储本地资源,有时需要通过转换函数来实现,有时通过lang来设置,但是最终都是通过key-value的方式来存储Locale对应的数据,在需要时取出相应于Locale的信息后,如果是文本信息就直接输出,如果是时间日期或者货币,则需要先通过或其他格式化函数来处理,而对于不同Locale的视图和资源则是最简单的,只要在路径里面增加lang就可以实现了。