1 Star 0 Fork 0

aspnmy/i18n4go

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
i18n_init.go 3.45 KB
一键复制 编辑 原始数据 按行查看 历史
dr.max 提交于 2015-04-23 08:24 +08:00 . added simple demo1 and translated version
package main
import (
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
"github.com/pivotal-cf-experimental/jibber_jabber"
goi18n "github.com/nicksnyder/go-i18n/i18n"
)
type Detector interface {
DetectIETF() (string, error)
DetectLanguage() (string, error)
}
type JibberJabberDetector struct{}
const (
DEFAULT_LOCALE = "en_US"
DEFAULT_LANGUAGE = "en"
)
var T goi18n.TranslateFunc
var SUPPORTED_LOCALES = map[string]string{
"de": "de_DE",
"en": "en_US",
"es": "es_ES",
"fr": "fr_FR",
"it": "it_IT",
"ja": "ja_JA",
//"ko": "ko_KO", - Will add support for Korean when nicksnyder/go-i18n supports Korean
"pt": "pt_BR",
//"ru": "ru_RU", - Will add support for Russian when nicksnyder/go-i18n supports Russian
"zh": "zh_Hans",
}
var Resources_path = filepath.Join("i18n", "resources")
func init() {
T = Init(&JibberJabberDetector{})
}
func GetResourcesPath() string {
return Resources_path
}
func Init(detector Detector) goi18n.TranslateFunc {
var T goi18n.TranslateFunc
var err error
var userLocale string
userLocale, err = initWithUserLocale(detector)
if err != nil {
userLocale = mustLoadDefaultLocale()
}
T, err = goi18n.Tfunc(userLocale, DEFAULT_LOCALE)
if err != nil {
panic(err)
}
return T
}
func initWithUserLocale(detector Detector) (string, error) {
userLocale, err := detector.DetectIETF()
if err != nil {
userLocale = DEFAULT_LOCALE
}
language, err := detector.DetectLanguage()
if err != nil {
language = DEFAULT_LANGUAGE
}
userLocale = strings.Replace(userLocale, "-", "_", 1)
if strings.HasPrefix(userLocale, "zh_TW") || strings.HasPrefix(userLocale, "zh_HK") {
userLocale = "zh_Hant"
language = "zh"
}
err = loadFromAsset(userLocale)
if err != nil {
locale := SUPPORTED_LOCALES[language]
if locale == "" {
userLocale = DEFAULT_LOCALE
} else {
userLocale = locale
}
err = loadFromAsset(userLocale)
}
return userLocale, err
}
func mustLoadDefaultLocale() string {
userLocale := DEFAULT_LOCALE
err := loadFromAsset(DEFAULT_LOCALE)
if err != nil {
panic("Could not load en_US language files. God save the queen. \n" + err.Error() + "\n\n")
}
return userLocale
}
func loadFromAsset(locale string) error {
assetName := locale + ".all.json"
assetKey := filepath.Join(GetResourcesPath(), assetName)
byteArray, err := Asset(assetKey)
if err != nil {
return err
}
if len(byteArray) == 0 {
return errors.New(fmt.Sprintf("Could not load i18n asset: %v", assetKey))
}
_, err = os.Stat(os.TempDir())
if err != nil {
if !os.IsExist(err) {
return errors.New("Please make sure Temp dir exist - " + os.TempDir())
} else {
return err
}
}
tmpDir, err := ioutil.TempDir("", "cloudfoundry_cli_i18n_res")
if err != nil {
return err
}
defer func() {
os.RemoveAll(tmpDir)
}()
fileName, err := saveLanguageFileToDisk(tmpDir, assetName, byteArray)
if err != nil {
return err
}
goi18n.MustLoadTranslationFile(fileName)
os.RemoveAll(fileName)
return nil
}
func saveLanguageFileToDisk(tmpDir, assetName string, byteArray []byte) (fileName string, err error) {
fileName = filepath.Join(tmpDir, assetName)
file, err := os.Create(fileName)
if err != nil {
return
}
defer file.Close()
_, err = file.Write(byteArray)
if err != nil {
return
}
return
}
func (detector *JibberJabberDetector) DetectIETF() (string, error) {
return jibber_jabber.DetectIETF()
}
func (detector *JibberJabberDetector) DetectLanguage() (string, error) {
return jibber_jabber.DetectLanguage()
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/Aodao/i18n4go.git
git@gitee.com:Aodao/i18n4go.git
Aodao
i18n4go
i18n4go
v0.2.6

搜索帮助