Move the settings screen to its own top-level menu

Adds an "M365 Login" menu entry with a Microsoft-style icon and one
submenu per tab (Connection, Button, Security). The active tab is taken
from the URL, kept in the post-save redirect and highlighted in the
submenu. Notices are printed explicitly because top-level pages do not
include options-head.php. Links, docs and screenshots updated.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JJxAHYdMfKPoN4koRc4Ci2
This commit is contained in:
friloo 2026-09-22 17:07:53 +00:00
parent 8766927123
commit 662756bc75
No known key found for this signature in database
12 changed files with 664 additions and 576 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 336 KiB

After

Width:  |  Height:  |  Size: 522 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 603 KiB

After

Width:  |  Height:  |  Size: 596 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 633 KiB

After

Width:  |  Height:  |  Size: 711 KiB

Before After
Before After

View file

@ -9,7 +9,7 @@ All notable changes to this project are documented in this file. The format foll
### Added
- "Sign in with Microsoft" button on `wp-login.php` (OpenID Connect authorization code flow with PKCE).
- Matching of existing WordPress users by e-mail address (optional UPN fallback), no user provisioning.
- Settings screen (Settings → M365 Login) with connection, button and security tabs, live button preview, colour presets, media-library icon picker, redirect-URI copy button and tenant connectivity test.
- Settings screen (own top-level menu entry "M365 Login") with connection, button and security tabs, live button preview, colour presets, media-library icon picker, redirect-URI copy button and tenant connectivity test.
- ID token verification against Microsoft's JWKS (RS256, issuer, audience, tenant, expiry, nonce).
- Encrypted client secret storage (AES-256-GCM).
- Certificate based client authentication (RFC 7523 `private_key_jwt`): one-click generation of a 3072-bit RSA key pair with self-signed certificate, `.cer` download, own PEM upload, expiry display; step-by-step guides for both methods in the settings.

View file

@ -66,12 +66,12 @@
| --- | --- |
| ![Login-Seite mit Microsoft-Button](.github/assets/screenshots/login.png) | ![Login-Seite im Nur-Button-Modus](.github/assets/screenshots/login-button-only.png) |
| Einstellungen Verbindung | Einstellungen Button |
| M365 Login Verbindung | M365 Login Button |
| --- | --- |
| ![Tab Verbindung](.github/assets/screenshots/settings-connection.png) | ![Tab Button mit Live-Vorschau](.github/assets/screenshots/settings-button.png) |
<details>
<summary><strong>Einstellungen Sicherheit</strong> (Gruppen-Auswahl, Nur-Button-Modus, Fallback-Link)</summary>
<summary><strong>M365 Login Sicherheit</strong> (Gruppen-Auswahl, Nur-Button-Modus, Fallback-Link)</summary>
![Tab Sicherheit](.github/assets/screenshots/settings-security.png)
@ -136,7 +136,7 @@ Alternativ den Repo-Inhalt als Ordner `m365-login` nach `wp-content/plugins/` ko
<details open>
<summary><strong>Schritt für Schritt (ca. 5 Minuten)</strong></summary>
1. **Redirect-URI kopieren.** In WordPress *Einstellungen → M365 Login* öffnen; die URI steht in der Seitenleiste
1. **Redirect-URI kopieren.** In WordPress den Menüpunkt *M365 Login* öffnen; die URI steht in der Seitenleiste
(`https://deine-seite.tld/m365-login/callback`, bei einfachen Permalinks `https://deine-seite.tld/?m365-login=callback`).
2. **App registrieren.** [Microsoft Entra Admin Center](https://entra.microsoft.com/) → *App-Registrierungen → Neue Registrierung*
- Name: z. B. „WordPress Login“
@ -177,7 +177,7 @@ Wichtig: Jeder Benutzer, der sich per Microsoft anmelden soll, braucht in WordPr
## Einstellungen im Backend
*Einstellungen → M365 Login* drei Tabs, ein Formular, ein Speichern-Button.
Menüpunkt *M365 Login* drei Tabs (auch als Untermenüs erreichbar), ein Formular, ein Speichern-Button.
### Verbindung

View file

@ -18,18 +18,36 @@
try {
window.localStorage.setItem( 'm365LoginTab', name );
} catch ( e ) {}
// Keep the URL (and the post-save redirect) on this tab.
var $referer = $( '#m365-referer' );
if ( $referer.length && window.history && window.history.replaceState ) {
var url = new URL( window.location.href );
if ( 'connection' === name ) {
url.searchParams.delete( 'tab' );
} else {
url.searchParams.set( 'tab', name );
}
url.searchParams.delete( 'settings-updated' );
window.history.replaceState( null, '', url.toString() );
$referer.val( url.pathname + url.search );
}
}
$tabs.on( 'click', function () {
activate( $( this ).data( 'tab' ) );
} );
try {
var saved = window.localStorage.getItem( 'm365LoginTab' );
if ( saved && $tabs.filter( '[data-tab="' + saved + '"]' ).length ) {
activate( saved );
}
} catch ( e ) {}
var initial = $( '.m365-admin__tabs' ).data( 'initial-tab' );
if ( initial && $tabs.filter( '[data-tab="' + initial + '"]' ).length ) {
activate( initial );
} else {
try {
var saved = window.localStorage.getItem( 'm365LoginTab' );
if ( saved && $tabs.filter( '[data-tab="' + saved + '"]' ).length ) {
activate( saved );
}
} catch ( e ) {}
}
// Jump to the tab that contains a validation error.
var $error = $( '.settings-error' ).first();

View file

@ -18,6 +18,7 @@ class M365_Login_Admin {
const AJAX_GROUPS = 'm365_login_search_groups';
const AJAX_CERT = 'm365_login_certificate';
const POST_CERT = 'm365_login_download_cert';
const MENU_ICON = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAyMCI+PHBhdGggZmlsbD0iYmxhY2siIGQ9Ik0yIDJoNy41djcuNUgyek0xMC41IDJIMTh2Ny41aC03LjV6TTIgMTAuNWg3LjVWMThIMnpNMTAuNSAxMC41SDE4VjE4aC03LjV6Ii8+PC9zdmc+';
const NONCE_TEST = 'm365_login_test';
/**
@ -69,19 +70,85 @@ class M365_Login_Admin {
add_action( 'admin_post_' . self::POST_CERT, array( $this, 'download_certificate' ) );
add_action( 'update_option_' . M365_LOGIN_OPTION, array( $this->graph, 'flush_token' ) );
add_action( 'admin_notices', array( $this, 'setup_notice' ) );
add_filter( 'submenu_file', array( $this, 'highlight_submenu' ) );
}
/**
* Adds the menu entry under Settings.
* Adds a top-level menu entry with one submenu per tab.
*/
public function menu() {
$this->hook = add_options_page(
$this->hook = add_menu_page(
__( 'M365 Login', 'm365-login' ),
__( 'M365 Login', 'm365-login' ),
'manage_options',
self::PAGE,
array( $this, 'render' )
array( $this, 'render' ),
self::MENU_ICON,
81
);
foreach ( self::tabs() as $tab => $label ) {
add_submenu_page(
self::PAGE,
$label . ' ' . __( 'M365 Login', 'm365-login' ),
$label,
'manage_options',
'connection' === $tab ? self::PAGE : 'admin.php?page=' . self::PAGE . '&tab=' . $tab
);
}
}
/**
* Tab slugs and labels.
*
* @return string[]
*/
public static function tabs() {
return array(
'connection' => __( 'Connection', 'm365-login' ),
'button' => __( 'Button', 'm365-login' ),
'security' => __( 'Security', 'm365-login' ),
);
}
/**
* Currently requested tab (from ?tab=).
*
* @return string
*/
private function current_tab() {
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only UI state.
$tab = isset( $_GET['tab'] ) ? sanitize_key( wp_unslash( $_GET['tab'] ) ) : '';
return array_key_exists( $tab, self::tabs() ) ? $tab : '';
}
/**
* Highlights the submenu entry matching the requested tab.
*
* @param string|null $submenu_file Current submenu file.
* @return string|null
*/
public function highlight_submenu( $submenu_file ) {
$screen = get_current_screen();
if ( ! $screen || $this->hook !== $screen->id ) {
return $submenu_file;
}
$tab = $this->current_tab();
if ( '' === $tab || 'connection' === $tab ) {
return self::PAGE;
}
return 'admin.php?page=' . self::PAGE . '&tab=' . $tab;
}
/**
* URL of the settings screen (optionally a specific tab).
*
* @param string $tab Tab slug.
* @return string
*/
public static function url( $tab = '' ) {
$url = admin_url( 'admin.php?page=' . self::PAGE );
return '' === $tab ? $url : add_query_arg( 'tab', $tab, $url );
}
/**
@ -116,7 +183,7 @@ class M365_Login_Admin {
printf(
'<div class="notice notice-info is-dismissible"><p>%s <a href="%s">%s</a></p></div>',
esc_html__( 'M365 Login is active but not connected to Microsoft Entra ID yet.', 'm365-login' ),
esc_url( admin_url( 'options-general.php?page=' . self::PAGE ) ),
esc_url( self::url() ),
esc_html__( 'Open the settings', 'm365-login' )
);
}
@ -322,13 +389,16 @@ class M365_Login_Admin {
</span>
</header>
<?php settings_errors(); ?>
<form method="post" action="options.php" class="m365-admin__form" novalidate>
<?php settings_fields( self::GROUP ); ?>
<input type="hidden" name="_wp_http_referer" value="<?php echo esc_attr( self::url( $this->current_tab() ) ); ?>" id="m365-referer" />
<nav class="m365-admin__tabs" role="tablist">
<button type="button" class="m365-admin__tab is-active" role="tab" data-tab="connection" aria-selected="true"><?php esc_html_e( 'Connection', 'm365-login' ); ?></button>
<button type="button" class="m365-admin__tab" role="tab" data-tab="button" aria-selected="false"><?php esc_html_e( 'Button', 'm365-login' ); ?></button>
<button type="button" class="m365-admin__tab" role="tab" data-tab="security" aria-selected="false"><?php esc_html_e( 'Security', 'm365-login' ); ?></button>
<nav class="m365-admin__tabs" role="tablist" data-initial-tab="<?php echo esc_attr( $this->current_tab() ); ?>">
<?php foreach ( self::tabs() as $tab => $label ) : ?>
<button type="button" class="m365-admin__tab<?php echo 'connection' === $tab ? ' is-active' : ''; ?>" role="tab" data-tab="<?php echo esc_attr( $tab ); ?>" aria-selected="<?php echo 'connection' === $tab ? 'true' : 'false'; ?>"><?php echo esc_html( $label ); ?></button>
<?php endforeach; ?>
</nav>
<div class="m365-admin__layout">

View file

@ -98,7 +98,7 @@ final class M365_Login {
* @return string[]
*/
public function action_links( $links ) {
$url = admin_url( 'options-general.php?page=m365-login' );
$url = admin_url( 'admin.php?page=m365-login' );
array_unshift( $links, '<a href="' . esc_url( $url ) . '">' . esc_html__( 'Settings', 'm365-login' ) . '</a>' );
return $links;
}

View file

@ -16,709 +16,709 @@ msgstr ""
"X-Generator: bin/make-pot.py\n"
"X-Domain: m365-login\n"
#: includes/class-m365-login-admin.php:79 includes/class-m365-login-admin.php:80 includes/class-m365-login-admin.php:315
#: includes/class-m365-login-admin.php:81 includes/class-m365-login-admin.php:82 includes/class-m365-login-admin.php:93 includes/class-m365-login-admin.php:382
msgid "M365 Login"
msgstr "M365 Login"
#: includes/class-m365-login-admin.php:118
#: includes/class-m365-login-admin.php:108
msgid "Connection"
msgstr "Verbindung"
#: includes/class-m365-login-admin.php:109
msgid "Button"
msgstr "Button"
#: includes/class-m365-login-admin.php:110
msgid "Security"
msgstr "Sicherheit"
#: includes/class-m365-login-admin.php:185
msgid "M365 Login is active but not connected to Microsoft Entra ID yet."
msgstr "M365 Login ist aktiv, aber noch nicht mit Microsoft Entra ID verbunden."
#: includes/class-m365-login-admin.php:120
#: includes/class-m365-login-admin.php:187
msgid "Open the settings"
msgstr "Einstellungen öffnen"
#: includes/class-m365-login-admin.php:150
#: includes/class-m365-login-admin.php:217
msgid "Choose button icon"
msgstr "Button-Icon auswählen"
#: includes/class-m365-login-admin.php:151
#: includes/class-m365-login-admin.php:218
msgid "Use this icon"
msgstr "Dieses Icon verwenden"
#: includes/class-m365-login-admin.php:152
#: includes/class-m365-login-admin.php:219
msgid "Copied!"
msgstr "Kopiert!"
#: includes/class-m365-login-admin.php:153 includes/class-m365-login-admin.php:435 includes/class-m365-login-admin.php:713 includes/class-m365-login-admin.php:756
#: includes/class-m365-login-admin.php:220 includes/class-m365-login-admin.php:505 includes/class-m365-login-admin.php:783 includes/class-m365-login-admin.php:826
msgid "Copy"
msgstr "Kopieren"
#: includes/class-m365-login-admin.php:154
#: includes/class-m365-login-admin.php:221
msgid "Testing…"
msgstr "Wird geprüft …"
#: includes/class-m365-login-admin.php:155
#: includes/class-m365-login-admin.php:222
msgid "The tenant could not be reached. Check the tenant ID and the servers outgoing connections."
msgstr "Der Tenant ist nicht erreichbar. Bitte Tenant-ID und ausgehende Verbindungen des Servers prüfen."
#: includes/class-m365-login-admin.php:156
#: includes/class-m365-login-admin.php:223
msgid "No groups found."
msgstr "Keine Gruppen gefunden."
#: includes/class-m365-login-admin.php:157
#: includes/class-m365-login-admin.php:224
msgid "Searching…"
msgstr "Suche läuft …"
#: includes/class-m365-login-admin.php:158
#: includes/class-m365-login-admin.php:225
msgid "Add"
msgstr "Hinzufügen"
#: includes/class-m365-login-admin.php:159 includes/class-m365-login-admin.php:687
#: includes/class-m365-login-admin.php:226 includes/class-m365-login-admin.php:757
msgid "Remove"
msgstr "Entfernen"
#: includes/class-m365-login-admin.php:160 includes/class-m365-login-admin.php:218 includes/class-m365-login-admin.php:672
#: includes/class-m365-login-admin.php:227 includes/class-m365-login-admin.php:285 includes/class-m365-login-admin.php:742
msgid "Save the connection settings first, then search for groups."
msgstr "Zuerst die Verbindungseinstellungen speichern, dann Gruppen suchen."
#: includes/class-m365-login-admin.php:161
#: includes/class-m365-login-admin.php:228
msgid "Generate a new fallback key on save? The old link stops working."
msgstr "Beim Speichern einen neuen Fallback-Schlüssel erzeugen? Der alte Link funktioniert dann nicht mehr."
#: includes/class-m365-login-admin.php:162
#: includes/class-m365-login-admin.php:229
msgid "Generating a 3072-bit key pair, this takes a moment…"
msgstr "3072-Bit-Schlüsselpaar wird erzeugt, das dauert einen Moment …"
#: includes/class-m365-login-admin.php:163
#: includes/class-m365-login-admin.php:230
msgid "Replace the stored certificate? Sign-in stops working until the new certificate is uploaded to Entra ID."
msgstr "Gespeichertes Zertifikat ersetzen? Die Anmeldung funktioniert erst wieder, wenn das neue Zertifikat in Entra ID hochgeladen ist."
#: includes/class-m365-login-admin.php:164
#: includes/class-m365-login-admin.php:231
msgid "Remove the stored certificate when saving? Sign-in with the certificate method stops working."
msgstr "Gespeichertes Zertifikat beim Speichern entfernen? Die Anmeldung per Zertifikat funktioniert dann nicht mehr."
#: includes/class-m365-login-admin.php:176 includes/class-m365-login-admin.php:215 includes/class-m365-login-admin.php:241 includes/class-m365-login-admin.php:273
#: includes/class-m365-login-admin.php:243 includes/class-m365-login-admin.php:282 includes/class-m365-login-admin.php:308 includes/class-m365-login-admin.php:340
msgid "You are not allowed to do this."
msgstr "Dafür fehlt die Berechtigung."
#: includes/class-m365-login-admin.php:181
#: includes/class-m365-login-admin.php:248
msgid "Please enter a valid tenant ID first."
msgstr "Bitte zuerst eine gültige Tenant-ID eingeben."
#. translators: %d: HTTP status code
#: includes/class-m365-login-admin.php:195
#: includes/class-m365-login-admin.php:262
msgid "Microsoft answered with HTTP %d. Is the tenant ID correct?"
msgstr "Microsoft hat mit HTTP %d geantwortet. Ist die Tenant-ID korrekt?"
#. translators: %d: HTTP status code
#: includes/class-m365-login-admin.php:204
#: includes/class-m365-login-admin.php:271
msgid "Tenant reachable. The OpenID configuration was loaded successfully."
msgstr "Tenant erreichbar. Die OpenID-Konfiguration wurde erfolgreich geladen."
#: includes/class-m365-login-admin.php:227
#: includes/class-m365-login-admin.php:294
msgid "Microsoft Graph refused the request. Grant the application permission \"GroupMember.Read.All\" (or \"Directory.Read.All\") with admin consent in Entra ID."
msgstr "Microsoft Graph hat die Anfrage abgelehnt. In Entra ID die Anwendungsberechtigung „GroupMember.Read.All“ (oder „Directory.Read.All“) mit Administratorzustimmung erteilen."
#: includes/class-m365-login-admin.php:245
#: includes/class-m365-login-admin.php:312
msgid "Unknown operation."
msgstr "Unbekannte Aktion."
#: includes/class-m365-login-admin.php:262
#: includes/class-m365-login-admin.php:329
msgid "Certificate generated and stored. Download the .cer file and upload it in Entra ID."
msgstr "Zertifikat erzeugt und gespeichert. Jetzt die .cer-Datei herunterladen und in Entra ID hochladen."
#: includes/class-m365-login-admin.php:279
#: includes/class-m365-login-admin.php:346
msgid "No certificate is stored."
msgstr "Es ist kein Zertifikat gespeichert."
#: includes/class-m365-login-admin.php:297
#: includes/class-m365-login-admin.php:364
msgid "You are not allowed to access this page."
msgstr "Für diese Seite fehlt die Berechtigung."
#: includes/class-m365-login-admin.php:316
#: includes/class-m365-login-admin.php:383
msgid "Let existing users sign in with their Microsoft 365 / Entra ID account."
msgstr "Bestehende Benutzer melden sich mit ihrem Microsoft 365 / Entra ID-Konto an."
#: includes/class-m365-login-admin.php:321
#: includes/class-m365-login-admin.php:388
msgid "Connected"
msgstr "Verbunden"
#: includes/class-m365-login-admin.php:321
#: includes/class-m365-login-admin.php:388
msgid "Setup incomplete"
msgstr "Einrichtung unvollständig"
#: includes/class-m365-login-admin.php:329
msgid "Connection"
msgstr "Verbindung"
#: includes/class-m365-login-admin.php:330
msgid "Button"
msgstr "Button"
#: includes/class-m365-login-admin.php:331
msgid "Security"
msgstr "Sicherheit"
#: includes/class-m365-login-admin.php:340
#: includes/class-m365-login-admin.php:410
msgid "Microsoft Entra ID app registration"
msgstr "App-Registrierung in Microsoft Entra ID"
#: includes/class-m365-login-admin.php:341
#: includes/class-m365-login-admin.php:411
msgid "Enter the values from your app registration in the Microsoft Entra admin center."
msgstr "Trage hier die Werte aus deiner App-Registrierung im Microsoft Entra Admin Center ein."
#: includes/class-m365-login-admin.php:344
#: includes/class-m365-login-admin.php:414
msgid "Directory (tenant) ID"
msgstr "Verzeichnis-ID (Mandant/Tenant)"
#: includes/class-m365-login-admin.php:347
#: includes/class-m365-login-admin.php:417
msgid "Test tenant"
msgstr "Tenant testen"
#: includes/class-m365-login-admin.php:349
#: includes/class-m365-login-admin.php:419
msgid "Recommended: the GUID of your tenant. Only sign-ins from this tenant are accepted. \"organizations\" allows any work or school account."
msgstr "Empfohlen: die GUID deines Tenants. Dann werden nur Anmeldungen aus diesem Tenant akzeptiert. „organizations“ erlaubt beliebige Geschäfts-, Schul- oder Unikonten."
#: includes/class-m365-login-admin.php:351
#: includes/class-m365-login-admin.php:421
msgid "Multi-tenant mode: accounts from any Microsoft tenant can sign in. Their \"email\" attribute is not verified, so the plugin matches on the user principal name (verified domain) only and ignores the e-mail claim unless Microsoft marks it as domain-verified. Use the e-mail domain allow-list on the Security tab, or better, pin your tenant GUID."
msgstr "Multi-Tenant-Modus: Konten aus beliebigen Microsoft-Tenants können sich anmelden. Deren „email“-Attribut ist nicht verifiziert, deshalb ordnet das Plugin nur über den User Principal Name (verifizierte Domain) zu und ignoriert den E-Mail-Claim, sofern Microsoft ihn nicht als domain-verifiziert markiert. Nutze die Domain-Allowlist im Tab „Sicherheit“ oder besser: die Tenant-GUID eintragen."
#: includes/class-m365-login-admin.php:357
#: includes/class-m365-login-admin.php:427
msgid "Application (client) ID"
msgstr "Anwendungs-ID (Client)"
#: includes/class-m365-login-admin.php:362
#: includes/class-m365-login-admin.php:432
msgid "How should WordPress authenticate to Microsoft?"
msgstr "Wie soll sich WordPress bei Microsoft authentifizieren?"
#: includes/class-m365-login-admin.php:367 includes/class-m365-login-admin.php:384
#: includes/class-m365-login-admin.php:437 includes/class-m365-login-admin.php:454
msgid "Client secret"
msgstr "Geheimer Clientschlüssel (Client Secret)"
#: includes/class-m365-login-admin.php:368
#: includes/class-m365-login-admin.php:438
msgid "Quick to set up. A password-like value created in Entra ID that expires after 624 months and must be renewed."
msgstr "Schnell eingerichtet. Ein passwortähnlicher Wert aus Entra ID, der nach 624 Monaten abläuft und erneuert werden muss."
#: includes/class-m365-login-admin.php:374
#: includes/class-m365-login-admin.php:444
msgid "Certificate"
msgstr "Zertifikat"
#: includes/class-m365-login-admin.php:374
#: includes/class-m365-login-admin.php:444
msgid "Recommended"
msgstr "Empfohlen"
#: includes/class-m365-login-admin.php:375
#: includes/class-m365-login-admin.php:445
msgid "The private key never leaves this server; only the public certificate is uploaded to Entra ID. Generated here with one click, valid for 2 years."
msgstr "Der private Schlüssel verlässt diesen Server nie; nur das öffentliche Zertifikat wird in Entra ID hochgeladen. Mit einem Klick hier erzeugt, 2 Jahre gültig."
#: includes/class-m365-login-admin.php:386
#: includes/class-m365-login-admin.php:456
msgid "•••••••••••• (stored, leave empty to keep)"
msgstr "•••••••••••• (gespeichert leer lassen, um zu behalten)"
#: includes/class-m365-login-admin.php:386
#: includes/class-m365-login-admin.php:456
msgid "Paste the secret value"
msgstr "Wert des Secrets einfügen"
#: includes/class-m365-login-admin.php:387
#: includes/class-m365-login-admin.php:457
msgid "Show secret"
msgstr "Secret anzeigen"
#: includes/class-m365-login-admin.php:392
#: includes/class-m365-login-admin.php:462
msgid "Remove the stored secret"
msgstr "Gespeichertes Secret entfernen"
#: includes/class-m365-login-admin.php:395
#: includes/class-m365-login-admin.php:465
msgid "Stored encrypted (AES-256-GCM, key derived from your WordPress salts) and never displayed again. Client secrets expire note the expiry date in Entra ID."
msgstr "Wird verschlüsselt gespeichert (AES-256-GCM, Schlüssel aus den WordPress-Salts abgeleitet) und nie wieder angezeigt. Client Secrets laufen ab Ablaufdatum in Entra ID notieren."
#: includes/class-m365-login-admin.php:399
#: includes/class-m365-login-admin.php:469
msgid "Step-by-step: create a client secret in Entra ID"
msgstr "Schritt für Schritt: Client Secret in Entra ID erstellen"
#: includes/class-m365-login-admin.php:402
#: includes/class-m365-login-admin.php:472
msgid "Open entra.microsoft.com and sign in with an account that has the \"Application Administrator\" or \"Global Administrator\" role."
msgstr "entra.microsoft.com öffnen und mit einem Konto anmelden, das die Rolle „Anwendungsadministrator“ oder „Globaler Administrator“ hat."
#: includes/class-m365-login-admin.php:403
#: includes/class-m365-login-admin.php:473
msgid "Go to Identity → Applications → App registrations and open your app (or create it first, see the general guide in the sidebar)."
msgstr "Zu Identität → Anwendungen → App-Registrierungen wechseln und die App öffnen (oder zuerst anlegen, siehe allgemeine Anleitung in der Seitenleiste)."
#: includes/class-m365-login-admin.php:404
#: includes/class-m365-login-admin.php:474
msgid "In the left menu choose Certificates & secrets, then the tab Client secrets, and click New client secret."
msgstr "Im linken Menü „Zertifikate & Geheimnisse“ wählen, dann den Reiter „Geheime Clientschlüssel“ und auf „Neuer geheimer Clientschlüssel“ klicken."
#: includes/class-m365-login-admin.php:405
#: includes/class-m365-login-admin.php:475
msgid "Enter a description such as \"WordPress login\" and pick an expiry. Microsoft allows at most 24 months; put a reminder in your calendar two weeks before."
msgstr "Eine Beschreibung wie „WordPress Login“ eingeben und eine Gültigkeit wählen. Microsoft erlaubt maximal 24 Monate; zwei Wochen vor Ablauf eine Kalender-Erinnerung setzen."
#: includes/class-m365-login-admin.php:406
#: includes/class-m365-login-admin.php:476
msgid "Click Add. Copy the Value column immediately it is shown only once. The Secret ID column is NOT what you need."
msgstr "Auf „Hinzufügen“ klicken. Die Spalte „Wert“ sofort kopieren sie wird nur einmal angezeigt. Die Spalte „Geheimnis-ID“ ist NICHT der gesuchte Wert."
#: includes/class-m365-login-admin.php:407
#: includes/class-m365-login-admin.php:477
msgid "Paste the value into the Client secret field above and save this page."
msgstr "Den Wert oben in das Feld „Geheimer Clientschlüssel“ einfügen und diese Seite speichern."
#: includes/class-m365-login-admin.php:409
#: includes/class-m365-login-admin.php:479
msgid "When the secret expires, sign-ins fail with \"Could not complete the sign-in with Microsoft\". Create a new secret, paste it here, save, then delete the old one in Entra ID."
msgstr "Läuft das Secret ab, scheitern Anmeldungen mit „Die Anmeldung über Microsoft konnte nicht abgeschlossen werden“. Dann ein neues Secret erstellen, hier einfügen, speichern und das alte in Entra ID löschen."
#: includes/class-m365-login-admin.php:422
#: includes/class-m365-login-admin.php:492
msgid "Expired"
msgstr "Abgelaufen"
#. translators: %d: number of days
#: includes/class-m365-login-admin.php:426
#: includes/class-m365-login-admin.php:496
msgid "Expires in %d days"
msgstr "Läuft in %d Tagen ab"
#. translators: %d: number of days
#: includes/class-m365-login-admin.php:429
#: includes/class-m365-login-admin.php:499
msgid "Valid"
msgstr "Gültig"
#: includes/class-m365-login-admin.php:434
#: includes/class-m365-login-admin.php:504
msgid "Thumbprint (SHA-1)"
msgstr "Fingerabdruck (SHA-1)"
#: includes/class-m365-login-admin.php:436
#: includes/class-m365-login-admin.php:506
msgid "Subject"
msgstr "Antragsteller"
#: includes/class-m365-login-admin.php:438
#: includes/class-m365-login-admin.php:508
msgid "Key size"
msgstr "Schlüssellänge"
#: includes/class-m365-login-admin.php:440
#: includes/class-m365-login-admin.php:510
msgid "Valid until"
msgstr "Gültig bis"
#: includes/class-m365-login-admin.php:444
#: includes/class-m365-login-admin.php:514
msgid "Download certificate (.cer)"
msgstr "Zertifikat herunterladen (.cer)"
#: includes/class-m365-login-admin.php:445
#: includes/class-m365-login-admin.php:515
msgid "Generate new certificate"
msgstr "Neues Zertifikat erzeugen"
#: includes/class-m365-login-admin.php:448
#: includes/class-m365-login-admin.php:518
msgid "Remove certificate when saving"
msgstr "Zertifikat beim Speichern entfernen"
#: includes/class-m365-login-admin.php:452
#: includes/class-m365-login-admin.php:522
msgid "No certificate stored yet."
msgstr "Noch kein Zertifikat gespeichert."
#: includes/class-m365-login-admin.php:454
#: includes/class-m365-login-admin.php:524
msgid "Generate certificate"
msgstr "Zertifikat erzeugen"
#: includes/class-m365-login-admin.php:455
#: includes/class-m365-login-admin.php:525
msgid "3072-bit RSA, self-signed, valid for 2 years. The private key is stored encrypted and never shown or downloadable."
msgstr "3072 Bit RSA, selbstsigniert, 2 Jahre gültig. Der private Schlüssel wird verschlüsselt gespeichert und nie angezeigt oder zum Download angeboten."
#: includes/class-m365-login-admin.php:459
#: includes/class-m365-login-admin.php:529
msgid "Use your own certificate instead (paste PEM)"
msgstr "Stattdessen eigenes Zertifikat verwenden (PEM einfügen)"
#: includes/class-m365-login-admin.php:462
#: includes/class-m365-login-admin.php:532
msgid "Private key (PEM, unencrypted)"
msgstr "Privater Schlüssel (PEM, unverschlüsselt)"
#: includes/class-m365-login-admin.php:466
#: includes/class-m365-login-admin.php:536
msgid "Certificate (PEM)"
msgstr "Zertifikat (PEM)"
#: includes/class-m365-login-admin.php:468
#: includes/class-m365-login-admin.php:538
msgid "RSA, at least 2048 bits. The pair is validated and the key is encrypted when you save. Both fields stay empty afterwards."
msgstr "RSA, mindestens 2048 Bit. Beim Speichern wird das Paar geprüft und der Schlüssel verschlüsselt. Beide Felder bleiben danach leer."
#: includes/class-m365-login-admin.php:474
#: includes/class-m365-login-admin.php:544
msgid "Step-by-step: register the certificate in Entra ID"
msgstr "Schritt für Schritt: Zertifikat in Entra ID hinterlegen"
#: includes/class-m365-login-admin.php:477
#: includes/class-m365-login-admin.php:547
msgid "Click Generate certificate above (or paste your own). Then click Download certificate (.cer) the file contains only the public part."
msgstr "Oben auf „Zertifikat erzeugen“ klicken (oder ein eigenes einfügen). Danach „Zertifikat herunterladen (.cer)“ die Datei enthält nur den öffentlichen Teil."
#: includes/class-m365-login-admin.php:478
#: includes/class-m365-login-admin.php:548
msgid "Open entra.microsoft.com → Identity → Applications → App registrations and open your app."
msgstr "entra.microsoft.com → Identität → Anwendungen → App-Registrierungen öffnen und die App auswählen."
#: includes/class-m365-login-admin.php:479
#: includes/class-m365-login-admin.php:549
msgid "Choose Certificates & secrets in the left menu, then the tab Certificates, and click Upload certificate."
msgstr "Im linken Menü „Zertifikate & Geheimnisse“ wählen, dann den Reiter „Zertifikate“ und auf „Zertifikat hochladen“ klicken."
#: includes/class-m365-login-admin.php:480
#: includes/class-m365-login-admin.php:550
msgid "Select the downloaded .cer file, add a description such as \"WordPress login\" and click Add."
msgstr "Die heruntergeladene .cer-Datei auswählen, eine Beschreibung wie „WordPress Login“ eingeben und auf „Hinzufügen“ klicken."
#: includes/class-m365-login-admin.php:481
#: includes/class-m365-login-admin.php:551
msgid "Compare the thumbprint Entra ID shows with the thumbprint above they must match exactly."
msgstr "Den in Entra ID angezeigten Fingerabdruck mit dem Fingerabdruck oben vergleichen beide müssen exakt übereinstimmen."
#: includes/class-m365-login-admin.php:482
#: includes/class-m365-login-admin.php:552
msgid "Make sure Certificate is selected above and save this page. If a client secret was stored before, you may delete it in Entra ID now."
msgstr "Sicherstellen, dass oben „Zertifikat“ ausgewählt ist, und diese Seite speichern. War vorher ein Client Secret gespeichert, kann es jetzt in Entra ID gelöscht werden."
#: includes/class-m365-login-admin.php:484
#: includes/class-m365-login-admin.php:554
msgid "How it works: for every token request WordPress signs a short-lived JWT (client assertion) with the private key; Microsoft verifies it with the uploaded certificate. Nothing secret is ever transmitted."
msgstr "So funktioniert es: Für jede Token-Anfrage signiert WordPress ein kurzlebiges JWT (Client Assertion) mit dem privaten Schlüssel; Microsoft prüft es mit dem hochgeladenen Zertifikat. Es wird nie ein Geheimnis übertragen."
#: includes/class-m365-login-admin.php:485
#: includes/class-m365-login-admin.php:555
msgid "Before the certificate expires: generate a new one here, upload it to Entra ID (both may be registered at the same time), save, then remove the old one from Entra ID. Sign-ins keep working during the switch."
msgstr "Vor Ablauf des Zertifikats: hier ein neues erzeugen, in Entra ID hochladen (beide dürfen gleichzeitig hinterlegt sein), speichern und danach das alte in Entra ID entfernen. Anmeldungen funktionieren während des Wechsels weiter."
#: includes/class-m365-login-admin.php:491
#: includes/class-m365-login-admin.php:561
msgid "Account prompt"
msgstr "Kontoauswahl"
#: includes/class-m365-login-admin.php:493
#: includes/class-m365-login-admin.php:563
msgid "Always let the user pick an account (recommended)"
msgstr "Benutzer wählt immer ein Konto aus (empfohlen)"
#: includes/class-m365-login-admin.php:494
#: includes/class-m365-login-admin.php:564
msgid "Use the current Microsoft session if available"
msgstr "Vorhandene Microsoft-Sitzung verwenden, falls vorhanden"
#: includes/class-m365-login-admin.php:495
#: includes/class-m365-login-admin.php:565
msgid "Always require re-entering credentials"
msgstr "Immer erneute Eingabe der Anmeldedaten verlangen"
#: includes/class-m365-login-admin.php:504
#: includes/class-m365-login-admin.php:574
msgid "Appearance"
msgstr "Darstellung"
#: includes/class-m365-login-admin.php:507
#: includes/class-m365-login-admin.php:577
msgid "Live preview"
msgstr "Live-Vorschau"
#: includes/class-m365-login-admin.php:521
#: includes/class-m365-login-admin.php:591
msgid "Button text"
msgstr "Button-Text"
#: includes/class-m365-login-admin.php:525
#: includes/class-m365-login-admin.php:595
msgid "Divider text"
msgstr "Trennlinien-Text"
#: includes/class-m365-login-admin.php:527
#: includes/class-m365-login-admin.php:597
msgid "Leave empty to hide the divider line."
msgstr "Leer lassen, um die Trennlinie auszublenden."
#: includes/class-m365-login-admin.php:532
#: includes/class-m365-login-admin.php:602
msgid "Icon"
msgstr "Icon"
#: includes/class-m365-login-admin.php:535
#: includes/class-m365-login-admin.php:605
msgid "Show an icon on the button"
msgstr "Icon auf dem Button anzeigen"
#: includes/class-m365-login-admin.php:546
#: includes/class-m365-login-admin.php:616
msgid "Default: Microsoft logo"
msgstr "Standard: Microsoft-Logo"
#: includes/class-m365-login-admin.php:548
#: includes/class-m365-login-admin.php:618
msgid "Choose from media library"
msgstr "Aus Mediathek wählen"
#: includes/class-m365-login-admin.php:549
#: includes/class-m365-login-admin.php:619
msgid "Use Microsoft logo"
msgstr "Microsoft-Logo verwenden"
#: includes/class-m365-login-admin.php:551
#: includes/class-m365-login-admin.php:621
msgid "PNG, SVG, JPG or WebP. Square images (e.g. 64×64 px) work best."
msgstr "PNG, SVG, JPG oder WebP. Quadratische Bilder (z. B. 64×64 px) eignen sich am besten."
#: includes/class-m365-login-admin.php:559
#: includes/class-m365-login-admin.php:629
msgid "Background"
msgstr "Hintergrund"
#: includes/class-m365-login-admin.php:560
#: includes/class-m365-login-admin.php:630
msgid "Background (hover)"
msgstr "Hintergrund (Hover)"
#: includes/class-m365-login-admin.php:561
#: includes/class-m365-login-admin.php:631
msgid "Text colour"
msgstr "Textfarbe"
#: includes/class-m365-login-admin.php:562
#: includes/class-m365-login-admin.php:632
msgid "Border"
msgstr "Rahmen"
#: includes/class-m365-login-admin.php:575
#: includes/class-m365-login-admin.php:645
msgid "Corner radius"
msgstr "Eckenradius"
#: includes/class-m365-login-admin.php:579
#: includes/class-m365-login-admin.php:649
msgid "Position on the login page"
msgstr "Position auf der Login-Seite"
#: includes/class-m365-login-admin.php:581
#: includes/class-m365-login-admin.php:651
msgid "Below the login form"
msgstr "Unter dem Login-Formular"
#: includes/class-m365-login-admin.php:582
#: includes/class-m365-login-admin.php:652
msgid "Above the login form"
msgstr "Über dem Login-Formular"
#: includes/class-m365-login-admin.php:588
#: includes/class-m365-login-admin.php:658
msgid "Quick presets"
msgstr "Schnellauswahl"
#: includes/class-m365-login-admin.php:589
#: includes/class-m365-login-admin.php:659
msgid "Microsoft dark"
msgstr "Microsoft dunkel"
#: includes/class-m365-login-admin.php:590
#: includes/class-m365-login-admin.php:660
msgid "Microsoft light"
msgstr "Microsoft hell"
#: includes/class-m365-login-admin.php:591
#: includes/class-m365-login-admin.php:661
msgid "Azure blue"
msgstr "Azure-Blau"
#: includes/class-m365-login-admin.php:592
#: includes/class-m365-login-admin.php:662
msgid "WordPress blue"
msgstr "WordPress-Blau"
#: includes/class-m365-login-admin.php:596
#: includes/class-m365-login-admin.php:666
msgid "Custom login page"
msgstr "Eigene Login-Seite"
#: includes/class-m365-login-admin.php:597
#: includes/class-m365-login-admin.php:667
msgid "Using your own login page instead of wp-login.php? Tell the plugin where it is so error messages, the fallback link and the post-logout redirect point there."
msgstr "Eigene Login-Seite statt wp-login.php? Hier eintragen, damit Fehlermeldungen, der Fallback-Link und die Weiterleitung nach dem Abmelden dorthin zeigen."
#: includes/class-m365-login-admin.php:600
#: includes/class-m365-login-admin.php:670
msgid "URL of your login page"
msgstr "URL der Login-Seite"
#: includes/class-m365-login-admin.php:602
#: includes/class-m365-login-admin.php:672
msgid "Must be on this site. Leave empty to use wp-login.php."
msgstr "Muss auf dieser Website liegen. Leer lassen, um wp-login.php zu verwenden."
#: includes/class-m365-login-admin.php:608
#: includes/class-m365-login-admin.php:678
msgid "Add the button to every wp_login_form() form automatically"
msgstr "Button automatisch in jedes wp_login_form()-Formular einfügen"
#: includes/class-m365-login-admin.php:609
#: includes/class-m365-login-admin.php:679
msgid "Covers themes and plugins that use the WordPress login form function. Page-builder widgets need the shortcode or the template function below."
msgstr "Deckt Themes und Plugins ab, die die WordPress-Login-Formularfunktion verwenden. Page-Builder-Widgets benötigen den Shortcode oder die Template-Funktion unten."
#: includes/class-m365-login-admin.php:614
#: includes/class-m365-login-admin.php:684
msgid "Manual placement"
msgstr "Manuelle Platzierung"
#: includes/class-m365-login-admin.php:615
#: includes/class-m365-login-admin.php:685
msgid "Shortcode (block editor, page builders):"
msgstr "Shortcode (Block-Editor, Page Builder):"
#: includes/class-m365-login-admin.php:617
#: includes/class-m365-login-admin.php:687
msgid "Template function (theme files):"
msgstr "Template-Funktion (Theme-Dateien):"
#: includes/class-m365-login-admin.php:619
#: includes/class-m365-login-admin.php:689
msgid "Both show the error messages of the last attempt; use m365_login_messages() to place them separately."
msgstr "Beide zeigen die Fehlermeldungen des letzten Versuchs; mit m365_login_messages() lassen sie sich separat platzieren."
#: includes/class-m365-login-admin.php:627
#: includes/class-m365-login-admin.php:697
msgid "User matching & hardening"
msgstr "Benutzerzuordnung & Härtung"
#: includes/class-m365-login-admin.php:628
#: includes/class-m365-login-admin.php:698
msgid "Users are never created automatically. A Microsoft sign-in only succeeds when a WordPress user with the same e-mail address already exists."
msgstr "Benutzer werden nie automatisch angelegt. Eine Microsoft-Anmeldung gelingt nur, wenn bereits ein WordPress-Benutzer mit derselben E-Mail-Adresse existiert."
#: includes/class-m365-login-admin.php:633
#: includes/class-m365-login-admin.php:703
msgid "Bind WordPress accounts to the Microsoft object ID"
msgstr "WordPress-Konten an die Microsoft-Objekt-ID binden"
#: includes/class-m365-login-admin.php:634
#: includes/class-m365-login-admin.php:704
msgid "On first sign-in the immutable Microsoft object ID is stored with the user. Later sign-ins with the same e-mail but a different Microsoft identity are rejected. Strongly recommended."
msgstr "Bei der ersten Anmeldung wird die unveränderliche Microsoft-Objekt-ID am Benutzer gespeichert. Spätere Anmeldungen mit gleicher E-Mail, aber anderer Microsoft-Identität werden abgelehnt. Dringend empfohlen."
#: includes/class-m365-login-admin.php:641
#: includes/class-m365-login-admin.php:711
msgid "Fall back to the user principal name (UPN)"
msgstr "Auf den User Principal Name (UPN) zurückgreifen"
#: includes/class-m365-login-admin.php:642
#: includes/class-m365-login-admin.php:712
msgid "If the token contains no \"email\" claim, use the UPN (e.g. jane@contoso.com) when it is a valid e-mail address. Usually required for work accounts."
msgstr "Enthält das Token keinen „email“-Claim, wird der UPN (z. B. jane@contoso.com) verwendet, sofern er eine gültige E-Mail-Adresse ist. Für Geschäftskonten meist erforderlich."
#: includes/class-m365-login-admin.php:649
#: includes/class-m365-login-admin.php:719
msgid "Keep users signed in (\"Remember me\")"
msgstr "Benutzer angemeldet lassen („Angemeldet bleiben“)"
#: includes/class-m365-login-admin.php:650
#: includes/class-m365-login-admin.php:720
msgid "Issues a 14-day WordPress session instead of a browser session."
msgstr "Erstellt eine 14-tägige WordPress-Sitzung statt einer Browser-Sitzung."
#: includes/class-m365-login-admin.php:655
#: includes/class-m365-login-admin.php:725
msgid "Allowed e-mail domains (optional)"
msgstr "Erlaubte E-Mail-Domains (optional)"
#: includes/class-m365-login-admin.php:657
#: includes/class-m365-login-admin.php:727
msgid "One or more domains separated by commas or new lines. Leave empty to allow any domain of your tenant."
msgstr "Eine oder mehrere Domains, getrennt durch Kommas oder Zeilenumbrüche. Leer lassen, um alle Domains des Tenants zuzulassen."
#: includes/class-m365-login-admin.php:662
#: includes/class-m365-login-admin.php:732
msgid "Allowed Entra groups (optional)"
msgstr "Erlaubte Entra-Gruppen (optional)"
#: includes/class-m365-login-admin.php:663
#: includes/class-m365-login-admin.php:733
msgid "Only members of at least one of these groups may sign in. Leave empty to allow every matched user. Nested memberships count."
msgstr "Nur Mitglieder mindestens einer dieser Gruppen dürfen sich anmelden. Leer lassen, um alle zugeordneten Benutzer zuzulassen. Verschachtelte Mitgliedschaften zählen."
#: includes/class-m365-login-admin.php:666
#: includes/class-m365-login-admin.php:736
msgid "Search groups"
msgstr "Gruppen suchen"
#: includes/class-m365-login-admin.php:668
#: includes/class-m365-login-admin.php:738
msgid "Type a group name or paste an object ID…"
msgstr "Gruppenname eingeben oder Objekt-ID einfügen …"
#: includes/class-m365-login-admin.php:669
#: includes/class-m365-login-admin.php:739
msgid "Search"
msgstr "Suchen"
#: includes/class-m365-login-admin.php:674
#: includes/class-m365-login-admin.php:744
msgid "Needs the application permission \"GroupMember.Read.All\" with admin consent. Without it you can still paste group object IDs."
msgstr "Benötigt die Anwendungsberechtigung „GroupMember.Read.All“ mit Administratorzustimmung. Ohne sie können Gruppen-Objekt-IDs trotzdem eingefügt werden."
#: includes/class-m365-login-admin.php:680
#: includes/class-m365-login-admin.php:750
msgid "Selected groups"
msgstr "Ausgewählte Gruppen"
#: includes/class-m365-login-admin.php:681
#: includes/class-m365-login-admin.php:751
msgid "No groups selected every matched user may sign in."
msgstr "Keine Gruppen ausgewählt jeder zugeordnete Benutzer darf sich anmelden."
#: includes/class-m365-login-admin.php:691
#: includes/class-m365-login-admin.php:761
msgid "Membership is read from the \"groups\" claim of the ID token when present; otherwise the plugin asks Microsoft Graph (application permission \"User.Read.All\" or \"Directory.Read.All\"). If neither works, the sign-in is refused."
msgstr "Die Mitgliedschaft wird aus dem „groups“-Claim des ID-Tokens gelesen, falls vorhanden; andernfalls fragt das Plugin Microsoft Graph (Anwendungsberechtigung „User.Read.All“ oder „Directory.Read.All“). Funktioniert beides nicht, wird die Anmeldung abgelehnt."
#: includes/class-m365-login-admin.php:696
#: includes/class-m365-login-admin.php:766
msgid "Button-only mode"
msgstr "Nur-Button-Modus"
#: includes/class-m365-login-admin.php:697
#: includes/class-m365-login-admin.php:767
msgid "Hides the username/password fields (on wp-login.php and in wp_login_form() forms) and refuses every interactive password sign-in on the site, including custom login forms. Application passwords, REST, XML-RPC and WP-CLI are not affected."
msgstr "Blendet die Benutzername/Passwort-Felder aus (auf wp-login.php und in wp_login_form()-Formularen) und lehnt jede interaktive Passwort-Anmeldung auf der Website ab, auch in eigenen Login-Formularen. Anwendungspasswörter, REST, XML-RPC und WP-CLI sind nicht betroffen."
#: includes/class-m365-login-admin.php:702
#: includes/class-m365-login-admin.php:772
msgid "Show only the Microsoft button on the login page"
msgstr "Auf der Login-Seite nur den Microsoft-Button anzeigen"
#: includes/class-m365-login-admin.php:703
#: includes/class-m365-login-admin.php:773
msgid "Becomes active once the connection is configured. Make sure your own account can sign in via Microsoft before enabling this."
msgstr "Wird aktiv, sobald die Verbindung eingerichtet ist. Vor dem Aktivieren sicherstellen, dass das eigene Konto sich per Microsoft anmelden kann."
#: includes/class-m365-login-admin.php:708
#: includes/class-m365-login-admin.php:778
msgid "Fallback link (keep it secret)"
msgstr "Fallback-Link (geheim halten)"
#: includes/class-m365-login-admin.php:709
#: includes/class-m365-login-admin.php:779
msgid "Opening this link shows the password form again in that browser for 30 minutes and allows password sign-in there. Bookmark it somewhere safe it is your way back in if Microsoft sign-in ever breaks."
msgstr "Wer diesen Link öffnet, sieht in diesem Browser 30 Minuten lang wieder das Passwort-Formular und kann sich dort mit Passwort anmelden. Sicher aufbewahren er ist der Weg zurück, falls die Microsoft-Anmeldung einmal nicht funktioniert."
#: includes/class-m365-login-admin.php:717
#: includes/class-m365-login-admin.php:787
msgid "Generate a new key when saving"
msgstr "Beim Speichern einen neuen Schlüssel erzeugen"
#: includes/class-m365-login-admin.php:720
#: includes/class-m365-login-admin.php:790
msgid "A key is generated automatically the first time you save these settings."
msgstr "Beim ersten Speichern dieser Einstellungen wird automatisch ein Schlüssel erzeugt."
#. translators: %s: PHP constant
#: includes/class-m365-login-admin.php:726
#: includes/class-m365-login-admin.php:796
msgid "Emergency switch: add %s to wp-config.php to disable button-only mode entirely."
msgstr "Notschalter: %s in die wp-config.php eintragen, um den Nur-Button-Modus vollständig abzuschalten."
#. translators: %s: PHP constant
#: includes/class-m365-login-admin.php:735
#: includes/class-m365-login-admin.php:805
msgid "What the plugin does to keep sign-ins safe"
msgstr "So schützt das Plugin die Anmeldung"
#: includes/class-m365-login-admin.php:737
#: includes/class-m365-login-admin.php:807
msgid "OpenID Connect authorization code flow with PKCE (S256) no tokens ever pass through the browser."
msgstr "OpenID Connect Authorization Code Flow mit PKCE (S256) Tokens laufen nie durch den Browser."
#: includes/class-m365-login-admin.php:738
#: includes/class-m365-login-admin.php:808
msgid "Single-use state and nonce values bound to the browser via an HttpOnly cookie (CSRF and replay protection)."
msgstr "Einmalige State- und Nonce-Werte, per HttpOnly-Cookie an den Browser gebunden (CSRF- und Replay-Schutz)."
#: includes/class-m365-login-admin.php:739
#: includes/class-m365-login-admin.php:809
msgid "ID token signature verified against Microsofts published signing keys; issuer, audience, tenant, expiry and nonce are checked."
msgstr "Signatur des ID-Tokens wird gegen Microsofts veröffentlichte Signaturschlüssel geprüft; Issuer, Audience, Tenant, Ablauf und Nonce werden kontrolliert."
#: includes/class-m365-login-admin.php:740
#: includes/class-m365-login-admin.php:810
msgid "Client secret encrypted at rest; no accounts are created, no passwords are changed."
msgstr "Client Secret verschlüsselt gespeichert; es werden keine Konten angelegt und keine Passwörter geändert."
#: includes/class-m365-login-admin.php:746
#: includes/class-m365-login-admin.php:816
msgid "Save changes"
msgstr "Änderungen speichern"
#: includes/class-m365-login-admin.php:752
#: includes/class-m365-login-admin.php:822
msgid "Redirect URI"
msgstr "Umleitungs-URI (Redirect URI)"
#: includes/class-m365-login-admin.php:753
#: includes/class-m365-login-admin.php:823
msgid "Register this URI in your app registration under Authentication → Web → Redirect URIs:"
msgstr "Diese URI in der App-Registrierung unter Authentifizierung → Web → Umleitungs-URIs eintragen:"
#: includes/class-m365-login-admin.php:759
#: includes/class-m365-login-admin.php:829
msgid "Plain permalinks are active, so the callback uses a query string. If you enable pretty permalinks later, the redirect URI changes and must be updated in Entra ID."
msgstr "Einfache Permalinks sind aktiv, daher verwendet der Callback einen Query-String. Werden später sprechende Permalinks aktiviert, ändert sich die Umleitungs-URI und muss in Entra ID angepasst werden."
#: includes/class-m365-login-admin.php:762
#: includes/class-m365-login-admin.php:832
msgid "Your site does not use HTTPS. Microsoft only accepts http:// redirect URIs for localhost; production sites must use HTTPS."
msgstr "Diese Website nutzt kein HTTPS. Microsoft akzeptiert http://-Umleitungs-URIs nur für localhost; produktive Websites benötigen HTTPS."
#: includes/class-m365-login-admin.php:767
#: includes/class-m365-login-admin.php:837
msgid "Setup guide: app registration"
msgstr "Anleitung: App-Registrierung"
#: includes/class-m365-login-admin.php:769
#: includes/class-m365-login-admin.php:839
msgid "Open entra.microsoft.com → Identity → Applications → App registrations → New registration."
msgstr "entra.microsoft.com → Identität → Anwendungen → App-Registrierungen → Neue Registrierung öffnen."
#: includes/class-m365-login-admin.php:770
#: includes/class-m365-login-admin.php:840
msgid "Name: e.g. \"WordPress login\". Supported account types: \"Accounts in this organizational directory only\" (single tenant)."
msgstr "Name: z. B. „WordPress Login“. Unterstützte Kontotypen: „Nur Konten in diesem Organisationsverzeichnis“ (Single Tenant)."
#: includes/class-m365-login-admin.php:771
#: includes/class-m365-login-admin.php:841
msgid "Redirect URI: choose the platform Web and paste the URI shown above. Then click Register."
msgstr "Umleitungs-URI: Plattform „Web“ wählen und die oben angezeigte URI einfügen. Dann auf „Registrieren“ klicken."
#: includes/class-m365-login-admin.php:772
#: includes/class-m365-login-admin.php:842
msgid "On the Overview page copy the Application (client) ID and the Directory (tenant) ID into the Connection tab."
msgstr "Auf der Übersichtsseite die Anwendungs-ID (Client) und die Verzeichnis-ID (Mandant) in den Tab „Verbindung“ kopieren."
#: includes/class-m365-login-admin.php:773
#: includes/class-m365-login-admin.php:843
msgid "Authentication: leave \"ID tokens\" unchecked (the plugin uses the authorization code flow) and \"Allow public client flows\" on No."
msgstr "Authentifizierung: „ID-Token“ nicht anhaken (das Plugin nutzt den Authorization Code Flow) und „Öffentliche Clientflows zulassen“ auf „Nein“ lassen."
#: includes/class-m365-login-admin.php:774
#: includes/class-m365-login-admin.php:844
msgid "Token configuration → Add optional claim → ID → tick \"email\" → Add. Confirm the API permission prompt."
msgstr "Tokenkonfiguration → Optionalen Anspruch hinzufügen → ID → „email“ anhaken → Hinzufügen. Die Rückfrage zur API-Berechtigung bestätigen."
#: includes/class-m365-login-admin.php:775
#: includes/class-m365-login-admin.php:845
msgid "Pick the authentication method on the Connection tab and follow its step-by-step guide (client secret or certificate)."
msgstr "Im Tab „Verbindung“ die Authentifizierungsmethode wählen und der zugehörigen Schritt-für-Schritt-Anleitung folgen (Client Secret oder Zertifikat)."
#: includes/class-m365-login-admin.php:776
#: includes/class-m365-login-admin.php:846
msgid "Optional: restrict who may use the app under Enterprise applications → your app → Properties → \"Assignment required\" = Yes, then assign users/groups."
msgstr "Optional: Unter Unternehmensanwendungen → deine App → Eigenschaften → „Zuweisung erforderlich“ = Ja einschränken, wer die App nutzen darf, und dann Benutzer/Gruppen zuweisen."
#: includes/class-m365-login-admin.php:778
#: includes/class-m365-login-admin.php:848
msgid "Required API permission: openid, profile, email (delegated) granted by default."
msgstr "Benötigte API-Berechtigungen: openid, profile, email (delegiert) standardmäßig vorhanden."
#: includes/class-m365-login-admin.php:779
#: includes/class-m365-login-admin.php:849
msgid "Optional, for group restrictions: application permissions GroupMember.Read.All and User.Read.All (Microsoft Graph) with admin consent."
msgstr "Optional für Gruppen-Beschränkungen: Anwendungsberechtigungen GroupMember.Read.All und User.Read.All (Microsoft Graph) mit Administratorzustimmung."
#: includes/class-m365-login-admin.php:783
#: includes/class-m365-login-admin.php:853
msgid "Shortcode"
msgstr "Shortcode"
#: includes/class-m365-login-admin.php:784
#: includes/class-m365-login-admin.php:854
msgid "Place the button on a custom login page:"
msgstr "Button auf einer eigenen Login-Seite platzieren:"
#: includes/class-m365-login-admin.php:786
#: includes/class-m365-login-admin.php:856
msgid "More options on the Button tab under \"Custom login page\"."
msgstr "Weitere Optionen im Tab „Button“ unter „Eigene Login-Seite“."

View file

@ -16,709 +16,709 @@ msgstr ""
"X-Generator: bin/make-pot.py\n"
"X-Domain: m365-login\n"
#: includes/class-m365-login-admin.php:79 includes/class-m365-login-admin.php:80 includes/class-m365-login-admin.php:315
#: includes/class-m365-login-admin.php:81 includes/class-m365-login-admin.php:82 includes/class-m365-login-admin.php:93 includes/class-m365-login-admin.php:382
msgid "M365 Login"
msgstr "M365 Login"
#: includes/class-m365-login-admin.php:118
#: includes/class-m365-login-admin.php:108
msgid "Connection"
msgstr "Verbindung"
#: includes/class-m365-login-admin.php:109
msgid "Button"
msgstr "Button"
#: includes/class-m365-login-admin.php:110
msgid "Security"
msgstr "Sicherheit"
#: includes/class-m365-login-admin.php:185
msgid "M365 Login is active but not connected to Microsoft Entra ID yet."
msgstr "M365 Login ist aktiv, aber noch nicht mit Microsoft Entra ID verbunden."
#: includes/class-m365-login-admin.php:120
#: includes/class-m365-login-admin.php:187
msgid "Open the settings"
msgstr "Einstellungen öffnen"
#: includes/class-m365-login-admin.php:150
#: includes/class-m365-login-admin.php:217
msgid "Choose button icon"
msgstr "Button-Icon auswählen"
#: includes/class-m365-login-admin.php:151
#: includes/class-m365-login-admin.php:218
msgid "Use this icon"
msgstr "Dieses Icon verwenden"
#: includes/class-m365-login-admin.php:152
#: includes/class-m365-login-admin.php:219
msgid "Copied!"
msgstr "Kopiert!"
#: includes/class-m365-login-admin.php:153 includes/class-m365-login-admin.php:435 includes/class-m365-login-admin.php:713 includes/class-m365-login-admin.php:756
#: includes/class-m365-login-admin.php:220 includes/class-m365-login-admin.php:505 includes/class-m365-login-admin.php:783 includes/class-m365-login-admin.php:826
msgid "Copy"
msgstr "Kopieren"
#: includes/class-m365-login-admin.php:154
#: includes/class-m365-login-admin.php:221
msgid "Testing…"
msgstr "Wird geprüft …"
#: includes/class-m365-login-admin.php:155
#: includes/class-m365-login-admin.php:222
msgid "The tenant could not be reached. Check the tenant ID and the servers outgoing connections."
msgstr "Der Tenant ist nicht erreichbar. Bitte Tenant-ID und ausgehende Verbindungen des Servers prüfen."
#: includes/class-m365-login-admin.php:156
#: includes/class-m365-login-admin.php:223
msgid "No groups found."
msgstr "Keine Gruppen gefunden."
#: includes/class-m365-login-admin.php:157
#: includes/class-m365-login-admin.php:224
msgid "Searching…"
msgstr "Suche läuft …"
#: includes/class-m365-login-admin.php:158
#: includes/class-m365-login-admin.php:225
msgid "Add"
msgstr "Hinzufügen"
#: includes/class-m365-login-admin.php:159 includes/class-m365-login-admin.php:687
#: includes/class-m365-login-admin.php:226 includes/class-m365-login-admin.php:757
msgid "Remove"
msgstr "Entfernen"
#: includes/class-m365-login-admin.php:160 includes/class-m365-login-admin.php:218 includes/class-m365-login-admin.php:672
#: includes/class-m365-login-admin.php:227 includes/class-m365-login-admin.php:285 includes/class-m365-login-admin.php:742
msgid "Save the connection settings first, then search for groups."
msgstr "Zuerst die Verbindungseinstellungen speichern, dann Gruppen suchen."
#: includes/class-m365-login-admin.php:161
#: includes/class-m365-login-admin.php:228
msgid "Generate a new fallback key on save? The old link stops working."
msgstr "Beim Speichern einen neuen Fallback-Schlüssel erzeugen? Der alte Link funktioniert dann nicht mehr."
#: includes/class-m365-login-admin.php:162
#: includes/class-m365-login-admin.php:229
msgid "Generating a 3072-bit key pair, this takes a moment…"
msgstr "3072-Bit-Schlüsselpaar wird erzeugt, das dauert einen Moment …"
#: includes/class-m365-login-admin.php:163
#: includes/class-m365-login-admin.php:230
msgid "Replace the stored certificate? Sign-in stops working until the new certificate is uploaded to Entra ID."
msgstr "Gespeichertes Zertifikat ersetzen? Die Anmeldung funktioniert erst wieder, wenn das neue Zertifikat in Entra ID hochgeladen ist."
#: includes/class-m365-login-admin.php:164
#: includes/class-m365-login-admin.php:231
msgid "Remove the stored certificate when saving? Sign-in with the certificate method stops working."
msgstr "Gespeichertes Zertifikat beim Speichern entfernen? Die Anmeldung per Zertifikat funktioniert dann nicht mehr."
#: includes/class-m365-login-admin.php:176 includes/class-m365-login-admin.php:215 includes/class-m365-login-admin.php:241 includes/class-m365-login-admin.php:273
#: includes/class-m365-login-admin.php:243 includes/class-m365-login-admin.php:282 includes/class-m365-login-admin.php:308 includes/class-m365-login-admin.php:340
msgid "You are not allowed to do this."
msgstr "Dafür fehlt die Berechtigung."
#: includes/class-m365-login-admin.php:181
#: includes/class-m365-login-admin.php:248
msgid "Please enter a valid tenant ID first."
msgstr "Bitte zuerst eine gültige Tenant-ID eingeben."
#. translators: %d: HTTP status code
#: includes/class-m365-login-admin.php:195
#: includes/class-m365-login-admin.php:262
msgid "Microsoft answered with HTTP %d. Is the tenant ID correct?"
msgstr "Microsoft hat mit HTTP %d geantwortet. Ist die Tenant-ID korrekt?"
#. translators: %d: HTTP status code
#: includes/class-m365-login-admin.php:204
#: includes/class-m365-login-admin.php:271
msgid "Tenant reachable. The OpenID configuration was loaded successfully."
msgstr "Tenant erreichbar. Die OpenID-Konfiguration wurde erfolgreich geladen."
#: includes/class-m365-login-admin.php:227
#: includes/class-m365-login-admin.php:294
msgid "Microsoft Graph refused the request. Grant the application permission \"GroupMember.Read.All\" (or \"Directory.Read.All\") with admin consent in Entra ID."
msgstr "Microsoft Graph hat die Anfrage abgelehnt. In Entra ID die Anwendungsberechtigung „GroupMember.Read.All“ (oder „Directory.Read.All“) mit Administratorzustimmung erteilen."
#: includes/class-m365-login-admin.php:245
#: includes/class-m365-login-admin.php:312
msgid "Unknown operation."
msgstr "Unbekannte Aktion."
#: includes/class-m365-login-admin.php:262
#: includes/class-m365-login-admin.php:329
msgid "Certificate generated and stored. Download the .cer file and upload it in Entra ID."
msgstr "Zertifikat erzeugt und gespeichert. Jetzt die .cer-Datei herunterladen und in Entra ID hochladen."
#: includes/class-m365-login-admin.php:279
#: includes/class-m365-login-admin.php:346
msgid "No certificate is stored."
msgstr "Es ist kein Zertifikat gespeichert."
#: includes/class-m365-login-admin.php:297
#: includes/class-m365-login-admin.php:364
msgid "You are not allowed to access this page."
msgstr "Für diese Seite fehlt die Berechtigung."
#: includes/class-m365-login-admin.php:316
#: includes/class-m365-login-admin.php:383
msgid "Let existing users sign in with their Microsoft 365 / Entra ID account."
msgstr "Bestehende Benutzer melden sich mit ihrem Microsoft 365 / Entra ID-Konto an."
#: includes/class-m365-login-admin.php:321
#: includes/class-m365-login-admin.php:388
msgid "Connected"
msgstr "Verbunden"
#: includes/class-m365-login-admin.php:321
#: includes/class-m365-login-admin.php:388
msgid "Setup incomplete"
msgstr "Einrichtung unvollständig"
#: includes/class-m365-login-admin.php:329
msgid "Connection"
msgstr "Verbindung"
#: includes/class-m365-login-admin.php:330
msgid "Button"
msgstr "Button"
#: includes/class-m365-login-admin.php:331
msgid "Security"
msgstr "Sicherheit"
#: includes/class-m365-login-admin.php:340
#: includes/class-m365-login-admin.php:410
msgid "Microsoft Entra ID app registration"
msgstr "App-Registrierung in Microsoft Entra ID"
#: includes/class-m365-login-admin.php:341
#: includes/class-m365-login-admin.php:411
msgid "Enter the values from your app registration in the Microsoft Entra admin center."
msgstr "Tragen Sie hier die Werte aus Ihrer App-Registrierung im Microsoft Entra Admin Center ein."
#: includes/class-m365-login-admin.php:344
#: includes/class-m365-login-admin.php:414
msgid "Directory (tenant) ID"
msgstr "Verzeichnis-ID (Mandant/Tenant)"
#: includes/class-m365-login-admin.php:347
#: includes/class-m365-login-admin.php:417
msgid "Test tenant"
msgstr "Tenant testen"
#: includes/class-m365-login-admin.php:349
#: includes/class-m365-login-admin.php:419
msgid "Recommended: the GUID of your tenant. Only sign-ins from this tenant are accepted. \"organizations\" allows any work or school account."
msgstr "Empfohlen: die GUID Ihres Tenants. Dann werden nur Anmeldungen aus diesem Tenant akzeptiert. „organizations“ erlaubt beliebige Geschäfts-, Schul- oder Unikonten."
#: includes/class-m365-login-admin.php:351
#: includes/class-m365-login-admin.php:421
msgid "Multi-tenant mode: accounts from any Microsoft tenant can sign in. Their \"email\" attribute is not verified, so the plugin matches on the user principal name (verified domain) only and ignores the e-mail claim unless Microsoft marks it as domain-verified. Use the e-mail domain allow-list on the Security tab, or better, pin your tenant GUID."
msgstr "Multi-Tenant-Modus: Konten aus beliebigen Microsoft-Tenants können sich anmelden. Deren „email“-Attribut ist nicht verifiziert, deshalb ordnet das Plugin nur über den User Principal Name (verifizierte Domain) zu und ignoriert den E-Mail-Claim, sofern Microsoft ihn nicht als domain-verifiziert markiert. Nutze die Domain-Allowlist im Tab „Sicherheit“ oder besser: die Tenant-GUID eintragen."
#: includes/class-m365-login-admin.php:357
#: includes/class-m365-login-admin.php:427
msgid "Application (client) ID"
msgstr "Anwendungs-ID (Client)"
#: includes/class-m365-login-admin.php:362
#: includes/class-m365-login-admin.php:432
msgid "How should WordPress authenticate to Microsoft?"
msgstr "Wie soll sich WordPress bei Microsoft authentifizieren?"
#: includes/class-m365-login-admin.php:367 includes/class-m365-login-admin.php:384
#: includes/class-m365-login-admin.php:437 includes/class-m365-login-admin.php:454
msgid "Client secret"
msgstr "Geheimer Clientschlüssel (Client Secret)"
#: includes/class-m365-login-admin.php:368
#: includes/class-m365-login-admin.php:438
msgid "Quick to set up. A password-like value created in Entra ID that expires after 624 months and must be renewed."
msgstr "Schnell eingerichtet. Ein passwortähnlicher Wert aus Entra ID, der nach 624 Monaten abläuft und erneuert werden muss."
#: includes/class-m365-login-admin.php:374
#: includes/class-m365-login-admin.php:444
msgid "Certificate"
msgstr "Zertifikat"
#: includes/class-m365-login-admin.php:374
#: includes/class-m365-login-admin.php:444
msgid "Recommended"
msgstr "Empfohlen"
#: includes/class-m365-login-admin.php:375
#: includes/class-m365-login-admin.php:445
msgid "The private key never leaves this server; only the public certificate is uploaded to Entra ID. Generated here with one click, valid for 2 years."
msgstr "Der private Schlüssel verlässt diesen Server nie; nur das öffentliche Zertifikat wird in Entra ID hochgeladen. Mit einem Klick hier erzeugt, 2 Jahre gültig."
#: includes/class-m365-login-admin.php:386
#: includes/class-m365-login-admin.php:456
msgid "•••••••••••• (stored, leave empty to keep)"
msgstr "•••••••••••• (gespeichert leer lassen, um zu behalten)"
#: includes/class-m365-login-admin.php:386
#: includes/class-m365-login-admin.php:456
msgid "Paste the secret value"
msgstr "Wert des Secrets einfügen"
#: includes/class-m365-login-admin.php:387
#: includes/class-m365-login-admin.php:457
msgid "Show secret"
msgstr "Secret anzeigen"
#: includes/class-m365-login-admin.php:392
#: includes/class-m365-login-admin.php:462
msgid "Remove the stored secret"
msgstr "Gespeichertes Secret entfernen"
#: includes/class-m365-login-admin.php:395
#: includes/class-m365-login-admin.php:465
msgid "Stored encrypted (AES-256-GCM, key derived from your WordPress salts) and never displayed again. Client secrets expire note the expiry date in Entra ID."
msgstr "Wird verschlüsselt gespeichert (AES-256-GCM, Schlüssel aus den WordPress-Salts abgeleitet) und nie wieder angezeigt. Client Secrets laufen ab Ablaufdatum in Entra ID notieren."
#: includes/class-m365-login-admin.php:399
#: includes/class-m365-login-admin.php:469
msgid "Step-by-step: create a client secret in Entra ID"
msgstr "Schritt für Schritt: Client Secret in Entra ID erstellen"
#: includes/class-m365-login-admin.php:402
#: includes/class-m365-login-admin.php:472
msgid "Open entra.microsoft.com and sign in with an account that has the \"Application Administrator\" or \"Global Administrator\" role."
msgstr "entra.microsoft.com öffnen und mit einem Konto anmelden, das die Rolle „Anwendungsadministrator“ oder „Globaler Administrator“ hat."
#: includes/class-m365-login-admin.php:403
#: includes/class-m365-login-admin.php:473
msgid "Go to Identity → Applications → App registrations and open your app (or create it first, see the general guide in the sidebar)."
msgstr "Zu Identität → Anwendungen → App-Registrierungen wechseln und die App öffnen (oder zuerst anlegen, siehe allgemeine Anleitung in der Seitenleiste)."
#: includes/class-m365-login-admin.php:404
#: includes/class-m365-login-admin.php:474
msgid "In the left menu choose Certificates & secrets, then the tab Client secrets, and click New client secret."
msgstr "Im linken Menü „Zertifikate & Geheimnisse“ wählen, dann den Reiter „Geheime Clientschlüssel“ und auf „Neuer geheimer Clientschlüssel“ klicken."
#: includes/class-m365-login-admin.php:405
#: includes/class-m365-login-admin.php:475
msgid "Enter a description such as \"WordPress login\" and pick an expiry. Microsoft allows at most 24 months; put a reminder in your calendar two weeks before."
msgstr "Eine Beschreibung wie „WordPress Login“ eingeben und eine Gültigkeit wählen. Microsoft erlaubt maximal 24 Monate; zwei Wochen vor Ablauf eine Kalender-Erinnerung setzen."
#: includes/class-m365-login-admin.php:406
#: includes/class-m365-login-admin.php:476
msgid "Click Add. Copy the Value column immediately it is shown only once. The Secret ID column is NOT what you need."
msgstr "Auf „Hinzufügen“ klicken. Die Spalte „Wert“ sofort kopieren sie wird nur einmal angezeigt. Die Spalte „Geheimnis-ID“ ist NICHT der gesuchte Wert."
#: includes/class-m365-login-admin.php:407
#: includes/class-m365-login-admin.php:477
msgid "Paste the value into the Client secret field above and save this page."
msgstr "Den Wert oben in das Feld „Geheimer Clientschlüssel“ einfügen und diese Seite speichern."
#: includes/class-m365-login-admin.php:409
#: includes/class-m365-login-admin.php:479
msgid "When the secret expires, sign-ins fail with \"Could not complete the sign-in with Microsoft\". Create a new secret, paste it here, save, then delete the old one in Entra ID."
msgstr "Läuft das Secret ab, scheitern Anmeldungen mit „Die Anmeldung über Microsoft konnte nicht abgeschlossen werden“. Dann ein neues Secret erstellen, hier einfügen, speichern und das alte in Entra ID löschen."
#: includes/class-m365-login-admin.php:422
#: includes/class-m365-login-admin.php:492
msgid "Expired"
msgstr "Abgelaufen"
#. translators: %d: number of days
#: includes/class-m365-login-admin.php:426
#: includes/class-m365-login-admin.php:496
msgid "Expires in %d days"
msgstr "Läuft in %d Tagen ab"
#. translators: %d: number of days
#: includes/class-m365-login-admin.php:429
#: includes/class-m365-login-admin.php:499
msgid "Valid"
msgstr "Gültig"
#: includes/class-m365-login-admin.php:434
#: includes/class-m365-login-admin.php:504
msgid "Thumbprint (SHA-1)"
msgstr "Fingerabdruck (SHA-1)"
#: includes/class-m365-login-admin.php:436
#: includes/class-m365-login-admin.php:506
msgid "Subject"
msgstr "Antragsteller"
#: includes/class-m365-login-admin.php:438
#: includes/class-m365-login-admin.php:508
msgid "Key size"
msgstr "Schlüssellänge"
#: includes/class-m365-login-admin.php:440
#: includes/class-m365-login-admin.php:510
msgid "Valid until"
msgstr "Gültig bis"
#: includes/class-m365-login-admin.php:444
#: includes/class-m365-login-admin.php:514
msgid "Download certificate (.cer)"
msgstr "Zertifikat herunterladen (.cer)"
#: includes/class-m365-login-admin.php:445
#: includes/class-m365-login-admin.php:515
msgid "Generate new certificate"
msgstr "Neues Zertifikat erzeugen"
#: includes/class-m365-login-admin.php:448
#: includes/class-m365-login-admin.php:518
msgid "Remove certificate when saving"
msgstr "Zertifikat beim Speichern entfernen"
#: includes/class-m365-login-admin.php:452
#: includes/class-m365-login-admin.php:522
msgid "No certificate stored yet."
msgstr "Noch kein Zertifikat gespeichert."
#: includes/class-m365-login-admin.php:454
#: includes/class-m365-login-admin.php:524
msgid "Generate certificate"
msgstr "Zertifikat erzeugen"
#: includes/class-m365-login-admin.php:455
#: includes/class-m365-login-admin.php:525
msgid "3072-bit RSA, self-signed, valid for 2 years. The private key is stored encrypted and never shown or downloadable."
msgstr "3072 Bit RSA, selbstsigniert, 2 Jahre gültig. Der private Schlüssel wird verschlüsselt gespeichert und nie angezeigt oder zum Download angeboten."
#: includes/class-m365-login-admin.php:459
#: includes/class-m365-login-admin.php:529
msgid "Use your own certificate instead (paste PEM)"
msgstr "Stattdessen eigenes Zertifikat verwenden (PEM einfügen)"
#: includes/class-m365-login-admin.php:462
#: includes/class-m365-login-admin.php:532
msgid "Private key (PEM, unencrypted)"
msgstr "Privater Schlüssel (PEM, unverschlüsselt)"
#: includes/class-m365-login-admin.php:466
#: includes/class-m365-login-admin.php:536
msgid "Certificate (PEM)"
msgstr "Zertifikat (PEM)"
#: includes/class-m365-login-admin.php:468
#: includes/class-m365-login-admin.php:538
msgid "RSA, at least 2048 bits. The pair is validated and the key is encrypted when you save. Both fields stay empty afterwards."
msgstr "RSA, mindestens 2048 Bit. Beim Speichern wird das Paar geprüft und der Schlüssel verschlüsselt. Beide Felder bleiben danach leer."
#: includes/class-m365-login-admin.php:474
#: includes/class-m365-login-admin.php:544
msgid "Step-by-step: register the certificate in Entra ID"
msgstr "Schritt für Schritt: Zertifikat in Entra ID hinterlegen"
#: includes/class-m365-login-admin.php:477
#: includes/class-m365-login-admin.php:547
msgid "Click Generate certificate above (or paste your own). Then click Download certificate (.cer) the file contains only the public part."
msgstr "Oben auf „Zertifikat erzeugen“ klicken (oder ein eigenes einfügen). Danach „Zertifikat herunterladen (.cer)“ die Datei enthält nur den öffentlichen Teil."
#: includes/class-m365-login-admin.php:478
#: includes/class-m365-login-admin.php:548
msgid "Open entra.microsoft.com → Identity → Applications → App registrations and open your app."
msgstr "entra.microsoft.com → Identität → Anwendungen → App-Registrierungen öffnen und die App auswählen."
#: includes/class-m365-login-admin.php:479
#: includes/class-m365-login-admin.php:549
msgid "Choose Certificates & secrets in the left menu, then the tab Certificates, and click Upload certificate."
msgstr "Im linken Menü „Zertifikate & Geheimnisse“ wählen, dann den Reiter „Zertifikate“ und auf „Zertifikat hochladen“ klicken."
#: includes/class-m365-login-admin.php:480
#: includes/class-m365-login-admin.php:550
msgid "Select the downloaded .cer file, add a description such as \"WordPress login\" and click Add."
msgstr "Die heruntergeladene .cer-Datei auswählen, eine Beschreibung wie „WordPress Login“ eingeben und auf „Hinzufügen“ klicken."
#: includes/class-m365-login-admin.php:481
#: includes/class-m365-login-admin.php:551
msgid "Compare the thumbprint Entra ID shows with the thumbprint above they must match exactly."
msgstr "Den in Entra ID angezeigten Fingerabdruck mit dem Fingerabdruck oben vergleichen beide müssen exakt übereinstimmen."
#: includes/class-m365-login-admin.php:482
#: includes/class-m365-login-admin.php:552
msgid "Make sure Certificate is selected above and save this page. If a client secret was stored before, you may delete it in Entra ID now."
msgstr "Sicherstellen, dass oben „Zertifikat“ ausgewählt ist, und diese Seite speichern. War vorher ein Client Secret gespeichert, kann es jetzt in Entra ID gelöscht werden."
#: includes/class-m365-login-admin.php:484
#: includes/class-m365-login-admin.php:554
msgid "How it works: for every token request WordPress signs a short-lived JWT (client assertion) with the private key; Microsoft verifies it with the uploaded certificate. Nothing secret is ever transmitted."
msgstr "So funktioniert es: Für jede Token-Anfrage signiert WordPress ein kurzlebiges JWT (Client Assertion) mit dem privaten Schlüssel; Microsoft prüft es mit dem hochgeladenen Zertifikat. Es wird nie ein Geheimnis übertragen."
#: includes/class-m365-login-admin.php:485
#: includes/class-m365-login-admin.php:555
msgid "Before the certificate expires: generate a new one here, upload it to Entra ID (both may be registered at the same time), save, then remove the old one from Entra ID. Sign-ins keep working during the switch."
msgstr "Vor Ablauf des Zertifikats: hier ein neues erzeugen, in Entra ID hochladen (beide dürfen gleichzeitig hinterlegt sein), speichern und danach das alte in Entra ID entfernen. Anmeldungen funktionieren während des Wechsels weiter."
#: includes/class-m365-login-admin.php:491
#: includes/class-m365-login-admin.php:561
msgid "Account prompt"
msgstr "Kontoauswahl"
#: includes/class-m365-login-admin.php:493
#: includes/class-m365-login-admin.php:563
msgid "Always let the user pick an account (recommended)"
msgstr "Benutzer wählt immer ein Konto aus (empfohlen)"
#: includes/class-m365-login-admin.php:494
#: includes/class-m365-login-admin.php:564
msgid "Use the current Microsoft session if available"
msgstr "Vorhandene Microsoft-Sitzung verwenden, falls vorhanden"
#: includes/class-m365-login-admin.php:495
#: includes/class-m365-login-admin.php:565
msgid "Always require re-entering credentials"
msgstr "Immer erneute Eingabe der Anmeldedaten verlangen"
#: includes/class-m365-login-admin.php:504
#: includes/class-m365-login-admin.php:574
msgid "Appearance"
msgstr "Darstellung"
#: includes/class-m365-login-admin.php:507
#: includes/class-m365-login-admin.php:577
msgid "Live preview"
msgstr "Live-Vorschau"
#: includes/class-m365-login-admin.php:521
#: includes/class-m365-login-admin.php:591
msgid "Button text"
msgstr "Button-Text"
#: includes/class-m365-login-admin.php:525
#: includes/class-m365-login-admin.php:595
msgid "Divider text"
msgstr "Trennlinien-Text"
#: includes/class-m365-login-admin.php:527
#: includes/class-m365-login-admin.php:597
msgid "Leave empty to hide the divider line."
msgstr "Leer lassen, um die Trennlinie auszublenden."
#: includes/class-m365-login-admin.php:532
#: includes/class-m365-login-admin.php:602
msgid "Icon"
msgstr "Icon"
#: includes/class-m365-login-admin.php:535
#: includes/class-m365-login-admin.php:605
msgid "Show an icon on the button"
msgstr "Icon auf dem Button anzeigen"
#: includes/class-m365-login-admin.php:546
#: includes/class-m365-login-admin.php:616
msgid "Default: Microsoft logo"
msgstr "Standard: Microsoft-Logo"
#: includes/class-m365-login-admin.php:548
#: includes/class-m365-login-admin.php:618
msgid "Choose from media library"
msgstr "Aus Mediathek wählen"
#: includes/class-m365-login-admin.php:549
#: includes/class-m365-login-admin.php:619
msgid "Use Microsoft logo"
msgstr "Microsoft-Logo verwenden"
#: includes/class-m365-login-admin.php:551
#: includes/class-m365-login-admin.php:621
msgid "PNG, SVG, JPG or WebP. Square images (e.g. 64×64 px) work best."
msgstr "PNG, SVG, JPG oder WebP. Quadratische Bilder (z. B. 64×64 px) eignen sich am besten."
#: includes/class-m365-login-admin.php:559
#: includes/class-m365-login-admin.php:629
msgid "Background"
msgstr "Hintergrund"
#: includes/class-m365-login-admin.php:560
#: includes/class-m365-login-admin.php:630
msgid "Background (hover)"
msgstr "Hintergrund (Hover)"
#: includes/class-m365-login-admin.php:561
#: includes/class-m365-login-admin.php:631
msgid "Text colour"
msgstr "Textfarbe"
#: includes/class-m365-login-admin.php:562
#: includes/class-m365-login-admin.php:632
msgid "Border"
msgstr "Rahmen"
#: includes/class-m365-login-admin.php:575
#: includes/class-m365-login-admin.php:645
msgid "Corner radius"
msgstr "Eckenradius"
#: includes/class-m365-login-admin.php:579
#: includes/class-m365-login-admin.php:649
msgid "Position on the login page"
msgstr "Position auf der Login-Seite"
#: includes/class-m365-login-admin.php:581
#: includes/class-m365-login-admin.php:651
msgid "Below the login form"
msgstr "Unter dem Login-Formular"
#: includes/class-m365-login-admin.php:582
#: includes/class-m365-login-admin.php:652
msgid "Above the login form"
msgstr "Über dem Login-Formular"
#: includes/class-m365-login-admin.php:588
#: includes/class-m365-login-admin.php:658
msgid "Quick presets"
msgstr "Schnellauswahl"
#: includes/class-m365-login-admin.php:589
#: includes/class-m365-login-admin.php:659
msgid "Microsoft dark"
msgstr "Microsoft dunkel"
#: includes/class-m365-login-admin.php:590
#: includes/class-m365-login-admin.php:660
msgid "Microsoft light"
msgstr "Microsoft hell"
#: includes/class-m365-login-admin.php:591
#: includes/class-m365-login-admin.php:661
msgid "Azure blue"
msgstr "Azure-Blau"
#: includes/class-m365-login-admin.php:592
#: includes/class-m365-login-admin.php:662
msgid "WordPress blue"
msgstr "WordPress-Blau"
#: includes/class-m365-login-admin.php:596
#: includes/class-m365-login-admin.php:666
msgid "Custom login page"
msgstr "Eigene Login-Seite"
#: includes/class-m365-login-admin.php:597
#: includes/class-m365-login-admin.php:667
msgid "Using your own login page instead of wp-login.php? Tell the plugin where it is so error messages, the fallback link and the post-logout redirect point there."
msgstr "Eigene Login-Seite statt wp-login.php? Hier eintragen, damit Fehlermeldungen, der Fallback-Link und die Weiterleitung nach dem Abmelden dorthin zeigen."
#: includes/class-m365-login-admin.php:600
#: includes/class-m365-login-admin.php:670
msgid "URL of your login page"
msgstr "URL der Login-Seite"
#: includes/class-m365-login-admin.php:602
#: includes/class-m365-login-admin.php:672
msgid "Must be on this site. Leave empty to use wp-login.php."
msgstr "Muss auf dieser Website liegen. Leer lassen, um wp-login.php zu verwenden."
#: includes/class-m365-login-admin.php:608
#: includes/class-m365-login-admin.php:678
msgid "Add the button to every wp_login_form() form automatically"
msgstr "Button automatisch in jedes wp_login_form()-Formular einfügen"
#: includes/class-m365-login-admin.php:609
#: includes/class-m365-login-admin.php:679
msgid "Covers themes and plugins that use the WordPress login form function. Page-builder widgets need the shortcode or the template function below."
msgstr "Deckt Themes und Plugins ab, die die WordPress-Login-Formularfunktion verwenden. Page-Builder-Widgets benötigen den Shortcode oder die Template-Funktion unten."
#: includes/class-m365-login-admin.php:614
#: includes/class-m365-login-admin.php:684
msgid "Manual placement"
msgstr "Manuelle Platzierung"
#: includes/class-m365-login-admin.php:615
#: includes/class-m365-login-admin.php:685
msgid "Shortcode (block editor, page builders):"
msgstr "Shortcode (Block-Editor, Page Builder):"
#: includes/class-m365-login-admin.php:617
#: includes/class-m365-login-admin.php:687
msgid "Template function (theme files):"
msgstr "Template-Funktion (Theme-Dateien):"
#: includes/class-m365-login-admin.php:619
#: includes/class-m365-login-admin.php:689
msgid "Both show the error messages of the last attempt; use m365_login_messages() to place them separately."
msgstr "Beide zeigen die Fehlermeldungen des letzten Versuchs; mit m365_login_messages() lassen sie sich separat platzieren."
#: includes/class-m365-login-admin.php:627
#: includes/class-m365-login-admin.php:697
msgid "User matching & hardening"
msgstr "Benutzerzuordnung & Härtung"
#: includes/class-m365-login-admin.php:628
#: includes/class-m365-login-admin.php:698
msgid "Users are never created automatically. A Microsoft sign-in only succeeds when a WordPress user with the same e-mail address already exists."
msgstr "Benutzer werden nie automatisch angelegt. Eine Microsoft-Anmeldung gelingt nur, wenn bereits ein WordPress-Benutzer mit derselben E-Mail-Adresse existiert."
#: includes/class-m365-login-admin.php:633
#: includes/class-m365-login-admin.php:703
msgid "Bind WordPress accounts to the Microsoft object ID"
msgstr "WordPress-Konten an die Microsoft-Objekt-ID binden"
#: includes/class-m365-login-admin.php:634
#: includes/class-m365-login-admin.php:704
msgid "On first sign-in the immutable Microsoft object ID is stored with the user. Later sign-ins with the same e-mail but a different Microsoft identity are rejected. Strongly recommended."
msgstr "Bei der ersten Anmeldung wird die unveränderliche Microsoft-Objekt-ID am Benutzer gespeichert. Spätere Anmeldungen mit gleicher E-Mail, aber anderer Microsoft-Identität werden abgelehnt. Dringend empfohlen."
#: includes/class-m365-login-admin.php:641
#: includes/class-m365-login-admin.php:711
msgid "Fall back to the user principal name (UPN)"
msgstr "Auf den User Principal Name (UPN) zurückgreifen"
#: includes/class-m365-login-admin.php:642
#: includes/class-m365-login-admin.php:712
msgid "If the token contains no \"email\" claim, use the UPN (e.g. jane@contoso.com) when it is a valid e-mail address. Usually required for work accounts."
msgstr "Enthält das Token keinen „email“-Claim, wird der UPN (z. B. jane@contoso.com) verwendet, sofern er eine gültige E-Mail-Adresse ist. Für Geschäftskonten meist erforderlich."
#: includes/class-m365-login-admin.php:649
#: includes/class-m365-login-admin.php:719
msgid "Keep users signed in (\"Remember me\")"
msgstr "Benutzer angemeldet lassen („Angemeldet bleiben“)"
#: includes/class-m365-login-admin.php:650
#: includes/class-m365-login-admin.php:720
msgid "Issues a 14-day WordPress session instead of a browser session."
msgstr "Erstellt eine 14-tägige WordPress-Sitzung statt einer Browser-Sitzung."
#: includes/class-m365-login-admin.php:655
#: includes/class-m365-login-admin.php:725
msgid "Allowed e-mail domains (optional)"
msgstr "Erlaubte E-Mail-Domains (optional)"
#: includes/class-m365-login-admin.php:657
#: includes/class-m365-login-admin.php:727
msgid "One or more domains separated by commas or new lines. Leave empty to allow any domain of your tenant."
msgstr "Eine oder mehrere Domains, getrennt durch Kommas oder Zeilenumbrüche. Leer lassen, um alle Domains des Tenants zuzulassen."
#: includes/class-m365-login-admin.php:662
#: includes/class-m365-login-admin.php:732
msgid "Allowed Entra groups (optional)"
msgstr "Erlaubte Entra-Gruppen (optional)"
#: includes/class-m365-login-admin.php:663
#: includes/class-m365-login-admin.php:733
msgid "Only members of at least one of these groups may sign in. Leave empty to allow every matched user. Nested memberships count."
msgstr "Nur Mitglieder mindestens einer dieser Gruppen dürfen sich anmelden. Leer lassen, um alle zugeordneten Benutzer zuzulassen. Verschachtelte Mitgliedschaften zählen."
#: includes/class-m365-login-admin.php:666
#: includes/class-m365-login-admin.php:736
msgid "Search groups"
msgstr "Gruppen suchen"
#: includes/class-m365-login-admin.php:668
#: includes/class-m365-login-admin.php:738
msgid "Type a group name or paste an object ID…"
msgstr "Gruppenname eingeben oder Objekt-ID einfügen …"
#: includes/class-m365-login-admin.php:669
#: includes/class-m365-login-admin.php:739
msgid "Search"
msgstr "Suchen"
#: includes/class-m365-login-admin.php:674
#: includes/class-m365-login-admin.php:744
msgid "Needs the application permission \"GroupMember.Read.All\" with admin consent. Without it you can still paste group object IDs."
msgstr "Benötigt die Anwendungsberechtigung „GroupMember.Read.All“ mit Administratorzustimmung. Ohne sie können Gruppen-Objekt-IDs trotzdem eingefügt werden."
#: includes/class-m365-login-admin.php:680
#: includes/class-m365-login-admin.php:750
msgid "Selected groups"
msgstr "Ausgewählte Gruppen"
#: includes/class-m365-login-admin.php:681
#: includes/class-m365-login-admin.php:751
msgid "No groups selected every matched user may sign in."
msgstr "Keine Gruppen ausgewählt jeder zugeordnete Benutzer darf sich anmelden."
#: includes/class-m365-login-admin.php:691
#: includes/class-m365-login-admin.php:761
msgid "Membership is read from the \"groups\" claim of the ID token when present; otherwise the plugin asks Microsoft Graph (application permission \"User.Read.All\" or \"Directory.Read.All\"). If neither works, the sign-in is refused."
msgstr "Die Mitgliedschaft wird aus dem „groups“-Claim des ID-Tokens gelesen, falls vorhanden; andernfalls fragt das Plugin Microsoft Graph (Anwendungsberechtigung „User.Read.All“ oder „Directory.Read.All“). Funktioniert beides nicht, wird die Anmeldung abgelehnt."
#: includes/class-m365-login-admin.php:696
#: includes/class-m365-login-admin.php:766
msgid "Button-only mode"
msgstr "Nur-Button-Modus"
#: includes/class-m365-login-admin.php:697
#: includes/class-m365-login-admin.php:767
msgid "Hides the username/password fields (on wp-login.php and in wp_login_form() forms) and refuses every interactive password sign-in on the site, including custom login forms. Application passwords, REST, XML-RPC and WP-CLI are not affected."
msgstr "Blendet die Benutzername/Passwort-Felder aus (auf wp-login.php und in wp_login_form()-Formularen) und lehnt jede interaktive Passwort-Anmeldung auf der Website ab, auch in eigenen Login-Formularen. Anwendungspasswörter, REST, XML-RPC und WP-CLI sind nicht betroffen."
#: includes/class-m365-login-admin.php:702
#: includes/class-m365-login-admin.php:772
msgid "Show only the Microsoft button on the login page"
msgstr "Auf der Login-Seite nur den Microsoft-Button anzeigen"
#: includes/class-m365-login-admin.php:703
#: includes/class-m365-login-admin.php:773
msgid "Becomes active once the connection is configured. Make sure your own account can sign in via Microsoft before enabling this."
msgstr "Wird aktiv, sobald die Verbindung eingerichtet ist. Vor dem Aktivieren sicherstellen, dass das eigene Konto sich per Microsoft anmelden kann."
#: includes/class-m365-login-admin.php:708
#: includes/class-m365-login-admin.php:778
msgid "Fallback link (keep it secret)"
msgstr "Fallback-Link (geheim halten)"
#: includes/class-m365-login-admin.php:709
#: includes/class-m365-login-admin.php:779
msgid "Opening this link shows the password form again in that browser for 30 minutes and allows password sign-in there. Bookmark it somewhere safe it is your way back in if Microsoft sign-in ever breaks."
msgstr "Wer diesen Link öffnet, sieht in diesem Browser 30 Minuten lang wieder das Passwort-Formular und kann sich dort mit Passwort anmelden. Sicher aufbewahren er ist der Weg zurück, falls die Microsoft-Anmeldung einmal nicht funktioniert."
#: includes/class-m365-login-admin.php:717
#: includes/class-m365-login-admin.php:787
msgid "Generate a new key when saving"
msgstr "Beim Speichern einen neuen Schlüssel erzeugen"
#: includes/class-m365-login-admin.php:720
#: includes/class-m365-login-admin.php:790
msgid "A key is generated automatically the first time you save these settings."
msgstr "Beim ersten Speichern dieser Einstellungen wird automatisch ein Schlüssel erzeugt."
#. translators: %s: PHP constant
#: includes/class-m365-login-admin.php:726
#: includes/class-m365-login-admin.php:796
msgid "Emergency switch: add %s to wp-config.php to disable button-only mode entirely."
msgstr "Notschalter: %s in die wp-config.php eintragen, um den Nur-Button-Modus vollständig abzuschalten."
#. translators: %s: PHP constant
#: includes/class-m365-login-admin.php:735
#: includes/class-m365-login-admin.php:805
msgid "What the plugin does to keep sign-ins safe"
msgstr "So schützt das Plugin die Anmeldung"
#: includes/class-m365-login-admin.php:737
#: includes/class-m365-login-admin.php:807
msgid "OpenID Connect authorization code flow with PKCE (S256) no tokens ever pass through the browser."
msgstr "OpenID Connect Authorization Code Flow mit PKCE (S256) Tokens laufen nie durch den Browser."
#: includes/class-m365-login-admin.php:738
#: includes/class-m365-login-admin.php:808
msgid "Single-use state and nonce values bound to the browser via an HttpOnly cookie (CSRF and replay protection)."
msgstr "Einmalige State- und Nonce-Werte, per HttpOnly-Cookie an den Browser gebunden (CSRF- und Replay-Schutz)."
#: includes/class-m365-login-admin.php:739
#: includes/class-m365-login-admin.php:809
msgid "ID token signature verified against Microsofts published signing keys; issuer, audience, tenant, expiry and nonce are checked."
msgstr "Signatur des ID-Tokens wird gegen Microsofts veröffentlichte Signaturschlüssel geprüft; Issuer, Audience, Tenant, Ablauf und Nonce werden kontrolliert."
#: includes/class-m365-login-admin.php:740
#: includes/class-m365-login-admin.php:810
msgid "Client secret encrypted at rest; no accounts are created, no passwords are changed."
msgstr "Client Secret verschlüsselt gespeichert; es werden keine Konten angelegt und keine Passwörter geändert."
#: includes/class-m365-login-admin.php:746
#: includes/class-m365-login-admin.php:816
msgid "Save changes"
msgstr "Änderungen speichern"
#: includes/class-m365-login-admin.php:752
#: includes/class-m365-login-admin.php:822
msgid "Redirect URI"
msgstr "Umleitungs-URI (Redirect URI)"
#: includes/class-m365-login-admin.php:753
#: includes/class-m365-login-admin.php:823
msgid "Register this URI in your app registration under Authentication → Web → Redirect URIs:"
msgstr "Diese URI in der App-Registrierung unter Authentifizierung → Web → Umleitungs-URIs eintragen:"
#: includes/class-m365-login-admin.php:759
#: includes/class-m365-login-admin.php:829
msgid "Plain permalinks are active, so the callback uses a query string. If you enable pretty permalinks later, the redirect URI changes and must be updated in Entra ID."
msgstr "Einfache Permalinks sind aktiv, daher verwendet der Callback einen Query-String. Werden später sprechende Permalinks aktiviert, ändert sich die Umleitungs-URI und muss in Entra ID angepasst werden."
#: includes/class-m365-login-admin.php:762
#: includes/class-m365-login-admin.php:832
msgid "Your site does not use HTTPS. Microsoft only accepts http:// redirect URIs for localhost; production sites must use HTTPS."
msgstr "Diese Website nutzt kein HTTPS. Microsoft akzeptiert http://-Umleitungs-URIs nur für localhost; produktive Websites benötigen HTTPS."
#: includes/class-m365-login-admin.php:767
#: includes/class-m365-login-admin.php:837
msgid "Setup guide: app registration"
msgstr "Anleitung: App-Registrierung"
#: includes/class-m365-login-admin.php:769
#: includes/class-m365-login-admin.php:839
msgid "Open entra.microsoft.com → Identity → Applications → App registrations → New registration."
msgstr "entra.microsoft.com → Identität → Anwendungen → App-Registrierungen → Neue Registrierung öffnen."
#: includes/class-m365-login-admin.php:770
#: includes/class-m365-login-admin.php:840
msgid "Name: e.g. \"WordPress login\". Supported account types: \"Accounts in this organizational directory only\" (single tenant)."
msgstr "Name: z. B. „WordPress Login“. Unterstützte Kontotypen: „Nur Konten in diesem Organisationsverzeichnis“ (Single Tenant)."
#: includes/class-m365-login-admin.php:771
#: includes/class-m365-login-admin.php:841
msgid "Redirect URI: choose the platform Web and paste the URI shown above. Then click Register."
msgstr "Umleitungs-URI: Plattform „Web“ wählen und die oben angezeigte URI einfügen. Dann auf „Registrieren“ klicken."
#: includes/class-m365-login-admin.php:772
#: includes/class-m365-login-admin.php:842
msgid "On the Overview page copy the Application (client) ID and the Directory (tenant) ID into the Connection tab."
msgstr "Auf der Übersichtsseite die Anwendungs-ID (Client) und die Verzeichnis-ID (Mandant) in den Tab „Verbindung“ kopieren."
#: includes/class-m365-login-admin.php:773
#: includes/class-m365-login-admin.php:843
msgid "Authentication: leave \"ID tokens\" unchecked (the plugin uses the authorization code flow) and \"Allow public client flows\" on No."
msgstr "Authentifizierung: „ID-Token“ nicht anhaken (das Plugin nutzt den Authorization Code Flow) und „Öffentliche Clientflows zulassen“ auf „Nein“ lassen."
#: includes/class-m365-login-admin.php:774
#: includes/class-m365-login-admin.php:844
msgid "Token configuration → Add optional claim → ID → tick \"email\" → Add. Confirm the API permission prompt."
msgstr "Tokenkonfiguration → Optionalen Anspruch hinzufügen → ID → „email“ anhaken → Hinzufügen. Die Rückfrage zur API-Berechtigung bestätigen."
#: includes/class-m365-login-admin.php:775
#: includes/class-m365-login-admin.php:845
msgid "Pick the authentication method on the Connection tab and follow its step-by-step guide (client secret or certificate)."
msgstr "Im Tab „Verbindung“ die Authentifizierungsmethode wählen und der zugehörigen Schritt-für-Schritt-Anleitung folgen (Client Secret oder Zertifikat)."
#: includes/class-m365-login-admin.php:776
#: includes/class-m365-login-admin.php:846
msgid "Optional: restrict who may use the app under Enterprise applications → your app → Properties → \"Assignment required\" = Yes, then assign users/groups."
msgstr "Optional: Unter Unternehmensanwendungen → Ihre App → Eigenschaften → „Zuweisung erforderlich“ = Ja einschränken, wer die App nutzen darf, und dann Benutzer/Gruppen zuweisen."
#: includes/class-m365-login-admin.php:778
#: includes/class-m365-login-admin.php:848
msgid "Required API permission: openid, profile, email (delegated) granted by default."
msgstr "Benötigte API-Berechtigungen: openid, profile, email (delegiert) standardmäßig vorhanden."
#: includes/class-m365-login-admin.php:779
#: includes/class-m365-login-admin.php:849
msgid "Optional, for group restrictions: application permissions GroupMember.Read.All and User.Read.All (Microsoft Graph) with admin consent."
msgstr "Optional für Gruppen-Beschränkungen: Anwendungsberechtigungen GroupMember.Read.All und User.Read.All (Microsoft Graph) mit Administratorzustimmung."
#: includes/class-m365-login-admin.php:783
#: includes/class-m365-login-admin.php:853
msgid "Shortcode"
msgstr "Shortcode"
#: includes/class-m365-login-admin.php:784
#: includes/class-m365-login-admin.php:854
msgid "Place the button on a custom login page:"
msgstr "Button auf einer eigenen Login-Seite platzieren:"
#: includes/class-m365-login-admin.php:786
#: includes/class-m365-login-admin.php:856
msgid "More options on the Button tab under \"Custom login page\"."
msgstr "Weitere Optionen im Tab „Button“ unter „Eigene Login-Seite“."

View file

@ -14,709 +14,709 @@ msgstr ""
"X-Generator: bin/make-pot.py\n"
"X-Domain: m365-login\n"
#: includes/class-m365-login-admin.php:79 includes/class-m365-login-admin.php:80 includes/class-m365-login-admin.php:315
#: includes/class-m365-login-admin.php:81 includes/class-m365-login-admin.php:82 includes/class-m365-login-admin.php:93 includes/class-m365-login-admin.php:382
msgid "M365 Login"
msgstr ""
#: includes/class-m365-login-admin.php:118
#: includes/class-m365-login-admin.php:108
msgid "Connection"
msgstr ""
#: includes/class-m365-login-admin.php:109
msgid "Button"
msgstr ""
#: includes/class-m365-login-admin.php:110
msgid "Security"
msgstr ""
#: includes/class-m365-login-admin.php:185
msgid "M365 Login is active but not connected to Microsoft Entra ID yet."
msgstr ""
#: includes/class-m365-login-admin.php:120
#: includes/class-m365-login-admin.php:187
msgid "Open the settings"
msgstr ""
#: includes/class-m365-login-admin.php:150
#: includes/class-m365-login-admin.php:217
msgid "Choose button icon"
msgstr ""
#: includes/class-m365-login-admin.php:151
#: includes/class-m365-login-admin.php:218
msgid "Use this icon"
msgstr ""
#: includes/class-m365-login-admin.php:152
#: includes/class-m365-login-admin.php:219
msgid "Copied!"
msgstr ""
#: includes/class-m365-login-admin.php:153 includes/class-m365-login-admin.php:435 includes/class-m365-login-admin.php:713 includes/class-m365-login-admin.php:756
#: includes/class-m365-login-admin.php:220 includes/class-m365-login-admin.php:505 includes/class-m365-login-admin.php:783 includes/class-m365-login-admin.php:826
msgid "Copy"
msgstr ""
#: includes/class-m365-login-admin.php:154
#: includes/class-m365-login-admin.php:221
msgid "Testing…"
msgstr ""
#: includes/class-m365-login-admin.php:155
#: includes/class-m365-login-admin.php:222
msgid "The tenant could not be reached. Check the tenant ID and the servers outgoing connections."
msgstr ""
#: includes/class-m365-login-admin.php:156
#: includes/class-m365-login-admin.php:223
msgid "No groups found."
msgstr ""
#: includes/class-m365-login-admin.php:157
#: includes/class-m365-login-admin.php:224
msgid "Searching…"
msgstr ""
#: includes/class-m365-login-admin.php:158
#: includes/class-m365-login-admin.php:225
msgid "Add"
msgstr ""
#: includes/class-m365-login-admin.php:159 includes/class-m365-login-admin.php:687
#: includes/class-m365-login-admin.php:226 includes/class-m365-login-admin.php:757
msgid "Remove"
msgstr ""
#: includes/class-m365-login-admin.php:160 includes/class-m365-login-admin.php:218 includes/class-m365-login-admin.php:672
#: includes/class-m365-login-admin.php:227 includes/class-m365-login-admin.php:285 includes/class-m365-login-admin.php:742
msgid "Save the connection settings first, then search for groups."
msgstr ""
#: includes/class-m365-login-admin.php:161
#: includes/class-m365-login-admin.php:228
msgid "Generate a new fallback key on save? The old link stops working."
msgstr ""
#: includes/class-m365-login-admin.php:162
#: includes/class-m365-login-admin.php:229
msgid "Generating a 3072-bit key pair, this takes a moment…"
msgstr ""
#: includes/class-m365-login-admin.php:163
#: includes/class-m365-login-admin.php:230
msgid "Replace the stored certificate? Sign-in stops working until the new certificate is uploaded to Entra ID."
msgstr ""
#: includes/class-m365-login-admin.php:164
#: includes/class-m365-login-admin.php:231
msgid "Remove the stored certificate when saving? Sign-in with the certificate method stops working."
msgstr ""
#: includes/class-m365-login-admin.php:176 includes/class-m365-login-admin.php:215 includes/class-m365-login-admin.php:241 includes/class-m365-login-admin.php:273
#: includes/class-m365-login-admin.php:243 includes/class-m365-login-admin.php:282 includes/class-m365-login-admin.php:308 includes/class-m365-login-admin.php:340
msgid "You are not allowed to do this."
msgstr ""
#: includes/class-m365-login-admin.php:181
#: includes/class-m365-login-admin.php:248
msgid "Please enter a valid tenant ID first."
msgstr ""
#. translators: %d: HTTP status code
#: includes/class-m365-login-admin.php:195
#: includes/class-m365-login-admin.php:262
msgid "Microsoft answered with HTTP %d. Is the tenant ID correct?"
msgstr ""
#. translators: %d: HTTP status code
#: includes/class-m365-login-admin.php:204
#: includes/class-m365-login-admin.php:271
msgid "Tenant reachable. The OpenID configuration was loaded successfully."
msgstr ""
#: includes/class-m365-login-admin.php:227
#: includes/class-m365-login-admin.php:294
msgid "Microsoft Graph refused the request. Grant the application permission \"GroupMember.Read.All\" (or \"Directory.Read.All\") with admin consent in Entra ID."
msgstr ""
#: includes/class-m365-login-admin.php:245
#: includes/class-m365-login-admin.php:312
msgid "Unknown operation."
msgstr ""
#: includes/class-m365-login-admin.php:262
#: includes/class-m365-login-admin.php:329
msgid "Certificate generated and stored. Download the .cer file and upload it in Entra ID."
msgstr ""
#: includes/class-m365-login-admin.php:279
#: includes/class-m365-login-admin.php:346
msgid "No certificate is stored."
msgstr ""
#: includes/class-m365-login-admin.php:297
#: includes/class-m365-login-admin.php:364
msgid "You are not allowed to access this page."
msgstr ""
#: includes/class-m365-login-admin.php:316
#: includes/class-m365-login-admin.php:383
msgid "Let existing users sign in with their Microsoft 365 / Entra ID account."
msgstr ""
#: includes/class-m365-login-admin.php:321
#: includes/class-m365-login-admin.php:388
msgid "Connected"
msgstr ""
#: includes/class-m365-login-admin.php:321
#: includes/class-m365-login-admin.php:388
msgid "Setup incomplete"
msgstr ""
#: includes/class-m365-login-admin.php:329
msgid "Connection"
msgstr ""
#: includes/class-m365-login-admin.php:330
msgid "Button"
msgstr ""
#: includes/class-m365-login-admin.php:331
msgid "Security"
msgstr ""
#: includes/class-m365-login-admin.php:340
#: includes/class-m365-login-admin.php:410
msgid "Microsoft Entra ID app registration"
msgstr ""
#: includes/class-m365-login-admin.php:341
#: includes/class-m365-login-admin.php:411
msgid "Enter the values from your app registration in the Microsoft Entra admin center."
msgstr ""
#: includes/class-m365-login-admin.php:344
#: includes/class-m365-login-admin.php:414
msgid "Directory (tenant) ID"
msgstr ""
#: includes/class-m365-login-admin.php:347
#: includes/class-m365-login-admin.php:417
msgid "Test tenant"
msgstr ""
#: includes/class-m365-login-admin.php:349
#: includes/class-m365-login-admin.php:419
msgid "Recommended: the GUID of your tenant. Only sign-ins from this tenant are accepted. \"organizations\" allows any work or school account."
msgstr ""
#: includes/class-m365-login-admin.php:351
#: includes/class-m365-login-admin.php:421
msgid "Multi-tenant mode: accounts from any Microsoft tenant can sign in. Their \"email\" attribute is not verified, so the plugin matches on the user principal name (verified domain) only and ignores the e-mail claim unless Microsoft marks it as domain-verified. Use the e-mail domain allow-list on the Security tab, or better, pin your tenant GUID."
msgstr ""
#: includes/class-m365-login-admin.php:357
#: includes/class-m365-login-admin.php:427
msgid "Application (client) ID"
msgstr ""
#: includes/class-m365-login-admin.php:362
#: includes/class-m365-login-admin.php:432
msgid "How should WordPress authenticate to Microsoft?"
msgstr ""
#: includes/class-m365-login-admin.php:367 includes/class-m365-login-admin.php:384
#: includes/class-m365-login-admin.php:437 includes/class-m365-login-admin.php:454
msgid "Client secret"
msgstr ""
#: includes/class-m365-login-admin.php:368
#: includes/class-m365-login-admin.php:438
msgid "Quick to set up. A password-like value created in Entra ID that expires after 624 months and must be renewed."
msgstr ""
#: includes/class-m365-login-admin.php:374
#: includes/class-m365-login-admin.php:444
msgid "Certificate"
msgstr ""
#: includes/class-m365-login-admin.php:374
#: includes/class-m365-login-admin.php:444
msgid "Recommended"
msgstr ""
#: includes/class-m365-login-admin.php:375
#: includes/class-m365-login-admin.php:445
msgid "The private key never leaves this server; only the public certificate is uploaded to Entra ID. Generated here with one click, valid for 2 years."
msgstr ""
#: includes/class-m365-login-admin.php:386
#: includes/class-m365-login-admin.php:456
msgid "•••••••••••• (stored, leave empty to keep)"
msgstr ""
#: includes/class-m365-login-admin.php:386
#: includes/class-m365-login-admin.php:456
msgid "Paste the secret value"
msgstr ""
#: includes/class-m365-login-admin.php:387
#: includes/class-m365-login-admin.php:457
msgid "Show secret"
msgstr ""
#: includes/class-m365-login-admin.php:392
#: includes/class-m365-login-admin.php:462
msgid "Remove the stored secret"
msgstr ""
#: includes/class-m365-login-admin.php:395
#: includes/class-m365-login-admin.php:465
msgid "Stored encrypted (AES-256-GCM, key derived from your WordPress salts) and never displayed again. Client secrets expire note the expiry date in Entra ID."
msgstr ""
#: includes/class-m365-login-admin.php:399
#: includes/class-m365-login-admin.php:469
msgid "Step-by-step: create a client secret in Entra ID"
msgstr ""
#: includes/class-m365-login-admin.php:402
#: includes/class-m365-login-admin.php:472
msgid "Open entra.microsoft.com and sign in with an account that has the \"Application Administrator\" or \"Global Administrator\" role."
msgstr ""
#: includes/class-m365-login-admin.php:403
#: includes/class-m365-login-admin.php:473
msgid "Go to Identity → Applications → App registrations and open your app (or create it first, see the general guide in the sidebar)."
msgstr ""
#: includes/class-m365-login-admin.php:404
#: includes/class-m365-login-admin.php:474
msgid "In the left menu choose Certificates & secrets, then the tab Client secrets, and click New client secret."
msgstr ""
#: includes/class-m365-login-admin.php:405
#: includes/class-m365-login-admin.php:475
msgid "Enter a description such as \"WordPress login\" and pick an expiry. Microsoft allows at most 24 months; put a reminder in your calendar two weeks before."
msgstr ""
#: includes/class-m365-login-admin.php:406
#: includes/class-m365-login-admin.php:476
msgid "Click Add. Copy the Value column immediately it is shown only once. The Secret ID column is NOT what you need."
msgstr ""
#: includes/class-m365-login-admin.php:407
#: includes/class-m365-login-admin.php:477
msgid "Paste the value into the Client secret field above and save this page."
msgstr ""
#: includes/class-m365-login-admin.php:409
#: includes/class-m365-login-admin.php:479
msgid "When the secret expires, sign-ins fail with \"Could not complete the sign-in with Microsoft\". Create a new secret, paste it here, save, then delete the old one in Entra ID."
msgstr ""
#: includes/class-m365-login-admin.php:422
#: includes/class-m365-login-admin.php:492
msgid "Expired"
msgstr ""
#. translators: %d: number of days
#: includes/class-m365-login-admin.php:426
#: includes/class-m365-login-admin.php:496
msgid "Expires in %d days"
msgstr ""
#. translators: %d: number of days
#: includes/class-m365-login-admin.php:429
#: includes/class-m365-login-admin.php:499
msgid "Valid"
msgstr ""
#: includes/class-m365-login-admin.php:434
#: includes/class-m365-login-admin.php:504
msgid "Thumbprint (SHA-1)"
msgstr ""
#: includes/class-m365-login-admin.php:436
#: includes/class-m365-login-admin.php:506
msgid "Subject"
msgstr ""
#: includes/class-m365-login-admin.php:438
#: includes/class-m365-login-admin.php:508
msgid "Key size"
msgstr ""
#: includes/class-m365-login-admin.php:440
#: includes/class-m365-login-admin.php:510
msgid "Valid until"
msgstr ""
#: includes/class-m365-login-admin.php:444
#: includes/class-m365-login-admin.php:514
msgid "Download certificate (.cer)"
msgstr ""
#: includes/class-m365-login-admin.php:445
#: includes/class-m365-login-admin.php:515
msgid "Generate new certificate"
msgstr ""
#: includes/class-m365-login-admin.php:448
#: includes/class-m365-login-admin.php:518
msgid "Remove certificate when saving"
msgstr ""
#: includes/class-m365-login-admin.php:452
#: includes/class-m365-login-admin.php:522
msgid "No certificate stored yet."
msgstr ""
#: includes/class-m365-login-admin.php:454
#: includes/class-m365-login-admin.php:524
msgid "Generate certificate"
msgstr ""
#: includes/class-m365-login-admin.php:455
#: includes/class-m365-login-admin.php:525
msgid "3072-bit RSA, self-signed, valid for 2 years. The private key is stored encrypted and never shown or downloadable."
msgstr ""
#: includes/class-m365-login-admin.php:459
#: includes/class-m365-login-admin.php:529
msgid "Use your own certificate instead (paste PEM)"
msgstr ""
#: includes/class-m365-login-admin.php:462
#: includes/class-m365-login-admin.php:532
msgid "Private key (PEM, unencrypted)"
msgstr ""
#: includes/class-m365-login-admin.php:466
#: includes/class-m365-login-admin.php:536
msgid "Certificate (PEM)"
msgstr ""
#: includes/class-m365-login-admin.php:468
#: includes/class-m365-login-admin.php:538
msgid "RSA, at least 2048 bits. The pair is validated and the key is encrypted when you save. Both fields stay empty afterwards."
msgstr ""
#: includes/class-m365-login-admin.php:474
#: includes/class-m365-login-admin.php:544
msgid "Step-by-step: register the certificate in Entra ID"
msgstr ""
#: includes/class-m365-login-admin.php:477
#: includes/class-m365-login-admin.php:547
msgid "Click Generate certificate above (or paste your own). Then click Download certificate (.cer) the file contains only the public part."
msgstr ""
#: includes/class-m365-login-admin.php:478
#: includes/class-m365-login-admin.php:548
msgid "Open entra.microsoft.com → Identity → Applications → App registrations and open your app."
msgstr ""
#: includes/class-m365-login-admin.php:479
#: includes/class-m365-login-admin.php:549
msgid "Choose Certificates & secrets in the left menu, then the tab Certificates, and click Upload certificate."
msgstr ""
#: includes/class-m365-login-admin.php:480
#: includes/class-m365-login-admin.php:550
msgid "Select the downloaded .cer file, add a description such as \"WordPress login\" and click Add."
msgstr ""
#: includes/class-m365-login-admin.php:481
#: includes/class-m365-login-admin.php:551
msgid "Compare the thumbprint Entra ID shows with the thumbprint above they must match exactly."
msgstr ""
#: includes/class-m365-login-admin.php:482
#: includes/class-m365-login-admin.php:552
msgid "Make sure Certificate is selected above and save this page. If a client secret was stored before, you may delete it in Entra ID now."
msgstr ""
#: includes/class-m365-login-admin.php:484
#: includes/class-m365-login-admin.php:554
msgid "How it works: for every token request WordPress signs a short-lived JWT (client assertion) with the private key; Microsoft verifies it with the uploaded certificate. Nothing secret is ever transmitted."
msgstr ""
#: includes/class-m365-login-admin.php:485
#: includes/class-m365-login-admin.php:555
msgid "Before the certificate expires: generate a new one here, upload it to Entra ID (both may be registered at the same time), save, then remove the old one from Entra ID. Sign-ins keep working during the switch."
msgstr ""
#: includes/class-m365-login-admin.php:491
#: includes/class-m365-login-admin.php:561
msgid "Account prompt"
msgstr ""
#: includes/class-m365-login-admin.php:493
#: includes/class-m365-login-admin.php:563
msgid "Always let the user pick an account (recommended)"
msgstr ""
#: includes/class-m365-login-admin.php:494
#: includes/class-m365-login-admin.php:564
msgid "Use the current Microsoft session if available"
msgstr ""
#: includes/class-m365-login-admin.php:495
#: includes/class-m365-login-admin.php:565
msgid "Always require re-entering credentials"
msgstr ""
#: includes/class-m365-login-admin.php:504
#: includes/class-m365-login-admin.php:574
msgid "Appearance"
msgstr ""
#: includes/class-m365-login-admin.php:507
#: includes/class-m365-login-admin.php:577
msgid "Live preview"
msgstr ""
#: includes/class-m365-login-admin.php:521
#: includes/class-m365-login-admin.php:591
msgid "Button text"
msgstr ""
#: includes/class-m365-login-admin.php:525
#: includes/class-m365-login-admin.php:595
msgid "Divider text"
msgstr ""
#: includes/class-m365-login-admin.php:527
#: includes/class-m365-login-admin.php:597
msgid "Leave empty to hide the divider line."
msgstr ""
#: includes/class-m365-login-admin.php:532
#: includes/class-m365-login-admin.php:602
msgid "Icon"
msgstr ""
#: includes/class-m365-login-admin.php:535
#: includes/class-m365-login-admin.php:605
msgid "Show an icon on the button"
msgstr ""
#: includes/class-m365-login-admin.php:546
#: includes/class-m365-login-admin.php:616
msgid "Default: Microsoft logo"
msgstr ""
#: includes/class-m365-login-admin.php:548
#: includes/class-m365-login-admin.php:618
msgid "Choose from media library"
msgstr ""
#: includes/class-m365-login-admin.php:549
#: includes/class-m365-login-admin.php:619
msgid "Use Microsoft logo"
msgstr ""
#: includes/class-m365-login-admin.php:551
#: includes/class-m365-login-admin.php:621
msgid "PNG, SVG, JPG or WebP. Square images (e.g. 64×64 px) work best."
msgstr ""
#: includes/class-m365-login-admin.php:559
#: includes/class-m365-login-admin.php:629
msgid "Background"
msgstr ""
#: includes/class-m365-login-admin.php:560
#: includes/class-m365-login-admin.php:630
msgid "Background (hover)"
msgstr ""
#: includes/class-m365-login-admin.php:561
#: includes/class-m365-login-admin.php:631
msgid "Text colour"
msgstr ""
#: includes/class-m365-login-admin.php:562
#: includes/class-m365-login-admin.php:632
msgid "Border"
msgstr ""
#: includes/class-m365-login-admin.php:575
#: includes/class-m365-login-admin.php:645
msgid "Corner radius"
msgstr ""
#: includes/class-m365-login-admin.php:579
#: includes/class-m365-login-admin.php:649
msgid "Position on the login page"
msgstr ""
#: includes/class-m365-login-admin.php:581
#: includes/class-m365-login-admin.php:651
msgid "Below the login form"
msgstr ""
#: includes/class-m365-login-admin.php:582
#: includes/class-m365-login-admin.php:652
msgid "Above the login form"
msgstr ""
#: includes/class-m365-login-admin.php:588
#: includes/class-m365-login-admin.php:658
msgid "Quick presets"
msgstr ""
#: includes/class-m365-login-admin.php:589
#: includes/class-m365-login-admin.php:659
msgid "Microsoft dark"
msgstr ""
#: includes/class-m365-login-admin.php:590
#: includes/class-m365-login-admin.php:660
msgid "Microsoft light"
msgstr ""
#: includes/class-m365-login-admin.php:591
#: includes/class-m365-login-admin.php:661
msgid "Azure blue"
msgstr ""
#: includes/class-m365-login-admin.php:592
#: includes/class-m365-login-admin.php:662
msgid "WordPress blue"
msgstr ""
#: includes/class-m365-login-admin.php:596
#: includes/class-m365-login-admin.php:666
msgid "Custom login page"
msgstr ""
#: includes/class-m365-login-admin.php:597
#: includes/class-m365-login-admin.php:667
msgid "Using your own login page instead of wp-login.php? Tell the plugin where it is so error messages, the fallback link and the post-logout redirect point there."
msgstr ""
#: includes/class-m365-login-admin.php:600
#: includes/class-m365-login-admin.php:670
msgid "URL of your login page"
msgstr ""
#: includes/class-m365-login-admin.php:602
#: includes/class-m365-login-admin.php:672
msgid "Must be on this site. Leave empty to use wp-login.php."
msgstr ""
#: includes/class-m365-login-admin.php:608
#: includes/class-m365-login-admin.php:678
msgid "Add the button to every wp_login_form() form automatically"
msgstr ""
#: includes/class-m365-login-admin.php:609
#: includes/class-m365-login-admin.php:679
msgid "Covers themes and plugins that use the WordPress login form function. Page-builder widgets need the shortcode or the template function below."
msgstr ""
#: includes/class-m365-login-admin.php:614
#: includes/class-m365-login-admin.php:684
msgid "Manual placement"
msgstr ""
#: includes/class-m365-login-admin.php:615
#: includes/class-m365-login-admin.php:685
msgid "Shortcode (block editor, page builders):"
msgstr ""
#: includes/class-m365-login-admin.php:617
#: includes/class-m365-login-admin.php:687
msgid "Template function (theme files):"
msgstr ""
#: includes/class-m365-login-admin.php:619
#: includes/class-m365-login-admin.php:689
msgid "Both show the error messages of the last attempt; use m365_login_messages() to place them separately."
msgstr ""
#: includes/class-m365-login-admin.php:627
#: includes/class-m365-login-admin.php:697
msgid "User matching & hardening"
msgstr ""
#: includes/class-m365-login-admin.php:628
#: includes/class-m365-login-admin.php:698
msgid "Users are never created automatically. A Microsoft sign-in only succeeds when a WordPress user with the same e-mail address already exists."
msgstr ""
#: includes/class-m365-login-admin.php:633
#: includes/class-m365-login-admin.php:703
msgid "Bind WordPress accounts to the Microsoft object ID"
msgstr ""
#: includes/class-m365-login-admin.php:634
#: includes/class-m365-login-admin.php:704
msgid "On first sign-in the immutable Microsoft object ID is stored with the user. Later sign-ins with the same e-mail but a different Microsoft identity are rejected. Strongly recommended."
msgstr ""
#: includes/class-m365-login-admin.php:641
#: includes/class-m365-login-admin.php:711
msgid "Fall back to the user principal name (UPN)"
msgstr ""
#: includes/class-m365-login-admin.php:642
#: includes/class-m365-login-admin.php:712
msgid "If the token contains no \"email\" claim, use the UPN (e.g. jane@contoso.com) when it is a valid e-mail address. Usually required for work accounts."
msgstr ""
#: includes/class-m365-login-admin.php:649
#: includes/class-m365-login-admin.php:719
msgid "Keep users signed in (\"Remember me\")"
msgstr ""
#: includes/class-m365-login-admin.php:650
#: includes/class-m365-login-admin.php:720
msgid "Issues a 14-day WordPress session instead of a browser session."
msgstr ""
#: includes/class-m365-login-admin.php:655
#: includes/class-m365-login-admin.php:725
msgid "Allowed e-mail domains (optional)"
msgstr ""
#: includes/class-m365-login-admin.php:657
#: includes/class-m365-login-admin.php:727
msgid "One or more domains separated by commas or new lines. Leave empty to allow any domain of your tenant."
msgstr ""
#: includes/class-m365-login-admin.php:662
#: includes/class-m365-login-admin.php:732
msgid "Allowed Entra groups (optional)"
msgstr ""
#: includes/class-m365-login-admin.php:663
#: includes/class-m365-login-admin.php:733
msgid "Only members of at least one of these groups may sign in. Leave empty to allow every matched user. Nested memberships count."
msgstr ""
#: includes/class-m365-login-admin.php:666
#: includes/class-m365-login-admin.php:736
msgid "Search groups"
msgstr ""
#: includes/class-m365-login-admin.php:668
#: includes/class-m365-login-admin.php:738
msgid "Type a group name or paste an object ID…"
msgstr ""
#: includes/class-m365-login-admin.php:669
#: includes/class-m365-login-admin.php:739
msgid "Search"
msgstr ""
#: includes/class-m365-login-admin.php:674
#: includes/class-m365-login-admin.php:744
msgid "Needs the application permission \"GroupMember.Read.All\" with admin consent. Without it you can still paste group object IDs."
msgstr ""
#: includes/class-m365-login-admin.php:680
#: includes/class-m365-login-admin.php:750
msgid "Selected groups"
msgstr ""
#: includes/class-m365-login-admin.php:681
#: includes/class-m365-login-admin.php:751
msgid "No groups selected every matched user may sign in."
msgstr ""
#: includes/class-m365-login-admin.php:691
#: includes/class-m365-login-admin.php:761
msgid "Membership is read from the \"groups\" claim of the ID token when present; otherwise the plugin asks Microsoft Graph (application permission \"User.Read.All\" or \"Directory.Read.All\"). If neither works, the sign-in is refused."
msgstr ""
#: includes/class-m365-login-admin.php:696
#: includes/class-m365-login-admin.php:766
msgid "Button-only mode"
msgstr ""
#: includes/class-m365-login-admin.php:697
#: includes/class-m365-login-admin.php:767
msgid "Hides the username/password fields (on wp-login.php and in wp_login_form() forms) and refuses every interactive password sign-in on the site, including custom login forms. Application passwords, REST, XML-RPC and WP-CLI are not affected."
msgstr ""
#: includes/class-m365-login-admin.php:702
#: includes/class-m365-login-admin.php:772
msgid "Show only the Microsoft button on the login page"
msgstr ""
#: includes/class-m365-login-admin.php:703
#: includes/class-m365-login-admin.php:773
msgid "Becomes active once the connection is configured. Make sure your own account can sign in via Microsoft before enabling this."
msgstr ""
#: includes/class-m365-login-admin.php:708
#: includes/class-m365-login-admin.php:778
msgid "Fallback link (keep it secret)"
msgstr ""
#: includes/class-m365-login-admin.php:709
#: includes/class-m365-login-admin.php:779
msgid "Opening this link shows the password form again in that browser for 30 minutes and allows password sign-in there. Bookmark it somewhere safe it is your way back in if Microsoft sign-in ever breaks."
msgstr ""
#: includes/class-m365-login-admin.php:717
#: includes/class-m365-login-admin.php:787
msgid "Generate a new key when saving"
msgstr ""
#: includes/class-m365-login-admin.php:720
#: includes/class-m365-login-admin.php:790
msgid "A key is generated automatically the first time you save these settings."
msgstr ""
#. translators: %s: PHP constant
#: includes/class-m365-login-admin.php:726
#: includes/class-m365-login-admin.php:796
msgid "Emergency switch: add %s to wp-config.php to disable button-only mode entirely."
msgstr ""
#. translators: %s: PHP constant
#: includes/class-m365-login-admin.php:735
#: includes/class-m365-login-admin.php:805
msgid "What the plugin does to keep sign-ins safe"
msgstr ""
#: includes/class-m365-login-admin.php:737
#: includes/class-m365-login-admin.php:807
msgid "OpenID Connect authorization code flow with PKCE (S256) no tokens ever pass through the browser."
msgstr ""
#: includes/class-m365-login-admin.php:738
#: includes/class-m365-login-admin.php:808
msgid "Single-use state and nonce values bound to the browser via an HttpOnly cookie (CSRF and replay protection)."
msgstr ""
#: includes/class-m365-login-admin.php:739
#: includes/class-m365-login-admin.php:809
msgid "ID token signature verified against Microsofts published signing keys; issuer, audience, tenant, expiry and nonce are checked."
msgstr ""
#: includes/class-m365-login-admin.php:740
#: includes/class-m365-login-admin.php:810
msgid "Client secret encrypted at rest; no accounts are created, no passwords are changed."
msgstr ""
#: includes/class-m365-login-admin.php:746
#: includes/class-m365-login-admin.php:816
msgid "Save changes"
msgstr ""
#: includes/class-m365-login-admin.php:752
#: includes/class-m365-login-admin.php:822
msgid "Redirect URI"
msgstr ""
#: includes/class-m365-login-admin.php:753
#: includes/class-m365-login-admin.php:823
msgid "Register this URI in your app registration under Authentication → Web → Redirect URIs:"
msgstr ""
#: includes/class-m365-login-admin.php:759
#: includes/class-m365-login-admin.php:829
msgid "Plain permalinks are active, so the callback uses a query string. If you enable pretty permalinks later, the redirect URI changes and must be updated in Entra ID."
msgstr ""
#: includes/class-m365-login-admin.php:762
#: includes/class-m365-login-admin.php:832
msgid "Your site does not use HTTPS. Microsoft only accepts http:// redirect URIs for localhost; production sites must use HTTPS."
msgstr ""
#: includes/class-m365-login-admin.php:767
#: includes/class-m365-login-admin.php:837
msgid "Setup guide: app registration"
msgstr ""
#: includes/class-m365-login-admin.php:769
#: includes/class-m365-login-admin.php:839
msgid "Open entra.microsoft.com → Identity → Applications → App registrations → New registration."
msgstr ""
#: includes/class-m365-login-admin.php:770
#: includes/class-m365-login-admin.php:840
msgid "Name: e.g. \"WordPress login\". Supported account types: \"Accounts in this organizational directory only\" (single tenant)."
msgstr ""
#: includes/class-m365-login-admin.php:771
#: includes/class-m365-login-admin.php:841
msgid "Redirect URI: choose the platform Web and paste the URI shown above. Then click Register."
msgstr ""
#: includes/class-m365-login-admin.php:772
#: includes/class-m365-login-admin.php:842
msgid "On the Overview page copy the Application (client) ID and the Directory (tenant) ID into the Connection tab."
msgstr ""
#: includes/class-m365-login-admin.php:773
#: includes/class-m365-login-admin.php:843
msgid "Authentication: leave \"ID tokens\" unchecked (the plugin uses the authorization code flow) and \"Allow public client flows\" on No."
msgstr ""
#: includes/class-m365-login-admin.php:774
#: includes/class-m365-login-admin.php:844
msgid "Token configuration → Add optional claim → ID → tick \"email\" → Add. Confirm the API permission prompt."
msgstr ""
#: includes/class-m365-login-admin.php:775
#: includes/class-m365-login-admin.php:845
msgid "Pick the authentication method on the Connection tab and follow its step-by-step guide (client secret or certificate)."
msgstr ""
#: includes/class-m365-login-admin.php:776
#: includes/class-m365-login-admin.php:846
msgid "Optional: restrict who may use the app under Enterprise applications → your app → Properties → \"Assignment required\" = Yes, then assign users/groups."
msgstr ""
#: includes/class-m365-login-admin.php:778
#: includes/class-m365-login-admin.php:848
msgid "Required API permission: openid, profile, email (delegated) granted by default."
msgstr ""
#: includes/class-m365-login-admin.php:779
#: includes/class-m365-login-admin.php:849
msgid "Optional, for group restrictions: application permissions GroupMember.Read.All and User.Read.All (Microsoft Graph) with admin consent."
msgstr ""
#: includes/class-m365-login-admin.php:783
#: includes/class-m365-login-admin.php:853
msgid "Shortcode"
msgstr ""
#: includes/class-m365-login-admin.php:784
#: includes/class-m365-login-admin.php:854
msgid "Place the button on a custom login page:"
msgstr ""
#: includes/class-m365-login-admin.php:786
#: includes/class-m365-login-admin.php:856
msgid "More options on the Button tab under \"Custom login page\"."
msgstr ""

View file

@ -71,7 +71,7 @@ Microsoft terms and privacy: [Microsoft Services Agreement](https://www.microsof
== Installation ==
1. Upload the plugin folder to `/wp-content/plugins/` or install it through the WordPress plugin screen, then activate it.
2. Go to **Settings → M365 Login** and copy the **Redirect URI** shown in the sidebar.
2. Open the new **M365 Login** menu entry and copy the **Redirect URI** shown in the sidebar.
3. In the [Microsoft Entra admin center](https://entra.microsoft.com/) open **App registrations → New registration**. Choose *Accounts in this organizational directory only*, select the **Web** platform and paste the redirect URI.
4. From the app's overview page copy the **Application (client) ID** and the **Directory (tenant) ID** into the plugin settings.
5. Pick the authentication method: either generate a certificate in the plugin and upload the downloaded `.cer` under **Certificates & secrets → Certificates**, or create a client secret under **Certificates & secrets → Client secrets** and paste its *value*. Both methods have a step-by-step guide in the settings.
@ -125,9 +125,9 @@ The settings, cached data and the per-user Microsoft object ID are removed.
== Screenshots ==
1. The customised button on the WordPress login screen.
2. Settings Connection tab with redirect URI and tenant test.
3. Settings Button tab with live preview, colour pickers and icon picker.
4. Settings Security tab with the Entra group picker and button-only mode.
2. M365 Login Connection tab with redirect URI and tenant test.
3. M365 Login Button tab with live preview, colour pickers and icon picker.
4. M365 Login Security tab with the Entra group picker and button-only mode.
5. Login screen in button-only mode.
== Changelog ==