99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Go 本地化資源

2022-05-13 17:08 更新

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

本地化文本消息

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

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)了中文和英文對(duì)于同一個(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),請(qǐng)看下面的代碼:

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ù)是存儲(chǔ)在JSON里面的,所以我們可以通過json.Unmarshal來為相應(yīng)的map填充數(shù)據(jù)。

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

因?yàn)闀r(shí)區(qū)的關(guān)系,同一時(shí)刻,在不同的地區(qū),表示是不一樣的,而且因?yàn)長(zhǎng)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對(duì)應(yīng)的時(shí)區(qū)的定義,為了獲得對(duì)應(yīng)于當(dāng)前l(fā)ocale的時(shí)間,我們應(yīng)首先使用time.LoadLocation(name string)獲取相應(yīng)于地區(qū)的locale,比如Asia/ShanghaiAmerica/Chicago對(duì)應(yīng)的時(shí)區(qū)信息,然后再利用此信息與調(diào)用time.Now獲得的Time對(duì)象協(xié)作來獲得最終的時(shí)間。詳細(xì)的請(qǐng)看下面的例子(該例子采用上面例子的一些變量):

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é)請(qǐng)看下面代碼:

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

本地化視圖和資源

我們可能會(huì)根據(jù)Locale的不同來展示視圖,這些視圖包含不同的圖片、css、js等各種靜態(tài)資源。那么應(yīng)如何來處理這些信息呢?首先我們應(yīng)按locale來組織文件信息,請(qǐng)看下面的文件目錄安排:

views
|--en  //英文模板
    |--images     //存儲(chǔ)圖片信息
    |--js         //存儲(chǔ)JS文件
    |--css        //存儲(chǔ)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)

而對(duì)于里面的index.tpl里面的資源設(shè)置如下:

// js文件
<script type="text/javascript" src="https://atts.w3cschool.cn/attachments/image/cimg/jquery-1.8.0.min.js"></script>
// css文件
<link href="views/{{.VV.Lang}}/css/bootstrap-responsive.min.css" rel="stylesheet">
// 圖片文件
<img src="https://atts.w3cschool.cn/attachments/image/cimg/btn.png">

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

總結(jié)

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

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)