/
translator.go
73 lines (65 loc) · 1.77 KB
/
translator.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
package translator
import (
"embed"
"io/fs"
"github.com/MXWXZ/skynet/utils/log"
"github.com/nicksnyder/go-i18n/v2/i18n"
"github.com/ztrue/tracerr"
"golang.org/x/text/language"
"gopkg.in/yaml.v2"
)
var Translator *i18n.Bundle // skynet i18n
//go:embed translate/*.yml
var i18nFiles embed.FS
func NewLocalizer(lang ...string) *i18n.Localizer {
return i18n.NewLocalizer(Translator, lang...)
}
func New() {
Translator = i18n.NewBundle(language.English)
Translator.RegisterUnmarshalFunc("yml", yaml.Unmarshal)
err := fs.WalkDir(i18nFiles, ".", func(path string, d fs.DirEntry, err error) error {
if err != nil {
return tracerr.Wrap(err)
}
if !d.IsDir() {
b, err := i18nFiles.ReadFile("translate/" + d.Name())
if err != nil {
return tracerr.Wrap(err)
}
Translator.MustParseMessageFileBytes(b, d.Name())
log.New().Debugf("Language %v loaded", d.Name())
}
return nil
})
if err != nil {
log.NewEntry(err).Fatal("Failed to read localize files")
}
}
// TranslateString translate string to target language.
// If error happened, return untranslated string.
func TranslateString(t *i18n.Localizer, s string) string {
ret, err := t.Localize(&i18n.LocalizeConfig{
MessageID: s,
})
if err != nil {
log.NewEntry(tracerr.Wrap(err)).WithField("messageID", s).
Warn("Failed to localize string")
return s
}
return ret
}
// TranslateTpl translate string and template to target language.
// If error happened, return untranslated string.
func TranslateTpl(t *i18n.Localizer, s string, tpl any) string {
ret, err := t.Localize(&i18n.LocalizeConfig{
MessageID: s,
TemplateData: tpl,
})
if err != nil {
log.NewEntry(tracerr.Wrap(err)).
WithFields(log.F{"messageID": s, "template": tpl}).
Warn("Failed to update setting")
return s
}
return ret
}