Open amitavaghosh1 opened 1 year ago
Thanks for this. Saved me a lot of time. A small contribute to take more advantage of distribuition of wrapper between modules:
type Localizer struct {
bundle *i18n.Bundle
}
var defaultLang = "pt"
var localizer Localizer
func NewLocalizer(languages ...string) Localizer {
path, err := os.Getwd()
if err != nil {
panic("error on get Getwd")
}
bundle := i18n.NewBundle(language.English)
bundle.RegisterUnmarshalFunc("json", json.Unmarshal)
for _, lang := range languages {
bundle.MustLoadMessageFile(fmt.Sprintf("%s/translations/%s.json", path, lang))
}
localizer = Localizer{bundle: bundle}
return localizer
}
func Get(id string) string {
return localizer.get(defaultLang, id)
}
func GetWithData(id string, data map[string]any) string {
return localizer.getWithData(defaultLang, id, data)
}
func (l Localizer) get(lang string, id string) string {
localizer := i18n.NewLocalizer(l.bundle, lang)
cfg := &i18n.LocalizeConfig{
DefaultMessage: &i18n.Message{
ID: id,
Other: id,
One: id,
},
}
str, err := localizer.Localize(cfg)
if err != nil {
return id
}
return str
}
func (l Localizer) getWithData(lang, id string, data map[string]any) string {
localizer := i18n.NewLocalizer(l.bundle, lang)
cfg := &i18n.LocalizeConfig{
DefaultMessage: &i18n.Message{
ID: id,
Other: id,
},
TemplateData: data,
}
str, err := localizer.Localize(cfg)
if err != nil {
return id
}
return str
}
Obviously the examples provided are way to descriptive for a real world use. With already so much code we have to write in go, I don't think, I would like to see 10 line implementations per localized string.
Here is an example wrapper you can use . Please feel free to improve it.
and use it as such
translations/en.json
translations/es.json
The immediate improvement is to make sure, the languages exists.