Skip to content

Commit 26158da

Browse files
committed
fix: change MustParseMessageFileBytes function to ParseMessageFileBytes avoid panic, add AddTranslator function to add translator manually.
1 parent a15dd14 commit 26158da

File tree

3 files changed

+63
-20
lines changed

3 files changed

+63
-20
lines changed

contrib/i18n/localizer.go

Lines changed: 43 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,18 @@ import (
1515
"gopkg.in/yaml.v3"
1616
)
1717

18-
// trans global translation
19-
var trans *Translator
18+
// GlobalTrans global translation
19+
var (
20+
GlobalTrans = &Translator{
21+
localizes: make(map[i18n.Language]*goI18n.Localizer),
22+
jsonData: make(map[i18n.Language]any),
23+
}
24+
Bundle = goI18n.NewBundle(language.English)
25+
)
26+
27+
func init() {
28+
Bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal)
29+
}
2030

2131
// Translator save the language type with localizer mapping
2232
type Translator struct {
@@ -46,7 +56,30 @@ func (tr *Translator) Tr(la i18n.Language, key string) string {
4656
return translation
4757
}
4858

49-
// NewTranslator new translator from bundle/resource directory
59+
// AddTranslator add translator to global translations
60+
// translation is content
61+
// language is language file name like en_US.yaml
62+
func AddTranslator(translation []byte, language string) (err error) {
63+
// the default localizes format is yaml
64+
_, err = Bundle.ParseMessageFileBytes(translation, language)
65+
if err != nil {
66+
return err
67+
}
68+
69+
languageName := strings.TrimSuffix(language, filepath.Ext(language))
70+
71+
GlobalTrans.localizes[i18n.Language(languageName)] = goI18n.NewLocalizer(Bundle, languageName)
72+
73+
// convert localizes language format into json
74+
j, err := yamlToJson(translation)
75+
if err != nil {
76+
return err
77+
}
78+
GlobalTrans.jsonData[i18n.Language(languageName)] = j
79+
return
80+
}
81+
82+
// NewTranslator new translator from Bundle/resource directory
5083
// TODO: singleton and multi-thread safe initialization
5184
func NewTranslator(bundleDir string) (i18n.Translator, error) {
5285
stat, err := os.Stat(bundleDir)
@@ -62,16 +95,7 @@ func NewTranslator(bundleDir string) (i18n.Translator, error) {
6295
return nil, err
6396
}
6497

65-
trans = &Translator{
66-
localizes: make(map[i18n.Language]*goI18n.Localizer),
67-
jsonData: make(map[i18n.Language]any),
68-
}
69-
70-
// set default language is english
71-
bundle := goI18n.NewBundle(language.English)
72-
bundle.RegisterUnmarshalFunc("yaml", yaml.Unmarshal)
73-
74-
// read the bundle resources file from entries
98+
// read the Bundle resources file from entries
7599
for _, file := range entries {
76100
// ignore directory
77101
if file.IsDir() {
@@ -89,21 +113,21 @@ func NewTranslator(bundleDir string) (i18n.Translator, error) {
89113
}
90114

91115
// the default localizes format is yaml
92-
bundle.MustParseMessageFileBytes(buf, file.Name())
116+
if _, err := Bundle.ParseMessageFileBytes(buf, file.Name()); err != nil {
117+
return nil, fmt.Errorf("parse language message file [%s] failed: %s", file.Name(), err)
118+
}
93119

94-
// TODO: print the log message
95120
languageName := strings.TrimSuffix(file.Name(), filepath.Ext(file.Name()))
96121

97-
trans.localizes[i18n.Language(languageName)] = goI18n.NewLocalizer(bundle, languageName)
122+
GlobalTrans.localizes[i18n.Language(languageName)] = goI18n.NewLocalizer(Bundle, languageName)
98123

99124
// convert localizes language format into json
100125
j, err := yamlToJson(buf)
101126
if err != nil {
102127
return nil, err
103128
}
104129

105-
trans.jsonData[i18n.Language(languageName)] = j
130+
GlobalTrans.jsonData[i18n.Language(languageName)] = j
106131
}
107-
108-
return trans, nil
132+
return GlobalTrans, nil
109133
}

contrib/i18n/localizer_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package i18n
22

33
import (
4+
"os"
45
"testing"
56

67
"github.com/segmentfault/pacman/i18n"
@@ -13,3 +14,20 @@ func TestNewTranslator(t *testing.T) {
1314
assert.Equal(t, translator.Tr(i18n.LanguageChinese, "base.success"), "成功")
1415
assert.Equal(t, translator.Tr(i18n.LanguageEnglish, "base.success"), "success")
1516
}
17+
18+
func TestAddTranslator(t *testing.T) {
19+
enUS, err := os.ReadFile("./testdata/en_US.yaml")
20+
assert.NoError(t, err)
21+
22+
zhCN, err := os.ReadFile("./testdata/zh_CN.yaml")
23+
assert.NoError(t, err)
24+
25+
err = AddTranslator(enUS, "en_US.yaml")
26+
assert.NoError(t, err)
27+
28+
err = AddTranslator(zhCN, "zh_CN.yaml")
29+
assert.NoError(t, err)
30+
31+
assert.Equal(t, GlobalTrans.Tr(i18n.LanguageChinese, "base.success"), "成功")
32+
assert.Equal(t, GlobalTrans.Tr(i18n.LanguageEnglish, "base.success"), "success")
33+
}

contrib/i18n/util.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ package i18n
22

33
import (
44
"encoding/json"
5+
56
"sigs.k8s.io/yaml"
67
)
78

8-
// convert yaml bundle to json jsonData mapping
9+
// convert yaml Bundle to json jsonData mapping
910
func yamlToJson(buf []byte) (any, error) {
1011
j, err := yaml.YAMLToJSON(buf)
1112
if err != nil {

0 commit comments

Comments
 (0)