From 8e404c1dcf820cf767e9d6899e8c1efc7bb5ca96 Mon Sep 17 00:00:00 2001 From: =Corey Hulen Date: Tue, 19 Jan 2016 22:00:01 -0600 Subject: PLT-7 Adding translation function to context --- utils/i18n.go | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 utils/i18n.go (limited to 'utils/i18n.go') 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 +} -- cgit v1.2.3-1-g7c22