2017年6月23日 星期五

Golang : Simple i18n

利用 golang 的 map 機制來建立一個 i18n 的模式。

1. 建立結構化的 map 
從語言地區來看, map 的結構是:

  • Region (Variable)
    • en-US (Map)
      • video_game (Map)
        • Video Game (String)
      • tv_game (Map)
        • TV Game (String)
    • zh-TW
      • video_game (Map)
        • 遊戲 (String)
      • tv_game (Map)
        • 電視遊戲 (String)
因此可以直接在全域變數宣告:

var locales map[string]map[string]string //[region]map( [language/child]map(key(string), string) )

然後,在 main 主程式中建立 map 的值:

locales = make(map[string]map[string]string, 2) //two languages

接著只要對應語言的 map 和內容的 map ,就可以了。

2. translate 翻譯程式
翻譯程式只要判斷是否有值在 map 裡面,沒有就會傳 "" 空字串。
func translate(region string, key string) string {
 if country, ok := locales[region]; ok {
  if value, ok := country[key]; ok {
   return value
  }
 }

 return ""
}

if 的使用中, ok 會回傳 value 的指定狀態,如果沒有值就會是 false, 所以 if 區塊主要是看在分號後面,最後的一個 boolean 變數。

程式碼:
package main

import "fmt"

var locales map[string]map[string]string //[region]map( [language/child]map(key(string), string) )

func main() {
 locales = make(map[string]map[string]string, 2) //two languages

 en := make(map[string]string, 10) // [region]map()// 10 pharse
 en["video_game"] = "Video Game"
 en["tv_game"] = "TV Game"

 locales["en"] = en //[region] map("en") = [language] map(...)

 zh := make(map[string]string, 10) // [region]map()
 zh["video_game"] = "遊戲"
 zh["tv_game"] = "電視遊戲"

 locales["zh"] = zh

 var selectlang string = "zh"
 fmt.Println(translate(selectlang, "video_game"))
}

func translate(region string, key string) string {
 if country, ok := locales[region]; ok {
  if value, ok := country[key]; ok {
   return value
  }
 }

 return ""
}

沒有留言:

張貼留言

© Mac Taylor, 歡迎自由轉貼。
Background Email Pattern by Toby Elliott
Since 2014