開發網頁應用程式一定要考慮到支援多國語言,因為我們不會知道來存取我們網站的使用者是從哪邊來的,因此納入國際化的設計是必須的,例如從台灣人存取網頁我們就顯示繁體中文,中國人就顯示簡體中文、美國人就顯示英文等等,今天就讓我們來聊聊要如何使用 golang 實現國際化吧!
i18n 就是 internationalization 的縮小,也就是國際化的意思,其中的 i 跟 n 就是取頭尾的字母,那中間的 18 代表著 internationalization 總共有 18 個字母,所以就取名叫做 i18n 拉~
golang 的 lauguage package 有定義各種語言的名稱,詳細可以參考 這裡
gogo-i18ngogo-i18nSource 位置:https://github.com/codingXiang/gogo-i18ngogo-i18n 是小弟我封裝了 nicksnyder 大大的 go-i18n連結所做的國際化 package,主要的目的在於提供簡單的語法讓大家可以更容易的設定
透過 go get 的方式進行 package 安裝
go get -u github.com/codingXiang/gogo-i18n
i18n 的翻譯文件在開始開發以前,我們先設定好要翻譯的文件,這邊可以使用 yaml 格式來定義,就讓我們開始吧
在根目錄建立一個 i18n 的資料夾,在其底下再建立一個名為 yaml 的資料夾,因為我們要使用的是 yaml 格式的翻譯文件,所以資料夾的名稱才會是 yaml,目前目錄結構如下
/
/i18n
/yaml
接著讓我們在 ./i18n/yaml 底下建立翻譯文件,先建立繁體中文與英文的翻譯檔,檔名叫做 zh-Hant.yaml 與 en.yamal,檔案名稱是遵循 html5 的 language tag 設定,詳細可以參考這邊
//zh-Hant.yaml
- welcome:
other: 歡迎 {{ .username }}!
//en.yaml
- welcome:
other: welcome {{ .username}}!
從上面的設定檔可以看出,在設定相同的詞彙有要使用相同的 key,翻譯的內容就放在 other 之後,other 的 value 裡面可以定義變數,就將變數設定於 {{}} 中間並以 . 開頭即可
目前的檔案目錄如下
/
/i18n
/yaml
zh-Hant.yaml
en.yaml
設定好翻譯的文件之後,就可以開始開發了
首先我們先透過 import 匯入
import (
. "github.com/codingXiang/gogo-i18n"
"golang.org/x/text/language"
)
GoGoi18n 物件package 有提供 NewGoGoi18n 的方法可以建立物件,其中要傳入預設的語言,也就是當使用者的預設語系沒有在我們的設定內的時候會顯示的語言,以下範例使用繁體中文
GGi18n = NewGoGoi18n(language.TraditionalChinese)
之後我們透過 SetFileType 方法設定翻譯檔的類型,這邊設定為 yaml(對應上方)
GGi18n.SetFileType("yaml")
透過 LoadTranslationFile 來讀取檔案路徑與語言別,這邊設定檔案路徑為 ./i18n,語言我們讀取 繁體中文 與 英文 兩種
GGi18n.LoadTranslationFile("./i18n",
language.TraditionalChinese,
language.English)
透過 GetMessage 就可以輕鬆的取得翻譯後的字串,第一個參數為 key 值,第二個參數為設定翻譯文件時的變數,這邊使用 map 的方式傳入
msg := GGi18n.GetMessage("welcome", map[string]interface{}{
"username": "阿翔",
})
透過 fmt 輸出結果測試
fmt.Println(msg)
如果大家想要更換預設語言的話,可以透過 SetUseLanguage 方法進行更換,以下將預設語言更換為 英文,之後重新進行翻譯
GGi18n.SetUseLanguage(language.English)
msg = GGi18n.GetMessage("welcome", map[string]interface{}{
"username": "阿翔",
})
fmt.Println(msg)
整理以上的程式如下
package main
import (
"fmt"
. "github.com/codingXiang/gogo-i18n"
"golang.org/x/text/language"
)
func main() {
GGi18n = NewGoGoi18n(language.TraditionalChinese)
GGi18n.SetFileType("yaml")
GGi18n.LoadTranslationFile("./i18n",
language.TraditionalChinese,
language.English)
msg := GGi18n.GetMessage("welcome", map[string]interface{}{
"username": "阿翔",
})
fmt.Println(msg)
GGi18n.SetUseLanguage(language.English)
msg = GGi18n.GetMessage("welcome", map[string]interface{}{
"username": "阿翔",
})
fmt.Println(msg)
}
執行完畢後,結果如下就代表成功的實現國際化拉
歡迎 阿翔!
Welcome 阿翔!
當初封裝這個 package 是為了讓自己的開發更快速,希望有幫助到大家!
如果大家對於程式有什麼建議歡迎發 PR 給我哦!