在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ GO/ 10.2 本地化資源
7 文本處理
3 Web基礎(chǔ)
14 擴(kuò)展Web框架
10.4 小結(jié)
2.2 Go基礎(chǔ)
2.8 總結(jié)
6.1 session和cookie
5.5 使用beedb庫進(jìn)行ORM開發(fā)
8.3 REST
13.6 小結(jié)
5.4 使用PostgreSQL數(shù)據(jù)庫
14.6 pprof支持
14.1 靜態(tài)文件支持
11.2 使用GDB調(diào)試
7.7 小結(jié)
1 GO環(huán)境配置
14.5 多語言支持
7.1 XML處理
1.5 總結(jié)
13 如何設(shè)計(jì)一個(gè)Web框架
14.3 表單及驗(yàn)證支持
12 部署與維護(hù)
10 國際化和本地化
1.1 Go 安裝
6.2 Go如何使用session
5.6 NOSQL數(shù)據(jù)庫操作
6.5 小結(jié)
9.4 避免SQL注入
12.1 應(yīng)用日志
4.2 驗(yàn)證表單的輸入
10.1 設(shè)置默認(rèn)地區(qū)
1.3 Go 命令
9.6 加密和解密數(shù)據(jù)
4.1 處理表單的輸入
4.4 防止多次遞交表單
11.3 Go怎么寫測試用例
8 Web服務(wù)
12.3 應(yīng)用部署
5.7 小結(jié)
12.5 小結(jié)
11 錯(cuò)誤處理,調(diào)試和測試
9.2 確保輸入過濾
14.2 Session支持
6.4 預(yù)防session劫持
12.4 備份和恢復(fù)
8.1 Socket編程
13.1 項(xiàng)目規(guī)劃
13.4 日志和配置設(shè)計(jì)
7.6 字符串處理
13.2 自定義路由器設(shè)計(jì)
6.3 session存儲
3.4 Go的http包詳解
8.2 WebSocket
10.3 國際化站點(diǎn)
7.5 文件操作
7.4 模板處理
9.1 預(yù)防CSRF攻擊
13.3 controller設(shè)計(jì)
2.6 interface
14.4 用戶認(rèn)證
2.3 流程和函數(shù)
附錄A 參考資料
11.1 錯(cuò)誤處理
9.5 存儲密碼
9.3 避免XSS攻擊
12.2 網(wǎng)站錯(cuò)誤處理
6 session和數(shù)據(jù)存儲
2.4 struct類型
3.3 Go如何使得Web工作
2.5 面向?qū)ο?/span>
3.1 Web工作方式
1.2 GOPATH與工作空間
2.1 你好,Go
9.7 小結(jié)
13.5 實(shí)現(xiàn)博客的增刪改
7.2 JSON處理
10.2 本地化資源
7.3 正則處理
2 Go語言基礎(chǔ)
5.1 database/sql接口
4.5 處理文件上傳
8.5 小結(jié)
4.3 預(yù)防跨站腳本
5.3 使用SQLite數(shù)據(jù)庫
14.7 小結(jié)
3.2 Go搭建一個(gè)Web服務(wù)器
2.7 并發(fā)
5 訪問數(shù)據(jù)庫
4 表單
3.5 小結(jié)
1.4 Go開發(fā)工具
11.4 小結(jié)
9 安全與加密
5.2 使用MySQL數(shù)據(jù)庫
4.6 小結(jié)
8.4 RPC

10.2 本地化資源

前面小節(jié)我們介紹了如何設(shè)置Locale,設(shè)置好Locale之后我們需要解決的問題就是如何存儲相應(yīng)的Locale對應(yīng)的信息呢?這里面的信息包括:文本信息、時(shí)間和日期、貨幣值、圖片、包含文件以及視圖等資源。那么接下來我們將對這些信息一一進(jìn)行介紹,Go語言中我們把這些格式信息存儲在JSON中,然后通過合適的方式展現(xiàn)出來。(接下來以中文和英文兩種語言對比舉例,存儲格式文件en.json和zh-CN.json)

本地化文本消息

本信息是編寫Web應(yīng)用中最常用到的,也是本地化資源中最多的信息,想要以適合本地語言的方式來顯示文本信息,可行的一種方案是:建立需要的語言相應(yīng)的map來維護(hù)一個(gè)key-value的關(guān)系,在輸出之前按需從適合的map中去獲取相應(yīng)的文本,如下是一個(gè)簡單的示例:

package main

import "fmt"

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 msg(locale, key string) string {
    if v, ok := locales[locale]; ok {
        if v2, ok := v[key]; ok {
            return v2
        }
    }
    return ""
}

上面示例演示了不同locale的文本翻譯,實(shí)現(xiàn)了中文和英文對于同一個(gè)key顯示不同語言的實(shí)現(xiàn),上面實(shí)現(xiàn)了中文的文本消息,如果想切換到英文版本,只需要把lang設(shè)置為en即可。

有些時(shí)候僅是key-value替換是不能滿足需要的,例如"I am 30 years old",中文表達(dá)是"我今年30歲了",而此處的30是一個(gè)變量,該怎么辦呢?這個(gè)時(shí)候,我們可以結(jié)合fmt.Printf函數(shù)來實(shí)現(xiàn),請看下面的代碼:

en["how old"] ="I am %d years old"
cn["how old"] ="我今年%d歲了"

fmt.Printf(msg(lang, "how old"), 30)

上面的示例代碼僅用以演示內(nèi)部的實(shí)現(xiàn)方案,而實(shí)際數(shù)據(jù)是存儲在JSON里面的,所以我們可以通過json.Unmarshal來為相應(yīng)的map填充數(shù)據(jù)。

本地化日期和時(shí)間

因?yàn)闀r(shí)區(qū)的關(guān)系,同一時(shí)刻,在不同的地區(qū),表示是不一樣的,而且因?yàn)長ocale的關(guān)系,時(shí)間格式也不盡相同,例如中文環(huán)境下可能顯示:2012年10月24日 星期三 23時(shí)11分13秒 CST,而在英文環(huán)境下可能顯示:Wed Oct 24 23:11:13 CST 2012。這里面我們需要解決兩點(diǎn):

  1. 時(shí)區(qū)問題
  2. 格式問題

$GOROOT/lib/time包中的timeinfo.zip含有l(wèi)ocale對應(yīng)的時(shí)區(qū)的定義,為了獲得對應(yīng)于當(dāng)前l(fā)ocale的時(shí)間,我們應(yīng)首先使用time.LoadLocation(name string)獲取相應(yīng)于地區(qū)的locale,比如Asia/ShanghaiAmerica/Chicago對應(yīng)的時(shí)區(qū)信息,然后再利用此信息與調(diào)用time.Now獲得的Time對象協(xié)作來獲得最終的時(shí)間。詳細(xì)的請看下面的例子(該例子采用上面例子的一些變量):

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))

我們可以通過類似處理文本格式的方式來解決時(shí)間格式的問題,舉例如下:

en["date_format"]="%Y-%m-%d %H:%M:%S"
cn["date_format"]="%Y年%m月%d日 %H時(shí)%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
}

本地化貨幣值

各個(gè)地區(qū)的貨幣表示也不一樣,處理方式也與日期差不多,細(xì)節(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
    |--css
    index.tpl
    login.tpl

有了這個(gè)目錄結(jié)構(gòu)后我們就可以在渲染的地方這樣來實(shí)現(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">

采用這種方式來本地化視圖以及資源時(shí),我們就可以很容易的進(jìn)行擴(kuò)展了。

總結(jié)

本小節(jié)介紹了如何使用及存儲本地資源,有時(shí)需要通過轉(zhuǎn)換函數(shù)來實(shí)現(xiàn),有時(shí)通過lang來設(shè)置,但是最終都是通過key-value的方式來存儲Locale對應(yīng)的數(shù)據(jù),在需要時(shí)取出相應(yīng)于Locale的信息后,如果是文本信息就直接輸出,如果是時(shí)間日期或者貨幣,則需要先通過fmt.Printf或其他格式化函數(shù)來處理,而對于不同Locale的視圖和資源則是最簡單的,只要在路徑里面增加lang就可以實(shí)現(xiàn)了。