@@ -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
2232type 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
5184func 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}
0 commit comments