RIchCMS的系统中,支持多语言支持,即可支持中文、繁体中文、英文等语言的切换,此模块使用了ini文件的读取功能。使用的库:github.com/gkzy/gini,以下是源码部分:
文件:github.com/zituocn/richcms/common/sdk/lang/lang.go
package lang
import (
"fmt"
"github.com/gkzy/gini"
"reflect"
"strings"
)
var (
ini = &gini.INI{}
)
// Load load lang name
//
// like zh-CN
// en-US
// lang.Load("lang","zh-CN") load ./lang/zh-CN.ini
func Load(dir, lang string) (err error) {
ini = gini.New(dir)
err = ini.Load(lang + ".ini")
if err != nil {
return
}
return
}
// Tr 取值
//
// lang.Tr("hello")
func Tr(format string, args ...interface{}) string {
format = ini.SectionGet(getSplitSectionKey(format))
if len(args) > 0 {
params := make([]interface{}, 0, len(args))
for _, arg := range args {
if arg == nil {
continue
}
val := reflect.ValueOf(arg)
if val.Kind() == reflect.Slice {
for i := 0; i < val.Len(); i++ {
params = append(params, val.Index(i).Interface())
}
} else {
params = append(params, arg)
}
}
return fmt.Sprintf(format, params...)
}
return format
}
func getSplitSectionKey(name string) (section, key string) {
if name == "" {
return
}
sp := strings.Split(name, ".")
switch len(sp) {
case 1:
return "", sp[0]
case 2:
return sp[0], sp[1]
default:
return
}
}
源码分析:
- Load(dir, lang string) 函数,用于读取语言文件,默认放在站点目录下的/lang目录中。比如:zh-CN.ini是中文。
- func Tr(format string, args ...interface{}) 函数,用于读取指定段的文本。