go web本地化资源
本地化文本消息
本信息是編寫Web應(yīng)用中最常用到的,也是本地化資源中最多的信息,想要以適合本地語言的方式來顯示文本信息,可行的一種方案是:建立需要的語言相應(yīng)的map來維護一個key-value的關(guān)系,在輸出之前按需從適合的map中去獲取相應(yīng)的文本,如下是一個簡單的示例:
package mainimport "fmt"var locales map[string]map[string]stringfunc main() {locales = make(map[string]map[string]string, 2)en := make(map[string]string, 10)en["pea"] = "pea"en["bean"] = "bean"locales["en"] = encn := make(map[string]string, 10)cn["pea"] = "豌豆"cn["bean"] = "毛豆"locales["zh-CN"] = cnlang := "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}}return "" }上面示例演示了不同locale的文本翻譯,實現(xiàn)了中文和英文對于同一個key顯示不同語言的實現(xiàn),上面實現(xiàn)了中文的文本消息,如果想切換到英文版本,只需要把lang設(shè)置為en即可。
有些時候僅是key-value替換是不能滿足需要的,例如"I am 30 years old",中文表達是"我今年30歲了",而此處的30是一個變量,該怎么辦呢?這個時候,我們可以結(jié)合fmt.Printf函數(shù)來實現(xiàn),請看下面的代碼:
en["how old"] ="I am %d years old" cn["how old"] ="我今年%d歲了"fmt.Printf(msg(lang, "how old"), 30)上面的示例代碼僅用以演示內(nèi)部的實現(xiàn)方案,而實際數(shù)據(jù)是存儲在JSON里面的,所以我們可以通過json.Unmarshal來為相應(yīng)的map填充數(shù)據(jù)。
本地化日期和時間
因為時區(qū)的關(guān)系,同一時刻,在不同的地區(qū),表示是不一樣的,而且因為Locale的關(guān)系,時間格式也不盡相同,例如中文環(huán)境下可能顯示:2012年10月24日 星期三 23時11分13秒 CST,而在英文環(huán)境下可能顯示:Wed Oct 24 23:11:13 CST 2012。這里面我們需要解決兩點:
$GOROOT/lib/time包中的timeinfo.zip含有l(wèi)ocale對應(yīng)的時區(qū)的定義,為了獲得對應(yīng)于當前l(fā)ocale的時間,我們應(yīng)首先使用time.LoadLocation(name string)獲取相應(yīng)于地區(qū)的locale,比如Asia/Shanghai或America/Chicago對應(yīng)的時區(qū)信息,然后再利用此信息與調(diào)用time.Now獲得的Time對象協(xié)作來獲得最終的時間。詳細的請看下面的例子(該例子采用上面例子的一些變量):
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))我們可以通過類似處理文本格式的方式來解決時間格式的問題,舉例如下:
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))func date(fomate string,t time.Time) string{year, month, day = t.Date()hour, min, sec = t.Clock()//解析相應(yīng)的%Y %m %d %H %M %S然后返回信息//%Y 替換成2012//%m 替換成10//%d 替換成24 }本地化貨幣值
各個地區(qū)的貨幣表示也不一樣,處理方式也與日期差不多,細節(jié)請看下面代碼:
en["money"] ="USD %d" cn["money"] ="¥%d元"fmt.Println(date(msg(lang,"date_format"),100))func money_format(fomate string,money int64) string{return fmt.Sprintf(fomate,money) }本地化視圖和資源
我們可能會根據(jù)Locale的不同來展示視圖,這些視圖包含不同的圖片、css、js等各種靜態(tài)資源。那么應(yīng)如何來處理這些信息呢?首先我們應(yīng)按locale來組織文件信息,請看下面的文件目錄安排:
views |--en //英文模板|--images //存儲圖片信息|--js //存儲JS文件|--css //存儲css文件index.tpl //用戶首頁login.tpl //登陸首頁 |--zh-CN //中文模板|--images|--js|--cssindex.tpllogin.tpl有了這個目錄結(jié)構(gòu)后我們就可以在渲染的地方這樣來實現(xiàn)代碼:
s1, _ := template.ParseFiles("views"+lang+"index.tpl") VV.Lang=lang s1.Execute(os.Stdout, VV)而對于里面的index.tpl里面的資源設(shè)置如下:
// 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">采用這種方式來本地化視圖以及資源時,我們就可以很容易的進行擴展了。
總結(jié)
以上是生活随笔為你收集整理的go web本地化资源的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang设置默认地区
- 下一篇: golang国际化站点