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