Skip to content

Commit

Permalink
Merge branch '5.2' into 5
Browse files Browse the repository at this point in the history
  • Loading branch information
github-actions[bot] committed Aug 7, 2024
2 parents added7b + f93c9a9 commit cdde36b
Show file tree
Hide file tree
Showing 13 changed files with 390 additions and 75 deletions.
61 changes: 60 additions & 1 deletion lang/de.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,22 @@ de:
SilverStripe\Control\RequestProcessor:
INVALID_REQUEST: 'Ungültige Anfrage'
REQUEST_ABORTED: 'Anfrage abgebrochen'
SilverStripe\Dev\DevBuildController:
CAN_DEV_BUILD_DESCRIPTION: 'Darf /dev/build ausführen'
CAN_DEV_BUILD_HELP: 'Darf den Build-Befehl ausführen (/dev/build).'
SilverStripe\Dev\DevConfigController:
CAN_DEV_CONFIG_DESCRIPTION: 'Darf /dev/config anzeigen'
CAN_DEV_CONFIG_HELP: 'Darf die gesamte Anwendungskonfiguration einsehen (/dev/config).'
SilverStripe\Dev\DevConfirmationController:
INFO_DESCRIPTION: 'Bestätige potenziell gefährliche Aktion'
INFO_TITLE: Sicherheitsbestätigung
SilverStripe\Dev\DevelopmentAdmin:
ALL_DEV_ADMIN_DESCRIPTION: 'Darf alle /dev-Endpunkte anzeigen und ausführen'
ALL_DEV_ADMIN_HELP: 'Darf alle /dev-Endpunkte anzeigen und ausführen'
PERMISSIONS_CATEGORY: 'Dev Berechtigungen'
SilverStripe\Dev\TaskRunner:
BUILDTASK_CAN_RUN_DESCRIPTION: 'Darf alle /dev/tasks anzeigen und ausführen'
BUILDTASK_CAN_RUN_HELP: 'Darf alle /dev/tasks anzeigen und ausführen (/dev/tasks). Dies kann noch durch individuelle Berechtigungen für die Tasks überschrieben werden'
SilverStripe\Forms\CheckboxField:
NOANSWER: Nein
YESANSWER: Ja
Expand All @@ -42,6 +55,7 @@ de:
CURRENT_PASSWORD_MISSING: 'Bitte geben Sie Ihr derzeitiges Passwort ein.'
LOGGED_IN_ERROR: 'Sie müssen eingeloggt sein, um Ihr Passwort ändern zu können!'
MAXIMUM: 'Passwörter dürfen maximal {max} Zeichen lang sein.'
RANDOM_IF_EMPTY: 'Wenn dieses Feld leer gelassen wird, wird automatisch ein Zufallspasswort generiert.'
SHOWONCLICKTITLE: 'Passwort ändern'
SilverStripe\Forms\DateField:
NOTSET: 'Nicht gesetzt'
Expand Down Expand Up @@ -103,14 +117,16 @@ de:
Create: Erstellen
Delete: Löschen
DeletePermissionsFailure: 'Keine Berechtigungen zum löschen'
Deleted: 'Gelöscht {type} {name}'
Deleted: 'Gelöscht {type} "{name}"'
Save: Speichern
Saved: '{name} {link} gespeichert'
SilverStripe\Forms\GridField\GridFieldDetailForm_ItemRequest:
EditPermissionsFailure: 'Sie haben nicht die nötigen Berechtigungen um {ObjectTitle} zu einer Kampagne hinzuzufügen'
NEW: 'Neuen Eintrag hinzufügen'
NEXT: 'Gehe zu nächstem Eintrag'
PREVIOUS: 'Gehe zu vorherigem Eintrag'
SAVEDUP: 'Erfolgreich gespeichert'
SAVETOASTMESSAGE: '{type} "{title}" erfolgreich gespeichert.'
ViewPermissionsFailure: 'Sie haben nicht die nötigen Berechtigungen um {ObjectTitle} aufzurufen.'
SilverStripe\Forms\GridField\GridFieldEditButton:
EDIT: Bearbeiten
Expand Down Expand Up @@ -138,18 +154,25 @@ de:
IsNullLabel: 'ist NULL'
SilverStripe\Forms\NumericField:
VALIDATION: "'{value}' ist kein numerischer Wert, nur nummerische Werte sind in diesem Feld erlaubt"
SilverStripe\Forms\SearchableDropdownTrait:
SELECT: Auswählen...
SELECT_OR_TYPE_TO_SEARCH: 'Auswählen oder tippen um zu suchen...'
TYPE_TO_SEARCH: 'Tippen um zu suchen...'
SilverStripe\Forms\TextField:
VALIDATEMAXLENGTH: 'Der für {name} eingegebene Wert darf nicht mehr als {maxLength} Zeichen lang sein'
SilverStripe\Forms\TimeField:
VALIDATEFORMAT: 'Bitte geben Sie die Uhrzeit im korrekten Format ein ({format})'
SilverStripe\Forms\UrlField:
INVALID: 'Bitte geben Sie eine gültige URL ein'
SilverStripe\ORM\DataObject:
GENERALSEARCH: 'Generelle Suche'
PLURALNAME: DatenObjekte
PLURALS:
one: 'Ein DatenObjekt'
other: '{count} DatenObjekte'
SINGULARNAME: DatenObjekt
many_many_FileTracking: Datei-Verfolgung
many_many_LinkTracking: Link-Verfolgung
SilverStripe\ORM\FieldType\DBBoolean:
ANY: alle
NOANSWER: Nein
Expand Down Expand Up @@ -233,14 +256,25 @@ de:
RolesAddEditLink: 'Rollen hinzufügen/editieren'
SINGULARNAME: Gruppe
Sort: Sortierreihenfolge
ValidationIdentifierAlreadyExists: 'Es existiert bereits eine Gruppe ({group}) mit dem selben {identifier}'
db_AccessAllSubsites: 'Zugang zu allen Unterseiten'
db_Description: Beschreibung
db_LastSynced: 'Zuletzt aktualisiert'
db_Locked: Gesperrt
db_Sort: Sortierung
db_Title: Titel
has_many_Groups: Gruppe
has_many_Permissions: Berechtigungen
has_one_Parent: Übergeordnet
many_many_Members: Mitglieder
many_many_Roles: Rollen
SilverStripe\Security\InheritedPermissionsExtension:
db_CanEditType: 'Kann Typ bearbeiten'
db_CanViewType: 'Kann Typ ansehen'
many_many_EditorGroups: Bearbeitungsgruppen
many_many_EditorMembers: Bearbeitungsnutzer
many_many_ViewerGroups: Betrachtergruppen
many_many_ViewerMembers: Betrachtungsnutzer
SilverStripe\Security\LoginAttempt:
Email: E-Mail-Adresse
EmailHashed: 'E-Mail-Adresse (gehashed)'
Expand All @@ -263,6 +297,7 @@ de:
CURRENT_PASSWORD: 'Derzeitiges Passwort'
EDIT_PASSWORD: 'Neues Passwort'
EMAIL: E-Mail
EMAIL_FAILED: 'Beim Versuch, Ihnen einen Link zum Zurücksetzen des Passworts per E-Mail zu schicken, ist ein Fehler aufgetreten.'
EMPTYNEWPASSWORD: 'Das neue Passwort darf nicht leer sein. Bitte versuchen Sie es erneut.'
ENTEREMAIL: 'Bitte geben Sie eine E-Mail-Adresse ein, um einen Link zum Zurücksetzen des Passworts zu erhalten.'
ERRORLOCKEDOUT2: 'Ihr Zugang wurde auf Grund von einer unzulässig hohen Anzahl von falschen Zugangsversuchen gesperrt. Bitte versuchen Sie es in {count} Minuten noch einmal.'
Expand All @@ -281,6 +316,7 @@ de:
PLURALS:
one: 'Ein Mitglied'
other: '{count} Mitglieder'
RequiresPasswordChangeOnNextLogin: 'Erfordert Passwortänderung bei nächster Anmeldung'
SINGULARNAME: Benutzer
SUBJECTPASSWORDCHANGED: 'Ihr Passwort wurde geändert'
SUBJECTPASSWORDRESET: 'Ihr Link zur Passwortrücksetzung'
Expand All @@ -290,15 +326,34 @@ de:
ValidationIdentifierFailed: 'Das vorhandene Mitglied #{id} mit identischer Bezeichnung kann nicht überschrieben werden ({name} = {value}))'
WELCOMEBACK: 'Hallo {firstname}. Schön, dass du wieder da bist'
YOUROLDPASSWORD: 'Ihr altes Passwort'
belongs_many_many_BlogPosts: Blogbeiträge
belongs_many_many_Groups: Gruppe
db_AccountResetExpired: 'Zurücksetzen des Kontos ist abgelaufen'
db_AccountResetHash: 'Hash zum zurücksetzen des Accounts'
db_AutoLoginExpired: 'Automatische Anmeldung abgelaufen'
db_AutoLoginHash: 'Hash für die automatische Anmeldung'
db_BlogProfileSummary: 'Zusammenfassung für das Blogprofil'
db_Email: E-Mail
db_FailedLoginCount: 'Anzahl der fehlgeschlagenen Anmeldungen'
db_FirstName: Vorname
db_HasSkippedMFARegistration: 'Hat die MFA-Registrierung übersprungen'
db_IsExpired: 'Ist abgelaufen'
db_LastSynced: 'Zuletzt aktualisiert'
db_Locale: 'Interface Sprachumgebung'
db_LockedOutUntil: 'Gesperrt bis'
db_Password: Passwort
db_PasswordEncryption: Passwortverschlüsselung
db_PasswordExpiry: 'Ablaufdatum des Passworts'
db_Salt: Salz
db_Surname: Nachname
db_URLSegment: URL-Segment
db_Username: Nutzername
has_many_LoggedPasswords: 'Protokollierte Passwörter'
has_many_LoginSessions: Login-Sitzungen
has_many_RegisteredMFAMethods: 'Registrierte MFA-Methoden'
has_one_AFile: 'Eine Datei'
has_one_AImage: 'Ein Bild'
has_one_BlogProfileImage: 'Blogprofil Bild'
SilverStripe\Security\MemberAuthenticator\CMSMemberLoginForm:
AUTHENTICATORNAME: 'CMS Benutzer Login Formular'
BUTTONFORGOTPASSWORD: 'Passwort vergessen'
Expand All @@ -316,6 +371,8 @@ de:
other: '{count} Benutzerpasswörter'
SINGULARNAME: Benutzerpasswort
db_Password: Passwort
db_PasswordEncryption: Passwortverschlüsselung
db_Salt: Salz
has_one_Member: Benutzer
SilverStripe\Security\PasswordValidator:
LOWCHARSTRENGTH: 'Bitte erhöhen Sie die Sicherheit des Passworts, indem Sie auch einige der folgenden Zeichen verwenden: {chars}'
Expand Down Expand Up @@ -363,6 +420,8 @@ de:
PLURALS:
one: 'Ein Login Hash'
other: '{count} Login Hashes'
db_DeviceID: 'Geräte ID'
db_ExpiryDate: Ablaufdatum
has_one_Member: Benutzer
SilverStripe\Security\Security:
ALREADYLOGGEDIN: 'Sie haben keinen Zugriff auf diese Seite. Wenn Sie ein anderes Konto besitzen, mit dem Sie auf diese Seite zugreifen können, melden Sie sich bitte unten an.'
Expand Down
19 changes: 13 additions & 6 deletions src/Control/Controller.php
Original file line number Diff line number Diff line change
Expand Up @@ -680,6 +680,18 @@ public static function join_links($arg = null)
*/
public static function normaliseTrailingSlash(string $url): string
{
// Do not normalise external urls
// Note that urls without a scheme such as "www.example.com" will be counted as a relative file
if (!Director::is_site_url($url)) {
return $url;
}

// Do not modify files
$extension = pathinfo(Director::makeRelative($url), PATHINFO_EXTENSION);
if ($extension) {
return $url;
}

$querystring = null;
$fragmentIdentifier = null;

Expand All @@ -694,14 +706,9 @@ public static function normaliseTrailingSlash(string $url): string

// Normlise trailing slash
$shouldHaveTrailingSlash = Controller::config()->uninherited('add_trailing_slash');
if ($shouldHaveTrailingSlash
&& !str_ends_with($url, '/')
&& !preg_match('/^(.*)\.([^\/]*)$/', Director::makeRelative($url))
) {
// Add trailing slash if enabled and url does not end with a file extension
if ($shouldHaveTrailingSlash && !str_ends_with($url, '/')) {
$url .= '/';
} elseif (!$shouldHaveTrailingSlash) {
// Remove trailing slash if it shouldn't be there
$url = rtrim($url, '/');
}

Expand Down
11 changes: 10 additions & 1 deletion src/Control/Director.php
Original file line number Diff line number Diff line change
Expand Up @@ -821,7 +821,16 @@ public static function is_site_url($url)

// Allow extensions to weigh in
$isSiteUrl = false;
static::singleton()->extend('updateIsSiteUrl', $isSiteUrl, $url);
// Not using static::singleton() here because it can break
// functional tests such as those in HTTPCacheControlIntegrationTest
// This happens because a singleton of Director is instantiating prior to tests being run,
// because Controller::normaliseTrailingSlash() is called during SapphireTest::setUp(),
// which in turn calls Director::is_site_url()
// For this specific use case we don't need to use dependency injection because the
// chance of the extend() method being customised in projects is low.
// Any extension hooks implementing updateIsSiteUrl() will still be called as expected
$director = new static();
$director->extend('updateIsSiteUrl', $isSiteUrl, $url);
if ($isSiteUrl) {
return true;
}
Expand Down
1 change: 1 addition & 0 deletions src/Forms/HTMLEditor/TinyMCEConfig.php
Original file line number Diff line number Diff line change
Expand Up @@ -750,6 +750,7 @@ private function initImageSizePresets(array &$settings): void
}

if (isset($preset['i18n'])) {
/** @phpstan-ignore translation.key (we need the key to be dynamic here) */
$preset['text'] = _t(
$preset['i18n'],
isset($preset['text']) ? $preset['text'] : ''
Expand Down
2 changes: 1 addition & 1 deletion src/Forms/SearchableDropdownTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ trait SearchableDropdownTrait
'search',
];

private bool $isClearable = false;
private bool $isClearable = true;

private bool $isLazyLoaded = false;

Expand Down
1 change: 0 additions & 1 deletion src/Forms/SearchableMultiDropdownField.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,5 @@ public function __construct(
$this->setLabelField($labelField);
$this->addExtraClass('ss-searchable-dropdown-field');
$this->setIsMultiple(true);
$this->setIsClearable(true);
}
}
22 changes: 21 additions & 1 deletion src/ORM/Connect/MySQLDatabase.php
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,26 @@ public function random()
*/
public function clearTable($table)
{
$this->query("TRUNCATE TABLE \"$table\"");
// Not simply using "TRUNCATE TABLE \"$table\"" because DELETE is a lot quicker
// than TRUNCATE which is very relevant during unit testing. Using TRUNCATE will lead to an
// approximately 50% increase it the total time of running unit tests.
//
// Using max(ID) to determine if the table should reset its auto-increment, rather than using
// SELECT "AUTO_INCREMENT" FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?
// after deleting from the table, because in MySQL 8, under certain conditions, notably
// when running behat, sometimes the auto-increment was being reset to 2 for unknown reasons
$self = $this;
$fn = function () use ($self, $table) {
$maxID = $self->query("SELECT MAX(ID) FROM \"$table\"")->value();
$self->query("DELETE FROM \"$table\"");
if ($maxID > 0) {
$self->query("ALTER TABLE \"$table\" AUTO_INCREMENT = 1");
}
};
if ($this->supportsTransactions()) {
$this->withTransaction($fn);
} else {
$fn();
}
}
}
1 change: 1 addition & 0 deletions src/ORM/DataObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -3959,6 +3959,7 @@ public function fieldLabels($includerelations = true)
}
foreach ($types as $type => $attrs) {
foreach ($attrs as $name => $spec) {
/** @phpstan-ignore translation.key (we need the key to be dynamic here) */
$autoLabels[$name] = _t(
"{$ancestorClass}.{$type}_{$name}",
FormField::name_to_label($name)
Expand Down
1 change: 1 addition & 0 deletions src/Security/PasswordValidator.php
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,7 @@ public function validate($password, $member)
if (preg_match($tests[$name] ?? '', $password ?? '')) {
continue;
}
/** @phpstan-ignore translation.key (we need the key to be dynamic here) */
$missedTests[] = _t(
__CLASS__ . '.STRENGTHTEST' . strtoupper($name ?? ''),
$name,
Expand Down
Loading

0 comments on commit cdde36b

Please sign in to comment.