@@ -45,36 +45,47 @@ class Tag extends Model implements HasMedia, TranslatableContract
4545 public function fillTranslations (array $ translations ): self
4646 {
4747 foreach ($ translations as $ locale => $ data ) {
48- if (! empty ($ data ['title ' ])) {
48+ if (!empty ($ data ['title ' ])) {
49+ // Get the translation for this locale (or create a new one)
50+ $ translation = $ this ->translateOrNew ($ locale );
51+
52+ // Check if title has changed
53+ if ($ translation ->title !== $ data ['title ' ]) {
54+ $ translation ->title = $ data ['title ' ];
55+ }
56+
57+ // Handle the slug only if it has changed
4958 $ slug = $ data ['slug ' ] ?? Str::slug ($ data ['title ' ]);
50-
51- // Ensure slug uniqueness per locale
52- $ slug = $ this ->generateUniqueSlug ($ slug , $ locale );
53-
54- $ this ->translateOrNew ($ locale )->fill ([
55- 'title ' => $ data ['title ' ],
56- 'slug ' => $ slug ,
57- 'content ' => $ data ['content ' ] ?? null ,
58- ]);
59+ if ($ translation ->slug !== $ slug ) {
60+ $ slug = $ this ->generateUniqueSlug ($ slug , $ locale );
61+ $ translation ->slug = $ slug ;
62+ }
63+
64+ // Handle content only if it has changed
65+ if ($ translation ->content !== ($ data ['content ' ] ?? null )) {
66+ $ translation ->content = $ data ['content ' ] ?? null ;
67+ }
68+
69+ $ translation ->save ();
5970 }
6071 }
61-
72+
6273 return $ this ;
6374 }
64-
65- private function generateUniqueSlug (string $ slug , string $ locale ): string
75+ public function generateUniqueSlug (string $ slug , string $ locale , int $ counter = 0 ): string
6676 {
67- $ originalSlug = $ slug ;
68- $ count = 1 ;
69-
70- while (TagTranslation::where ('slug ' , $ slug )->where ('locale ' , $ locale )->exists ()) {
71- $ slug = $ originalSlug .'- ' .$ count ;
72- $ count ++;
73- }
74-
75- return $ slug ;
77+ // Append counter if needed
78+ $ uniqueSlug = $ counter > 0 ? "{$ slug }- {$ counter }" : $ slug ;
79+
80+ // Check if the slug exists for this locale
81+ $ exists = static ::whereHas ('translations ' , function ($ query ) use ($ uniqueSlug , $ locale ) {
82+ $ query ->where ('slug ' , $ uniqueSlug )->where ('locale ' , $ locale );
83+ })->exists ();
84+
85+ // If exists, try again with an incremented counter
86+ return $ exists ? $ this ->generateUniqueSlug ($ slug , $ locale , $ counter + 1 ) : $ uniqueSlug ;
7687 }
77-
88+
7889 /**
7990 * Get all translations as a formatted array
8091 */
0 commit comments