From 72154f77c0221c3758ca1c61a40845ec676f4c02 Mon Sep 17 00:00:00 2001
From: Anton Sattarov <sattarov@perx.ru>
Date: Wed, 4 Jun 2025 07:11:36 +0000
Subject: [PATCH] =?UTF-8?q?fix(core):=20=D0=98=D1=81=D0=BF=D1=80=D0=B0?=
 =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?=
 =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B8=20"=D0=BF=D1=80=D0=BE=D1=80=D0=B5?=
 =?UTF-8?q?=D0=B6=D0=B8=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8"=20=D0=BF=D0=B5?=
 =?UTF-8?q?=D1=80=D0=B5=D0=B2=D0=BE=D0=B4=D0=BE=D0=B2=20=D1=8D=D0=BB=D0=B5?=
 =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=BC=D0=B0=D1=81=D1=81?=
 =?UTF-8?q?=D0=B8=D0=B2=D0=BE=D0=B2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Issue: #3264
---
 pkg/schema/localizer/localizer.go      | 12 ++++--
 pkg/schema/localizer/localizer_test.go | 51 ++++++++++++++++++++++++++
 2 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/pkg/schema/localizer/localizer.go b/pkg/schema/localizer/localizer.go
index 4cc99d60..c8d8604f 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 ab6b277c..8389f038 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{}{
-- 
GitLab