diff --git a/translator.go b/translator.go index 24b18db..93cbd73 100644 --- a/translator.go +++ b/translator.go @@ -4,7 +4,7 @@ import ( "fmt" "strconv" "strings" - + "sync" "github.com/go-playground/locales" ) @@ -70,6 +70,7 @@ var _ Translator = new(translator) var _ locales.Translator = new(translator) type translator struct { + sync.RWMutex locales.Translator translations map[interface{}]*transText cardinalTanslations map[interface{}][]*transText // array index is mapped to locales.PluralRule index + the locales.PluralRuleUnknown @@ -77,6 +78,20 @@ type translator struct { rangeTanslations map[interface{}][]*transText } +func (sn *translator) SetTranslations(key interface{}, val *transText) { + sn.Lock() + defer sn.Unlock() + sn.translations[key] = val +} +func (sn *translator) GetTranslations(key interface{}) (*transText, bool) { + sn.Lock() + defer sn.Unlock() + if val, ok := sn.translations[key]; ok { + return val, true + } + return nil, false +} + type transText struct { text string indexes []int @@ -96,8 +111,8 @@ func newTranslator(trans locales.Translator) Translator { // {#} is the only replacement type accepted and are ad infinitum // eg. one: '{0} day left' other: '{0} days left' func (t *translator) Add(key interface{}, text string, override bool) error { - - if _, ok := t.translations[key]; ok && !override { + + if _, ok := t.GetTranslations(key); ok && !override { return &ErrConflictingTranslation{locale: t.Locale(), key: key, text: text} } @@ -124,8 +139,8 @@ func (t *translator) Add(key interface{}, text string, override bool) error { trans.indexes = append(trans.indexes, idx) trans.indexes = append(trans.indexes, idx+len(s)) } - - t.translations[key] = trans + //fatal error: concurrent map read and map write + t.SetTranslations(key, trans) return nil }