iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
0
Modern Web

Go into Web!系列 第 10

Day10 | 讓我們的 Go 更國際化 - i18n 的應用

開發網頁應用程式一定要考慮到支援多國語言,因為我們不會知道來存取我們網站的使用者是從哪邊來的,因此納入國際化的設計是必須的,例如從台灣人存取網頁我們就顯示繁體中文,中國人就顯示簡體中文、美國人就顯示英文等等,今天就讓我們來聊聊要如何使用 golang 實現國際化吧!

常聽到的 i18n 是什麼

i18n 就是 internationalization 的縮小,也就是國際化的意思,其中的 in 就是取頭尾的字母,那中間的 18 代表著 internationalization 總共有 18 個字母,所以就取名叫做 i18n 拉~

語言包

golang 的 lauguage package 有定義各種語言的名稱,詳細可以參考 這裡

使用 gogo-i18n

什麼是 gogo-i18n

Source 位置:https://github.com/codingXiang/gogo-i18n
gogo-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.yamlen.yamal,檔案名稱是遵循 html5language tag 設定,詳細可以參考這邊

//zh-Hant.yaml
- welcome:
    other: 歡迎 {{ .username }}!
//en.yaml
- welcome:
    other: welcome {{ .username}}!

從上面的設定檔可以看出,在設定相同的詞彙有要使用相同的 key,翻譯的內容就放在 other 之後,other 的 value 裡面可以定義變數,就將變數設定於 {{}} 中間並以 . 開頭即可

目前的檔案目錄如下

/
  /i18n
     /yaml
        zh-Hant.yaml
        en.yaml

設定好翻譯的文件之後,就可以開始開發了

匯入相依 package

首先我們先透過 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 給我哦!

參考


上一篇
Day9 | 輕鬆管理程式的設定檔
下一篇
Day11 | 淺談 REST
系列文
Go into Web!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言