Mehrsprachigkeit der Oberfläche (Deutsch Standard, Englisch wählbar)

- Sprache je Benutzer (users.locale), Middleware SetLocale, Auswahl unter
  Einstellungen → Darstellung; angebotene Sprachen in config/app.php
- Übersetzungen über Laravel Lang (lang/de.json, lang/de/*.php), Seitentitel
  aus #[Title] werden übersetzt
- Eigene Texte und Korrekturen in lang/project/de.json, übernommen mit
  `artisan lang:apply-project` (überstehen `lang:update`)
- Tests: jede im Code verwendete Übersetzung ist vorhanden, eigene
  Übersetzungen sind übernommen, Sprachwahl und Standardsprache;
  SecurityTest prüft Texte sprachunabhängig über __()
- lang/ von Pint ausgenommen (erzeugte Dateien)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Christoph
2026-10-01 09:52:20 +02:00
co-authored by Claude Opus 5.5
parent cdd2d5b676
commit db2d5d6228
32 changed files with 4108 additions and 18 deletions
+8
View File
@@ -56,6 +56,14 @@ wird nicht umgangen.
Begriffe nach Laravel-Konvention englisch (`Controller`, `Policy`, `Job`). Begriffe nach Laravel-Konvention englisch (`Controller`, `Policy`, `Job`).
- **Länder DE/AT:** gemeinsamer Kern, länderspezifische Logik hinter Schnittstellen in - **Länder DE/AT:** gemeinsamer Kern, länderspezifische Logik hinter Schnittstellen in
`app/Laender/DE` bzw. `app/Laender/AT`. Fachliche Tabellen bekommen `mandant_id` und `land`. `app/Laender/DE` bzw. `app/Laender/AT`. Fachliche Tabellen bekommen `mandant_id` und `land`.
- **Mehrsprachigkeit:** Jeder sichtbare Text über `__('English source text')`, nie fest im
Template. Standardsprache Deutsch, angebotene Sprachen in `config('app.available_locales')`,
Sprache je Benutzer in `users.locale` (Middleware `SetLocale`).
- `lang/de.json` und `lang/de/*.php` erzeugt Laravel Lang – nicht von Hand ändern.
- Eigene Texte und Korrekturen gehören nach `lang/project/{locale}.json`, danach
`sail artisan lang:apply-project`. Nach `sail artisan lang:update` ebenfalls `lang:apply-project`.
- `TranslationCoverageTest` schlägt fehl, wenn ein Text ohne Übersetzung ist.
- In Tests Texte über `__()` prüfen statt fest auf Englisch oder Deutsch.
- **Tests:** Pest als Runner, Tests im PHPUnit-Klassenstil (`tests/Feature`, `tests/Unit`). - **Tests:** Pest als Runner, Tests im PHPUnit-Klassenstil (`tests/Feature`, `tests/Unit`).
Tests laufen gegen die Datenbank `testing`, nie gegen `ki_bauin`. Tests laufen gegen die Datenbank `testing`, nie gegen `ki_bauin`.
- **Commit-Nachrichten** auf Deutsch. - **Commit-Nachrichten** auf Deutsch.
@@ -0,0 +1,41 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Filesystem\Filesystem;
/**
* Überträgt die eigenen Übersetzungen aus lang/project/{locale}.json in lang/{locale}.json.
*
* lang/{locale}.json wird von Laravel Lang erzeugt; `lang:update` setzt dabei geänderte Paket-Texte
* zurück. Eigene Texte und Korrekturen stehen deshalb in lang/project/ und haben Vorrang.
*/
class ApplyProjectTranslations extends Command
{
protected $signature = 'lang:apply-project';
protected $description = 'Eigene Übersetzungen aus lang/project/ in lang/{locale}.json übernehmen';
public function handle(Filesystem $files): int
{
foreach ($files->glob(lang_path('project/*.json')) as $projectFile) {
$locale = pathinfo($projectFile, PATHINFO_FILENAME);
$target = lang_path("{$locale}.json");
$translations = $files->exists($target)
? json_decode($files->get($target), true, flags: JSON_THROW_ON_ERROR)
: [];
$project = json_decode($files->get($projectFile), true, flags: JSON_THROW_ON_ERROR);
$files->put($target, json_encode(
array_merge($translations, $project),
JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR,
).PHP_EOL);
$this->components->info(count($project)." Übersetzungen nach lang/{$locale}.json übernommen.");
}
return self::SUCCESS;
}
}
+29
View File
@@ -0,0 +1,29 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Symfony\Component\HttpFoundation\Response;
/**
* Setzt die Sprache der Oberfläche: die des angemeldeten Benutzers, sonst die Standardsprache.
*/
class SetLocale
{
public function handle(Request $request, Closure $next): Response
{
/** @var array<string, string> $available */
$available = config('app.available_locales');
$locale = $request->user()?->locale;
if (! is_string($locale) || ! array_key_exists($locale, $available)) {
$locale = config('app.locale');
}
App::setLocale($locale);
return $next($request);
}
}
+26 -1
View File
@@ -2,11 +2,36 @@
namespace App\Livewire\Settings; namespace App\Livewire\Settings;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\Rule;
use Livewire\Attributes\Title; use Livewire\Attributes\Title;
use Livewire\Component; use Livewire\Component;
#[Title('Appearance settings')] #[Title('Appearance settings')]
class Appearance extends Component class Appearance extends Component
{ {
// public string $locale = '';
/**
* Mount the component.
*/
public function mount(): void
{
$this->locale = App::getLocale();
}
/**
* Save the selected interface language and reload the page in that language.
*/
public function updatedLocale(): void
{
$this->validate([
'locale' => ['required', 'string', Rule::in(array_keys(config('app.available_locales')))],
]);
Auth::user()->update(['locale' => $this->locale]);
$this->redirectRoute('appearance.edit');
}
} }
+2 -1
View File
@@ -20,6 +20,7 @@ use Spatie\Permission\Traits\HasRoles;
* @property int $id * @property int $id
* @property string $name * @property string $name
* @property string $email * @property string $email
* @property string|null $locale
* @property Carbon|null $email_verified_at * @property Carbon|null $email_verified_at
* @property string $password * @property string $password
* @property string|null $two_factor_secret * @property string|null $two_factor_secret
@@ -29,7 +30,7 @@ use Spatie\Permission\Traits\HasRoles;
* @property Carbon|null $created_at * @property Carbon|null $created_at
* @property Carbon|null $updated_at * @property Carbon|null $updated_at
*/ */
#[Fillable(['name', 'email', 'password'])] #[Fillable(['name', 'email', 'password', 'locale'])]
#[Hidden(['password', 'two_factor_secret', 'two_factor_recovery_codes', 'remember_token'])] #[Hidden(['password', 'two_factor_secret', 'two_factor_recovery_codes', 'remember_token'])]
class User extends Authenticatable implements MustVerifyEmail, PasskeyUser class User extends Authenticatable implements MustVerifyEmail, PasskeyUser
{ {
+2 -1
View File
@@ -1,5 +1,6 @@
<?php <?php
use App\Http\Middleware\SetLocale;
use Illuminate\Foundation\Application; use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions; use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware; use Illuminate\Foundation\Configuration\Middleware;
@@ -12,7 +13,7 @@ return Application::configure(basePath: dirname(__DIR__))
health: '/up', health: '/up',
) )
->withMiddleware(function (Middleware $middleware): void { ->withMiddleware(function (Middleware $middleware): void {
// $middleware->web(append: SetLocale::class);
}) })
->withExceptions(function (Exceptions $exceptions): void { ->withExceptions(function (Exceptions $exceptions): void {
$exceptions->shouldRenderJsonWhen( $exceptions->shouldRenderJsonWhen(
+1
View File
@@ -22,6 +22,7 @@
"require-dev": { "require-dev": {
"fakerphp/faker": "^1.24", "fakerphp/faker": "^1.24",
"larastan/larastan": "^3.9", "larastan/larastan": "^3.9",
"laravel-lang/common": "^6.8",
"laravel/pail": "^1.2.5", "laravel/pail": "^1.2.5",
"laravel/pao": "^1.0.6", "laravel/pao": "^1.0.6",
"laravel/pint": "^1.27", "laravel/pint": "^1.27",
Generated
+1859 -1
View File
File diff suppressed because it is too large Load Diff
+12 -1
View File
@@ -78,10 +78,21 @@ return [
| |
*/ */
'locale' => env('APP_LOCALE', 'en'), 'locale' => env('APP_LOCALE', 'de'),
'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'), 'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
/*
| Sprachen, die Benutzer in den Einstellungen wählen können (Code => Bezeichnung
| in der jeweiligen Sprache). Für jede Sprache außer "en" muss lang/{code}.json
| alle Texte enthalten, siehe TranslationCoverageTest.
*/
'available_locales' => [
'de' => 'Deutsch',
'en' => 'English',
],
'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'), 'faker_locale' => env('APP_FAKER_LOCALE', 'en_US'),
/* /*
@@ -0,0 +1,29 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
// Sprache der Oberfläche; null = Standard aus config('app.locale')
$table->string('locale', 10)->nullable()->after('email');
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('locale');
});
}
};
+2 -1
View File
@@ -15,6 +15,7 @@ und benennt, wo KI-BauIN bewusst abweicht und warum.
| Tailwind CSS 4 | Gestaltung | gleich | | Tailwind CSS 4 | Gestaltung | gleich |
| TallStackUI 4 (Präfix `ts-`) | UI-Komponenten | Version abweichend (Referenz: 3) | | TallStackUI 4 (Präfix `ts-`) | UI-Komponenten | Version abweichend (Referenz: 3) |
| Laravel Fortify | Login, Passwort-Reset, E-Mail-Bestätigung, 2FA, Passkeys | ergänzt | | Laravel Fortify | Login, Passwort-Reset, E-Mail-Bestätigung, 2FA, Passkeys | ergänzt |
| Mehrsprachigkeit | Deutsch (Standard) und Englisch, Sprache je Benutzer; Übersetzungen über Laravel Lang (nur Entwicklung), eigene Texte in `lang/project/` | ergänzt |
| Vite 8, Node.js/npm | Asset-Build | gleich | | Vite 8, Node.js/npm | Asset-Build | gleich |
| Composer | Abhängigkeiten mit Lockfile | gleich | | Composer | Abhängigkeiten mit Lockfile | gleich |
| PhpSpreadsheet | Excel-Export der Bewertungsmatrix | geplant, sobald die Vorlage vorliegt | | PhpSpreadsheet | Excel-Export der Bewertungsmatrix | geplant, sobald die Vorlage vorliegt |
@@ -102,7 +103,7 @@ Ergänzt bzw. anders als in der Referenz:
- Ist 2FA für alle Benutzer Pflicht? - Ist 2FA für alle Benutzer Pflicht?
- Verlangt die IT des Kunden eine Festplattenverschlüsselung auf der VM? - Verlangt die IT des Kunden eine Festplattenverschlüsselung auf der VM?
- Speicherort und Aufbewahrungsdauer der Backups. - Speicherort und Aufbewahrungsdauer der Backups.
- Deutsche Übersetzung der Oberflächentexte (das Starter-Kit liefert englische Texte). - Weitere Sprachen über Deutsch und Englisch hinaus (technisch vorbereitet, fachlich nicht angefragt).
## Architekturübersicht ## Architekturübersicht
+426
View File
@@ -0,0 +1,426 @@
{
"(and :count more error)": "(und :count weiterer Fehler)",
"(and :count more errors)": "(und :count weiterer Fehler)|(und :count weitere Fehler)|(und :count weitere Fehler)",
"2FA recovery codes": "2FA-Wiederherstellungscodes",
":action to join the \":team\" team.": ":action to join the \":team\" team.",
":inviter invited you to join this team.": ":inviter invited you to join this team.",
":inviterName has invited you to join the :teamName team.": ":inviterName hat Sie eingeladen, dem Team :teamName beizutreten.",
"A decryption key is required.": "Ein Entschlüsselungsschlüssel ist nötig.",
"A new verification link has been sent to the email address you provided during registration.": "Ein neuer Bestätigungslink wurde an die E-Mail-Adresse gesendet, die Sie bei der Registrierung angegeben haben.",
"A new verification link has been sent to your email address.": "Ein neuer Bestätigungslink wurde an Ihre E-Mail-Adresse versendet.",
"A Timeout Occurred": "Eine Zeitüberschreitung ist aufgetreten",
"Accept": "Akzeptieren",
"Accept or decline the teams you have been invited to join.": "Nehmen Sie die Einladungen zu den Teams, zu denen Sie eingeladen wurden, an oder lehnen Sie sie ab.",
"Accepted": "Akzeptiert",
"Action": "Aktion",
"Actions": "Aktionen",
"Add": "Hinzufügen",
"Add :name": ":name hinzufügen",
"Add a passkey to sign in without a password": "Fügen Sie einen Passkey hinzu, um sich ohne Passwort anzumelden.",
"Add passkey": "Passkey hinzufügen",
"Added :time": "Hinzugefügt :time",
"Admin": "Administrator",
"Agree": "Zustimmen",
"All rights reserved.": "Alle Rechte vorbehalten.",
"Already have an account?": "Haben Sie bereits ein Konto?",
"Already Reported": "Bereits gemeldet",
"An invitation has already been sent to this email address.": "An diese E-Mail-Adresse wurde bereits eine Einladung gesendet.",
"Appearance": "Darstellung",
"Appearance settings": "Darstellungseinstellungen",
"Archive": "Archiv",
"Are you sure you want to cancel the invitation for :email?": "Möchten Sie die Einladung für :email wirklich abbrechen?",
"Are you sure you want to delete your account?": "Möchten Sie Ihr Konto wirklich löschen?",
"Are you sure you want to leave :name?": "Sind Sie sicher, dass Sie :name verlassen möchten?",
"Are you sure you want to remove :name from this team?": "Möchten Sie :name wirklich aus diesem Team entfernen möchten?",
"Are you sure you want to remove the passkey \":name\"? You will no longer be able to use it to sign in.": "Sind Sie sicher, dass Sie den Passkey \":name\" entfernen möchten? Sie werden ihn nicht mehr für die Anmeldung verwenden können.",
"Are you sure?": "Sind Sie sicher?",
"Assign": "Zuordnen",
"Associate": "Assoziieren",
"Attach": "Anhängen",
"Authenticating...": "Anmeldung läuft …",
"Authentication code": "Authentifizierungscode",
"Back": "Zurück",
"Bad Gateway": "Fehlerhaftes Gateway",
"Bad Request": "Ungültige Anfrage",
"Bandwidth Limit Exceeded": "Bandbreitenlimit überschritten",
"Browse": "Durchsuchen",
"Cancel": "Abbrechen",
"Cancel invitation": "Einladung abbrechen",
"Choose": "Wählen Sie",
"Choose :name": "Wählen Sie :name",
"Choose File": "Datei wählen",
"Choose Image": "Bild wählen",
"Click here to re-send the verification email.": "Klicken Sie hier, um die Bestätigungs-E-Mail erneut zu senden.",
"Click to copy": "Klicken Sie zum Kopieren",
"Client Closed Request": "Client hat die Anfrage geschlossen",
"Close": "Schließen",
"Collapse": "Zusammenklappen",
"Collapse All": "Alle zusammenklappen",
"Comment": "Kommentar",
"Confirm": "Bestätigen",
"Confirm password": "Passwort bestätigen",
"Confirm with passkey": "Mit Passkey bestätigen",
"Confirming...": "Bestätigung läuft …",
"Conflict": "Konflikt",
"Connect": "Verbinden",
"Connection Closed Without Response": "Verbindung ohne Antwort getrennt",
"Connection Timed Out": "Verbindungszeit überschritten",
"Continue": "Weiter",
"Create": "Erstellen",
"Create :name": ":name erstellen",
"Create a new team": "Neues Team erstellen",
"Create account": "Konto erstellen",
"Create an account": "Ein Konto erstellen",
"Create team": "Team erstellen",
"Created": "Erstellt",
"Current password": "Aktuelles Passwort",
"Dark": "Dunkel",
"Dashboard": "Dashboard",
"Decline": "Ablehnen",
"Delete": "Löschen",
"Delete :name": ":name löschen",
"Delete account": "Konto löschen",
"Delete team": "Team löschen",
"Delete your account and all of its resources": "Löschen Sie Ihr Konto und alle zugehörigen Ressourcen",
"Detach": "Trennen",
"Details": "Details",
"Disable": "Deaktivieren",
"Disable 2FA": "2FA deaktivieren",
"Discard": "Verwerfen",
"Documentation": "Dokumentation",
"Don't have an account?": "Sie haben noch kein Konto?",
"Done": "Erledigt",
"Down": "Runter",
"Duplicate": "Duplizieren",
"Duplicate :name": ":name duplizieren",
"e.g., MacBook Pro, iPhone": "z. B. MacBook Pro, iPhone",
"Each recovery code can be used once to access your account and will be removed after use. If you need more, click Regenerate codes above.": "Jeder Wiederherstellungscode kann einmal für den Zugriff auf Ihr Konto verwendet werden und wird nach der Verwendung gelöscht. Wenn Sie weitere Codes benötigen, klicken Sie oben auf „Codes neu generieren“.",
"Edit": "Bearbeiten",
"Edit :name": ":name bearbeiten",
"Edit team": "Team bearbeiten",
"Email": "E-Mail",
"Email address": "E-Mail-Adresse",
"Email password reset link": "Link zum Zurücksetzen senden",
"Email verification": "E-Mail-Bestätigung",
"Enable": "Aktivieren",
"Enable 2FA": "2FA aktivieren",
"Enable two-factor authentication": "Zwei-Faktor-Authentifizierung aktivieren",
"Encrypted environment file already exists.": "Verschlüsselte Umgebungsdatei ist bereits vorhanden.",
"Encrypted environment file not found.": "Verschlüsselte Umgebungsdatei nicht gefunden.",
"Ensure your account is using a long, random password to stay secure": "Stellen Sie sicher, dass Ihr Konto ein langes, zufälliges Passwort verwendet, um sicher zu bleiben",
"Enter the 6-digit code from your authenticator app.": "Geben Sie den 6-stelligen Code aus Ihrer Authentifizierungs-App ein.",
"Enter the authentication code provided by your authenticator application.": "Geben Sie den von Ihrer Authentifizierungsanwendung bereitgestellten Authentifizierungscode ein.",
"Enter your details below to create your account": "Geben Sie unten Ihre Daten ein, um Ihr Konto zu erstellen",
"Enter your email and password below to log in": "Geben Sie unten Ihre E-Mail-Adresse und Ihr Passwort ein, um sich anzumelden",
"Enter your email to receive a password reset link": "Geben Sie Ihre E-Mail-Adresse ein, um einen Link zum Zurücksetzen des Passworts zu erhalten",
"Environment file already exists.": "Umgebungsdatei ist bereits vorhanden.",
"Environment file not found.": "Umgebungsdatei nicht gefunden.",
"errors": "Fehler",
"Expand": "Erweitern",
"Expand All": "Alle erweitern",
"Expectation Failed": "Erwartung gescheitert",
"Explanation": "Erläuterung",
"Export": "Exportieren",
"Export :name": ":name exportieren",
"Failed Dependency": "Fehlgeschlagene Abhängigkeit",
"File": "Datei",
"Files": "Dateien",
"Forbidden": "Verboten",
"Forgot password": "Passwort vergessen",
"Forgot your password?": "Passwort vergessen?",
"Found": "Gefunden",
"Full name": "Vollständiger Name",
"Gateway Timeout": "Gateway-Zeitüberschreitung",
"Give this passkey a name to help you identify it later.": "Geben Sie diesem Passkey einen Namen, damit Sie ihn später leichter identifizieren können.",
"Give your team a name to get started.": "Geben Sie Ihrem Team einen Namen, um loszulegen.",
"Go Home": "Zur Startseite",
"Go to page :page": "Gehe zur Seite :page",
"Gone": "Nicht mehr verfügbar",
"Hello!": "Hallo!",
"Hide": "Verstecken",
"Hide :name": ":name ausblenden",
"Hide recovery codes": "Wiederherstellungscodes ausblenden",
"Home": "Startseite",
"HTTP Version Not Supported": "HTTP Version nicht unterstützt",
"I'm a teapot": "Ich bin eine Teekanne",
"If you did not create an account, no further action is required.": "Wenn Sie kein Konto erstellt haben, sind keine weiteren Handlungen nötig.",
"If you did not request a password reset, no further action is required.": "Wenn Sie kein Zurücksetzen des Passworts beantragt haben, sind keine weiteren Handlungen nötig.",
"If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Sollten Sie Schwierigkeiten haben, die Schaltfläche \":actionText\" zu klicken, kopieren Sie den nachfolgenden Link\n in Ihre Adresszeile des Browsers.",
"IM Used": "IM verwendet",
"Image": "Bild",
"Impersonate": "Imitieren",
"Impersonation": "Identitätswechsel",
"Import": "Importieren",
"Import :name": "Importieren Sie :name",
"Insufficient Storage": "Nicht genügend Speicherplatz",
"Internal Server Error": "Interner Serverfehler",
"Introduction": "Einführung",
"Invalid credential format.": "Ungültiges Format der Anmeldedaten.",
"Invalid filename.": "Ungültiger Dateiname.",
"Invalid JSON was returned from the route.": "Von der Route wurde ein ungültiger JSON-Code zurückgegeben.",
"Invalid SSL Certificate": "Ungültiges SSL-Zertifikat",
"Invitation accepted.": "Einladung akzeptiert.",
"Invitation cancelled.": "Einladung abgebrochen.",
"Invitation declined.": "Einladung abgelehnt.",
"Invitation sent.": "Einladung gesendet.",
"Invitations that have not been accepted yet": "Einladungen, die noch nicht angenommen wurden",
"Invite a team member": "Ein Teammitglied einladen",
"Invite member": "Mitglied einladen",
"Keep invitation": "Einladung behalten",
"Language": "Sprache",
"Last used :time": "Zuletzt :time verwendet",
"Leave team": "Team verlassen",
"Length Required": "Längenangabe erforderlich",
"Light": "Hell",
"Like": "Wie",
"Load": "Belastung",
"Localize": "Lokalisieren",
"Location": "Standort",
"Locked": "Gesperrt",
"Log In": "Einloggen",
"Log in": "Anmelden",
"log in": "Anmeldung",
"Log in and visit your dashboard to accept or decline this invitation.": "Melden Sie sich an und besuchen Sie Ihr Dashboard, um diese Einladung anzunehmen oder abzulehnen.",
"Log in to your account": "Melden Sie sich bei Ihrem Konto an",
"Log Out": "Abmelden",
"Log out": "Abmelden",
"Login": "Anmelden",
"login using a recovery code": "sich mit einem Wiederherstellungscode anmelden",
"login using an authentication code": "sich mit einem Authentifizierungscode anmelden",
"Logout": "Abmelden",
"Loop Detected": "Endlosschleife erkannt",
"Maintenance Mode": "Wartungsmodus",
"Manage who belongs to this team": "Verwalten Sie, wer zu diesem Team gehört",
"Manage your passkeys for passwordless sign-in": "Verwalten Sie Ihre Passkeys für die passwortlose Anmeldung",
"Manage your profile and account settings": "Verwalten Sie Ihr Profil und Ihre Kontoeinstellungen",
"Manage your team settings": "Verwalten Sie Ihre Teameinstellungen",
"Manage your teams and team memberships": "Verwalten Sie Ihre Teams und Teamzugehörigkeiten",
"Manage your two-factor authentication settings": "Verwalten Sie Ihre Einstellungen für die Zwei-Faktor-Authentifizierung",
"Member removed.": "Mitglied entfernt.",
"Member role updated.": "Mitgliedsrolle aktualisiert.",
"Method Not Allowed": "Methode nicht erlaubt",
"Misdirected Request": "Fehlgeleitete Anfrage",
"Moved Permanently": "Permanent verschoben",
"Multi-Status": "Multistatus",
"Multiple Choices": "Mehrere Auswahlmöglichkeiten",
"Name": "Name",
"Network Authentication Required": "Netzwerkauthentifizierung erforderlich",
"Network Connect Timeout Error": "Zeitüberschreitungsfehler bei Netzwerkverbindung",
"Network Read Timeout Error": "Zeitüberschreitungsfehler beim Lesen des Netzwerks",
"New": "Neu",
"New :name": "Neu :name",
"New password": "Neues Passwort",
"New team": "Neues Team",
"No": "Nein",
"No Content": "Kein Inhalt",
"No passkeys yet": "Noch keine Passkeys",
"Non-Authoritative Information": "Nicht maßgebende Informationen",
"Not Acceptable": "Nicht akzeptierbar",
"Not Extended": "Nicht erweitert",
"Not Found": "Nicht gefunden",
"Not Implemented": "Nicht implementiert",
"Not Modified": "Nicht modifiziert",
"of": "von",
"OK": "OK",
"Once your account is deleted, all of its resources and data will also be permanently deleted. Please confirm you would like to permanently delete your account.": "Sobald Ihr Konto gelöscht ist, werden auch alle zugehörigen Ressourcen und Daten dauerhaft gelöscht. Bitte bestätigen Sie, dass Sie Ihr Konto dauerhaft löschen möchten.",
"Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "Sobald Ihr Konto gelöscht wurde, werden alle Ressourcen und Daten dauerhaft gelöscht. Bitte geben Sie Ihr Passwort zur Bestätigung ein, dass Sie Ihr Konto dauerhaft löschen möchten.",
"Open": "Offen",
"Open in a current window": "In einem aktuellen Fenster öffnen",
"Open in a new window": "In einem neuen Fenster öffnen",
"Open in a parent frame": "In einem übergeordneten Frame öffnen",
"Open in the topmost frame": "Im obersten Rahmen öffnen",
"Open on the website": "Auf der Website öffnen",
"Or confirm with password": "Oder mit Passwort bestätigen",
"Or continue with email": "Oder mit E-Mail fortfahren",
"or you can": "oder Sie können",
"or, enter the code manually": "oder geben Sie den Code manuell ein",
"Or, return to": "Oder zurück zur",
"Origin Is Unreachable": "Quelle ist nicht erreichbar",
"Page Expired": "Seite abgelaufen",
"Pagination Navigation": "Seiten-Navigation",
"Partial Content": "Teilinhalt",
"Passkey name": "Name des Passkeys",
"Passkey not recognized. It may have been removed from your account.": "Passkey wurde nicht erkannt. Er wurde möglicherweise von Ihrem Konto entfernt.",
"Passkey registration session expired. Please try again.": "Die Sitzung zur Passkey-Registrierung ist abgelaufen. Bitte versuchen Sie es erneut.",
"Passkey verification session expired. Please try again.": "Die Sitzung zur Passkey-Bestätigung ist abgelaufen. Bitte versuchen Sie es erneut.",
"Passkeys": "Passkeys",
"Passkeys are not supported in this browser.": "Passkeys werden in diesem Browser nicht unterstützt.",
"Password": "Passwort",
"Password updated.": "Passwort aktualisiert.",
"Payload Too Large": "Nutzlast zu groß",
"Payment Required": "Zahlung erforderlich",
"Pending invitations": "Ausstehende Einladungen",
"Pending team invitations": "Ausstehende Teameinladungen",
"Permanent Redirect": "Permanente Weiterleitung",
"Permanently delete your team": "Löschen Sie Ihr Team endgültig",
"Personal": "Persönlich",
"Platform": "Plattform",
"Please click the button below to verify your email address.": "Bitte klicken Sie auf die Schaltfläche, um Ihre E-Mail-Adresse zu bestätigen.",
"Please confirm access to your account by entering one of your emergency recovery codes.": "Bitte bestätigen Sie den Zugriff auf Ihr Konto, indem Sie einen Ihrer Notfall-Wiederherstellungscodes eingeben.",
"Please enter your new password below": "Bitte geben Sie nachstehend Ihr neues Passwort ein.",
"Please proceed with caution, this cannot be undone.": "Bitte gehen Sie mit Vorsicht vor, dies kann nicht rückgängig gemacht werden.",
"Please verify your email address by clicking on the link we just emailed to you.": "Bitte bestätigen Sie Ihre E-Mail-Adresse, indem Sie auf den Link klicken, den wir Ihnen gerade per E-Mail gesendet haben.",
"Precondition Failed": "Vorbedingung fehlgeschlagen",
"Precondition Required": "Voraussetzung erforderlich",
"Preview": "Vorschau",
"Price": "Preis",
"Processing": "In Bearbeitung",
"Profile": "Profil",
"Profile settings": "Profileinstellungen",
"Profile updated.": "Profil aktualisiert.",
"Proxy Authentication Required": "Proxy-Authentifizierung erforderlich",
"Railgun Error": "Railgun-Fehler",
"Range Not Satisfiable": "Bereich nicht erfüllbar",
"Record": "Aufzeichnen",
"Recovery code": "Wiederherstellungscode",
"Recovery codes": "Wiederherstellungscodes",
"Recovery codes let you regain access if you lose your 2FA device. Store them in a secure password manager.": "Mit Wiederherstellungscodes können Sie wieder Zugriff erhalten, wenn Sie Ihr 2FA-Gerät verlieren. Speichern Sie diese in einem sicheren Passwort-Manager.",
"Regards,": "Mit freundlichen Grüßen,",
"Regenerate codes": "Codes neu generieren",
"Register": "Registrieren",
"Register passkey": "Passkey registrieren",
"Registering...": "Registrierung läuft …",
"Remember me": "Angemeldet bleiben",
"Remove member": "Mitglied entfernen",
"Remove passkey": "Passkey entfernen",
"Remove team member": "Team Mitglied entfernen",
"Repository": "Repository",
"Request Header Fields Too Large": "Anfrage-Header-Felder zu groß",
"Request Timeout": "Zeitüberschreitung der Anfrage",
"Resend verification email": "Bestätigungs-E-Mail erneut senden",
"Reset Content": "Inhalt zurücksetzen",
"Reset Password": "Passwort zurücksetzen",
"Reset password": "Passwort zurücksetzen",
"Reset your password": "Setzen Sie Ihr Passwort zurück",
"Restore": "Wiederherstellen",
"Restore :name": ":name wiederherstellen",
"results": "Ergebnissen",
"Retry With": "Wiederhole mit",
"Role": "Rolle",
"Save": "Speichern",
"Save & Close": "Speichern und schließen",
"Save & Return": "Speichern und zurückgeben",
"Save :name": "Sparen Sie :name",
"Search": "Suche",
"Search :name": "Suche :name",
"Security": "Sicherheit",
"Security settings": "Sicherheitseinstellungen",
"See Other": "Siehe andere Seite",
"Select": "Wählen Sie",
"Select All": "Wählen Sie Alle",
"Select team": "Team auswählen",
"Send": "Schicken",
"Send an invitation to join this team.": "Eine Einladung für dieses Team verschicken.",
"Send invitation": "Einadlung senden",
"Server Error": "Interner Fehler",
"Service Unavailable": "Service nicht verfügbar",
"Session Has Expired": "Sitzung ist abgelaufen",
"Settings": "Einstellungen",
"Show": "Zeigen",
"Show :name": ":name anzeigen",
"Show All": "Zeige alles",
"Showing": "Zeige",
"Sign In": "Anmelden",
"Sign in with a passkey": "Mit einem Passkey anmelden",
"Sign up": "Registrieren",
"Solve": "Lösen",
"SSL Handshake Failed": "SSL Handshake fehlgeschlagen",
"Start": "Starten",
"Stop": "Stoppen",
"Submit": "Einreichen",
"Subscribe": "Abonnieren",
"Switch": "Wechseln",
"Switch To Role": "Zur Rolle wechseln",
"Switching Protocols": "Protokollwechsel",
"System": "System",
"Tag": "Stichwort",
"Tags": "Stichworte",
"Team created.": "Team erstellt.",
"Team deleted.": "Team gelöscht.",
"Team members": "Teammitglieder",
"Team name": "Teamname",
"Team updated.": "Team aktualisiert.",
"Teams": "Teams",
"Temporary Redirect": "Temporäre Weiterleitung",
"The :attribute must be at least :length characters and contain at least one number.": ":Attribute muss aus mindestens :length Zeichen bestehen und mindestens eine Zahl enthalten.",
"The :attribute must be at least :length characters and contain at least one special character and one number.": ":Attribute muss mindestens :length Zeichen lang sein und mindestens ein Sonderzeichen und eine Zahl enthalten.",
"The :attribute must be at least :length characters and contain at least one special character.": ":Attribute muss aus mindestens :length Zeichen bestehen und mindestens ein Sonderzeichen enthalten.",
"The :attribute must be at least :length characters and contain at least one uppercase character and one number.": ":Attribute muss aus mindestens :length Zeichen bestehen und mindestens einen Großbuchstaben und eine Zahl enthalten.",
"The :attribute must be at least :length characters and contain at least one uppercase character and one special character.": ":Attribute muss aus mindestens :length Zeichen bestehen und mindestens einen Großbuchstaben und ein Sonderzeichen enthalten.",
"The :attribute must be at least :length characters and contain at least one uppercase character, one number, and one special character.": ":Attribute muss aus mindestens :length Zeichen bestehen und mindestens einen Großbuchstaben, eine Zahl und ein Sonderzeichen enthalten.",
"The :attribute must be at least :length characters and contain at least one uppercase character.": ":Attribute muss aus mindestens :length Zeichen bestehen und mindestens einen Großbuchstaben enthalten.",
"The :attribute must be at least :length characters.": ":Attribute muss aus mindestens :length Zeichen bestehen.",
"The existing encrypted environment file is not in readable format. Use --force to overwrite it.": "Die vorhandene verschlüsselte Umgebungsdatei liegt nicht in einem lesbaren Format vor. Verwenden Sie --force, um sie zu überschreiben.",
"The existing encryption key is required to update the encrypted environment file.": "Der vorhandene Verschlüsselungsschlüssel wird benötigt, um die verschlüsselte Umgebungsdatei zu aktualisieren.",
"The given data was invalid.": "Die gegebenen Daten waren ungültig.",
"The provided password does not match your current password.": "Das angegebene Passwort stimmt nicht mit Ihrem aktuellen Passwort überein.",
"The provided password was incorrect.": "Das angegebene Passwort war falsch.",
"The provided two factor authentication code was invalid.": "Der angegebene Zwei-Faktor-Authentifizierungscode war ungültig.",
"The provided two factor recovery code was invalid.": "Der angegebene Zwei-Faktor-Wiederherstellungscode war ungültig.",
"The response is not a streamed response.": "Die Antwort ist keine gestreamte Antwort.",
"The response is not a view.": "Die Antwort ist keine Ansicht.",
"The team name does not match.": "Der Teamname stimmt nicht überein.",
"Theme": "Farbschema",
"This action cannot be undone. This will permanently delete the team \":name\".": "Diese Aktion kann nicht rückgängig gemacht werden. Dadurch wird das Team „:name“ dauerhaft gelöscht.",
"This action is unauthorized.": "Diese Aktion ist nicht autorisiert.",
"This invitation has already been accepted.": "Diese Einladung wurde bereits angenommen.",
"This invitation has expired.": "Diese Einladung ist abgelaufen.",
"This invitation was sent to a different email address.": "Diese Einladung wurde an eine andere E-Mail-Adresse gesendet.",
"This is a secure area of the application. Please confirm your password before continuing.": "Dies ist ein sicherer Bereich der Anwendung. Bitte bestätigen Sie Ihr Passwort, bevor Sie fortfahren.",
"This password reset link will expire in :count minutes.": "Dieser Link zum Zurücksetzen des Passworts läuft in :count Minuten ab.",
"This team name is reserved and cannot be used.": "Dieser Teamname ist reserviert und kann nicht verwendet werden.",
"This user is already a member of the team.": "Dieser Benutzer ist bereits Mitglied des Teams.",
"to": "bis",
"To finish enabling two-factor authentication, scan the QR code or enter the setup key in your authenticator app.": "Um die Zwei-Faktor-Authentifizierung zu aktivieren, scannen Sie den QR-Code oder geben Sie den Einrichtungsschlüssel in Ihre Authentifizierungs-App ein.",
"Toggle navigation": "Navigation umschalten",
"Too Early": "Zu früh",
"Too Many Requests": "Zu viele Anfragen",
"Translate": "Übersetzen",
"Translate It": "Übersetze es",
"Two-factor authentication": "Zwei-Faktor-Authentifizierung",
"Two-factor authentication enabled": "Zwei-Faktor-Authentifizierung aktiviert",
"Two-factor authentication is now enabled. Scan the QR code or enter the setup key in your authenticator app.": "Die Zwei-Faktor-Authentifizierung ist nun aktiviert. Scannen Sie den QR-Code oder geben Sie den Setup-Schlüssel in Ihrer Authentifizierungs-App ein.",
"Type \":name\" to confirm": "Geben Sie \":name\" ein, um zu bestätigen",
"Unable to register passkey. Please try again.": "Passkey konnte nicht registriert werden. Bitte versuchen Sie es erneut.",
"Unable to register this passkey.": "Dieser Passkey kann nicht registriert werden.",
"Unable to sign in with this account.": "Anmeldung mit diesem Konto nicht möglich.",
"Unable to verify passkey. Please try again.": "Passkey konnte nicht verifiziert werden. Bitte versuchen Sie es erneut.",
"Unable to write the encrypted environment file.": "Die verschlüsselte Umgebungsdatei konnte nicht geschrieben werden.",
"Unauthorized": "Nicht autorisiert",
"Unavailable For Legal Reasons": "Aus rechtlichen Gründen nicht verfügbar",
"Unknown Error": "Unbekannter Fehler",
"Unpack": "Auspacken",
"Unprocessable Entity": "Unverarbeitbare Entität",
"Unsubscribe": "Abbestellen",
"Unsupported Media Type": "Nicht unterstützter Medientyp",
"Up": "Hoch",
"Update": "Aktualisieren",
"Update :name": ":name aktualisieren",
"Update password": "Passwort aktualisieren",
"Update the appearance settings for your account": "Aktualisieren Sie die Darstellungseinstellungen für Ihr Konto",
"Update your name and email address": "Aktualisieren Sie Ihren Namen und Ihre E-Mail-Adresse",
"Upgrade Required": "Upgrade erforderlich",
"URI Too Long": "URI ist zu lang",
"Use Proxy": "Proxy verwenden",
"User": "Benutzer",
"Variant Also Negotiates": "Variante verhandelt ebenfalls",
"Verify authentication code": "Authentifizierungscode überprüfen",
"Verify Email Address": "E-Mail-Adresse bestätigen",
"Verify your email address": "Bestätigen Sie Ihre E-Mail-Adresse",
"View": "Ansicht",
"View :name": ":name anzeigen",
"View recovery codes": "Wiederherstellungscodes anzeigen",
"View team": "Team anzeigen",
"Warning": "Warnung",
"Web Server is Down": "Webserver ist ausgefallen",
"Welcome": "Willkommen",
"When you enable two-factor authentication, you will be prompted for a secure pin during login. This pin can be retrieved from a TOTP-supported application on your phone.": "Wenn Sie die Zwei-Faktor-Authentifizierung aktivieren, werden Sie bei der Anmeldung zur Eingabe einer Sicherheits-PIN aufgefordert. Diese PIN können Sie über eine TOTP-unterstützte Anwendung auf Ihrem Smartphone abrufen.",
"Whoops!": "Ups!",
"Yes": "Ja",
"You are receiving this email because we received a password reset request for your account.": "Sie erhalten diese E-Mail, weil wir einen Antrag auf eine Zurücksetzung Ihres Passworts bekommen haben.",
"You don't belong to any teams yet.": "Sie gehören aktuell noch keinem Team an.",
"You left the team \":name\"": "Sie haben das Team „:name“ verlassen.",
"You will be prompted for a secure, random pin during login, which you can retrieve from the TOTP-supported application on your phone.": "Sie werden beim Anmelden zur Eingabe einer sicheren, zufällig generierten PIN aufgefordert, die Sie über die TOTP-fähige Anwendung auf Ihrem Smartphone abrufen können.",
"You've been invited to join :teamName": "Sie wurden zum Team „:teamName“ eingeladen.",
"Your email address is unverified.": "Ihre E-Mail-Adresse ist noch nicht bestätigt."
}
+119
View File
@@ -0,0 +1,119 @@
<?php
declare(strict_types=1);
return [
'accept' => 'Akzeptieren',
'action' => 'Aktion',
'actions' => 'Aktionen',
'add' => 'Hinzufügen',
'admin' => 'Administrator',
'agree' => 'Zustimmen',
'archive' => 'Archiv',
'assign' => 'Zuordnen',
'associate' => 'Assoziieren',
'attach' => 'Anfügen',
'browse' => 'Durchsuche',
'cancel' => 'Stornieren',
'choose' => 'Wählen',
'choose_file' => 'Datei wählen',
'choose_image' => 'Wählen Sie Bild',
'click_to_copy' => 'Klicken Sie zum Kopieren',
'close' => 'Schließen',
'collapse' => 'Zusammenbruch',
'collapse_all' => 'Alles reduzieren',
'comment' => 'Kommentar',
'confirm' => 'Bestätigen',
'connect' => 'Verbinden',
'create' => 'Erstellen',
'delete' => 'Löschen',
'detach' => 'Ablösen',
'details' => 'Einzelheiten',
'disable' => 'Deaktivieren',
'discard' => 'Verwerfen',
'done' => 'Erledigt',
'down' => 'Runter',
'duplicate' => 'Duplikat',
'edit' => 'Bearbeiten',
'enable' => 'Aktivieren',
'expand' => 'Expandieren',
'expand_all' => 'Alle erweitern',
'explanation' => 'Erläuterung',
'export' => 'Exportieren',
'file' => 'Datei',
'files' => 'Dateien',
'go_home' => 'Nach Hause gehen',
'hide' => 'Verstecken',
'home' => 'Heim',
'image' => 'Bild',
'impersonate' => 'Imitieren',
'impersonation' => 'Identitätswechsel',
'import' => 'Importieren',
'introduction' => 'Einführung',
'like' => 'Wie',
'load' => 'Belastung',
'localize' => 'Lokalisieren',
'log_in' => 'Anmeldung',
'log_out' => 'Ausloggen',
'named' => [
'add' => ':name hinzufügen',
'choose' => ':name auswählen',
'create' => ':name erstellen',
'delete' => ':name löschen',
'duplicate' => ':name duplizieren',
'edit' => ':name bearbeiten',
'export' => ':name exportieren',
'hide' => ':name ausblenden',
'import' => ':name importieren',
'new' => 'Neu :name',
'restore' => ':name wiederherstellen',
'save' => ':name speichern',
'search' => ':name suchen',
'show' => ':name anzeigen',
'update' => ':name aktualisieren',
'view' => ':name anzeigen',
],
'new' => 'Neu',
'no' => 'Nein',
'open' => 'Öffen',
'open_website' => 'Auf der Website öffnen',
'preview' => 'Vorschau',
'price' => 'Preis',
'record' => 'Aufzeichnen',
'restore' => 'Wiederherstellen',
'save' => 'Speichern',
'save_and_close' => 'Speichern und schließen',
'save_and_return' => 'Speichern und zurückgehen',
'search' => 'Suchen',
'select' => 'Wählen',
'select_all' => 'Alles auswählen',
'send' => 'Absenden',
'settings' => 'Einstellungen',
'show' => 'Anzeigen',
'show_all' => 'Alles anzeigen',
'sign_in' => 'Anmelden',
'solve' => 'Lösen',
'start' => 'Starten',
'stop' => 'Stoppen',
'submit' => 'Absenden',
'subscribe' => 'Abonnieren',
'switch' => 'Umschalten',
'switch_to_role' => 'Zur Rolle wechseln',
'tag' => 'Schlagwort',
'tags' => 'Stichworte',
'target_link' => [
'blank' => 'In einem neuen Fenster öffnen',
'parent' => 'In einem übergeordneten Frame öffnen',
'self' => 'In einem aktuellen Fenster öffnen',
'top' => 'Im obersten Rahmen öffnen',
],
'translate' => 'Übersetzen',
'translate_it' => 'Übersetze es',
'unpack' => 'Entpacken',
'unsubscribe' => 'Abbestellen',
'up' => 'Hoch',
'update' => 'Aktualisieren',
'user' => 'Benutzer',
'view' => 'Ansicht',
'yes' => 'Ja',
];
+9
View File
@@ -0,0 +1,9 @@
<?php
declare(strict_types=1);
return [
'failed' => 'Diese Kombination aus Zugangsdaten wurde nicht in unserer Datenbank gefunden.',
'password' => 'Das Passwort ist falsch.',
'throttle' => 'Zu viele Loginversuche. Versuchen Sie es bitte in :seconds Sekunden nochmal.',
];
+84
View File
@@ -0,0 +1,84 @@
<?php
declare(strict_types=1);
return [
'0' => 'Unbekannter Fehler',
'100' => 'Weiter',
'101' => 'Protokollwechsel',
'102' => 'In Bearbeitung',
'200' => 'OK',
'201' => 'Erstellt',
'202' => 'Akzeptiert',
'203' => 'Nicht verifizierte Information',
'204' => 'Kein Inhalt',
'205' => 'Inhalt zurücksetzen',
'206' => 'Teilinhalt',
'207' => 'Multistatus',
'208' => 'Bereits gemeldet',
'226' => 'IM verwendet',
'300' => 'Mehrere Auswahlmöglichkeiten',
'301' => 'Permanent verschoben',
'302' => 'Gefunden',
'303' => 'Siehe andere Seite',
'304' => 'Nicht modifiziert',
'305' => 'Proxy verwenden',
'307' => 'Temporäre Weiterleitung',
'308' => 'Permanente Weiterleitung',
'400' => 'Ungültige Anfrage',
'401' => 'Nicht autorisiert',
'402' => 'Zahlung erforderlich',
'403' => 'Verboten',
'404' => 'Nicht gefunden',
'405' => 'Methode nicht erlaubt',
'406' => 'Nicht annehmbar',
'407' => 'Proxy-Authentifizierung erforderlich',
'408' => 'Zeitüberschreitung der Anfrage',
'409' => 'Konflikt',
'410' => 'Nicht mehr verfügbar',
'411' => 'Länge erforderlich',
'412' => 'Vorbedingung fehlgeschlagen',
'413' => 'Nutzlast zu groß',
'414' => 'URI zu lang',
'415' => 'Nicht unterstützter Medientyp',
'416' => 'Bereich nicht erfüllbar',
'417' => 'Erwartung gescheitert',
'418' => 'Ich bin eine Teekanne',
'419' => 'Sitzung ist abgelaufen',
'421' => 'Fehlgeleitete Anfrage',
'422' => 'Unverarbeitbare Entität',
'423' => 'Gesperrt',
'424' => 'Fehlgeschlagene Abhängigkeit',
'425' => 'Zu früh',
'426' => 'Upgrade erforderlich',
'428' => 'Voraussetzung erforderlich',
'429' => 'Zu viele Anfragen',
'431' => 'Anfrage-Header-Felder zu groß',
'444' => 'Verbindung ohne Antwort geschlossen',
'449' => 'Wiederhole mit',
'451' => 'Aus rechtlichen Gründen nicht verfügbar',
'499' => 'Client-Closed-Request',
'500' => 'Interner Serverfehler',
'501' => 'Nicht implementiert',
'502' => 'Fehlerhaftes Gateway',
'503' => 'Wartungsmodus',
'504' => 'Gateway-Zeitüberschreitung',
'505' => 'HTTP Version nicht unterstützt',
'506' => 'Variante verhandelt auch',
'507' => 'Nicht genügend Speicherplatz',
'508' => 'Endlosschleife erkannt',
'509' => 'Bandbreitenlimit überschritten',
'510' => 'Nicht erweitert',
'511' => 'Netzwerkauthentifizierung erforderlich',
'520' => 'Unbekannter Fehler',
'521' => 'Webserver ist ausgefallen',
'522' => 'Verbindung abgelaufen',
'523' => 'Quelle ist nicht erreichbar',
'524' => 'Eine Zeitüberschreitung ist aufgetreten',
'525' => 'SSL Handshake fehlgeschlagen',
'526' => 'Ungültiges SSL-Zertifikat',
'527' => 'Railgun-Fehler',
'598' => 'Zeitüberschreitungsfehler beim Lesen des Netzwerks',
'599' => 'Zeitüberschreitungsfehler bei Netzwerkverbindung',
'unknownError' => 'Unbekannter Fehler',
];
+8
View File
@@ -0,0 +1,8 @@
<?php
declare(strict_types=1);
return [
'next' => 'Weiter &raquo;',
'previous' => '&laquo; Zurück',
];
+11
View File
@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
return [
'reset' => 'Das Passwort wurde zurückgesetzt!',
'sent' => 'E-Mail zum Zurücksetzen des Passworts wurde gesendet!',
'throttled' => 'Bitte warten Sie, bevor Sie es erneut versuchen.',
'token' => 'Der Passwort-Wiederherstellungsschlüssel ist ungültig oder abgelaufen.',
'user' => 'Es konnte leider kein Nutzer mit dieser E-Mail-Adresse gefunden werden.',
];
+290
View File
@@ -0,0 +1,290 @@
<?php
declare(strict_types=1);
return [
'accepted' => ':Attribute muss akzeptiert werden.',
'accepted_if' => ':Attribute muss akzeptiert werden, wenn :other :value ist.',
'active_url' => ':Attribute ist keine gültige Internet-Adresse.',
'after' => ':Attribute muss ein Datum nach :date sein.',
'after_or_equal' => ':Attribute muss ein Datum nach :date oder gleich :date sein.',
'alpha' => ':Attribute darf nur aus Buchstaben bestehen.',
'alpha_dash' => ':Attribute darf nur aus Buchstaben, Zahlen, Binde- und Unterstrichen bestehen.',
'alpha_num' => ':Attribute darf nur aus Buchstaben und Zahlen bestehen.',
'any_of' => ':Attribute ist ungültig.',
'array' => ':Attribute muss ein Array sein.',
'array_keys' => 'Das Feld :Attribute darf nur die folgenden Schlüssel enthalten: :values.',
'ascii' => 'Die :attribute darf nur alphanumerische Single-Byte-Zeichen und -Symbole enthalten.',
'base64' => 'Das Feld :attribute muss eine gültige Base64-Zeichenfolge sein.',
'before' => ':Attribute muss ein Datum vor :date sein.',
'before_or_equal' => ':Attribute muss ein Datum vor :date oder gleich :date sein.',
'between' => [
'array' => ':Attribute muss zwischen :min & :max Elemente haben.',
'file' => ':Attribute muss zwischen :min & :max Kilobytes groß sein.',
'numeric' => ':Attribute muss zwischen :min & :max liegen.',
'string' => ':Attribute muss zwischen :min & :max Zeichen lang sein.',
],
'boolean' => ':Attribute muss entweder \'true\' oder \'false\' sein.',
'can' => 'Das Feld :attribute enthält einen nicht autorisierten Wert.',
'confirmed' => ':Attribute stimmt nicht mit der Bestätigung überein.',
'contains' => 'Dem Feld :attribute fehlt ein erforderlicher Wert.',
'current_password' => 'Das Passwort ist falsch.',
'date' => ':Attribute muss ein gültiges Datum sein.',
'date_equals' => ':Attribute muss ein Datum gleich :date sein.',
'date_format' => ':Attribute entspricht nicht dem gültigen Format für :format.',
'decimal' => 'Die :attribute muss :decimal Dezimalstellen haben.',
'declined' => ':Attribute muss abgelehnt werden.',
'declined_if' => ':Attribute muss abgelehnt werden wenn :other :value ist.',
'different' => ':Attribute und :other müssen sich unterscheiden.',
'digits' => ':Attribute muss :digits Stellen haben.',
'digits_between' => ':Attribute muss zwischen :min und :max Stellen haben.',
'dimensions' => ':Attribute hat ungültige Bildabmessungen.',
'distinct' => ':Attribute beinhaltet einen bereits vorhandenen Wert.',
'doesnt_contain' => ':Attribute darf keines der folgenden enthalten: :values.',
'doesnt_end_with' => ':Attribute darf nicht mit einem der folgenden enden: :values.',
'doesnt_start_with' => ':Attribute darf nicht mit einem der folgenden beginnen: :values.',
'email' => ':Attribute muss eine gültige E-Mail-Adresse sein.',
'encoding' => ':Attribute muss als :encoding kodiert sein.',
'ends_with' => ':Attribute muss eine der folgenden Endungen aufweisen: :values',
'enum' => 'Der ausgewählte Wert ist ungültig.',
'exists' => 'Der gewählte Wert für :attribute ist ungültig.',
'extensions' => 'Das Feld :attribute muss eine der folgenden Erweiterungen haben: :values.',
'file' => ':Attribute muss eine Datei sein.',
'filled' => ':Attribute muss ausgefüllt sein.',
'gt' => [
'array' => ':Attribute muss mehr als :value Elemente haben.',
'file' => ':Attribute muss größer als :value Kilobytes sein.',
'numeric' => ':Attribute muss größer als :value sein.',
'string' => ':Attribute muss länger als :value Zeichen sein.',
],
'gte' => [
'array' => ':Attribute muss mindestens :value Elemente haben.',
'file' => ':Attribute muss größer oder gleich :value Kilobytes sein.',
'numeric' => ':Attribute muss größer oder gleich :value sein.',
'string' => ':Attribute muss mindestens :value Zeichen lang sein.',
],
'hex_color' => 'Das Feld :attribute muss eine gültige Hexadezimalfarbe sein.',
'image' => ':Attribute muss ein Bild sein.',
'in' => 'Der gewählte Wert für :attribute ist ungültig.',
'in_array' => 'Der gewählte Wert für :attribute kommt nicht in :other vor.',
'in_array_keys' => 'Das Feld :Attribute muss mindestens einen der folgenden Schlüssel enthalten: :Values.',
'integer' => ':Attribute muss eine ganze Zahl sein.',
'ip' => ':Attribute muss eine gültige IP-Adresse sein.',
'ipv4' => ':Attribute muss eine gültige IPv4-Adresse sein.',
'ipv6' => ':Attribute muss eine gültige IPv6-Adresse sein.',
'json' => ':Attribute muss ein gültiger JSON-String sein.',
'list' => ':Attribute muss eine Liste sein.',
'lowercase' => ':Attribute muss in Kleinbuchstaben sein.',
'lt' => [
'array' => ':Attribute muss weniger als :value Elemente haben.',
'file' => ':Attribute muss kleiner als :value Kilobytes sein.',
'numeric' => ':Attribute muss kleiner als :value sein.',
'string' => ':Attribute muss kürzer als :value Zeichen sein.',
],
'lte' => [
'array' => ':Attribute darf maximal :value Elemente haben.',
'file' => ':Attribute muss kleiner oder gleich :value Kilobytes sein.',
'numeric' => ':Attribute muss kleiner oder gleich :value sein.',
'string' => ':Attribute darf maximal :value Zeichen lang sein.',
],
'mac_address' => 'Der Wert muss eine gültige MAC-Adresse sein.',
'max' => [
'array' => ':Attribute darf maximal :max Elemente haben.',
'file' => ':Attribute darf maximal :max Kilobytes groß sein.',
'numeric' => ':Attribute darf maximal :max sein.',
'string' => ':Attribute darf maximal :max Zeichen haben.',
],
'max_digits' => ':Attribute darf maximal :max Ziffern lang sein.',
'mimes' => ':Attribute muss den Dateityp :values haben.',
'mimetypes' => ':Attribute muss den Dateityp :values haben.',
'min' => [
'array' => ':Attribute muss mindestens :min Elemente haben.',
'file' => ':Attribute muss mindestens :min Kilobytes groß sein.',
'numeric' => ':Attribute muss mindestens :min sein.',
'string' => ':Attribute muss mindestens :min Zeichen lang sein.',
],
'min_digits' => ':Attribute muss mindestens :min Ziffern lang sein.',
'missing' => 'Das Feld :attribute muss fehlen.',
'missing_if' => 'Das Feld :attribute muss fehlen, wenn :other gleich :value ist.',
'missing_unless' => 'Das Feld :attribute muss fehlen, es sei denn, :other ist :value.',
'missing_with' => 'Das Feld :attribute muss fehlen, wenn :values vorhanden ist.',
'missing_with_all' => 'Das Feld :attribute muss fehlen, wenn :values vorhanden sind.',
'multiple_of' => ':Attribute muss ein Vielfaches von :value sein.',
'not_in' => 'Der gewählte Wert für :attribute ist ungültig.',
'not_regex' => ':Attribute hat ein ungültiges Format.',
'numeric' => ':Attribute muss eine Zahl sein.',
'password' => [
'letters' => ':Attribute muss mindestens einen Buchstaben beinhalten.',
'mixed' => ':Attribute muss mindestens einen Großbuchstaben und einen Kleinbuchstaben beinhalten.',
'numbers' => ':Attribute muss mindestens eine Zahl beinhalten.',
'symbols' => ':Attribute muss mindestens ein Sonderzeichen beinhalten.',
'uncompromised' => ':Attribute wurde in einem Datenleck gefunden. Bitte wählen Sie ein anderes :attribute.',
],
'present' => ':Attribute muss vorhanden sein.',
'present_if' => 'Das Feld :attribute muss vorhanden sein, wenn :other gleich :value ist.',
'present_unless' => 'Das Feld :attribute muss vorhanden sein, es sei denn, :other ist :value.',
'present_with' => 'Das Feld :attribute muss vorhanden sein, wenn :values vorhanden ist.',
'present_with_all' => 'Das Feld :attribute muss vorhanden sein, wenn :values vorhanden sind.',
'prohibited' => ':Attribute ist unzulässig.',
'prohibited_if' => ':Attribute ist unzulässig, wenn :other :value ist.',
'prohibited_if_accepted' => 'Das Feld :attribute ist unzulässig, wenn :other gewählt ist.',
'prohibited_if_declined' => 'Das Feld :attribute ist unzulässig, wenn :other abgelehnt ist.',
'prohibited_unless' => ':Attribute ist unzulässig, wenn :other nicht :values ist.',
'prohibits' => ':Attribute verbietet die Angabe von :other.',
'regex' => ':Attribute Format ist ungültig.',
'required' => ':Attribute muss ausgefüllt werden.',
'required_array_keys' => 'Dieses Feld muss Einträge enthalten für: :values.',
'required_if' => ':Attribute muss ausgefüllt werden, wenn :other den Wert :value hat.',
'required_if_accepted' => ':Attribute muss ausgefüllt werden, wenn :other gewählt ist.',
'required_if_declined' => 'Das Feld :attribute ist erforderlich, wenn :other abgelehnt wird.',
'required_unless' => ':Attribute muss ausgefüllt werden, wenn :other nicht den Wert :values hat.',
'required_with' => ':Attribute muss ausgefüllt werden, wenn :values ausgefüllt wurde.',
'required_with_all' => ':Attribute muss ausgefüllt werden, wenn :values ausgefüllt wurde.',
'required_without' => ':Attribute muss ausgefüllt werden, wenn :values nicht ausgefüllt wurde.',
'required_without_all' => ':Attribute muss ausgefüllt werden, wenn keines der Felder :values ausgefüllt wurde.',
'same' => ':Attribute und :other müssen übereinstimmen.',
'size' => [
'array' => ':Attribute muss genau :size Elemente haben.',
'file' => ':Attribute muss :size Kilobyte groß sein.',
'numeric' => ':Attribute muss gleich :size sein.',
'string' => ':Attribute muss :size Zeichen lang sein.',
],
'starts_with' => ':Attribute muss mit einem der folgenden Anfänge aufweisen: :values',
'string' => ':Attribute muss ein String sein.',
'timezone' => ':Attribute muss eine gültige Zeitzone sein.',
'ulid' => 'Die :attribute muss eine gültige ULID sein.',
'unique' => ':Attribute ist bereits vergeben.',
'uploaded' => ':Attribute konnte nicht hochgeladen werden.',
'uppercase' => ':Attribute muss in Großbuchstaben sein.',
'url' => ':Attribute muss eine URL sein.',
'uuid' => ':Attribute muss ein UUID sein.',
'attributes' => [
'address' => 'Adresse',
'affiliate_url' => 'Affiliate-URL',
'age' => 'Alter',
'amount' => 'Höhe',
'announcement' => 'Bekanntmachung',
'area' => 'Gebiet',
'audience_prize' => 'Publikumspreis',
'audience_winner' => 'Publikumsgewinner',
'available' => 'Verfügbar',
'birthday' => 'Geburtstag',
'body' => 'Körper',
'city' => 'Stadt',
'color' => 'Farbe',
'company' => 'Unternehmen',
'compilation' => 'Zusammenstellung',
'concept' => 'Konzept',
'conditions' => 'Bedingungen',
'content' => 'Inhalt',
'contest' => 'Wettbewerb',
'country' => 'Land',
'cover' => 'Abdeckung',
'created_at' => 'Erstellt am',
'creator' => 'Ersteller',
'currency' => 'Währung',
'current_password' => 'Derzeitiges Passwort',
'customer' => 'Kunde',
'date' => 'Datum',
'date_of_birth' => 'Geburtsdatum',
'dates' => 'Termine',
'day' => 'Tag',
'deleted_at' => 'Gelöscht am',
'description' => 'Beschreibung',
'display_type' => 'Anzeigetyp',
'district' => 'Bezirk',
'duration' => 'Dauer',
'email' => 'E-Mail-Adresse',
'excerpt' => 'Auszug',
'filter' => 'Filter',
'finished_at' => 'fertig um',
'first_name' => 'Vorname',
'gender' => 'Geschlecht',
'grand_prize' => 'Hauptpreis',
'group' => 'Gruppe',
'hour' => 'Stunde',
'image' => 'Bild',
'image_desktop' => 'Desktop-Bild',
'image_main' => 'Hauptbild',
'image_mobile' => 'mobiles Bild',
'images' => 'Bilder',
'is_audience_winner' => 'ist Publikumssieger',
'is_hidden' => 'ist versteckt',
'is_subscribed' => 'ist abonniert',
'is_visible' => 'ist sichtbar',
'is_winner' => 'ist Gewinner',
'items' => 'Artikel',
'key' => 'Schlüssel',
'last_name' => 'Nachname',
'lesson' => 'Lektion',
'line_address_1' => 'Adresszeile 1',
'line_address_2' => 'Adresszeile 2',
'login' => 'Anmeldung',
'message' => 'Nachricht',
'middle_name' => 'Zweitname',
'minute' => 'Minute',
'mobile' => 'Handynummer',
'month' => 'Monat',
'name' => 'Name',
'national_code' => 'Länderkennung',
'number' => 'Nummer',
'password' => 'Passwort',
'password_confirmation' => 'Passwortbestätigung',
'phone' => 'Telefonnummer',
'photo' => 'Foto',
'portfolio' => 'Portfolio',
'postal_code' => 'Postleitzahl',
'preview' => 'Vorschau',
'price' => 'Preis',
'product_id' => 'Produkt ID',
'product_uid' => 'Produkt-UID',
'product_uuid' => 'Produkt-UUID',
'promo_code' => 'Aktionscode',
'province' => 'Provinz',
'quantity' => 'Menge',
'reason' => 'Grund',
'recaptcha_response_field' => 'Captcha-Feld',
'referee' => 'Schiedsrichter',
'referees' => 'Schiedsrichter',
'region' => 'Region',
'reject_reason' => 'Ablehnungsgrund',
'remember' => 'Erinnern',
'restored_at' => 'Wiederhergestellt am',
'result_text_under_image' => 'Ergebnistext unter Bild',
'role' => 'Rolle',
'rule' => 'Regel',
'rules' => 'Regeln',
'second' => 'Sekunde',
'sex' => 'Geschlecht',
'shipment' => 'Sendung',
'short_text' => 'Kurzer Text',
'size' => 'Größe',
'skills' => 'Fähigkeiten',
'slug' => 'Schnecke',
'specialization' => 'Spezialisierung',
'started_at' => 'fing an bei',
'state' => 'Bundesland',
'status' => 'Status',
'street' => 'Straße',
'student' => 'Schüler/Student',
'subject' => 'Gegenstand',
'tag' => 'Etikett',
'tags' => 'Stichworte',
'teacher' => 'Lehrer',
'terms' => 'Bedingungen',
'test_description' => 'Test Beschreibung',
'test_locale' => 'Test Region',
'test_name' => 'Testname',
'text' => 'Text',
'time' => 'Uhrzeit',
'title' => 'Titel',
'type' => 'Typ',
'updated_at' => 'Aktualisiert am',
'user' => 'Benutzer',
'username' => 'Benutzername',
'value' => 'Wert',
'winner' => 'Gewinner',
'work' => 'Arbeit',
'year' => 'Jahr',
],
];
+424
View File
@@ -0,0 +1,424 @@
{
"(and :count more error)": "(and :count more error)",
"(and :count more errors)": "(and :count more error)|(and :count more errors)|(and :count more errors)",
"2FA recovery codes": "2FA recovery codes",
":action to join the \":team\" team.": ":action to join the \":team\" team.",
":inviter invited you to join this team.": ":inviter invited you to join this team.",
":inviterName has invited you to join the :teamName team.": ":inviterName has invited you to join the :teamName team.",
"A decryption key is required.": "A decryption key is required.",
"A new verification link has been sent to the email address you provided during registration.": "A new verification link has been sent to the email address you provided during registration.",
"A new verification link has been sent to your email address.": "A new verification link has been sent to your email address.",
"A Timeout Occurred": "A Timeout Occurred",
"Accept": "Accept",
"Accept or decline the teams you have been invited to join.": "Accept or decline the teams you have been invited to join.",
"Accepted": "Accepted",
"Action": "Action",
"Actions": "Actions",
"Add": "Add",
"Add :name": "Add :name",
"Add a passkey to sign in without a password": "Add a passkey to sign in without a password",
"Add passkey": "Add passkey",
"Added :time": "Added :time",
"Admin": "Admin",
"Agree": "Agree",
"All rights reserved.": "All rights reserved.",
"Already have an account?": "Already have an account?",
"Already Reported": "Already Reported",
"An invitation has already been sent to this email address.": "An invitation has already been sent to this email address.",
"Appearance": "Appearance",
"Appearance settings": "Appearance settings",
"Archive": "Archive",
"Are you sure you want to cancel the invitation for :email?": "Are you sure you want to cancel the invitation for :email?",
"Are you sure you want to delete your account?": "Are you sure you want to delete your account?",
"Are you sure you want to leave :name?": "Are you sure you want to leave :name?",
"Are you sure you want to remove :name from this team?": "Are you sure you want to remove :name from this team?",
"Are you sure you want to remove the passkey \":name\"? You will no longer be able to use it to sign in.": "Are you sure you want to remove the passkey \":name\"? You will no longer be able to use it to sign in.",
"Are you sure?": "Are you sure?",
"Assign": "Assign",
"Associate": "Associate",
"Attach": "Attach",
"Authenticating...": "Authenticating...",
"Authentication code": "Authentication code",
"Back": "Back",
"Bad Gateway": "Bad Gateway",
"Bad Request": "Bad Request",
"Bandwidth Limit Exceeded": "Bandwidth Limit Exceeded",
"Browse": "Browse",
"Cancel": "Cancel",
"Cancel invitation": "Cancel invitation",
"Choose": "Choose",
"Choose :name": "Choose :name",
"Choose File": "Choose File",
"Choose Image": "Choose Image",
"Click here to re-send the verification email.": "Click here to re-send the verification email.",
"Click to copy": "Click to copy",
"Client Closed Request": "Client Closed Request",
"Close": "Close",
"Collapse": "Collapse",
"Collapse All": "Collapse All",
"Comment": "Comment",
"Confirm": "Confirm",
"Confirm password": "Confirm password",
"Confirm with passkey": "Confirm with passkey",
"Confirming...": "Confirming...",
"Conflict": "Conflict",
"Connect": "Connect",
"Connection Closed Without Response": "Connection Closed Without Response",
"Connection Timed Out": "Connection Timed Out",
"Continue": "Continue",
"Create": "Create",
"Create :name": "Create :name",
"Create a new team": "Create a new team",
"Create account": "Create account",
"Create an account": "Create an account",
"Create team": "Create team",
"Created": "Created",
"Current password": "Current password",
"Dark": "Dark",
"Dashboard": "Dashboard",
"Decline": "Decline",
"Delete": "Delete",
"Delete :name": "Delete :name",
"Delete account": "Delete account",
"Delete team": "Delete team",
"Delete your account and all of its resources": "Delete your account and all of its resources",
"Detach": "Detach",
"Details": "Details",
"Disable": "Disable",
"Disable 2FA": "Disable 2FA",
"Discard": "Discard",
"Documentation": "Documentation",
"Don't have an account?": "Don't have an account?",
"Done": "Done",
"Down": "Down",
"Duplicate": "Duplicate",
"Duplicate :name": "Duplicate :name",
"e.g., MacBook Pro, iPhone": "e.g., MacBook Pro, iPhone",
"Each recovery code can be used once to access your account and will be removed after use. If you need more, click Regenerate codes above.": "Each recovery code can be used once to access your account and will be removed after use. If you need more, click Regenerate codes above.",
"Edit": "Edit",
"Edit :name": "Edit :name",
"Edit team": "Edit team",
"Email": "Email",
"Email address": "Email address",
"Email password reset link": "Email password reset link",
"Email verification": "Email verification",
"Enable": "Enable",
"Enable 2FA": "Enable 2FA",
"Enable two-factor authentication": "Enable two-factor authentication",
"Encrypted environment file already exists.": "Encrypted environment file already exists.",
"Encrypted environment file not found.": "Encrypted environment file not found.",
"Ensure your account is using a long, random password to stay secure": "Ensure your account is using a long, random password to stay secure",
"Enter the 6-digit code from your authenticator app.": "Enter the 6-digit code from your authenticator app.",
"Enter the authentication code provided by your authenticator application.": "Enter the authentication code provided by your authenticator application.",
"Enter your details below to create your account": "Enter your details below to create your account",
"Enter your email and password below to log in": "Enter your email and password below to log in",
"Enter your email to receive a password reset link": "Enter your email to receive a password reset link",
"Environment file already exists.": "Environment file already exists.",
"Environment file not found.": "Environment file not found.",
"errors": "errors",
"Expand": "Expand",
"Expand All": "Expand All",
"Expectation Failed": "Expectation Failed",
"Explanation": "Explanation",
"Export": "Export",
"Export :name": "Export :name",
"Failed Dependency": "Failed Dependency",
"File": "File",
"Files": "Files",
"Forbidden": "Forbidden",
"Forgot password": "Forgot password",
"Forgot your password?": "Forgot your password?",
"Found": "Found",
"Full name": "Full name",
"Gateway Timeout": "Gateway Timeout",
"Give this passkey a name to help you identify it later.": "Give this passkey a name to help you identify it later.",
"Give your team a name to get started.": "Give your team a name to get started.",
"Go Home": "Go Home",
"Go to page :page": "Go to page :page",
"Gone": "Gone",
"Hello!": "Hello!",
"Hide": "Hide",
"Hide :name": "Hide :name",
"Hide recovery codes": "Hide recovery codes",
"Home": "Home",
"HTTP Version Not Supported": "HTTP Version Not Supported",
"I'm a teapot": "I'm a teapot",
"If you did not create an account, no further action is required.": "If you did not create an account, no further action is required.",
"If you did not request a password reset, no further action is required.": "If you did not request a password reset, no further action is required.",
"If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:",
"IM Used": "IM Used",
"Image": "Image",
"Impersonate": "Impersonate",
"Impersonation": "Impersonation",
"Import": "Import",
"Import :name": "Import :name",
"Insufficient Storage": "Insufficient Storage",
"Internal Server Error": "Internal Server Error",
"Introduction": "Introduction",
"Invalid credential format.": "Invalid credential format.",
"Invalid filename.": "Invalid filename.",
"Invalid JSON was returned from the route.": "Invalid JSON was returned from the route.",
"Invalid SSL Certificate": "Invalid SSL Certificate",
"Invitation accepted.": "Invitation accepted.",
"Invitation cancelled.": "Invitation cancelled.",
"Invitation declined.": "Invitation declined.",
"Invitation sent.": "Invitation sent.",
"Invitations that have not been accepted yet": "Invitations that have not been accepted yet",
"Invite a team member": "Invite a team member",
"Invite member": "Invite member",
"Keep invitation": "Keep invitation",
"Last used :time": "Last used :time",
"Leave team": "Leave team",
"Length Required": "Length Required",
"Light": "Light",
"Like": "Like",
"Load": "Load",
"Localize": "Localize",
"Location": "Location",
"Locked": "Locked",
"Log In": "Log In",
"Log in": "Log in",
"log in": "log in",
"Log in and visit your dashboard to accept or decline this invitation.": "Log in and visit your dashboard to accept or decline this invitation.",
"Log in to your account": "Log in to your account",
"Log Out": "Log Out",
"Log out": "Log out",
"Login": "Login",
"login using a recovery code": "login using a recovery code",
"login using an authentication code": "login using an authentication code",
"Logout": "Logout",
"Loop Detected": "Loop Detected",
"Maintenance Mode": "Maintenance Mode",
"Manage who belongs to this team": "Manage who belongs to this team",
"Manage your passkeys for passwordless sign-in": "Manage your passkeys for passwordless sign-in",
"Manage your profile and account settings": "Manage your profile and account settings",
"Manage your team settings": "Manage your team settings",
"Manage your teams and team memberships": "Manage your teams and team memberships",
"Manage your two-factor authentication settings": "Manage your two-factor authentication settings",
"Member removed.": "Member removed.",
"Member role updated.": "Member role updated.",
"Method Not Allowed": "Method Not Allowed",
"Misdirected Request": "Misdirected Request",
"Moved Permanently": "Moved Permanently",
"Multi-Status": "Multi-Status",
"Multiple Choices": "Multiple Choices",
"Name": "Name",
"Network Authentication Required": "Network Authentication Required",
"Network Connect Timeout Error": "Network Connect Timeout Error",
"Network Read Timeout Error": "Network Read Timeout Error",
"New": "New",
"New :name": "New :name",
"New password": "New password",
"New team": "New team",
"No": "No",
"No Content": "No Content",
"No passkeys yet": "No passkeys yet",
"Non-Authoritative Information": "Non-Authoritative Information",
"Not Acceptable": "Not Acceptable",
"Not Extended": "Not Extended",
"Not Found": "Not Found",
"Not Implemented": "Not Implemented",
"Not Modified": "Not Modified",
"of": "of",
"OK": "OK",
"Once your account is deleted, all of its resources and data will also be permanently deleted. Please confirm you would like to permanently delete your account.": "Once your account is deleted, all of its resources and data will also be permanently deleted. Please confirm you would like to permanently delete your account.",
"Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.",
"Open": "Open",
"Open in a current window": "Open in a current window",
"Open in a new window": "Open in a new window",
"Open in a parent frame": "Open in a parent frame",
"Open in the topmost frame": "Open in the topmost frame",
"Open on the website": "Open on the website",
"Or confirm with password": "Or confirm with password",
"Or continue with email": "Or continue with email",
"or you can": "or you can",
"or, enter the code manually": "or, enter the code manually",
"Or, return to": "Or, return to",
"Origin Is Unreachable": "Origin Is Unreachable",
"Page Expired": "Page Expired",
"Pagination Navigation": "Pagination Navigation",
"Partial Content": "Partial Content",
"Passkey name": "Passkey name",
"Passkey not recognized. It may have been removed from your account.": "Passkey not recognized. It may have been removed from your account.",
"Passkey registration session expired. Please try again.": "Passkey registration session expired. Please try again.",
"Passkey verification session expired. Please try again.": "Passkey verification session expired. Please try again.",
"Passkeys": "Passkeys",
"Passkeys are not supported in this browser.": "Passkeys are not supported in this browser.",
"Password": "Password",
"Password updated.": "Password updated.",
"Payload Too Large": "Payload Too Large",
"Payment Required": "Payment Required",
"Pending invitations": "Pending invitations",
"Pending team invitations": "Pending team invitations",
"Permanent Redirect": "Permanent Redirect",
"Permanently delete your team": "Permanently delete your team",
"Personal": "Personal",
"Platform": "Platform",
"Please click the button below to verify your email address.": "Please click the button below to verify your email address.",
"Please confirm access to your account by entering one of your emergency recovery codes.": "Please confirm access to your account by entering one of your emergency recovery codes.",
"Please enter your new password below": "Please enter your new password below",
"Please proceed with caution, this cannot be undone.": "Please proceed with caution, this cannot be undone.",
"Please verify your email address by clicking on the link we just emailed to you.": "Please verify your email address by clicking on the link we just emailed to you.",
"Precondition Failed": "Precondition Failed",
"Precondition Required": "Precondition Required",
"Preview": "Preview",
"Price": "Price",
"Processing": "Processing",
"Profile": "Profile",
"Profile settings": "Profile settings",
"Profile updated.": "Profile updated.",
"Proxy Authentication Required": "Proxy Authentication Required",
"Railgun Error": "Railgun Error",
"Range Not Satisfiable": "Range Not Satisfiable",
"Record": "Record",
"Recovery code": "Recovery code",
"Recovery codes": "Recovery codes",
"Recovery codes let you regain access if you lose your 2FA device. Store them in a secure password manager.": "Recovery codes let you regain access if you lose your 2FA device. Store them in a secure password manager.",
"Regards,": "Regards,",
"Regenerate codes": "Regenerate codes",
"Register": "Register",
"Register passkey": "Register passkey",
"Registering...": "Registering...",
"Remember me": "Remember me",
"Remove member": "Remove member",
"Remove passkey": "Remove passkey",
"Remove team member": "Remove team member",
"Repository": "Repository",
"Request Header Fields Too Large": "Request Header Fields Too Large",
"Request Timeout": "Request Timeout",
"Resend verification email": "Resend verification email",
"Reset Content": "Reset Content",
"Reset Password": "Reset Password",
"Reset password": "Reset password",
"Reset your password": "Reset your password",
"Restore": "Restore",
"Restore :name": "Restore :name",
"results": "results",
"Retry With": "Retry With",
"Role": "Role",
"Save": "Save",
"Save & Close": "Save & Close",
"Save & Return": "Save & Return",
"Save :name": "Save :name",
"Search": "Search",
"Search :name": "Search :name",
"Security": "Security",
"Security settings": "Security settings",
"See Other": "See Other",
"Select": "Select",
"Select All": "Select All",
"Select team": "Select team",
"Send": "Send",
"Send an invitation to join this team.": "Send an invitation to join this team.",
"Send invitation": "Send invitation",
"Server Error": "Server Error",
"Service Unavailable": "Service Unavailable",
"Session Has Expired": "Session Has Expired",
"Settings": "Settings",
"Show": "Show",
"Show :name": "Show :name",
"Show All": "Show All",
"Showing": "Showing",
"Sign In": "Sign In",
"Sign in with a passkey": "Sign in with a passkey",
"Sign up": "Sign up",
"Solve": "Solve",
"SSL Handshake Failed": "SSL Handshake Failed",
"Start": "Start",
"Stop": "Stop",
"Submit": "Submit",
"Subscribe": "Subscribe",
"Switch": "Switch",
"Switch To Role": "Switch To Role",
"Switching Protocols": "Switching Protocols",
"System": "System",
"Tag": "Tag",
"Tags": "Tags",
"Team created.": "Team created.",
"Team deleted.": "Team deleted.",
"Team members": "Team members",
"Team name": "Team name",
"Team updated.": "Team updated.",
"Teams": "Teams",
"Temporary Redirect": "Temporary Redirect",
"The :attribute must be at least :length characters and contain at least one number.": "The :attribute must be at least :length characters and contain at least one number.",
"The :attribute must be at least :length characters and contain at least one special character and one number.": "The :attribute must be at least :length characters and contain at least one special character and one number.",
"The :attribute must be at least :length characters and contain at least one special character.": "The :attribute must be at least :length characters and contain at least one special character.",
"The :attribute must be at least :length characters and contain at least one uppercase character and one number.": "The :attribute must be at least :length characters and contain at least one uppercase character and one number.",
"The :attribute must be at least :length characters and contain at least one uppercase character and one special character.": "The :attribute must be at least :length characters and contain at least one uppercase character and one special character.",
"The :attribute must be at least :length characters and contain at least one uppercase character, one number, and one special character.": "The :attribute must be at least :length characters and contain at least one uppercase character, one number, and one special character.",
"The :attribute must be at least :length characters and contain at least one uppercase character.": "The :attribute must be at least :length characters and contain at least one uppercase character.",
"The :attribute must be at least :length characters.": "The :attribute must be at least :length characters.",
"The existing encrypted environment file is not in readable format. Use --force to overwrite it.": "The existing encrypted environment file is not in readable format. Use --force to overwrite it.",
"The existing encryption key is required to update the encrypted environment file.": "The existing encryption key is required to update the encrypted environment file.",
"The given data was invalid.": "The given data was invalid.",
"The provided password does not match your current password.": "The provided password does not match your current password.",
"The provided password was incorrect.": "The provided password was incorrect.",
"The provided two factor authentication code was invalid.": "The provided two factor authentication code was invalid.",
"The provided two factor recovery code was invalid.": "The provided two factor recovery code was invalid.",
"The response is not a streamed response.": "The response is not a streamed response.",
"The response is not a view.": "The response is not a view.",
"The team name does not match.": "The team name does not match.",
"This action cannot be undone. This will permanently delete the team \":name\".": "This action cannot be undone. This will permanently delete the team \":name\".",
"This action is unauthorized.": "This action is unauthorized.",
"This invitation has already been accepted.": "This invitation has already been accepted.",
"This invitation has expired.": "This invitation has expired.",
"This invitation was sent to a different email address.": "This invitation was sent to a different email address.",
"This is a secure area of the application. Please confirm your password before continuing.": "This is a secure area of the application. Please confirm your password before continuing.",
"This password reset link will expire in :count minutes.": "This password reset link will expire in :count minutes.",
"This team name is reserved and cannot be used.": "This team name is reserved and cannot be used.",
"This user is already a member of the team.": "This user is already a member of the team.",
"to": "to",
"To finish enabling two-factor authentication, scan the QR code or enter the setup key in your authenticator app.": "To finish enabling two-factor authentication, scan the QR code or enter the setup key in your authenticator app.",
"Toggle navigation": "Toggle navigation",
"Too Early": "Too Early",
"Too Many Requests": "Too Many Requests",
"Translate": "Translate",
"Translate It": "Translate It",
"Two-factor authentication": "Two-factor authentication",
"Two-factor authentication enabled": "Two-factor authentication enabled",
"Two-factor authentication is now enabled. Scan the QR code or enter the setup key in your authenticator app.": "Two-factor authentication is now enabled. Scan the QR code or enter the setup key in your authenticator app.",
"Type \":name\" to confirm": "Type \":name\" to confirm",
"Unable to register passkey. Please try again.": "Unable to register passkey. Please try again.",
"Unable to register this passkey.": "Unable to register this passkey.",
"Unable to sign in with this account.": "Unable to sign in with this account.",
"Unable to verify passkey. Please try again.": "Unable to verify passkey. Please try again.",
"Unable to write the encrypted environment file.": "Unable to write the encrypted environment file.",
"Unauthorized": "Unauthorized",
"Unavailable For Legal Reasons": "Unavailable For Legal Reasons",
"Unknown Error": "Unknown Error",
"Unpack": "Unpack",
"Unprocessable Entity": "Unprocessable Entity",
"Unsubscribe": "Unsubscribe",
"Unsupported Media Type": "Unsupported Media Type",
"Up": "Up",
"Update": "Update",
"Update :name": "Update :name",
"Update password": "Update password",
"Update the appearance settings for your account": "Update the appearance settings for your account",
"Update your name and email address": "Update your name and email address",
"Upgrade Required": "Upgrade Required",
"URI Too Long": "URI Too Long",
"Use Proxy": "Use Proxy",
"User": "User",
"Variant Also Negotiates": "Variant Also Negotiates",
"Verify authentication code": "Verify authentication code",
"Verify Email Address": "Verify Email Address",
"Verify your email address": "Verify your email address",
"View": "View",
"View :name": "View :name",
"View recovery codes": "View recovery codes",
"View team": "View team",
"Warning": "Warning",
"Web Server is Down": "Web Server is Down",
"Welcome": "Welcome",
"When you enable two-factor authentication, you will be prompted for a secure pin during login. This pin can be retrieved from a TOTP-supported application on your phone.": "When you enable two-factor authentication, you will be prompted for a secure pin during login. This pin can be retrieved from a TOTP-supported application on your phone.",
"Whoops!": "Whoops!",
"Yes": "Yes",
"You are receiving this email because we received a password reset request for your account.": "You are receiving this email because we received a password reset request for your account.",
"You don't belong to any teams yet.": "You don't belong to any teams yet.",
"You left the team \":name\"": "You left the team \":name\"",
"You will be prompted for a secure, random pin during login, which you can retrieve from the TOTP-supported application on your phone.": "You will be prompted for a secure, random pin during login, which you can retrieve from the TOTP-supported application on your phone.",
"You've been invited to join :teamName": "You've been invited to join :teamName",
"Your email address is unverified.": "Your email address is unverified."
}
+119
View File
@@ -0,0 +1,119 @@
<?php
declare(strict_types=1);
return [
'accept' => 'Accept',
'action' => 'Action',
'actions' => 'Actions',
'add' => 'Add',
'admin' => 'Admin',
'agree' => 'Agree',
'archive' => 'Archive',
'assign' => 'Assign',
'associate' => 'Associate',
'attach' => 'Attach',
'browse' => 'Browse',
'cancel' => 'Cancel',
'choose' => 'Choose',
'choose_file' => 'Choose File',
'choose_image' => 'Choose Image',
'click_to_copy' => 'Click to copy',
'close' => 'Close',
'collapse' => 'Collapse',
'collapse_all' => 'Collapse All',
'comment' => 'Comment',
'confirm' => 'Confirm',
'connect' => 'Connect',
'create' => 'Create',
'delete' => 'Delete',
'detach' => 'Detach',
'details' => 'Details',
'disable' => 'Disable',
'discard' => 'Discard',
'done' => 'Done',
'down' => 'Down',
'duplicate' => 'Duplicate',
'edit' => 'Edit',
'enable' => 'Enable',
'expand' => 'Expand',
'expand_all' => 'Expand All',
'explanation' => 'Explanation',
'export' => 'Export',
'file' => 'File',
'files' => 'Files',
'go_home' => 'Go Home',
'hide' => 'Hide',
'home' => 'Home',
'image' => 'Image',
'impersonate' => 'Impersonate',
'impersonation' => 'Impersonation',
'import' => 'Import',
'introduction' => 'Introduction',
'like' => 'Like',
'load' => 'Load',
'localize' => 'Localize',
'log_in' => 'Log In',
'log_out' => 'Log Out',
'named' => [
'add' => 'Add :name',
'choose' => 'Choose :name',
'create' => 'Create :name',
'delete' => 'Delete :name',
'duplicate' => 'Duplicate :name',
'edit' => 'Edit :name',
'export' => 'Export :name',
'hide' => 'Hide :name',
'import' => 'Import :name',
'new' => 'New :name',
'restore' => 'Restore :name',
'save' => 'Save :name',
'search' => 'Search :name',
'show' => 'Show :name',
'update' => 'Update :name',
'view' => 'View :name',
],
'new' => 'New',
'no' => 'No',
'open' => 'Open',
'open_website' => 'Open on the website',
'preview' => 'Preview',
'price' => 'Price',
'record' => 'Record',
'restore' => 'Restore',
'save' => 'Save',
'save_and_close' => 'Save & Close',
'save_and_return' => 'Save & Return',
'search' => 'Search',
'select' => 'Select',
'select_all' => 'Select All',
'send' => 'Send',
'settings' => 'Settings',
'show' => 'Show',
'show_all' => 'Show All',
'sign_in' => 'Sign In',
'solve' => 'Solve',
'start' => 'Start',
'stop' => 'Stop',
'submit' => 'Submit',
'subscribe' => 'Subscribe',
'switch' => 'Switch',
'switch_to_role' => 'Switch To Role',
'tag' => 'Tag',
'tags' => 'Tags',
'target_link' => [
'blank' => 'Open in a new window',
'parent' => 'Open in a parent frame',
'self' => 'Open in a current window',
'top' => 'Open in the topmost frame',
],
'translate' => 'Translate',
'translate_it' => 'Translate It',
'unpack' => 'Unpack',
'unsubscribe' => 'Unsubscribe',
'up' => 'Up',
'update' => 'Update',
'user' => 'User',
'view' => 'View',
'yes' => 'Yes',
];
+9
View File
@@ -0,0 +1,9 @@
<?php
declare(strict_types=1);
return [
'failed' => 'These credentials do not match our records.',
'password' => 'The provided password is incorrect.',
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
];
+84
View File
@@ -0,0 +1,84 @@
<?php
declare(strict_types=1);
return [
'0' => 'Unknown Error',
'100' => 'Continue',
'101' => 'Switching Protocols',
'102' => 'Processing',
'200' => 'OK',
'201' => 'Created',
'202' => 'Accepted',
'203' => 'Non-Authoritative Information',
'204' => 'No Content',
'205' => 'Reset Content',
'206' => 'Partial Content',
'207' => 'Multi-Status',
'208' => 'Already Reported',
'226' => 'IM Used',
'300' => 'Multiple Choices',
'301' => 'Moved Permanently',
'302' => 'Found',
'303' => 'See Other',
'304' => 'Not Modified',
'305' => 'Use Proxy',
'307' => 'Temporary Redirect',
'308' => 'Permanent Redirect',
'400' => 'Bad Request',
'401' => 'Unauthorized',
'402' => 'Payment Required',
'403' => 'Forbidden',
'404' => 'Not Found',
'405' => 'Method Not Allowed',
'406' => 'Not Acceptable',
'407' => 'Proxy Authentication Required',
'408' => 'Request Timeout',
'409' => 'Conflict',
'410' => 'Gone',
'411' => 'Length Required',
'412' => 'Precondition Failed',
'413' => 'Payload Too Large',
'414' => 'URI Too Long',
'415' => 'Unsupported Media Type',
'416' => 'Range Not Satisfiable',
'417' => 'Expectation Failed',
'418' => 'I\'m a teapot',
'419' => 'Session Has Expired',
'421' => 'Misdirected Request',
'422' => 'Unprocessable Entity',
'423' => 'Locked',
'424' => 'Failed Dependency',
'425' => 'Too Early',
'426' => 'Upgrade Required',
'428' => 'Precondition Required',
'429' => 'Too Many Requests',
'431' => 'Request Header Fields Too Large',
'444' => 'Connection Closed Without Response',
'449' => 'Retry With',
'451' => 'Unavailable For Legal Reasons',
'499' => 'Client Closed Request',
'500' => 'Internal Server Error',
'501' => 'Not Implemented',
'502' => 'Bad Gateway',
'503' => 'Maintenance Mode',
'504' => 'Gateway Timeout',
'505' => 'HTTP Version Not Supported',
'506' => 'Variant Also Negotiates',
'507' => 'Insufficient Storage',
'508' => 'Loop Detected',
'509' => 'Bandwidth Limit Exceeded',
'510' => 'Not Extended',
'511' => 'Network Authentication Required',
'520' => 'Unknown Error',
'521' => 'Web Server is Down',
'522' => 'Connection Timed Out',
'523' => 'Origin Is Unreachable',
'524' => 'A Timeout Occurred',
'525' => 'SSL Handshake Failed',
'526' => 'Invalid SSL Certificate',
'527' => 'Railgun Error',
'598' => 'Network Read Timeout Error',
'599' => 'Network Connect Timeout Error',
'unknownError' => 'Unknown Error',
];
+8
View File
@@ -0,0 +1,8 @@
<?php
declare(strict_types=1);
return [
'next' => 'Next &raquo;',
'previous' => '&laquo; Previous',
];
+11
View File
@@ -0,0 +1,11 @@
<?php
declare(strict_types=1);
return [
'reset' => 'Your password has been reset.',
'sent' => 'We have emailed your password reset link.',
'throttled' => 'Please wait before retrying.',
'token' => 'This password reset token is invalid.',
'user' => 'We can\'t find a user with that email address.',
];
+290
View File
@@ -0,0 +1,290 @@
<?php
declare(strict_types=1);
return [
'accepted' => 'The :attribute field must be accepted.',
'accepted_if' => 'The :attribute field must be accepted when :other is :value.',
'active_url' => 'The :attribute field must be a valid URL.',
'after' => 'The :attribute field must be a date after :date.',
'after_or_equal' => 'The :attribute field must be a date after or equal to :date.',
'alpha' => 'The :attribute field must only contain letters.',
'alpha_dash' => 'The :attribute field must only contain letters, numbers, dashes, and underscores.',
'alpha_num' => 'The :attribute field must only contain letters and numbers.',
'any_of' => 'The :attribute field is invalid.',
'array' => 'The :attribute field must be an array.',
'array_keys' => 'The :attribute field must only contain the following keys: :values.',
'ascii' => 'The :attribute field must only contain single-byte alphanumeric characters and symbols.',
'base64' => 'The :attribute field must be a valid Base64 string.',
'before' => 'The :attribute field must be a date before :date.',
'before_or_equal' => 'The :attribute field must be a date before or equal to :date.',
'between' => [
'array' => 'The :attribute field must have between :min and :max items.',
'file' => 'The :attribute field must be between :min and :max kilobytes.',
'numeric' => 'The :attribute field must be between :min and :max.',
'string' => 'The :attribute field must be between :min and :max characters.',
],
'boolean' => 'The :attribute field must be true or false.',
'can' => 'The :attribute field contains an unauthorized value.',
'confirmed' => 'The :attribute field confirmation does not match.',
'contains' => 'The :attribute field is missing a required value.',
'current_password' => 'The password is incorrect.',
'date' => 'The :attribute field must be a valid date.',
'date_equals' => 'The :attribute field must be a date equal to :date.',
'date_format' => 'The :attribute field must match the format :format.',
'decimal' => 'The :attribute field must have :decimal decimal places.',
'declined' => 'The :attribute field must be declined.',
'declined_if' => 'The :attribute field must be declined when :other is :value.',
'different' => 'The :attribute field and :other must be different.',
'digits' => 'The :attribute field must be :digits digits.',
'digits_between' => 'The :attribute field must be between :min and :max digits.',
'dimensions' => 'The :attribute field has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'doesnt_contain' => 'The :attribute field must not contain any of the following: :values.',
'doesnt_end_with' => 'The :attribute field must not end with one of the following: :values.',
'doesnt_start_with' => 'The :attribute field must not start with one of the following: :values.',
'email' => 'The :attribute field must be a valid email address.',
'encoding' => 'The :attribute field must be encoded in :encoding.',
'ends_with' => 'The :attribute field must end with one of the following: :values.',
'enum' => 'The selected :attribute is invalid.',
'exists' => 'The selected :attribute is invalid.',
'extensions' => 'The :attribute field must have one of the following extensions: :values.',
'file' => 'The :attribute field must be a file.',
'filled' => 'The :attribute field must have a value.',
'gt' => [
'array' => 'The :attribute field must have more than :value items.',
'file' => 'The :attribute field must be greater than :value kilobytes.',
'numeric' => 'The :attribute field must be greater than :value.',
'string' => 'The :attribute field must be greater than :value characters.',
],
'gte' => [
'array' => 'The :attribute field must have :value items or more.',
'file' => 'The :attribute field must be greater than or equal to :value kilobytes.',
'numeric' => 'The :attribute field must be greater than or equal to :value.',
'string' => 'The :attribute field must be greater than or equal to :value characters.',
],
'hex_color' => 'The :attribute field must be a valid hexadecimal color.',
'image' => 'The :attribute field must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field must exist in :other.',
'in_array_keys' => 'The :attribute field must contain at least one of the following keys: :values.',
'integer' => 'The :attribute field must be an integer.',
'ip' => 'The :attribute field must be a valid IP address.',
'ipv4' => 'The :attribute field must be a valid IPv4 address.',
'ipv6' => 'The :attribute field must be a valid IPv6 address.',
'json' => 'The :attribute field must be a valid JSON string.',
'list' => 'The :attribute field must be a list.',
'lowercase' => 'The :attribute field must be lowercase.',
'lt' => [
'array' => 'The :attribute field must have less than :value items.',
'file' => 'The :attribute field must be less than :value kilobytes.',
'numeric' => 'The :attribute field must be less than :value.',
'string' => 'The :attribute field must be less than :value characters.',
],
'lte' => [
'array' => 'The :attribute field must not have more than :value items.',
'file' => 'The :attribute field must be less than or equal to :value kilobytes.',
'numeric' => 'The :attribute field must be less than or equal to :value.',
'string' => 'The :attribute field must be less than or equal to :value characters.',
],
'mac_address' => 'The :attribute field must be a valid MAC address.',
'max' => [
'array' => 'The :attribute field must not have more than :max items.',
'file' => 'The :attribute field must not be greater than :max kilobytes.',
'numeric' => 'The :attribute field must not be greater than :max.',
'string' => 'The :attribute field must not be greater than :max characters.',
],
'max_digits' => 'The :attribute field must not have more than :max digits.',
'mimes' => 'The :attribute field must be a file of type: :values.',
'mimetypes' => 'The :attribute field must be a file of type: :values.',
'min' => [
'array' => 'The :attribute field must have at least :min items.',
'file' => 'The :attribute field must be at least :min kilobytes.',
'numeric' => 'The :attribute field must be at least :min.',
'string' => 'The :attribute field must be at least :min characters.',
],
'min_digits' => 'The :attribute field must have at least :min digits.',
'missing' => 'The :attribute field must be missing.',
'missing_if' => 'The :attribute field must be missing when :other is :value.',
'missing_unless' => 'The :attribute field must be missing unless :other is :value.',
'missing_with' => 'The :attribute field must be missing when :values is present.',
'missing_with_all' => 'The :attribute field must be missing when :values are present.',
'multiple_of' => 'The :attribute field must be a multiple of :value.',
'not_in' => 'The selected :attribute is invalid.',
'not_regex' => 'The :attribute field format is invalid.',
'numeric' => 'The :attribute field must be a number.',
'password' => [
'letters' => 'The :attribute field must contain at least one letter.',
'mixed' => 'The :attribute field must contain at least one uppercase and one lowercase letter.',
'numbers' => 'The :attribute field must contain at least one number.',
'symbols' => 'The :attribute field must contain at least one symbol.',
'uncompromised' => 'The given :attribute has appeared in a data leak. Please choose a different :attribute.',
],
'present' => 'The :attribute field must be present.',
'present_if' => 'The :attribute field must be present when :other is :value.',
'present_unless' => 'The :attribute field must be present unless :other is :value.',
'present_with' => 'The :attribute field must be present when :values is present.',
'present_with_all' => 'The :attribute field must be present when :values are present.',
'prohibited' => 'The :attribute field is prohibited.',
'prohibited_if' => 'The :attribute field is prohibited when :other is :value.',
'prohibited_if_accepted' => 'The :attribute field is prohibited when :other is accepted.',
'prohibited_if_declined' => 'The :attribute field is prohibited when :other is declined.',
'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.',
'prohibits' => 'The :attribute field prohibits :other from being present.',
'regex' => 'The :attribute field format is invalid.',
'required' => 'The :attribute field is required.',
'required_array_keys' => 'The :attribute field must contain entries for: :values.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_if_accepted' => 'The :attribute field is required when :other is accepted.',
'required_if_declined' => 'The :attribute field is required when :other is declined.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values are present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute field must match :other.',
'size' => [
'array' => 'The :attribute field must contain :size items.',
'file' => 'The :attribute field must be :size kilobytes.',
'numeric' => 'The :attribute field must be :size.',
'string' => 'The :attribute field must be :size characters.',
],
'starts_with' => 'The :attribute field must start with one of the following: :values.',
'string' => 'The :attribute field must be a string.',
'timezone' => 'The :attribute field must be a valid timezone.',
'ulid' => 'The :attribute field must be a valid ULID.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'uppercase' => 'The :attribute field must be uppercase.',
'url' => 'The :attribute field must be a valid URL.',
'uuid' => 'The :attribute field must be a valid UUID.',
'attributes' => [
'address' => 'address',
'affiliate_url' => 'affiliate URL',
'age' => 'age',
'amount' => 'amount',
'announcement' => 'announcement',
'area' => 'area',
'audience_prize' => 'audience prize',
'audience_winner' => 'audience winner',
'available' => 'available',
'birthday' => 'birthday',
'body' => 'body',
'city' => 'city',
'color' => 'color',
'company' => 'company',
'compilation' => 'compilation',
'concept' => 'concept',
'conditions' => 'conditions',
'content' => 'content',
'contest' => 'contest',
'country' => 'country',
'cover' => 'cover',
'created_at' => 'created at',
'creator' => 'creator',
'currency' => 'currency',
'current_password' => 'current password',
'customer' => 'customer',
'date' => 'date',
'date_of_birth' => 'date of birth',
'dates' => 'dates',
'day' => 'day',
'deleted_at' => 'deleted at',
'description' => 'description',
'display_type' => 'display type',
'district' => 'district',
'duration' => 'duration',
'email' => 'email',
'excerpt' => 'excerpt',
'filter' => 'filter',
'finished_at' => 'finished at',
'first_name' => 'first name',
'gender' => 'gender',
'grand_prize' => 'grand prize',
'group' => 'group',
'hour' => 'hour',
'image' => 'image',
'image_desktop' => 'desktop image',
'image_main' => 'main image',
'image_mobile' => 'mobile image',
'images' => 'images',
'is_audience_winner' => 'is audience winner',
'is_hidden' => 'is hidden',
'is_subscribed' => 'is subscribed',
'is_visible' => 'is visible',
'is_winner' => 'is winner',
'items' => 'items',
'key' => 'key',
'last_name' => 'last name',
'lesson' => 'lesson',
'line_address_1' => 'line address 1',
'line_address_2' => 'line address 2',
'login' => 'login',
'message' => 'message',
'middle_name' => 'middle name',
'minute' => 'minute',
'mobile' => 'mobile',
'month' => 'month',
'name' => 'name',
'national_code' => 'national code',
'number' => 'number',
'password' => 'password',
'password_confirmation' => 'password confirmation',
'phone' => 'phone',
'photo' => 'photo',
'portfolio' => 'portfolio',
'postal_code' => 'postal code',
'preview' => 'preview',
'price' => 'price',
'product_id' => 'product ID',
'product_uid' => 'product UID',
'product_uuid' => 'product UUID',
'promo_code' => 'promo code',
'province' => 'province',
'quantity' => 'quantity',
'reason' => 'reason',
'recaptcha_response_field' => 'recaptcha response field',
'referee' => 'referee',
'referees' => 'referees',
'region' => 'region',
'reject_reason' => 'reject reason',
'remember' => 'remember',
'restored_at' => 'restored at',
'result_text_under_image' => 'result text under image',
'role' => 'role',
'rule' => 'rule',
'rules' => 'rules',
'second' => 'second',
'sex' => 'sex',
'shipment' => 'shipment',
'short_text' => 'short text',
'size' => 'size',
'skills' => 'skills',
'slug' => 'slug',
'specialization' => 'specialization',
'started_at' => 'started at',
'state' => 'state',
'status' => 'status',
'street' => 'street',
'student' => 'student',
'subject' => 'subject',
'tag' => 'tag',
'tags' => 'tags',
'teacher' => 'teacher',
'terms' => 'terms',
'test_description' => 'test description',
'test_locale' => 'test locale',
'test_name' => 'test name',
'text' => 'text',
'time' => 'time',
'title' => 'title',
'type' => 'type',
'updated_at' => 'updated at',
'user' => 'user',
'username' => 'username',
'value' => 'value',
'winner' => 'winner',
'work' => 'work',
'year' => 'year',
],
];
+18
View File
@@ -0,0 +1,18 @@
{
"Authenticating...": "Anmeldung läuft …",
"Click here to re-send the verification email.": "Klicken Sie hier, um die Bestätigungs-E-Mail erneut zu senden.",
"Confirming...": "Bestätigung läuft …",
"Email password reset link": "Link zum Zurücksetzen senden",
"Email verification": "E-Mail-Bestätigung",
"Enable two-factor authentication": "Zwei-Faktor-Authentifizierung aktivieren",
"Language": "Sprache",
"log in": "Anmeldung",
"login using a recovery code": "sich mit einem Wiederherstellungscode anmelden",
"login using an authentication code": "sich mit einem Authentifizierungscode anmelden",
"Or, return to": "Oder zurück zur",
"Passkey name": "Name des Passkeys",
"Registering...": "Registrierung läuft …",
"Sign up": "Registrieren",
"Theme": "Farbschema",
"Your email address is unverified.": "Ihre E-Mail-Adresse ist noch nicht bestätigt."
}
+4 -1
View File
@@ -1,3 +1,6 @@
{ {
"preset": "laravel" "preset": "laravel",
"exclude": [
"lang"
]
} }
@@ -4,7 +4,21 @@
<x-heading class="sr-only">{{ __('Appearance settings') }}</x-heading> <x-heading class="sr-only">{{ __('Appearance settings') }}</x-heading>
<x-settings.layout :heading="__('Appearance')" :subheading="__('Update the appearance settings for your account')"> <x-settings.layout :heading="__('Appearance')" :subheading="__('Update the appearance settings for your account')">
<div class="space-y-8">
<div class="space-y-3">
<x-heading level="3">{{ __('Theme') }}</x-heading>
{{-- Hell / Dunkel / System; nutzt den Theme-Zustand aus tallstackui_darkTheme() am <html>-Element. --}} {{-- Hell / Dunkel / System; nutzt den Theme-Zustand aus tallstackui_darkTheme() am <html>-Element. --}}
<x-ts-theme-switch /> <x-ts-theme-switch />
</div>
<div class="max-w-xs space-y-3">
<x-heading level="3">{{ __('Language') }}</x-heading>
{{-- Sprachnamen bewusst in der jeweiligen Sprache, nicht übersetzt. --}}
<x-ts-select.native wire:model.live="locale"
:options="collect(config('app.available_locales'))->map(fn ($label, $code) => ['label' => $label, 'value' => $code])->values()->all()"
select="label:label|value:value"
data-test="locale-select" />
</div>
</div>
</x-settings.layout> </x-settings.layout>
</section> </section>
+1 -1
View File
@@ -2,7 +2,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title> <title>
{{ filled($title ?? null) ? $title.' - '.config('app.name', 'Laravel') : config('app.name', 'Laravel') }} {{ filled($title ?? null) ? __($title).' - '.config('app.name', 'Laravel') : config('app.name', 'Laravel') }}
</title> </title>
<link rel="icon" href="/favicon.ico" sizes="any"> <link rel="icon" href="/favicon.ico" sizes="any">
+82
View File
@@ -0,0 +1,82 @@
<?php
namespace Tests\Feature;
use App\Livewire\Settings\Appearance;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Livewire\Livewire;
use Tests\TestCase;
class LocaleTest extends TestCase
{
use RefreshDatabase;
public function test_german_is_the_default_language(): void
{
$this->get(route('login'))
->assertOk()
->assertSee('<html lang="de"', false)
->assertSee('Melden Sie sich bei Ihrem Konto an');
}
public function test_the_language_of_the_user_is_used(): void
{
$user = User::factory()->create(['locale' => 'en']);
$this->actingAs($user)
->get(route('profile.edit'))
->assertOk()
->assertSee('<html lang="en"', false)
->assertSee('Update your name and email address');
}
public function test_an_unknown_stored_language_falls_back_to_the_default(): void
{
$user = User::factory()->create(['locale' => 'xx']);
$this->actingAs($user)
->get(route('profile.edit'))
->assertOk()
->assertSee('<html lang="de"', false);
}
public function test_appearance_page_offers_all_languages(): void
{
$response = $this->actingAs(User::factory()->create())
->get(route('appearance.edit'))
->assertOk()
->assertSee('data-test="locale-select"', false)
->assertSee('wire:model.live="locale"', false);
foreach (config('app.available_locales') as $code => $label) {
$response->assertSee('value="'.$code.'"', false)->assertSee($label);
}
}
public function test_users_can_change_their_language(): void
{
$user = User::factory()->create();
Livewire::actingAs($user)
->test(Appearance::class)
->assertSet('locale', 'de')
->set('locale', 'en')
->assertHasNoErrors()
->assertRedirect(route('appearance.edit'));
$this->assertSame('en', $user->fresh()->locale);
}
public function test_only_offered_languages_can_be_chosen(): void
{
$user = User::factory()->create();
Livewire::actingAs($user)
->test(Appearance::class)
->set('locale', 'xx')
->assertHasErrors('locale');
$this->assertNull($user->fresh()->locale);
}
}
+8 -8
View File
@@ -39,10 +39,10 @@ class SecurityTest extends TestCase
$response->assertOk(); $response->assertOk();
$response->assertSee('Passkeys'); $response->assertSee(__('Passkeys'));
$response->assertSee('No passkeys yet'); $response->assertSee(__('No passkeys yet'));
$response->assertSee('Two-factor authentication'); $response->assertSee(__('Two-factor authentication'));
$response->assertSee('Enable 2FA'); $response->assertSee(__('Enable 2FA'));
} }
public function test_security_settings_page_requires_password_confirmation_when_enabled(): void public function test_security_settings_page_requires_password_confirmation_when_enabled(): void
@@ -65,10 +65,10 @@ class SecurityTest extends TestCase
->withSession(['auth.password_confirmed_at' => time()]) ->withSession(['auth.password_confirmed_at' => time()])
->get(route('security.edit')) ->get(route('security.edit'))
->assertOk() ->assertOk()
->assertSee('Update password') ->assertSee(__('Update password'))
->assertDontSee('Manage your passkeys for passwordless sign-in') ->assertDontSee(__('Manage your passkeys for passwordless sign-in'))
->assertDontSee('Add a passkey to sign in without a password') ->assertDontSee(__('Add a passkey to sign in without a password'))
->assertDontSee('Two-factor authentication'); ->assertDontSee(__('Two-factor authentication'));
} }
public function test_two_factor_authentication_disabled_when_confirmation_abandoned_between_requests(): void public function test_two_factor_authentication_disabled_when_confirmation_abandoned_between_requests(): void
+76
View File
@@ -0,0 +1,76 @@
<?php
namespace Tests\Unit;
use Illuminate\Support\Facades\File;
use Tests\TestCase;
/**
* Jeder Text, der im Code über __() bzw. #[Title(...)] verwendet wird, braucht für jede
* angebotene Sprache außer der Quellsprache Englisch eine Übersetzung in lang/{code}.json.
*/
class TranslationCoverageTest extends TestCase
{
public function test_every_translation_key_used_in_the_code_is_translated(): void
{
$keys = $this->translationKeysUsedInCode();
$this->assertNotEmpty($keys);
foreach (array_keys(config('app.available_locales')) as $locale) {
if ($locale === 'en') {
continue;
}
$translations = json_decode(File::get(lang_path("{$locale}.json")), true, flags: JSON_THROW_ON_ERROR);
$missing = array_values(array_diff($keys, array_keys($translations)));
$this->assertSame([], $missing, "Fehlende Übersetzungen in lang/{$locale}.json");
}
}
public function test_project_translations_are_applied(): void
{
foreach (File::glob(lang_path('project/*.json')) as $projectFile) {
$locale = pathinfo($projectFile, PATHINFO_FILENAME);
$project = json_decode(File::get($projectFile), true, flags: JSON_THROW_ON_ERROR);
$translations = json_decode(File::get(lang_path("{$locale}.json")), true, flags: JSON_THROW_ON_ERROR);
$notApplied = array_keys(array_diff_assoc($project, array_intersect_key($translations, $project)));
$this->assertSame([], $notApplied, "lang/project/{$locale}.json nicht übernommen – `sail artisan lang:apply-project` ausführen");
}
}
/**
* @return list<string>
*/
private function translationKeysUsedInCode(): array
{
$patterns = [
'/__\(\s*\'((?:[^\'\\\\]|\\\\.)*)\'/',
'/__\(\s*"((?:[^"\\\\]|\\\\.)*)"/',
'/#\[Title\(\s*\'((?:[^\'\\\\]|\\\\.)*)\'/',
];
$keys = [];
foreach ([resource_path('views'), app_path()] as $directory) {
foreach (File::allFiles($directory) as $file) {
if ($file->getExtension() !== 'php') {
continue;
}
foreach ($patterns as $pattern) {
preg_match_all($pattern, $file->getContents(), $matches);
foreach ($matches[1] as $key) {
$keys[] = stripslashes($key);
}
}
}
}
return array_values(array_unique($keys));
}
}