review 第十章内容

This commit is contained in:
xiemengjun
2012-10-30 21:36:46 +08:00
parent 64d34185fa
commit f6b42217c9
2 changed files with 18 additions and 17 deletions

24
10.2.md
View File

@@ -1,7 +1,7 @@
# 10.2 本地化资源
前面小节我们介绍了如何设置Locale设置好Locale之后我们需要解决的问题就是如何存储相应的Locale对应的信息呢这里面的信息包括文本信息、时间和日期、货币值、图片、包含文件以及视图等资源。那么接下来我们讲对这些信息一一进行介绍Go语言中我们把这些格式信息存储在JSON中然后通过合适的方式展现出来。(接下来以中文和英文两种语言对比举例,存储格式文件en.json和zh-CN.json)
## 本地化文本消息
本信息是我们编写Web应用中最用到的,也是本地化资源中最多的信息,想要以适合本地语言显示文本信息,那么就需要建立相应的map来维护一个key-value的关系打印消息之前从map中去获取相应的字符串例如下面这个例如一个包含英文和中文的食品名称的简单的map以及一个从该map中抽取单词的函数。
本信息是编写Web应用中最用到的,也是本地化资源中最多的信息,想要以适合本地语言的方式来显示文本信息,可行的一种方案是:建立需要的语言相应的map来维护一个key-value的关系输出之前按需从适合的map中去获取相应的文本如下是一个简单的示例
package main
@@ -34,24 +34,24 @@
}
上面实现了简单的不同locale的文本翻译实现了中文和英文对于同一个key显示不同语言,上面实现了中文语言的文本消息如果想切换到英文版本只需要把lang设置en即可。
上面示例演示了不同locale的文本翻译实现了中文和英文对于同一个key显示不同语言的实现上面实现了中文的文本消息如果想切换到英文版本只需要把lang设置en即可。
但是有些时候并不是简单的key-value就能实现所有的文本翻译的,例如"I am 30 years old",中文表达是"我今年30岁了",而这个30是一个变量这个时候我们可以结合`fmt.Printf`函数来实现,请看下面的代码:
有些时候仅是key-value替换是不能满足需要的,例如"I am 30 years old",中文表达是"我今年30岁了",而此处的30是一个变量该怎么办呢?这个时候我们可以结合`fmt.Printf`函数来实现,请看下面的代码:
en["how old"] ="I am %d years old"
cn["how old"] ="我今年%d岁了"
fmt.Printf(msg(lang, "how old"), 30)
上面的示例代码主要是为了演示我们内部实现的思路,其实最后数据是存储在JSON里面的map我们可以通过`json.Unmarshal`获取对应的数据。
上面的示例代码仅用以演示内部实现方案,而实际数据是存储在JSON里面的所以我们可以通过`json.Unmarshal`来为相应的map填充数据。
## 本地化日期和时间
时间和日期对于不同的地区会显示不同的时间点,而且相应的显示时间格式也是不同的,例如中文环境下可能显示:`2012年10月24日 星期三 23时11分13秒 CST`,而在英文环境下可能显示:`Wed Oct 24 23:11:13 CST 2012`。这里面我们需要解决两点:
因为时区的关系同一时刻在不同的地区表示是不一样的而且因为Locale的关系时间格式也不尽相同,例如中文环境下可能显示:`2012年10月24日 星期三 23时11分13秒 CST`,而在英文环境下可能显示:`Wed Oct 24 23:11:13 CST 2012`。这里面我们需要解决两点:
1. 时区问题
2. 格式问题
时区问题我们可以通过`time.Now`返回当前locale的时间但是我们可以通过`time.LoadLocation(name string)`获取相应地区的时区,如果中文地区,那么`name=Asia/Shanghai`,如果在美国那么可以设置`name=America/Chicago`,你可以在`$GOROOT/lib/time`包中找到time.zip里面有每个地区的时区定义。详细的请看下面的例子:
$GOROOT/lib/time包中的timeinfo.zip含有locale对应的时区的定义为了获得对应于当前locale的时间我们应首先使用`time.LoadLocation(name string)`获取相应地区的locale比如`Asia/Shanghai``America/Chicago`对应的时区信息,然后再利用此信息与调用`time.Now`获得的Time对象协作来获得最终的时间。详细的请看下面的例子(该例子采用上面例子的一些变量):
en["time_zone"]="America/Chicago"
cn["time_zone"]="Asia/Shanghai"
@@ -61,7 +61,7 @@
t = t.In(loc)
fmt.Println(t.Format(time.RFC3339))
格式问题我们可以通过类似上面文本信息的方式解决这个问题,就如上面刚开始显示的时间格式一样,中文和英文的显示信息完全不同,那我们就可以通过如下方式来实现
我们可以通过类似处理文本格式的方式解决时间格式的问题,举例如下:
en["date_format"]="%Y-%m-%d %H:%M:%S"
cn["date_format"]="%Y年%m月%d日 %H时%M分%S秒"
@@ -78,7 +78,7 @@
}
## 本地化货币值
各个地区的货币表示也不一样,我们想要根据不同的Locale显示不同的货币金额需要实现如上时间格式的处理函数详细的实现请看下面代码:
各个地区的货币表示也不一样,处理方式也与日期差不多,细节请看下面代码:
en["money"] ="USD %d"
cn["money"] ="¥%d元"
@@ -91,7 +91,7 @@
## 本地化视图和资源
我们在展现不同Locale的时候可能会根据不同的Locale采用不同的视图,这些视图里面包含不同的图片、css、js等各种静态资源。那么我们如何来处理这些信息呢?首先我们需要组织对应的locale文件信息请看下面的文件目录安排
我们可能会根据Locale的不同来展示视图这些视图包含不同的图片、css、js等各种静态资源。那么如何来处理这些信息呢?首先我们应按locale来组织文件信息,请看下面的文件目录安排:
views
|--en //英文模板
@@ -107,7 +107,7 @@
index.tpl
login.tpl
有了这个文件安排之后我们就可以在渲染的地方这样来实现代码
有了这个目录结构后我们就可以在渲染的地方这样来实现代码
s1, _ := template.ParseFiles("views"+lang+"index.tpl")
@@ -123,10 +123,10 @@
//图片文件
<img src="views/{{.VV.Lang}}/images/btn.png">
这样我们在本地化视图以及资源的时候采用这种方式就可以很容易的进行扩展了。
采用这种方式来本地化视图以及资源时,我们就可以很容易的进行扩展了。
## 总结
本小节介绍了如何使用存储本地资源,本地资源有些需要通过转换函数,有通过lang设置但是最都是通过key-value的方式存储了相应的Locale对应数据然后通过转换函数通过key读取出相应Locale信息如果是文本信息就直接输出,如果是时间日期或者货币需要结合`fmt.Printf`函数处理才能转换成正确的信息展示而对于不同Locale的视图和资源是最简单的只要在路径里面增加lang就可以实现了。
本小节介绍了如何使用存储本地资源,有时需要通过转换函数来实现,有通过lang设置,但是最都是通过key-value的方式存储Locale对应数据,在需要时取出相应Locale信息,如果是文本信息就直接输出,如果是时间日期或者货币,则需要先通过`fmt.Printf`或其他格式化函数处理而对于不同Locale的视图和资源是最简单的只要在路径里面增加lang就可以实现了。
## links
* [目录](<preface.md>)