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 }