Go Code
This way to call a function from a Go template can be used for many purposes. This is only one tiny example how it works. It may be possible to calculate values etc.
1. Tell the templates to use the function "lang"
translations = make(map[string]*gotext.Po)
languages := []string{"en", "fr", "de", "es", "it"}
for _, lang := range languages {
path := "./public/locale/" + lang + ".po"
lang_po := gotext.NewPo()
lang_po.ParseFile(path)
translations[lang] = lang_po
}
tpl = template.Must(template.New("").Funcs(template.FuncMap{
"trans": trans,
}).ParseGlob("./public/tmpl/*/*.html"))
tpl = template.Must(tpl.New("").Funcs(template.FuncMap{
"trans": trans,
}).ParseGlob("./public/tmpl/*/*/*.html"))
2. Create the function "trans"
func trans(key string) string {
path := "./public/locale/" + usr_lang + ".po"
po, ok := translations[usr_lang]
if !ok {
po = gotext.NewPo()
po.ParseFile(path)
translations[usr_lang] = po
}
return po.Get(key)
}
3. All Go code put together and fetch the stored language from a cookie
package main
import (
"bytes"
"encoding/json"
"fmt"
"html/template"
"net/http"
"strings"
"github.com/leonelquinteros/gotext"
)
var tpl *template.Template
var translations map[string]*gotext.Po
var usr_lang string
func init() {
translations = make(map[string]*gotext.Po)
languages := []string{"en", "fr", "de", "es", "it"}
for _, lang := range languages {
path := "./public/locale/" + lang + ".po"
lang_po := gotext.NewPo()
lang_po.ParseFile(path)
translations[lang] = lang_po
}
//level 1 folders
tpl = template.Must(template.New("").Funcs(template.FuncMap{
"trans": trans,
}).ParseGlob("./public/tmpl/*/*.html"))
//level 2 folders
tpl = template.Must(tpl.New("").Funcs(template.FuncMap{
"trans": trans,
}).ParseGlob("./public/tmpl/*/*/*.html"))
http.Handle("/img/", http.StripPrefix("/img/", http.FileServer(http.Dir("./public/img"))))
http.Handle("/css/", http.StripPrefix("/css/", http.FileServer(http.Dir("./public/css"))))
http.Handle("/icn/", http.StripPrefix("/icn/", http.FileServer(http.Dir("./public/icn"))))
http.Handle("/js/", http.StripPrefix("/js/", http.FileServer(http.Dir("./public/js"))))
http.Handle("/misc/", http.StripPrefix("/misc/", http.FileServer(http.Dir("./public/misc"))))
}
func main() {
http.HandleFunc("/", endpoint)
http.ListenAndServe(":9098", nil)
}
//template function
func trans(key string) string {
path := "./public/locale/" + usr_lang + ".po"
po, ok := translations[usr_lang]
if !ok {
po = gotext.NewPo()
po.ParseFile(path)
translations[usr_lang] = po
}
return po.Get(key)
}
func endpoint(w http.ResponseWriter, r *http.Request) {
module, mode, val := getpath(r.URL.Path)
usr_getlang(r)
var page string
switch module {
case "robots.txt":
http.ServeFile(w, r, "public/misc/robots.txt")
case "sitemap.xml":
http.ServeFile(w, r, "public/misc/sitemap.xml")
case "favicon.ico", "favicon-32x32.png", "favicon-16x16.png":
return
case "":
module = "home"
}
page = module + ".html"
set_header(w)
tpl.ExecuteTemplate(w, page, nil)
}
func set_header(w http.ResponseWriter) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Methods", "*")
}
// split url
func getpath(path string) (module, mode, val string) {
parts := strings.Split(path, "/")
switch len(parts) {
case 4:
val = parts[3]
fallthrough
case 3:
mode = parts[2]
fallthrough
case 2:
module = parts[1]
}
return // Named return values are used, so just return here
}
func usr_getlang(r *http.Request) string {
lang, _ := r.Cookie("lang")
if lang != nil {
usr_lang = lang.Value
} else {
usr_lang = "en"
}
return usr_lang
}