i18n.go 2.3 KB
Newer Older
Q
qinyening 已提交
1 2 3 4
package i18n

import (
	"encoding/json"
Q
qinyening 已提交
5
	"fmt"
Q
qinyening 已提交
6
	"io"
Q
qinyening 已提交
7
	"path"
Y
yubo 已提交
8
	"strings"
Q
qinyening 已提交
9 10 11 12 13

	"golang.org/x/text/language"
	"golang.org/x/text/message"

	"github.com/toolkits/pkg/file"
Q
qinyening 已提交
14
	"github.com/toolkits/pkg/runner"
Q
qinyening 已提交
15 16
)

Q
qinyening 已提交
17
type Config struct {
Q
qinyening 已提交
18
	Lang     string `yaml:"lang"`
Y
yubo 已提交
19
	DictPath string `yaml:"dictPath"`
Q
qinyening 已提交
20 21
}

Q
qinyening 已提交
22 23
var p *message.Printer
var defaultConfig Config
Y
yubo 已提交
24

Q
qinyening 已提交
25
// Init will init i18n support via input language.
Q
qinyening 已提交
26 27 28 29
func Init(configs ...Config) {
	defaultConfig.Lang = "zh"
	defaultConfig.DictPath = path.Join(runner.Cwd, "etc", "i18n.json")

Y
yubo 已提交
30 31 32 33
	config := defaultConfig
	if len(configs) > 0 {
		config = configs[0]
	}
Q
qinyening 已提交
34

Q
qinyening 已提交
35 36 37 38 39 40
	if config.Lang == "" {
		config.Lang = defaultConfig.Lang
	}

	if config.DictPath == "" {
		config.DictPath = defaultConfig.DictPath
Q
qinyening 已提交
41 42
	}

Y
yubo 已提交
43 44
	DictFileRegister(config.DictPath)
	p = message.NewPrinter(langTag(config.Lang))
Q
qinyening 已提交
45 46
}

Q
qinyening 已提交
47 48
func DictFileRegister(filePath string) {
	if !file.IsExist(filePath) {
U
hehe...  
UlricQin 已提交
49
		// fmt.Printf("i18n config file %s not found. donot worry, we'll use default configuration\n", filePath)
Q
qinyening 已提交
50 51
		return
	}
Q
qinyening 已提交
52

Q
qinyening 已提交
53 54 55 56 57
	content, err := file.ToTrimString(filePath)
	if err != nil {
		fmt.Printf("read i18n config file %s fail: %s\n", filePath, err)
		return
	}
Q
qinyening 已提交
58

Q
qinyening 已提交
59 60 61 62 63
	m := make(map[string]map[string]string)
	err = json.Unmarshal([]byte(content), &m)
	if err != nil {
		fmt.Printf("parse i18n config file %s fail: %s\n", filePath, err)
		return
Y
yubo 已提交
64
	}
Q
qinyening 已提交
65 66

	DictRegister(m)
Q
qinyening 已提交
67 68
}

Y
yubo 已提交
69 70 71 72 73
func DictRegister(m map[string]map[string]string) {
	for lang, dict := range m {
		tag := langTag(lang)
		if tag == language.English {
			continue
Q
qinyening 已提交
74
		}
Y
yubo 已提交
75 76
		for k, v := range dict {
			message.SetString(tag, k, v)
Q
qinyening 已提交
77 78 79 80
		}
	}
}

Y
yubo 已提交
81 82 83 84 85 86 87 88
func langTag(l string) language.Tag {
	switch strings.ToLower(l) {
	case "zh", "cn":
		return language.Chinese
	default:
		return language.English
	}
}
Q
qinyening 已提交
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108

// Fprintf is like fmt.Fprintf, but using language-specific formatting.
func Fprintf(w io.Writer, key message.Reference, a ...interface{}) (n int, err error) {
	return p.Fprintf(w, key, a...)
}

// Printf is like fmt.Printf, but using language-specific formatting.
func Printf(format string, a ...interface{}) {
	_, _ = p.Printf(format, a...)
}

// Sprintf formats according to a format specifier and returns the resulting string.
func Sprintf(format string, a ...interface{}) string {
	return p.Sprintf(format, a...)
}

// Sprint is like fmt.Sprint, but using language-specific formatting.
func Sprint(a ...interface{}) string {
	return p.Sprint(a...)
}