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{}) 函数,用于读取指定段的文本。