129 lines
2.6 KiB
Go
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
|
|
}
|