diff options
30 files changed, 363 insertions, 54 deletions
@@ -1 +1 @@ -2025-05-14 "Librarian" +2025-05-14a "Librarian" diff --git a/composer.lock b/composer.lock index 5b89e0ef6..c320a024a 100644 --- a/composer.lock +++ b/composer.lock @@ -328,12 +328,12 @@ "source": { "type": "git", "url": "https://github.com/alphp/strftime.git", - "reference": "88e98f00b5d9247e8168c1eb528ab138fbf743d2" + "reference": "dcd30543db16c9b4ba095f6bf32ac16f15eb9448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/alphp/strftime/zipball/88e98f00b5d9247e8168c1eb528ab138fbf743d2", - "reference": "88e98f00b5d9247e8168c1eb528ab138fbf743d2", + "url": "https://api.github.com/repos/alphp/strftime/zipball/dcd30543db16c9b4ba095f6bf32ac16f15eb9448", + "reference": "dcd30543db16c9b4ba095f6bf32ac16f15eb9448", "shasum": "" }, "require": { @@ -369,7 +369,7 @@ "issues": "https://github.com/alphp/strftime/issues", "source": "https://github.com/alphp/strftime" }, - "time": "2024-01-26T18:19:38+00:00" + "time": "2025-05-20T20:04:36+00:00" }, { "name": "phpseclib/phpseclib", @@ -13,7 +13,7 @@ use dokuwiki\ChangeLog\PageChangeLog; use dokuwiki\Extension\Event; // update message version - always use a string to avoid localized floats! -$updateVersion = "56"; +$updateVersion = "56.1"; // xdebug_start_profiling(); diff --git a/inc/infoutils.php b/inc/infoutils.php index 6319b94d9..a25839282 100644 --- a/inc/infoutils.php +++ b/inc/infoutils.php @@ -184,7 +184,7 @@ function getRuntimeVersions() if (getenv('KUBERNETES_SERVICE_HOST')) { $data['container'] = 'Kubernetes'; - } elseif (file_exists('/.dockerenv')) { + } elseif (@file_exists('/.dockerenv')) { $data['container'] = 'Docker'; } @@ -199,14 +199,16 @@ function getRuntimeVersions() */ function getOsRelease() { + $reader = fn($file) => @parse_ini_string(preg_replace('/#.*$/m', '', file_get_contents($file))); + $osRelease = []; - if (file_exists('/etc/os-release')) { + if (@file_exists('/etc/os-release')) { // pretty much any common Linux distribution has this - $osRelease = parse_ini_file('/etc/os-release'); - } elseif (file_exists('/etc/synoinfo.conf') && file_exists('/etc/VERSION')) { + $osRelease = $reader('/etc/os-release'); + } elseif (@file_exists('/etc/synoinfo.conf') && @file_exists('/etc/VERSION')) { // Synology DSM has its own way - $synoInfo = parse_ini_file('/usr/lib/synoinfo.conf'); - $synoVersion = parse_ini_file('/etc/VERSION'); + $synoInfo = $reader('/etc/synoinfo.conf'); + $synoVersion = $reader('/etc/VERSION'); $osRelease['NAME'] = 'Synology DSM'; $osRelease['ID'] = 'synology'; $osRelease['ID_LIKE'] = 'linux'; @@ -218,6 +220,7 @@ function getOsRelease() return $osRelease; } + /** * Run a few sanity checks * diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php index 261dc8c8b..05b18086b 100644 --- a/inc/lang/de-informal/lang.php +++ b/inc/lang/de-informal/lang.php @@ -3,6 +3,7 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * + * @author andreash <aeheil@gmail.com> * @author Axel Kirch <axel@globeglotter.com> * @author MaWi <drmaxxis@gmail.com> * @author lp <spam@lukpopp.ch> @@ -234,6 +235,7 @@ $lang['created'] = 'angelegt'; $lang['restored'] = 'alte Version wiederhergestellt (%s)'; $lang['external_edit'] = 'Externe Bearbeitung'; $lang['summary'] = 'Zusammenfassung'; +$lang['unknowndate'] = 'Datum unbekannt'; $lang['noflash'] = 'Das <a href="http://get.adobe.com/flashplayer">Adobe Flash Plugin</a> wird benötigt, um diesen Inhalt anzuzeigen.'; $lang['download'] = 'Schnipsel herunterladen'; $lang['tools'] = 'Werkzeuge'; diff --git a/inc/lang/de/backlinks.txt b/inc/lang/de/backlinks.txt index b510b8aeb..93aed4568 100644 --- a/inc/lang/de/backlinks.txt +++ b/inc/lang/de/backlinks.txt @@ -1,3 +1,3 @@ -====== Links hierher ====== +====== Links, die zurück auf diese Seite führen ====== Dies ist eine Liste der Seiten, welche zurück zur momentanen Seite führen. diff --git a/inc/lang/de/draft.txt b/inc/lang/de/draft.txt index 8cf9eb6e8..b7189031f 100644 --- a/inc/lang/de/draft.txt +++ b/inc/lang/de/draft.txt @@ -2,4 +2,4 @@ Ihre letzte Bearbeitungssitzung wurde nicht ordnungsgemäß abgeschlossen. DokuWiki hat während Ihrer Arbeit automatisch einen Zwischenentwurf gespeichert, den Sie jetzt nutzen können, um Ihre Arbeit fortzusetzen. Unten sehen Sie die Daten, die bei Ihrer letzten Sitzung gespeichert wurden. -Bitte entscheiden Sie, ob Sie den Entwurf //wiederherstellen// oder //löschen// wollen, oder ob Sie die Bearbeitung abbrechen möchten. +Bitte entscheiden Sie, ob Sie den Entwurf //wiederherstellen// oder //löschen// wollen, oder ob Sie die Bearbeitung //abbrechen// möchten. diff --git a/inc/lang/de/edit.txt b/inc/lang/de/edit.txt index df01486da..893ac942b 100644 --- a/inc/lang/de/edit.txt +++ b/inc/lang/de/edit.txt @@ -1 +1 @@ -Seite bearbeiten und **''[Speichern]''** drücken. Siehe [[wiki:syntax]] zur Wiki-Syntax. Bitte nur editieren, falls das Dokument tatsächlich **verbessert** werden kann. Zum Testen bitte erst im [[playground:playground|Spielplatz]] üben. +Seite bearbeiten und **''[Speichern]''** drücken. Siehe [[wiki:syntax]] zur Wiki-Syntax. Bitte nur editieren, falls Sie das Dokument tatsächlich **verbessern** können. Zum Testen bitte erst in der [[Testumgebung:Testumgebung|Testumgebung]] üben. diff --git a/inc/lang/de/index.txt b/inc/lang/de/index.txt index 28718f2a1..c1f17869e 100644 --- a/inc/lang/de/index.txt +++ b/inc/lang/de/index.txt @@ -1,3 +1,3 @@ ====== Übersicht ====== -Dies ist eine Übersicht über alle vorhandenen Seiten und [[doku>de:namespaces|Namensräume]]. +Dies ist eine Übersicht über alle vorhandenen Seiten geordnet nach [[doku>de:namespaces|Namensräume]]. diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php index 3619a03db..60e5d8d43 100644 --- a/inc/lang/de/lang.php +++ b/inc/lang/de/lang.php @@ -3,6 +3,7 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * + * @author Niclas Tittl <niclas.tittl@msn.com> * @author Jürgen Mayer <gro.ikiwukod@x.wellen.org> * @author Xrizzy <xrizzy@web.de> * @author Kurt Singer <webmaster@kurt-singer.com> @@ -57,7 +58,7 @@ $lang['singlequoteopening'] = '‚'; $lang['singlequoteclosing'] = '‘'; $lang['apostrophe'] = '’'; $lang['btn_edit'] = 'Diese Seite bearbeiten'; -$lang['btn_source'] = 'Zeige Quelltext'; +$lang['btn_source'] = 'Quelltext anzeigen'; $lang['btn_show'] = 'Seite anzeigen'; $lang['btn_create'] = 'Seite anlegen'; $lang['btn_search'] = 'Suche'; diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php index 8ed9dd13d..5bd58b32a 100644 --- a/inc/lang/ko/lang.php +++ b/inc/lang/ko/lang.php @@ -3,6 +3,7 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * + * @author SoiBKK <info@soibangkok.online> * @author nakky <nakky@naver.com> * @author merefox retronica <merefox@naver.com> * @author take <take@ruu.kr> @@ -229,6 +230,7 @@ $lang['created'] = '만듦'; $lang['restored'] = '이전 판으로 되돌림 (%s)'; $lang['external_edit'] = '바깥 편집'; $lang['summary'] = '편집 요약'; +$lang['unknowndate'] = '알 수 없는 날짜'; $lang['noflash'] = '이 내용을 표시하기 위해서 <a href="http://get.adobe.com/flashplayer">Adobe Flash 플러그인</a>이 필요합니다.'; $lang['download'] = '조각 다운로드'; $lang['tools'] = '도구'; diff --git a/lib/plugins/config/lang/de-informal/lang.php b/lib/plugins/config/lang/de-informal/lang.php index 0d4e3817d..dc4065930 100644 --- a/lib/plugins/config/lang/de-informal/lang.php +++ b/lib/plugins/config/lang/de-informal/lang.php @@ -159,7 +159,6 @@ $lang['search_fragment_o_exact'] = 'genaue Treffer'; $lang['search_fragment_o_starts_with'] = 'beginnt mit'; $lang['search_fragment_o_ends_with'] = 'endet mit'; $lang['search_fragment_o_contains'] = 'enthält'; -$lang['trustedproxy'] = 'Vertraue Weiterleitungs-Proxys, welche dem regulärem Ausdruck entsprechen, hinsichtlich der angegebenen Client-ID. Der Standardwert entspricht dem lokalem Netzwerk. Leer lassen um jedem Proxy zu vertrauen.'; $lang['_feature_flags'] = 'Feature-Flags'; $lang['defer_js'] = 'JavaScript-Ausführung verzögern bis das HTML der gesamten Seite verarbeitet wurde. Erhöht die gefühlte Geschwindigkeit des Seitenaufbaus, kann aber mit einigen wenigen Plugins inkompatibel sein.'; $lang['dnslookups'] = 'DokuWiki löst die IP-Adressen von Benutzern zu deren Hostnamen auf. Wenn du einen langsamen, unbrauchbaren DNS-Server verwendest oder die Funktion nicht benötigst, dann sollte diese Option deaktivert sein.'; diff --git a/lib/plugins/config/lang/de/lang.php b/lib/plugins/config/lang/de/lang.php index 761ead223..bf5c9b6c1 100644 --- a/lib/plugins/config/lang/de/lang.php +++ b/lib/plugins/config/lang/de/lang.php @@ -3,6 +3,7 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * + * @author Niclas Tittl <niclas.tittl@msn.com> * @author Jürgen Mayer <gro.ikiwukod@x.wellen.org> * @author Andreas Gohr <andi@splitbrain.org> * @author Markus Glaser <glaser@hallowelt.com> @@ -181,6 +182,8 @@ $lang['defer_js'] = 'JavaScript-Ausführung verzögern bis das HTML $lang['hidewarnings'] = 'Keine PHP Warnungen anzeigen. Diese Einstellung kann den Umstieg auf PHP8+ erleichtern. Warnungen werden weiterhin im Fehlerlog gespeichert und sollten gemeldet werden.'; $lang['dnslookups'] = 'DokuWiki löst die IP-Adressen von Benutzern zu deren Hostnamen auf. Wenn Sie einen langsamen oder unzuverlässigen DNS-Server verwenden oder die Funktion nicht benötigen, dann sollte diese Option deaktiviert sein.'; $lang['jquerycdn'] = 'Sollen jQuery und jQuery UI Skriptdateien von einem CDN (Content Delivery Network) geladen werden? Dadurch entstehen zusätzliche HTTP-Anfragen, aber die Daten werden voraussichtlich schneller geladen und eventuell sind sie auch schon beim Benutzer im Cache.'; +$lang['trustedproxies'] = 'Komma-getrennte Liste der Proxy-Server, von denen der X-Forwarded-For Header gelesen wird. Jeder Eintrag in der Liste kann entweder eine IPv4 oder IPv6 Adresse sein, oder ein IPv4 oder IPv6 CIDR Netzwerk (z. B. 10.0.0.0/8). Leer lassen, um keinem Proxy zu vertrauen.'; +$lang['realip'] = 'Vertraue dem X-Real-IP Header. Aktiviere diese Option nur, wenn dein Server diesen Header benutzt, ansonsten könnte er gefälscht werden.'; $lang['jquerycdn_o_0'] = 'Kein CDN, ausschließlich lokale Auslieferung'; $lang['jquerycdn_o_jquery'] = 'CDN von code.jquery.com'; $lang['jquerycdn_o_cdnjs'] = 'CDN von cdnjs.com'; diff --git a/lib/plugins/extension/ExtensionApiResponse.php b/lib/plugins/extension/ExtensionApiResponse.php new file mode 100644 index 000000000..c684e770f --- /dev/null +++ b/lib/plugins/extension/ExtensionApiResponse.php @@ -0,0 +1,96 @@ +<?php + +namespace dokuwiki\plugin\extension; + +use dokuwiki\Remote\Response\ApiResponse; + +class ExtensionApiResponse extends ApiResponse +{ + protected Extension $extension; + + /** @var string The type of this extension ("plugin" or "template") */ + public $type; + + /** @var string The id of this extension (templates are prefixed with "template") */ + public $id; + + /** @var string The base name of this extension */ + public $base; + + /** @var string The display name of this extension */ + public $name; + + /** @var string The installed version/date of this extension */ + public $version; + + /** @var string The author of this extension */ + public $author; + + /** @var string The description of this extension */ + public $description; + + /** @var bool Whether this extension is installed */ + public $isInstalled; + + /** @var bool Whether this extension is enabled */ + public $isEnabled; + + /** @var bool Whether an update is available */ + public $updateAvailable; + + /** @var bool Whether this extension is bundled with DokuWiki */ + public $isBundled; + + /** @var bool Whether this extension is under git control */ + public $isGitControlled; + + /** @var string[] Notices for this extension */ + public $notices; + + /** @var string Documentation URL for this extension */ + public $url; + + /** @var string[] The component types this plugin provides */ + public $componentTypes; + + /** @var string The last available remote update date */ + public $lastUpdate; + + /** @var string The download URL for this extension */ + public string $downloadURL; + + /** + * Constructor + * + * @param Extension $extension The extension to create the response for + */ + public function __construct(Extension $extension) + { + $this->extension = $extension; + $this->type = $extension->getType(); + $this->id = $extension->getId(); + $this->base = $extension->getBase(); + $this->name = $extension->getDisplayName(); + $this->version = $extension->getInstalledVersion(); + $this->author = $extension->getAuthor(); + $this->description = $extension->getDescription(); + $this->isInstalled = $extension->isInstalled(); + $this->isEnabled = $extension->isEnabled(); + $this->updateAvailable = $extension->isUpdateAvailable(); + $this->isBundled = $extension->isBundled(); + $this->isGitControlled = $extension->isGitControlled(); + $this->componentTypes = $extension->getComponentTypes(); + $this->lastUpdate = $extension->getLastUpdate(); + $this->url = $extension->getURL(); + $this->downloadURL = $extension->getDownloadURL(); + + // Add notices + $this->notices = array_merge(...array_values(Notice::list($extension))); + } + + /** @inheritdoc */ + public function __toString() + { + return $this->extension->getId(); + } +} diff --git a/lib/plugins/extension/GuiExtension.php b/lib/plugins/extension/GuiExtension.php index 4b8163c60..666cd37ed 100644 --- a/lib/plugins/extension/GuiExtension.php +++ b/lib/plugins/extension/GuiExtension.php @@ -46,8 +46,8 @@ class GuiExtension extends Gui $html .= '<div class="actions">'; // show the available update if there is one if ($this->extension->isUpdateAvailable()) { - $html .= ' <div class="version">' . $this->getLang('available_version') . ' ' . - hsc($this->extension->getLastUpdate()) . '</div>'; + $html .= ' <div class="available">' . $this->getLang('available_version') . ' ' . + '<span class="version">' . hsc($this->extension->getLastUpdate()) . '</span></div>'; } $html .= $this->actions(); diff --git a/lib/plugins/extension/Installer.php b/lib/plugins/extension/Installer.php index e08f1da52..5bb429b01 100644 --- a/lib/plugins/extension/Installer.php +++ b/lib/plugins/extension/Installer.php @@ -406,6 +406,11 @@ class Installer { $target = $extension->getInstallDir(); + // bundled plugins do not need to be writable + if ($extension->isBundled()) { + return; + } + // updates if (file_exists($target)) { if (!is_writable($target)) throw new Exception('noperms'); diff --git a/lib/plugins/extension/lang/de-informal/lang.php b/lib/plugins/extension/lang/de-informal/lang.php index ebe1a0510..b2a37596c 100644 --- a/lib/plugins/extension/lang/de-informal/lang.php +++ b/lib/plugins/extension/lang/de-informal/lang.php @@ -3,6 +3,7 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * + * @author andreash <aeheil@gmail.com> * @author MaWi <drmaxxis@gmail.com> * @author Felix <j.felix@mueller-donath.de> */ @@ -12,9 +13,6 @@ $lang['tab_templates'] = 'Installierte Templates'; $lang['tab_search'] = 'Suchen und installieren'; $lang['tab_install'] = 'Manuelle Installation'; $lang['notimplemented'] = 'Dieses Feature wurde leider noch nicht eingebaut'; -$lang['notinstalled'] = 'Diese Erweiterung ist nicht installiert'; -$lang['alreadyenabled'] = 'Diese Erweiterung wurde bereits aktiviert'; -$lang['alreadydisabled'] = 'Diese Erweiterung wurde bereits deaktiviert'; $lang['pluginlistsaveerror'] = 'Fehler beim Speichern der Plugin-Liste'; $lang['unknownauthor'] = 'Unbekannter Autor'; $lang['unknownversion'] = 'Unbekannte Version'; @@ -68,23 +66,27 @@ $lang['msg_enabled'] = 'Plugin %s ist aktiviert'; $lang['msg_disabled'] = 'Erweiterung %s ist deaktiviert'; $lang['msg_delete_success'] = 'Erweiterung %s wurde entfernt'; $lang['msg_delete_failed'] = 'Deinstallation der Erweiterung %s fehlgeschlagen'; -$lang['msg_template_install_success'] = 'Das Template %s wurde erfolgreich installiert'; -$lang['msg_template_update_success'] = 'Das Update des Templates %s war erfolgreich '; -$lang['msg_plugin_install_success'] = 'Das Plugin %s wurde erfolgreich installiert'; -$lang['msg_plugin_update_success'] = 'Das Update des Plugins %s war erfolgreich'; $lang['msg_upload_failed'] = 'Fehler beim Hochladen der Datei'; $lang['msg_nooverwrite'] = 'Die Erweiterung %s ist bereits vorhanden, sodass sie nicht überschrieben wird. Zum Überschreiben aktiviere die Option "Überschreiben".'; $lang['missing_dependency'] = 'Fehlende oder deaktivierte Abhängigkeit: %s'; $lang['security_issue'] = 'Sicherheitsproblem: %s'; $lang['security_warning'] = 'Sicherheitswarnung: %s'; $lang['wrong_folder'] = 'Erweiterung wurde nicht korrekt installiert: Benenne das Verzeichnis von "%s" nach "%s" um.'; -$lang['url_change'] = "URL geändert: Die Download-URL wurde seit dem letzten Download geändert. Internetadresse vor Aktualisierung der Erweiterung auf Gültigkeit prüfen.\nNeu: %s\nAlt: %s"; +$lang['url_change'] = 'URL geändert: Die Download-URL wurde seit dem letzten Download geändert. Internetadresse vor Aktualisierung der Erweiterung auf Gültigkeit prüfen. +Neu: %s +Alt: %s'; $lang['error_badurl'] = 'URLs sollten mit http oder https beginnen'; $lang['error_dircreate'] = 'Temporärer Ordner konnte nicht erstellt werden um Download zu abzuspeichern'; $lang['error_download'] = 'Download der Datei: %s nicht möglich.'; $lang['error_decompress'] = 'Die heruntergeladene Datei konnte nicht entpackt werden. Dies kann die Folge eines fehlerhaften Downloads sein. In diesem Fall solltest du versuchen den Vorgang zu wiederholen. Es kann auch die Folge eines unbekannten Kompressionsformates sein, in diesem Fall musst du die Datei selber herunterladen und manuell installieren.'; $lang['error_findfolder'] = 'Das Erweiterungs-Verzeichnis konnte nicht identifiziert werden, lade die Datei herunter und installiere sie manuell.'; $lang['error_copy'] = 'Beim Versuch Dateien in den Ordner <em>%s</em>: zu installieren trat ein Kopierfehler auf. Die Dateizugriffsberechtigungen könnten falsch sein. Dies kann an einem unvollständig installierten Plugin liegen und beeinträchtigt somit die Stabilität deiner Wiki-Installation.'; +$lang['error_nourl'] = 'Es konnte keine Download-URL für die Erweiterung %s gefunden werden.'; +$lang['error_notinstalled'] = 'Die Erweiterung %s ist nicht installiert.'; +$lang['error_alreadyenabled'] = 'Die Erweiterung %s wurde bereits aktiviert.'; +$lang['error_alreadydisabled'] = 'Die Erweiterung %s wurde bereits deaktiviert.'; +$lang['error_minphp'] = 'Die Erweiterung %s benötigt mindestens PHP Verison %s, dieses Wiki verwendet aber PHP %s.'; +$lang['error_maxphp'] = 'Die Erweiterung %s unterstützt PHP nur bis Version %s, dieses Wiki verwendet aber PHP %s.'; $lang['noperms'] = 'Das Erweiterungs-Verzeichnis ist schreibgeschützt'; $lang['notplperms'] = 'Das Template-Verzeichnis ist schreibgeschützt'; $lang['nopluginperms'] = 'Das Plugin-Verzeichnis ist schreibgeschützt'; @@ -92,5 +94,10 @@ $lang['git'] = 'Diese Erweiterung wurde über git installiert $lang['auth'] = 'Dieses Auth-Plugin ist in der Konfiguration nicht aktiviert, Du solltest es deaktivieren.'; $lang['install_url'] = 'Von URL installieren:'; $lang['install_upload'] = 'Erweiterung hochladen:'; +$lang['repo_badresponse'] = 'Das Plugin-Repository liefert eine ungültige Antwort.'; $lang['repo_error'] = 'Es konnte keine Verbindung zum Plugin-Verzeichnis hergestellt werden. Stelle sicher, dass der Server Verbindung mit www.dokuwiki.org aufnehmen darf und überprüfe deine Proxy-Einstellungen.'; $lang['nossl'] = 'Deine PHP-Installation scheint SSL nicht zu unterstützen. Das Herunterladen vieler DokuWiki-Erweiterungen wird scheitern.'; +$lang['popularity_high'] = 'Dies ist die beliebteste Erweiterung'; +$lang['popularity_medium'] = 'Diese Erweiterung ist beliebt'; +$lang['popularity_low'] = 'Diese Erweiterung stößt auf Interesse'; +$lang['details'] = 'Details'; diff --git a/lib/plugins/extension/lang/de/lang.php b/lib/plugins/extension/lang/de/lang.php index 7f33d4da9..4c32a9599 100644 --- a/lib/plugins/extension/lang/de/lang.php +++ b/lib/plugins/extension/lang/de/lang.php @@ -3,6 +3,7 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * + * @author Niclas Tittl <niclas.tittl@msn.com> * @author Anika Rachow <rachowanika@gmail.com> * @author Jürgen Mayer <gro.ikiwukod@x.wellen.org> * @author Axel Schwarzer <SchwarzerA@gmail.com> @@ -99,13 +100,18 @@ $lang['error_copy'] = 'Beim Versuch Dateien in den Ordner <em>%s</em> $lang['error_copy_read'] = 'Verzeichnis konnte nicht gelesen werden: %s'; $lang['error_copy_mkdir'] = 'Verzeichnis konnte nicht erstellt werden: %s'; $lang['error_copy_copy'] = '%s konnte nicht nach %s kopiert werden.'; +$lang['error_archive_read'] = 'Das Archiv %s konnte nicht gelesen werden'; +$lang['error_archive_extract'] = 'Das Archiv %s konnte nicht extrahiert werden: %s'; $lang['error_uninstall_protected'] = 'Erweiterung %s ist geschützt und kann nicht gelöscht werden.'; $lang['error_uninstall_dependants'] = 'Erweiterung %s wird von Erweiterung %s verwendet und kann daher nicht deinstalliert werden.'; $lang['error_disable_protected'] = 'Erweiterung %s ist geschützt und kann nicht deaktiviert werden.'; $lang['error_disable_dependants'] = 'Erweiterung %s wird weiterhin von Erweiterung %s verwendet und kann daher nicht deaktiviert werden.'; +$lang['error_nourl'] = 'Für die Erweiterung %s konnte keine Download-URL gefunden werden'; $lang['error_notinstalled'] = 'Erweiterung %s kann nicht installiert werden.'; $lang['error_alreadyenabled'] = 'Erweiterung %s wurde bereits aktiviert.'; $lang['error_alreadydisabled'] = 'Erweiterung %s wurde bereits deaktiviert.'; +$lang['error_minphp'] = 'Die Erweiterung %s benötigt mindestens die PHP-Version %s, dieses Wiki benutzt allerdings PHP %s'; +$lang['error_maxphp'] = 'Die Erweiterung %s unterstützt maximal die PHP-Version %s, dieses Wiki benutzt allerdings PHP %s'; $lang['noperms'] = 'Das Erweiterungs-Verzeichnis ist schreibgeschützt'; $lang['notplperms'] = 'Das Template-Verzeichnis ist schreibgeschützt'; $lang['nopluginperms'] = 'Das Plugin-Verzeichnis ist schreibgeschützt'; @@ -116,3 +122,7 @@ $lang['install_upload'] = 'Erweiterung hochladen:'; $lang['repo_badresponse'] = 'Das Plugin-Verzeichnis hat eine ungültige Antwort geliefert.'; $lang['repo_error'] = 'Es konnte keine Verbindung zum Plugin-Verzeichnis hergestellt werden. Stellen Sie sicher, dass der Server Verbindung mit www.dokuwiki.org aufnehmen darf und überprüfen Sie ihre Proxy-Einstellungen.'; $lang['nossl'] = 'Ihr PHP scheint SSL nicht zu unterstützen. Das Herunterladen vieler DokuWiki-Erweiterungen wird scheitern.'; +$lang['popularity_high'] = 'Diese Erweiterung ist eine der Beliebtesten'; +$lang['popularity_medium'] = 'Diese Erweiterung ist sehr beliebt'; +$lang['popularity_low'] = 'Diese Erweiterung hat Interesse geweckt'; +$lang['details'] = 'Details'; diff --git a/lib/plugins/extension/lang/ko/lang.php b/lib/plugins/extension/lang/ko/lang.php index 7f45686dc..c40f838d1 100644 --- a/lib/plugins/extension/lang/ko/lang.php +++ b/lib/plugins/extension/lang/ko/lang.php @@ -3,6 +3,7 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * + * @author SoiBKK <info@soibangkok.online> * @author Young gon Cha <garmede@gmail.com> * @author Myeongjin <aranet100@gmail.com> * @author hyeonsoft <hyeonsoft@live.co.kr> @@ -13,9 +14,6 @@ $lang['tab_templates'] = '설치된 템플릿'; $lang['tab_search'] = '검색하고 설치'; $lang['tab_install'] = '수동 설치'; $lang['notimplemented'] = '이 기능은 아직 구현되지 않았습니다'; -$lang['notinstalled'] = '이 확장 기능은 설치되어 있지 않습니다'; -$lang['alreadyenabled'] = '이 확장 기능이 이미 활성화되어 있습니다'; -$lang['alreadydisabled'] = '이 확장 기능이 이미 비활성화되어 있습니다'; $lang['pluginlistsaveerror'] = '플러그인 목록을 저장하는 중 오류가 있었습니다'; $lang['unknownauthor'] = '알 수 없는 저자'; $lang['unknownversion'] = '알 수 없는 버전'; @@ -31,6 +29,8 @@ $lang['js']['display_viewoptions'] = '보기 옵션:'; $lang['js']['display_enabled'] = '활성화됨'; $lang['js']['display_disabled'] = '비활성화됨'; $lang['js']['display_updatable'] = '업데이트할 수 있음'; +$lang['js']['close'] = '클릭하여 닫기'; +$lang['js']['filter'] = '업데이트가 가능한 확장 기능만 보여주기'; $lang['search_for'] = '확장 기능 검색:'; $lang['search'] = '검색'; $lang['extensionby'] = '<strong>%s</strong> (저자 %s)'; @@ -69,16 +69,14 @@ $lang['msg_enabled'] = '%s 플러그인이 활성화되었습니다'; $lang['msg_disabled'] = '%s 플러그인이 비활성화되었습니다'; $lang['msg_delete_success'] = '%s 확장 기능이 제거되었습니다'; $lang['msg_delete_failed'] = '%s 확장 기능 제거에 실패했습니다'; -$lang['msg_template_install_success'] = '%s 템플릿을 성공적으로 설치했습니다'; -$lang['msg_template_update_success'] = '%s 템플릿을 성공적으로 업데이트했습니다'; -$lang['msg_plugin_install_success'] = '%s 플러그인을 성공적으로 설치했습니다'; -$lang['msg_plugin_update_success'] = '%s 플러그인을 성공적으로 업데이트했습니다'; $lang['msg_upload_failed'] = '파일 올리기에 실패했습니다'; $lang['missing_dependency'] = '의존성을 잃었거나 비활성화되어 있습니다: %s'; $lang['security_issue'] = '보안 문제: %s'; $lang['security_warning'] = '보안 경고: %s'; $lang['wrong_folder'] = '플러그인이 올바르지 않게 설치됨: 플러그인 디렉터리를 "%s"에서 "%s"로 이름을 바꾸세요.'; -$lang['url_change'] = "URL이 바뀜: 다운로드 URL이 최신 다운로드 이래로 바뀌었습니다. 확장 기능을 업데이트하기 전에 새 URL이 올바른지 확인하세요.\n새 URL: %s\n오래된 URL: %s"; +$lang['url_change'] = 'URL이 바뀜: 다운로드 URL이 최신 다운로드 이래로 바뀌었습니다. 확장 기능을 업데이트하기 전에 새 URL이 올바른지 확인하세요. +새 URL: %s +오래된 URL: %s'; $lang['error_badurl'] = 'URL은 http나 https로 시작해야 합니다'; $lang['error_dircreate'] = '다운로드를 받을 임시 폴더를 만들 수 없습니다'; $lang['error_download'] = '파일을 다운로드할 수 없습니다: %s'; @@ -94,3 +92,6 @@ $lang['install_url'] = 'URL에서 설치:'; $lang['install_upload'] = '확장 기능 올리기:'; $lang['repo_error'] = '플러그인 저장소에 연결할 수 없습니다. 서버가 www.dokuwiki.org에 연결할 수 있는지 확인하고 프록시 설정을 확인하세요.'; $lang['nossl'] = 'PHP가 SSL 지원을 하지 않는 것으로 보입니다. 많은 도쿠위키 확장 기능의 다운로드가 작동하지 않을 것입니다.'; +$lang['popularity_high'] = '가장 유명한 확장 기능 중 하나'; +$lang['popularity_medium'] = '꽤 유명한 확장 기능'; +$lang['details'] = '세부 정보'; diff --git a/lib/plugins/extension/remote.php b/lib/plugins/extension/remote.php new file mode 100644 index 000000000..4eb84a829 --- /dev/null +++ b/lib/plugins/extension/remote.php @@ -0,0 +1,149 @@ +<?php + +use dokuwiki\Extension\RemotePlugin; +use dokuwiki\plugin\extension\Extension; +use dokuwiki\plugin\extension\ExtensionApiResponse; +use dokuwiki\plugin\extension\Installer; +use dokuwiki\plugin\extension\Local; +use dokuwiki\plugin\extension\Repository; +use dokuwiki\Remote\AccessDeniedException; + +/** + * DokuWiki Plugin extension (Remote Component) + * + * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html + * @author Andreas Gohr <andi@splitbrain.org> + */ +class remote_plugin_extension extends RemotePlugin +{ + /** + * List installed extensions + * + * This lists all installed extensions. The list is not sorted in any way. + * + * @return ExtensionApiResponse[] The list of installed extensions and their details + */ + public function list() + { + if (!auth_isadmin()) { + throw new AccessDeniedException('Only admins are allowed to access extensions', 114); + } + + $extensions = (new Local())->getExtensions(); + Repository::getInstance()->initExtensions(array_keys($extensions)); + + return array_values( + array_map( + static fn($extension) => new ExtensionApiResponse($extension), + $extensions + ) + ); + } + + /** + * Search for extensions in the repository + * + * @param string $query The keyword(s) to search for + * @param int $max Maximum number of results (default 10) + * @return ExtensionApiResponse[] List of matching extensions + */ + public function search($query, $max = 10) + { + if (!auth_isadmin()) { + throw new AccessDeniedException('Only admins are allowed to access extensions', 114); + } + + $repo = Repository::getInstance(); + $result = $repo->searchExtensions($query); + + if ($max > 0) { + $result = array_slice($result, 0, $max); + } + + return array_values( + array_map( + static fn($extension) => new ExtensionApiResponse($extension), + $result + ) + ); + } + + /** + * Enable a specific extension + * + * @param string $extension Extension ID to enable + * @return bool Success status + */ + public function enable($extension) + { + if (!auth_isadmin()) { + throw new AccessDeniedException('Only admins are allowed to manage extensions', 114); + } + + $ext = Extension::createFromId($extension); + $ext->enable(); + return true; + } + + /** + * Disable a specific extension + * + * @param string $extension Extension ID to disable + * @return bool Success status + */ + public function disable($extension) + { + if (!auth_isadmin()) { + throw new AccessDeniedException('Only admins are allowed to manage extensions', 114); + } + + $ext = Extension::createFromId($extension); + $ext->disable(); + return true; + } + + /** + * Install a specific extension + * + * This will also install dependencies, so more than the given extension may be installed. + * + * @param string $extension Extension ID or download URL + * @return string[] List of installed extensions + */ + public function install($extension) + { + if (!auth_isadmin()) { + throw new AccessDeniedException('Only admins are allowed to manage extensions', 114); + } + + $installer = new Installer(true); + $installer->installFromId($extension); + + return array_keys( + array_filter( + $installer->getProcessed(), + static fn($status) => ( + $status == Installer::STATUS_INSTALLED || $status == Installer::STATUS_UPDATED + ) + ) + ); + } + + /** + * Uninstall a specific extension + * + * @param string $extension Extension ID to uninstall + * @return bool Success status + */ + public function uninstall($extension) + { + if (!auth_isadmin()) { + throw new AccessDeniedException('Only admins are allowed to manage extensions', 114); + } + + $ext = Extension::createFromId($extension); + $installer = new Installer(); + $installer->uninstall($ext); + return true; + } +} diff --git a/lib/plugins/extension/style.less b/lib/plugins/extension/style.less index 5337aea30..3993c656a 100644 --- a/lib/plugins/extension/style.less +++ b/lib/plugins/extension/style.less @@ -66,10 +66,11 @@ section.extension { display: grid; - grid-template-columns: @thumbwidth auto 15em; + grid-template-columns: @thumbwidth auto 22%; grid-template-rows: repeat(4, auto); margin-bottom: 1em; border-bottom: 1px solid @ini_border; + word-break: break-word; > .screenshot { grid-column: 1; @@ -132,6 +133,7 @@ } .version { + white-space: nowrap; } } @@ -154,9 +156,14 @@ align-items: end; gap: 0.5em; - .version { + .available { line-height: 1.2; margin-bottom: 1em; + text-align: right; + + .version { + white-space: nowrap; + } } } diff --git a/lib/plugins/logviewer/lang/de-informal/intro.txt b/lib/plugins/logviewer/lang/de-informal/intro.txt new file mode 100644 index 000000000..147b84731 --- /dev/null +++ b/lib/plugins/logviewer/lang/de-informal/intro.txt @@ -0,0 +1,5 @@ +====== Protokolle anzeigen ====== + +Diese Oberfläche ermöglicht es dir, die verschiedenen Protokolle einzusehen, die von DokuWiki erstellt werden. Normalerweise sollte hier nicht viel zu sehen sein (das hängt von deinen [[doku>config:dontlog|Protokoll-Einstellungen]] ab). Wenn jedoch etwas schiefläuft, stehen die Chancen gut, dass du hier nützliche Informationen zum Problem findest. + +Bitte beachte, dass **Protokolldateien sensible Informationen** wie Passwörter, Pfade oder andere vertrauliche Daten enthalten können. Achte darauf, die Protokolle entsprechend zu schwärzen, bevor du sie im Forum oder in Fehlerberichten veröffentlichst!
\ No newline at end of file diff --git a/lib/plugins/logviewer/lang/de-informal/lang.php b/lib/plugins/logviewer/lang/de-informal/lang.php new file mode 100644 index 000000000..2bf0774b5 --- /dev/null +++ b/lib/plugins/logviewer/lang/de-informal/lang.php @@ -0,0 +1,10 @@ +<?php + +/** + * @license GPL 2 (https://www.gnu.org/licenses/gpl.html) + * + * @author andreash <aeheil@gmail.com> + */ +$lang['menu'] = 'Protokolleinträge anzeigen'; +$lang['date'] = 'Datum'; +$lang['js']['filter'] = 'Protokolleinträge filtern'; diff --git a/lib/plugins/logviewer/lang/de-informal/nolog.txt b/lib/plugins/logviewer/lang/de-informal/nolog.txt new file mode 100644 index 000000000..8692823bd --- /dev/null +++ b/lib/plugins/logviewer/lang/de-informal/nolog.txt @@ -0,0 +1 @@ +Es liegen keine Protokolleinträge für den ausgewählten Tag und das ausgewählte Modul vor.
\ No newline at end of file diff --git a/lib/tpl/dokuwiki/lang/de-informal/lang.php b/lib/tpl/dokuwiki/lang/de-informal/lang.php index 7ac48b2f0..a43fdd65e 100644 --- a/lib/tpl/dokuwiki/lang/de-informal/lang.php +++ b/lib/tpl/dokuwiki/lang/de-informal/lang.php @@ -3,9 +3,11 @@ /** * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * + * @author andreash <aeheil@gmail.com> * @author MaWi <drmaxxis@gmail.com> * @author F. Mueller-Donath <j.felix@mueller-donath.de> */ +$lang['home'] = 'Startseite'; $lang['__background_site__'] = 'Farbe für den Seitenhintergrund (hinter dem Inhaltsbereich)'; $lang['__link__'] = 'Allgemeine Linkfarbe'; $lang['__existing__'] = 'Farbe für Links zu existierenden Seiten'; diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 18e58e0f3..cd40aede8 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -337,12 +337,12 @@ "source": { "type": "git", "url": "https://github.com/alphp/strftime.git", - "reference": "88e98f00b5d9247e8168c1eb528ab138fbf743d2" + "reference": "dcd30543db16c9b4ba095f6bf32ac16f15eb9448" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/alphp/strftime/zipball/88e98f00b5d9247e8168c1eb528ab138fbf743d2", - "reference": "88e98f00b5d9247e8168c1eb528ab138fbf743d2", + "url": "https://api.github.com/repos/alphp/strftime/zipball/dcd30543db16c9b4ba095f6bf32ac16f15eb9448", + "reference": "dcd30543db16c9b4ba095f6bf32ac16f15eb9448", "shasum": "" }, "require": { @@ -354,7 +354,7 @@ "suggest": { "ext-intl": "For proper locale aware output" }, - "time": "2024-01-26T18:19:38+00:00", + "time": "2025-05-20T20:04:36+00:00", "type": "library", "installation-source": "dist", "autoload": { diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index cd710941f..7a6b0599c 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'dokuwiki/dokuwiki', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '59a6ba95c8c7b11b3a1e341c41942ec083784be0', + 'reference' => '396ae2b1e4ac18cd8a3de8ba055f983a807687dc', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -22,7 +22,7 @@ 'dokuwiki/dokuwiki' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '59a6ba95c8c7b11b3a1e341c41942ec083784be0', + 'reference' => '396ae2b1e4ac18cd8a3de8ba055f983a807687dc', 'type' => 'project', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -79,7 +79,7 @@ 'php81_bc/strftime' => array( 'pretty_version' => 'dev-fallback-intl', 'version' => 'dev-fallback-intl', - 'reference' => '88e98f00b5d9247e8168c1eb528ab138fbf743d2', + 'reference' => 'dcd30543db16c9b4ba095f6bf32ac16f15eb9448', 'type' => 'library', 'install_path' => __DIR__ . '/../php81_bc/strftime', 'aliases' => array(), diff --git a/vendor/php81_bc/strftime/.gitignore b/vendor/php81_bc/strftime/.gitignore index a5b812048..659557e1b 100644 --- a/vendor/php81_bc/strftime/.gitignore +++ b/vendor/php81_bc/strftime/.gitignore @@ -23,6 +23,7 @@ Thumbs.db ####################### /.vscode /composer.lock +.phpunit.result.cache # vim *~ *.swp diff --git a/vendor/php81_bc/strftime/src/IntlLocaleFormatter.php b/vendor/php81_bc/strftime/src/IntlLocaleFormatter.php index 5bb62e425..783a0c103 100644 --- a/vendor/php81_bc/strftime/src/IntlLocaleFormatter.php +++ b/vendor/php81_bc/strftime/src/IntlLocaleFormatter.php @@ -14,9 +14,9 @@ class IntlLocaleFormatter extends AbstractLocaleFormatter /** @var string[] strftime to ICU placeholders */ protected $formats = [ - '%a' => 'EEE', // An abbreviated textual representation of the day Sun through Sat + '%a' => 'ccc', // An abbreviated textual representation of the day Sun through Sat '%A' => 'EEEE', // A full textual representation of the day Sunday through Saturday - '%b' => 'MMM', // Abbreviated month name, based on the locale Jan through Dec + '%b' => 'LLL', // Abbreviated month name, based on the locale Jan through Dec '%B' => 'MMMM', // Full month name, based on the locale January through December '%h' => 'MMM', // Abbreviated month name, based on the locale (an alias of %b) Jan through Dec ]; diff --git a/vendor/php81_bc/strftime/src/php-8.1-strftime.php b/vendor/php81_bc/strftime/src/php-8.1-strftime.php index f8a8c79cd..75a6bb351 100644 --- a/vendor/php81_bc/strftime/src/php-8.1-strftime.php +++ b/vendor/php81_bc/strftime/src/php-8.1-strftime.php @@ -2,10 +2,13 @@ namespace PHP81_BC; use DateTime; - use DateTimeInterface; use DateTimeZone; + use DateTimeInterface; use Exception; use InvalidArgumentException; + use Locale; + use PHP81_BC\strftime\DateLocaleFormatter; + use PHP81_BC\strftime\IntlLocaleFormatter; /** * Locale-formatted strftime using IntlDateFormatter (PHP 8.1 compatible) @@ -22,7 +25,9 @@ * * @param string $format Date format * @param integer|string|DateTime $timestamp Timestamp + * @param string|null $locale locale * @return string + * @throws InvalidArgumentException * @author BohwaZ <https://bohwaz.net/> */ function strftime (string $format, $timestamp = null, ?string $locale = null) : string { @@ -34,15 +39,15 @@ } catch (Exception $e) { throw new InvalidArgumentException('$timestamp argument is neither a valid UNIX timestamp, a valid date-time string or a DateTime object.', 0, $e); } - } - $timestamp->setTimezone(new DateTimeZone(date_default_timezone_get())); + $timestamp->setTimezone(new DateTimeZone(date_default_timezone_get())); + } if (class_exists('\\IntlDateFormatter') && !isset($_SERVER['STRFTIME_NO_INTL'])) { - $locale = \Locale::canonicalize($locale ?? setlocale(LC_TIME, '0')); - $locale_formatter = new \PHP81_BC\strftime\IntlLocaleFormatter($locale); + $locale = Locale::canonicalize($locale ?? (Locale::getDefault() ?? setlocale(LC_TIME, '0'))); + $locale_formatter = new IntlLocaleFormatter($locale); } else { - $locale_formatter = new \PHP81_BC\strftime\DateLocaleFormatter($locale); + $locale_formatter = new DateLocaleFormatter($locale); } // Same order as https://www.php.net/manual/en/function.strftime.php @@ -151,7 +156,7 @@ case '#': case '-': // remove leading zeros but keep last char if also zero - return preg_replace('/^0+(?=.)/', '', $result); + return preg_replace('/^[0\s]+(?=.)/', '', $result); } return $result; |