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