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 }