diff --git a/pkg/schema/localizer/localizer.go b/pkg/schema/localizer/localizer.go index 4cc99d6075447c3eefe249f0b2963dca436c6e4f..c8d8604ff39a0938569ae39dd429f3c4a7f897e5 100644 --- a/pkg/schema/localizer/localizer.go +++ b/pkg/schema/localizer/localizer.go @@ -240,14 +240,20 @@ func localize(c *walk.WalkContext) (err error) { return } -func extractTranslation(c *walk.WalkContext) (err error) { +func extractTranslation(c *walk.WalkContext) error { if c.Dst == nil { - return + return nil } if reflect.DeepEqual(c.Src, c.Dst) { c.Dst = nil c.Changed = true + return nil } - return + // если массивы отличаются, то не очищаем совпадающие элементы + if _, ok := c.Field.Params.(*field.ArrayParameters); ok { + c.Src = nil + return nil + } + return nil } diff --git a/pkg/schema/localizer/localizer_test.go b/pkg/schema/localizer/localizer_test.go index ab6b277cdcad36a1ffdd217f1ec198a2bf958f9f..8389f0387a7279a98bd666918fd4854a2b7b3499 100644 --- a/pkg/schema/localizer/localizer_test.go +++ b/pkg/schema/localizer/localizer_test.go @@ -370,6 +370,32 @@ func TestLocalizer_localize(t *testing.T) { }, }, }, + { + name: "Success arrays", + fallback: map[string]any{ + "slice": []any{"en_s1", "en_s2"}, + "arr": []any{ + map[string]any{"num": 11}, + map[string]any{"num": 22}, + }, + }, + target: map[string]any{ + "slice": []any{nil, nil, "ru_s3"}, + "arr": []any{ + nil, + map[string]any{"num": 2}, + nil, + }, + }, + want: map[string]any{ + "slice": []any{"en_s1", "en_s2", "ru_s3"}, + "arr": []any{ + map[string]any{"num": 11}, + map[string]any{"num": 2}, + nil, + }, + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -613,6 +639,31 @@ func TestLocalizer_extractTranslation(t *testing.T) { }, }, }, + { + name: "Success arrays", + fallback: map[string]any{ + "slice": []any{"en_s1", "en_s2"}, + "arr": []any{ + map[string]any{"num": 11}, + map[string]any{"num": 22}, + }, + }, + target: map[string]any{ + "slice": []interface{}{"en_s1", "en_s2"}, + "arr": []interface{}{ + map[string]any{"num": 11}, + map[string]any{"num": 2}, + map[string]any{"num": 22}, + }, + }, + want: map[string]any{ + "arr": []interface{}{ + map[string]any{"num": 11}, + map[string]any{"num": 2}, + map[string]any{"num": 22}, + }, + }, + }, { name: "Success singlelocale obj", fallback: map[string]interface{}{