diff --git a/di.go b/di.go index c009cb0..9e33718 100644 --- a/di.go +++ b/di.go @@ -7,6 +7,9 @@ package ut import "github.com/gozix/di" const ( + // TagConfigurator is tag to mark configurators. + TagConfigurator = "universal-translator.configurator" + // TagTranslator is a tag for marking locale translator without overriding existing. TagTranslator = "universal-translator.locale-translator" @@ -14,6 +17,13 @@ const ( TagTranslatorOverride = "universal-translator.locale-translator.override" ) +// AsConfigurator is syntax sugar for the di container. +func AsConfigurator() di.ProvideOption { + return di.Tags{{ + Name: TagConfigurator, + }} +} + func AsTranslator(override bool) di.Tags { if override { return di.Tags{{ @@ -26,6 +36,10 @@ func AsTranslator(override bool) di.Tags { }} } +func withConfigurator() di.Modifier { + return di.WithTags(TagConfigurator) +} + func withTranslator(override bool) di.Modifier { if override { return di.WithTags(TagTranslatorOverride) diff --git a/ut.go b/ut.go index 352cc3a..b54108c 100644 --- a/ut.go +++ b/ut.go @@ -13,11 +13,16 @@ import ( ut "github.com/go-playground/universal-translator" ) -// Bundle implements the glue.Bundle interface. -type Bundle struct { - fallback locales.Translator - locales []locales.Translator -} +type ( + // Bundle implements the glue.Bundle interface. + Bundle struct { + fallback locales.Translator + locales []locales.Translator + } + + // Configurator configures universal translator after its creation. + Configurator func(*ut.UniversalTranslator) error +) // Bundle implements the glue.Bundle interface. var _ glue.Bundle = (*Bundle)(nil) @@ -51,10 +56,11 @@ func (b *Bundle) Build(builder di.Builder) error { b.provideUT, di.Constraint(0, di.Optional(true), withTranslator(false)), di.Constraint(1, di.Optional(true), withTranslator(true)), + di.Constraint(2, di.Optional(true), withConfigurator()), ) } -func (b *Bundle) provideUT(append []locales.Translator, override []locales.Translator) (_ *ut.UniversalTranslator, err error) { +func (b *Bundle) provideUT(append []locales.Translator, override []locales.Translator, configurators []Configurator) (_ *ut.UniversalTranslator, err error) { var translator = ut.New(b.fallback, b.locales...) for _, localeTranslator := range append { @@ -69,6 +75,12 @@ func (b *Bundle) provideUT(append []locales.Translator, override []locales.Trans } } + for _, configure := range configurators { + if err = configure(translator); err != nil { + return nil, err + } + } + return translator, nil }