github.com/xenophex/i18n4go@v0.2.7-0.20160907212557-40256cda157a/i18n/init.go (about)

     1  package i18n
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"strings"
    10  
    11  	"code.cloudfoundry.org/cli/cf/resources"
    12  
    13  	"github.com/pivotal-cf-experimental/jibber_jabber"
    14  
    15  	go_i18n "github.com/nicksnyder/go-i18n/i18n"
    16  )
    17  
    18  const (
    19  	DEFAULT_LOCALE   = "en-us"
    20  	DEFAULT_LANGUAGE = "en"
    21  )
    22  
    23  var SUPPORTED_LOCALES = map[string]string{
    24  	"de": "de-de",
    25  	"en": "en-us",
    26  	"es": "es-es",
    27  	"fr": "fr-fr",
    28  	"it": "it-it",
    29  	"ja": "ja-ja",
    30  	"ko": "ko-ko",
    31  	"pt": "pt-br",
    32  	"ru": "ru-ru",
    33  	"zh": "zh-cn",
    34  }
    35  var RESOUCES_PATH = filepath.Join("cf", "i18n", "resources")
    36  
    37  func GetResourcesPath() string {
    38  	return RESOUCES_PATH
    39  }
    40  
    41  func Init(packageName string, i18nDirname string) go_i18n.TranslateFunc {
    42  	userLocale, err := initWithUserLocale(packageName, i18nDirname)
    43  	if err != nil {
    44  		userLocale = mustLoadDefaultLocale(packageName, i18nDirname)
    45  	}
    46  
    47  	T, err := go_i18n.Tfunc(userLocale, DEFAULT_LOCALE)
    48  	if err != nil {
    49  		panic(err)
    50  	}
    51  
    52  	return T
    53  }
    54  
    55  func initWithUserLocale(packageName, i18nDirname string) (string, error) {
    56  	userLocale, err := jibber_jabber.DetectIETF()
    57  	if err != nil {
    58  		userLocale = DEFAULT_LOCALE
    59  	}
    60  
    61  	language, err := jibber_jabber.DetectLanguage()
    62  	if err != nil {
    63  		language = DEFAULT_LANGUAGE
    64  	}
    65  
    66  	userLocale = strings.Replace(userLocale, "-", "_", 1)
    67  	err = loadFromAsset(packageName, i18nDirname, userLocale, language)
    68  	if err != nil {
    69  		locale := SUPPORTED_LOCALES[language]
    70  		if locale == "" {
    71  			userLocale = DEFAULT_LOCALE
    72  		} else {
    73  			userLocale = locale
    74  		}
    75  		err = loadFromAsset(packageName, i18nDirname, userLocale, language)
    76  	}
    77  
    78  	return userLocale, err
    79  }
    80  
    81  func mustLoadDefaultLocale(packageName, i18nDirname string) string {
    82  	userLocale := DEFAULT_LOCALE
    83  
    84  	err := loadFromAsset(packageName, i18nDirname, DEFAULT_LOCALE, DEFAULT_LANGUAGE)
    85  	if err != nil {
    86  		panic("Could not load en-us language files. God save the queen. " + err.Error())
    87  	}
    88  
    89  	return userLocale
    90  }
    91  
    92  func loadFromAsset(packageName, assetPath, locale, language string) error {
    93  	assetName := locale + ".all.json"
    94  	assetKey := filepath.Join(assetPath, language, packageName, assetName)
    95  
    96  	byteArray, err := resources.Asset(assetKey)
    97  	if err != nil {
    98  		return err
    99  	}
   100  
   101  	if len(byteArray) == 0 {
   102  		return errors.New(fmt.Sprintf("Could not load i18n asset: %v", assetKey))
   103  	}
   104  
   105  	tmpDir, err := ioutil.TempDir("", "i18n4go_res")
   106  	if err != nil {
   107  		return err
   108  	}
   109  	defer func() {
   110  		os.RemoveAll(tmpDir)
   111  	}()
   112  
   113  	fileName, err := saveLanguageFileToDisk(tmpDir, assetName, byteArray)
   114  	if err != nil {
   115  		return err
   116  	}
   117  
   118  	go_i18n.MustLoadTranslationFile(fileName)
   119  
   120  	os.RemoveAll(fileName)
   121  
   122  	return nil
   123  }
   124  
   125  func saveLanguageFileToDisk(tmpDir, assetName string, byteArray []byte) (fileName string, err error) {
   126  	fileName = filepath.Join(tmpDir, assetName)
   127  	file, err := os.Create(fileName)
   128  	if err != nil {
   129  		return
   130  	}
   131  	defer file.Close()
   132  
   133  	_, err = file.Write(byteArray)
   134  	if err != nil {
   135  		return
   136  	}
   137  
   138  	return
   139  }