-
Notifications
You must be signed in to change notification settings - Fork 14
/
translaton.go
122 lines (94 loc) · 2.91 KB
/
translaton.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package translation
import (
"fmt"
"regexp"
"sort"
"strings"
"github.com/latolukasz/beeorm"
"github.com/coretrix/hitrix/pkg/entity"
"github.com/coretrix/hitrix/pkg/helper"
errorlogger "github.com/coretrix/hitrix/service/component/error_logger"
)
type ITranslationService interface {
GetText(ormService *beeorm.Engine, lang entity.TranslationTextLang, key entity.TranslationTextKey) string
GetTextWithVars(
ormService *beeorm.Engine,
lang entity.TranslationTextLang,
key entity.TranslationTextKey,
variables map[string]interface{},
) string
}
type translationService struct {
errorLoggerService errorlogger.ErrorLogger
}
func NewTranslationService(errorLoggerService errorlogger.ErrorLogger) ITranslationService {
return &translationService{errorLoggerService}
}
func (u *translationService) GetText(ormService *beeorm.Engine, lang entity.TranslationTextLang, key entity.TranslationTextKey) string {
translationTextEntity := &entity.TranslationTextEntity{}
found := ormService.CachedSearchOne(
translationTextEntity,
"CachedQueryLangKey",
lang.String(),
key.String())
if !found {
translationTextEntity.Status = entity.TranslationStatusNew.String()
translationTextEntity.Lang = lang.String()
translationTextEntity.Key = key.String()
ormService.Flush(translationTextEntity)
return key.String()
}
if translationTextEntity.Status == entity.TranslationStatusNew.String() {
return key.String()
}
return translationTextEntity.Text
}
func (u *translationService) GetTextWithVars(
ormService *beeorm.Engine,
lang entity.TranslationTextLang,
key entity.TranslationTextKey,
variables map[string]interface{},
) string {
keys := make([]string, 0, len(variables))
for k := range variables {
keys = append(keys, k)
}
sort.Strings(keys)
translationTextEntity := &entity.TranslationTextEntity{}
found := ormService.CachedSearchOne(
translationTextEntity,
"CachedQueryLangKey",
lang.String(),
key.String())
if !found {
translationTextEntity.Status = entity.TranslationStatusNew.String()
translationTextEntity.Lang = lang.String()
translationTextEntity.Key = key.String()
translationTextEntity.Vars = keys
ormService.Flush(translationTextEntity)
return key.String()
}
if !helper.EqualString(translationTextEntity.Vars, keys) {
translationTextEntity.Vars = keys
ormService.FlushLazy(translationTextEntity)
}
if translationTextEntity.Status == entity.TranslationStatusNew.String() {
return key.String()
}
text := translationTextEntity.Text
for paramName, value := range variables {
text = strings.Replace(text, fmt.Sprintf("[[%s]]", paramName), fmt.Sprintf("%v", value), -1)
}
re := regexp.MustCompile(`\[\[(.*?)\]\]`)
subMatchAll := re.FindAllString(text, -1)
if len(subMatchAll) > 0 {
u.errorLoggerService.LogError(
fmt.Sprintf(
"not assigned vars (%s) for translation key `%s`",
strings.Join(subMatchAll, ", "),
key.String(),
),
)
}
return text
}