Diese Markenfelder waren nur einsprachig gespeichert und erschienen auf der englischen Seite deutsch. Neue Spalte cms_brands.field_translations (additiv) trägt die Übersetzungen je Sprache, die bisherigen Spalten bleiben die deutsche Fassung; ohne Übersetzung gilt weiter Deutsch. Marken-Editor bearbeitet die Felder über den DE/EN-Umschalter (Bilder und Rubriken bleiben sprachübergreifend). BrandTranslationsSeeder spielt die englischen Texte der vier Kernmarken ein, ohne gepflegte Übersetzungen zu überschreiben. php artisan cms:untranslated listet Inhalte, die in einer Sprache noch fehlen oder deutsch sind. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
61 lines
2.1 KiB
PHP
61 lines
2.1 KiB
PHP
<?php
|
||
|
||
namespace Database\Seeders;
|
||
|
||
use App\Models\CmsBrand;
|
||
use Illuminate\Database\Seeder;
|
||
|
||
/**
|
||
* Englische Fassung der Markenfelder, die bisher nur deutsch existierten (09.10.2026): Merkmale,
|
||
* Leistungen, Abschnitte, Showroom und Bildunterschriften der vier Kernmarken. Die Texte liegen in
|
||
* `database/seeders/data/brand-translations-en.json`, nach Slug.
|
||
*
|
||
* Gesetzt wird nur, was in `field_translations.en` noch fehlt – eine im Admin gepflegte Übersetzung
|
||
* bleibt. Bildunterschriften je Bild, nur für Bilder, die in der Galerie stehen. Mehrfaches
|
||
* Ausführen ist unbedenklich.
|
||
*
|
||
* php artisan db:seed --class=BrandTranslationsSeeder
|
||
*/
|
||
class BrandTranslationsSeeder extends Seeder
|
||
{
|
||
public const LOCALE = 'en';
|
||
|
||
public function run(): void
|
||
{
|
||
/** @var array<string, array<string, mixed>> $data */
|
||
$data = json_decode((string) file_get_contents(__DIR__.'/data/brand-translations-en.json'), true, flags: JSON_THROW_ON_ERROR);
|
||
$updated = [];
|
||
|
||
foreach ($data as $slug => $fields) {
|
||
$brand = CmsBrand::query()->where('slug', $slug)->first();
|
||
|
||
if (! $brand) {
|
||
continue;
|
||
}
|
||
|
||
$existing = $brand->field_translations[self::LOCALE] ?? [];
|
||
|
||
foreach ($fields as $field => $value) {
|
||
if ($field === 'gallery_captions') {
|
||
$value = array_merge(
|
||
array_intersect_key((array) $value, $brand->localized('gallery_captions', CmsBrand::BASE_LOCALE)),
|
||
array_filter((array) ($existing['gallery_captions'] ?? [])),
|
||
);
|
||
} elseif (filled($existing[$field] ?? null)) {
|
||
continue;
|
||
}
|
||
|
||
$brand->setLocalized($field, self::LOCALE, $value);
|
||
}
|
||
|
||
if ($brand->isDirty('field_translations')) {
|
||
$brand->save();
|
||
$updated[] = $slug;
|
||
}
|
||
}
|
||
|
||
$this->command?->info($updated === []
|
||
? 'Marken-Übersetzungen: nichts zu tun.'
|
||
: 'Marken-Übersetzungen (en) ergänzt: '.implode(', ', $updated).'.');
|
||
}
|
||
}
|