presseportale/resources/views/livewire/auth/two-factor-challenge.blade.php
Kevin Adametz 052b214bd9 i18n: Auth-Views vollstaendig uebersetzbar machen (Readiness)
Die Auth-Strecke (Login, Registrierung, Passwort-Reset/-Bestaetigung,
Magic-Link, E-Mail-Verifizierung, 2FA) war als einziger Backend-Bereich
noch nicht durchgaengig __()-gewrappt. Alle sichtbaren deutschen Strings
in __() gewickelt (Deutsch bleibt Schluessel). Eingebettete Links (AGB/
Datenschutz) und Alpine-x-text sauber segmentiert. Heading/Eyebrow und
topRight-Label/-Link sowie der From-Banner werden jetzt im Auth-Layout am
Ausgabepunkt uebersetzt (im #[Layout]-Attribut sind keine __()-Aufrufe
moeglich). Leeres lang/en.json als Geruest fuer die spaetere EN-Befuellung.

Kunden-, Admin-, Settings- und Component-Views waren bereits vollstaendig
gewrappt (per Audit bestaetigt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 17:00:20 +00:00

79 lines
2.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
use Livewire\Attributes\Layout;
use Livewire\Volt\Component;
new #[Layout('components.layouts.auth.pressekonto', ['heading' => 'Zwei-Faktor-Bestätigung', 'eyebrow' => 'Sicherheitsprüfung', 'showFromBanner' => false])] class extends Component {
public function mount(): void
{
// Ohne laufende Challenge (login.id aus dem ersten Schritt) hat die Seite
// keinen Kontext – zurück zum Login.
if (! session()->has('login.id')) {
$this->redirect(route('login'), navigate: false);
}
}
}; ?>
<div x-data="{ recovery: false }">
@if ($errors->any())
<div class="field-status mb-4" role="alert">
{{ $errors->first() }}
</div>
@endif
<p class="text-[13.5px] text-ink-2 leading-[1.65] !-mt-2 mb-6">
<span x-show="! recovery">
{{ __('Geben Sie den 6-stelligen Code aus Ihrer Authenticator-App ein.') }}
</span>
<span x-show="recovery" x-cloak>
{{ __('Geben Sie einen Ihrer Wiederherstellungs-Codes ein.') }}
</span>
</p>
{{-- Echter POST an Fortifys 2FA-Challenge-Controller (verifiziert gegen die
login.id aus der Session und loggt bei Erfolg ein). --}}
<form method="POST" action="/two-factor-challenge" class="space-y-[18px]">
@csrf
<div x-show="! recovery">
<label class="field-label" for="code">{{ __('Authentifizierungs-Code') }}</label>
<input
id="code"
name="code"
type="text"
inputmode="numeric"
autocomplete="one-time-code"
class="field-input"
placeholder="123456"
x-bind:disabled="recovery"
x-ref="code"
/>
</div>
<div x-show="recovery" x-cloak>
<label class="field-label" for="recovery_code">{{ __('Wiederherstellungs-Code') }}</label>
<input
id="recovery_code"
name="recovery_code"
type="text"
autocomplete="one-time-code"
class="field-input"
placeholder="xxxxxxxx-xxxxxxxx"
x-bind:disabled="! recovery"
/>
</div>
<button type="submit" class="auth-btn-primary !mt-[18px]">
{{ __('Bestätigen') }}
</button>
<button
type="button"
class="auth-btn-outline !mt-0"
x-on:click="recovery = ! recovery; $nextTick(() => (recovery ? document.getElementById('recovery_code') : $refs.code)?.focus())"
>
<span x-show="! recovery">{{ __('Wiederherstellungs-Code verwenden') }}</span>
<span x-show="recovery" x-cloak>{{ __('Code aus App verwenden') }}</span>
</button>
</form>
</div>