From 5f34357c53371192934065f690889d53c5d55158 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 5 Jun 2025 19:10:28 +0200 Subject: [PATCH 001/113] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5c47a2b03..441d9f30b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # PHP: The Right Way -## Overview +## Überblick This is the GitHub Pages repository for the _PHP: The Right Way_ project. From 8cb8833db09898e721db5377b86ada2ff009ea14 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 5 Jun 2025 19:12:32 +0200 Subject: [PATCH 002/113] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 441d9f30b..b6aba3111 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# PHP: The Right Way +# PHP, aber richtig. ## Überblick From 6318bbfffbd179eebe4add71b19a72ad0c8fad7b Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 5 Jun 2025 20:19:25 +0200 Subject: [PATCH 003/113] Update README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Übersetzung --- README.md | 62 +++++++++++++++++++++++++++---------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index b6aba3111..49d207afc 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,36 @@ -# PHP, aber richtig. +# PHP - aber richtig. ## Überblick -This is the GitHub Pages repository for the _PHP: The Right Way_ project. +Dies ist das GitHub Repository für das Projekt „PHP - aber richtig“. -* This website is a Jekyll project. -* Each section and sub-section are a Markdown file in `_posts/`. -* Sub-sections have `isChild: true` in their front matter. -* The navigation and page structure are automatically generated. +* Diese Website ist ein Jekyll-Projekt. +* Jeder Abschnitt und Unterabschnitt ist eine Markdown-Datei in `_posts/`. +* Unterabschnitte haben im Front Matter den Wert `isChild: true`. +* Die Navigation und die Seitenstruktur werden automatisch generiert. ## Spread the Word! -_PHP: The Right Way_ has web banner images you can use on your website. Show your support, and let new PHP -developers know where to find good information! +_PHP - aber richtig_ bietet Web-Banner, die Sie auf Ihrer Website verwenden können. Zeigen Sie Ihre Unterstützung und zeigen Sie neuen PHP-Entwicklern, wo sie wertvolle Informationen finden können! -[See Banner Images](https://www.phptherightway.com/banners.html) +[hier die Banner Images](https://www.phptherightway.com/banners.html) ## How to Contribute -You should read the `CONTRIBUTING.md` file for precise instructions and tips. But, if you prefer a TL;DR: +Sie sollten für genaue Anweisungen und Tipps die Datei `CONTRIBUTING.md` lesen. Falls Sie eine kurze Zusammenfassung bevorzugen: -1. Fork and edit -2. Optionally install [Ruby](https://rvm.io/rvm/install/) with [Jekyll](https://github.com/mojombo/jekyll/) gem to preview locally -3. Submit pull request for consideration +1. Forken und bearbeiten +2. Optional [Ruby](https://rvm.io/rvm/install/) mit [Jekyll](https://github.com/mojombo/jekyll/) Gem installieren, um eine lokale Vorschau zu erhalten +3. Pull Request zur Prüfung einreichen ### Contributor Style Guide -1. Use American English spelling (*primary English repo only*). -2. Use four (4) spaces to indent text; do not use tabs. -3. Wrap all text to 120 characters. -4. Code samples should adhere to PSR-1 or higher. +1. Verwenden Sie amerikanisches Englisch (*nur primäres englisches Repository*). +2. Verwenden Sie vier (4) Leerzeichen zum Einrücken von Text; verwenden Sie keine Tabulatoren. +3. Brechen Sie den gesamten Text auf 120 Zeichen um. +4. Codebeispiele sollten PSR-1 oder höher entsprechen. -## Where +## Wo @@ -57,34 +56,35 @@ You should read the `CONTRIBUTING.md` file for precise instructions and tips. Bu * [简体中文](https://laravel-china.github.io/php-the-right-way/) * [繁體中文](https://laravel-taiwan.github.io/php-the-right-way) -### Translations +### Übersetzungen -If you are interested in translating _PHP: The Right Way_, fork this repo on GitHub and publish your localized fork to your own GitHub Pages account. We'll link to your translation from the primary document. +Wenn Sie _PHP - aber richtig_ übersetzen möchten, forken Sie das original-Repository auf GitHub und veröffentlichen Sie Ihren lokalisierten Fork in Ihrem eigenen GitHub-Konto. Wir verlinken Ihre Übersetzung vom Originaldokument aus. -To avoid fragmentation and reader confusion, please choose one of these options: +Um Fragmentierung und Leserverwirrung zu vermeiden, wählen Sie bitte eine dieser Optionen: -1. We link to your GitHub Pages fork with `[username].github.io/php-the-right-way` -2. We link to your GitHub Pages fork with a subdomain (e.g. "ru.phptherightway.com") +1. Wir verlinken Ihren GitHub Pages-Fork mit `[username].github.io/php-the-right-way`. +2. Wir verlinken Ihren GitHub Pages-Fork mit einer Subdomain (z. B. „de.phptherightway.com“). -If you use a subdomain, enter the subdomain into the `CNAME` file, and ask us to setup DNS for you. If you do not use a subdomain, remove the `CNAME` file entirely else your fork will not build when pushed. +Wenn Sie eine Subdomain verwenden, tragen Sie diese in die CNAME-Datei ein und bitten Sie uns, einen DNS für Sie einzurichten. Wenn Sie keine Subdomain verwenden, entfernen Sie die CNAME-Datei vollständig, da Ihr Fork sonst beim Pushen nicht erstellt wird. -Add information about your translation in the [wiki page](https://github.com/codeguy/php-the-right-way/wiki/Translations). +Fügen Sie Informationen zu Ihrer Übersetzung auf der [Wiki-Seite](https://github.com/codeguy/php-the-right-way/wiki/Translations) hinzu. -When your translation is ready, open an issue on the Issue Tracker to let us know. +Wenn Ihre Übersetzung fertig ist, öffnen Sie ein Thema im Issue Tracker, um uns dies mitzuteilen. -## Why -There's been a lot of discussion lately about how the PHP community lacks sufficient, credible information for programmers new to PHP. This repository aims to solve this problem. +## Warum -## Who +In letzter Zeit wurde viel darüber diskutiert, dass es der PHP-Community an ausreichenden und zuverlässigen Informationen für PHP-Einsteiger mangelt. Dieses Repository soll dieses Problem lösen. -My name is [Josh Lockhart](https://x.com/codeguy). I'm the author of the [Slim Framework](https://www.slimframework.com/), and I work for [New Media Campaigns](https://www.newmediacampaigns.com/). +## Wer + +Mein Name ist [Josh Lockhart](https://x.com/codeguy). Ich bin der Autor vom [Slim Framework](https://www.slimframework.com/), und arbeite für [New Media Campaigns](https://www.newmediacampaigns.com/). ### Collaborators * [Kris Jordan](https://krisjordan.com/) * [Phil Sturgeon](https://phil.tech/) -## License +## Lizens [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-nc-sa/3.0/) From 0e488cc04f142ebcd159cdec6f8e4560e98342d8 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 5 Jun 2025 20:21:33 +0200 Subject: [PATCH 004/113] Update README.md typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49d207afc..a5ff60ec4 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,6 @@ Mein Name ist [Josh Lockhart](https://x.com/codeguy). Ich bin der Autor vom [Sli * [Kris Jordan](https://krisjordan.com/) * [Phil Sturgeon](https://phil.tech/) -## Lizens +## Lizenz [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-nc-sa/3.0/) From 51040e2d30c212b09f09aefa3cb5c3f52a004655 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 5 Jun 2025 20:39:40 +0200 Subject: [PATCH 005/113] Update welcome.md hp --- _includes/welcome.md | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/_includes/welcome.md b/_includes/welcome.md index 412989ad3..cf1264ce2 100644 --- a/_includes/welcome.md +++ b/_includes/welcome.md @@ -1,23 +1,21 @@ -# Welcome +# Willkommen -There's a lot of outdated information on the Web that leads new PHP users astray, -propagating bad practices and insecure code. _PHP: The Right Way_ is an easy-to-read, -quick reference for PHP popular coding standards, links to authoritative tutorials -around the Web, and what the contributors consider to be best practices at present. +Im Internet kursieren viele veraltete Informationen, die PHP-Anfänger verwirren +und so zu schlechten Praktiken und unsicherem Code führen. _PHP - aber richtig_ ist ein leicht +verständliches Nachschlagewerk zu gängigen PHP-Programmierstandards, Links zu maßgeblichen +Tutorials im Internet und Informationen zu den aktuellen Best-Practices der Autoren. -_There is no canonical way to use PHP_. This website aims to introduce new PHP -developers to some topics which they may not discover until it is too late, and aims -to give seasoned pros some fresh ideas on those topics they've been doing for years -without ever reconsidering. This website will also not tell you which tools to use, but -instead offer suggestions for multiple options, when possible explaining the differences -in approach and use-case. +Es gibt keine allgemeingültige Herangehensweise PHP zu verwenden. Diese Website möchte PHP-Anfängern +Themen näherbringen, die sie möglicherweise erst entdecken, wenn es zu spät ist, und erfahrenen +Profis neue Ideen zu Themen vermitteln, die sie seit Jahren unreflektiert bearbeiten. Diese +Website gibt Dir keine Anweisungen zu den zu verwendenden Tools, sondern bietet Vorschläge +für verschiedene Optionen und erläutert nach Möglichkeit die Unterschiede in Ansatz und Anwendungsfall. -This is a living document and will continue to be updated with more helpful information -and examples as they become available. +Dieses Dokument wird fortlaufend aktualisiert und mit hilfreichen Informationen und Beispielen ergänzt, sobald diese verfügbar sind. -## Translations +## Übersetzungen -_PHP: The Right Way_ is translated into many different languages: +_PHP - aber richtig_ wurde in viele Sprachen übersetzt: * [English](https://www.phptherightway.com) * [Español](https://phpdevenezuela.github.io/php-the-right-way) @@ -41,13 +39,13 @@ _PHP: The Right Way_ is translated into many different languages: * [简体中文](https://laravel-china.github.io/php-the-right-way/) * [繁體中文](https://laravel-taiwan.github.io/php-the-right-way) -## Book +## Buch -The most recent version of _PHP: The Right Way_ is also available in PDF, EPUB and MOBI formats. [Go to Leanpub][1] +Die neueste Version von _PHP - aber richtig_ ist auch in den Formaten PDF, EPUB und MOBI verfügbar. [Zu Leanpub][1] -## How to Contribute +## Wie beitragen? -Help make this website the best resource for new PHP programmers! [Contribute on GitHub][2] +Hilf mit, diese Website zur besten Ressource für neue PHP-Programmierer zu machen! [Contribute on GitHub][2] [1]: https://leanpub.com/phptherightway [2]: https://github.com/codeguy/php-the-right-way/tree/gh-pages From f99926f9fbf142d5b70acda9a4710543b2ef6779 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 5 Jun 2025 20:56:24 +0200 Subject: [PATCH 006/113] Update 01-02-01-Use-the-Current-Stable-Version.md hp --- _posts/01-02-01-Use-the-Current-Stable-Version.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_posts/01-02-01-Use-the-Current-Stable-Version.md b/_posts/01-02-01-Use-the-Current-Stable-Version.md index 90475742c..b3c3c7c96 100644 --- a/_posts/01-02-01-Use-the-Current-Stable-Version.md +++ b/_posts/01-02-01-Use-the-Current-Stable-Version.md @@ -1,14 +1,14 @@ --- -title: Use the Current Stable Version (8.4) +title: Verwende die aktuelle stabile Version (8.4) isChild: true anchor: use_the_current_stable_version --- -## Use the Current Stable Version (8.4) {#use_the_current_stable_version_title} +## Verwende die aktuelle stabile Version (8.4) {#use_the_current_stable_version_title} -If you are getting started with PHP, start with the current stable release of [PHP 8.4][php-release]. PHP 8.x adds many [new features](#language_highlights) over the older 7.x and 5.x versions. The engine has been largely re-written, and PHP is now even quicker than older versions. PHP 8 is a major update of the language and contains many new features and optimizations. +Wenn Du PHP neu ausprobieren möchtest, starte mit der aktuellen stabilen Version [PHP 8.4][php-release]. PHP 8.x bietet gegenüber den älteren Versionen 7.x und 5.x viele [neue Funktionen](#language_highlights). Die Engine wurde weitgehend neu entwickelt, und PHP ist jetzt noch schneller als ältere Versionen. PHP 8 ist ein umfassendes Update der Sprache und enthält viele neue Funktionen und Optimierungen. -You should try to upgrade to the latest stable version quickly - PHP 7.4 [is already End of Life][php-supported]. Upgrading is easy, as there are not many backwards compatibility breaks [PHP 8.0][php-bc-80], [PHP 8.1][php-bc-81], [PHP 8.2][php-bc-82], [PHP 8.3][php-bc-83], [PHP 8.4][php-bc-84]. If you are not sure which version a function or feature is in, you can check the PHP documentation on the [php.net][php-docs] website. +Du solltest versuchen, schnellstmöglich auf die neueste stabile Version zu aktualisieren – PHP 7.4 [ist bereits veraltet][php-supported]. Das Upgrade ist einfach, da es kaum Probleme mit der Abwärtskompatibilität gibt [PHP 8.0][php-bc-80], [PHP 8.1][php-bc-81], [PHP 8.2][php-bc-82], [PHP 8.3][php-bc-83], [PHP 8.4][php-bc-84]. Wenn Du nicht sicher bist, in welcher Version eine Funktion oder ein Feature enthalten ist, kannst Du die PHP-Dokumentation auf der Website [php.net][php-docs] einsehen. [php-release]: https://www.php.net/downloads.php [php-supported]: https://www.php.net/supported-versions.php From f5e3cb814345e96bb3ad19af6ba404e7e2d669c9 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 5 Jun 2025 23:09:40 +0200 Subject: [PATCH 007/113] Update 01-03-01-Built-in-Web-Server.md hp --- _posts/01-03-01-Built-in-Web-Server.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_posts/01-03-01-Built-in-Web-Server.md b/_posts/01-03-01-Built-in-Web-Server.md index 5aae2f5f4..20d03de45 100644 --- a/_posts/01-03-01-Built-in-Web-Server.md +++ b/_posts/01-03-01-Built-in-Web-Server.md @@ -1,19 +1,19 @@ --- -title: Built-in Web Server +title: Der mitgelieferte Web-Server isChild: true anchor: builtin_web_server --- -## Built-in web server {#builtin_web_server_title} +## Der mitgelieferte Web-Server {#builtin_web_server_title} -With PHP 5.4 or newer, you can start learning PHP without installing and configuring a full-fledged web server. -To start the server, run the following command from your terminal in your project's web root: +Mit PHP 5.4 oder neuer kannst Du PHP lernen, ohne einen kompletten, vollwertigen Webserver installieren und konfigurieren zu müssen. +Um den Server zu starten, führe den folgenden Befehl im Terminal aus dem Root-Verzeichnis Deines Projekts aus: {% highlight console %} > php -S localhost:8000 {% endhighlight %} -* [Learn about the built-in, command line web server][cli-server] +* [Erfahre mehr über den eingebauten Webserver von PHP][cli-server] [cli-server]: https://www.php.net/features.commandline.webserver From 8d6ec5ad41a10085c0e70bca03f48e5aee28a462 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 5 Jun 2025 23:42:03 +0200 Subject: [PATCH 008/113] Update 01-07-01-Common-Directory-Structure.md hp --- _posts/01-07-01-Common-Directory-Structure.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/_posts/01-07-01-Common-Directory-Structure.md b/_posts/01-07-01-Common-Directory-Structure.md index 2777ff631..ed6522b00 100644 --- a/_posts/01-07-01-Common-Directory-Structure.md +++ b/_posts/01-07-01-Common-Directory-Structure.md @@ -1,18 +1,19 @@ --- -title: Common Directory Structure +title: übliche Datei- und Verzeichnisstruktur isChild: true anchor: common_directory_structure --- -## Common Directory structure {#common_directory_structure_title} +## übliche Datei- und Verzeichnisstruktur {#common_directory_structure_title} -A common question among those starting out with writing programs for the web is, "where do I put my stuff?" Over the years, this answer has consistently been "where the `DocumentRoot` is." Although this answer is not complete, it's a great place to start. +Eine häufige Frage von Webentwicklern lautet: “Wo speichere ich meine Zeug?“ Über die Jahre lautete die Antwort immer wieder: „Dort wo das `DocumentRoot` ist.“ Obwohl diese Antwort nicht vollständig ist, bietet sie einen guten Ausgangspunkt. -For security reasons, configuration files should not be accessible by a site's visitors; therefore, public scripts are kept in a public directory and private configurations and data are kept outside of that directory. +Aus Sicherheitsgründen sollten Konfigurationsdateien für Besucher einer Website unzugänglich sein. Daher werden öffentliche Skripte in einem öffentlichen Verzeichnis und private Konfigurationen und Daten außerhalb dieses Verzeichnisses gespeichert. -For each team, CMS, or framework one works in, a standard directory structure is used by each of those entities. However, if one is starting a project alone, knowing which filesystem structure to use can be daunting. +Jedes Team, jedes CMS oder jedes Framework verwendet eine Standardverzeichnisstruktur. Wenn man jedoch ein Projekt alleine startet, kann die Wahl der richtigen Dateistruktur ganz schön herausfordernd sein. + +[Paul M. Jones] hat die gängigen Vorgehensweisen von Zehntausenden von GitHub-Projekten im PHP-Bereich umfassend untersucht. Basierend auf dieser Forschung hat er eine standardisierte Datei- und Verzeichnisstruktur entwickelt: Das [Standard PHP Package Skeleton]. In dieser Verzeichnisstruktur sollte `DocumentRoot` auf `public/` verweisen, Unit-Tests sollten im Verzeichnis `tests/` abgelegt sein und Drittanbieterbibliotheken, wie sie von [composer] installiert wurden, gehören ins `vendor/`-Verzeichnis. Für andere Dateien und Verzeichnisse ist es für Projektbeteiligte am sinnvollsten, sich an das [Standard PHP Package Skeleton] zu halten. -[Paul M. Jones] has done some fantastic research into common practices of tens of thousands of github projects in the realm of PHP. He has compiled a standard file and directory structure, the [Standard PHP Package Skeleton], based on this research. In this directory structure, `DocumentRoot` should point to `public/`, unit tests should be in the `tests/` directory, and third party libraries, as installed by [composer], belong in the `vendor/` directory. For other files and directories, abiding by the [Standard PHP Package Skeleton] will make the most sense to contributors of a project. [Paul M. Jones]: https://paul-m-jones.com/ [Standard PHP Package Skeleton]: https://github.com/php-pds/skeleton From 06a261ca7a56dca41bea8610916dce60cb9d3f6f Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 5 Jun 2025 23:55:31 +0200 Subject: [PATCH 009/113] Update welcome.md leanhub original version only --- _includes/welcome.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/welcome.md b/_includes/welcome.md index cf1264ce2..479e0da4e 100644 --- a/_includes/welcome.md +++ b/_includes/welcome.md @@ -41,7 +41,7 @@ _PHP - aber richtig_ wurde in viele Sprachen übersetzt: ## Buch -Die neueste Version von _PHP - aber richtig_ ist auch in den Formaten PDF, EPUB und MOBI verfügbar. [Zu Leanpub][1] +Die neueste Version von _PHP - aber richtig_ in der englischen Originalversion _PHP: The Right Way_ ist auch in den Formaten PDF, EPUB und MOBI verfügbar. [Zu Leanpub][1] ## Wie beitragen? From 70cc058761c29110f51ad2afdf2b8db266c2a50f Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 5 Jun 2025 23:56:29 +0200 Subject: [PATCH 010/113] Update welcome.md --- _includes/welcome.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/welcome.md b/_includes/welcome.md index 479e0da4e..85e75e2e5 100644 --- a/_includes/welcome.md +++ b/_includes/welcome.md @@ -41,7 +41,7 @@ _PHP - aber richtig_ wurde in viele Sprachen übersetzt: ## Buch -Die neueste Version von _PHP - aber richtig_ in der englischen Originalversion _PHP: The Right Way_ ist auch in den Formaten PDF, EPUB und MOBI verfügbar. [Zu Leanpub][1] +Die neueste Version von _PHP - aber richtig_ ist in der englischen Originalversion als _PHP: The Right Way_ auch in den Formaten PDF, EPUB und MOBI verfügbar. [Zu Leanpub][1] ## Wie beitragen? From fee25d0eb25bcfbdcb3bb7b965eccb73690eda37 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 6 Jun 2025 00:20:32 +0200 Subject: [PATCH 011/113] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a5ff60ec4..7d9de4c2d 100644 --- a/README.md +++ b/README.md @@ -63,9 +63,9 @@ Wenn Sie _PHP - aber richtig_ übersetzen möchten, forken Sie das original-Repo Um Fragmentierung und Leserverwirrung zu vermeiden, wählen Sie bitte eine dieser Optionen: 1. Wir verlinken Ihren GitHub Pages-Fork mit `[username].github.io/php-the-right-way`. -2. Wir verlinken Ihren GitHub Pages-Fork mit einer Subdomain (z. B. „de.phptherightway.com“). +2. Wir verlinken Ihren GitHub Pages-Fork mit einer Subdomain (z. B. "de.phptherightway.com“). -Wenn Sie eine Subdomain verwenden, tragen Sie diese in die CNAME-Datei ein und bitten Sie uns, einen DNS für Sie einzurichten. Wenn Sie keine Subdomain verwenden, entfernen Sie die CNAME-Datei vollständig, da Ihr Fork sonst beim Pushen nicht erstellt wird. +Wenn Sie eine Subdomain verwenden, tragen Sie diese in die `CNAME`-Datei ein und bitten Sie uns, einen DNS für Sie einzurichten. Wenn Sie keine Subdomain verwenden, entfernen Sie die `CNAME`-Datei vollständig, da Ihr Fork sonst beim Pushen nicht erstellt wird. Fügen Sie Informationen zu Ihrer Übersetzung auf der [Wiki-Seite](https://github.com/codeguy/php-the-right-way/wiki/Translations) hinzu. From 281bcae82edb717aaae019efa37da0fe22d09290 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 6 Jun 2025 00:24:54 +0200 Subject: [PATCH 012/113] Update README.md --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 7d9de4c2d..8942f1e3a 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,10 @@ Mein Name ist [Josh Lockhart](https://x.com/codeguy). Ich bin der Autor vom [Sli * [Kris Jordan](https://krisjordan.com/) * [Phil Sturgeon](https://phil.tech/) +### Übersetzung ins Deutsche + +* [Henrik Pantle](https://github.com/skipper-henrik) + ## Lizenz [Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License](https://creativecommons.org/licenses/by-nc-sa/3.0/) From b837314a077615f6c30cdab380173d9cb854d1e6 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 10:35:22 +0200 Subject: [PATCH 013/113] Update 01-04-01-Mac-Setup.md --- _posts/01-04-01-Mac-Setup.md | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/_posts/01-04-01-Mac-Setup.md b/_posts/01-04-01-Mac-Setup.md index 06b6cc1c7..b059010d8 100644 --- a/_posts/01-04-01-Mac-Setup.md +++ b/_posts/01-04-01-Mac-Setup.md @@ -5,19 +5,18 @@ anchor: mac_setup ## macOS Setup {#mac_setup_title} -macOS 12 (Monterey) and later does not come prepackaged with PHP. Earlier macOS versions include PHP but are behind the latest stable release. There are multiple ways to install the latest PHP version on macOS. +macOS 12 (Monterey) und neuere Versionen enthalten kein vorinstalliertes PHP mehr. Frühere macOS-Versionen enthalten PHP, liegen aber hinter der neuesten stabilen Version zurück. Es gibt mehrere Möglichkeiten, die neueste PHP-Version unter macOS zu installieren. -### Install PHP via Homebrew +### Installiere PHP mit Homebrew -[Homebrew] is a package manager for macOS that helps you easily install PHP and various extensions. The Homebrew core repository provides "formulae" for PHP 8.1, 8.2, 8.3 and 8.4. Install the latest version with this command: +[Homebrew] ist ein Paketmanager für macOS, mit dem Du PHP und verschiedene Erweiterungen einfach installieren kannst. Das Homebrew-Core-Repository bietet „Formeln“ für PHP 8.1, 8.2, 8.3 und 8.4. Installiere die neueste Version mit diesem Befehl: ``` brew install php ``` +Du kannst zwischen Homebrew-PHP-Versionen wechseln, indem Du Ihre `PATH` Variable änderst. Alternativ kannst Du [brew-php-switcher][brew-php-switcher], um PHP-Versionen automatisch zu wechseln. -You can switch between Homebrew PHP versions by modifying your `PATH` variable. Alternatively, you can use [brew-php-switcher][brew-php-switcher] to switch PHP versions automatically. - -You can also switch between PHP versions manually by unlinking and linking the wanted version: +Du kannst auch manuell zwischen PHP-Versionen wechseln, indem Du die Verknüpfung aufhebst und die gewünschte Version verknüpfst: ``` brew unlink php @@ -29,18 +28,13 @@ brew unlink php brew link --overwrite php@8.3 ``` -### Install PHP via Macports +### Installier PHP mit Macports -The [MacPorts] Project is an open-source community initiative to design an -easy-to-use system for compiling, installing, and upgrading either -command-line, X11 or Aqua based open-source software on the macOS operating -system. +Das [MacPorts]-Projekt ist eine Open-Source-Community-Initiative zur Entwicklung eines benutzerfreundlichen Systems zum Kompilieren, Installieren und Aktualisieren von Open-Source-Software auf Befehlszeilen-, X11- oder Aqua-Basis auf dem macOS-Betriebssystem. -MacPorts supports pre-compiled binaries, so you don't need to recompile every -dependency from the source tarball files, it saves your life if you don't -have any package installed on your system. +MacPorts unterstützt vorkompilierte Binärdateien, sodass Du nicht jede Abhängigkeit aus den Quell-Tarball-Dateien neu kompilieren musst. Dies rettet Dein Leben, wenn auf Deinem System kein Paket installiert ist. -At this point, you can install `php54`, `php55`, `php56`, `php70`, `php71`, `php72`, `php73`, `php74`, `php80`, `php81`, `php82` or `php83` using the `port install` command, for example: +An diesem Punkt kannst Du `php54`, `php55`, `php56`, `php70`, `php71`, `php72`, `php73`, `php74`, `php80`, `php81`, `php82` oder `php83` mit dem Befehl `port install` installieren, zum Beispiel: sudo port install php74 sudo port install php83 From e7afd34e0745056ee167d2f609a3b87df7020119 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 11:13:44 +0200 Subject: [PATCH 014/113] Update 01-04-01-Mac-Setup.md --- _posts/01-04-01-Mac-Setup.md | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/_posts/01-04-01-Mac-Setup.md b/_posts/01-04-01-Mac-Setup.md index b059010d8..d59d28c8b 100644 --- a/_posts/01-04-01-Mac-Setup.md +++ b/_posts/01-04-01-Mac-Setup.md @@ -39,31 +39,26 @@ An diesem Punkt kannst Du `php54`, `php55`, `php56`, `php70`, `php71`, `php72`, sudo port install php74 sudo port install php83 -And you can run `select` command to switch your active PHP: +Und Du kannst den `select` Befehl ausführen, um Dein aktives PHP zu wechseln: sudo port select --set php php83 -### Install PHP via phpbrew +### Installier PHP mit phpbrew -[phpbrew] is a tool for installing and managing multiple PHP versions. This can be really useful if two different -applications/projects require different versions of PHP, and you are not using virtual machines. +[phpbrew] ist ein Tool zur Installation und Verwaltung mehrerer PHP-Versionen. Dies ist besonders nützlich, wenn zwei verschiedene Anwendungen/Projekte unterschiedliche PHP-Versionen erfordern und Sie keine virtuellen Maschinen verwenden. -### Install PHP via Liip's binary installer +### Installiere PHP mit Liip's binary installer -Another popular option is [php-osx.liip.ch] which provides one liner installation methods for versions 5.3 through 7.3. -It doesn't overwrite the PHP binaries installed by Apple, but installs everything in a separate location (/usr/local/php5). +Eine weitere beliebte Option ist [php-osx.liip.ch], das einfache Installationsmethoden für die Versionen 5.3 bis 7.3 bietet. Die von Apple installierten PHP-Binärdateien werden dabei nicht überschrieben, sondern alles an einem separaten Ort (/usr/local/php5) installiert. -### Compile from Source +### Aus Quell-Code compilieren -Another option that gives you control over the version of PHP you install, is to [compile it yourself][mac-compile]. -In that case be sure to have installed either [Xcode][xcode-gcc-substitution] or Apple's substitute -["Command Line Tools for XCode"] downloadable from Apple's Developer Center. +Eine weitere Möglichkeit, die installierte PHP-Version zu kontrollieren, besteht darin, sie [selbst zu kompilieren][mac-compile]. Stelle in diesem Fall sicher, dass Du entweder [Xcode][xcode-gcc-substitution] oder Apples Ersatz ["Command Line Tools for XCode"] installiert hast, der im Apple Developer Center heruntergeladen werden kann. -### All-in-One Installers +### All-in-One Installation -The solutions listed above mainly handle PHP itself, and do not supply things like [Apache][apache], [Nginx][nginx] or a SQL server. -"All-in-one" solutions such as [MAMP][mamp-downloads] and [XAMPP][xampp] will install these other bits of software for -you and tie them all together, but ease of setup comes with a trade-off of flexibility. +Die oben aufgeführten Lösungen verarbeiten hauptsächlich PHP selbst und bieten keine Sachen wie [Apache][apache], [Nginx][nginx] oder einen SQL-Server. +All-in-One-Lösungen wie [MAMP][mamp-downloads] und [XAMPP][xampp] installieren diese Softwarekomponenten für Dich und verknüpfen sie miteinander. Die einfache Einrichtung geht jedoch auf Kosten der Flexibilität. [Homebrew]: https://brew.sh/ [MacPorts]: https://www.macports.org/install.php From ec02886d42b0dad81aa88b3a4509780faf7c60e2 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 11:35:21 +0200 Subject: [PATCH 015/113] Update 02-01-01-Code-Style-Guide.md --- _posts/02-01-01-Code-Style-Guide.md | 63 +++++++++++++---------------- 1 file changed, 27 insertions(+), 36 deletions(-) diff --git a/_posts/02-01-01-Code-Style-Guide.md b/_posts/02-01-01-Code-Style-Guide.md index b89030939..b093fdf4d 100644 --- a/_posts/02-01-01-Code-Style-Guide.md +++ b/_posts/02-01-01-Code-Style-Guide.md @@ -4,59 +4,50 @@ anchor: code_style_guide # Code Style Guide {#code_style_guide_title} -The PHP community is large and diverse, composed of innumerable libraries, frameworks, and components. It is common for -PHP developers to choose several of these and combine them into a single project. It is important that PHP code adheres -(as close as possible) to a common code style to make it easy for developers to mix and match various libraries for -their projects. +Die PHP-Community ist groß und vielfältig und besteht aus unzähligen Bibliotheken, Frameworks und Komponenten. PHP-Entwickler wählen häufig mehrere davon aus und kombinieren sie in einem Projekt. +Es ist wichtig, dass der PHP-Code (so nah wie möglich) einem gemeinsamen Codestil folgt, damit Entwickler verschiedene Bibliotheken für ihre Projekte problemlos kombinieren können. -The [Framework Interop Group][fig] has proposed and approved a series of style recommendations. Not all of them relate -to code-style, but those that do are [PSR-1][psr1], [PSR-12][psr12], [PSR-4][psr4] and [PER Coding Style][per-cs]. These -recommendations are merely a set of rules that many projects like Drupal, Zend, Symfony, Laravel, CakePHP, phpBB, AWS SDK, -FuelPHP, Lithium, etc. are adopting. You can use them for your own projects, or continue to use your own -personal style. +Die [Framework Interop Group][fig] hat eine Reihe von Stilempfehlungen vorgeschlagen und verabschiedet. Nicht alle beziehen sich auf den Codestil, aber [PSR-1][psr1], [PSR-12][psr12], [PSR-4][psr4] and [PER Coding Style][per-cs] machen es. +Diese Empfehlungen stellen lediglich eine Reihe von Regeln dar, die von vielen Projekten wie Drupal, Zend, Symfony, Laravel, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium usw. übernommen werden. +Sie können diese Empfehlungen für Ihre eigenen Projekte verwenden oder Ihren persönlichen Stil beibehalten. -Ideally, you should write PHP code that adheres to a known standard. This could be any combination of PSRs, or one -of the coding standards made by PEAR or Zend. This means other developers can easily read and work with your code, and -applications that implement the components can have consistency even when working with lots of third-party code. +Idealerweise schreiben Sie PHP-Code, der einem bekannten Standard entspricht. Dies kann eine beliebige Kombination von PSRs oder einer der Codierungsstandards von PEAR oder Zend sein. +So können andere Entwickler Ihren Code problemlos lesen und bearbeiten, und Anwendungen, die die Komponenten implementieren, gewährleisten Konsistenz auch bei der Verwendung von viel Drittanbieter-Code. -* [Read about PSR-1][psr1] -* [Read about PSR-12][psr12] -* [Read about PSR-4][psr4] -* [Read about PER Coding Style][per-cs] -* [Read about PEAR Coding Standards][pear-cs] -* [Read about Symfony Coding Standards][symfony-cs] +* [lies über PSR-1][psr1] +* [lies über PSR-12][psr12] +* [lies über PSR-4][psr4] +* [lies über PER Coding Style][per-cs] +* [lies über PEAR Coding Standards][pear-cs] +* [lies über Symfony Coding Standards][symfony-cs] -You can use [PHP_CodeSniffer][phpcs] to check code against any one of these recommendations, and plugins for text -editors like [Sublime Text][st-cs] to be given real-time feedback. +Du kannst [PHP_CodeSniffer][phpcs] verwenden, um Code anhand einer dieser Empfehlungen zu überprüfen, und Plugins für Texteditoren wie Sublime Text, um Feedback in Echtzeit zu erhalten. -You can fix the code layout automatically by using one of the following tools: +Du kannst das Code-Layout automatisch korrigieren, indem Du eines der folgenden Tools verwendest: -- One is the [PHP Coding Standards Fixer][phpcsfixer] which has a very well tested codebase. -- Also, the [PHP Code Beautifier and Fixer][phpcbf] tool which is included with PHP_CodeSniffer can be used to adjust your code accordingly. - -And you can run phpcs manually from shell: +- Einer davon ist der [PHP Coding Standards Fixer][phpcsfixer], der über eine sehr gut getestete Codebasis verfügt. +- Außerdem können Sie Ihren Code mit dem in PHP_CodeSniffer enthaltenen Tool [PHP Code Beautifier and Fixer][phpcbf] entsprechend anpassen. +- +Und Du kannst `phpcs` manuell von der Shell aus ausführen: phpcs -sw --standard=PSR1 file.php -It will show errors and describe how to fix them. -It can also be helpful to include the `phpcs` command in a git pre-commit hook with the `--filter=GitStaged` CLI argument. -That way, code which contain violations against the chosen standard cannot enter the repository until those -violations have been fixed. +Es werden Fehler angezeigt und deren Behebung beschrieben. +Es kann auch hilfreich sein, den `phpcs` Befehl in einen Git-Pre-Commit-Hook mit dem `--filter=GitStaged` CLI-Argument einzubinden. +So kann Code, der gegen den gewählten Standard verstößt, erst dann in das Repository gelangen, wenn diese Verstöße behoben wurden. -If you have PHP_CodeSniffer, then you can fix the code layout problems reported by it, automatically, with the -[PHP Code Beautifier and Fixer][phpcbf]. +Wenn Du über PHP_CodeSniffer verfügst, kannst Du die von ihm gemeldeten Code-Layoutprobleme automatisch mit dem [PHP Code Beautifier and Fixer][phpcbf] beheben. phpcbf -w --standard=PSR1 file.php -Another option is to use the [PHP Coding Standards Fixer][phpcsfixer]. -It will show what kind of errors the code structure had before it fixed them. +Alternativ können Sie den [PHP Coding Standards Fixer][phpcsfixer] verwenden. +Dieser zeigt Dir, welche Fehler die Codestruktur vor der Behebung aufwies. php-cs-fixer fix -v --rules=@PSR1 file.php -English is preferred for all symbol names and code infrastructure. Comments may be written in any language easily -readable by all current and future parties who may be working on the codebase. +Für alle Symbolnamen und die Code-Infrastruktur wird Englisch bevorzugt. Kommentare können in jeder Sprache verfasst werden, die für alle aktuellen und zukünftigen Beteiligten, die an der Codebasis arbeiten, leicht verständlich ist. -Finally, a good supplementary resource for writing clean PHP code is [Clean Code PHP][cleancode]. +Eine gute ergänzende Ressource zum Schreiben von sauberem PHP-Code ist [Clean Code PHP][cleancode]. [fig]: https://www.php-fig.org/ [psr1]: https://www.php-fig.org/psr/psr-1/ From bdb5a0084be671651b432690d78d5a4ff90bf8a9 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 11:48:17 +0200 Subject: [PATCH 016/113] Update 03-02-01-Programming-Paradigms.md --- _posts/03-02-01-Programming-Paradigms.md | 56 ++++++++++-------------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/_posts/03-02-01-Programming-Paradigms.md b/_posts/03-02-01-Programming-Paradigms.md index 7973589f6..22673db5d 100644 --- a/_posts/03-02-01-Programming-Paradigms.md +++ b/_posts/03-02-01-Programming-Paradigms.md @@ -3,51 +3,43 @@ isChild: true anchor: programming_paradigms --- -## Programming Paradigms {#programming_paradigms_title} +## Programmierparadigmen {#programming_paradigms_title} -PHP is a flexible, dynamic language that supports a variety of programming techniques. It has evolved dramatically over -the years, notably adding a solid object-oriented model in PHP 5.0 (2004), anonymous functions and namespaces in -PHP 5.3 (2009), and traits in PHP 5.4 (2012). +PHP ist eine flexible, dynamische Sprache, die eine Vielzahl von Programmiertechniken unterstützt. +Sie hat sich im Laufe der Jahre dramatisch weiterentwickelt, insbesondere durch die Einführung eines soliden objektorientierten Modells in PHP 5.0 (2004), anonymer Funktionen und Namespaces in PHP 5.3 (2009) und Traits in PHP 5.4 (2012). -### Object-oriented Programming +### Objektorientierte Programmierung -PHP has a very complete set of object-oriented programming features including support for classes, abstract classes, -interfaces, inheritance, constructors, cloning, exceptions, and more. +PHP verfügt über einen sehr umfassenden Satz objektorientierter Programmierfunktionen, darunter Unterstützung für Klassen, abstrakte Klassen, Schnittstellen, Vererbung, Konstruktoren, Klonen, Ausnahmen und mehr. -* [Read about Object-oriented PHP][oop] -* [Read about Traits][traits] +* [Lies mehr über objektorientiertes PHP][oop] +* [Mehr über Traits][traits] -### Functional Programming +### Funktionale Programmierung -PHP supports first-class functions, meaning that a function can be assigned to a variable. Both user-defined and -built-in functions can be referenced by a variable and invoked dynamically. Functions can be passed as arguments to -other functions (a feature called _Higher-order Functions_) and functions can return other functions. +PHP unterstützt First-Class-Funktionen, d. h., eine Funktion kann einer Variable zugewiesen werden. Sowohl benutzerdefinierte als auch integrierte Funktionen können von einer Variable referenziert und dynamisch aufgerufen werden. Funktionen können als Argumente an andere Funktionen übergeben werden (eine Feature namens _Higher-order Functions_) und Funktionen können andere Funktionen zurückgeben. -Recursion, a feature that allows a function to call itself, is supported by the language, but most PHP code -is focused on iteration. +Rekursion, eine Feature, die es einer Funktion ermöglicht, sich selbst aufzurufen, wird von der Sprache unterstützt, der Großteil des PHP-Codes konzentriert sich jedoch auf Iteration. -New anonymous functions (with support for closures) are present since PHP 5.3 (2009). +Neue anonyme Funktionen (mit Unterstützung für Closures) sind seit PHP 5.3 (2009) vorhanden. -PHP 5.4 added the ability to bind closures to an object's scope and also improved support for callables such that they -can be used interchangeably with anonymous functions in almost all cases. +PHP 5.4 hat die Möglichkeit hinzugefügt, Closures an den Gültigkeitsbereich eines Objekts zu binden und hat außerdem die Unterstützung für aufrufbare Funktionen verbessert, sodass diese in fast allen Fällen austauschbar mit anonymen Funktionen verwendet werden können. -* Continue reading on [Functional Programming in PHP](/pages/Functional-Programming.html) -* [Read about Anonymous Functions][anonymous-functions] -* [Read about the Closure class][closure-class] -* [More details in the Closures RFC][closures-rfc] -* [Read about Callables][callables] -* [Read about dynamically invoking functions with `call_user_func_array()`][call-user-func-array] -### Meta Programming +* Lesen Sie weiter zum Thema [Functional Programming in PHP](/pages/Functional-Programming.html) +* [mehr über anonyme Funktionen][anonymous-functions] +* [mehr über the Closure class][closure-class] +* [Weitere Details in der Closures RFC][closures-rfc] +* [mehr zu Callables][callables] +* [mehr über dynamisches Aufrufen von Funktionen mit `call_user_func_array()`][call-user-func-array] -PHP supports various forms of meta-programming through mechanisms like the Reflection API and Magic Methods. There are -many Magic Methods available like `__get()`, `__set()`, `__clone()`, `__toString()`, `__invoke()`, etc. that allow -developers to hook into class behavior. Ruby developers often say that PHP is lacking `method_missing`, but it is -available as `__call()` and `__callStatic()`. +### Metaprogrammierung -* [Read about Magic Methods][magic-methods] -* [Read about Reflection][reflection] -* [Read about Overloading][overloading] +PHP unterstützt verschiedene Formen der Metaprogrammierung durch Mechanismen wie die Reflection API und Magic Methods. Es gibt viele Magic Methods wie `__get()`, `__set()`, `__clone()`, `__toString()`, `__invoke()`, usw., die es Entwicklern ermöglichen, sich in das Klassenverhalten einzuklinken. Ruby-Entwickler bemängeln oft, dass PHP `method_missing` fehle , aber es ist als `__call()` and `__callStatic()` verfügbar. + +* [mehr zu Magic Methods][magic-methods] +* [mehr zu Reflection][reflection] +* [mehr zu t Overloading][overloading] [oop]: https://www.php.net/language.oop5 From bd04cc6fdaa0dc0ec65cc644c9bdb05e738ac493 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 11:49:01 +0200 Subject: [PATCH 017/113] Update 03-02-01-Programming-Paradigms.md --- _posts/03-02-01-Programming-Paradigms.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/03-02-01-Programming-Paradigms.md b/_posts/03-02-01-Programming-Paradigms.md index 22673db5d..ac4e6563e 100644 --- a/_posts/03-02-01-Programming-Paradigms.md +++ b/_posts/03-02-01-Programming-Paradigms.md @@ -39,7 +39,7 @@ PHP unterstützt verschiedene Formen der Metaprogrammierung durch Mechanismen wi * [mehr zu Magic Methods][magic-methods] * [mehr zu Reflection][reflection] -* [mehr zu t Overloading][overloading] +* [mehr zu Overloading][overloading] [oop]: https://www.php.net/language.oop5 From 3b6161a445095ad01c64251de7d3d439acee5551 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 12:35:35 +0200 Subject: [PATCH 018/113] Update 03-03-01-Namespaces.md --- _posts/03-03-01-Namespaces.md | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/_posts/03-03-01-Namespaces.md b/_posts/03-03-01-Namespaces.md index 276511637..4a3801775 100644 --- a/_posts/03-03-01-Namespaces.md +++ b/_posts/03-03-01-Namespaces.md @@ -5,25 +5,19 @@ anchor: namespaces ## Namespaces {#namespaces_title} -As mentioned above, the PHP community has a lot of developers creating lots of code. This means that one library's PHP -code might use the same class name as another. When both libraries are used in the same namespace, they collide -and cause trouble. +Wie bereits erwähnt, gibt es in der PHP-Community viele Entwickler, die viel Code erstellen. Das bedeutet, dass der PHP-Code einer Bibliothek möglicherweise denselben Klassennamen wie eine andere verwendet. Wenn beide Bibliotheken im selben Namespace verwendet werden, kollidieren sie und verursachen Probleme. -_Namespaces_ solve this problem. As described in the PHP reference manual, namespaces may be compared to operating -system directories that _namespace_ files; two files with the same name may co-exist in separate directories. Likewise, -two PHP classes with the same name may co-exist in separate PHP namespaces. It's as simple as that. +_Namespaces_ lösen dieses Problem. Wie im PHP-Referenzhandbuch beschrieben, lassen sich Namespaces mit Betriebssystemverzeichnissen vergleichen, welche für die Dateien _einen Namensraum anlege_; zwei Dateien mit gleichem Namen können in unterschiedlichen Verzeichnissen koexistieren. Ebenso können zwei PHP-Klassen mit gleichem Namen in unterschiedlichen PHP-Namespaces koexistieren. So einfach ist das. -It is important for you to namespace your code so that it may be used by other developers without fear of colliding -with other libraries. +Es ist wichtig, dass Du Deinem Code einen Namespace zuweist, damit er von anderen Entwicklern so verwendet werden kann, dass keine Konflikte mit anderen Bibliotheken befürchtet werden müssen. -One recommended way to use namespaces is outlined in [PSR-4][psr4], which aims to provide a standard file, class and -namespace convention to allow plug-and-play code. +Eine empfohlene Möglichkeit zur Verwendung von Namespaces wird in [PSR-4][psr4] beschrieben . Ziel ist die Bereitstellung einer Standardkonvention für Dateien, Klassen und Namespaces, um Plug-and-Play-Code zu ermöglichen. -In October 2014 the PHP-FIG deprecated the previous autoloading standard: [PSR-0][psr0]. Both PSR-0 and PSR-4 are still perfectly usable. The latter requires PHP 5.3, so many PHP 5.2-only projects implement PSR-0. +Im Oktober 2014 hat die PHP-FIG den vorherigen Autoloading-Standard [PSR-0][psr0] als veraltet markiert . Sowohl PSR-0 als auch PSR-4 sind weiterhin problemlos nutzbar. Letzterer erfordert PHP 5.3, daher implementieren viele reine PHP 5.2-Projekte PSR-0. -If you're going to use an autoloader standard for a new application or package, look into PSR-4. +Wenn Sie einen Autoloader-Standard für eine neue Anwendung oder ein neues Paket verwenden möchten, sehen Sie sich PSR-4 an. -* [Read about Namespaces][namespaces] +* [über Namespaces][namespaces] * [Read about PSR-0][psr0] * [Read about PSR-4][psr4] From b28d4eb4ee2eed5344672192d9615543e1410aa9 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 12:37:53 +0200 Subject: [PATCH 019/113] Update 03-04-01-Standard-PHP-Library.md --- _posts/03-04-01-Standard-PHP-Library.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/_posts/03-04-01-Standard-PHP-Library.md b/_posts/03-04-01-Standard-PHP-Library.md index 6b9b67df7..815797182 100644 --- a/_posts/03-04-01-Standard-PHP-Library.md +++ b/_posts/03-04-01-Standard-PHP-Library.md @@ -4,14 +4,12 @@ isChild: true anchor: standard_php_library --- -## Standard PHP Library {#standard_php_library_title} +## Standard-PHP-Library {#standard_php_library_title} -The Standard PHP Library (SPL) is packaged with PHP and provides a collection of classes and interfaces. It is made up -primarily of commonly needed datastructure classes (stack, queue, heap, and so on), and iterators which can traverse -over these datastructures or your own classes which implement SPL interfaces. +Die Standard-PHP-Library (SPL) ist im Lieferumfang von PHP enthalten und bietet eine Sammlung von Klassen und Schnittstellen. Sie besteht hauptsächlich aus häufig benötigten Datenstrukturklassen (Stack, Queue, Heap usw.) und Iteratoren, die diese Datenstrukturen durchlaufen können, oder Ihren eigenen Klassen, die SPL-Schnittstellen implementieren. -* [Read about the SPL][spl] -* [SPL video course on LinkedIn.com (paid)][linkedin] +* [über die the SPL][spl] +* [SPL Video-Kourse on LinkedIn.com (paid)][linkedin] [spl]: https://www.php.net/book.spl From ec46bca2bb8325c543980820f2ea6516a55591d2 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 12:55:09 +0200 Subject: [PATCH 020/113] Update 03-05-01-Command-Line-Interface.md --- _posts/03-05-01-Command-Line-Interface.md | 27 +++++++++-------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/_posts/03-05-01-Command-Line-Interface.md b/_posts/03-05-01-Command-Line-Interface.md index e1152f742..734504f8b 100644 --- a/_posts/03-05-01-Command-Line-Interface.md +++ b/_posts/03-05-01-Command-Line-Interface.md @@ -5,24 +5,22 @@ anchor: command_line_interface ## Command Line Interface {#command_line_interface_title} -PHP was created to write web applications, but is also useful for scripting command line interface (CLI) programs. -Command line PHP programs can help automate common tasks like testing, deployment, and application administration. +PHP wurde zum Schreiben von Webanwendungen entwickelt, eignet sich aber auch zum Skripting von Befehlszeilenschnittstellenprogrammen / command line interface (CLI) programs. PHP-CLI-Programme können helfen, gängige Aufgaben wie Tests, Bereitstellung und Anwendungsadministration zu automatisieren. -CLI PHP programs are powerful because you can use your app's code directly without having to create and secure a web -GUI for it. Just be sure **not** to put your CLI PHP scripts in your public web root! +PHP-CLI-Programme sind leistungsstark, da Du den Code Deiner App direkt verwenden kannst, ohne dafür eine Web-GUI erstellen und sichern zu müssen. Achte jedoch darauf, Deine PHP-CLI-Skripte **niemals** in Deinem public web root zu platzieren! -Try running PHP from your command line: +Versuchen Sie, PHP über Ihre Befehlszeile auszuführen: {% highlight console %} > php -i {% endhighlight %} -The `-i` option will print your PHP configuration just like the [`phpinfo()`][phpinfo] function. -The `-a` option provides an interactive shell, similar to ruby's IRB or python's interactive shell. There are a number -of other useful [command line options][cli-options], too. +Die `-i` Option zeigt Deine PHP-Konfiguration an, genau wie die Funktion [`phpinfo()`][phpinfo]. -Let's write a simple "Hello, $name" CLI program. To try it out, create a file named `hello.php`, as below. +Diese `-a` Option bietet eine interaktive Shell, ähnlich der IRB von Ruby oder der interaktiven Shell von Python. Darüber hinaus gibt es eine Reihe weiterer nützlicher [command line options (Kommandozeilenoptionen)][cli-options] . + +Schreiben wir ein einfaches "Hello, $name"-CLI-Programm. Erstelle zum Ausprobieren eine Datei mit dem Namen `hello.php`, wie unten dargestellt. {% highlight php %} php hello.php @@ -51,7 +46,7 @@ Hello, world {% endhighlight %} - * [Learn about running PHP from the command line][php-cli] + * [Erfahren Sie, wie Sie PHP über die Befehlszeile ausführen][php-cli] [phpinfo]: https://www.php.net/function.phpinfo [cli-options]: https://www.php.net/features.commandline.options From ab4bd2b0094f7053a8c6625cd7f9e07b4e09ef60 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:05:13 +0200 Subject: [PATCH 021/113] Update 03-03-01-Namespaces.md --- _posts/03-03-01-Namespaces.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/03-03-01-Namespaces.md b/_posts/03-03-01-Namespaces.md index 4a3801775..55428279e 100644 --- a/_posts/03-03-01-Namespaces.md +++ b/_posts/03-03-01-Namespaces.md @@ -7,7 +7,7 @@ anchor: namespaces Wie bereits erwähnt, gibt es in der PHP-Community viele Entwickler, die viel Code erstellen. Das bedeutet, dass der PHP-Code einer Bibliothek möglicherweise denselben Klassennamen wie eine andere verwendet. Wenn beide Bibliotheken im selben Namespace verwendet werden, kollidieren sie und verursachen Probleme. -_Namespaces_ lösen dieses Problem. Wie im PHP-Referenzhandbuch beschrieben, lassen sich Namespaces mit Betriebssystemverzeichnissen vergleichen, welche für die Dateien _einen Namensraum anlege_; zwei Dateien mit gleichem Namen können in unterschiedlichen Verzeichnissen koexistieren. Ebenso können zwei PHP-Klassen mit gleichem Namen in unterschiedlichen PHP-Namespaces koexistieren. So einfach ist das. +_Namespaces_ lösen dieses Problem. Wie im PHP-Referenzhandbuch beschrieben, lassen sich Namespaces mit Betriebssystemverzeichnissen vergleichen, welche für die Dateien _einen Namensraum anlegen_; zwei Dateien mit gleichem Namen können in unterschiedlichen Verzeichnissen koexistieren. Ebenso können zwei PHP-Klassen mit gleichem Namen in unterschiedlichen PHP-Namespaces koexistieren. So einfach ist das. Es ist wichtig, dass Du Deinem Code einen Namespace zuweist, damit er von anderen Entwicklern so verwendet werden kann, dass keine Konflikte mit anderen Bibliotheken befürchtet werden müssen. From 73053197c4c07d4b306b62b23202d07875ff1ee9 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:20:50 +0200 Subject: [PATCH 022/113] Update _config.yml --- _config.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_config.yml b/_config.yml index ed5167d0d..5cf96f51b 100644 --- a/_config.yml +++ b/_config.yml @@ -22,7 +22,7 @@ defaults: path: /images/og-image.png width: 1024 height: 640 - alt: "PHP: The Right Way" + alt: "PHP - aber richtig." # Excludes should be appended to the default # https://github.com/jekyll/jekyll/blob/master/lib/site_template/_config.yml#L37-L55 @@ -47,7 +47,7 @@ exclude: future: true -title: "PHP: The Right Way" -tagline: Reference for PHP best practices -description: An easy-to-read, quick reference for PHP best practices, accepted coding standards, and links to authoritative PHP tutorials around the Web +title: "PHP - aber richtig." +tagline: Referenz für PHP best Practices +description: Eine leicht verständliche Kurzreferenz für bewährte PHP-Herangehensweisen, anerkannte Coding-Standards und Links zu maßgeblichen Tutorials im Internet. logo: /images/og-image.png From 553275c61a1d84bcf3e076ace3112cdcb64b5d12 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:41:17 +0200 Subject: [PATCH 023/113] Update 01-05-01-Windows-Setup.md --- _posts/01-05-01-Windows-Setup.md | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/_posts/01-05-01-Windows-Setup.md b/_posts/01-05-01-Windows-Setup.md index 9423546ed..ce8089fd0 100644 --- a/_posts/01-05-01-Windows-Setup.md +++ b/_posts/01-05-01-Windows-Setup.md @@ -5,23 +5,18 @@ anchor: windows_setup ## Windows Setup {#windows_setup_title} -You can download the binaries from [windows.php.net/download][php-downloads]. After the extraction of PHP, it is recommended to set the [PATH][windows-path] to the root of your PHP folder (where php.exe is located) so you can execute PHP from anywhere. +Du kannst die Binärdateien von [windows.php.net/download][php-downloads] herunterladen. +Nach der PHP-Extraktion empfiehlt es sich, den [PATH][windows-path] auf das Stammverzeichnis Ihres PHP-Ordners (wo sich php.exe befindet) zu setzen, damit Sie PHP von überall ausführen können. -For learning and local development, you can use the built in webserver with PHP 5.4+ so you don't need to worry about -configuring it. If you would like an "all-in-one" which includes a full-blown webserver and MySQL too then tools such -as the [XAMPP][xampp], [EasyPHP][easyphp], [OpenServer][openserver] and [WAMP][wamp] will -help get a Windows development environment up and running fast. That said, these tools will be a little different from -production so be careful of environment differences if you are working on Windows and deploying to Linux. +Für Schulungen und die lokale Entwicklung Kannst Du den integrierten Webserver mit PHP 5.4+ nutzen, sodass Du Dich nicht um die Konfiguration kümmern musst. +Wenn Du eine All-in-One-Lösung mit vollwertigem Webserver und MySQL wünschst, helfen Dir Tools wie [XAMPP][xampp], [EasyPHP][easyphp], [OpenServer][openserver] und [WAMP][wamp], eine Windows-Entwicklungsumgebung schnell zum Laufen zu bringen. Allerdings unterscheiden sich diese Tools etwas von der Produktionsumgebung. Achte daher auf Umgebungsunterschiede, wenn Du unter Windows arbeitest und unter Linux deployst. -If you need to run your production system on Windows, then IIS7 will give you the most stable and best performance. You -can use [phpmanager][phpmanager] (a GUI plugin for IIS7) to make configuring and managing PHP simple. IIS7 comes with -FastCGI built in and ready to go, you just need to configure PHP as a handler. For support and additional resources -there is a [dedicated area on iis.net][php-iis] for PHP. +Wenn Du Dein Produktionssystem unter Windows betreibst, bietet IIS7 die stabilste und leistungsstärkste Lösung. Mit [phpmanager][phpmanager] (einem GUI-Plugin für IIS7) kannst Du PHP einfach konfigurieren und verwalten. IIS7 verfügt über integriertes FastCGI und ist sofort einsatzbereit. Du musst lediglich PHP als Handler konfigurieren. Für Support und weitere Ressourcen gibt es einen [eigenen Bereich für PHP auf iis.net][php-iis]. -Generally running your application on different environment in development and production can lead to strange bugs popping up when you go -live. If you are developing on Windows and deploying to Linux (or anything non-Windows) then you should consider using a [Virtual Machine](/#virtualization_title). +Wenn Du Deine Anwendung in unterschiedlichen Umgebungen in Entwicklung und Produktion ausführst, kann es beim Live-Einsatz zu ungewöhnlichen Fehlern kommen. Wenn Du unter Windows entwickeln und unter Linux (oder einem anderen Betriebssystem als Windows) deployst, solltest Du den Einsatz einer [virtuellen Maschine](/#virtualization_title) in Betracht ziehen. + +Chris Tankersley hat einen sehr hilfreichen Blog-Beitrag darüber verfasst, welche Tools er für die [PHP-Entwicklung unter Windows][windows-tools] verwendet. -Chris Tankersley has a very helpful blog post on what tools he uses to do [PHP development using Windows][windows-tools]. [easyphp]: https://www.easyphp.org/ [phpmanager]: http://phpmanager.codeplex.com/ From 4bef5ca7a7f61e3a4a575dafa5d10da39db60583 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 14:15:09 +0200 Subject: [PATCH 024/113] Update 01-06-01-Linux-Setup.md --- _posts/01-06-01-Linux-Setup.md | 40 +++++++++++++++++----------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/_posts/01-06-01-Linux-Setup.md b/_posts/01-06-01-Linux-Setup.md index 2f19bd048..4f4d2f9c5 100644 --- a/_posts/01-06-01-Linux-Setup.md +++ b/_posts/01-06-01-Linux-Setup.md @@ -5,73 +5,73 @@ anchor: linux_setup ## Linux Setup {#linux_setup_title} -Most GNU/Linux distributions come with PHP available from the official repositories, but those packages usually are a little behind the current stable version. There are multiple ways to get newer PHP versions on such distributions. +Die meisten GNU/Linux-Distributionen enthalten PHP aus den offiziellen Repositorien, diese Pakete liegen jedoch meist etwas hinter der aktuellen stabilen Version zurück. Es gibt mehrere Möglichkeiten, neuere PHP-Versionen für solche Distributionen zu erhalten. -### Ubuntu-based distributions +### Ubuntu-basierte Distributionen -On Ubuntu and Debian-based GNU/Linux distributions, for instance, the best alternatives for native packages are provided and maintained by [Ondřej Surý][Ondrej Sury Blog], through his Personal Package Archive (PPA) on Ubuntu and DPA/bikeshed on Debian. Find instructions for each of these below. +Für Ubuntu und Debian-basierte GNU/Linux-Distributionen werden die besten Alternativen für native Pakete beispielsweise von [Ondřej Surý][Ondrej Sury Blog] bereitgestellt und gepflegt. Dies geschieht über sein Personal Package Archive (PPA) für Ubuntu und DPA/bikeshed für Debian. Anweisungen dazu finden Sie unten. -For Ubuntu distributions, the [PPA by Ondřej Surý][Ondrej Sury PPA] provides supported PHP versions along with many PECL extensions. To add this PPA to your system, perform the following steps in your terminal: +Für Ubuntu-Distributionen bietet das [PPA von Ondřej Surý][Ondrej Sury PPA] unterstützte PHP-Versionen sowie zahlreiche PECL-Erweiterungen. Um dieses PPA zu Ihrem System hinzuzufügen, führen Sie die folgenden Schritte in Ihrem Terminal aus: -1. First, add the PPA to your system's software sources using the command: +1. Fügen Sie zunächst das PPA mit dem folgenden Befehl zu den Softwarequellen Ihres Systems hinzu: ```bash sudo add-apt-repository ppa:ondrej/php ``` -2. After adding the PPA, update your system's package list: +2. Aktualisieren Sie nach dem Hinzufügen des PPA die Paketliste Ihres Systems: ```bash sudo apt update ``` -This will ensure that your system can access and install the latest PHP packages available in the PPA. +Dadurch wird sichergestellt, dass Ihr System auf die neuesten im PPA verfügbaren PHP-Pakete zugreifen und diese installieren kann. -### Debian-based distributions +### Debian-basierte Distributionen -For Debian-based distributions, Ondřej Surý also provides a [bikeshed][bikeshed] (Debian equivalent of a PPA). To add the bikeshed to your system and update it, follow these steps: +Für Debian-basierte Distributionen stellt Ondřej Surý auch einen [bikeshed][bikeshed] (Debian-Äquivalent eines PPA) zur Verfügung. Um den Bikeshed Deinem System hinzuzufügen und zu aktualisieren, gehe wie folgt vor: -1. Ensure that you have root access. If not, you might need to use `sudo` for the following commands. +1. Stelle sicher, dass Sie Root-Zugriff haben. Andernfalls müssen Sie möglicherweise `sudo` für die folgenden Befehle verwenden. -2. Update your system's package list: +2. Aktualisiere die Paketliste Ihres Systems: ```bash sudo apt-get update ``` -3. Install `lsb-release`, `ca-certificates`, and `curl`: +3. Installiere `lsb-release`, `ca-certificates`, und `curl`: ```bash sudo apt-get -y install lsb-release ca-certificates curl ``` -4. Download the signing key for the repository: +4. Lade den Signaturschlüssel für das Repository herunter: ```bash sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg ``` -5. Add the repository to your system's software sources: +5. Füge das Repository zu den Softwarequellen Deines Systems hinzu: ```bash sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list' ``` -6. Finally, update your system's package list again: +6. Aktualisiere abschließend die Paketliste Deines Systems erneut: ```bash sudo apt-get update ``` -With these steps, your system will be able to install the latest PHP packages from the bikeshed. +Mit diesen Schritten kann Ihr System die neuesten PHP-Pakete aus dem Bikeshed installieren. -### RPM-based distributions +### RPM-basierte Distributionen -On RPM-based distributions (CentOS, Fedora, RHEL, etc.) you can use the [Remi's RPM repository][remi-repo] to install the latest PHP version or to have multiple PHP versions simultaneously available. +Auf RPM-basierten Distributionen (CentOS, Fedora, RHEL usw.) kannst Du [Remi's RPM repository][remi-repo] verwenden , um die neueste PHP-Version zu installieren oder mehrere PHP-Versionen gleichzeitig verfügbar zu haben. -There is a [configuration wizard][remi-wizard] available to configure your RPM-based distribution. +Zum Konfigurieren Ihrer RPM-basierten Distribution steht ein [Konfigurationsassistent][remi-wizard] zur Verfügung. -All that said, you can always use containers or compile the PHP source code from scratch. +Abgesehen davon kannst Du immer Container verwenden oder den PHP-Quellcode von Grund auf neu kompilieren. [Ondrej Sury Blog]: https://deb.sury.org/ [Ondrej Sury PPA]: https://launchpad.net/~ondrej/+archive/ubuntu/php From 0a0ed795cac7dffd9f0bf596eeeea56e5d90122a Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:34:28 +0200 Subject: [PATCH 025/113] Update 01-07-01-Common-Directory-Structure.md --- _posts/01-07-01-Common-Directory-Structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-07-01-Common-Directory-Structure.md b/_posts/01-07-01-Common-Directory-Structure.md index ed6522b00..08c5924e0 100644 --- a/_posts/01-07-01-Common-Directory-Structure.md +++ b/_posts/01-07-01-Common-Directory-Structure.md @@ -4,7 +4,7 @@ isChild: true anchor: common_directory_structure --- -## übliche Datei- und Verzeichnisstruktur {#common_directory_structure_title} +## Gemeinsame Datei- und Verzeichnisstruktur {#common_directory_structure_title} Eine häufige Frage von Webentwicklern lautet: “Wo speichere ich meine Zeug?“ Über die Jahre lautete die Antwort immer wieder: „Dort wo das `DocumentRoot` ist.“ Obwohl diese Antwort nicht vollständig ist, bietet sie einen guten Ausgangspunkt. From 83908b83c9ab743405bb6478a31c918006cccbf2 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:46:49 +0200 Subject: [PATCH 026/113] Update 03-06-01-XDebug.md --- _posts/03-06-01-XDebug.md | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/_posts/03-06-01-XDebug.md b/_posts/03-06-01-XDebug.md index 1765034a8..33f91f35b 100644 --- a/_posts/03-06-01-XDebug.md +++ b/_posts/03-06-01-XDebug.md @@ -6,39 +6,31 @@ anchor: xdebug ## Xdebug {#xdebug_title} -One of the most useful tools in software development is a proper debugger. It allows you to trace the execution of your -code and monitor the contents of the stack. Xdebug, PHP's debugger, can be utilized by various IDEs to provide -Breakpoints and stack inspection. It can also allow tools like PHPUnit and KCacheGrind to perform code coverage -analysis and code profiling. +Eines der nützlichsten Tools in der Softwareentwicklung ist ein geeigneter Debugger. Er ermöglicht es Dir, die Ausführung Deines Codes zu verfolgen und den Inhalt des Stacks zu überwachen. +Xdebug, der PHP-Debugger, kann von verschiedenen IDEs genutzt werden, um Breakpoints und Stack-Inspektionen bereitzustellen. Außerdem erlaubt er Tools wie PHPUnit und KCacheGrind das Ausführen von Code-Coverage-Analysen und Code-Profiling. -If you find yourself in a bind, willing to resort to `var_dump()`/`print_r()`, and you still can't find the solution - -maybe you need to use the debugger. +Du findest Dich in einer Zwickmühle wieder, mit `var_dump()`/`print_r()` findest Du noch immer keine Lösung - vielleicht solltest Du jetzt den Debugger verwenden. -[Installing Xdebug][xdebug-install] can be tricky, but one of its most important features is "Remote Debugging" - if -you develop code locally and then test it inside a VM or on another server, Remote Debugging is the feature that you -will want to enable right away. +Die [Installation von Xdebug][xdebug-install] kann schwierig sein, aber eine seiner wichtigsten Funktionen ist "Remote Debugging" – wenn Du Code lokal entwickelst und ihn dann in einer VM oder auf einem anderen Server testest, ist Remote Debugging die Funktion, die Du sofort aktivieren möchtest. -Traditionally, you will modify your Apache VHost or .htaccess file with these values: +Normalerweise änderst Du Deinen Apache VHost oder Deine .htaccess-Datei mit diesen Werten: {% highlight ini %} php_value xdebug.remote_host 192.168.?.? php_value xdebug.remote_port 9000 {% endhighlight %} -The "remote host" and "remote port" will correspond to your local computer and the port that you configure your IDE to -listen on. Then it's just a matter of putting your IDE into "listen for connections" mode, and loading the URL: +"Remote-Host" und "Remote-Port" entsprechen Deinem lokalen Computer und dem Port, auf dem Deine IDE hört. Anschließend musst Du Deine IDE nur noch in den Verbindungsmodus versetzen und die URL laden: http://your-website.example.com/index.php?XDEBUG_SESSION_START=1 -Your IDE will now intercept the current state as the script executes, allowing you to set breakpoints and probe the -values in memory. +Deine IDE fängt jetzt den aktuellen Status ab, während das Skript ausgeführt wird, sodass Du Haltepunkte festlegen und die Werte im Speicher überprüfen kannst. -Graphical debuggers make it very easy to step through code, inspect variables, and eval code against the live runtime. -Many IDEs have built-in or plugin-based support for graphical debugging with Xdebug. MacGDBp is a free, open-source, -stand-alone Xdebug GUI for macOS. +Grafische Debugger erleichtern das schrittweise Durchlaufen von Code, das Überprüfen von Variablen und die Auswertung von Code in der Live-Laufzeitumgebung. Viele IDEs bieten integrierte oder Plugin-basierte Unterstützung für grafisches Debugging mit Xdebug. MacGDBp ist eine kostenlose, Open-Source- und eigenständige Xdebug-GUI für macOS. - * [Learn more about Xdebug][xdebug-docs] - * [Learn more about MacGDBp][macgdbp-install] + + * [Lerne mehr zu Xdebug][xdebug-docs] + * [Lerne mehr zu MacGDBp][macgdbp-install] [xdebug-install]: https://xdebug.org/docs/install From 03d4d2f5e02685f18063b20e7089958aa738d567 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 18:52:00 +0200 Subject: [PATCH 027/113] Update 04-01-01-Dependency-Management.md --- _posts/04-01-01-Dependency-Management.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/_posts/04-01-01-Dependency-Management.md b/_posts/04-01-01-Dependency-Management.md index ed0fe9dff..a0753feae 100644 --- a/_posts/04-01-01-Dependency-Management.md +++ b/_posts/04-01-01-Dependency-Management.md @@ -2,16 +2,11 @@ anchor: dependency_management --- -# Dependency Management {#dependency_management_title} +# Abhängigkeitsverwaltung {#dependency_management_title} -There are a ton of PHP libraries, frameworks, and components to choose from. Your project will likely use -several of them — these are project dependencies. PHP did not have a good way to manage -these project dependencies. Even if you managed them manually, you still had to worry about autoloaders. -That is no longer an issue. +Es gibt eine riesige Auswahl an PHP-Libraries, Frameworks und Komponenten. Ihr Projekt wird wahrscheinlich mehrere davon verwenden – dies sind Projektabhängigkeiten (Dependencies). PHP bot bisher keine gute Möglichkeit, diese Projektabhängigkeiten zu verwalten. Selbst bei manueller Verwaltung mussten Sie sich immer noch um Autoloader kümmern. Das ist kein Problem mehr. -Currently there are two major package management systems for PHP - [Composer] and [PEAR]. Composer is currently -the most popular package manager for PHP, however for a long time PEAR was the primary package manager in use. -Knowing PEAR's history is a good idea, since you may still find references to it even if you never use it. +Derzeit gibt es zwei wichtige Paketverwaltungssysteme für PHP: [Composer] und [PEAR] . Composer ist derzeit der beliebteste Paketmanager für PHP, PEAR war jedoch lange Zeit der am häufigsten verwendete Paketmanager. Es ist ratsam, die Geschichte von PEAR zu kennen, da Du möglicherweise auch dann noch Referenzen darauf findest, auch wenn Du es nie verwendest. [Composer]: /#composer_and_packagist [PEAR]: /#pear From faa295d1469f101d0c690ed473334e8b1230d900 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Mon, 16 Jun 2025 19:38:10 +0200 Subject: [PATCH 028/113] Update 04-02-01-Composer-and-Packagist.md --- _posts/04-02-01-Composer-and-Packagist.md | 79 ++++++++--------------- 1 file changed, 28 insertions(+), 51 deletions(-) diff --git a/_posts/04-02-01-Composer-and-Packagist.md b/_posts/04-02-01-Composer-and-Packagist.md index ec86e3f53..03c26cd00 100644 --- a/_posts/04-02-01-Composer-and-Packagist.md +++ b/_posts/04-02-01-Composer-and-Packagist.md @@ -4,104 +4,81 @@ isChild: true anchor: composer_and_packagist --- -## Composer and Packagist {#composer_and_packagist_title} +## Composer und Packagist {#composer_and_packagist_title} -Composer is the recommended dependency manager for PHP. List your project's dependencies in a `composer.json` file and, -with a few simple commands, Composer will automatically download your project's dependencies and setup autoloading for -you. Composer is analogous to NPM in the node.js world, or Bundler in the Ruby world. +Composer ist der empfohlene Abhängigkeitsmanager für PHP. Listen Sie die Abhängigkeiten Ihres Projekts in einer `composer.json` Datei auf. Mit wenigen einfachen Befehlen lädt Composer die Abhängigkeiten Deines Projekts herunter und richtet das autoloading für Dich ein. Composer entspricht NPM in der Node.js-Welt oder Bundler in der Ruby-Welt. -There is a plethora of PHP libraries that are compatible with Composer and ready to be used in your project. These -"packages" are listed on [Packagist], the official repository for Composer-compatible PHP libraries. +Es gibt eine Vielzahl von PHP-Bibliotheken, die mit Composer kompatibel sind und in Ihrem Projekt eingesetzt werden können. Diese "packages" finden Sie auf [Packagist], dem offiziellen Repository für Composer-kompatible PHP-Bibliotheken. -### How to Install Composer +### So installierst Du Composer -The safest way to download composer is by [following the official instructions](https://getcomposer.org/download/). -This will verify the installer is not corrupt or tampered with. -The installer installs a `composer.phar` binary in your _current working directory_. +Der sicherste Weg, Composer herunterzuladen, ist [den offiziellen Anweisungen zu folgen](https://getcomposer.org/download/). +Dadurch wird sichergestellt, dass das Installationsprogramm nicht beschädigt oder manipuliert ist. Das Installationsprogramm installiert eine `composer.phar` Binärdatei in Deinem aktuellen _Arbeitsverzeichnis_. -We recommend installing Composer *globally* (e.g. a single copy in `/usr/local/bin`). To do so, run this command next: +Wir empfehlen, Composer *global* zu installieren (z. B. eine einzelne Kopie in `/usr/local/bin`). Führe dazu als Nächstes diesen Befehl aus: {% highlight console %} mv composer.phar /usr/local/bin/composer {% endhighlight %} -**Note:** If the above fails due to permissions, prefix with `sudo`. +**Hinweis:** Wenn das oben genannte Verfahren aufgrund von Berechtigungen fehlschlägt, verwende das `sudo` Präfix -To run a locally installed Composer you'd use `php composer.phar`, globally it's simply `composer`. +Um einen lokal installierten Composer auszuführen, verwende `php composer.phar`, global ist es einfach `composer`. -#### Installing on Windows +#### Installation unter Windows -For Windows users the easiest way to get up and running is to use the [ComposerSetup] installer, which -performs a global install and sets up your `$PATH` so that you can just call `composer` from any -directory in your command line. +Für Windows-Benutzer ist die einfachste Möglichkeit um los zu legen die Verwendung des [ComposerSetup] -Installationsprogramms, das eine globale Installation durchführt und Dein `$PATH` so einrichtet, dass Du einfach `composer` aus jedem Verzeichnis in Ihrer Befehlszeile aufrufen kannst. -### How to Define and Install Dependencies +### So definieren und installieren Sie Abhängigkeiten -Composer keeps track of your project's dependencies in a file called `composer.json`. You can manage it -by hand if you like, or use Composer itself. The `composer require` command adds a project dependency -and if you don't have a `composer.json` file, one will be created. Here's an example that adds [Twig] -as a dependency of your project. +Composer speichert die Abhängigkeiten Ihres Projekts in einer Datei namens `composer.json`. Du kannst diese manuell verwalten oder Composer selbst verwenden. Der `composer require` Befehl fügt eine Projektabhängigkeit hinzu und falls Du keine `composer.json` Datei hast, wird eine erstellt. Hier ist ein Beispiel, das [Twig] als Dependency Deines Projekts hinzufügt. {% highlight console %} composer require twig/twig:^2.0 {% endhighlight %} -Alternatively, the `composer init` command will guide you through creating a full `composer.json` file -for your project. Either way, once you've created your `composer.json` file you can tell Composer to -download and install your dependencies into the `vendor/` directory. This also applies to projects -you've downloaded that already provide a `composer.json` file: +Alternativ führt Sie der `composer init` Befehl durch die Erstellung einer vollständigen `composer.json` Datei für Dein Projekt. Sobald Du Deine `composer.json`Datei erstellt hast, kannst Du Composer anweisen, Deine Dependencies herunterzuladen und im `vendor/` Verzeichnis zu installieren. Dies gilt auch für heruntergeladene Projekte, die bereits eine `composer.json` Datei bereitstellen: {% highlight console %} composer install {% endhighlight %} -Next, add this line to your application's primary PHP file; this will tell PHP to use Composer's -autoloader for your project dependencies. +Fügen Sie als Nächstes diese Zeile zur primären PHP-Datei Ihrer Anwendung hinzu. Dadurch wird PHP angewiesen, den Autoloader von Composer für Ihre Projektabhängigkeiten zu verwenden. {% highlight php %} Date: Mon, 16 Jun 2025 19:40:06 +0200 Subject: [PATCH 029/113] Update 04-03-01-PEAR.md --- _posts/04-03-01-PEAR.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/04-03-01-PEAR.md b/_posts/04-03-01-PEAR.md index ca293dd05..e0df59dae 100644 --- a/_posts/04-03-01-PEAR.md +++ b/_posts/04-03-01-PEAR.md @@ -4,7 +4,7 @@ isChild: true anchor: pear --- -## PEAR {#pear_title} +## PEAR - PHP Extension and Application Repository {#pear_title} A veteran package manager that some PHP developers enjoy is [PEAR][1]. It behaves similarly to Composer, but has some notable differences. From 9eb4d096ec2ffdf8b66873fe60e843ae8158419e Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:39:18 +0200 Subject: [PATCH 030/113] Update 04-03-01-PEAR.md --- _posts/04-03-01-PEAR.md | 46 ++++++++++++++++------------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/_posts/04-03-01-PEAR.md b/_posts/04-03-01-PEAR.md index e0df59dae..7c1a310f9 100644 --- a/_posts/04-03-01-PEAR.md +++ b/_posts/04-03-01-PEAR.md @@ -6,41 +6,34 @@ anchor: pear ## PEAR - PHP Extension and Application Repository {#pear_title} -A veteran package manager that some PHP developers enjoy is [PEAR][1]. It behaves similarly to Composer, -but has some notable differences. +Ein altbewährter Paketmanager, der von einigen PHP-Entwicklern geschätzt wird, ist [PEAR][1] +Er verhält sich ähnlich wie Composer, weist aber einige bemerkenswerte Unterschiede auf. -PEAR requires each package to have a specific structure, which means that the author of the package must prepare it for -usage with PEAR. Using a project which was not prepared to work with PEAR is not possible. +PEAR erfordert für jedes Paket eine spezifische Struktur. Das bedeutet, dass der Autor des Pakets es für die Verwendung mit PEAR vorbereiten muss. Der Gebrauch eines Projekts, das nicht für die Verwendung mit PEAR vorbereitet wurde, ist unmöglich. -PEAR installs packages globally, which means after installing them once they are available to all projects on that -server. This can be good if many projects rely on the same package with the same version but might lead to problems if -version conflicts between two projects arise. +PEAR installiert Pakete global, d. h. nach der Installation stehen sie allen Projekten auf dem Server zur Verfügung. Dies ist sinnvoll, wenn viele Projekte dasselbe Paket mit derselben Version verwenden, kann aber zu Problemen führen, wenn Versionskonflikte zwischen zwei Projekten auftreten. -### How to install PEAR +### So installierst Du PEAR -You can install PEAR by downloading the `.phar` installer and executing it. The PEAR documentation has -detailed [install instructions][2] for every operating system. +Du kannst PEAR installieren, indem Du den `.phar` Installer herunterlädst und ausführst. Die PEAR-Dokumentation enthält detaillierte Installationsanweisungen für jedes Betriebssystem. -If you are using Linux, you can also have a look at your distribution package manager. Debian and Ubuntu, -for example, have an apt `php-pear` package. +Wenn Du Linux nutzt, kannst Du auch einen Blick in den Paketmanager Deiner Distribution werfen. Debian und Ubuntu verfügen beispielsweise über ein apt `php-pear`-Paket. (apt: Advanced Package Tool) -### How to install a package +### So installiert Du ein package -If the package is listed on the [PEAR packages list][3], you can install it by specifying the official name: +Wenn das Package in der [PEAR packages list][3] gelistet ist, kannst Du es installieren, indem Du den offiziellen Namen angibst: {% highlight console %} pear install foo {% endhighlight %} -If the package is hosted on another channel, you need to `discover` the channel first and also specify it when -installing. See the [Using channel docs][4] for more information on this topic. +Wenn das Paket auf einem anderen Kanal gehostet wird, musst Du zuerst den Kanal `entdecken/discovern` und ihn bei der Installation angeben. Weitere Informationen zu diesem Thema findest Du in der Dokumentation zur Kanalverwendung [Using channel docs][4]. -* [Learn about PEAR][1] +* [Mehr zu PEAR][1] -### Handling PEAR dependencies with Composer +### Handhabung von PEAR-Abhängigkeiten mit Composer -If you are already using [Composer][5] and you would like to install some PEAR code too, you can use Composer to -handle your PEAR dependencies. PEAR repositories are no longer directly supported by Composer version 2, so you must manually add a repository to install PEAR packages: +Wenn Sie [Composer][5] bereits verwenden und zusätzlich auch PEAR-Code installieren möchten, können Sie Composer zur Verwaltung Ihrer PEAR-Abhängigkeiten verwenden. PEAR-Repositorys werden von Composer Version 2 nicht mehr direkt unterstützt. Du Musst daher manuell ein Repository hinzufügen, um PEAR-Pakete zu installieren: {% highlight json %} { @@ -66,20 +59,17 @@ handle your PEAR dependencies. PEAR repositories are no longer directly supporte } {% endhighlight %} -The first section `"repositories"` will be used to let Composer know it should "initialize" (or "discover" in PEAR -terminology) the pear repo. Then the `require` section will prefix the package name like this: +Der erste Abschnitt `"repositories"` teilt Composer mit, dass das Pear-Repository "initialisiert" (oder in der PEAR-Terminologie "discover") werden soll. Anschließend stellt der `require`-Abschnitt dem Paketnamen ein Präfix voran: > pear-channel/package -The "pear" prefix is hardcoded to avoid any conflicts, as a pear channel could be the same as another packages vendor -name for example, then the channel short name (or full URL) can be used to reference which channel the package is in. +Das "pear" Präfix ist fest codiert, um Konflikte zu vermeiden. Da ein Pear-Kanal beispielsweise mit dem vendor-Mamen eines anderen Pakets identisch sein könnte, kann der Kurzname des Kanals (oder die vollständige URL) verwendet werden, um anzugeben, in welchem ​​Kanal sich das Paket befindet. -When this code is installed it will be available in your vendor directory and automatically available through the -Composer autoloader: +Wenn dieser Code installiert ist, steht er in Deinem Vendor-Verzeichnis und automatisch über den Composer-Autoloader zur Verfügung: > vendor/pear2/pear2-http-request/pear2/HTTP/Request.php -To use this PEAR package simply reference it like so: +Um dieses PEAR-Paket zu verwenden, verwise einfach folgendermaßen darauf: {% highlight php %} Date: Fri, 20 Jun 2025 12:39:48 +0200 Subject: [PATCH 031/113] Update 04-03-01-PEAR.md --- _posts/04-03-01-PEAR.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/04-03-01-PEAR.md b/_posts/04-03-01-PEAR.md index 7c1a310f9..a6b206b1c 100644 --- a/_posts/04-03-01-PEAR.md +++ b/_posts/04-03-01-PEAR.md @@ -6,7 +6,7 @@ anchor: pear ## PEAR - PHP Extension and Application Repository {#pear_title} -Ein altbewährter Paketmanager, der von einigen PHP-Entwicklern geschätzt wird, ist [PEAR][1] +Ein altbewährter Paketmanager, der von einigen PHP-Entwicklern nach wie vor geschätzt wird, ist [PEAR][1] Er verhält sich ähnlich wie Composer, weist aber einige bemerkenswerte Unterschiede auf. PEAR erfordert für jedes Paket eine spezifische Struktur. Das bedeutet, dass der Autor des Pakets es für die Verwendung mit PEAR vorbereiten muss. Der Gebrauch eines Projekts, das nicht für die Verwendung mit PEAR vorbereitet wurde, ist unmöglich. From 6037bd49cd1716887e96085ac96c8a617e8cbe35 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:40:59 +0200 Subject: [PATCH 032/113] Update example.md --- pages/example.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/example.md b/pages/example.md index 81e01eb45..6ca99e434 100644 --- a/pages/example.md +++ b/pages/example.md @@ -3,7 +3,7 @@ layout: page title: Example Stand-Alone Page --- -# Page Title +# Seiten-Titel Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, From 667e9d4f3cd3a34f251cd9d1e264f8d7d07037cf Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 12:45:41 +0200 Subject: [PATCH 033/113] Update 05-02-01-The-Basics.md --- _posts/05-02-01-The-Basics.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/_posts/05-02-01-The-Basics.md b/_posts/05-02-01-The-Basics.md index dd5fc282f..18c57e763 100644 --- a/_posts/05-02-01-The-Basics.md +++ b/_posts/05-02-01-The-Basics.md @@ -3,11 +3,9 @@ isChild: true anchor: the_basics --- -## The Basics {#the_basics_title} +## Die Basics {#the_basics_title} -PHP is a vast language that allows coders of all levels the ability to produce code not only quickly, but efficiently. -However, while advancing through the language, we often forget the basics that we first learnt (or overlooked) in favor -of short cuts and/or bad habits. To help combat this common issue, this section is aimed at reminding coders of the -basic coding practices within PHP. +PHP ist eine umfangreiche Sprache, die es Programmierern aller Erfahrungsstufen ermöglicht, nicht nur schnell, sondern auch effizient Code zu schreiben. +Beim Erlernen der Sprache vergessen wir jedoch oft die Grundlagen, die wir anfangs gelernt haben (oder übersehen sie), und neigen zu Abkürzungen und/oder schlechten Angewohnheiten. Um diesem häufigen Problem entgegenzuwirken, soll dieser Abschnitt Programmierern die grundlegenden Programmierpraktiken in PHP in Erinnerung rufen. -* Continue reading on [The Basics](/pages/The-Basics.html) \ No newline at end of file +* Lies mehr zu [The Basics](/pages/The-Basics.html) From 5502c8d30a888820c69257353a82962ae717417c Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:34:11 +0200 Subject: [PATCH 034/113] Update The-Basics.md --- pages/The-Basics.md | 103 +++++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 54 deletions(-) diff --git a/pages/The-Basics.md b/pages/The-Basics.md index 1a1cb2922..e2278de6c 100644 --- a/pages/The-Basics.md +++ b/pages/The-Basics.md @@ -6,42 +6,39 @@ sitemap: true # The Basics -## Comparison operators +## Vergleichsoperatoren -Comparison operators are an often overlooked aspect of PHP, which can lead to many unexpected outcomes. One such -problem stems from strict comparisons (the comparison of booleans as integers). +Vergleichsoperatoren sind ein oft übersehener Aspekt von PHP, der zu vielen unerwarteten Ergebnissen führen kann. Ein solches Problem entsteht durch strikte Vergleiche (den Vergleich von Booleschen Werten mit Ganzzahlen). {% highlight php %} Date: Fri, 20 Jun 2025 14:42:20 +0200 Subject: [PATCH 035/113] Update The-Basics.md --- pages/The-Basics.md | 116 +++++++++++++++++++------------------------- 1 file changed, 49 insertions(+), 67 deletions(-) diff --git a/pages/The-Basics.md b/pages/The-Basics.md index e2278de6c..0e4dffab6 100644 --- a/pages/The-Basics.md +++ b/pages/The-Basics.md @@ -4,7 +4,7 @@ title: The Basics sitemap: true --- -# The Basics +# Die Basics ## Vergleichsoperatoren @@ -130,7 +130,7 @@ function array() * [Globaler Namensraum ](https://www.php.net/language.namespaces.global) * [Globale Namensregeln](https://www.php.net/userlandnaming.rules) -## Strings +## Strings (Zeichenketten) ### Verkettung @@ -153,20 +153,15 @@ $a = 'Mehrzeiliges Beispiel' // Verkettungs-Operator (.) * [Zeichenketten-Operatoren](https://www.php.net/language.operators.string) -### String types +### String Typen -Strings are a series of characters, which should sound fairly simple. That said, there are a few different types of -strings and they offer slightly different syntax, with slightly different behaviors. +Strings sind eine Anreihung von Zeichen, was recht einfach klingt. Es gibt jedoch verschiedene String-Typen mit leicht unterschiedlicher Syntax und leicht unterschiedlichem Verhalten. -#### Single quotes +#### Einfache Anführungszeichen -Single quotes are used to denote a "literal string". Literal strings do not attempt to parse special characters or -variables. - -If using single quotes, you could enter a variable name into a string like so: `'some $thing'`, and you would see the -exact output of `some $thing`. If using double quotes, that would try to evaluate the `$thing` variable name and show -errors if no variable was found. +Einfache Anführungszeichen kennzeichnen einen "literalen string". Literale Strings versuchen nicht, Sonderzeichen oder Variablen zu analysieren. +Wenn Du einfache Anführungszeichen verwendest, kannst Du einen Variablennamen in eine Zeichenkette wie folgt eingeben: `'some $thing'`, und Sie erhalten die genaue Ausgabe `some $thing`. Wenn Sie doppelte Anführungszeichen verwenden, wird versucht, den Variablennamen `$thing` auszuwerten und ein Fehler erzeugt, wenn die Variable nicht gefunden wird. {% highlight php %} It should be noted that multiline strings can also be formed by continuing them across multilines in a statement. _e.g._ +> Es ist zu beachten, dass mehrzeilige Zeichenfolgen auch dadurch gebildet werden können, dass sie in einer Anweisung über mehrere Zeilen hinweg fortgesetzt werden. _z.B._ {% highlight php %} $str = " @@ -305,29 +296,24 @@ $a are parsed. */ {% endhighlight %} -### Which is quicker? +### Was ist schneller? -There is a myth floating around that single quote strings are fractionally quicker than double quote strings. This is -fundamentally not true. +Es gibt den Mythos, dass Zeichenfolgen mit einfachen Anführungszeichen geringfügig schneller sind als Zeichenfolgen mit doppelten Anführungszeichen. Das ist grundsätzlich falsch. -If you are defining a single string and not trying to concatenate values or anything complicated, then either a single -or double quoted string will be entirely identical. Neither are quicker. +Wenn Sie eine einzelne Zeichenfolge definieren und nicht versuchen, Werte zu verketten oder etwas Kompliziertes zu verwenden, ist eine Zeichenfolge in einfachen oder doppelten Anführungszeichen völlig identisch. Beides ist nicht schneller. -If you are concatenating multiple strings of any type, or interpolate values into a double quoted string, then the -results can vary. If you are working with a small number of values, concatenation is minutely faster. With a lot of -values, interpolating is minutely faster. +Wenn Sie mehrere Zeichenfolgen beliebigen Typs verketten oder Werte in eine Zeichenfolge in Anführungszeichen interpolieren, können die Ergebnisse variieren. Bei wenigen Werten ist die Verkettung geringfügig schneller. +Bei vielen Werten ist die Interpolation geringfügig schneller. -Regardless of what you are doing with strings, none of the types will ever have any noticeable impact on your -application. Trying to rewrite code to use one or the other is always an exercise in futility, so avoid this -micro-optimization unless you really understand the meaning and impact of the differences. +Unabhängig davon, was Sie mit Zeichenfolgen tun, hat keiner der Typen jemals spürbare Auswirkungen auf Ihre Anwendung. Der Versuch, Code umzuschreiben, um den einen oder anderen Typ zu verwenden, ist immer sinnlos. +Vermeiden Sie daher diese Mikrooptimierung, es sei denn, Sie verstehen die Bedeutung und die Auswirkungen der Unterschiede wirklich. * [Disproving the Single Quotes Performance Myth](https://www.npopov.com/2012/01/09/Disproving-the-Single-Quotes-Performance-Myth.html) -## Ternary operators +## Der ternäre Operator -Ternary operators are a great way to condense code, but are often used in excess. While ternary operators can be -stacked/nested, it is advised to use one per line for readability. +Der ternäre Operator eignet sich hervorragend um Code zu verdichten, wird aber oft übermäßig verwendet. Ternäre Operatoren können zwar gestapelt/verschachtelt werden, aus Gründen der Lesbarkeit wird jedoch empfohlen, einen Operator pro Zeile zu verwenden. {% highlight php %} =` etc). -#### Utilising brackets with ternary operators for form and function +#### Verwendung von Klammern mit ternären Operatoren für Form und Funktion -When utilising a ternary operator, brackets can play their part to improve code readability and also to include unions -within blocks of statements. An example of when there is no requirement to use bracketing is: +Bei der Verwendung eines ternären Operators können Klammern dazu beitragen, die Lesbarkeit des Codes zu verbessern und Unions in Anweisungsblöcke einzuschließen. +Ein Beispiel dafür, wann Klammern nicht erforderlich sind, ist: {% highlight php %} Date: Fri, 20 Jun 2025 15:11:05 +0200 Subject: [PATCH 036/113] Update 05-02-01-The-Basics.md --- _posts/05-02-01-The-Basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/05-02-01-The-Basics.md b/_posts/05-02-01-The-Basics.md index 18c57e763..7e3b4202d 100644 --- a/_posts/05-02-01-The-Basics.md +++ b/_posts/05-02-01-The-Basics.md @@ -8,4 +8,4 @@ anchor: the_basics PHP ist eine umfangreiche Sprache, die es Programmierern aller Erfahrungsstufen ermöglicht, nicht nur schnell, sondern auch effizient Code zu schreiben. Beim Erlernen der Sprache vergessen wir jedoch oft die Grundlagen, die wir anfangs gelernt haben (oder übersehen sie), und neigen zu Abkürzungen und/oder schlechten Angewohnheiten. Um diesem häufigen Problem entgegenzuwirken, soll dieser Abschnitt Programmierern die grundlegenden Programmierpraktiken in PHP in Erinnerung rufen. -* Lies mehr zu [The Basics](/pages/The-Basics.html) +* Lies mehr zu [Die Basics](/pages/The-Basics.html) From 2e367ee53652a496309c2e742041ba9c55726eae Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 15:38:56 +0200 Subject: [PATCH 037/113] Update 05-03-01-Date-and-Time.md --- _posts/05-03-01-Date-and-Time.md | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/_posts/05-03-01-Date-and-Time.md b/_posts/05-03-01-Date-and-Time.md index b8fe73819..0f578aba4 100644 --- a/_posts/05-03-01-Date-and-Time.md +++ b/_posts/05-03-01-Date-and-Time.md @@ -4,15 +4,12 @@ isChild: true anchor: date_and_time --- -## Date and Time {#date_and_time_title} +## Date and Time (Datum und Uhrzeit) {#date_and_time_title} -PHP has a class named DateTime to help you when reading, writing, comparing or calculating with date and time. There -are many date and time related functions in PHP besides DateTime, but it provides nice object-oriented interface to -most common uses. DateTime can handle time zones, but that is outside the scope of this short introduction. +PHP verfügt über die Klasse DateTime, die Sie beim Lesen, Schreiben, Vergleichen oder Berechnen von Datum und Uhrzeit unterstützt. Neben DateTime bietet PHP viele weitere Funktionen für Datum und Uhrzeit. +Für die meisten gängigen Anwendungen bietet DateTime eine praktische objektorientierte Schnittstelle. DateTime kann Zeitzonen verarbeiten, dies geht jedoch über den Rahmen dieser kurzen Einführung hinaus. -To start working with DateTime, convert raw date and time string to an object with `createFromFormat()` factory method -or do `new DateTime` to get the current date and time. Use `format()` method to convert DateTime back to a string for -output. +Um mit DateTime zu arbeiten, konvertiere das Rohdaten und -zeiten mit der `createFromFormat()` Factory-Methode in ein Objekt oder rufe mit `new DateTime` das aktuelle Datum und die aktuelle Uhrzeit ab. Verwende die `format()`-Methode, um DateTime für die Ausgabe wieder in einen String umzuwandeln. {% highlight php %} format('Y-m-d') . PHP_EOL; {% endhighlight %} -Calculating with DateTime is possible with the DateInterval class. DateTime has methods like `add()` and `sub()` that -take a DateInterval as an argument. Do not write code that expects the same number of seconds in every day. Both daylight -saving and time zone alterations will break that assumption. Use date intervals instead. To calculate date difference -use the `diff()` method. It will return new DateInterval, which is super easy to display. +Berechnungen mit DateTime sind mit der Klasse DateInterval möglich. DateTime verfügt über Methoden wie `add()` und `sub()`, die ein DateInterval als Argument akzeptieren. +Schreibe keinen Code, der jeden Tag die gleiche Anzahl von Sekunden erwartet. Sowohl Sommerzeit- als auch Zeitzonenänderungen würden diese Annahme widerlegen. Verwende stattdessen Datumsintervalle. Um die Datumsdifferenz zu berechnen, verwenden Sie die `diff()`-Methode. Sie gibt ein neues DateInterval zurück, das sehr einfach darzustellen ist. {% highlight php %} format('%m month, %d days (total: %a days)') . PHP_ // Difference: 1 month, 6 days (total: 37 days) {% endhighlight %} -You can use standard comparisons on DateTime objects: +Sie können Standardvergleiche für DateTime-Objekte verwenden: {% highlight php %} Date: Fri, 20 Jun 2025 15:47:40 +0200 Subject: [PATCH 038/113] Update 05-04-01-Design-Patterns.md --- _posts/05-04-01-Design-Patterns.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/_posts/05-04-01-Design-Patterns.md b/_posts/05-04-01-Design-Patterns.md index 41cdfb694..a0f176a82 100644 --- a/_posts/05-04-01-Design-Patterns.md +++ b/_posts/05-04-01-Design-Patterns.md @@ -3,18 +3,13 @@ isChild: true anchor: design_patterns --- -## Design Patterns {#design_patterns_title} +## Design Patterns (Entwurfsmuster) {#design_patterns_title} -When you are building your application it is helpful to use common patterns in your code and common patterns for the -overall structure of your project. Using common patterns is helpful because it makes it much easier to manage your code -and lets other developers quickly understand how everything fits together. +Beim Erstellen Deine Anwendung ist es hilfreich, allgemeine Muster im Code und für die Gesamtstruktur Deines Projekts zu verwenden. Die Verwendung allgemeiner Muster erleichtert die Verwaltung Deines Codes erheblich und ermöglicht anderen Entwicklern ein schnelles Verständnis wie in Deinem Code alles miteinander zusammenhängt. -If you use a framework then most of the higher level code and project structure will be based on that framework, so a -lot of the pattern decisions are made for you. But it is still up to you to pick out the best patterns to follow in the -code you build on top of the framework. If, on the other hand, you are not using a framework to build your application -then you have to find the patterns that best suit the type and size of application that you're building. +Wenn Du ein Framework verwendest, basiert der Großteil des übergeordneten Codes und der Projektstruktur auf diesem Framework. Daher werden dann viele Musterentscheidungen für Dich getroffen. Du musst jedoch weiterhin die besten Muster für Deinen Code auswählen, wenn dieser auf dem Framework basiert. Wenn Du hingegen kein Framework zur Erstellung Deiner Anwendung verwendest, musst Du Muster finden, die am besten zu Art und Größe Deiner Anwendung passen. -You can learn more about PHP design patterns and see working examples at: +Weitere Informationen zu PHP-Entwurfsmustern und funktionierende Beispiele findest Du unter: * * [https://designpatternsphp.readthedocs.io/](https://designpatternsphp.readthedocs.io/en/latest/) ([PDF download](https://www.computer-pdf.com/web-programming/php/924-tutorial-designpatternsphp-documentation.html)) From a5d2cead447770affc9133c497dd36de32257a7f Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 16:49:12 +0200 Subject: [PATCH 039/113] Update 05-05-01-PHP-and-UTF8.md --- _posts/05-05-01-PHP-and-UTF8.md | 70 ++++++++++++++------------------- 1 file changed, 29 insertions(+), 41 deletions(-) diff --git a/_posts/05-05-01-PHP-and-UTF8.md b/_posts/05-05-01-PHP-and-UTF8.md index cf1334ad0..61c0820bf 100644 --- a/_posts/05-05-01-PHP-and-UTF8.md +++ b/_posts/05-05-01-PHP-and-UTF8.md @@ -4,73 +4,61 @@ isChild: true anchor: php_and_utf8 --- -## Working with UTF-8 {#php_and_utf8_title} +## Arbeiten mit UTF-8 {#php_and_utf8_title} -_This section was originally written by [Alex Cabal](https://alexcabal.com/) over at -[PHP Best Practices](https://phpbestpractices.org/#utf-8) and has been used as the basis for our own UTF-8 advice_. +_Dieser Abschnitt wurde ursprünglich von [Alex Cabal](https://alexcabal.com/) für [PHP Best Practices](https://phpbestpractices.org/#utf-8) geschrieben und diente als Grundlage für unsere eigenen UTF-8-Empfehlungen_. -### There's no one-liner. Be careful, detailed, and consistent. +### Es gibt keinen Einzeiler. Seien Sie sorgfältig, detailliert und konsistent. -Right now PHP does not support Unicode at a low level. There are ways to ensure that UTF-8 strings are processed OK, -but it's not easy, and it requires digging in to almost all levels of the web app, from HTML to SQL to PHP. We'll aim -for a brief, practical summary. +PHP unterstützt Unicode derzeit nicht auf niedriger Ebene. Es gibt Möglichkeiten, die korrekte Verarbeitung von UTF-8-Strings sicherzustellen, +aber das ist nicht einfach und erfordert die Auseinandersetzung mit fast allen Ebenen der Webanwendung, von HTML über SQL bis hin zu PHP. +Wir geben hier eine kurze, praktische Zusammenfassung. -### UTF-8 at the PHP level +### UTF-8 auf PHP-Ebene -The basic string operations, like concatenating two strings and assigning strings to variables, don't need anything -special for UTF-8. However, most string functions, like `strpos()` and `strlen()`, do need special consideration. These -functions often have an `mb_*` counterpart: for example, `mb_strpos()` and `mb_strlen()`. These `mb_*` strings are made -available to you via the [Multibyte String Extension], and are specifically designed to operate on Unicode strings. +Die grundlegenden String-Operationen, wie das Verketten zweier Strings und das Zuweisen von Strings zu Variablen, erfordern für UTF-8 keine besonderen Anforderungen. +Die meisten String-Funktionen, wie `strpos()` und `strlen()`, erfordern jedoch besondere Aufmerksamkeit. Diese Funktionen haben oft ein `mb_*` Gegenstück, beispielsweise `mb_strpos()` and `mb_strlen()`. Diese`mb_*`-Strings werden Dir über die [Multibyte String Extension] zur Verfügung gestellt und sind speziell für die Verarbeitung von Unicode-Strings konzipiert. -You must use the `mb_*` functions whenever you operate on a Unicode string. For example, if you use `substr()` on a -UTF-8 string, there's a good chance the result will include some garbled half-characters. The correct function to use -would be the multibyte counterpart, `mb_substr()`. +Du musst die `mb_*`-Funktionen immer dann verwenden, wenn Du mit einer Unicode-Zeichenfolge arbeitest. Wenn Du `substr()` auf eine UTF-8-Zeichenfolge anwendet, +besteht eine grosse Möglichkeit, dass das Ergebnis einige unleserliche Halbzeichen enthält. Die korrekte Funktion wäre das Multibyte-Gegenstück `mb_substr()`. -The hard part is remembering to use the `mb_*` functions at all times. If you forget even just once, your Unicode -string has a chance of being garbled during further processing. +Das Schwierige ist, immer daran zu denken, die `mb_*`-Funktionen zu verwenden. Wenn Du es auch nur einmal vergisst, besteht die Gefahr, dass Deine Unicode-Zeichenfolge bei der weiteren Verarbeitung verstümmelt wird. -Not all string functions have an `mb_*` counterpart. If there isn't one for what you want to do, then you might be out -of luck. +Nicht alle String-Funktionen haben ein `mb_*`-Gegenstück. Wenn es für Ihre Aufgabe keins gibt, haben Sie möglicherweise Pech gehabt. -You should use the `mb_internal_encoding()` function at the top of every PHP script you write (or at the top of your -global include script), and the `mb_http_output()` function right after it if your script is outputting to a browser. -Explicitly defining the encoding of your strings in every script will save you a lot of headaches down the road. +Du solltest die`mb_internal_encoding()`-Funktion am Anfang jedes PHP-Skripts (oder am Anfang Ihres globalen Include-Skripts) verwenden und die `mb_http_output()`-Funktion direkt dahinter, +wenn Dein Skript an einen Browser ausgegeben wird. Die explizite Definition der Zeichenkettenkodierung in jedem Skript erspart Dir später viel Ärger. -Additionally, many PHP functions that operate on strings have an optional parameter letting you specify the character -encoding. You should always explicitly indicate UTF-8 when given the option. For example, `htmlentities()` has an -option for character encoding, and you should always specify UTF-8 if dealing with such strings. Note that as of PHP 5.4.0, UTF-8 is the default encoding for `htmlentities()` and `htmlspecialchars()`. +Darüber hinaus verfügen viele PHP-Funktionen, die mit Zeichenfolgen arbeiten, über einen optionalen Parameter, mit dem Sie die Zeichenkodierung festlegen können. +Geben Sie bei dieser Option immer explizit UTF-8 an. +Beispielsweise bietet `htmlentities()` eine Option für die Zeichenkodierung, und Du solltest bei der Verarbeitung solcher Zeichenfolgen immer UTF-8 angeben. Beachte, dass ab PHP 5.4.0 UTF-8 die Standardkodierung für `htmlentities()` und `htmlspecialchars()`ist. -Finally, If you are building a distributed application and cannot be certain that the `mbstring` extension will be -enabled, then consider using the [symfony/polyfill-mbstring] Composer package. This will use `mbstring` if it is available, and -fall back to non UTF-8 functions if not. +Abschießend, wenn Du eine verteilte Anwendung erstellst und nicht sicher bist, ob die `mbstring`-Erweiterung verwendbar ist, solltest Du das Composer-Paket [symfony/polyfill-mbstring] verwenden. +Dieses wird `mbstring` bei Verfügbarkeit verwenden und greift andernfalls auf Nicht-UTF-8-Funktionen zurück. [Multibyte String Extension]: https://www.php.net/book.mbstring [symfony/polyfill-mbstring]: https://packagist.org/packages/symfony/polyfill-mbstring -### UTF-8 at the Database level +### UTF-8 auf Datenbankebene -If your PHP script accesses MySQL, there's a chance your strings could be stored as non-UTF-8 strings in the database -even if you follow all of the precautions above. +Wenn Dein PHP-Skript auf MySQL zugreift, besteht die Möglichkeit, dass Deine Strings als Nicht-UTF-8-Strings in der Datenbank gespeichert werden, selbst wenn Sie alle oben genannten Vorsichtsmaßnahmen befolgen. -To make sure your strings go from PHP to MySQL as UTF-8, make sure your database and tables are all set to the -`utf8mb4` character set and collation, and that you use the `utf8mb4` character set in the PDO connection string. See -example code below. This is _critically important_. +Um sicherzustellen, dass Dein Strings von PHP in UTF-8 an MySQL übertragen werden, stelle sicher, dass Ihre Datenbank und Tabellen auf den `utf8mb4` entsprechenden Zeichensatz und die entsprechende Sortierung eingestellt sind und dass Sie den `utf8mb4` Zeichensatz im PDO-Connection-String verwendest. Siehe untensthender Beispielcode. Das ist _äußerst wichtig_. -Note that you must use the `utf8mb4` character set for complete UTF-8 support, not the `utf8` character set! See -Further Reading for why. +Beachte, dass Du für die vollständige UTF-8-Unterstützung den `utf8mb4`-Zeichensatz verwenden musst, nicht den `utf8`-Zeichensatz! Weitere Informationen findest Du im Abschnitt „Weitere Informationen“. -### UTF-8 at the browser level +### UTF-8 auf Browserebene -Use the `mb_http_output()` function to ensure that your PHP script outputs UTF-8 strings to your browser. +Verwende die `mb_http_output()`-Funktion, um sicherzustellen, dass Dein PHP-Skript wirklich UTF-8-Zeichenfolgen an Deinen Browser ausgibt. -The browser will then need to be told by the HTTP response that this page should be considered as UTF-8. Today, it is common to set the character set in the HTTP response header like this: +Der Browser muss dann durch die HTTP-Response informiert werden, dass diese Seite als UTF-8 betrachtet werden soll. Heutzutage ist es üblich, den Zeichensatz im HTTP-Response-Header wie folgt festzulegen: {% highlight php %} ` tag](http://htmlpurifier.org/docs/enduser-utf8.html) in your page's `` tag. +Der bisherige Ansatz hierfür bestand darin, das [charset ``-Tag](http://htmlpurifier.org/docs/enduser-utf8.html) in das ``-Tag Ihrer Seite aufzunehmen. {% highlight php %} {% endhighlight %} -### Further reading +### Weiterführende Literatur * [PHP Manual: String Operations](https://www.php.net/language.operators.string) * [PHP Manual: String Functions](https://www.php.net/ref.strings) From d9249134219fca94ec9c37f0b8e297ac2a551d08 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 17:28:33 +0200 Subject: [PATCH 040/113] Update 05-06-01-Internationalization-and-Localization.md --- ...1-Internationalization-and-Localization.md | 103 +++++++++--------- 1 file changed, 49 insertions(+), 54 deletions(-) diff --git a/_posts/05-06-01-Internationalization-and-Localization.md b/_posts/05-06-01-Internationalization-and-Localization.md index f4d1d6566..41c2405b1 100644 --- a/_posts/05-06-01-Internationalization-and-Localization.md +++ b/_posts/05-06-01-Internationalization-and-Localization.md @@ -4,61 +4,56 @@ isChild: true anchor: i18n_l10n --- -## Internationalization (i18n) and Localization (l10n) {#i18n_l10n_title} - -_Disclaimer for newcomers: i18n and l10n are numeronyms, a kind of abbreviation where numbers are used to shorten -words - in our case, internationalization becomes i18n and localization, l10n._ - -First of all, we need to define those two similar concepts and other related things: - -- **Internationalization** is when you organize your code so it can be adapted to different languages or regions -without refactorings. This action is usually done once - preferably, at the beginning of the project, or else you will -probably need some huge changes in the source! -- **Localization** happens when you adapt the interface (mainly) by translating contents, based on the i18n work done -before. It usually is done every time a new language or region needs support and is updated when new interface pieces -are added, as they need to be available in all supported languages. -- **Pluralization** defines the rules required between distinct languages to interoperate strings containing numbers and -counters. For instance, in English when you have only one item, it is singular, and anything different from that is -called plural; plural in this language is indicated by adding an S after some words, and sometimes changes parts of it. -In other languages, such as Russian or Serbian, there are two plural forms in addition to the singular - you may even -find languages with a total of four, five or six forms, such as Slovenian, Irish or Arabic. - -## Common ways to implement -The easiest way to internationalize PHP software is by using array files and using those strings in templates, such as -`

`. This way is, however, hardly recommended for serious projects, as it poses -some maintenance issues along the road - some might appear in the very beginning, such as pluralization. So, please, -don't try this if your project will contain more than a couple of pages. - -The most classic way and often taken as reference for i18n and l10n is a [Unix tool called `gettext`][gettext]. It dates -back to 1995 and is still a complete implementation for translating software. It is easy enough to get running, while -still sporting powerful supporting tools. It is about Gettext we will be talking here. Also, to help you not get messy -over the command-line, we will be presenting a great GUI application that can be used to easily update your l10n source. - -### Other tools - -There are common libraries used that support Gettext and other implementations of i18n. Some of them may seem easier to -install or sport additional features or i18n file formats. In this document, we focus on the tools provided with the -PHP core, but here we list others for completion: - -- [aura/intl][aura-intl]: Provides internationalization (I18N) tools, specifically package-oriented per-locale message -translation. It uses array formats for messages. Does not provide a message extractor, but does provide advanced -message formatting via the `intl` extension (including pluralized messages). -- [php-gettext/Gettext][php-gettext]: Gettext support with an OO interface; includes improved helper functions, powerful -extractors for several file formats (some of them not supported natively by the `gettext` command), and can also export -to other formats besides `.mo/.po` files. Can be useful if you need to integrate your translation files into other -parts of the system, like a JavaScript interface. -- [symfony/translation][symfony]: supports a lot of different formats, but recommends using verbose XLIFF's. Doesn't -include helper functions nor a built-in extractor, but supports placeholders using `strtr()` internally. -- [laminas/laminas-i18n][laminas]: supports array and INI files, or Gettext formats. Implements a caching layer to save you from -reading the filesystem every time. It also includes view helpers, and locale-aware input filters and validators. -However, it has no message extractor. - -Other frameworks also include i18n modules, but those are not available outside of their codebases: - -- [Laravel] supports basic array files, has no automatic extractor but includes a `@lang` helper for template files. +## Internationalization (i18n) und Localization (l10n) {#i18n_l10n_title} + +_Disclaimer für Neulinge: i18n und l10n sind Numeronyme, eine Art Abkürzung, bei der Zahlen zum Verkürzen von Wörtern verwendet werden – in unserem Fall wird Internationalisierung zu i18n und Lokalisierung zu l10n._ + +Zunächst müssen wir diese beiden ähnlichen Konzepte und andere damit zusammenhängende Dinge definieren: + +- **Internationalisierun**g bedeutet, dass Du Deinen Code so organisierst, dass er ohne Refactoring (Überarbeitung, Neustrukturierung) an verschiedene Sprachen oder Regionen angepasst werden kann. +Diese Aktion wird in der Regel einmalig durchgeführt – vorzugsweise zu Beginn des Projekts, da sonst wahrscheinlich umfangreiche Änderungen im Quellcode erforderlich sind! +- **Lokalisierung** erfolgt, wenn Du die Benutzeroberfläche (hauptsächlich) durch die Übersetzung von Inhalten anpasst, basierend auf den zuvor durchgeführten i18n-Arbeiten. +- Sie wird üblicherweise jedes Mal durchgeführt, wenn eine neue Sprache oder Region unterstützt werden muss, und wird aktualisiert, wenn neue Benutzeroberflächenelemente hinzugefügt werden, da diese in allen unterstützten Sprachen verfügbar sein müssen. +- **Pluralbildung** definiert die Regeln, die zwischen verschiedenen Sprachen für die Interoperabilität von Zeichenfolgen mit Zahlen und Zählern gelten. +Im Englischen steht z.B ein einzelnes Element im Singular, alles andere wird als Plural bezeichnet. +Der Plural wird in dieser Sprache durch das Anhängen eines „S“ an einige Wörter angezeigt und verändert manchmal Teile davon. +In anderen Sprachen, wie Russisch oder Serbisch, gibt es neben dem Singular zwei Pluralformen – es gibt sogar Sprachen mit insgesamt vier, fünf oder sechs Formen, wie Slowenisch, Irisch oder Arabisch. + +## Gängige Implementierungsmethoden + +Der einfachste Weg, PHP-Software zu internationalisieren, ist die Verwendung von Array-Dateien und deren Strings in Vorlagen wie z.B. `

`. +Dieser Weg ist jedoch für ernsthafte Projekte kaum zu empfehlen, da er im Laufe der Zeit einige Wartungsprobleme mit sich bringt – einige davon können bereits zu Beginn auftreten, wie z. B. die Pluralisierung. +Versuchen Sie diesen Weg daher bitte nicht, wenn Ihr Projekt mehr als ein paar Seiten umfasst. + +Der klassischste Weg und oft als Referenz für i18n und l10n verwendet, ist ein [Unix-Tool namens `gettext`][gettext]. +Es stammt aus dem Jahr 1995 und ist noch immer eine vollständige Implementierung für die Übersetzung von Software. Es ist einfach zu bedienen und bietet leistungsstarke Tools. +Wir werden hier Gettext besprechen. Damit Sie sich nicht mit der Kommandozeile herumschlagen müssen, stellen wir Ihnen eine praktische GUI-Anwendung vor, mit der Sie Ihren l10n-Quellcode einfach aktualisieren können. + +### Andere Werkzeuge + +Es gibt gängige Bibliotheken, die Gettext und andere i18n-Implementierungen unterstützen. +Einige davon sind möglicherweise einfacher zu installieren oder bieten zusätzliche Funktionen oder i18n-Dateiformate. +In diesem Dokument konzentrieren wir uns auf die Tools, die im PHP-Kern enthalten sind. Zur Vervollständigung listen wir hier weitere auf: + + +- [aura/intl][aura-intl]: Bietet Internationalisierungstools (I18N), insbesondere paketorientierte Nachrichtenübersetzung pro Gebietsschema. +Es verwendet Array-Formate für Messages. Es bietet keinen Message-Extraktor, ermöglicht aber erweiterte Nachrichtenformatierung über die intlErweiterung (einschließlich pluralisierter Nachrichten). +- [php-gettext/Gettext][php-gettext]: Gettext-Unterstützung mit OO-Schnittstelle; enthält verbesserte Hilfsfunktionen, leistungsstarke Extraktoren für verschiedene Dateiformate (einige davon werden vom `gettext`-Befehl nicht nativ unterstützt) und kann auch in andere Formate als `.mo/.po`-Dateien exportieren. Dies ist nützlich, +wenn Sie Ihre Übersetzungsdateien in andere Systemkomponenten, beispielsweise eine JavaScript-Schnittstelle, integrieren müssen. +- [symfony/translation][symfony]: Unterstützt viele verschiedene Formate, empfiehlt aber die Verwendung ausführlicher XLIFF-Dateien. Enthält weder Hilfsfunktionen noch einen integrierten Extraktor, unterstützt aber die Verwendung von Platzhaltern mit interner `strtr()`-Nutzung. +- [laminas/laminas-i18n][laminas]: : Unterstützt Array- und INI-Dateien sowie Gettext-Formate. +Implementiert eine Caching-Ebene, damit Du das Dateisystem nicht jedes Mal neu einlesen must. Es enthält außerdem View-Helper sowie lokal angepasste Eingabefilter und Validatoren. Es gibt jedoch keinen Message-Extraktor. + +Andere Frameworks enthalten auch i18n-Module, diese sind jedoch außerhalb ihrer Codebasen nicht verfügbar: + +- [Laravel] unterstützt grundlegende Array-Dateien, hat keinen automatischen Extractor, enthält aber einen `@lang` Helper für Vorlagendateien. - [Yii] supports array, Gettext, and database-based translation, and includes a messages extractor. It is backed by the -[`Intl`][intl] extension, available since PHP 5.3, and based on the [ICU project]; this enables Yii to run powerful -replacements, like spelling out numbers, formatting dates, times, intervals, currency, and ordinals. +[`Intl`][intl] unterstützt Array-, Gettext- und datenbankbasierte Übersetzungen und enthält einen Nachrichtenextractor. +Die [Intl-Erweiterung][Intl] ist seit PHP 5.3 verfügbar und basiert auf dem [ICU-Projekt][ICU project]. +Dadurch kann Yii leistungsstarke Ersetzungen ausführen, beispielsweise Zahlen ausschreiben und Datum, Zeit, Intervalle, Währungsen und Ordinalzahlen formatieren. + +Wenn Du Dich für eine der Bibliotheken entscheidest, die keine Extractors bereitstellen,möchtst Du möglicherweise die Gettext-Formate verwenden, +sodass Du die ursprüngliche Gettext-Toolchain (einschließlich Poedit) verwenden kannst, wie im Rest des Kapitels beschrieben. If you decide to go for one of the libraries that provide no extractors, you may want to use the gettext formats, so you can use the original gettext toolchain (including Poedit) as described in the rest of the chapter. From 87710955a16b55f0b214d683c19f132cdec81451 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 17:59:22 +0200 Subject: [PATCH 041/113] Update 01-01-01-Getting-Started.md --- _posts/01-01-01-Getting-Started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-01-01-Getting-Started.md b/_posts/01-01-01-Getting-Started.md index 5b28d5536..f4cdd2a2c 100644 --- a/_posts/01-01-01-Getting-Started.md +++ b/_posts/01-01-01-Getting-Started.md @@ -1,5 +1,5 @@ --- -anchor: getting_started +anchor: php-aber-richtig/getting_started --- # Getting Started {#getting_started_title} From e8c67e512dc021b9d808703bf2a280bb330aefe4 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:00:02 +0200 Subject: [PATCH 042/113] Update 01-02-01-Use-the-Current-Stable-Version.md --- _posts/01-02-01-Use-the-Current-Stable-Version.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-02-01-Use-the-Current-Stable-Version.md b/_posts/01-02-01-Use-the-Current-Stable-Version.md index b3c3c7c96..8019bd5d7 100644 --- a/_posts/01-02-01-Use-the-Current-Stable-Version.md +++ b/_posts/01-02-01-Use-the-Current-Stable-Version.md @@ -1,7 +1,7 @@ --- title: Verwende die aktuelle stabile Version (8.4) isChild: true -anchor: use_the_current_stable_version +anchor: php-aber-richtig/use_the_current_stable_version --- ## Verwende die aktuelle stabile Version (8.4) {#use_the_current_stable_version_title} From 2fbd86cb2351a8efb7c9cbe7e247bf1a86475da9 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:00:26 +0200 Subject: [PATCH 043/113] Update 01-03-01-Built-in-Web-Server.md --- _posts/01-03-01-Built-in-Web-Server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-03-01-Built-in-Web-Server.md b/_posts/01-03-01-Built-in-Web-Server.md index 20d03de45..acace636f 100644 --- a/_posts/01-03-01-Built-in-Web-Server.md +++ b/_posts/01-03-01-Built-in-Web-Server.md @@ -1,7 +1,7 @@ --- title: Der mitgelieferte Web-Server isChild: true -anchor: builtin_web_server +anchor: php-aber-richtig/builtin_web_server --- ## Der mitgelieferte Web-Server {#builtin_web_server_title} From 8e42d4e6113c8338cd1b804fcf2db724f62a32bd Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:00:51 +0200 Subject: [PATCH 044/113] Update 01-07-01-Common-Directory-Structure.md --- _posts/01-07-01-Common-Directory-Structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-07-01-Common-Directory-Structure.md b/_posts/01-07-01-Common-Directory-Structure.md index 08c5924e0..58a021320 100644 --- a/_posts/01-07-01-Common-Directory-Structure.md +++ b/_posts/01-07-01-Common-Directory-Structure.md @@ -1,7 +1,7 @@ --- title: übliche Datei- und Verzeichnisstruktur isChild: true -anchor: common_directory_structure +anchor: php-aber-richtig/common_directory_structure --- ## Gemeinsame Datei- und Verzeichnisstruktur {#common_directory_structure_title} From 797c3a5acc628e1c7b0fde06708e5407052bca91 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:01:06 +0200 Subject: [PATCH 045/113] Update 01-06-01-Linux-Setup.md --- _posts/01-06-01-Linux-Setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-06-01-Linux-Setup.md b/_posts/01-06-01-Linux-Setup.md index 4f4d2f9c5..59605469e 100644 --- a/_posts/01-06-01-Linux-Setup.md +++ b/_posts/01-06-01-Linux-Setup.md @@ -1,6 +1,6 @@ --- isChild: true -anchor: linux_setup +anchor: php-aber-richtig/linux_setup --- ## Linux Setup {#linux_setup_title} From d1753e3ef9dfa87f13fec715f262f754cf1744b8 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:01:24 +0200 Subject: [PATCH 046/113] Update 01-05-01-Windows-Setup.md --- _posts/01-05-01-Windows-Setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-05-01-Windows-Setup.md b/_posts/01-05-01-Windows-Setup.md index ce8089fd0..9b3656612 100644 --- a/_posts/01-05-01-Windows-Setup.md +++ b/_posts/01-05-01-Windows-Setup.md @@ -1,6 +1,6 @@ --- isChild: true -anchor: windows_setup +anchor: php-aber-richtig/windows_setup --- ## Windows Setup {#windows_setup_title} From 447c67c3d99c935db1c7b212f290f1634796ae25 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:15:50 +0200 Subject: [PATCH 047/113] Delete CNAME --- CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 CNAME diff --git a/CNAME b/CNAME deleted file mode 100644 index 23ff9b6e1..000000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -phptherightway.com \ No newline at end of file From 038cbac03ebedf8178d8481edcbeb5d9b69291d6 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:18:41 +0200 Subject: [PATCH 048/113] Update 01-01-01-Getting-Started.md --- _posts/01-01-01-Getting-Started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-01-01-Getting-Started.md b/_posts/01-01-01-Getting-Started.md index f4cdd2a2c..5b28d5536 100644 --- a/_posts/01-01-01-Getting-Started.md +++ b/_posts/01-01-01-Getting-Started.md @@ -1,5 +1,5 @@ --- -anchor: php-aber-richtig/getting_started +anchor: getting_started --- # Getting Started {#getting_started_title} From aac95da586299c807c432cd951a5c58e4458fcc7 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:19:02 +0200 Subject: [PATCH 049/113] Update 01-02-01-Use-the-Current-Stable-Version.md --- _posts/01-02-01-Use-the-Current-Stable-Version.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-02-01-Use-the-Current-Stable-Version.md b/_posts/01-02-01-Use-the-Current-Stable-Version.md index 8019bd5d7..b3c3c7c96 100644 --- a/_posts/01-02-01-Use-the-Current-Stable-Version.md +++ b/_posts/01-02-01-Use-the-Current-Stable-Version.md @@ -1,7 +1,7 @@ --- title: Verwende die aktuelle stabile Version (8.4) isChild: true -anchor: php-aber-richtig/use_the_current_stable_version +anchor: use_the_current_stable_version --- ## Verwende die aktuelle stabile Version (8.4) {#use_the_current_stable_version_title} From ea8cd389a2d798eb04086fe99f9a3c4d4cffc492 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:19:26 +0200 Subject: [PATCH 050/113] Update 01-03-01-Built-in-Web-Server.md --- _posts/01-03-01-Built-in-Web-Server.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-03-01-Built-in-Web-Server.md b/_posts/01-03-01-Built-in-Web-Server.md index acace636f..20d03de45 100644 --- a/_posts/01-03-01-Built-in-Web-Server.md +++ b/_posts/01-03-01-Built-in-Web-Server.md @@ -1,7 +1,7 @@ --- title: Der mitgelieferte Web-Server isChild: true -anchor: php-aber-richtig/builtin_web_server +anchor: builtin_web_server --- ## Der mitgelieferte Web-Server {#builtin_web_server_title} From 83e13a38a2f60b69bccf95458cbfd320d515e06e Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:19:53 +0200 Subject: [PATCH 051/113] Update 01-05-01-Windows-Setup.md --- _posts/01-05-01-Windows-Setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-05-01-Windows-Setup.md b/_posts/01-05-01-Windows-Setup.md index 9b3656612..ce8089fd0 100644 --- a/_posts/01-05-01-Windows-Setup.md +++ b/_posts/01-05-01-Windows-Setup.md @@ -1,6 +1,6 @@ --- isChild: true -anchor: php-aber-richtig/windows_setup +anchor: windows_setup --- ## Windows Setup {#windows_setup_title} From b0b2a90abbf1c30307ee7004404151538fcc3eeb Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:20:14 +0200 Subject: [PATCH 052/113] Update 01-06-01-Linux-Setup.md --- _posts/01-06-01-Linux-Setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-06-01-Linux-Setup.md b/_posts/01-06-01-Linux-Setup.md index 59605469e..4f4d2f9c5 100644 --- a/_posts/01-06-01-Linux-Setup.md +++ b/_posts/01-06-01-Linux-Setup.md @@ -1,6 +1,6 @@ --- isChild: true -anchor: php-aber-richtig/linux_setup +anchor: linux_setup --- ## Linux Setup {#linux_setup_title} From 7e696b4f7346b30947fc24c5835d1c5ce2600528 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:20:33 +0200 Subject: [PATCH 053/113] Update 01-07-01-Common-Directory-Structure.md --- _posts/01-07-01-Common-Directory-Structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/01-07-01-Common-Directory-Structure.md b/_posts/01-07-01-Common-Directory-Structure.md index 58a021320..08c5924e0 100644 --- a/_posts/01-07-01-Common-Directory-Structure.md +++ b/_posts/01-07-01-Common-Directory-Structure.md @@ -1,7 +1,7 @@ --- title: übliche Datei- und Verzeichnisstruktur isChild: true -anchor: php-aber-richtig/common_directory_structure +anchor: common_directory_structure --- ## Gemeinsame Datei- und Verzeichnisstruktur {#common_directory_structure_title} From f610602b673e8d0deaf0d4bb801686d6646585f0 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:44:56 +0200 Subject: [PATCH 054/113] Update _config.yml --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 5cf96f51b..9ae4bd260 100644 --- a/_config.yml +++ b/_config.yml @@ -1,4 +1,4 @@ -baseurl: / +baseurl: /php-aber-richtig/ highlighter: rouge markdown: kramdown permalink: date From 89b14c428b4f727584f02441ac841d7055c027c0 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 18:52:47 +0200 Subject: [PATCH 055/113] Update _config.yml --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 9ae4bd260..c39446636 100644 --- a/_config.yml +++ b/_config.yml @@ -1,4 +1,4 @@ -baseurl: /php-aber-richtig/ +baseurl: /php-aber-richtig highlighter: rouge markdown: kramdown permalink: date From d03da71c007343e4cf0a32669d9b71c6ef9c53c5 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 19:01:53 +0200 Subject: [PATCH 056/113] Update 06-01-01-Dependency-Injection.md --- _posts/06-01-01-Dependency-Injection.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/_posts/06-01-01-Dependency-Injection.md b/_posts/06-01-01-Dependency-Injection.md index 0db3cb737..7c13067c8 100644 --- a/_posts/06-01-01-Dependency-Injection.md +++ b/_posts/06-01-01-Dependency-Injection.md @@ -3,13 +3,13 @@ title: Dependency Injection anchor: dependency_injection --- -# Dependency Injection {#dependency_injection_title} +# Dependency Injection (Abhängigkeiten-Injektion) {#dependency_injection_title} From [Wikipedia](https://wikipedia.org/wiki/Dependency_injection): -> Dependency injection is a software design pattern that allows the removal of hard-coded dependencies and makes it -> possible to change them, whether at run-time or compile-time. +>Dependency Injection ist ein Software-Entwurfsmuster, welches das Entfernen fest codierter Abhängigkeiten ermöglicht +>und deren Änderung sowohl zur Laufzeit als auch zur Kompilierzeit ermöglicht. -This quote makes the concept sound much more complicated than it actually is. Dependency Injection is providing a -component with its dependencies either through constructor injection, method calls or the setting of properties. It is -that simple. +Dieses Zitat lässt das Konzept viel komplizierter klingen, als es tatsächlich ist. +Dependency Injection stellt einer Komponente ihre Abhängigkeiten entweder durch Konstruktor-Injektion, +Methodenaufrufe oder das Setzen von Eigenschaften zur Verfügung. So einfach ist das. From d64834cfb71773daa5f7352890f695708665bba1 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 19:05:10 +0200 Subject: [PATCH 057/113] Update 04-01-01-Dependency-Management.md --- _posts/04-01-01-Dependency-Management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/04-01-01-Dependency-Management.md b/_posts/04-01-01-Dependency-Management.md index a0753feae..67932f37f 100644 --- a/_posts/04-01-01-Dependency-Management.md +++ b/_posts/04-01-01-Dependency-Management.md @@ -2,7 +2,7 @@ anchor: dependency_management --- -# Abhängigkeitsverwaltung {#dependency_management_title} +# Dependency Management (Abhängigkeiten-Verwaltung) {#dependency_management_title} Es gibt eine riesige Auswahl an PHP-Libraries, Frameworks und Komponenten. Ihr Projekt wird wahrscheinlich mehrere davon verwenden – dies sind Projektabhängigkeiten (Dependencies). PHP bot bisher keine gute Möglichkeit, diese Projektabhängigkeiten zu verwalten. Selbst bei manueller Verwaltung mussten Sie sich immer noch um Autoloader kümmern. Das ist kein Problem mehr. From 7f61042e2a9f0f2c2ee292d97a5dea1211e0f805 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Fri, 20 Jun 2025 19:06:12 +0200 Subject: [PATCH 058/113] Update 04-01-01-Dependency-Management.md --- _posts/04-01-01-Dependency-Management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/04-01-01-Dependency-Management.md b/_posts/04-01-01-Dependency-Management.md index 67932f37f..356a18ab6 100644 --- a/_posts/04-01-01-Dependency-Management.md +++ b/_posts/04-01-01-Dependency-Management.md @@ -6,7 +6,7 @@ anchor: dependency_management Es gibt eine riesige Auswahl an PHP-Libraries, Frameworks und Komponenten. Ihr Projekt wird wahrscheinlich mehrere davon verwenden – dies sind Projektabhängigkeiten (Dependencies). PHP bot bisher keine gute Möglichkeit, diese Projektabhängigkeiten zu verwalten. Selbst bei manueller Verwaltung mussten Sie sich immer noch um Autoloader kümmern. Das ist kein Problem mehr. -Derzeit gibt es zwei wichtige Paketverwaltungssysteme für PHP: [Composer] und [PEAR] . Composer ist derzeit der beliebteste Paketmanager für PHP, PEAR war jedoch lange Zeit der am häufigsten verwendete Paketmanager. Es ist ratsam, die Geschichte von PEAR zu kennen, da Du möglicherweise auch dann noch Referenzen darauf findest, auch wenn Du es nie verwendest. +Derzeit gibt es zwei wichtige Paketverwaltungssysteme für PHP: [Composer] und [PEAR]. Composer ist derzeit der beliebteste Paketmanager für PHP, PEAR war jedoch lange Zeit der am häufigsten verwendete Paketmanager. Es ist ratsam, die Geschichte von PEAR zu kennen, da Du möglicherweise auch dann noch Referenzen darauf findest, auch wenn Du es nie verwendest. [Composer]: /#composer_and_packagist [PEAR]: /#pear From 6e8386b571337caf6e0423898136ffa0e19509ec Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 26 Jun 2025 19:52:05 +0200 Subject: [PATCH 059/113] Update 05-02-01-The-Basics.md --- _posts/05-02-01-The-Basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/05-02-01-The-Basics.md b/_posts/05-02-01-The-Basics.md index 7e3b4202d..cc8d0c56c 100644 --- a/_posts/05-02-01-The-Basics.md +++ b/_posts/05-02-01-The-Basics.md @@ -6,6 +6,6 @@ anchor: the_basics ## Die Basics {#the_basics_title} PHP ist eine umfangreiche Sprache, die es Programmierern aller Erfahrungsstufen ermöglicht, nicht nur schnell, sondern auch effizient Code zu schreiben. -Beim Erlernen der Sprache vergessen wir jedoch oft die Grundlagen, die wir anfangs gelernt haben (oder übersehen sie), und neigen zu Abkürzungen und/oder schlechten Angewohnheiten. Um diesem häufigen Problem entgegenzuwirken, soll dieser Abschnitt Programmierern die grundlegenden Programmierpraktiken in PHP in Erinnerung rufen. +Als Fortgeschrittene vergessen wir jedoch oft die Grundlagen, die wir anfangs gelernt haben (oder übersehen sie), und neigen zu Abkürzungen und/oder schlechten Angewohnheiten. Um diesem häufigen Problem entgegenzuwirken, soll dieser Abschnitt Programmierern die grundlegenden Programmierpraktiken in PHP in Erinnerung rufen. * Lies mehr zu [Die Basics](/pages/The-Basics.html) From cae1f4d230c18553cffee39d2df9ecbb65e1b0b2 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 26 Jun 2025 20:59:38 +0200 Subject: [PATCH 060/113] Update 05-06-01-Internationalization-and-Localization.md --- ...1-Internationalization-and-Localization.md | 115 +++++++----------- 1 file changed, 46 insertions(+), 69 deletions(-) diff --git a/_posts/05-06-01-Internationalization-and-Localization.md b/_posts/05-06-01-Internationalization-and-Localization.md index 41c2405b1..997ea00a9 100644 --- a/_posts/05-06-01-Internationalization-and-Localization.md +++ b/_posts/05-06-01-Internationalization-and-Localization.md @@ -4,7 +4,7 @@ isChild: true anchor: i18n_l10n --- -## Internationalization (i18n) und Localization (l10n) {#i18n_l10n_title} +## Internationalisierung (i18n) und Lokalisierung (l10n) {#i18n_l10n_title} _Disclaimer für Neulinge: i18n und l10n sind Numeronyme, eine Art Abkürzung, bei der Zahlen zum Verkürzen von Wörtern verwendet werden – in unserem Fall wird Internationalisierung zu i18n und Lokalisierung zu l10n._ @@ -52,53 +52,42 @@ Andere Frameworks enthalten auch i18n-Module, diese sind jedoch außerhalb ihrer Die [Intl-Erweiterung][Intl] ist seit PHP 5.3 verfügbar und basiert auf dem [ICU-Projekt][ICU project]. Dadurch kann Yii leistungsstarke Ersetzungen ausführen, beispielsweise Zahlen ausschreiben und Datum, Zeit, Intervalle, Währungsen und Ordinalzahlen formatieren. -Wenn Du Dich für eine der Bibliotheken entscheidest, die keine Extractors bereitstellen,möchtst Du möglicherweise die Gettext-Formate verwenden, +Wenn Du Dich für eine der Bibliotheken entscheidest, die keine Extractors bereitstellen, möchtst Du möglicherweise die Gettext-Formate verwenden, sodass Du die ursprüngliche Gettext-Toolchain (einschließlich Poedit) verwenden kannst, wie im Rest des Kapitels beschrieben. -If you decide to go for one of the libraries that provide no extractors, you may want to use the gettext formats, so -you can use the original gettext toolchain (including Poedit) as described in the rest of the chapter. - ## Gettext ### Installation -You might need to install Gettext and the related PHP library by using your package manager, like `apt-get` or `yum`. -After installed, enable it by adding `extension=gettext.so` (Linux/Unix) or `extension=php_gettext.dll` (Windows) to -your `php.ini`. -Here we will also be using [Poedit] to create translation files. You will probably find it in your system's package -manager; it is available for Unix, macOS, and Windows, and can be [downloaded for free on their website][poedit_download] -as well. +Möglicherweise musst Du Gettext und die zugehörige PHP-Bibliothek mithilfe Deines Paketmanagers (z. B. `apt-get` or `yum` ) installieren. +Aktiviere die Funktion nach der Installation, indem Du `extension=gettext.so` (Linux/Unix) oder `extension=php_gettext.dll` (Windows) zu Deiner `php.ini` hinzufügst. + +Auch hier verwenden wir [Poedit] zum Erstellen von Übersetzungsdateien. Du wirst es wahrscheinlich im Paketmanager Deines Systems finden; es ist für Unix, macOS und Windows verfügbar und kann auch [kostenlos auf deren Website heruntergeladen][poedit_download] werden. -### Structure +### Struktur #### Types of files -There are three files you usually deal with while working with gettext. The main ones are PO (Portable Object) and -MO (Machine Object) files, the first being a list of readable "translated objects" and the second, the corresponding -binary to be interpreted by gettext when doing localization. There's also a POT (Template) file, which simply contains -all existing keys from your source files, and can be used as a guide to generate and update all PO files. Those template -files are not mandatory: depending on the tool you are using to do l10n, you can go just fine with only PO/MO files. -You will always have one pair of PO/MO files per language and region, but only one POT per domain. - -### Domains -There are some cases, in big projects, where you might need to separate translations when the same words convey -different meaning given a context. In those cases, you split them into different _domains_. They are, basically, named -groups of POT/PO/MO files, where the filename is the said _translation domain_. Small and medium-sized projects usually, -for simplicity, use only one domain; its name is arbitrary, but we will be using "main" for our code samples. -In [Symfony] projects, for example, domains are used to separate the translation for validation messages. - -#### Locale code -A locale is simply a code that identifies one version of a language. It is defined following the [ISO 639-1][639-1] and -[ISO 3166-1 alpha-2][3166-1] specs: two lower-case letters for the language, optionally followed by an underline and two -upper-case letters identifying the country or regional code. For [rare languages][rare], three letters are used. - -For some speakers, the country part may seem redundant. In fact, some languages have dialects in different -countries, such as Austrian German (`de_AT`) or Brazilian Portuguese (`pt_BR`). The second part is used to distinguish -between those dialects - when it is not present, it is taken as a "generic" or "hybrid" version of the language. - -### Directory structure -To use Gettext, we will need to adhere to a specific structure of folders. First, you will need to select an arbitrary -root for your l10n files in your source repository. Inside it, you will have a folder for each needed locale, and a -fixed `LC_MESSAGES` folder that will contain all your PO/MO pairs. Example: +Bei der Arbeit mit gettext arbeitest Du üblicherweise mit drei Dateien. Die wichtigsten sind PO- (Portable Object) und MO- (Machine Object) Dateien. Erstere ist eine Liste lesbarer "übersetzter Objekte" und letztere die entsprechende Binärdatei, die gettext bei der Lokalisierung interpretiert. +Es gibt außerdem eine POT-Datei (Template), die alle vorhandenen Schlüssel aus Deinen Quelldateien enthält und als Leitfaden zum Generieren und Aktualisieren aller PO-Dateien dient. Diese Template-Dateien sind nicht zwingend erforderlich: Je nach verwendetem l10n-Tool reichen PO/MO-Dateien aus. Du benötigst immer ein Paar PO/MO-Dateien pro Sprache und Region, aber nur eine POT-Datei pro Domänen. + +### Domänen +In großen Projekten kann es vorkommen, dass Übersetzungen getrennt werden müssen, wenn dieselben Wörter in einem bestimmten Kontext unterschiedliche Bedeutungen haben. In diesen Fällen werden sie in verschiedene _Domänen_ aufgeteilt. +Dabei handelt es sich im Wesentlichen um benannte Gruppen von POT-/PO-/MO-Dateien, wobei der Dateiname die jeweilige _Übersetzungsdomäne_ ist. +Kleine und mittelgroße Projekte verwenden der Einfachheit halber meist nur eine Domäne; ihr Name ist beliebig, wir verwenden für unsere Codebeispiele jedoch "main". +In [Symfony]-Projekten werden Domänen beispielsweise verwendet, um die Übersetzungen für Validierungsmeldungen zu trennen. + +#### Gebietsschemacode +Ein Gebietsschema ist einfach ein Code, der eine Version einer Sprache identifiziert. +Es wird gemäß den Spezifikationen [ISO 639-1][639-1] und +[ISO 3166-1 alpha-2][3166-1] definiert: Zwei Kleinbuchstaben für die Sprache, optional gefolgt von einem Unterstrich und zwei Großbuchstaben, die den Länder- oder Regionalcode kennzeichnen. +Für [seltene Sprachen][rare] werden drei Buchstaben verwendet. + +Für manche Sprechende mag der Länderteil überflüssig erscheinen. Tatsächlich haben einige Sprachen in verschiedenen Ländern Dialekte, wie zum Beispiel Österreichisches Deutsch (`de_AT`) oder brasilianisches Portugiesisch (`pt_BR`). +Der zweite Teil dient der Unterscheidung zwischen diesen Dialekten – fehlt er, wird er als "generische" oder "hybride" Version der Sprache angesehen. + +### Verzeichnisstruktur +Um Gettext verwenden zu können, benötigen wir eine bestimmte Ordnerstruktur. Wähle zunächst ein beliebiges Stammverzeichnis für Deine l10n-Dateien in Deinem Quell-Repository. +Darin findest Du einen Ordner für jedes benötigte Gebietsschema und einen festen `LC_MESSAGES` Ordner für alle PO/MO-Paare. Beispiel: {% highlight console %} @@ -124,31 +113,24 @@ fixed `LC_MESSAGES` folder that will contain all your PO/MO pairs. Example: └─ ... {% endhighlight %} -### Plural forms -As we said in the introduction, different languages might sport different plural rules. However, gettext saves us from -this trouble once again. When creating a new `.po` file, you will have to declare the [plural rules][plural] for that -language, and translated pieces that are plural-sensitive will have a different form for each of those rules. When -calling Gettext in code, you will have to specify the number related to the sentence, and it will work out the correct -form to use - even using string substitution if needed. +### Pluralformen +Wie bereits in der Einleitung erwähnt, können verschiedene Sprachen unterschiedliche Pluralregeln haben. +Gettext erspart uns jedoch auch dieses Problem. Beim Erstellen einer neuen `.po`-Datei musst Du die [Pluralregeln][plural] für die jeweilige Sprache angeben, und übersetzte Teile, die pluralsensitiv sind haben für jede dieser Regeln eine andere Form. +Beim Aufruf von Gettext im Code musst Du die Nummer des Satzes angeben, und Gettext ermittelt die korrekte Form – bei Bedarf sogar mithilfe von String-Ersetzungen. -Plural rules include the number of plurals available and a boolean test with `n` that would define in which rule the -given number falls (starting the count with 0). For example: +Pluralregeln enthalten die Anzahl der verfügbaren Pluralformen und einen Boole'schen Test auf `n`, der definiert, in welche Regel die angegebene Zahl fällt (beginnend mit 0). Beispiel: -- Japanese: `nplurals=1; plural=0` - only one rule -- English: `nplurals=2; plural=(n != 1);` - two rules, first if N is one, second rule otherwise -- Brazilian Portuguese: `nplurals=2; plural=(n > 1);` - two rules, second if N is bigger than one, first otherwise +- Japanisch: `nplurals=1; plural=0` - nur eine Regel +- Englisch: `nplurals=2; plural=(n != 1);` - zwei Regeln: Erste wenn N eins ist, andernfalls die zweite Regel +- Brazilian Portuguese: `nplurals=2; plural=(n > 1);` - zwei Regeln: Zweite, wenn N größer als eins ist, andernfalls erste Regel -Now that you understood the basis of how plural rules works - and if you didn't, please look at a deeper explanation -on the [LingoHub tutorial][lingohub_plurals] -, you might want to copy the ones you need from a [list][plural] instead -of writing them by hand. +Nachdem Du nun die Grundlagen der Pluralregeln verstanden hast (und falls nicht, sieh Dir bitte eine ausführlichere Erklärung im [LingoHub-Tutorial][lingohub_plurals] an), möchtst Du vielleicht die benötigten Regeln aus einer [Liste][plural] kopieren, anstatt sie von Hand zu schreiben. -When calling out Gettext to do localization on sentences with counters, you will have to provide it the -related number as well. Gettext will work out what rule should be in effect and use the correct localized version. -You will need to include in the `.po` file a different sentence for each plural rule defined. +Wenn Du Gettext aufrufst, um Sätze mit Zählern zu lokalisieren, musst Du auch die zugehörige Nummer angeben. Gettext ermittelt die anzuwendende Regel und verwendet die korrekte lokalisierte Version. +Für jede definierte Pluralregel musst Du einen anderen Satz in die `.po`-Datei aufnehmen. -### Sample implementation -After all that theory, let's get a little practical. Here's an excerpt of a `.po` file - don't mind with its format, -but with the overall content instead; you will learn how to edit it easily later: +### Beispielimplementierung +Nach all der Theorie kommen wir nun zur Praxis. Hier ist ein Ausschnitt einer `.po`-Datei – achte nicht auf das Format, sondern auf den Gesamtinhalt. Wie Du ihn einfach bearbeiten kannst, erfährst Du später: {% highlight po %} msgid "" @@ -169,16 +151,11 @@ msgstr[0] "Só uma mensagem não lida" msgstr[1] "%d mensagens não lidas" {% endhighlight %} -The first section works like a header, having the `msgid` and `msgstr` especially empty. It describes the file encoding, -plural forms and other things that are less relevant. -The second section translates a simple string from English to -Brazilian Portuguese, and the third does the same, but leveraging string replacement from [`sprintf`][sprintf] so the -translation may contain the user name and visit date. -The last section is a sample of pluralization forms, displaying -the singular and plural version as `msgid` in English and their corresponding translations as `msgstr` 0 and 1 -(following the number given by the plural rule). There, string replacement is used as well so the number can be seen -directly in the sentence, by using `%d`. The plural forms always have two `msgid` (singular and plural), so it is -advised not to use a complex language as the source of translation. +Der erste Abschnitt funktioniert wie eine Kopfzeile, wobei insbesondere `msgid` und `msgstr` leer sind. Er beschreibt die Dateikodierung, Pluralformen und andere weniger relevante Dinge. +Der zweite Abschnitt übersetzt eine einfache Zeichenfolge vom Englischen in brasilianisches Portugiesisch und der dritte macht dasselbe, nutzt jedoch die Zeichenfolgenersetzung aus [`sprintf`][sprintf], sodass die Übersetzung den Benutzernamen und das Besuchsdatum enthalten kann. +Der letzte Abschnitt ist ein Beispiel für Pluralformen, wobei die Singular- und Pluralversion im Englischen als `msgid` und die entsprechenden Übersetzungen als `msgstr` 0 und 1 angezeigt werden (entsprechend der durch die Pluralregel vorgegebenen Zahl). +Auch hier wird die Zeichenfolgenersetzung verwendet, sodass die Zahl mithilfe `%d` direkt im Satz angezeigt wird. +Die Pluralformen bestehen immer aus zwei `msgid` (Singular und Plural). Es wird daher empfohlen, keine komplexe Sprache als Übersetzungsquelle zu verwenden. ### Discussion on l10n keys As you might have noticed, we are using as source ID the actual sentence in English. That `msgid` is the same used From 3466327d45ecfcd133d0d05b058f10ef6ed56328 Mon Sep 17 00:00:00 2001 From: skipper-henrik <3627386+skipper-henrik@users.noreply.github.com> Date: Thu, 26 Jun 2025 22:57:36 +0200 Subject: [PATCH 061/113] Update default.html --- _layouts/default.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_layouts/default.html b/_layouts/default.html index 0727f1fcd..92a3a14a2 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -16,7 +16,7 @@