6
6
7
7
``` Go
8
8
9
- package main
10
-
11
- import " fmt"
12
-
13
- var locales map [string ]map [string ]string
14
-
15
- func main () {
16
- locales = make (map [string ]map [string ]string , 2 )
17
- en := make (map [string ]string , 10 )
18
- en[" pea" ] = " pea"
19
- en[" bean" ] = " bean"
20
- locales[" en" ] = en
21
- cn := make (map [string ]string , 10 )
22
- cn[" pea" ] = " 豌豆"
23
- cn[" bean" ] = " 毛豆"
24
- locales[" zh-CN" ] = cn
25
- lang := " zh-CN"
26
- fmt.Println (msg (lang, " pea" ))
27
- fmt.Println (msg (lang, " bean" ))
28
- }
29
-
30
- func msg (locale , key string ) string {
31
- if v , ok := locales[locale]; ok {
32
- if v2 , ok := v[key]; ok {
33
- return v2
34
- }
9
+ package main
10
+
11
+ import " fmt"
12
+
13
+ var locales map [string ]map [string ]string
14
+
15
+ func main () {
16
+ locales = make (map [string ]map [string ]string , 2 )
17
+ en := make (map [string ]string , 10 )
18
+ en[" pea" ] = " pea"
19
+ en[" bean" ] = " bean"
20
+ locales[" en" ] = en
21
+ cn := make (map [string ]string , 10 )
22
+ cn[" pea" ] = " 豌豆"
23
+ cn[" bean" ] = " 毛豆"
24
+ locales[" zh-CN" ] = cn
25
+ lang := " zh-CN"
26
+ fmt.Println (msg (lang, " pea" ))
27
+ fmt.Println (msg (lang, " bean" ))
28
+ }
29
+
30
+ func msg (locale , key string ) string {
31
+ if v , ok := locales[locale]; ok {
32
+ if v2 , ok := v[key]; ok {
33
+ return v2
35
34
}
36
- return " "
37
35
}
36
+ return " "
37
+ }
38
38
39
39
```
40
40
上面示例演示了不同locale的文本翻译,实现了中文和英文对于同一个key显示不同语言的实现,上面实现了中文的文本消息,如果想切换到英文版本,只需要把lang设置为en即可。
41
41
42
42
有些时候仅是key-value替换是不能满足需要的,例如"I am 30 years old",中文表达是"我今年30岁了",而此处的30是一个变量,该怎么办呢?这个时候,我们可以结合` fmt.Printf ` 函数来实现,请看下面的代码:
43
43
``` Go
44
44
45
- en[" how old" ] =" I am %d years old"
46
- cn[" how old" ] =" 我今年%d 岁了"
45
+ en[" how old" ] =" I am %d years old"
46
+ cn[" how old" ] =" 我今年%d 岁了"
47
47
48
- fmt.Printf (msg (lang, " how old" ), 30 )
48
+ fmt.Printf (msg (lang, " how old" ), 30 )
49
49
```
50
50
上面的示例代码仅用以演示内部的实现方案,而实际数据是存储在JSON里面的,所以我们可以通过` json.Unmarshal ` 来为相应的map填充数据。
51
51
@@ -59,82 +59,82 @@ $GOROOT/lib/time包中的timeinfo.zip含有locale对应的时区的定义,为
59
59
60
60
``` Go
61
61
62
- en[" time_zone" ]=" America/Chicago"
63
- cn[" time_zone" ]=" Asia/Shanghai"
62
+ en[" time_zone" ]=" America/Chicago"
63
+ cn[" time_zone" ]=" Asia/Shanghai"
64
64
65
- loc,_ := time.LoadLocation (msg (lang," time_zone" ))
66
- t := time.Now ()
67
- t = t.In (loc)
68
- fmt.Println (t.Format (time.RFC3339 ))
65
+ loc,_ := time.LoadLocation (msg (lang," time_zone" ))
66
+ t := time.Now ()
67
+ t = t.In (loc)
68
+ fmt.Println (t.Format (time.RFC3339 ))
69
69
70
70
```
71
71
我们可以通过类似处理文本格式的方式来解决时间格式的问题,举例如下:
72
72
``` Go
73
73
74
- en[" date_format" ]=" %Y -%m -%d %H :%M :%S "
75
- cn[" date_format" ]=" %Y 年%m 月%d 日 %H 时%M 分%S 秒"
74
+ en[" date_format" ]=" %Y -%m -%d %H :%M :%S "
75
+ cn[" date_format" ]=" %Y 年%m 月%d 日 %H 时%M 分%S 秒"
76
76
77
- fmt.Println (date (msg (lang," date_format" ),t))
77
+ fmt.Println (date (msg (lang," date_format" ),t))
78
78
79
- func date (fomate string ,t time .Time ) string {
80
- year, month, day = t.Date ()
81
- hour, min, sec = t.Clock ()
82
- // 解析相应的%Y %m %d %H %M %S然后返回信息
83
- // %Y 替换成2012
84
- // %m 替换成10
85
- // %d 替换成24
86
- }
79
+ func date (fomate string ,t time .Time ) string {
80
+ year, month, day = t.Date ()
81
+ hour, min, sec = t.Clock ()
82
+ // 解析相应的%Y %m %d %H %M %S然后返回信息
83
+ // %Y 替换成2012
84
+ // %m 替换成10
85
+ // %d 替换成24
86
+ }
87
87
88
88
```
89
89
## 本地化货币值
90
90
各个地区的货币表示也不一样,处理方式也与日期差不多,细节请看下面代码:
91
91
``` Go
92
92
93
- en[" money" ] =" USD %d "
94
- cn[" money" ] =" ¥%d 元"
93
+ en[" money" ] =" USD %d "
94
+ cn[" money" ] =" ¥%d 元"
95
95
96
- fmt.Println (date (msg (lang," date_format" ),100 ))
96
+ fmt.Println (date (msg (lang," date_format" ),100 ))
97
97
98
- func money_format (fomate string ,money int64 ) string {
99
- return fmt.Sprintf (fomate,money)
100
- }
98
+ func money_format (fomate string ,money int64 ) string {
99
+ return fmt.Sprintf (fomate,money)
100
+ }
101
101
102
102
```
103
103
## 本地化视图和资源
104
104
我们可能会根据Locale的不同来展示视图,这些视图包含不同的图片、css、js等各种静态资源。那么应如何来处理这些信息呢?首先我们应按locale来组织文件信息,请看下面的文件目录安排:
105
105
``` html
106
106
107
- views
108
- |--en //英文模板
109
- |--images //存储图片信息
110
- |--js //存储JS文件
111
- |--css //存储css文件
112
- index.tpl //用户首页
113
- login.tpl //登陆首页
114
- |--zh-CN //中文模板
115
- |--images
116
- |--js
117
- |--css
118
- index.tpl
119
- login.tpl
107
+ views
108
+ |--en //英文模板
109
+ |--images //存储图片信息
110
+ |--js //存储JS文件
111
+ |--css //存储css文件
112
+ index.tpl //用户首页
113
+ login.tpl //登陆首页
114
+ |--zh-CN //中文模板
115
+ |--images
116
+ |--js
117
+ |--css
118
+ index.tpl
119
+ login.tpl
120
120
121
121
```
122
122
有了这个目录结构后我们就可以在渲染的地方这样来实现代码:
123
123
``` Go
124
124
125
- s1 , _ := template.ParseFiles (" views" +lang+" index.tpl" )
126
- VV .Lang =lang
127
- s1.Execute (os.Stdout , VV )
125
+ s1 , _ := template.ParseFiles (" views" +lang+" index.tpl" )
126
+ VV.Lang =lang
127
+ s1.Execute (os.Stdout , VV )
128
128
```
129
129
而对于里面的index.tpl里面的资源设置如下:
130
130
``` html
131
131
132
- // js文件
133
- <script type =" text/javascript" src =" views/{{.VV.Lang}}/js/jquery/jquery-1.8.0.min.js" ></script >
134
- // css文件
135
- <link href =" views/{{.VV.Lang}}/css/bootstrap-responsive.min.css" rel =" stylesheet" >
136
- // 图片文件
137
- <img src =" views/{{.VV.Lang}}/images/btn.png" >
132
+ // js文件
133
+ <script type =" text/javascript" src =" views/{{.VV.Lang}}/js/jquery/jquery-1.8.0.min.js" ></script >
134
+ // css文件
135
+ <link href =" views/{{.VV.Lang}}/css/bootstrap-responsive.min.css" rel =" stylesheet" >
136
+ // 图片文件
137
+ <img src =" views/{{.VV.Lang}}/images/btn.png" >
138
138
```
139
139
采用这种方式来本地化视图以及资源时,我们就可以很容易的进行扩展了。
140
140
0 commit comments