1
0
Files
omc_api/src/framework/i18n/i18n.go
2024-04-30 20:37:27 +08:00

129 lines
2.6 KiB
Go

package i18n
import (
"fmt"
"regexp"
"strings"
systemService "be.ems/src/modules/system/service"
)
// localeItem 国际化数据项
type localeItem struct {
Key string `json:"key"`
Value string `json:"value"`
Code string `json:"code"`
}
// localeMap 国际化数据组
var localeMap = make(map[string][]localeItem)
// ClearLocaleData 清空国际化数据
func ClearLocaleData() {
localeMap = make(map[string][]localeItem)
}
// LoadLocaleData 加载国际化数据
func LoadLocaleData(language string) []localeItem {
dictType := fmt.Sprintf("i18n_%s", language)
dictTypeList := systemService.NewSysDictTypeImpl.DictDataCache(dictType)
localeData := []localeItem{}
for _, v := range dictTypeList {
localeData = append(localeData, localeItem{
Key: v.DictLabel,
Value: v.DictValue,
Code: v.DictCode,
})
}
localeMap[language] = localeData
return localeData
}
// UpdateKeyValue 更新键对应的值
func UpdateKeyValue(language, key, value string) bool {
arr, ok := localeMap[language]
if !ok || len(arr) == 0 {
arr = LoadLocaleData(language)
}
code := ""
if key == "" {
return false
}
for _, v := range arr {
if v.Key == key {
code = v.Code
break
}
}
// 更新字典数据
sysDictDataService := systemService.NewSysDictDataImpl
item := sysDictDataService.SelectDictDataByCode(code)
if item.DictCode == code && item.DictLabel == key {
item.DictValue = value
row := sysDictDataService.UpdateDictData(item)
if row > 0 {
delete(localeMap, language)
return true
}
}
return false
}
// TFindKeyPrefix 翻译值查找键 值前缀匹配
func TFindKeyPrefix(language, keyPrefix, value string) string {
key := value
if value == "" {
return key
}
arr, ok := localeMap[language]
if !ok || len(arr) == 0 {
arr = LoadLocaleData(language)
}
for _, v := range arr {
if strings.HasPrefix(v.Key, keyPrefix) && strings.HasPrefix(v.Value, value) {
key = v.Key
break
}
}
return key
}
// TKey 翻译键
func TKey(language, key string) string {
value := key
if key == "" {
return value
}
arr, ok := localeMap[language]
if !ok || len(arr) == 0 {
arr = LoadLocaleData(language)
}
for _, v := range arr {
if v.Key == key {
value = v.Value
break
}
}
return value
}
// TTemplate 翻译模板字符串
func TTemplate(language, key string, params map[string]any) string {
templateString := TKey(language, key)
re := regexp.MustCompile("{(.*?)}")
result := re.ReplaceAllStringFunc(templateString, func(match string) string {
key := match[1 : len(match)-1]
if val, ok := params[key]; ok {
return fmt.Sprint(val)
}
return match
})
return result
}