gitee.com/Aodao/i18n4go.git@v0.2.7-0.20160826202043-6224c7d27921/examples/i18n_init/cf_cli_i18n_init.go.template (about)

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