__('Ohne generative KI erstellt oder bearbeitet'), self::AiGenerated => __('KI-generiert'), self::AiEdited => __('KI-bearbeitet (z. B. generative Füllung, KI-Retusche)'), }; } /** * Öffentlicher Bildhinweis direkt am Bild (Badge) — null bei Originalfotos * (keine Nicht-KI-Zertifizierung in Portalstimme). Kurzform „KI-generiert" * statt Satz-Wortlaut (User-Entscheidung 10.07.2026). */ public function publicLabel(): ?string { return match ($this) { self::Original => null, self::AiGenerated => __('KI-generiert'), self::AiEdited => __('KI-bearbeitet'), }; } /** * Rangfolge für die Portalregel „Kennzeichnung = max(geprüfter Befund, * Kundenangabe)" (Bildkennzeichnung A.4). Das ist eine bewusste * Portalregel und keine Aussage über den Wahrheitsgehalt: Ein * KI-erzeugter Bestandteil macht ein Bild nicht automatisch vollständig * KI-generiert (Feedback F11) — der Befund wird vorher fachlich * zugeordnet, erst dann greift die Mindestkennzeichnung. */ public function rank(): int { return match ($this) { self::Original => 0, self::AiEdited => 1, self::AiGenerated => 2, }; } /** * Die strengere von zwei Kennzeichnungen nach rank(); null zählt als * „keine Angabe". */ public static function strictest(?self $a, ?self $b): ?self { if ($a === null) { return $b; } if ($b === null) { return $a; } return $b->rank() > $a->rank() ? $b : $a; } /** * Optionsliste für Radios/Selects: value => label. * * @return array */ public static function options(): array { $options = []; foreach (self::cases() as $case) { $options[$case->value] = $case->label(); } return $options; } /** * @return list */ public static function values(): array { return array_column(self::cases(), 'value'); } }