Format and remove 10.2.md spaces
This commit is contained in:
142
zh/10.2.md
142
zh/10.2.md
@@ -6,35 +6,35 @@
|
||||
|
||||
```Go
|
||||
|
||||
package main
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
import "fmt"
|
||||
|
||||
var locales map[string]map[string]string
|
||||
var locales map[string]map[string]string
|
||||
|
||||
func main() {
|
||||
locales = make(map[string]map[string]string, 2)
|
||||
en := make(map[string]string, 10)
|
||||
en["pea"] = "pea"
|
||||
en["bean"] = "bean"
|
||||
locales["en"] = en
|
||||
cn := make(map[string]string, 10)
|
||||
cn["pea"] = "豌豆"
|
||||
cn["bean"] = "毛豆"
|
||||
locales["zh-CN"] = cn
|
||||
lang := "zh-CN"
|
||||
fmt.Println(msg(lang, "pea"))
|
||||
fmt.Println(msg(lang, "bean"))
|
||||
}
|
||||
func main() {
|
||||
locales = make(map[string]map[string]string, 2)
|
||||
en := make(map[string]string, 10)
|
||||
en["pea"] = "pea"
|
||||
en["bean"] = "bean"
|
||||
locales["en"] = en
|
||||
cn := make(map[string]string, 10)
|
||||
cn["pea"] = "豌豆"
|
||||
cn["bean"] = "毛豆"
|
||||
locales["zh-CN"] = cn
|
||||
lang := "zh-CN"
|
||||
fmt.Println(msg(lang, "pea"))
|
||||
fmt.Println(msg(lang, "bean"))
|
||||
}
|
||||
|
||||
func msg(locale, key string) string {
|
||||
if v, ok := locales[locale]; ok {
|
||||
if v2, ok := v[key]; ok {
|
||||
return v2
|
||||
}
|
||||
func msg(locale, key string) string {
|
||||
if v, ok := locales[locale]; ok {
|
||||
if v2, ok := v[key]; ok {
|
||||
return v2
|
||||
}
|
||||
return ""
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
```
|
||||
上面示例演示了不同locale的文本翻译,实现了中文和英文对于同一个key显示不同语言的实现,上面实现了中文的文本消息,如果想切换到英文版本,只需要把lang设置为en即可。
|
||||
@@ -42,10 +42,10 @@
|
||||
有些时候仅是key-value替换是不能满足需要的,例如"I am 30 years old",中文表达是"我今年30岁了",而此处的30是一个变量,该怎么办呢?这个时候,我们可以结合`fmt.Printf`函数来实现,请看下面的代码:
|
||||
```Go
|
||||
|
||||
en["how old"] ="I am %d years old"
|
||||
cn["how old"] ="我今年%d岁了"
|
||||
en["how old"] ="I am %d years old"
|
||||
cn["how old"] ="我今年%d岁了"
|
||||
|
||||
fmt.Printf(msg(lang, "how old"), 30)
|
||||
fmt.Printf(msg(lang, "how old"), 30)
|
||||
```
|
||||
上面的示例代码仅用以演示内部的实现方案,而实际数据是存储在JSON里面的,所以我们可以通过`json.Unmarshal`来为相应的map填充数据。
|
||||
|
||||
@@ -59,82 +59,82 @@ $GOROOT/lib/time包中的timeinfo.zip含有locale对应的时区的定义,为
|
||||
|
||||
```Go
|
||||
|
||||
en["time_zone"]="America/Chicago"
|
||||
cn["time_zone"]="Asia/Shanghai"
|
||||
en["time_zone"]="America/Chicago"
|
||||
cn["time_zone"]="Asia/Shanghai"
|
||||
|
||||
loc,_:=time.LoadLocation(msg(lang,"time_zone"))
|
||||
t:=time.Now()
|
||||
t = t.In(loc)
|
||||
fmt.Println(t.Format(time.RFC3339))
|
||||
loc,_:=time.LoadLocation(msg(lang,"time_zone"))
|
||||
t:=time.Now()
|
||||
t = t.In(loc)
|
||||
fmt.Println(t.Format(time.RFC3339))
|
||||
|
||||
```
|
||||
我们可以通过类似处理文本格式的方式来解决时间格式的问题,举例如下:
|
||||
```Go
|
||||
|
||||
en["date_format"]="%Y-%m-%d %H:%M:%S"
|
||||
cn["date_format"]="%Y年%m月%d日 %H时%M分%S秒"
|
||||
en["date_format"]="%Y-%m-%d %H:%M:%S"
|
||||
cn["date_format"]="%Y年%m月%d日 %H时%M分%S秒"
|
||||
|
||||
fmt.Println(date(msg(lang,"date_format"),t))
|
||||
fmt.Println(date(msg(lang,"date_format"),t))
|
||||
|
||||
func date(fomate string,t time.Time) string{
|
||||
year, month, day = t.Date()
|
||||
hour, min, sec = t.Clock()
|
||||
//解析相应的%Y %m %d %H %M %S然后返回信息
|
||||
//%Y 替换成2012
|
||||
//%m 替换成10
|
||||
//%d 替换成24
|
||||
}
|
||||
func date(fomate string,t time.Time) string{
|
||||
year, month, day = t.Date()
|
||||
hour, min, sec = t.Clock()
|
||||
//解析相应的%Y %m %d %H %M %S然后返回信息
|
||||
//%Y 替换成2012
|
||||
//%m 替换成10
|
||||
//%d 替换成24
|
||||
}
|
||||
|
||||
```
|
||||
## 本地化货币值
|
||||
各个地区的货币表示也不一样,处理方式也与日期差不多,细节请看下面代码:
|
||||
```Go
|
||||
|
||||
en["money"] ="USD %d"
|
||||
cn["money"] ="¥%d元"
|
||||
en["money"] ="USD %d"
|
||||
cn["money"] ="¥%d元"
|
||||
|
||||
fmt.Println(date(msg(lang,"date_format"),100))
|
||||
fmt.Println(date(msg(lang,"date_format"),100))
|
||||
|
||||
func money_format(fomate string,money int64) string{
|
||||
return fmt.Sprintf(fomate,money)
|
||||
}
|
||||
func money_format(fomate string,money int64) string{
|
||||
return fmt.Sprintf(fomate,money)
|
||||
}
|
||||
|
||||
```
|
||||
## 本地化视图和资源
|
||||
我们可能会根据Locale的不同来展示视图,这些视图包含不同的图片、css、js等各种静态资源。那么应如何来处理这些信息呢?首先我们应按locale来组织文件信息,请看下面的文件目录安排:
|
||||
```html
|
||||
|
||||
views
|
||||
|--en //英文模板
|
||||
|--images //存储图片信息
|
||||
|--js //存储JS文件
|
||||
|--css //存储css文件
|
||||
index.tpl //用户首页
|
||||
login.tpl //登陆首页
|
||||
|--zh-CN //中文模板
|
||||
|--images
|
||||
|--js
|
||||
|--css
|
||||
index.tpl
|
||||
login.tpl
|
||||
views
|
||||
|--en //英文模板
|
||||
|--images //存储图片信息
|
||||
|--js //存储JS文件
|
||||
|--css //存储css文件
|
||||
index.tpl //用户首页
|
||||
login.tpl //登陆首页
|
||||
|--zh-CN //中文模板
|
||||
|--images
|
||||
|--js
|
||||
|--css
|
||||
index.tpl
|
||||
login.tpl
|
||||
|
||||
```
|
||||
有了这个目录结构后我们就可以在渲染的地方这样来实现代码:
|
||||
```Go
|
||||
|
||||
s1, _ := template.ParseFiles("views"+lang+"index.tpl")
|
||||
VV.Lang=lang
|
||||
s1.Execute(os.Stdout, VV)
|
||||
s1, _ := template.ParseFiles("views"+lang+"index.tpl")
|
||||
VV.Lang=lang
|
||||
s1.Execute(os.Stdout, VV)
|
||||
```
|
||||
而对于里面的index.tpl里面的资源设置如下:
|
||||
```html
|
||||
|
||||
// js文件
|
||||
<script type="text/javascript" src="views/{{.VV.Lang}}/js/jquery/jquery-1.8.0.min.js"></script>
|
||||
// css文件
|
||||
<link href="views/{{.VV.Lang}}/css/bootstrap-responsive.min.css" rel="stylesheet">
|
||||
// 图片文件
|
||||
<img src="views/{{.VV.Lang}}/images/btn.png">
|
||||
// js文件
|
||||
<script type="text/javascript" src="views/{{.VV.Lang}}/js/jquery/jquery-1.8.0.min.js"></script>
|
||||
// css文件
|
||||
<link href="views/{{.VV.Lang}}/css/bootstrap-responsive.min.css" rel="stylesheet">
|
||||
// 图片文件
|
||||
<img src="views/{{.VV.Lang}}/images/btn.png">
|
||||
```
|
||||
采用这种方式来本地化视图以及资源时,我们就可以很容易的进行扩展了。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user