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 }