Gruppe und Schlüssel der Sektionen */ public const SECTIONS = [ ['about', 'hero'], ['about', 'image_break'], ['about', 'our_story'], ['about', 'our_values'], ['about', 'partner_cta'], ['netzwerk', 'partner_cta'], ]; /** @var array alte Stelle → neue Stelle */ public const REPLACEMENTS = [ 'aufmisst und am Ende geradesteht.' => 'aufmisst und am Ende auch dafür geradesteht.', 'mit wenigen, ausgewählten Herstellern' => 'mit wenigen ausgewählten Herstellern', '"Gute Einrichtung entsteht' => '„Gute Einrichtung entsteht', 'bis nach der Montage."' => 'bis nach der Montage.“', 'verbunden durch dieselbe Grundhaltung, dass Qualität und Wort halten zusammengehören.' => 'verbunden durch dieselbe Grundhaltung: Zu Qualität gehört, Wort zu halten.', '2026 rückt das Interior in den Mittelpunkt: Mit CABINET, Rotpunkt Küchen und Febrü stehen starke Kernmarken im Zentrum, ergänzt um ein Netzwerk regionaler Fachexperten. Internationale Immobilien bleiben als ergänzender Bereich bestehen.' => '2026 rückt die Einrichtung in den Mittelpunkt: CABINET, Rotpunkt Küchen, Febrü und Otterpohl Möbelservice bilden die Kernmarken, ergänzt um ein Netzwerk regionaler Fachexperten. Internationale Immobilien bleiben als zweiter Bereich bestehen.', 'Wir planen den Raum, den ein Standardmöbel liegen lässt.' => 'Wir planen auch den Raum, den ein Standardmöbel ungenutzt lässt.', 'Werden Sie B2in Partner' => 'Werden Sie B2in-Partner', 'B2in – Immobilien und Einrichtung verbinden' => 'Wohnraum halb als Planungsskizze, halb fertig eingerichtet', 'B2in – Connecting Real Estate and Interior' => 'Living space, half planning sketch, half fully furnished', 'In 2026 interiors move to the centre: CABINET, Rotpunkt Küchen and Febrü form the core, complemented by a network of regional specialists. International real estate remains as a complementary area.' => 'In 2026 interiors move to the centre: CABINET, Rotpunkt Küchen, Febrü and Otterpohl Möbelservice form the core, complemented by a network of regional specialists. International real estate remains as a second area.', ]; public function run(): void { $total = 0; foreach (self::SECTIONS as [$group, $key]) { $row = CmsContent::query()->where('group', $group)->where('key', $key)->first(); if (! $row) { continue; } $count = 0; $value = $this->replaceDeep($row->getTranslations('value'), $count); if ($count === 0) { continue; } $row->value = $value; $row->save(); app(CmsContentService::class)->clearCache($group); $total += $count; } $this->command?->info($total > 0 ? "About-Texte korrigiert ({$total} Stelle(n))." : 'About-Texte: bereits aktuell oder nicht im CMS – nichts geändert.'); } /** * @param array $data * @return array */ private function replaceDeep(array $data, int &$count): array { foreach ($data as $key => $item) { if (is_array($item)) { $data[$key] = $this->replaceDeep($item, $count); continue; } if (! is_string($item)) { continue; } $replaced = strtr($item, self::REPLACEMENTS); if ($replaced !== $item) { $data[$key] = $replaced; $count++; } } return $data; } }