diff --git a/pkg/items/item.go b/pkg/items/item.go index fef648553f1e797b26f627ba7f71bcda0b5b6fd2..c808c719628eb512d71589be53c9cd2f073b9c3d 100644 --- a/pkg/items/item.go +++ b/pkg/items/item.go @@ -217,57 +217,83 @@ func (i *Item) Localize(localizer *localizer.Localizer) (err error) { return nil } -func (i Item) Encode(ctx context.Context, s *schema.Schema) (*Item, error) { +// UnsetTranslation устанавливает значение перевода в nil, для сброса перевода для языка +// "localeID":map{...}, "*":nil} - установка перевода для языка, сброс остальных переводов +// {"*":nil} -сброс всех переводов +func (i *Item) UnsetTranslation(localeID string) { + if i.Translations == nil { + i.Translations = make(map[string]map[string]interface{}) + } + + i.Translations[localeID] = nil +} + +// SetTranslation устанавливает перевод для языка +func (i *Item) SetTranslation(dt map[string]interface{}, localeID string) { + if i.Translations == nil { + i.Translations = make(map[string]map[string]interface{}) + } + + i.Translations[localeID] = dt +} + +func (i *Item) Encode(ctx context.Context, s *schema.Schema) (*Item, error) { + res := *i if i.Data != nil { dt, err := schema.Encode(ctx, s, i.Data) if err != nil { // return errors.WithField(err, "data") return nil, err } - i.Data = dt.(map[string]interface{}) + res.Data = dt.(map[string]interface{}) } if len(i.Translations) > 0 { + res.Translations = make(map[string]map[string]interface{}, len(i.Translations)) for l, v := range i.Translations { dt, err := schema.Encode(ctx, s, v) if err != nil { // return errors.WithField(err, fmt.Sprintf("translations.%s", l)) return nil, err } - i.Translations[l] = dt.(map[string]interface{}) + res.Translations[l] = dt.(map[string]interface{}) } } - return &i, nil + return &res, nil } -func (i Item) Decode(ctx context.Context, s *schema.Schema) (res *Item, err error) { +func (i *Item) Decode(ctx context.Context, s *schema.Schema) (*Item, error) { + res := *i + var err error if i.Data != nil { - i.Data, err = s.Decode(ctx, i.Data) + res.Data, err = s.Decode(ctx, i.Data) if err != nil { return nil, err // return errors.WithField(err, "data") } } if len(i.Translations) > 0 { + res.Translations = make(map[string]map[string]interface{}, len(i.Translations)) for l, v := range i.Translations { dt, err := schema.Decode(ctx, s, v) if err != nil { return nil, err } - i.Translations[l] = dt.(map[string]interface{}) + res.Translations[l] = dt.(map[string]interface{}) } } - return &i, nil + return &res, nil } type ProcessDataFunc func(ctx context.Context, sch *schema.Schema, data map[string]interface{}) (map[string]interface{}, error) -func (i Item) ProcessData(ctx context.Context, sch *schema.Schema, fn ProcessDataFunc, locales ...*locales.Locale) (*Item, error) { +func (i *Item) ProcessData(ctx context.Context, sch *schema.Schema, fn ProcessDataFunc, locales ...*locales.Locale) (*Item, error) { + res := *i if i.Data != nil { - dt, err := fn(ctx, sch, i.Data) + dt, err := fn(ctx, sch, res.Data) if err != nil { return nil, errors.WithField(err, "data") } - i.Data = dt + res.Data = dt } tr := make(map[string]map[string]interface{}) @@ -288,15 +314,14 @@ func (i Item) ProcessData(ctx context.Context, sch *schema.Schema, fn ProcessDat return nil, errors.WithField(err, fmt.Sprintf("translations.%s", l.ID)) } tr[l.ID] = dt - } - i.Translations = nil + res.Translations = nil if len(tr) > 0 { - i.Translations = tr + res.Translations = tr } - return &i, nil + return &res, nil } // IsSystemField возвращает являться ли поле системным