Sonderzeichenumgebaut auf deutsch

This commit is contained in:
Eskimue
2026-04-05 13:18:36 +02:00
parent 23df0ed163
commit 2689a32ed6
18 changed files with 178 additions and 678 deletions
+15 -15
View File
@@ -85,7 +85,7 @@ function sendActivationNotification(string $username, string $email, ?string $di
'',
'Benutzername: ' . $username,
'',
'Viele Gruesse',
'Viele Grüße',
'Astronomiemuseum der Sternwarte Sonneberg',
];
@@ -180,7 +180,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
if ($targetUser && $targetUserId === $currentUserId && in_array($action, ['deactivate_user', 'change_role', 'delete_user'], true)) {
$errors[] = 'Das eigene Administrationskonto kann hier nicht deaktiviert, geloescht oder umgestellt werden.';
$errors[] = 'Das eigene Administrationskonto kann hier nicht deaktiviert, gelöscht oder umgestellt werden.';
}
$currentUserIsMaster = isMasterRole((string) ($currentUser['role'] ?? ''));
@@ -206,7 +206,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
!$currentUserIsMaster &&
$targetUserIsMaster
) {
$errors[] = 'Nur ein Master-Benutzer darf die Rolle master vergeben oder aendern.';
$errors[] = 'Nur ein Master-Benutzer darf die Rolle master vergeben oder ändern.';
}
if (
@@ -214,7 +214,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$requestedRole === 'master' &&
$masterCount > 0
) {
$errors[] = 'Nur ein Master-Benutzer darf die Rolle master vergeben oder aendern.';
$errors[] = 'Nur ein Master-Benutzer darf die Rolle master vergeben oder ändern.';
}
if (
@@ -242,7 +242,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
(int)$targetUser['is_active'] === 1 &&
$activeAdminCount <= 1
) {
$errors[] = 'Der letzte aktive privilegierte Benutzer kann nicht geloescht werden.';
$errors[] = 'Der letzte aktive privilegierte Benutzer kann nicht gelöscht werden.';
}
}
@@ -309,7 +309,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$stmtDelete->execute([
':id' => $targetUserId,
]);
$_SESSION['admin_users_flash_success'] = 'Benutzerkonto wurde geloescht. Zugehoerige Standorte und Satelliten wurden automatisch entfernt.';
$_SESSION['admin_users_flash_success'] = 'Benutzerkonto wurde gelöscht. Zugehörige Standorte und Satelliten wurden automatisch entfernt.';
redirectToAdminUsers();
}
@@ -442,8 +442,8 @@ if ($currentUserIsMaster) {
<div class="admin-users-layout">
<section class="card admin-users-summary-card">
<h2>Uebersicht</h2>
<p class="hint">Hier kannst du Benutzerkonten freischalten, deaktivieren, loeschen und zwischen <strong>user</strong>, <strong>admin</strong> und <strong>master</strong> wechseln.</p>
<h2>Übersicht</h2>
<p class="hint">Hier kannst du Benutzerkonten freischalten, deaktivieren, löschen und zwischen <strong>user</strong>, <strong>admin</strong> und <strong>master</strong> wechseln.</p>
<?php if ($successMessage !== ''): ?>
<p class="msg-success"><?= h($successMessage) ?></p>
@@ -558,7 +558,7 @@ if ($currentUserIsMaster) {
<input type="hidden" name="csrf_token" value="<?= h($_SESSION['admin_users_csrf']) ?>">
<input type="hidden" name="action" value="delete_user">
<input type="hidden" name="user_id" value="<?= (int)$userRow['id'] ?>">
<button type="submit" class="btn btn-danger btn-sm"<?= $isSelf ? ' disabled' : '' ?>>Benutzer loeschen</button>
<button type="submit" class="btn btn-danger btn-sm"<?= $isSelf ? ' disabled' : '' ?>>Benutzer löschen</button>
</form>
</div>
</td>
@@ -572,7 +572,7 @@ if ($currentUserIsMaster) {
<?php if ($currentUserIsMaster): ?>
<section class="card admin-users-table-card">
<h2>Seitenfreigaben</h2>
<p class="hint">Nur Master-Benutzer duerfen hier festlegen, welche Seiten normale Nutzer im Menue sehen und direkt aufrufen duerfen.</p>
<p class="hint">Nur Master-Benutzer dürfen hier festlegen, welche Seiten normale Nutzer im Menü sehen und direkt aufrufen dürfen.</p>
<div class="admin-users-table-wrap">
<table class="data-table admin-users-table">
<thead>
@@ -616,7 +616,7 @@ if ($currentUserIsMaster) {
<?php endforeach; ?>
<td>
<?php if ($isPrivilegedUser): ?>
<span class="hint">Vollzugriff ueber Rolle</span>
<span class="hint">Vollzugriff über Rolle</span>
<?php else: ?>
<button type="submit" class="btn btn-secondary btn-sm" form="<?= h($permissionFormId) ?>">Freigaben speichern</button>
<?php endif; ?>
@@ -643,11 +643,11 @@ if ($currentUserIsMaster) {
<dialog class="admin-dialog" id="deleteUserDialog">
<form method="dialog" class="admin-dialog-card">
<h3>Benutzer loeschen?</h3>
<p id="deleteUserDialogText">Soll dieser Benutzer wirklich geloescht werden?</p>
<h3>Benutzer löschen?</h3>
<p id="deleteUserDialogText">Soll dieser Benutzer wirklich gelöscht werden?</p>
<div class="admin-dialog-actions">
<button type="button" class="btn btn-secondary" data-delete-choice="no">Abbrechen</button>
<button type="button" class="btn btn-danger" data-delete-choice="yes">Loeschen</button>
<button type="button" class="btn btn-danger" data-delete-choice="yes">Löschen</button>
</div>
</form>
</dialog>
@@ -713,7 +713,7 @@ if ($currentUserIsMaster) {
pendingDeleteForm = form;
const username = form.getAttribute('data-username') || 'dieser Benutzer';
deleteDialogText.textContent = 'Benutzer "' + username + '" wirklich loeschen? Standorte und Satelliten dieses Kontos werden ebenfalls entfernt.';
deleteDialogText.textContent = 'Benutzer "' + username + '" wirklich löschen? Standorte und Satelliten dieses Kontos werden ebenfalls entfernt.';
deleteDialog.showModal();
});
});
+2 -2
View File
@@ -63,12 +63,12 @@ function manageablePublicPages(): array
'jupitersystem.php' => 'Jupitersystem',
'tagbogen.php' => 'Tagbogen',
'sternenhimmel.php' => 'Sternenhimmel',
'meteorshowers.php' => 'Meteorstroeme',
'meteorshowers.php' => 'Meteorströme',
'geocron/index.php' => 'Geocron',
'geocron3d.php' => 'Geocron 3D',
'mondfinsternis.php' => 'Mondfinsternis',
'sonnenfinsternis.php' => 'Sonnenfinsternis',
'bedeckung.php' => 'Bedeckungsphaenomene',
'bedeckung.php' => 'Bedeckungsphänomene',
'sternbedeckungen.php' => 'Mond-Stern-Bedeckungen',
'monatsvorhersage.php' => 'Monatsvorhersage',
'wochenvorhersage.php' => 'Wochenvorhersage',
+3 -3
View File
@@ -83,7 +83,7 @@ if (!in_array($publicScriptName, $publicAccessAllowlist, true) && !$canAccessCur
<main class="container" style="padding-top: 4rem; padding-bottom: 4rem;">
<section class="card">
<h1>Zugriff verweigert</h1>
<p>Diese Seite ist aktuell nur fuer Benutzer mit der Rolle <strong>admin</strong> oder <strong>master</strong> freigegeben.</p>
<p>Diese Seite ist aktuell nur für Benutzer mit der Rolle <strong>admin</strong> oder <strong>master</strong> freigegeben.</p>
<p><a class="btn btn-primary" href="<?= htmlspecialchars($publicBasePath . 'logout.php', ENT_QUOTES, 'UTF-8') ?>">Abmelden</a></p>
</section>
</main>
@@ -125,7 +125,7 @@ $menuGroups = [
['href' => 'jupitersystem.php', 'label' => 'Jupitersystem'],
['href' => 'tagbogen.php', 'label' => 'Tagbogen'],
['href' => 'sternenhimmel.php', 'label' => 'Sternenhimmel'],
['href' => 'meteorshowers.php', 'label' => 'Meteorstroeme'],
['href' => 'meteorshowers.php', 'label' => 'Meteorströme'],
['href' => 'geocron/index.php', 'label' => 'Geocron'],
['href' => 'geocron3d.php', 'label' => 'Geocron 3D'],
],
@@ -288,7 +288,7 @@ if ($loggedIn && !$hasFullAdminAccess && $pdoHeader !== null) {
</a>
<?php endif; ?>
<div class="header-menu">
<button type="button" class="menu-toggle" id="menuToggle" aria-expanded="false" aria-controls="headerMenuPanel" aria-label="Menue oeffnen">
<button type="button" class="menu-toggle" id="menuToggle" aria-expanded="false" aria-controls="headerMenuPanel" aria-label="Menü öffnen">
<span></span>
<span></span>
<span></span>
+15 -15
View File
@@ -4,12 +4,12 @@ declare(strict_types=1);
session_start();
$loggedIn = isset($_SESSION['user_id']);
$pageTitle = 'Meteorstroeme - AstroTools';
$pageTitle = 'Meteorströme - AstroTools';
$bodyClass = 'admin-page meteorshowers-page';
$publicBasePath = './';
$headerIntroPre = 'Beobachtung';
$headerIntroTitle = 'Meteorstroeme';
$headerIntroSub = 'Liste der importierten Meteorstroeme aus der Datenbank mit Angaben in solarer Laenge.';
$headerIntroTitle = 'Meteorströme';
$headerIntroSub = 'Liste der importierten Meteorströme aus der Datenbank mit Angaben in solarer Länge.';
$config = require __DIR__ . '/../config/database.php';
@@ -314,10 +314,10 @@ require __DIR__ . '/header.php';
<?php
$statsCards = [
['label' => 'Importierte Meteorstroeme', 'value' => (string) count($allShowers)],
['label' => 'Importierte Meteorströme', 'value' => (string) count($allShowers)],
['label' => 'Davon aktuell aktiv', 'value' => (string) $activeCount],
['label' => 'Hoechste ZHR', 'value' => $topZhr !== null ? (string) $topZhr : '-'],
['label' => 'Aktuelle solare Laenge', 'value' => number_format($todaySolarLongitude, 2, ',', '.') . '°'],
['label' => 'Höchste ZHR', 'value' => $topZhr !== null ? (string) $topZhr : '-'],
['label' => 'Aktuelle solare Länge', 'value' => number_format($todaySolarLongitude, 2, ',', '.') . '°'],
['label' => 'Datumsumrechnung', 'value' => (string) $displayYear],
];
?>
@@ -343,29 +343,29 @@ $statsCards = [
id="q"
name="q"
value="<?= h($searchQuery) ?>"
placeholder="Code, Bezeichnung oder Mutterkoerper"
placeholder="Code, Bezeichnung oder Mutterkörper"
>
</div>
<div class="form-group">
<label for="mode">Anzeige</label>
<select id="mode" name="mode">
<option value="all" <?= $showMode === 'all' ? 'selected' : '' ?>>Alle Meteorstroeme</option>
<option value="all" <?= $showMode === 'all' ? 'selected' : '' ?>>Alle Meteorströme</option>
<option value="active" <?= $showMode === 'active' ? 'selected' : '' ?>>Nur aktuell aktive</option>
</select>
</div>
</div>
<div class="input-row">
<button type="submit" class="btn btn-primary">Anzeigen</button>
<a href="meteorshowers.php" class="btn btn-secondary">Zuruecksetzen</a>
<a href="meteorshowers.php" class="btn btn-secondary">Zurücksetzen</a>
</div>
</form>
</section>
<section class="card">
<h2>Liste der Meteorstroeme</h2>
<p class="hint">Die Gradangaben in Aktivitaet und Maximum sind Werte der solaren Laenge. Zusaetzlich wird dafuer ein Kalenderdatum im Jahr <?= h((string) $displayYear) ?> angezeigt.</p>
<h2>Liste der Meteorströme</h2>
<p class="hint">Die Gradangaben in Aktivität und Maximum sind Werte der solaren Länge. Zusätzlich wird dafür ein Kalenderdatum im Jahr <?= h((string) $displayYear) ?> angezeigt.</p>
<?php if ($showers === []): ?>
<p class="hint">Keine Meteorstroeme fuer diese Auswahl gefunden.</p>
<p class="hint">Keine Meteorströme für diese Auswahl gefunden.</p>
<?php else: ?>
<div class="table-wrap">
<table class="data-table">
@@ -376,11 +376,11 @@ $statsCards = [
<th>IAU</th>
<th>Bezeichnung</th>
<th>ZHR</th>
<th>Aktivitaet (solare Laenge)</th>
<th>Maximum (solare Laenge)</th>
<th>Aktivität (solare Länge)</th>
<th>Maximum (solare Länge)</th>
<th>Radiant</th>
<th>v<sub>g</sub></th>
<th>Mutterkoerper</th>
<th>Mutterkörper</th>
</tr>
</thead>
<tbody>
+3 -3
View File
@@ -38,7 +38,7 @@ function runPythonApi(string $scriptPath, string $action, array $arguments): arr
$decoded = json_decode($joined, true);
if (!is_array($decoded)) {
$lastError = $joined !== '' ? 'Python-Ausgabe war kein gueltiges JSON.' : 'Python lieferte keine Ausgabe zurueck.';
$lastError = $joined !== '' ? 'Python-Ausgabe war kein gültiges JSON.' : 'Python lieferte keine Ausgabe zurück.';
continue;
}
@@ -71,7 +71,7 @@ if ($isAjax) {
if ($utcIso === '') {
echo json_encode([
'ok' => false,
'error' => 'utc_iso wurde nicht uebergeben.',
'error' => 'utc_iso wurde nicht übergeben.',
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
exit;
}
@@ -1071,7 +1071,7 @@ async function exportMoonPng() {
const size = getMoonExportSize();
const transparentBackground = useTransparentMoonExport();
if (!size) {
updateMoonExportStatus('Bitte eine gueltige Bildgroesse eingeben.', 'error');
updateMoonExportStatus('Bitte eine gültige Bildgröße eingeben.', 'error');
return;
}
+23 -23
View File
@@ -130,7 +130,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$satelliteId = (int) ($_POST['satellite_id'] ?? 0);
if ($satelliteId <= 0) {
$errors[] = 'Ungueltiger Satellit.';
$errors[] = 'Ungültiger Satellit.';
}
if (empty($errors)) {
@@ -178,7 +178,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$satelliteId = (int) ($_POST['satellite_id'] ?? 0);
if ($satelliteId <= 0) {
$errors[] = 'Ungueltiger Satellit.';
$errors[] = 'Ungültiger Satellit.';
}
if (empty($errors)) {
@@ -203,7 +203,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (empty($errors)) {
$satelliteCount = countUserRows($pdo, 'app_user_satellites', $userId);
if ($satelliteCount <= 1) {
$errors[] = 'Der letzte Satellit kann nicht geloescht werden.';
$errors[] = 'Der letzte Satellit kann nicht gelöscht werden.';
}
}
@@ -272,7 +272,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$satelliteId = (int) ($_POST['satellite_id'] ?? 0);
if ($satelliteId <= 0) {
$errors[] = 'Ungueltiger Satellit.';
$errors[] = 'Ungültiger Satellit.';
}
if (empty($errors)) {
@@ -314,7 +314,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$minorplanetId = (int) ($_POST['minorplanet_id'] ?? 0);
if ($minorplanetId <= 0) {
$errors[] = 'Ungueltiger Kleinplanet.';
$errors[] = 'Ungültiger Kleinplanet.';
}
if (empty($errors)) {
@@ -362,7 +362,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$minorplanetId = (int) ($_POST['minorplanet_id'] ?? 0);
if ($minorplanetId <= 0) {
$errors[] = 'Ungueltiger Kleinplanet.';
$errors[] = 'Ungültiger Kleinplanet.';
}
if (empty($errors)) {
@@ -384,7 +384,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$minorplanetId = (int) ($_POST['minorplanet_id'] ?? 0);
if ($minorplanetId <= 0) {
$errors[] = 'Ungueltiger Kleinplanet.';
$errors[] = 'Ungültiger Kleinplanet.';
}
if (empty($errors)) {
@@ -405,11 +405,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$isDefault = isset($_POST['is_default']) ? 1 : 0;
if ($name === '') {
$errors[] = 'Bitte einen Namen fuer den Standort eingeben.';
$errors[] = 'Bitte einen Namen für den Standort eingeben.';
}
if ($latitude === '' || !is_numeric($latitude)) {
$errors[] = 'Bitte einen gueltigen Breitengrad eingeben.';
$errors[] = 'Bitte einen gültigen Breitengrad eingeben.';
} else {
$lat = (float) $latitude;
if ($lat < -90 || $lat > 90) {
@@ -418,11 +418,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
if ($longitude === '' || !is_numeric($longitude)) {
$errors[] = 'Bitte einen gueltigen Laengengrad eingeben.';
$errors[] = 'Bitte einen gültigen Längengrad eingeben.';
} else {
$lon = (float) $longitude;
if ($lon < -180 || $lon > 180) {
$errors[] = 'Der Laengengrad muss zwischen -180 und 180 liegen.';
$errors[] = 'Der Längengrad muss zwischen -180 und 180 liegen.';
}
}
@@ -431,7 +431,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
if (!validTimezone($timezone)) {
$errors[] = 'Bitte eine gueltige IANA-Zeitzone angeben, z. B. Europe/Berlin.';
$errors[] = 'Bitte eine gültige IANA-Zeitzone angeben, z. B. Europe/Berlin.';
}
if (empty($errors)) {
@@ -498,7 +498,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$locationId = (int) ($_POST['location_id'] ?? 0);
if ($locationId <= 0) {
$errors[] = 'Ungueltiger Standort.';
$errors[] = 'Ungültiger Standort.';
}
if (empty($errors)) {
@@ -558,7 +558,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$locationId = (int) ($_POST['location_id'] ?? 0);
if ($locationId <= 0) {
$errors[] = 'Ungueltiger Standort.';
$errors[] = 'Ungültiger Standort.';
}
if (empty($errors)) {
@@ -583,7 +583,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (empty($errors)) {
$locationCount = countUserRows($pdo, 'app_user_locations', $userId);
if ($locationCount <= 1) {
$errors[] = 'Der letzte Standort kann nicht geloescht werden.';
$errors[] = 'Der letzte Standort kann nicht gelöscht werden.';
}
}
@@ -638,12 +638,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
$pdo->commit();
$successMessage = 'Der Standort wurde geloescht.';
$successMessage = 'Der Standort wurde gelöscht.';
} catch (Throwable $e) {
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
$errors[] = 'Der Standort konnte nicht geloescht werden.';
$errors[] = 'Der Standort konnte nicht gelöscht werden.';
}
}
}
@@ -857,7 +857,7 @@ $loggedIn = true;
<tr>
<th>Name</th>
<th>Breitengrad</th>
<th>Laengengrad</th>
<th>Längengrad</th>
<th>Hoehe</th>
<th>Zeitzone</th>
<th>Standard</th>
@@ -882,7 +882,7 @@ $loggedIn = true;
</form>
<?php endif; ?>
<?php if (count($locations) > 1): ?>
<form method="post" action="" class="favorites-loading-form" data-loading-message="Standort wird entfernt..." onsubmit="return confirm('Standort wirklich loeschen?');">
<form method="post" action="" class="favorites-loading-form" data-loading-message="Standort wird entfernt..." onsubmit="return confirm('Standort wirklich löschen?');">
<input type="hidden" name="action" value="delete_location">
<input type="hidden" name="location_id" value="<?= (int) $location['id'] ?>">
<button type="submit" class="btn btn-sm btn-danger">Loeschen</button>
@@ -927,7 +927,7 @@ $loggedIn = true;
<input type="text" id="latitude" name="latitude" required value="<?= h($_POST['latitude'] ?? ($defaultLocation['latitude'] ?? '')) ?>">
</div>
<div class="form-group">
<label for="longitude">Laengengrad</label>
<label for="longitude">Längengrad</label>
<input type="text" id="longitude" name="longitude" required value="<?= h($_POST['longitude'] ?? ($defaultLocation['longitude'] ?? '')) ?>">
</div>
<div class="form-group">
@@ -1061,7 +1061,7 @@ $loggedIn = true;
<div class="card">
<h2>Meine Satelliten</h2>
<?php if (empty($trackedSatellites)): ?>
<p class="hint">Du hast noch keine Satelliten ausgewaehlt.</p>
<p class="hint">Du hast noch keine Satelliten ausgewählt.</p>
<?php else: ?>
<table class="data-table">
<thead>
@@ -1112,7 +1112,7 @@ $loggedIn = true;
<div class="card">
<h2>Meine Kleinplaneten</h2>
<?php if (empty($trackedMinorplanets)): ?>
<p class="hint">Du hast noch keine Kleinplaneten ausgewaehlt.</p>
<p class="hint">Du hast noch keine Kleinplaneten ausgewählt.</p>
<?php else: ?>
<table class="data-table">
<thead>
@@ -1221,7 +1221,7 @@ $loggedIn = true;
const lon = parseFloat(lonInput.value);
if (!Number.isFinite(lat) || !Number.isFinite(lon)) {
alert('Bitte zuerst einen gueltigen Standort waehlen.');
alert('Bitte zuerst einen gültigen Standort wählen.');
return;
}
+3 -3
View File
@@ -32,13 +32,13 @@ if (!empty($currentLocation) && is_array($currentLocation)) {
<h2>Kein Standard-Standort gesetzt</h2>
<p class="hint">
Diese Seite verwendet den im Header geladenen Standard-Standort aus der Datenbank.
Bitte waehle in den <a href="settings.php">Einstellungen</a> einen Standard-Standort aus.
Bitte wähle in den <a href="settings.php">Einstellungen</a> einen Standard-Standort aus.
</p>
</section>
<?php else: ?>
<section class="card planetvis-card">
<p class="planetvis-intro">
Sichtbarkeit der Planeten und des Mondes ueber 24 Stunden fuer deinen Standard-Standort aus der Datenbank.
Sichtbarkeit der Planeten und des Mondes über 24 Stunden für deinen Standard-Standort aus der Datenbank.
</p>
<div class="date-section">
@@ -533,7 +533,7 @@ function renderChart(localDate) {
document.getElementById('tt-body').innerHTML =
`Uhrzeit: ${hStr(h)}<br>Aufgang: ${rStr}<br>Untergang: ${sStr}<br>` +
(def.type === 'moon' ? `Beleuchtung: ${Math.round(def.illum * 100)}%<br>` : `Magnitude: ${mag}<br>`) +
`Status: ${above ? '<span class="tt-up">ueber Horizont</span>' : '<span class="tt-down">unter Horizont</span>'}`;
`Status: ${above ? '<span class="tt-up">über Horizont</span>' : '<span class="tt-down">unter Horizont</span>'}`;
tooltip.style.left = (e.clientX + 16) + 'px';
tooltip.style.top = (e.clientY - 14) + 'px';
tooltip.classList.add('vis');
+14 -14
View File
@@ -340,8 +340,8 @@ if (!empty($currentLocation) && is_array($currentLocation)) {
<div class="satpass-tool">
<section class="card satpass-card">
<p class="satpass-intro">
Berechnet fuer den heutigen Tag den naechsten Ueberflug deiner ausgewaehlten Satelliten
und zeichnet deren Bahn auf einer Zenitkarte fuer deinen Standard-Standort.
Berechnet für den heutigen Tag den nächsten Überflug deiner ausgewählten Satelliten
und zeichnet deren Bahn auf einer Zenitkarte für deinen Standard-Standort.
</p>
</section>
@@ -349,14 +349,14 @@ if (!empty($currentLocation) && is_array($currentLocation)) {
<section class="card satpass-card">
<h2>Kein Standard-Standort gesetzt</h2>
<p class="hint">
Bitte waehle in den <a href="settings.php">Einstellungen</a> einen Standard-Standort aus.
Bitte wähle in den <a href="settings.php">Einstellungen</a> einen Standard-Standort aus.
</p>
</section>
<?php elseif (empty($satellitePayload)): ?>
<section class="card satpass-card">
<h2>Keine Satelliten ausgewaehlt</h2>
<h2>Keine Satelliten ausgewählt</h2>
<p class="hint">
Es sind noch keine ausgewaehlten Satelliten mit aktuellem TLE vorhanden.
Es sind noch keine ausgewählten Satelliten mit aktuellem TLE vorhanden.
Bitte fuege in <a href="my_favorites.php">Favoriten</a> Satelliten hinzu.
</p>
</section>
@@ -392,13 +392,13 @@ if (!empty($currentLocation) && is_array($currentLocation)) {
<div class="form-group">
<label for="satSelect">Satellit</label>
<select id="satSelect" class="satpass-select">
<option value="">– Satellit waehlen –</option>
<option value="">– Satellit wählen –</option>
</select>
</div>
<div class="form-group">
<label for="passSelect">Ueberflug</label>
<label for="passSelect">Überflug</label>
<select id="passSelect" class="satpass-select" disabled>
<option value="">– zuerst Satellit waehlen –</option>
<option value="">– zuerst Satellit wählen –</option>
</select>
</div>
<div id="satpassPassInfo" class="satpass-pass-info"></div>
@@ -653,15 +653,15 @@ if (!empty($currentLocation) && is_array($currentLocation)) {
}
function buildObservationSummary(satName, pass, visibility) {
if (visibility.sky.key === 'day') return `${satName} ist bei diesem Ueberflug tagsueber nicht zu sehen.`;
if (visibility.sky.key === 'day') return `${satName} ist bei diesem Überflug tagsüber nicht zu sehen.`;
const visiblePhase = getVisiblePhase(pass);
const pathText = buildPathDescription(visiblePhase.visiblePath);
const shadowText = pass.shadowEntry
? ` Sie tritt um ${formatTime(pass.shadowEntry.time)} Uhr in den Erdschatten ein.` : '';
const magText = pass.peakMag !== null
? ` Ihre maximale Helligkeit betraegt ${formatMag(pass.peakMag)} mag.` : '';
return `Die Rahmenbedingungen fuer die Beobachtung von ${satName} am ${formatDateLocal(pass.aosTime)} (${formatWeekdayShort(pass.aosTime)}) um ${formatTime(pass.aosTime)} Uhr sind ${visibility.label}. `
+ `Der Ueberflug ist ${formatDurationLong(visiblePhase.visibleDurationMs)} lang und bis ${formatTime(visiblePhase.visibleEndTime)} Uhr zu sehen. `
return `Die Rahmenbedingungen für die Beobachtung von ${satName} am ${formatDateLocal(pass.aosTime)} (${formatWeekdayShort(pass.aosTime)}) um ${formatTime(pass.aosTime)} Uhr sind ${visibility.label}. `
+ `Der Überflug ist ${formatDurationLong(visiblePhase.visibleDurationMs)} lang und bis ${formatTime(visiblePhase.visibleEndTime)} Uhr zu sehen. `
+ `${pathText} Die maximale Horizonthoehe betraegt ${pass.peakElevation.toFixed(0)}&deg;.`
+ `${shadowText}${magText}`;
}
@@ -910,7 +910,7 @@ if (!empty($currentLocation) && is_array($currentLocation)) {
timeZone: SITE_LOCATION.timezone, day:'2-digit', month:'2-digit', year:'numeric'
}).format(new Date(WINDOW_END)) : '';
satSelectEl.innerHTML = '<option value="">– Satellit waehlen –</option>';
satSelectEl.innerHTML = '<option value="">– Satellit wählen –</option>';
PYTHON_RESULTS.forEach((sat, satIdx) => {
const upcomingCount = sat.passes.filter(p => p.losTime > now).length;
const opt = document.createElement('option');
@@ -925,13 +925,13 @@ if (!empty($currentLocation) && is_array($currentLocation)) {
passInfoEl.innerHTML = '';
if (isNaN(satIdx)) {
passSelectEl.disabled = true;
passSelectEl.innerHTML = '<option value="">– zuerst Satellit waehlen –</option>';
passSelectEl.innerHTML = '<option value="">– zuerst Satellit wählen –</option>';
drawSky([], null, false);
return;
}
const sat = PYTHON_RESULTS[satIdx];
passSelectEl.disabled = false;
passSelectEl.innerHTML = '<option value="">– Ueberflug waehlen –</option>';
passSelectEl.innerHTML = '<option value="">– Überflug wählen –</option>';
sat.passes.forEach((p, passIdx) => {
const isPast = p.losTime <= now;
const opt = document.createElement('option');
+7 -7
View File
@@ -80,7 +80,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$email = trim($_POST['email'] ?? '');
if ($email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors[] = 'Bitte eine gueltige E-Mail-Adresse eingeben.';
$errors[] = 'Bitte eine gültige E-Mail-Adresse eingeben.';
}
if ($displayName !== '' && mb_strlen($displayName) > 100) {
@@ -163,7 +163,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
':id' => $userId,
]);
$successMessage = 'Die Telegram-Verknuepfung wurde entfernt.';
$successMessage = 'Die Telegram-Verknüpfung wurde entfernt.';
}
if ($action === 'update_tcrb_telegram_notifications') {
@@ -217,7 +217,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
if ($newPassword !== $newPasswordRepeat) {
$errors[] = 'Die neuen Passwoerter stimmen nicht ueberein.';
$errors[] = 'Die neuen Passwörter stimmen nicht überein.';
}
if (empty($errors)) {
@@ -311,7 +311,7 @@ $telegramDeepLink = $telegramLinkIsActive && $telegramBotUsername !== ''
<h2>Telegram verbinden</h2>
<div class="form-stack">
<p class="hint">
Spaetere Bot-Nachrichten funktionieren nur mit einer verknuepften Chat-ID. Der Telegram-Username allein reicht Telegram fuer aktive Nachrichten an einen Nutzer nicht aus.
Spätere Bot-Nachrichten funktionieren nur mit einer verknüpften Chat-ID. Der Telegram-Username allein reicht Telegram für aktive Nachrichten an einen Nutzer nicht aus.
</p>
<table class="data-table mb-lg">
<tr><td>Status</td><td><?= $telegramHasConnection ? 'Verbunden' : 'Nicht verbunden' ?></td></tr>
@@ -336,9 +336,9 @@ $telegramDeepLink = $telegramLinkIsActive && $telegramBotUsername !== ''
</form>
<?php if ($telegramHasConnection): ?>
<form method="post" action="" onsubmit="return confirm('Telegram-Verknuepfung wirklich entfernen?');">
<form method="post" action="" onsubmit="return confirm('Telegram-Verknüpfung wirklich entfernen?');">
<input type="hidden" name="action" value="disconnect_telegram">
<button type="submit" class="btn btn-danger">Verknuepfung loesen</button>
<button type="submit" class="btn btn-danger">Verknüpfung lösen</button>
</form>
<?php endif; ?>
</div>
@@ -351,7 +351,7 @@ $telegramDeepLink = $telegramLinkIsActive && $telegramBotUsername !== ''
</div>
<?php endif; ?>
<p class="hint">
Verbindung starten: <a href="<?= h($publicBasePath . 'telegram/connect.php') ?>">Telegram-Verknuepfung oeffnen</a>
Verbindung starten: <a href="<?= h($publicBasePath . 'telegram/connect.php') ?>">Telegram-Verknüpfung öffnen</a>
<?php if ($telegramDeepLink !== null): ?>
oder direkt im Bot:
<a href="<?= h($telegramDeepLink) ?>" target="_blank" rel="noopener">@<?= h($telegramBotUsername) ?></a>
+4 -4
View File
@@ -65,7 +65,7 @@ function runPythonApi(string $scriptPath, string $action, array $arguments): arr
$decoded = json_decode($joined, true);
if (!is_array($decoded)) {
$lastError = $joined !== '' ? 'Python-Ausgabe war kein gueltiges JSON.' : 'Python lieferte keine Ausgabe zurueck.';
$lastError = $joined !== '' ? 'Python-Ausgabe war kein gültiges JSON.' : 'Python lieferte keine Ausgabe zurück.';
continue;
}
@@ -332,7 +332,7 @@ if (!empty($currentLocation) && is_array($currentLocation)) {
<h2>Kein Standard-Standort gesetzt</h2>
<p class="hint">
Fuer die Berechnung wird der Standard-Standort aus der Datenbank verwendet.
Bitte waehle in den <a href="settings.php">Einstellungen</a> einen Standard-Standort aus.
Bitte wähle in den <a href="settings.php">Einstellungen</a> einen Standard-Standort aus.
</p>
</section>
<?php elseif ($pageError !== null): ?>
@@ -384,7 +384,7 @@ if (!empty($currentLocation) && is_array($currentLocation)) {
<section class="card occult-card">
<h2>Bereit zur Berechnung</h2>
<p class="hint">
Die Seite bleibt jetzt waehrend der Berechnung sichtbar. Waehle Datum und Grenzgroesse und starte die
Die Seite bleibt jetzt während der Berechnung sichtbar. Wähle Datum und Grenzgröße und starte die
Auswertung mit dem Button.
</p>
</section>
@@ -432,7 +432,7 @@ if (!empty($currentLocation) && is_array($currentLocation)) {
<div class="occult-submit-progress-bar" aria-hidden="true">
<div class="occult-submit-progress-fill" id="occultSubmitProgressFill"></div>
</div>
<div class="occult-submit-progress-note">Geschaetzter Fortschritt waehrend der laufenden Serverberechnung.</div>
<div class="occult-submit-progress-note">Geschätzter Fortschritt während der laufenden Serverberechnung.</div>
</div>
</div>
</div>
+10 -10
View File
@@ -232,7 +232,7 @@ function sendTelegramMessage(string $botToken, string $chatId, string $messageTe
if (!is_array($decoded)) {
return [
'ok' => false,
'description' => 'Telegram hat keine gueltige JSON-Antwort geliefert.',
'description' => 'Telegram hat keine gültige JSON-Antwort geliefert.',
];
}
@@ -303,7 +303,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
if ($action !== 'send_broadcast') {
$errors[] = 'Die angeforderte Aktion ist ungueltig.';
$errors[] = 'Die angeforderte Aktion ist ungültig.';
}
if ($messageText === '') {
@@ -347,7 +347,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
} elseif ($sendMode === 'selected') {
if (empty($selectedRecipientIds)) {
$errors[] = 'Bitte mindestens einen Empfaenger auswaehlen.';
$errors[] = 'Bitte mindestens einen Empfänger auswählen.';
} else {
foreach ($selectedRecipientIds as $recipientId) {
if (isset($recipientIndex[$recipientId])) {
@@ -356,13 +356,13 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
if (empty($targetRecipients)) {
$errors[] = 'Die ausgewaehlten Empfaenger konnten nicht geladen werden.';
$errors[] = 'Die ausgewählten Empfänger konnten nicht geladen werden.';
}
}
} elseif ($sendMode === 'all') {
$targetRecipients = $recipients;
} else {
$errors[] = 'Der Versandmodus ist ungueltig.';
$errors[] = 'Der Versandmodus ist ungültig.';
}
}
@@ -418,7 +418,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
</p>
<table class="data-table mb-lg">
<tr><td>Verknuepfte Master-Konten</td><td><?= count($recipients) ?></td></tr>
<tr><td>Verknüpfte Master-Konten</td><td><?= count($recipients) ?></td></tr>
<tr><td>Bot</td><td><?= h(($telegramConfig['bot_username'] ?? '') !== '' ? '@' . (string) $telegramConfig['bot_username'] : 'nicht konfiguriert') ?></td></tr>
</table>
@@ -427,14 +427,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
<input type="hidden" name="csrf_token" value="<?= h($_SESSION['telegram_broadcast_csrf']) ?>">
<div class="form-group">
<label>Empfaenger</label>
<label>Empfänger</label>
<label>
<input type="radio" name="send_mode" value="self" <?= $sendMode === 'self' ? 'checked' : '' ?>>
Nur an mich senden
</label>
<label>
<input type="radio" name="send_mode" value="selected" <?= $sendMode === 'selected' ? 'checked' : '' ?>>
An ausgewaehlte Nutzer senden
An ausgewählte Nutzer senden
</label>
<label>
<input type="radio" name="send_mode" value="all" <?= $sendMode === 'all' ? 'checked' : '' ?>>
@@ -443,7 +443,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
</div>
<div class="form-group">
<label for="recipient_ids">Auswahl fuer "ausgewaehlte Nutzer"</label>
<label for="recipient_ids">Auswahl für "ausgewählte Nutzer"</label>
<select id="recipient_ids" name="recipient_ids[]" multiple size="8">
<?php foreach ($recipients as $recipient): ?>
<?php $recipientId = (int) $recipient['id']; ?>
@@ -472,7 +472,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
</div>
<div class="card">
<h2>Empfaenger</h2>
<h2>Empfänger</h2>
<?php if (empty($recipients)): ?>
<p class="hint">Noch keine verknuepften Master-Konten vorhanden.</p>
<?php else: ?>
+5 -5
View File
@@ -36,7 +36,7 @@ $publicBasePath = '../';
$pageTitle = 'Telegram verbinden - AstroTools';
$headerIntroPre = 'Konto';
$headerIntroTitle = 'Telegram verbinden';
$headerIntroSub = 'Bot-Verknuepfung fuer spaetere Benachrichtigungen.';
$headerIntroSub = 'Bot-Verknüpfung für spätere Benachrichtigungen.';
function h(?string $value): string
{
@@ -107,7 +107,7 @@ $deepLink = $botUsername !== ''
<?php require __DIR__ . '/../header.php'; ?>
<div class="card">
<h2>Telegram-Verknuepfung</h2>
<h2>Telegram-Verknüpfung</h2>
<p class="hint">
Diese Verbindung merkt sich die Chat-ID deines Telegram-Kontos, damit spaeter ein Bot dir Inhalte direkt schicken kann.
</p>
@@ -122,11 +122,11 @@ $deepLink = $botUsername !== ''
<?php if ($deepLink !== null): ?>
<p>
<a class="btn btn-primary" href="<?= h($deepLink) ?>" target="_blank" rel="noopener">Bot in Telegram oeffnen</a>
<a class="btn btn-primary" href="<?= h($deepLink) ?>" target="_blank" rel="noopener">Bot in Telegram öffnen</a>
</p>
<div class="telegram-qr-block">
<div class="telegram-qr-image" id="telegramConnectQrLarge" data-telegram-link="<?= h($deepLink) ?>"></div>
<p class="hint">QR-Code mit dem Handy scannen. Telegram oeffnet dann direkt den richtigen Bot mit deinem Verknuepfungslink.</p>
<p class="hint">QR-Code mit dem Handy scannen. Telegram öffnet dann direkt den richtigen Bot mit deinem Verknüpfungslink.</p>
</div>
<?php else: ?>
<p class="hint">
@@ -144,7 +144,7 @@ $deepLink = $botUsername !== ''
</div>
<p class="hint">
Nach erfolgreicher Verknuepfung kannst du zurueck zu <a href="<?= h($publicBasePath . 'settings.php') ?>">Einstellungen</a>.
Nach erfolgreicher Verknüpfung kannst du zurück zu <a href="<?= h($publicBasePath . 'settings.php') ?>">Einstellungen</a>.
</p>
</div>