github.com/rakutentech/cli@v6.12.5-0.20151006231303-24468b65536e+incompatible/cf/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  	"github.com/cloudfoundry/cli/cf/configuration/core_config"
    12  	"github.com/cloudfoundry/cli/cf/i18n/detection"
    13  	resources "github.com/cloudfoundry/cli/cf/resources"
    14  	go_i18n "github.com/nicksnyder/go-i18n/i18n"
    15  )
    16  
    17  const (
    18  	DEFAULT_LOCALE   = "en_US"
    19  	DEFAULT_LANGUAGE = "en"
    20  )
    21  
    22  var T go_i18n.TranslateFunc
    23  
    24  var SUPPORTED_LOCALES = map[string]string{
    25  	"de": "de_DE",
    26  	"en": "en_US",
    27  	"es": "es_ES",
    28  	"fr": "fr_FR",
    29  	"it": "it_IT",
    30  	"ja": "ja_JA",
    31  	//"ko": "ko_KO", - Will add support for Korean when nicksnyder/go-i18n supports Korean
    32  	"pt": "pt_BR",
    33  	//"ru": "ru_RU", - Will add support for Russian when nicksnyder/go-i18n supports Russian
    34  	"zh": "zh_Hans",
    35  }
    36  var Resources_path = filepath.Join("cf", "i18n", "resources")
    37  
    38  func GetResourcesPath() string {
    39  	return Resources_path
    40  }
    41  
    42  func Init(config core_config.ReadWriter, detector detection.Detector) go_i18n.TranslateFunc {
    43  	var T go_i18n.TranslateFunc
    44  	var err error
    45  
    46  	locale := config.Locale()
    47  	if locale != "" {
    48  		err = loadFromAsset(locale)
    49  		if err == nil {
    50  			T, err = go_i18n.Tfunc(config.Locale(), DEFAULT_LOCALE)
    51  		}
    52  	} else {
    53  		var userLocale string
    54  		userLocale, err = initWithUserLocale(detector)
    55  		if err != nil {
    56  			userLocale = mustLoadDefaultLocale()
    57  		}
    58  
    59  		T, err = go_i18n.Tfunc(userLocale, DEFAULT_LOCALE)
    60  	}
    61  
    62  	if err != nil {
    63  		panic(err)
    64  	}
    65  
    66  	return T
    67  }
    68  
    69  func initWithUserLocale(detector detection.Detector) (string, error) {
    70  	userLocale, err := detector.DetectIETF()
    71  	if err != nil {
    72  		userLocale = DEFAULT_LOCALE
    73  	}
    74  
    75  	language, err := detector.DetectLanguage()
    76  	if err != nil {
    77  		language = DEFAULT_LANGUAGE
    78  	}
    79  
    80  	userLocale = strings.Replace(userLocale, "-", "_", 1)
    81  	if strings.HasPrefix(userLocale, "zh_TW") || strings.HasPrefix(userLocale, "zh_HK") {
    82  		userLocale = "zh_Hant"
    83  		language = "zh"
    84  	}
    85  
    86  	err = loadFromAsset(userLocale)
    87  	if err != nil {
    88  		locale := SUPPORTED_LOCALES[language]
    89  		if locale == "" {
    90  			userLocale = DEFAULT_LOCALE
    91  		} else {
    92  			userLocale = locale
    93  		}
    94  		err = loadFromAsset(userLocale)
    95  	}
    96  
    97  	return userLocale, err
    98  }
    99  
   100  func mustLoadDefaultLocale() string {
   101  	userLocale := DEFAULT_LOCALE
   102  
   103  	err := loadFromAsset(DEFAULT_LOCALE)
   104  	if err != nil {
   105  		panic("Could not load en_US language files. \n" + err.Error() + "\n\n")
   106  	}
   107  
   108  	return userLocale
   109  }
   110  
   111  func loadFromAsset(locale string) error {
   112  	assetName := locale + ".all.json"
   113  	assetKey := filepath.Join(GetResourcesPath(), assetName)
   114  
   115  	byteArray, err := resources.Asset(assetKey)
   116  	if err != nil {
   117  		return err
   118  	}
   119  
   120  	if len(byteArray) == 0 {
   121  		return errors.New(fmt.Sprintf("Could not load i18n asset: %v", assetKey))
   122  	}
   123  
   124  	_, err = os.Stat(os.TempDir())
   125  	if err != nil {
   126  		if !os.IsExist(err) {
   127  			return errors.New("Please make sure Temp dir exist - " + os.TempDir())
   128  		} else {
   129  			return err
   130  		}
   131  	}
   132  
   133  	tmpDir, err := ioutil.TempDir("", "cloudfoundry_cli_i18n_res")
   134  	if err != nil {
   135  		return err
   136  	}
   137  	defer func() {
   138  		os.RemoveAll(tmpDir)
   139  	}()
   140  
   141  	fileName, err := saveLanguageFileToDisk(tmpDir, assetName, byteArray)
   142  	if err != nil {
   143  		return err
   144  	}
   145  
   146  	go_i18n.MustLoadTranslationFile(fileName)
   147  
   148  	os.RemoveAll(fileName)
   149  
   150  	return nil
   151  }
   152  
   153  func saveLanguageFileToDisk(tmpDir, assetName string, byteArray []byte) (fileName string, err error) {
   154  	fileName = filepath.Join(tmpDir, assetName)
   155  	file, err := os.Create(fileName)
   156  	if err != nil {
   157  		return
   158  	}
   159  	defer file.Close()
   160  
   161  	_, err = file.Write(byteArray)
   162  	if err != nil {
   163  		return
   164  	}
   165  
   166  	return
   167  }