github.com/wgh-/mattermost-server@v4.8.0-rc2+incompatible/utils/i18n.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package utils 5 6 import ( 7 "fmt" 8 "io/ioutil" 9 "net/http" 10 "path/filepath" 11 "strings" 12 13 l4g "github.com/alecthomas/log4go" 14 "github.com/mattermost/mattermost-server/model" 15 "github.com/nicksnyder/go-i18n/i18n" 16 ) 17 18 var T i18n.TranslateFunc 19 var TDefault i18n.TranslateFunc 20 var locales map[string]string = make(map[string]string) 21 var settings model.LocalizationSettings 22 23 // this functions loads translations from filesystem 24 // and assign english while loading server config 25 func TranslationsPreInit() error { 26 if err := InitTranslationsWithDir("i18n"); err != nil { 27 return err 28 } 29 30 T = TfuncWithFallback("en") 31 TDefault = TfuncWithFallback("en") 32 33 return nil 34 } 35 36 func InitTranslations(localizationSettings model.LocalizationSettings) error { 37 settings = localizationSettings 38 39 var err error 40 T, err = GetTranslationsBySystemLocale() 41 return err 42 } 43 44 func InitTranslationsWithDir(dir string) error { 45 i18nDirectory, found := FindDir(dir) 46 if !found { 47 return fmt.Errorf("Unable to find i18n directory") 48 } 49 50 files, _ := ioutil.ReadDir(i18nDirectory) 51 for _, f := range files { 52 if filepath.Ext(f.Name()) == ".json" { 53 filename := f.Name() 54 locales[strings.Split(filename, ".")[0]] = i18nDirectory + filename 55 56 if err := i18n.LoadTranslationFile(i18nDirectory + filename); err != nil { 57 return err 58 } 59 } 60 } 61 62 return nil 63 } 64 65 func GetTranslationsBySystemLocale() (i18n.TranslateFunc, error) { 66 locale := *settings.DefaultServerLocale 67 if _, ok := locales[locale]; !ok { 68 l4g.Error("Failed to load system translations for '%v' attempting to fall back to '%v'", locale, model.DEFAULT_LOCALE) 69 locale = model.DEFAULT_LOCALE 70 } 71 72 if locales[locale] == "" { 73 return nil, fmt.Errorf("Failed to load system translations for '%v'", model.DEFAULT_LOCALE) 74 } 75 76 translations := TfuncWithFallback(locale) 77 if translations == nil { 78 return nil, fmt.Errorf("Failed to load system translations") 79 } 80 81 l4g.Info(translations("utils.i18n.loaded"), locale, locales[locale]) 82 return translations, nil 83 } 84 85 func GetUserTranslations(locale string) i18n.TranslateFunc { 86 if _, ok := locales[locale]; !ok { 87 locale = model.DEFAULT_LOCALE 88 } 89 90 translations := TfuncWithFallback(locale) 91 return translations 92 } 93 94 func SetTranslations(locale string) i18n.TranslateFunc { 95 translations := TfuncWithFallback(locale) 96 return translations 97 } 98 99 func GetTranslationsAndLocale(w http.ResponseWriter, r *http.Request) (i18n.TranslateFunc, string) { 100 // This is for checking against locales like pt_BR or zn_CN 101 headerLocaleFull := strings.Split(r.Header.Get("Accept-Language"), ",")[0] 102 // This is for checking agains locales like en, es 103 headerLocale := strings.Split(strings.Split(r.Header.Get("Accept-Language"), ",")[0], "-")[0] 104 defaultLocale := *settings.DefaultClientLocale 105 if locales[headerLocaleFull] != "" { 106 translations := TfuncWithFallback(headerLocaleFull) 107 return translations, headerLocaleFull 108 } else if locales[headerLocale] != "" { 109 translations := TfuncWithFallback(headerLocale) 110 return translations, headerLocale 111 } else if locales[defaultLocale] != "" { 112 translations := TfuncWithFallback(defaultLocale) 113 return translations, headerLocale 114 } 115 116 translations := TfuncWithFallback(model.DEFAULT_LOCALE) 117 return translations, model.DEFAULT_LOCALE 118 } 119 120 func GetSupportedLocales() map[string]string { 121 return locales 122 } 123 124 func TfuncWithFallback(pref string) i18n.TranslateFunc { 125 t, _ := i18n.Tfunc(pref) 126 return func(translationID string, args ...interface{}) string { 127 if translated := t(translationID, args...); translated != translationID { 128 return translated 129 } 130 131 t, _ := i18n.Tfunc(model.DEFAULT_LOCALE) 132 return t(translationID, args...) 133 } 134 }