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
+1 -514
View File
@@ -1,514 +1 @@
[Sat Apr 4 13:05:02 2026] PHP 8.5.4 Development Server (http://127.0.0.1:8000) started
[Sat Apr 4 13:05:02 2026] 127.0.0.1:56847 Accepted
[Sat Apr 4 13:05:02 2026] 127.0.0.1:56847 [200]: GET /
[Sat Apr 4 13:05:02 2026] 127.0.0.1:56847 Closing
[Sat Apr 4 13:05:06 2026] 127.0.0.1:60094 Accepted
[Sat Apr 4 13:05:08 2026] 127.0.0.1:60094 [200]: GET /
[Sat Apr 4 13:05:08 2026] 127.0.0.1:60094 Closing
[Sat Apr 4 13:05:08 2026] 127.0.0.1:55506 Accepted
[Sat Apr 4 13:05:08 2026] 127.0.0.1:55506 [200]: GET /css/style.css
[Sat Apr 4 13:05:08 2026] 127.0.0.1:55506 Closing
[Sat Apr 4 13:05:08 2026] 127.0.0.1:52560 Accepted
[Sat Apr 4 13:05:08 2026] 127.0.0.1:49223 Accepted
[Sat Apr 4 13:05:08 2026] 127.0.0.1:52560 [200]: GET /images/star16x16.png
[Sat Apr 4 13:05:08 2026] 127.0.0.1:49223 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:05:08 2026] 127.0.0.1:52560 Closing
[Sat Apr 4 13:05:08 2026] 127.0.0.1:49223 Closing
[Sat Apr 4 13:05:08 2026] 127.0.0.1:64599 Accepted
[Sat Apr 4 13:05:10 2026] 127.0.0.1:64599 [200]: GET /favicon.ico
[Sat Apr 4 13:05:10 2026] 127.0.0.1:64599 Closing
[Sat Apr 4 13:05:10 2026] 127.0.0.1:63078 Accepted
[Sat Apr 4 13:05:20 2026] 127.0.0.1:63078 [200]: GET /monatsvorhersage.php
[Sat Apr 4 13:05:20 2026] 127.0.0.1:63078 Closing
[Sat Apr 4 13:05:20 2026] 127.0.0.1:64746 Accepted
[Sat Apr 4 13:05:20 2026] 127.0.0.1:57663 Accepted
[Sat Apr 4 13:05:20 2026] 127.0.0.1:64746 [200]: GET /css/style.css
[Sat Apr 4 13:05:39 2026] 127.0.0.1:57663 [200]: GET /monatsvorhersage_old.php
[Sat Apr 4 13:05:39 2026] 127.0.0.1:57663 Closing
[Sat Apr 4 13:05:39 2026] 127.0.0.1:60792 Accepted
[Sat Apr 4 13:05:39 2026] 127.0.0.1:64746 Closing
[Sat Apr 4 13:05:39 2026] 127.0.0.1:51819 Accepted
[Sat Apr 4 13:05:39 2026] 127.0.0.1:60792 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:05:39 2026] 127.0.0.1:51819 [200]: GET /css/style.css
[Sat Apr 4 13:05:39 2026] 127.0.0.1:60792 Closing
[Sat Apr 4 13:05:39 2026] 127.0.0.1:51819 Closing
[Sat Apr 4 13:05:40 2026] 127.0.0.1:55510 Accepted
[Sat Apr 4 13:05:40 2026] 127.0.0.1:55510 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:05:40 2026] 127.0.0.1:55510 Closing
[Sat Apr 4 13:05:40 2026] 127.0.0.1:61999 Accepted
[Sat Apr 4 13:05:40 2026] 127.0.0.1:56212 Accepted
[Sat Apr 4 13:05:40 2026] 127.0.0.1:61999 [200]: GET /images/star16x16.png
[Sat Apr 4 13:05:40 2026] 127.0.0.1:56212 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:05:40 2026] 127.0.0.1:61999 Closing
[Sat Apr 4 13:05:40 2026] 127.0.0.1:56212 Closing
[Sat Apr 4 13:05:40 2026] 127.0.0.1:64580 Accepted
[Sat Apr 4 13:05:40 2026] 127.0.0.1:64580 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:05:40 2026] 127.0.0.1:64580 Closing
[Sat Apr 4 13:05:40 2026] 127.0.0.1:55814 Accepted
[Sat Apr 4 13:05:42 2026] 127.0.0.1:55814 [200]: GET /favicon.ico
[Sat Apr 4 13:05:42 2026] 127.0.0.1:55814 Closing
[Sat Apr 4 13:05:42 2026] 127.0.0.1:62833 Accepted
[Sat Apr 4 13:07:52 2026] 127.0.0.1:62833 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:07:52 2026] 127.0.0.1:62833 Closing
[Sat Apr 4 13:07:52 2026] 127.0.0.1:51688 Accepted
[Sat Apr 4 13:08:11 2026] 127.0.0.1:51688 [200]: GET /monatsvorhersage_old.php?year=2026&month=8
[Sat Apr 4 13:08:11 2026] 127.0.0.1:51688 Closing
[Sat Apr 4 13:08:11 2026] 127.0.0.1:51110 Accepted
[Sat Apr 4 13:08:11 2026] 127.0.0.1:51110 [200]: GET /css/style.css
[Sat Apr 4 13:08:11 2026] 127.0.0.1:51110 Closing
[Sat Apr 4 13:08:12 2026] 127.0.0.1:61842 Accepted
[Sat Apr 4 13:08:12 2026] 127.0.0.1:61842 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:08:12 2026] 127.0.0.1:61842 Closing
[Sat Apr 4 13:08:12 2026] 127.0.0.1:64415 Accepted
[Sat Apr 4 13:08:12 2026] 127.0.0.1:62641 Accepted
[Sat Apr 4 13:08:12 2026] 127.0.0.1:64415 [200]: GET /images/star16x16.png
[Sat Apr 4 13:08:12 2026] 127.0.0.1:62641 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:08:12 2026] 127.0.0.1:64415 Closing
[Sat Apr 4 13:08:12 2026] 127.0.0.1:62641 Closing
[Sat Apr 4 13:08:12 2026] 127.0.0.1:63695 Accepted
[Sat Apr 4 13:08:12 2026] 127.0.0.1:63695 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:08:12 2026] 127.0.0.1:63695 Closing
[Sat Apr 4 13:08:12 2026] 127.0.0.1:65119 Accepted
[Sat Apr 4 13:08:14 2026] 127.0.0.1:65119 [200]: GET /favicon.ico
[Sat Apr 4 13:08:14 2026] 127.0.0.1:65119 Closing
[Sat Apr 4 13:08:14 2026] 127.0.0.1:50310 Accepted
[Sat Apr 4 13:09:39 2026] 127.0.0.1:50310 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:09:39 2026] 127.0.0.1:50310 Closing
[Sat Apr 4 13:11:39 2026] 127.0.0.1:51038 Accepted
[Sat Apr 4 13:11:59 2026] 127.0.0.1:51038 [200]: GET /monatsvorhersage_old.php?month=8&year=2026
[Sat Apr 4 13:11:59 2026] 127.0.0.1:51038 Closing
[Sat Apr 4 13:15:49 2026] 127.0.0.1:61379 Accepted
[Sat Apr 4 13:16:07 2026] 127.0.0.1:61379 [200]: GET /monatsvorhersage_old.php?year=2026&month=8
[Sat Apr 4 13:16:07 2026] 127.0.0.1:61379 Closing
[Sat Apr 4 13:16:07 2026] 127.0.0.1:57225 Accepted
[Sat Apr 4 13:16:07 2026] 127.0.0.1:57225 [200]: GET /css/style.css
[Sat Apr 4 13:16:07 2026] 127.0.0.1:57225 Closing
[Sat Apr 4 13:16:08 2026] 127.0.0.1:54279 Accepted
[Sat Apr 4 13:16:08 2026] 127.0.0.1:63941 Accepted
[Sat Apr 4 13:16:08 2026] 127.0.0.1:50404 Accepted
[Sat Apr 4 13:16:08 2026] 127.0.0.1:54279 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:16:08 2026] 127.0.0.1:63941 [200]: GET /images/star16x16.png
[Sat Apr 4 13:16:08 2026] 127.0.0.1:50404 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:16:08 2026] 127.0.0.1:54279 Closing
[Sat Apr 4 13:16:08 2026] 127.0.0.1:63941 Closing
[Sat Apr 4 13:16:08 2026] 127.0.0.1:50404 Closing
[Sat Apr 4 13:16:08 2026] 127.0.0.1:65327 Accepted
[Sat Apr 4 13:16:08 2026] 127.0.0.1:65327 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:16:08 2026] 127.0.0.1:65327 Closing
[Sat Apr 4 13:16:08 2026] 127.0.0.1:59854 Accepted
[Sat Apr 4 13:16:10 2026] 127.0.0.1:59854 [200]: GET /favicon.ico
[Sat Apr 4 13:16:10 2026] 127.0.0.1:59854 Closing
[Sat Apr 4 13:16:10 2026] 127.0.0.1:56915 Accepted
[Sat Apr 4 13:17:37 2026] 127.0.0.1:56915 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:17:37 2026] 127.0.0.1:56915 Closing
[Sat Apr 4 13:19:31 2026] 127.0.0.1:62466 Accepted
[Sat Apr 4 13:19:49 2026] 127.0.0.1:62466 [200]: GET /monatsvorhersage_old.php?year=2026&month=8
[Sat Apr 4 13:19:49 2026] 127.0.0.1:62466 Closing
[Sat Apr 4 13:19:49 2026] 127.0.0.1:56563 Accepted
[Sat Apr 4 13:19:49 2026] 127.0.0.1:56563 [200]: GET /css/style.css
[Sat Apr 4 13:19:49 2026] 127.0.0.1:56563 Closing
[Sat Apr 4 13:19:50 2026] 127.0.0.1:64763 Accepted
[Sat Apr 4 13:19:50 2026] 127.0.0.1:57365 Accepted
[Sat Apr 4 13:19:50 2026] 127.0.0.1:65177 Accepted
[Sat Apr 4 13:19:50 2026] 127.0.0.1:64763 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:19:50 2026] 127.0.0.1:57365 [200]: GET /images/star16x16.png
[Sat Apr 4 13:19:50 2026] 127.0.0.1:65177 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:19:50 2026] 127.0.0.1:64763 Closing
[Sat Apr 4 13:19:50 2026] 127.0.0.1:57365 Closing
[Sat Apr 4 13:19:50 2026] 127.0.0.1:65177 Closing
[Sat Apr 4 13:19:50 2026] 127.0.0.1:55468 Accepted
[Sat Apr 4 13:19:50 2026] 127.0.0.1:55468 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:19:50 2026] 127.0.0.1:55468 Closing
[Sat Apr 4 13:19:50 2026] 127.0.0.1:59829 Accepted
[Sat Apr 4 13:19:52 2026] 127.0.0.1:59829 [200]: GET /favicon.ico
[Sat Apr 4 13:19:52 2026] 127.0.0.1:59829 Closing
[Sat Apr 4 13:19:52 2026] 127.0.0.1:59742 Accepted
[Sat Apr 4 13:20:29 2026] 127.0.0.1:59742 [200]: GET /monatsvorhersage_old.php?year=2026&month=4
[Sat Apr 4 13:20:29 2026] 127.0.0.1:59742 Closing
[Sat Apr 4 13:20:29 2026] 127.0.0.1:56911 Accepted
[Sat Apr 4 13:20:29 2026] 127.0.0.1:56911 [200]: GET /css/style.css
[Sat Apr 4 13:20:29 2026] 127.0.0.1:56911 Closing
[Sat Apr 4 13:20:29 2026] 127.0.0.1:56768 Accepted
[Sat Apr 4 13:20:29 2026] 127.0.0.1:55966 Accepted
[Sat Apr 4 13:20:29 2026] 127.0.0.1:63374 Accepted
[Sat Apr 4 13:20:29 2026] 127.0.0.1:56768 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:20:29 2026] 127.0.0.1:55966 [200]: GET /images/star16x16.png
[Sat Apr 4 13:20:29 2026] 127.0.0.1:63374 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:20:29 2026] 127.0.0.1:56768 Closing
[Sat Apr 4 13:20:29 2026] 127.0.0.1:55966 Closing
[Sat Apr 4 13:20:29 2026] 127.0.0.1:63374 Closing
[Sat Apr 4 13:20:29 2026] 127.0.0.1:49904 Accepted
[Sat Apr 4 13:20:29 2026] 127.0.0.1:49904 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:20:29 2026] 127.0.0.1:49904 Closing
[Sat Apr 4 13:20:29 2026] 127.0.0.1:58593 Accepted
[Sat Apr 4 13:20:31 2026] 127.0.0.1:58593 [200]: GET /favicon.ico
[Sat Apr 4 13:20:31 2026] 127.0.0.1:58593 Closing
[Sat Apr 4 13:20:31 2026] 127.0.0.1:52115 Accepted
[Sat Apr 4 13:21:39 2026] 127.0.0.1:52115 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:21:39 2026] 127.0.0.1:52115 Closing
[Sat Apr 4 13:23:23 2026] 127.0.0.1:64731 Accepted
[Sat Apr 4 13:23:41 2026] 127.0.0.1:64731 [200]: GET /monatsvorhersage_old.php?year=2026&month=4
[Sat Apr 4 13:23:41 2026] 127.0.0.1:64731 Closing
[Sat Apr 4 13:23:41 2026] 127.0.0.1:58328 Accepted
[Sat Apr 4 13:23:41 2026] 127.0.0.1:58328 [200]: GET /css/style.css
[Sat Apr 4 13:23:41 2026] 127.0.0.1:58328 Closing
[Sat Apr 4 13:23:41 2026] 127.0.0.1:58441 Accepted
[Sat Apr 4 13:23:41 2026] 127.0.0.1:54768 Accepted
[Sat Apr 4 13:23:41 2026] 127.0.0.1:62374 Accepted
[Sat Apr 4 13:23:41 2026] 127.0.0.1:58441 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:23:41 2026] 127.0.0.1:54768 [200]: GET /images/star16x16.png
[Sat Apr 4 13:23:41 2026] 127.0.0.1:62374 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:23:41 2026] 127.0.0.1:58441 Closing
[Sat Apr 4 13:23:41 2026] 127.0.0.1:54768 Closing
[Sat Apr 4 13:23:41 2026] 127.0.0.1:62374 Closing
[Sat Apr 4 13:23:42 2026] 127.0.0.1:63045 Accepted
[Sat Apr 4 13:23:42 2026] 127.0.0.1:63045 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:23:42 2026] 127.0.0.1:63045 Closing
[Sat Apr 4 13:23:42 2026] 127.0.0.1:58545 Accepted
[Sat Apr 4 13:23:43 2026] 127.0.0.1:58545 [200]: GET /favicon.ico
[Sat Apr 4 13:23:43 2026] 127.0.0.1:58545 Closing
[Sat Apr 4 13:23:43 2026] 127.0.0.1:62655 Accepted
[Sat Apr 4 13:25:25 2026] 127.0.0.1:62655 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:25:25 2026] 127.0.0.1:62655 Closing
[Sat Apr 4 13:25:56 2026] 127.0.0.1:61286 Accepted
[Sat Apr 4 13:26:14 2026] 127.0.0.1:61286 [200]: GET /monatsvorhersage_old.php?year=2026&month=4
[Sat Apr 4 13:26:14 2026] 127.0.0.1:61286 Closing
[Sat Apr 4 13:26:14 2026] 127.0.0.1:50887 Accepted
[Sat Apr 4 13:26:14 2026] 127.0.0.1:50887 [200]: GET /css/style.css
[Sat Apr 4 13:26:14 2026] 127.0.0.1:50887 Closing
[Sat Apr 4 13:26:14 2026] 127.0.0.1:51178 Accepted
[Sat Apr 4 13:26:14 2026] 127.0.0.1:62601 Accepted
[Sat Apr 4 13:26:14 2026] 127.0.0.1:50633 Accepted
[Sat Apr 4 13:26:14 2026] 127.0.0.1:51178 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:26:14 2026] 127.0.0.1:62601 [200]: GET /images/star16x16.png
[Sat Apr 4 13:26:14 2026] 127.0.0.1:50633 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:26:14 2026] 127.0.0.1:51178 Closing
[Sat Apr 4 13:26:14 2026] 127.0.0.1:62601 Closing
[Sat Apr 4 13:26:14 2026] 127.0.0.1:50633 Closing
[Sat Apr 4 13:26:15 2026] 127.0.0.1:64777 Accepted
[Sat Apr 4 13:26:15 2026] 127.0.0.1:64777 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:26:15 2026] 127.0.0.1:64777 Closing
[Sat Apr 4 13:26:15 2026] 127.0.0.1:54587 Accepted
[Sat Apr 4 13:26:16 2026] 127.0.0.1:54587 [200]: GET /favicon.ico
[Sat Apr 4 13:26:16 2026] 127.0.0.1:54587 Closing
[Sat Apr 4 13:26:16 2026] 127.0.0.1:59843 Accepted
[Sat Apr 4 13:27:02 2026] 127.0.0.1:59843 [200]: GET /monatsvorhersage_old.php?year=2026&month=4
[Sat Apr 4 13:27:02 2026] 127.0.0.1:59843 Closing
[Sat Apr 4 13:27:02 2026] 127.0.0.1:60256 Accepted
[Sat Apr 4 13:27:02 2026] 127.0.0.1:60256 [200]: GET /css/style.css
[Sat Apr 4 13:27:02 2026] 127.0.0.1:60256 Closing
[Sat Apr 4 13:27:03 2026] 127.0.0.1:50709 Accepted
[Sat Apr 4 13:27:03 2026] 127.0.0.1:50709 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:27:03 2026] 127.0.0.1:50709 Closing
[Sat Apr 4 13:27:03 2026] 127.0.0.1:55625 Accepted
[Sat Apr 4 13:27:03 2026] 127.0.0.1:61166 Accepted
[Sat Apr 4 13:27:03 2026] 127.0.0.1:55625 [200]: GET /images/star16x16.png
[Sat Apr 4 13:27:03 2026] 127.0.0.1:61166 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:27:03 2026] 127.0.0.1:55625 Closing
[Sat Apr 4 13:27:03 2026] 127.0.0.1:61166 Closing
[Sat Apr 4 13:27:03 2026] 127.0.0.1:56924 Accepted
[Sat Apr 4 13:27:03 2026] 127.0.0.1:56924 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:27:03 2026] 127.0.0.1:56924 Closing
[Sat Apr 4 13:27:03 2026] 127.0.0.1:58839 Accepted
[Sat Apr 4 13:27:04 2026] 127.0.0.1:58839 [200]: GET /favicon.ico
[Sat Apr 4 13:27:04 2026] 127.0.0.1:58839 Closing
[Sat Apr 4 13:27:04 2026] 127.0.0.1:59023 Accepted
[Sat Apr 4 13:28:04 2026] 127.0.0.1:59023 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:28:04 2026] 127.0.0.1:59023 Closing
[Sat Apr 4 13:28:24 2026] 127.0.0.1:65445 Accepted
[Sat Apr 4 13:28:43 2026] 127.0.0.1:65445 [200]: GET /monatsvorhersage_old.php?year=2026&month=6
[Sat Apr 4 13:28:43 2026] 127.0.0.1:65445 Closing
[Sat Apr 4 13:28:43 2026] 127.0.0.1:57680 Accepted
[Sat Apr 4 13:28:43 2026] 127.0.0.1:57680 [200]: GET /css/style.css
[Sat Apr 4 13:28:43 2026] 127.0.0.1:57680 Closing
[Sat Apr 4 13:28:43 2026] 127.0.0.1:64580 Accepted
[Sat Apr 4 13:28:43 2026] 127.0.0.1:59058 Accepted
[Sat Apr 4 13:28:43 2026] 127.0.0.1:59321 Accepted
[Sat Apr 4 13:28:43 2026] 127.0.0.1:64580 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:28:43 2026] 127.0.0.1:59058 [200]: GET /images/star16x16.png
[Sat Apr 4 13:28:43 2026] 127.0.0.1:59321 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:28:43 2026] 127.0.0.1:64580 Closing
[Sat Apr 4 13:28:43 2026] 127.0.0.1:59058 Closing
[Sat Apr 4 13:28:43 2026] 127.0.0.1:59321 Closing
[Sat Apr 4 13:28:43 2026] 127.0.0.1:57091 Accepted
[Sat Apr 4 13:28:43 2026] 127.0.0.1:57091 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:28:43 2026] 127.0.0.1:57091 Closing
[Sat Apr 4 13:28:44 2026] 127.0.0.1:64529 Accepted
[Sat Apr 4 13:28:45 2026] 127.0.0.1:64529 [200]: GET /favicon.ico
[Sat Apr 4 13:28:45 2026] 127.0.0.1:64529 Closing
[Sat Apr 4 13:28:45 2026] 127.0.0.1:57521 Accepted
[Sat Apr 4 13:29:45 2026] 127.0.0.1:57521 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:29:45 2026] 127.0.0.1:57521 Closing
[Sat Apr 4 13:29:45 2026] 127.0.0.1:60715 Accepted
[Sat Apr 4 13:30:04 2026] 127.0.0.1:60715 [200]: GET /monatsvorhersage_old.php?year=2026&month=7
[Sat Apr 4 13:30:04 2026] 127.0.0.1:60715 Closing
[Sat Apr 4 13:30:04 2026] 127.0.0.1:63768 Accepted
[Sat Apr 4 13:30:04 2026] 127.0.0.1:63768 [200]: GET /css/style.css
[Sat Apr 4 13:30:04 2026] 127.0.0.1:63768 Closing
[Sat Apr 4 13:30:04 2026] 127.0.0.1:53424 Accepted
[Sat Apr 4 13:30:04 2026] 127.0.0.1:63669 Accepted
[Sat Apr 4 13:30:04 2026] 127.0.0.1:61253 Accepted
[Sat Apr 4 13:30:04 2026] 127.0.0.1:53424 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:30:04 2026] 127.0.0.1:63669 [200]: GET /images/star16x16.png
[Sat Apr 4 13:30:04 2026] 127.0.0.1:61253 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:30:04 2026] 127.0.0.1:53424 Closing
[Sat Apr 4 13:30:04 2026] 127.0.0.1:63669 Closing
[Sat Apr 4 13:30:04 2026] 127.0.0.1:61253 Closing
[Sat Apr 4 13:30:05 2026] 127.0.0.1:64094 Accepted
[Sat Apr 4 13:30:05 2026] 127.0.0.1:64094 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:30:05 2026] 127.0.0.1:64094 Closing
[Sat Apr 4 13:30:05 2026] 127.0.0.1:51726 Accepted
[Sat Apr 4 13:30:06 2026] 127.0.0.1:51726 [200]: GET /favicon.ico
[Sat Apr 4 13:30:06 2026] 127.0.0.1:51726 Closing
[Sat Apr 4 13:30:06 2026] 127.0.0.1:52200 Accepted
[Sat Apr 4 13:30:50 2026] 127.0.0.1:52200 [200]: GET /monatsvorhersage_old.php?year=2026&month=11
[Sat Apr 4 13:30:50 2026] 127.0.0.1:52200 Closing
[Sat Apr 4 13:30:50 2026] 127.0.0.1:62487 Accepted
[Sat Apr 4 13:30:50 2026] 127.0.0.1:62487 [200]: GET /css/style.css
[Sat Apr 4 13:30:50 2026] 127.0.0.1:62487 Closing
[Sat Apr 4 13:30:50 2026] 127.0.0.1:60781 Accepted
[Sat Apr 4 13:30:50 2026] 127.0.0.1:60781 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:30:50 2026] 127.0.0.1:60781 Closing
[Sat Apr 4 13:30:50 2026] 127.0.0.1:53275 Accepted
[Sat Apr 4 13:30:50 2026] 127.0.0.1:49256 Accepted
[Sat Apr 4 13:30:50 2026] 127.0.0.1:53275 [200]: GET /images/star16x16.png
[Sat Apr 4 13:30:50 2026] 127.0.0.1:49256 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:30:50 2026] 127.0.0.1:53275 Closing
[Sat Apr 4 13:30:50 2026] 127.0.0.1:49256 Closing
[Sat Apr 4 13:30:51 2026] 127.0.0.1:63389 Accepted
[Sat Apr 4 13:30:51 2026] 127.0.0.1:63389 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:30:51 2026] 127.0.0.1:63389 Closing
[Sat Apr 4 13:30:51 2026] 127.0.0.1:61832 Accepted
[Sat Apr 4 13:30:52 2026] 127.0.0.1:61832 [200]: GET /favicon.ico
[Sat Apr 4 13:30:52 2026] 127.0.0.1:61832 Closing
[Sat Apr 4 13:30:52 2026] 127.0.0.1:59473 Accepted
[Sat Apr 4 13:31:32 2026] 127.0.0.1:59473 [200]: GET /monatsvorhersage_old.php?year=2026&month=12
[Sat Apr 4 13:31:32 2026] 127.0.0.1:59473 Closing
[Sat Apr 4 13:31:32 2026] 127.0.0.1:65461 Accepted
[Sat Apr 4 13:31:32 2026] 127.0.0.1:65461 [200]: GET /css/style.css
[Sat Apr 4 13:31:32 2026] 127.0.0.1:65461 Closing
[Sat Apr 4 13:31:32 2026] 127.0.0.1:62904 Accepted
[Sat Apr 4 13:31:32 2026] 127.0.0.1:62904 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:31:32 2026] 127.0.0.1:62904 Closing
[Sat Apr 4 13:31:32 2026] 127.0.0.1:54230 Accepted
[Sat Apr 4 13:31:32 2026] 127.0.0.1:56692 Accepted
[Sat Apr 4 13:31:32 2026] 127.0.0.1:54230 [200]: GET /images/star16x16.png
[Sat Apr 4 13:31:32 2026] 127.0.0.1:56692 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:31:32 2026] 127.0.0.1:54230 Closing
[Sat Apr 4 13:31:32 2026] 127.0.0.1:56692 Closing
[Sat Apr 4 13:31:33 2026] 127.0.0.1:55075 Accepted
[Sat Apr 4 13:31:33 2026] 127.0.0.1:55075 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:31:33 2026] 127.0.0.1:55075 Closing
[Sat Apr 4 13:31:33 2026] 127.0.0.1:64547 Accepted
[Sat Apr 4 13:31:34 2026] 127.0.0.1:64547 [200]: GET /favicon.ico
[Sat Apr 4 13:31:34 2026] 127.0.0.1:64547 Closing
[Sat Apr 4 13:31:34 2026] 127.0.0.1:55972 Accepted
[Sat Apr 4 13:32:38 2026] 127.0.0.1:55972 [200]: GET /monatsvorhersage_old.php?year=2026&month=6
[Sat Apr 4 13:32:38 2026] 127.0.0.1:55972 Closing
[Sat Apr 4 13:32:38 2026] 127.0.0.1:59385 Accepted
[Sat Apr 4 13:32:38 2026] 127.0.0.1:59385 [200]: GET /css/style.css
[Sat Apr 4 13:32:38 2026] 127.0.0.1:59385 Closing
[Sat Apr 4 13:32:38 2026] 127.0.0.1:57529 Accepted
[Sat Apr 4 13:32:38 2026] 127.0.0.1:57529 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:32:38 2026] 127.0.0.1:57529 Closing
[Sat Apr 4 13:32:38 2026] 127.0.0.1:52680 Accepted
[Sat Apr 4 13:32:38 2026] 127.0.0.1:53823 Accepted
[Sat Apr 4 13:32:38 2026] 127.0.0.1:52680 [200]: GET /images/star16x16.png
[Sat Apr 4 13:32:38 2026] 127.0.0.1:53823 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:32:38 2026] 127.0.0.1:52680 Closing
[Sat Apr 4 13:32:38 2026] 127.0.0.1:53823 Closing
[Sat Apr 4 13:32:38 2026] 127.0.0.1:55373 Accepted
[Sat Apr 4 13:32:38 2026] 127.0.0.1:55373 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:32:38 2026] 127.0.0.1:55373 Closing
[Sat Apr 4 13:32:39 2026] 127.0.0.1:57222 Accepted
[Sat Apr 4 13:32:40 2026] 127.0.0.1:57222 [200]: GET /favicon.ico
[Sat Apr 4 13:32:40 2026] 127.0.0.1:57222 Closing
[Sat Apr 4 13:32:40 2026] 127.0.0.1:65119 Accepted
[Sat Apr 4 13:33:49 2026] 127.0.0.1:65119 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:33:49 2026] 127.0.0.1:65119 Closing
[Sat Apr 4 13:38:06 2026] 127.0.0.1:58712 Accepted
[Sat Apr 4 13:38:25 2026] 127.0.0.1:58712 [200]: GET /monatsvorhersage_old.php?year=2026&month=6
[Sat Apr 4 13:38:25 2026] 127.0.0.1:58712 Closing
[Sat Apr 4 13:38:25 2026] 127.0.0.1:49291 Accepted
[Sat Apr 4 13:38:25 2026] 127.0.0.1:49291 [200]: GET /css/style.css
[Sat Apr 4 13:38:25 2026] 127.0.0.1:49291 Closing
[Sat Apr 4 13:38:25 2026] 127.0.0.1:54898 Accepted
[Sat Apr 4 13:38:25 2026] 127.0.0.1:64556 Accepted
[Sat Apr 4 13:38:25 2026] 127.0.0.1:52911 Accepted
[Sat Apr 4 13:38:25 2026] 127.0.0.1:54898 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:38:25 2026] 127.0.0.1:64556 [200]: GET /images/star16x16.png
[Sat Apr 4 13:38:25 2026] 127.0.0.1:52911 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:38:25 2026] 127.0.0.1:54898 Closing
[Sat Apr 4 13:38:25 2026] 127.0.0.1:64556 Closing
[Sat Apr 4 13:38:25 2026] 127.0.0.1:52911 Closing
[Sat Apr 4 13:38:25 2026] 127.0.0.1:52036 Accepted
[Sat Apr 4 13:38:25 2026] 127.0.0.1:52036 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:38:25 2026] 127.0.0.1:52036 Closing
[Sat Apr 4 13:38:25 2026] 127.0.0.1:51944 Accepted
[Sat Apr 4 13:38:27 2026] 127.0.0.1:51944 [200]: GET /favicon.ico
[Sat Apr 4 13:38:27 2026] 127.0.0.1:51944 Closing
[Sat Apr 4 13:38:27 2026] 127.0.0.1:51201 Accepted
[Sat Apr 4 13:40:25 2026] 127.0.0.1:51201 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:40:25 2026] 127.0.0.1:51201 Closing
[Sat Apr 4 13:44:22 2026] 127.0.0.1:62240 Accepted
[Sat Apr 4 13:44:45 2026] 127.0.0.1:62240 [200]: GET /monatsvorhersage_old.php?year=2026&month=6
[Sat Apr 4 13:44:45 2026] 127.0.0.1:62240 Closing
[Sat Apr 4 13:44:45 2026] 127.0.0.1:56366 Accepted
[Sat Apr 4 13:44:45 2026] 127.0.0.1:56366 [200]: GET /css/style.css
[Sat Apr 4 13:44:45 2026] 127.0.0.1:56366 Closing
[Sat Apr 4 13:44:46 2026] 127.0.0.1:61203 Accepted
[Sat Apr 4 13:44:46 2026] 127.0.0.1:60789 Accepted
[Sat Apr 4 13:44:46 2026] 127.0.0.1:58216 Accepted
[Sat Apr 4 13:44:46 2026] 127.0.0.1:61203 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:44:46 2026] 127.0.0.1:60789 [200]: GET /images/star16x16.png
[Sat Apr 4 13:44:46 2026] 127.0.0.1:58216 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:44:46 2026] 127.0.0.1:61203 Closing
[Sat Apr 4 13:44:46 2026] 127.0.0.1:60789 Closing
[Sat Apr 4 13:44:46 2026] 127.0.0.1:58216 Closing
[Sat Apr 4 13:44:46 2026] 127.0.0.1:51748 Accepted
[Sat Apr 4 13:44:46 2026] 127.0.0.1:51748 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:44:46 2026] 127.0.0.1:51748 Closing
[Sat Apr 4 13:44:46 2026] 127.0.0.1:58822 Accepted
[Sat Apr 4 13:44:48 2026] 127.0.0.1:58822 [200]: GET /favicon.ico
[Sat Apr 4 13:44:48 2026] 127.0.0.1:58822 Closing
[Sat Apr 4 13:44:48 2026] 127.0.0.1:59663 Accepted
[Sat Apr 4 13:45:47 2026] 127.0.0.1:59663 [200]: GET /monatsvorhersage_old.php?year=2026&month=3
[Sat Apr 4 13:45:47 2026] 127.0.0.1:59663 Closing
[Sat Apr 4 13:45:47 2026] 127.0.0.1:58444 Accepted
[Sat Apr 4 13:45:47 2026] 127.0.0.1:58444 [200]: GET /css/style.css
[Sat Apr 4 13:45:47 2026] 127.0.0.1:58444 Closing
[Sat Apr 4 13:45:47 2026] 127.0.0.1:54748 Accepted
[Sat Apr 4 13:45:47 2026] 127.0.0.1:50160 Accepted
[Sat Apr 4 13:45:47 2026] 127.0.0.1:63963 Accepted
[Sat Apr 4 13:45:47 2026] 127.0.0.1:54748 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:45:47 2026] 127.0.0.1:50160 [200]: GET /images/star16x16.png
[Sat Apr 4 13:45:47 2026] 127.0.0.1:63963 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:45:47 2026] 127.0.0.1:54748 Closing
[Sat Apr 4 13:45:47 2026] 127.0.0.1:50160 Closing
[Sat Apr 4 13:45:47 2026] 127.0.0.1:63963 Closing
[Sat Apr 4 13:45:47 2026] 127.0.0.1:49669 Accepted
[Sat Apr 4 13:45:47 2026] 127.0.0.1:49669 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:45:47 2026] 127.0.0.1:49669 Closing
[Sat Apr 4 13:45:48 2026] 127.0.0.1:62598 Accepted
[Sat Apr 4 13:45:49 2026] 127.0.0.1:62598 [200]: GET /favicon.ico
[Sat Apr 4 13:45:49 2026] 127.0.0.1:62598 Closing
[Sat Apr 4 13:45:49 2026] 127.0.0.1:64872 Accepted
[Sat Apr 4 13:47:10 2026] 127.0.0.1:64872 [200]: GET /monatsvorhersage_old.php?year=2026&month=3
[Sat Apr 4 13:47:10 2026] 127.0.0.1:64872 Closing
[Sat Apr 4 13:47:10 2026] 127.0.0.1:52271 Accepted
[Sat Apr 4 13:47:10 2026] 127.0.0.1:52271 [200]: GET /css/style.css
[Sat Apr 4 13:47:10 2026] 127.0.0.1:52271 Closing
[Sat Apr 4 13:47:10 2026] 127.0.0.1:60145 Accepted
[Sat Apr 4 13:47:10 2026] 127.0.0.1:60145 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:47:10 2026] 127.0.0.1:60145 Closing
[Sat Apr 4 13:47:10 2026] 127.0.0.1:64268 Accepted
[Sat Apr 4 13:47:10 2026] 127.0.0.1:54962 Accepted
[Sat Apr 4 13:47:10 2026] 127.0.0.1:64268 [200]: GET /images/star16x16.png
[Sat Apr 4 13:47:10 2026] 127.0.0.1:54962 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:47:10 2026] 127.0.0.1:64268 Closing
[Sat Apr 4 13:47:10 2026] 127.0.0.1:54962 Closing
[Sat Apr 4 13:47:10 2026] 127.0.0.1:60276 Accepted
[Sat Apr 4 13:47:10 2026] 127.0.0.1:60276 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:47:10 2026] 127.0.0.1:60276 Closing
[Sat Apr 4 13:47:11 2026] 127.0.0.1:57233 Accepted
[Sat Apr 4 13:47:12 2026] 127.0.0.1:57233 [200]: GET /favicon.ico
[Sat Apr 4 13:47:12 2026] 127.0.0.1:57233 Closing
[Sat Apr 4 13:47:12 2026] 127.0.0.1:57496 Accepted
[Sat Apr 4 13:48:32 2026] 127.0.0.1:57496 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:48:32 2026] 127.0.0.1:57496 Closing
[Sat Apr 4 13:52:34 2026] 127.0.0.1:59903 Accepted
[Sat Apr 4 13:53:02 2026] 127.0.0.1:59903 [200]: GET /monatsvorhersage_old.php?year=2026&month=3
[Sat Apr 4 13:53:02 2026] 127.0.0.1:59903 Closing
[Sat Apr 4 13:53:02 2026] 127.0.0.1:57051 Accepted
[Sat Apr 4 13:53:02 2026] 127.0.0.1:57051 [200]: GET /css/style.css
[Sat Apr 4 13:53:02 2026] 127.0.0.1:57051 Closing
[Sat Apr 4 13:53:02 2026] 127.0.0.1:55642 Accepted
[Sat Apr 4 13:53:02 2026] 127.0.0.1:55642 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:53:02 2026] 127.0.0.1:55642 Closing
[Sat Apr 4 13:53:02 2026] 127.0.0.1:58427 Accepted
[Sat Apr 4 13:53:02 2026] 127.0.0.1:55928 Accepted
[Sat Apr 4 13:53:02 2026] 127.0.0.1:58427 [200]: GET /images/star16x16.png
[Sat Apr 4 13:53:02 2026] 127.0.0.1:55928 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:53:02 2026] 127.0.0.1:58427 Closing
[Sat Apr 4 13:53:02 2026] 127.0.0.1:55928 Closing
[Sat Apr 4 13:53:03 2026] 127.0.0.1:61870 Accepted
[Sat Apr 4 13:53:03 2026] 127.0.0.1:61870 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:53:03 2026] 127.0.0.1:61870 Closing
[Sat Apr 4 13:53:03 2026] 127.0.0.1:54335 Accepted
[Sat Apr 4 13:53:04 2026] 127.0.0.1:54335 [200]: GET /favicon.ico
[Sat Apr 4 13:53:04 2026] 127.0.0.1:54335 Closing
[Sat Apr 4 13:53:04 2026] 127.0.0.1:62912 Accepted
[Sat Apr 4 13:54:05 2026] 127.0.0.1:62912 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:54:05 2026] 127.0.0.1:62912 Closing
[Sat Apr 4 13:54:06 2026] 127.0.0.1:49467 Accepted
[Sat Apr 4 13:54:33 2026] 127.0.0.1:49467 [200]: GET /monatsvorhersage_old.php?year=2026&month=3
[Sat Apr 4 13:54:33 2026] 127.0.0.1:49467 Closing
[Sat Apr 4 13:54:33 2026] 127.0.0.1:54734 Accepted
[Sat Apr 4 13:54:33 2026] 127.0.0.1:54734 [200]: GET /css/style.css
[Sat Apr 4 13:54:34 2026] 127.0.0.1:54734 Closing
[Sat Apr 4 13:54:34 2026] 127.0.0.1:60887 Accepted
[Sat Apr 4 13:54:34 2026] 127.0.0.1:51648 Accepted
[Sat Apr 4 13:54:34 2026] 127.0.0.1:58048 Accepted
[Sat Apr 4 13:54:34 2026] 127.0.0.1:60887 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:54:34 2026] 127.0.0.1:51648 [200]: GET /images/star16x16.png
[Sat Apr 4 13:54:34 2026] 127.0.0.1:58048 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:54:34 2026] 127.0.0.1:60887 Closing
[Sat Apr 4 13:54:34 2026] 127.0.0.1:51648 Closing
[Sat Apr 4 13:54:34 2026] 127.0.0.1:58048 Closing
[Sat Apr 4 13:54:34 2026] 127.0.0.1:64802 Accepted
[Sat Apr 4 13:54:34 2026] 127.0.0.1:64802 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:54:34 2026] 127.0.0.1:64802 Closing
[Sat Apr 4 13:54:34 2026] 127.0.0.1:63820 Accepted
[Sat Apr 4 13:54:36 2026] 127.0.0.1:63820 [200]: GET /favicon.ico
[Sat Apr 4 13:54:36 2026] 127.0.0.1:63820 Closing
[Sat Apr 4 13:54:36 2026] 127.0.0.1:52071 Accepted
[Sat Apr 4 13:55:40 2026] 127.0.0.1:52071 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:55:40 2026] 127.0.0.1:52071 Closing
[Sat Apr 4 13:57:33 2026] 127.0.0.1:51514 Accepted
[Sat Apr 4 13:58:01 2026] 127.0.0.1:51514 [200]: GET /monatsvorhersage_old.php?year=2026&month=3
[Sat Apr 4 13:58:01 2026] 127.0.0.1:51514 Closing
[Sat Apr 4 13:58:01 2026] 127.0.0.1:64035 Accepted
[Sat Apr 4 13:58:01 2026] 127.0.0.1:64035 [200]: GET /css/style.css
[Sat Apr 4 13:58:01 2026] 127.0.0.1:64035 Closing
[Sat Apr 4 13:58:02 2026] 127.0.0.1:62594 Accepted
[Sat Apr 4 13:58:02 2026] 127.0.0.1:62594 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 13:58:02 2026] 127.0.0.1:62594 Closing
[Sat Apr 4 13:58:02 2026] 127.0.0.1:57161 Accepted
[Sat Apr 4 13:58:02 2026] 127.0.0.1:64207 Accepted
[Sat Apr 4 13:58:02 2026] 127.0.0.1:57161 [200]: GET /images/star16x16.png
[Sat Apr 4 13:58:02 2026] 127.0.0.1:64207 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 13:58:02 2026] 127.0.0.1:57161 Closing
[Sat Apr 4 13:58:02 2026] 127.0.0.1:64207 Closing
[Sat Apr 4 13:58:02 2026] 127.0.0.1:62295 Accepted
[Sat Apr 4 13:58:02 2026] 127.0.0.1:62295 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 13:58:02 2026] 127.0.0.1:62295 Closing
[Sat Apr 4 13:58:02 2026] 127.0.0.1:58421 Accepted
[Sat Apr 4 13:58:03 2026] 127.0.0.1:58421 [200]: GET /favicon.ico
[Sat Apr 4 13:58:03 2026] 127.0.0.1:58421 Closing
[Sat Apr 4 13:58:03 2026] 127.0.0.1:64749 Accepted
[Sat Apr 4 13:59:29 2026] 127.0.0.1:64749 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 13:59:29 2026] 127.0.0.1:64749 Closing
[Sat Apr 4 14:00:30 2026] 127.0.0.1:59949 Accepted
[Sat Apr 4 14:00:58 2026] 127.0.0.1:59949 [200]: GET /monatsvorhersage_old.php?year=2026&month=3
[Sat Apr 4 14:00:58 2026] 127.0.0.1:59949 Closing
[Sat Apr 4 14:00:58 2026] 127.0.0.1:58547 Accepted
[Sat Apr 4 14:00:58 2026] 127.0.0.1:58547 [200]: GET /css/style.css
[Sat Apr 4 14:00:58 2026] 127.0.0.1:58547 Closing
[Sat Apr 4 14:00:59 2026] 127.0.0.1:52032 Accepted
[Sat Apr 4 14:00:59 2026] 127.0.0.1:59328 Accepted
[Sat Apr 4 14:00:59 2026] 127.0.0.1:61499 Accepted
[Sat Apr 4 14:00:59 2026] 127.0.0.1:52032 [200]: GET /js/astronomy.browser.min.js
[Sat Apr 4 14:00:59 2026] 127.0.0.1:59328 [200]: GET /images/star16x16.png
[Sat Apr 4 14:00:59 2026] 127.0.0.1:61499 [200]: GET /images/star16x16_rays.png
[Sat Apr 4 14:00:59 2026] 127.0.0.1:52032 Closing
[Sat Apr 4 14:00:59 2026] 127.0.0.1:59328 Closing
[Sat Apr 4 14:00:59 2026] 127.0.0.1:61499 Closing
[Sat Apr 4 14:00:59 2026] 127.0.0.1:52843 Accepted
[Sat Apr 4 14:00:59 2026] 127.0.0.1:52843 [200]: GET /images/moons/moon4geocron.png
[Sat Apr 4 14:00:59 2026] 127.0.0.1:52843 Closing
[Sat Apr 4 14:00:59 2026] 127.0.0.1:63369 Accepted
[Sat Apr 4 14:01:01 2026] 127.0.0.1:63369 [200]: GET /favicon.ico
[Sat Apr 4 14:01:01 2026] 127.0.0.1:63369 Closing
[Sat Apr 4 14:01:01 2026] 127.0.0.1:61071 Accepted
[Sat Apr 4 14:02:40 2026] 127.0.0.1:61071 Closed without sending a request; it was probably just an unused speculative preconnection
[Sat Apr 4 14:02:40 2026] 127.0.0.1:61071 Closing
[Sun Apr 5 12:58:24 2026] PHP 8.5.4 Development Server (http://127.0.0.1:8000) started
+1
View File
@@ -0,0 +1 @@
.codex-temp/
+4 -4
View File
@@ -1,13 +1,13 @@
# Dokumentation
Hier liegen die internen Anleitungen und technischen Hilfen fuer das Projekt.
Hier liegen die internen Anleitungen und technischen Hilfen für das Projekt.
## Verfuegbar
## Verfügbar
- [`docs/README_PROJEKT.md`](README_PROJEKT.md)
Grundsaetzliche Erklaerung der Website, ihrer Bereiche und Datenfluesse
Grundsätzliche Erklärung der Website, ihrer Bereiche und Datenflüsse
- [`docs/README_LOCAL_WEBSERVER.md`](README_LOCAL_WEBSERVER.md)
Lokale Startanleitung fuer den PHP-Webserver auf den bekannten Arbeitsplaetzen
Lokale Startanleitung für den PHP-Webserver auf den bekannten Arbeitsplätzen
- [`docs/README_RECHTESYSTEM.md`](README_RECHTESYSTEM.md)
Beschreibung des aktuellen Rollen- und Seitenrechtesystems
+2 -2
View File
@@ -1,6 +1,6 @@
# Lokaler PHP-Webserver
Diese Anleitung enthaelt die lokalen Startbefehle fuer mehrere Rechner.
Diese Anleitung enthält die lokalen Startbefehle für mehrere Rechner.
## ARBEITSPLATZTM
@@ -80,4 +80,4 @@ Ctrl + C
## Hinweis
Der Webserver nutzt den eingebauten PHP-Entwicklungsserver und ist fuer lokale Entwicklung gedacht.
Der Webserver nutzt den eingebauten PHP-Entwicklungsserver und ist für lokale Entwicklung gedacht.
+32 -20
View File
@@ -1,6 +1,6 @@
# Projektueberblick
# Projektüberblick
Diese Datei beschreibt die Website grundsaetzlich: Worum es geht, welche Bereiche es gibt und wie die wichtigsten Bausteine zusammenspielen.
Diese Datei beschreibt die Website grundsätzlich: Worum es geht, welche Bereiche es gibt und wie die wichtigsten Bausteine zusammenspielen.
## Zweck der Website
@@ -8,16 +8,16 @@ Diese Datei beschreibt die Website grundsaetzlich: Worum es geht, welche Bereich
Die Seite verbindet:
- oeffentliche Astronomie-Werkzeuge
- persoenliche Benutzerfunktionen
- Import- und Auswerteprozesse fuer astronomische Daten
- Telegram-Anbindung fuer Benachrichtigungen und Tests
- öffentliche Astronomie-Werkzeuge
- persönliche Benutzerfunktionen
- Import- und Auswerteprozesse für astronomische Daten
- Telegram-Anbindung für Benachrichtigungen und Tests
## Hauptbereiche
Die Website besteht im Kern aus vier Bereichen.
## 1. Oeffentliche Astronomie-Seiten
## 1. Öffentliche Astronomie-Seiten
Unter [`public/`](../public) liegen die eigentlichen Seiten der Website.
@@ -26,7 +26,7 @@ Typische Inhalte sind:
- Mond und Mondphasen
- Planetensichtbarkeit
- Sternenhimmel
- Meteorstroeme
- Meteorströme
- Finsternisse und Bedeckungen
- Geocron und Geocron 3D
- Vorhersage-Seiten wie Monats- und Wochenvorhersage
@@ -48,7 +48,7 @@ Wichtige Konto-Seiten:
- [`public/settings.php`](../public/settings.php)
- [`public/my_favorites.php`](../public/my_favorites.php)
Benutzer koennen dort unter anderem:
Benutzer können dort unter anderem:
- ihr Konto verwalten
- Telegram verbinden
@@ -67,9 +67,9 @@ Aktuell gibt es:
Wichtig:
- `admin` und `master` haben Vollzugriff auf die geschuetzten Seiten
- `admin` und `master` haben Vollzugriff auf die geschützten Seiten
- normale Benutzer erhalten gezielte Seitenfreigaben
- das Header-Menue passt sich an die Seitenrechte an
- das Header-Menü passt sich an die Seitenrechte an
Die Details dazu stehen in:
@@ -87,17 +87,17 @@ Wichtige Skripte liegen unter:
Beispiele:
- [`scripts/import/import_tcrb.php`](../scripts/import/import_tcrb.php)
Importiert AAVSO-WebObs-Daten fuer T CrB
Importiert AAVSO-WebObs-Daten für T CrB
- [`scripts/import/import_celestrak_active.php`](../scripts/import/import_celestrak_active.php)
Importiert Satellitendaten
- [`scripts/telegram/telegram_cron.php`](../scripts/telegram/telegram_cron.php)
Fuehrt Telegram-Aufgaben zeitgesteuert aus
Führt Telegram-Aufgaben zeitgesteuert aus
## T CrB
Ein aktueller Spezialbereich ist `T CrB`.
Dazu gehoeren:
Dazu gehören:
- Import der AAVSO-Daten
- Speicherung in der Datenbank
@@ -114,10 +114,10 @@ Wichtige Dateien:
Die Website besitzt eine Telegram-Anbindung.
Damit koennen Benutzer:
Damit können Benutzer:
- ihr Konto mit Telegram verknuepfen
- spaeter Nachrichten oder Diagramme erhalten
- ihr Konto mit Telegram verknüpfen
- später Nachrichten oder Diagramme erhalten
Wichtige Bausteine:
@@ -134,7 +134,7 @@ Vereinfacht sieht der Ablauf so aus:
1. Import-Skripte holen astronomische Daten aus externen Quellen
2. Die Daten werden in der Datenbank gespeichert
3. Seiten unter `public/` lesen diese Daten aus und stellen sie dar
4. Cron-Skripte koennen daraus Telegram-Nachrichten oder andere Folgeaktionen erzeugen
4. Cron-Skripte können daraus Telegram-Nachrichten oder andere Folgeaktionen erzeugen
## Technischer Aufbau
@@ -151,16 +151,28 @@ Wichtige Verzeichnisse:
- [`docs/`](.)
Projektdokumentation
## Fuer neue Arbeit an der Seite wichtig
## Für neue Arbeit an der Seite wichtig
Wenn neue Funktionen dazukommen, sollte man immer an diese Punkte denken:
- braucht die Seite einen Eintrag im Rechtesystem
- soll sie im Header-Menue erscheinen
- soll sie im Header-Menü erscheinen
- braucht sie Datenimport oder Cron
- braucht sie Telegram-Anbindung
- braucht sie Dokumentation in `docs`
## Schreibweise
Für deutsche Ausgabetexte in UI, Meldungen, Dialogen und Dokumentation sollen normale Umlaute und `ß` verwendet werden.
Für technische Bezeichner soll das nicht automatisch gelten, insbesondere bei:
- Dateinamen
- URLs und Pfaden
- Funktionsnamen
- Variablennamen
- Datenbankspalten, Keys und anderen Schnittstellen
## Passende Zusatzdokumente
- [`docs/README_LOCAL_WEBSERVER.md`](README_LOCAL_WEBSERVER.md)
+34 -34
View File
@@ -1,22 +1,22 @@
# Rechtesystem
Diese Anleitung beschreibt das aktuelle Rechtesystem fuer die Seiten unter `public/`.
Diese Anleitung beschreibt das aktuelle Rechtesystem für die Seiten unter `public/`.
## Grundidee
Aktuell gilt:
- `admin` und `master` haben Vollzugriff auf alle Seiten unter `public/`
- normale Benutzer sehen standardmaessig keine geschuetzten Seiten
- einzelne Seiten koennen pro Benutzer durch einen `master` freigegeben werden
- das Header-Menue passt sich an die hinterlegten Seitenrechte an
- normale Benutzer sehen standardmäßig keine geschützten Seiten
- einzelne Seiten können pro Benutzer durch einen `master` freigegeben werden
- das Header-Menü passt sich an die hinterlegten Seitenrechte an
## Rollen
Es gibt zurzeit diese Rollen:
- `user`
Normale Benutzerrolle ohne automatischen Zugriff auf die geschuetzten Seiten
Normale Benutzerrolle ohne automatischen Zugriff auf die geschützten Seiten
- `admin`
Vollzugriff auf alle Seiten unter `public/`
- `master`
@@ -29,15 +29,15 @@ Die Rollen-Helfer liegen in [`public/auth_helpers.php`](../public/auth_helpers.p
Die zentrale Rechtebasis besteht aus drei Bausteinen:
- [`public/auth_helpers.php`](../public/auth_helpers.php)
Enthaelt Rollen-Helfer, Allowlist und die Liste der freigebbaren Seiten
Enthält Rollen-Helfer, Allowlist und die Liste der freigebbaren Seiten
- [`public/header.php`](../public/header.php)
Prueft beim Aufruf einer Seite den Zugriff und baut das Menue passend zu den Rechten
Prüft beim Aufruf einer Seite den Zugriff und baut das Menü passend zu den Rechten
- [`public/admin_users.php`](../public/admin_users.php)
Enthaelt die Benutzerverwaltung und die Seitenmatrix fuer `master`
Enthält die Benutzerverwaltung und die Seitenmatrix für `master`
## Datenbank
Fuer die Seitenfreigaben wird diese Tabelle verwendet:
Für die Seitenfreigaben wird diese Tabelle verwendet:
- `app_user_page_permissions`
@@ -54,10 +54,10 @@ Wichtige Spalten:
Wichtig:
- Nicht nur der Dateiname zaehlt.
- Nicht nur der Dateiname zählt.
- Unterordner-Seiten werden mit vollem relativen Pfad gespeichert.
## Oeffentliche Ausnahmen
## Öffentliche Ausnahmen
Einige Seiten bleiben ohne Seitenfreigabe erreichbar. Diese stehen in der Allowlist in [`public/auth_helpers.php`](../public/auth_helpers.php):
@@ -65,37 +65,37 @@ Einige Seiten bleiben ohne Seitenfreigabe erreichbar. Diese stehen in der Allowl
- `register.php`
- `logout.php`
## Wie der Zugriff geprueft wird
## Wie der Zugriff geprüft wird
Beim Laden einer Seite mit gemeinsamem Header passiert Folgendes:
1. `header.php` ermittelt den aktuellen `page_key`
2. Wenn der Benutzer `admin` oder `master` ist, ist der Zugriff erlaubt
3. Wenn die Seite in der Allowlist steht, ist der Zugriff erlaubt
4. Sonst wird in `app_user_page_permissions` geprueft, ob der Benutzer genau diese Seite sehen darf
4. Sonst wird in `app_user_page_permissions` geprüft, ob der Benutzer genau diese Seite sehen darf
5. Wenn nein, kommt `403 Zugriff verweigert`
Wichtig:
- Eine einzelne Seitenfreigabe macht den Benutzer nicht zu `admin`
- dadurch bleibt das Menue auf seine wirklich erlaubten Seiten beschraenkt
- dadurch bleibt das Menü auf seine wirklich erlaubten Seiten beschränkt
## Wie das Menue funktioniert
## Wie das Menü funktioniert
Das Header-Menue wird ebenfalls in [`public/header.php`](../public/header.php) aufgebaut.
Das Header-Menü wird ebenfalls in [`public/header.php`](../public/header.php) aufgebaut.
Dabei gilt:
- ausgeloggte Besucher sehen nur `Anmelden` und `Registrieren`
- `admin` und `master` sehen das volle Menue
- normale Benutzer sehen nur die Menuepunkte, deren `href` in ihren Seitenfreigaben vorhanden ist
- auch der Kontobereich unten im Menue wird entsprechend gefiltert
- `admin` und `master` sehen das volle Menü
- normale Benutzer sehen nur die Menüpunkte, deren `href` in ihren Seitenfreigaben vorhanden ist
- auch der Kontobereich unten im Menü wird entsprechend gefiltert
Damit das funktioniert, muessen Menuelink und `page_key` exakt zusammenpassen.
Damit das funktioniert, müssen Menülink und `page_key` exakt zusammenpassen.
Beispiel:
- Menuelink: `geocron/index.php`
- Menülink: `geocron/index.php`
- Datenbankeintrag: `geocron/index.php`
## Wie ein Master Seiten freigibt
@@ -105,8 +105,8 @@ Die Freigaben werden in [`public/admin_users.php`](../public/admin_users.php) ve
Ablauf:
1. Als `master` anmelden
2. `Benutzerverwaltung` oeffnen
3. Im Bereich `Seitenfreigaben` den gewuenschten Benutzer waehlen
2. `Benutzerverwaltung` öffnen
3. Im Bereich `Seitenfreigaben` den gewünschten Benutzer wählen
4. Haken bei den erlaubten Seiten setzen
5. Speichern
@@ -121,20 +121,20 @@ Die Liste der freigebaren Seiten steht zentral in [`public/auth_helpers.php`](..
- `manageablePublicPages()`
Nur Seiten, die dort eingetragen sind, koennen:
Nur Seiten, die dort eingetragen sind, können:
- in der Matrix erscheinen
- einzeln fuer Benutzer freigegeben werden
- sauber im Menue gefiltert werden
- einzeln für Benutzer freigegeben werden
- sauber im Menü gefiltert werden
## Neue Seite ins Rechtesystem aufnehmen
Wenn eine neue Seite unter `public/` dazukommt, sind in der Regel diese Schritte noetig:
Wenn eine neue Seite unter `public/` dazukommt, sind in der Regel diese Schritte nötig:
1. Seite anlegen
2. Seite so bauen, dass sie den gemeinsamen Header nutzt
3. In `manageablePublicPages()` eintragen
4. Falls noetig als Menuepunkt in [`public/header.php`](../public/header.php) eintragen
4. Falls nötig als Menüpunkt in [`public/header.php`](../public/header.php) eintragen
5. Darauf achten, dass `href` und `page_key` exakt gleich sind
Beispiel:
@@ -143,13 +143,13 @@ Beispiel:
'beispielseite.php' => 'Beispielseite',
```
Oder fuer Unterordner:
Oder für Unterordner:
```php
'tools/beispiel.php' => 'Beispielseite',
```
## Wichtige Regel fuer Unterordner
## Wichtige Regel für Unterordner
Bei Unterordnern niemals nur `index.php` verwenden.
@@ -161,13 +161,13 @@ Falsch:
- `index.php`
Die Seitenerkennung dafuer macht `currentPublicPageKey()` in [`public/auth_helpers.php`](../public/auth_helpers.php).
Die Seitenerkennung dafür macht `currentPublicPageKey()` in [`public/auth_helpers.php`](../public/auth_helpers.php).
## Aktueller Stand
Der aktuelle Zustand ist bewusst streng:
- standardmaessig nur `admin` oder `master`
- normale Benutzer nur ueber explizite Seitenfreigaben
- standardmäßig nur `admin` oder `master`
- normale Benutzer nur über explizite Seitenfreigaben
Spaeter kann entschieden werden, welche Seiten wieder standardmaessig fuer normale Benutzer sichtbar sein sollen.
Später kann entschieden werden, welche Seiten wieder standardmäßig für normale Benutzer sichtbar sein sollen.
+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>