summaryrefslogtreecommitdiffstats
path: root/utils/i18n.go
diff options
context:
space:
mode:
author=Corey Hulen <corey@hulen.com>2016-01-19 22:00:01 -0600
committer=Corey Hulen <corey@hulen.com>2016-01-19 22:00:01 -0600
commit8e404c1dcf820cf767e9d6899e8c1efc7bb5ca96 (patch)
treeed96e0aff323aaf7a45d38896ea6a929dc320500 /utils/i18n.go
parent36c5c46e24f745ee80b49f47363217fcb740ce53 (diff)
downloadchat-8e404c1dcf820cf767e9d6899e8c1efc7bb5ca96.tar.gz
chat-8e404c1dcf820cf767e9d6899e8c1efc7bb5ca96.tar.bz2
chat-8e404c1dcf820cf767e9d6899e8c1efc7bb5ca96.zip
PLT-7 Adding translation function to context
Diffstat (limited to 'utils/i18n.go')
-rw-r--r--utils/i18n.go140
1 files changed, 140 insertions, 0 deletions
diff --git a/utils/i18n.go b/utils/i18n.go
new file mode 100644
index 000000000..4fc8c725a
--- /dev/null
+++ b/utils/i18n.go
@@ -0,0 +1,140 @@
+package utils
+
+import (
+ "io/ioutil"
+ "net/http"
+ "path/filepath"
+ "strings"
+
+ l4g "github.com/alecthomas/log4go"
+ "github.com/cloudfoundry/jibber_jabber"
+ "github.com/mattermost/platform/model"
+ "github.com/nicksnyder/go-i18n/i18n"
+)
+
+const (
+ SESSION_LOCALE = "MMLOCALE"
+)
+
+var T i18n.TranslateFunc
+var locales map[string]string = make(map[string]string)
+
+func InitTranslations() {
+ i18nDirectory := FindDir("i18n")
+ files, _ := ioutil.ReadDir(i18nDirectory)
+ for _, f := range files {
+ if filepath.Ext(f.Name()) == ".json" {
+ filename := f.Name()
+ locales[strings.Split(filename, ".")[0]] = i18nDirectory + filename
+ i18n.MustLoadTranslationFile(i18nDirectory + filename)
+ }
+ }
+
+ T = GetTranslationsBySystemLocale()
+}
+
+func GetTranslationsBySystemLocale() i18n.TranslateFunc {
+ locale := model.DEFAULT_LOCALE
+ if userLanguage, err := jibber_jabber.DetectLanguage(); err == nil {
+ locale = userLanguage
+ }
+
+ if locales[locale] == "" {
+ l4g.Error("Failed to load system translations for '%v' attempting to fall back to '%v'", locale, model.DEFAULT_LOCALE)
+
+ if locales[model.DEFAULT_LOCALE] == "" {
+ panic("Failed to load system translations for '" + model.DEFAULT_LOCALE + "'")
+ }
+ }
+
+ translations, _ := i18n.Tfunc(locale)
+ if translations == nil {
+ panic("Failed to load system translations")
+ }
+
+ l4g.Info(translations("utils.i18n.loaded"), locale, locales[locale])
+ return translations
+}
+
+func SetTranslations(locale string) i18n.TranslateFunc {
+ translations, _ := i18n.Tfunc(locale)
+ return translations
+}
+
+func GetTranslations(w http.ResponseWriter, r *http.Request) i18n.TranslateFunc {
+ translations, _ := getTranslationsAndLocale(w, r)
+ return translations
+}
+
+func GetTranslationsAndLocale(w http.ResponseWriter, r *http.Request) (i18n.TranslateFunc, string) {
+ return getTranslationsAndLocale(w, r)
+}
+
+func SetLocaleCookie(w http.ResponseWriter, lang string, sessionCacheInMinutes int) {
+ maxAge := (sessionCacheInMinutes * 60)
+ cookie := &http.Cookie{
+ Name: SESSION_LOCALE,
+ Value: lang,
+ Path: "/",
+ MaxAge: maxAge,
+ }
+
+ http.SetCookie(w, cookie)
+}
+
+// var keyRegexp = regexp.MustCompile(`:[[:word:]]+`)
+// func MaybeExpandNamedText(text string, args ...interface{}) string {
+// var (
+// arg = args[0]
+// argval = reflect.ValueOf(arg)
+// )
+// if argval.Kind() == reflect.Ptr {
+// argval = argval.Elem()
+// }
+
+// if argval.Kind() == reflect.Map && argval.Type().Key().Kind() == reflect.String {
+// return expandNamedText(text, func(key string) reflect.Value {
+// return argval.MapIndex(reflect.ValueOf(key))
+// })
+// }
+// if argval.Kind() != reflect.Struct {
+// return text
+// }
+
+// return expandNamedText(text, argval.FieldByName)
+// }
+
+// func expandNamedText(text string, keyGetter func(key string) reflect.Value) string {
+// return keyRegexp.ReplaceAllStringFunc(text, func(key string) string {
+// val := keyGetter(key[1:])
+// if !val.IsValid() {
+// return key
+// }
+// newVar, _ := val.Interface().(string)
+// return newVar
+// })
+// }
+
+func getTranslationsAndLocale(w http.ResponseWriter, r *http.Request) (i18n.TranslateFunc, string) {
+ var translations i18n.TranslateFunc
+ var _ error
+ localeCookie := ""
+ if cookie, err := r.Cookie(SESSION_LOCALE); err == nil {
+ localeCookie = cookie.Value
+ if locales[localeCookie] != "" {
+ translations, _ = i18n.Tfunc(localeCookie)
+ return translations, localeCookie
+ }
+ }
+
+ localeCookie = strings.Split(strings.Split(r.Header.Get("Accept-Language"), ",")[0], "-")[0]
+ if locales[localeCookie] != "" {
+ translations, _ = i18n.Tfunc(localeCookie)
+ SetLocaleCookie(w, localeCookie, 10)
+ return translations, localeCookie
+ }
+
+ translations, _ = i18n.Tfunc(model.DEFAULT_LOCALE)
+ SetLocaleCookie(w, model.DEFAULT_LOCALE, 10)
+ return translations, model.DEFAULT_LOCALE
+}