github.com/psyb0t/mattermost-server@v4.6.1-0.20180125161845-5503a1351abf+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  }