diff --git a/.github/list_languages b/.github/list_languages
new file mode 100755
index 00000000000..27ee2e7999e
--- /dev/null
+++ b/.github/list_languages
@@ -0,0 +1,35 @@
+#!/usr/bin/env python3
+
+import argparse
+import json
+import os
+from pathlib import Path
+
+
+def parse_langs(langs, include_beta):
+ for line in langs.readlines():
+ description = line[3:-7]
+ code = line[-5:-3]
+
+ if include_beta or 'beta' not in description:
+ yield code, description
+
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--include-beta', help='Include beta languages', default='false',
+ choices=('true', 'false'))
+ parser.add_argument('--langs-file', help='LANGS.md to use',
+ type=argparse.FileType('r', encoding='UTF-8'),
+ default=(Path(__file__).absolute().parent.parent / 'LANGS.md').as_posix())
+ args = parser.parse_args()
+
+ languages = dict(parse_langs(args.langs_file, args.include_beta == 'true'))
+
+ if 'GITHUB_ACTION' in os.environ:
+ print(f'::set-output name=languages::{json.dumps(list(languages.keys()))}')
+ for code, language in languages.items():
+ print(f'{language} ({code})')
+
+
+if __name__ == '__main__':
+ main()
diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml
new file mode 100644
index 00000000000..434e1f1aa4e
--- /dev/null
+++ b/.github/workflows/translations.yml
@@ -0,0 +1,54 @@
+name: Update translations
+
+on:
+ workflow_dispatch:
+ inputs:
+ include_beta:
+ type: boolean
+ default: false
+ description: Include beta languages
+
+env:
+ GIT_AUTHOR_NAME: Django Girls Automation
+ GIT_AUTHOR_EMAIL: automation@djangogirls.org
+
+jobs:
+ list_languages:
+ name: List languages
+ runs-on: ubuntu-latest
+ outputs:
+ languages: ${{ steps.set_list.outputs.languages }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Set the language list
+ id: set_list
+ run: ./.github/list_languages --include-beta ${{ inputs.include_beta }}
+
+ update_language:
+ name: 'Update ${{ matrix.language }} translations from Crowdin'
+ needs: list_languages
+ if: ${{ needs.list_languages.outputs.languages != '[]' }}
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ language: ${{ fromJson(needs.list_languages.outputs.languages) }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ - name: Update language
+ run: |
+ wget https://crowdin.com/backend/download/project/django-girls-tutorial/${{ matrix.language }}.zip
+ unzip ${{ matrix.language }}.zip
+ find ${{ matrix.language }} -name '*.md' -delete
+ rsync -av master/${{ matrix.language }}*/* ${{ matrix.language }}/
+ rm -rf ${{ matrix.language }}.zip master
+ - name: Open a PR
+ uses: peter-evans/create-pull-request@v3
+ with:
+ commit-message: "Update ${{ matrix.language }} translations from Crowdin"
+ branch: "update_translations/${{ matrix.language }}"
+ title: "Update ${{ matrix.language }} translations from Crowdin"
+ body: ''
+ delete-branch: true
diff --git a/de/code_editor/instructions.md b/de/code_editor/instructions.md
index 76ba1392ba1..02247da16b4 100644
--- a/de/code_editor/instructions.md
+++ b/de/code_editor/instructions.md
@@ -34,4 +34,4 @@ Erstens muss Code "plain text" (unformatierter Text) sein. Das Problem mit Progr
Ein weiterer Grund ist, dass Code-Editoren (bisweilen auch Programmier- oder Text-Editoren genannt) auf das Bearbeiten von Programm-Code spezialisiert sind und Funktionen aufweisen, die normale Textverarbeitungen nicht haben. Beispielsweise sogenanntes "Syntax-Highlighting", also farbliches Hervorheben bestimmter Code-Stellen, oder auch das automatische Schließen von Klammern und vieles mehr.
-Einiges davon werden wir später in Aktion sehen. Glaub uns: es wird nicht lange dauern, bis du deinen Code-Editor nicht mehr missen möchtest. :)
+Einiges davon werden wir später in Aktion sehen. Glaub uns: es wird nicht lange dauern, bis du deinen Code-Editor nicht mehr missen möchtest. :)
\ No newline at end of file
diff --git a/de/css/README.md b/de/css/README.md
index f439d56e9e9..e8c60622de8 100644
--- a/de/css/README.md
+++ b/de/css/README.md
@@ -21,7 +21,7 @@ Es wurde ursprünglich von ProgrammiererInnen bei Twitter geschrieben. Heute wir
{% filename %}blog/templates/blog/post_list.html{% endfilename %}
```html
-
+
```
Dadurch werden deinem Projekt keine Dateien hinzugefügt. Der Code verweist nur auf Dateien, die im Internet vorhanden sind. Öffne und aktualisiere also deine Webseite. Da ist sie!
@@ -116,7 +116,7 @@ Deine Datei sollte jetzt so aussehen:
Django Girls blog
-
+
@@ -268,14 +268,14 @@ h4 {
float: right;
}
-.btn-default,
-.btn-default:visited {
+.btn-secondary,
+.btn-secondary:visited {
color: #C25100;
background: none;
border-color: #C25100;
}
-.btn-default:hover {
+.btn-secondary:hover {
color: #FFFFFF;
background-color: #C25100;
}
diff --git a/de/deploy/README.md b/de/deploy/README.md
index f1478c9bd20..65438b9c14b 100644
--- a/de/deploy/README.md
+++ b/de/deploy/README.md
@@ -32,7 +32,26 @@ Git verwaltet die Veränderungen an einer Sammlung von Dateien in einem sogenann
Die Initialisierung des Git-Repositorys müssen wir für jedes Projekt nur einmal machen (danach musst Du Benutzernamen und Mail-Adresse nie wieder eingeben).
-Git wird die Änderungen an all den Dateien und Ordnern in diesem Verzeichnis aufzeichnen. Wir wollen aber, dass einige Dateien ignoriert werden. Dazu legen wir eine Datei `.gitignore` im Hauptordner (`djangogirls`) des Repos an. Öffne deinen Editor und erstelle eine neue Datei mit dem folgenden Inhalt:
+### Adjusting your branch name
+
+If the version of Git that you are using is older than **2.28**, you will need to change the name of your branch to "main". To determine the version of Git, please enter the following command:
+
+{% filename %}command-line{% endfilename %}
+
+ $ git --version
+ git version 2.xx...
+
+
+Only if the second number of the version, shown as "xx" above, is less than 28, will you need to enter the following command to rename your branch. If it is 28 or higher, please continue to "Ignoring files". As in "Initializing", this is something we need to do only once per project, as well as only when your version of Git is less than 2.28:
+
+{% filename %}command-line{% endfilename %}
+
+ $ git branch -M main
+
+
+### Ignoring files
+
+Git will track changes to all the files and folders in this directory, but there are some files we want it to ignore. We do this by creating a file called `.gitignore` in the base directory. Open up your editor and create a new file with the following contents:
{% filename %}.gitignore{% endfilename %}
@@ -46,10 +65,10 @@ Git wird die Änderungen an all den Dateien und Ordnern in diesem Verzeichnis au
myvenv/
venv/
- # Datenbank
+ # Database
db.sqlite3
- # Static Ordner im Projektverzeichnis
+ # Static folder at project root
/static/
# macOS
@@ -70,18 +89,18 @@ Git wird die Änderungen an all den Dateien und Ordnern in diesem Verzeichnis au
*.code-workspace
-Speichere die Datei mit dem Namen `.gitignore` im "djangogirls"-Root-Verzeichnis.
+Speichere die Datei mit dem Namen `.gitignore` im Verzeichnis "djangogirls".
> **Hinweis:** Der Punkt vor dem Dateinamen ist wichtig! Wenn du Schwierigkeiten beim Erstellen hast (z.B. lassen Macs im Finder keine Dateien mit Punkt am Anfang erzeugen, Punkt-Dateien sind auf Linux und OS X "versteckte Dateien"), dann verwende die "Speichern unter"-Funktion im Editor, das sollte immer funktionieren. Wichtig ist, dass du den Dateinamen nicht mit `.txt`, `.py` oder einer anderen Dateinamen-Erweiterung ergänzt -- die Datei wird von Git nur erkannt, wenn ihr Name exakt nur `.gitignore` ist. Linux und MacOS behandeln Dateien mit Namen, die mit `.` beginnen (wie `.gitignore`), als versteckt und der normale `ls`-Befehl zeigt diese Dateien nicht an. Verwende stattdessen `ls -a` um die Datei `.gitignore` anzuzeigen.
>
> **Hinweis:** Eine der Dateien, die du in deiner `.gitignore`-Datei defniniert hast, ist `db.sqlite3`. Diese Datei ist deine lokale Datenbank, in welcher alle deine Benutzer und Posts gespeichert werden. Wir werden die gängige Web-Entwicklungs-Praxis befolgen, was heißt, dass wir separate Datenbanken für unsere lokale Test-Website und unsere öffentliche Website auf PythonAnywhere verwenden werden. Die Datenbank für letztere könnte SQLite sein, wie auf deiner Entwicklungsmaschine, aber normalerweise wirst du eine sogenannte MySQL-Datenbank nutzen, welche mit viel mehr Besuchern umgehen kann als SQLite. So oder so, dadurch, dass du deine SQLite-Datenbank für die GitHub-Kopie nicht verwendest, werden alle deine bisherigen Posts der Superuser nur lokal zur Verfügung stehen und du musst in der produktiven Umgebung neue hinzufügen. Betrachte deine lokale Datenbank als tollen Spielplatz, auf welchem du verschiedene Dinge ausprobieren kannst, ohne Angst zu haben, dass du deine wirklichen Post auf deinem Blog löschst.
-Es ist hilfreich den Befehl `git status` vor `git add` auszuführen oder immer dann, wenn du dir unsicher bist, was geändert wurde. Das schützt vor manchen Überraschungen, wie z. B. das falsche Hinzufügen oder Übertragen von Dateien. Das `git status`-Kommando gibt Informationen über unbeobachtete/veränderte/hinzugefügte Dateien, den Status der Verzweigung und einiges mehr wieder. Deine Ausgabe sollte dem hier ähneln:
+It's a good idea to use a `git status` command before `git add` or whenever you find yourself unsure of what has changed. This will help prevent any surprises from happening, such as wrong files being added or committed. The `git status` command returns information about any untracked/modified/staged files, the branch status, and much more. The output should be similar to the following:
{% filename %}command-line{% endfilename %}
$ git status
- On branch master
+ On branch main
No commits yet
@@ -97,12 +116,12 @@ Es ist hilfreich den Befehl `git status` vor `git add` auszuführen oder immer d
nothing added to commit but untracked files present (use "git add" to track)
-Nun speichern wir unsere Änderungen durch folgende Eingabe in der Konsole:
+And finally we save our changes. Go to your console and run these commands:
{% filename %}command-line{% endfilename %}
$ git add .
- $ git commit -m "Meine Django-Girls-App, erster Commit"
+ $ git commit -m "My Django Girls app, first commit"
[...]
13 files changed, 200 insertions(+)
create mode 100644 .gitignore
@@ -112,29 +131,29 @@ Nun speichern wir unsere Änderungen durch folgende Eingabe in der Konsole:
## Den Code auf GitHub veröffentlichen
-Gehe auf [GitHub.com](https://www.github.com) eröffne ein neues, kostenloses Nutzerkonto. (Falls Du es bereits während der Workshop-Vorbereitung eingerichtet hast, ist das großartig!) Stelle sicher, dass Du Dein Passwort nicht vergisst (füge es zu zu Deinem Passwort-Manager hinzu, falls Du einen solchen verwendest).
+Go to [GitHub.com](https://www.github.com) and sign up for a new, free user account. (If you already did that in the workshop prep, that is great!) Be sure to remember your password (add it to your password manager, if you use one).
-Erstelle dann ein neues Repository und gib ihm den Namen "my-first-blog". Lass das Kontrollkästchen "initialise with a README" deaktiviert und die Einstellung der Option .gitignore leer (das haben wir schon von Hand gemacht) und lass die Lizenz auf "None".
+Then, create a new repository, giving it the name "my-first-blog". Leave the "initialize with a README" checkbox unchecked, leave the .gitignore option blank (we've done that manually) and leave the License as None.

> **Achtung:** Der Name `my-first-blog` ist wichtig -- du kannst auch einen anderen wählen, aber er wird im Folgenden noch sehr oft vorkommen und du wirst immer daran denken müssen, ihn in den Anweisungen entsprechend anzupassen. Es ist wahrscheinlich einfacher, bei `my-first-blog` zu bleiben.
-In der nächsten Ansicht wirst du die clone-URL deines Repositorys sehen, die du in manchen der folgenden Kommandozeilenbefehlen verwenden wirst:
+On the next screen, you'll be shown your repo's clone URL, which you will use in some of the commands that follow:

-Nun müssen wir das Git-Repository auf deinem Computer mit dem auf GitHub verbinden.
+Now we need to hook up the Git repository on your computer to the one up on GitHub.
-Gib das Folgende auf der Kommandozeile ein (ersetzte `` mit dem Benutzernamen, den du beim Erstellen deines GitHub-Accounts gewählt hast, aber ohne die spitzen Klammern -- die URL sollte der clone-URL entsprechen, die du vorhin gerade gesehen hast):
+Type the following into your console (replace `` with the username you entered when you created your GitHub account, but without the angle-brackets -- the URL should match the clone URL you just saw).
{% filename %}command-line{% endfilename %}
$ git remote add origin https://github.com//my-first-blog.git
- $ git push -u origin master
+ $ git push -u origin main
-Wenn du zu GitHub pushst, wirst du nach deinem Benutzernamen und Passwort gefragt (entweder direkt im Kommandozeilen-Fenster oder in einem Pop-Up-Fenster), und nach der Eingabe deiner Zugangsdaten solltest du etwas Ähnliches wie das hier sehen:
+When you push to GitHub, you'll be asked for your GitHub username and password (either right there in the command-line window or in a pop-up window), and after entering credentials you should see something like this:
{% filename %}command-line{% endfilename %}
@@ -143,104 +162,20 @@ Wenn du zu GitHub pushst, wirst du nach deinem Benutzernamen und Passwort gefrag
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/ola/my-first-blog.git
- * [new branch] master -> master
- Branch master set up to track remote branch master from origin.
+ * [new branch] main -> main
+ Branch main set up to track remote branch main from origin.
-Dein Code ist jetzt auf GitHub. Schau gleich mal nach! Dort ist dein Code in guter Gesellschaft - [Django](https://github.com/django/django), das [Django Girls Tutorial](https://github.com/DjangoGirls/tutorial) und viele andere großartige Open Source Software-Projekte haben ihren Code auf GitHub. :)
-
-# Deinen Blog auf PythonAnywhere einrichten
-
-## Registriere dich für ein PythonAnywhere Konto
-
-> **Hinweis:** Es ist möglich, dass du bereits ein PythonAnywhere Konto angelegt hast. Wenn ja, dann brauchst du das nicht noch einmal zu tun.
-
-{% include "/deploy/signup_pythonanywhere.md" %}
-
-## Unsere Site auf PythonAnywhere konfigurieren
-
-Gehe zurück zum [Haupt-Dashboard PythonAnywhere](https://www.pythonanywhere.com/), indem du auf das Logo klickst. Dann wähle die Option zum Start einer "Bash"-Konsole – die PythonAnywhere Version einer Kommandozeile wie du sie auf deinen Computer hast.
-
-
-
-> **Hinweis:** PythonAnywhere basiert auf Linux. Wenn du Windows benutzt, dann sieht die Konsole etwas anders aus als die Konsole auf deinem Computer.
-
-Um eine Web App auf PythonAnywhere publizieren zu können, muss dein Code von GitHub heruntergeladen und PythonAnyhwere dazu gebracht werden, diesen zu erkennen und als Web Applikation anzubieten. Du kannst das auch manuell machen. Aber PythonAnywhere stellt ein Hilfstool zur Verfügung, das das alles für dich erledigt. Lass es uns installieren:
-
-{% filename %}PythonAnywhere command-line{% endfilename %}
-
- $ pip3.8 install --user pythonanywhere
-
-
-Nach diesem Befehl solltest du in etwa Folgendes sehen: `Collecting pythonanywhere`, und irgendwann den Schluss `Successfully installed (...) pythonanywhere- (...)`.
-
-Nun können wir mit dem Hilfstool unsere App von GitHub automatisch konfigurieren. Gib das Folgende in der Konsole auf PythonAnywhere ein (vergiss nicht, deinen GitHub-Benutzernamen an Stelle von `` zu benutzen, so dass die URL der clone-URL von GitHub entspricht):
-
-{% filename %}PythonAnywhere command-line{% endfilename %}
-
- $ pa_autoconfigure_django.py --python=3.8 https://github.com//my-first-blog.git
-
-
-Während du die Ausführung verfolgst, wirst du sehen, was passiert:
-
-- Den Code von GitHub herunterladen
-- Eine virtuelle Umgebung auf PythonAnywhere einrichten, genau wie die auf deinem eigenen Computer
-- Deine Einstellungen mit ein paar Veröffentlichungseinstellungen aktualisieren
-- Eine Datenbank auf PythonAnywhere einrichten mit dem Befehl `manage.py migrate`
-- Deine statischen Dateien einrichten (darüber lernen wir später etwas)
-- PythonAnywhere so einrichten, dass es deine Web-App über seine Schnittstelle (API) präsentieren kann
-
-Diese Schritte wurden auf PythonAnywhere automatisiert, aber es sind die selben Schritte, die du bei jedem anderen Server-Provider machen müsstest.
-
-Das Wichtigste im Moment ist, dass du weißt, dass Deine Datenbank auf PythonAnywhere vollständig unabhängig von deiner Datenbank auf deinem eigenen PC ist, so dass sie unterschiedliche Posts und Administratorenkonten haben kann. Aus diesem Grund müssen wir das Administratorenkonto mittels `createsuperuser` initialisieren - wie wir das auf deinem eigenen Computer getan haben. PythonAnywhere hat deine virtualenv automatisch für dich aktiviert. Du musst nur noch Folgendes ausführen:
-
-{% filename %}PythonAnywhere command-line{% endfilename %}
-
- (ola.pythonanywhere.com) $ python manage.py createsuperuser
-
-
-Trage die Informationen für deinen Administrator ein. Am Besten verwendest du die selben Daten wie auf deinem eigenen Computer, um Verwechslungen zu vermeiden - es sei denn, du willst das Passwort auf PythonAnywhere sicherer machen.
-
-Nun kannst auch einen Blick auf deinen Code auf PythonAnywhere werfen mittels `ls`:
-
-{% filename %}PythonAnywhere command-line{% endfilename %}
-
- (ola.pythonanywhere.com) $ ls
- blog db.sqlite3 manage.py mysite requirements.txt static
- (ola.pythonanywhere.com) $ ls blog/
- __init__.py __pycache__ admin.py apps.py migrations models.py
- tests.py views.py
-
-
-Du kannst auch auf die "Files"-Seite gehen und mit PythonAnywheres eingebautem Datei-Manager navigieren. (Von der "Console"-Seite gelangst du über das Menü in der rechten oberen Ecke zu anderen PythonAnywhere-Seiten. Sobald du auf einer dieser Seiten bist, findest du die Links zu den anderen Seiten oben über dem Seiteninhalt.)
-
-## Du bist jetzt live!
-
-Nun ist deine Site also live im öffentlichen Internet! Klick dich zur PythonAnywhere "Web"-Seite durch und hole dir den Link. Teile ihn, mit wem du willst. :)
-
-> **Hinweis:** Da es sich hier um ein Anfänger-Tutorial handelt, haben wir ein paar Abkürzungen genommen, um die Site zu veröffentlichen, welche sicherheitstechnisch nicht ideal sind. Falls du dich entscheidest, dieses Projekt weiterzubauen oder ein neues Projekt anzufangen, dann solltest du die [Django deployment checklist](https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/) durchgehen, um einige Tipps zur Absicherung deiner Seite zu erhalten.
-
-## Debugging Tipps
-
-Solltest du beim Ausführen des `pa_autoconfigure_django.py` Skripts eine Fehlermeldung erhalten, findest du folgend ein paar bekannte Gründe hierfür:
-
-- Du hast vergessen deinen PythonAnywhere API-Token zu erstellen.
-- Du hast in deiner GitHub-URL einen Fehler gemacht.
-- Falls du die Fehlermeldung *"Could not find your settings.py"* erhältst, liegt das wahrscheinlich daran, dass du nicht alle Files zum Git hinzugefügt und/oder diese nicht erfolgreich auf GitHub veröffentlicht hast. Schau dir nochmals den Git-Abschnitt weiter oben an.
-- Falls du ein bestehendes PythonAnywhere-Benutzerkonto verwendest und eine Fehlermeldung bzgl. collectstatic erhalten hast, hast du dort vermutlich eine alte SQLite-Version (z.B. 3.8.2). Wenn das der Fall ist, erstelle ein neues Benutzerkonto und versuche dort, die Kommandos aus dem obenstehenden PythonAnywhere-Abschnitt erneut auszuführen.
-
-Falls du eine Fehlermeldung erhältst, wenn du versuchst, deine Site aufzurufen, solltest du als Erstes die Debugging-Informationen im **error log** anschauen. Den Link dazu findest du über [die PythonAnywhere-Seite "Web"](https://www.pythonanywhere.com/web_app_setup/). Schau nach, ob darin Fehlermeldungen enthalten sind; die neuesten findest du ganz unten.
-
-Du findest einige [Allgemeine Debugging Tipps im PythonAnywhere Wiki](http://help.pythonanywhere.com/pages/DebuggingImportError).
+Your code is now on GitHub. Go and check it out! You'll find it's in fine company – [Django](https://github.com/django/django), the [Django Girls Tutorial](https://github.com/DjangoGirls/tutorial), and many other great open source software projects also host their code on GitHub. :)
-Und denke daran, dein Coach ist da, um zu helfen!
+{% include "/deploy/pythonanywhere.md" %}
-# Schau dir deine Website an!
+# Check out your site!
-Auf der Defaultseite deiner Site sollte "It worked!" stehen - genau so wie auf deinem lokalen Computer. Füge nun `/admin/` ans Ende deiner URL an und du kommst auf die Admin-Site. Logge dich mit Benutzername und Passwort ein, und du wirst sehen, dass du auf dem Server neue Posts hinzufügen kannst -- die Posts aus deiner lokalen Test-Datenbank wurden ja nicht auf deinen öffentlichen Blog geschickt.
+The default page for your site should say "It worked!", just like it does on your local computer. Try adding `/admin/` to the end of the URL, and you'll be taken to the admin site. Log in with the username and password, and you'll see you can add new Posts on the server -- remember, the posts from your local test database were not sent to your live blog.
-Wenn du ein paar Posts erstellt hast, kannst du zurück auf dein lokales Setup (nicht PythonAnywhere) wechseln. Ab jetzt solltest du für Änderungen auf deinem lokalen Setup arbeiten. So wird in der Web-Entwicklung gearbeitet - Änderungen lokal machen und diese dann auf GitHub veröffentlichen und dann deine Änderungen auf den produktiven Webserver ziehen. So kannst du Sachen ausprobieren, ohne deine produktive Website kaputt zu machen. Ziemlich cool, oder?
+Once you have a few posts created, you can go back to your local setup (not PythonAnywhere). From here you should work on your local setup to make changes. This is a common workflow in web development – make changes locally, push those changes to GitHub, and pull your changes down to your live Web server. This allows you to work and experiment without breaking your live Web site. Pretty cool, huh?
-Klopf dir *kräftig* auf die Schulter! Server-Deployment ist eines der kompliziertesten Dinge der Web-Entwicklung und es dauert oftmals mehrere Tage, bis alles läuft. Aber du hast deine Site jetzt live, im echten Internet!
\ No newline at end of file
+Give yourself a *HUGE* pat on the back! Server deployments are one of the trickiest parts of web development and it often takes people several days before they get them working. But you've got your site live, on the real Internet!
\ No newline at end of file
diff --git a/de/deploy/install_git.md b/de/deploy/install_git.md
index f6e5cae703d..55724c523f4 100644
--- a/de/deploy/install_git.md
+++ b/de/deploy/install_git.md
@@ -7,13 +7,17 @@ data-collapse=true ces-->
Du kannst Git von [git-scm.com](https://git-scm.com/) herunterladen. Du kannst bei allen Schritten außer zweien "next" klicken: Wähle im Schritt, in dem du einen Editor aussuchen sollst, "Nano"; und bei der Anweisung "Adjusting your PATH environment", wähle die Einstellung "Run Git and associated Unix tools from the Windows command-line" (die letzte Option). Die anderen Voreinstellungen sind ok. "Checkout"-Stil "Windows" und "Commit" mit "Unix line endings" (Zeilenende im Unix-Format) sind die richtigen Einstellungen.
-Vergiss nicht, die Eingabeaufforderung oder PowerShell nach erfolgreicher Installation neu zu starten.
+Wenn dir während der Installation die Option "Adjusting the name of the initial branch in new repositories" angezeigt wird, wähle "Override the default" aus und nutze "main" als initialen Branch. This will align your installation of Git with the broad direction of the global developer community, and the "main" branch will be used through the remainder of this tutorial. Please see https://sfconservancy.org/news/2020/jun/23/gitbranchname/ and https://github.com/github/renaming for further discussion of this subject.
+
+Vergiss nicht, die Kommandozeile zu schließen und wieder zu öffnen, nachdem du die Installation erfolgreich durchgeführt wurde.
Lade Git von [git-scm.com](https://git-scm.com/) herunter und folge dann den Anweisungen.
+During installation, if you are presented with the option of "Adjusting the name of the initial branch in new repositories", please choose to "Override the default" and use "main". This will align your installation of Git with the broad direction of the global developer community, and the "main" branch will be used through the remainder of this tutorial. Please see https://sfconservancy.org/news/2020/jun/23/gitbranchname/ and https://github.com/github/renaming for further discussion of this subject.
+
> **Hinweis:** Falls du OS X 10.6, 10.7, oder 10.8 verwendest, muss du die Git-Version unter folgendem Link installieren: [Git installer for OS X Snow Leopard](https://sourceforge.net/projects/git-osx-installer/files/git-2.3.5-intel-universal-snow-leopard.dmg/download)
@@ -27,6 +31,15 @@ data-collapse=true ces-->
$ sudo apt install git
```
+### Adjusting your default branch name
+
+This will align your installation of Git with the broad direction of the global developer community, and the "main" branch will be used through the remainder of this tutorial. Please see https://sfconservancy.org/news/2020/jun/23/gitbranchname/ and https://github.com/github/renaming for further discussion of this subject.
+
+{% filename %}command-line{% endfilename %}
+
+ $ git config --global --add init.defaultBranch main
+
+
$ sudo dnf install git
```
+### Adjusting your default branch name
+
+This will align your installation of Git with the broad direction of the global developer community, and the "main" branch will be used through the remainder of this tutorial. Please see https://sfconservancy.org/news/2020/jun/23/gitbranchname/ and https://github.com/github/renaming for further discussion of this subject.
+
+{% filename %}command-line{% endfilename %}
+
+ $ git config --global --add init.defaultBranch main
+
+
$ sudo zypper install git
```
+### Adjusting your default branch name
+
+This will align your installation of Git with the broad direction of the global developer community, and the "main" branch will be used through the remainder of this tutorial. Please see https://sfconservancy.org/news/2020/jun/23/gitbranchname/ and https://github.com/github/renaming for further discussion of this subject.
+
+{% filename %}command-line{% endfilename %}
+
+ $ git config --global --add init.defaultBranch main
+
+
\ No newline at end of file
diff --git a/de/deploy/pythonanywhere.md b/de/deploy/pythonanywhere.md
new file mode 100644
index 00000000000..d3d63ae6ae4
--- /dev/null
+++ b/de/deploy/pythonanywhere.md
@@ -0,0 +1,88 @@
+# Setting up our blog on PythonAnywhere
+
+## Sign up for a PythonAnywhere account
+
+> **Note** You might have already created a PythonAnywhere account earlier during the install steps – if so, no need to do it again.
+>
+> {% include "/deploy/signup_pythonanywhere.md" %}
+
+
+## Configuring our site on PythonAnywhere
+
+Go back to the main [PythonAnywhere Dashboard](https://www.pythonanywhere.com/) by clicking on the logo, and choose the option to start a "Bash" console – that's the PythonAnywhere version of a command line, just like the one on your computer.
+
+
+
+> **Note** PythonAnywhere is based on Linux, so if you're on Windows, the console will look a little different from the one on your computer. Deploying a web app on PythonAnywhere involves pulling down your code from GitHub, and then configuring PythonAnywhere to recognise it and start serving it as a web application. There are manual ways of doing it, but PythonAnywhere provides a helper tool that will do it all for you. Let's install it first:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+```
+$ pip{{ book.pa_py_version }} install --user pythonanywhere
+```
+
+That should print out some things like `Collecting pythonanywhere`, and eventually end with a line saying `Successfully installed (...) pythonanywhere- (...)`.
+
+Now we run the helper to automatically configure our app from GitHub. Type the following into the console on PythonAnywhere (don't forget to use your GitHub username in place of ``, so that the URL matches the clone URL from GitHub):
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+```
+$ pa_autoconfigure_django.py --python={{ book.pa_py_version }} https://github.com//my-first-blog.git
+```
+
+As you watch that running, you'll be able to see what it's doing:
+
+- Downloading your code from GitHub
+- Creating a virtualenv on PythonAnywhere, just like the one on your own computer
+- Updating your settings file with some deployment settings
+- Setting up a database on PythonAnywhere using the `manage.py migrate` command
+- Setting up your static files (we'll learn about these later)
+- And configuring PythonAnywhere to serve your web app via its API
+
+On PythonAnywhere all those steps are automated, but they're the same steps you would have to go through with any other server provider.
+
+The main thing to notice right now is that your database on PythonAnywhere is actually totally separate from your database on your own computer, so it can have different posts and admin accounts. As a result, just as we did on your own computer, we need to initialize the admin account with `createsuperuser`. PythonAnywhere has automatically activated your virtualenv for you, so all you need to do is run:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+```
+(ola.pythonanywhere.com) $ python manage.py createsuperuser
+```
+
+Type in the details for your admin user. Best to use the same ones as you're using on your own computer to avoid any confusion, unless you want to make the password on PythonAnywhere more secure.
+
+Now, if you like, you can also take a look at your code on PythonAnywhere using `ls`:
+
+{% filename %}PythonAnywhere command-line{% endfilename %}
+```
+(ola.pythonanywhere.com) $ ls
+blog db.sqlite3 manage.py mysite requirements.txt static
+(ola.pythonanywhere.com) $ ls blog/
+__init__.py __pycache__ admin.py apps.py migrations models.py
+tests.py views.py
+```
+
+You can also go to the "Files" page and navigate around using PythonAnywhere's built-in file browser. (From the Console page, you can get to other PythonAnywhere pages from the menu button in the upper right corner. Once you're on one of the pages, there are links to the other ones near the top.)
+
+
+## You are now live!
+
+Your site should now be live on the public Internet! Click through to the PythonAnywhere "Web" page to get a link to it. You can share this with anyone you want. :)
+
+
+> **Note** This is a beginners' tutorial, and in deploying this site we've taken a few shortcuts which aren't ideal from a security point of view. If and when you decide to build on this project, or start a new project, you should review the [Django deployment checklist](https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/) for some tips on securing your site.
+
+## Debugging tips
+
+
+If you see an error while running the `pa_autoconfigure_django.py` script, here are a few common causes:
+
+- Forgetting to create your PythonAnywhere API token.
+- Making a mistake in your GitHub URL
+- If you see an error saying *"Could not find your settings.py"*, it's probably because you didn't manage to add all your files to Git, and/or you didn't push them up to GitHub successfully. Have another look at the Git section above
+- If you previously signed up for a PythonAnywhere account and had an error with collectstatic, you probably have an older version of SQLite (eg 3.8.2) for your account. In that case, sign up for a new account and try the commands in the PythonAnywhere section above.
+
+
+If you see an error when you try to visit your site, the first place to look for some debugging info is in your **error log**. You'll find a link to this on the PythonAnywhere ["Web" page](https://www.pythonanywhere.com/web_app_setup/). See if there are any error messages in there; the most recent ones are at the bottom.
+
+There are also some [general debugging tips on the PythonAnywhere help site](http://help.pythonanywhere.com/pages/DebuggingImportError).
+
+And remember, your coach is here to help!
diff --git a/de/django_admin/README.md b/de/django_admin/README.md
index 476448ead45..108a1ffef80 100644
--- a/de/django_admin/README.md
+++ b/de/django_admin/README.md
@@ -52,6 +52,6 @@ Achte darauf, dass bei wenigstens zwei oder drei Posts (aber nicht bei allen) da

-Mehr zum Django-Admin-Dashboard kannst du in der Django-Dokumentation erfahren: https://docs.djangoproject.com/en/2.2/ref/contrib/admin/
+If you want to know more about Django admin, you should check Django's documentation: https://docs.djangoproject.com/en/3.2/ref/contrib/admin/
Jetzt ist wahrscheinlich ein guter Moment, um dir einen Kaffee (oder Tee) zu gönnen und neue Kraft zu tanken. Du hast dein erstes Django-Model erstellt - du hast dir eine kleine Pause verdient!
\ No newline at end of file
diff --git a/de/django_forms/README.md b/de/django_forms/README.md
index 9968e6ea163..70d388a882b 100644
--- a/de/django_forms/README.md
+++ b/de/django_forms/README.md
@@ -44,7 +44,7 @@ Also erstellen wir hier auch wieder einen Link auf die Seite, eine URL, eine Vie
## Link auf eine Seite mit dem Formular
-Bevor wir den Link hinzufügen, benötigen wir einige Icons als Buttons für den Link. Lade für dieses Tutorial [file-earmark-plus.svg](https://raw.githubusercontent.com/twbs/icons/main/icons/file-earmark-plus.svg) herunter und speicher es im Ordner `blog/templates/blog/blog/icons/`
+Bevor wir den Link hinzufügen, benötigen wir einige Icons als Buttons für den Link. Lade für dieses Tutorial [file-earmark-plus.svg](https://raw.githubusercontent.com/twbs/icons/main/icons/file-earmark-plus.svg) herunter und speichere es im Ordner `blog/templates/blog/blog/icons/`
> Hinweis: Um das SVG-Bild herunterzuladen, öffne das Kontextmenü auf dem Link (normalerweise durch einen Rechtsklick darauf) und wähle "Link speichern unter". Im Dialog, in dem du gefragt wirst, wo du die Datei speichern willst, navigiere zum `djangogirls`-Verzeichnis deines Django-Projekts und innerhalb davon in das Unterverzeichnis `blog/templates/blog/icons/` und speicher die Datei dort.
@@ -72,7 +72,7 @@ Nach dem Bearbeiten der Zeile sieht deine HTML-Datei so aus:
Django Girls blog
-
+
@@ -169,7 +169,7 @@ Ok, also schauen wir mal, wie der HTML-Code in `post_edit.html` aussehen sollte:
New post
{% endblock %}
```
@@ -302,7 +302,7 @@ Lass uns zunächst das Symbol speichern, das den Bearbeiten-Button darstellt. La
```html
@@ -318,7 +318,7 @@ damit die Vorlage so aussieht:
{% block content %}
@@ -391,7 +391,7 @@ Probier doch einmal, den Titel oder den Text zu ändern und die Änderungen zu s
Herzlichen Glückwunsch! Deine Anwendung nimmt immer mehr Gestalt an!
-Falls du mehr Informationen über Django-Formulare benötigst, solltest du die offizielle Dokumentation lesen: https://docs.djangoproject.com/en/2.2/topics/forms/
+If you need more information about Django forms, you should read the documentation: https://docs.djangoproject.com/en/3.2/topics/forms/
## Sicherheit
@@ -428,7 +428,7 @@ Erinnerst du dich an den Editier-Button, den wir gerade zu unserer Seite hinzuge
{% filename %}blog/templates/blog/post_detail.html{% endfilename %}
```html
-
+
{% include './icons/pencil-fill.svg' %}
```
@@ -439,7 +439,7 @@ Erinnerst du dich an den Editier-Button, den wir gerade zu unserer Seite hinzuge
```html
{% if user.is_authenticated %}
-
+
{% include './icons/pencil-fill.svg' %}
{% endif %}
diff --git a/de/django_installation/instructions.md b/de/django_installation/instructions.md
index 8053d68cf76..7231bbacde6 100644
--- a/de/django_installation/instructions.md
+++ b/de/django_installation/instructions.md
@@ -144,7 +144,7 @@ Starte deine virtuelle Umgebung, indem du eingibst:
Der Name `myvenv` muss mit dem von Dir gewählten Namen des `virtualenv` übereinstimmen!
-> **Anmerkung:** Manchmal ist das Kommando `source` nicht verfügbar. In diesen Fällen geht es auch so:
+> **Anmerkung:** Falls der Befehl `source` nicht verfügbar ist, versuche es stattdessen mit:
>
> {% filename %}command-line{% endfilename %}
>
@@ -195,7 +195,7 @@ Führe nun `pip install -r requirements.txt` aus, um Django zu installieren.
(myvenv) ~$ pip install -r requirements.txt
Collecting Django~={{ book.django_version }} (from -r requirements.txt (line 1))
- Downloading Django-{{ book.django_version }}-py3-none-any.whl (7.1MB)
+ Downloading Django-{{ book.django_version }}-py3-none-any.whl (7.9MB)
Installing collected packages: Django
Successfully installed Django-{{ book.django_version }}
@@ -203,14 +203,14 @@ Führe nun `pip install -r requirements.txt` aus, um Django zu installieren.
-> Wenn du einen Fehler auf einem Windowsrechner bekommst, überprüfe, ob der Pfadname deines Projekts Leerzeichen, Umlaute oder Sonderzeichen enthält (z.B. `C:\Users\User Name\djangogirls`). Ist das der Fall, dann verwende bitte einen anderen Ordner ohne Sonderzeichen, Umlaute oder Leerzeichen. (Vorschlag: `C:\djangogirls`). Erstelle ein neues virtualenv in einem neuen Verzeichnis, lösche danach das alte und wiederhohle den oben genannten Befehl. (Das Verzeichnis des virtualenv zu verschieben funktioniert dabei nicht, da virtualenv absolute Pfade verwendet.)
+> Wenn du auf Windows einen Fehler bekommst, überprüfe, ob der Pfadname deines Projekts Leerzeichen, Umlaute oder Sonderzeichen enthält (z.B. `C:\Users\User Name\djangogirls`). Ist das der Fall, dann verwende bitte einen anderen Ordner ohne Sonderzeichen, Umlaute oder Leerzeichen. (Vorschlag: `C:\djangogirls`). Erstelle ein neues virtualenv in einem neuen Verzeichnis, lösche danach das alte und wiederhohle den oben genannten Befehl. (Das Verzeichnis des virtualenv zu verschieben funktioniert dabei nicht, da virtualenv absolute Pfade verwendet.)
-> Es kann sein, dass deine Befehlszeile einfriert, wenn du versuchst Django zu installieren. Sollte das passieren, nutze folgenden Befehl anstelle des oben angegebenen:
+> Es kann sein, dass deine Befehlszeile einfriert, wenn du versuchst, Django zu installieren. Sollte das passieren, nutze folgenden Befehl anstelle des oben angegebenen:
>
> {% filename %}command-line{% endfilename %}
>
diff --git a/de/django_models/README.md b/de/django_models/README.md
index 7aa3e065463..2dd0fdd4e45 100644
--- a/de/django_models/README.md
+++ b/de/django_models/README.md
@@ -88,6 +88,7 @@ Wie du sehen kannst, wurde ein neues `blog`-Verzeichnis erstellt, welches schon
├── db.sqlite3
├── manage.py
├── mysite
+ │ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
@@ -98,7 +99,7 @@ Wie du sehen kannst, wurde ein neues `blog`-Verzeichnis erstellt, welches schon
-Nach dem Erstellen der Applikation müssen wir Django noch sagen, dass diese auch genutzt werden soll. Das tun wir in der Datei `mysite/settings.py` -- öffne diese in deinem Code-Editor. Wir suchen den Eintrag `INSTALLED_APPS` und fügen darin die Zeile `'blog.apps.BlogConfig',` direkt über der schließenden Klammer `]` ein. Danach sollte es also so aussehen:
+Nach dem Erstellen der Applikation müssen wir Django noch sagen, dass diese auch genutzt werden soll. Das tun wir in der Datei `mysite/settings.py` -- öffne diese in deinem Code-Editor. We need to find `INSTALLED_APPS` and add a line containing `'blog',` just above `]`. Danach sollte es also so aussehen:
{% filename %}mysite/settings.py{% endfilename %}
@@ -110,7 +111,7 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
- 'blog.apps.BlogConfig',
+ 'blog',
]
```
@@ -162,7 +163,7 @@ Jetzt definieren wir die Eigenschaften, über welche wir gesprochen haben: `titl
- `models.DateTimeField` – ein Feld für einen Zeitpunkt (ein Datum und eine Uhrzeit).
- `models.ForeignKey` – definiert eine Verknüpfung/Beziehung zu einem anderen Model.
-Wir werden nicht den gesamten Code hier erklären, da das zu lange dauern würde. Du solltest einen Blick in die offizielle Django-Dokumentation werfen, wenn du mehr über Modelfelder und darüber wissen möchtest, wie man auch andere Dinge als die oben beschriebenen definiert (https://docs.djangoproject.com/en/2.2/ref/models/fields/#field-types).
+Wir werden nicht den gesamten Code hier erklären, da das zu lange dauern würde. You should take a look at Django's documentation if you want to know more about Model fields and how to define things other than those described above (https://docs.djangoproject.com/en/3.2/ref/models/fields/#field-types).
Was ist mit `def publish(self):`? Das ist genau die `publish`-Methode zum Veröffentlichen unserer Blogposts, über die wir vorher bereits sprachen. `def` zeigt an, dass es sich nachfolgend um eine Funktion/Methode handelt, und `publish` ist der Name der Methode. Du kannst den Namen der Methode auch ändern, wenn du möchtest. Die Benennungsregel ist, dass wir Kleinbuchstaben verwenden, und anstatt Leerzeichen (die in Funktionsnamen nicht vorkommend dürfen) Unterstriche. Eine Methode, die einen Durchschnittspreis berechnet, könnte zum Beispiel `calculate_average_price` genannt werden.
@@ -180,9 +181,9 @@ Als letzten Schritt wollen wir unser neues Model der Datenbank hinzufügen. Dazu
(myvenv) ~/djangogirls$ python manage.py makemigrations blog
Migrations for 'blog':
- blog/migrations/0001_initial.py:
+ blog/migrations/0001_initial.py
- - Create model Post
+ - Create model Post
**Hinweis:** Denke daran, die Dateien nach dem Editieren zu speichern. Ansonsten führt dein Computer die vorherige Version aus, was zu unerwarteten Fehlermeldungen führen kann.
diff --git a/de/django_start_project/README.md b/de/django_start_project/README.md
index ca165761994..a3faae9b74a 100644
--- a/de/django_start_project/README.md
+++ b/de/django_start_project/README.md
@@ -47,6 +47,7 @@ Auf Windows solltest du den folgenden Befehl ausführen. **(Vergiss den Punkt (`
djangogirls
├── manage.py
├── mysite
+ │ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
@@ -82,7 +83,7 @@ Suche in `settings.py` die Zeile, die `TIME_ZONE` enthält und ändere sie ab, u
TIME_ZONE = 'Europe/Berlin'
```
-Ein Sprachkennung besteht aus einem Kürzel für die Sprache, z.B. `en` für Englisch oder `de` für Deutsch, und einem Länder-Kürzel z.B. `de` für Deutschland oder `ch` für die Schweiz. Falls Englisch nicht deine Muttersprache ist, kannst du damit die Standard-Knöpfe und -Meldungen von Django auf deine Sprache wechseln. Der "Cancel"-Knopf würde dann in diese Sprache übersetzt (und z.B. bei Deutsch mit "Abbrechen" beschriftet). [Django enthält viele fix-fertige Übsersetzungen](https://docs.djangoproject.com/en/2.2/ref/settings/#language-code).
+Ein Sprachkennung besteht aus einem Kürzel für die Sprache, z.B. `en` für Englisch oder `de` für Deutsch, und einem Länder-Kürzel z.B. `de` für Deutschland oder `ch` für die Schweiz. Falls Englisch nicht deine Muttersprache ist, kannst du damit die Standard-Knöpfe und -Meldungen von Django auf deine Sprache wechseln. Der "Cancel"-Knopf würde dann in diese Sprache übersetzt (und z.B. bei Deutsch mit "Abbrechen" beschriftet). [Django comes with a lot of prepared translations](https://docs.djangoproject.com/en/3.2/ref/settings/#language-code).
Wenn du eine andere Sprache als Englisch willst, ändere die Sprachkennung, indem du die folgende Zeile änderst:
@@ -98,7 +99,7 @@ Ausserdem müssen wir einen Pfad für statische Dateien festlegen. (Über statis
```python
STATIC_URL = '/static/'
-STATIC_ROOT = os.path.join(BASE_DIR, 'static')
+STATIC_ROOT = BASE_DIR / 'static'
```
Wenn `DEBUG` auf `True` gesetzt ist und `ALLOWED_HOSTS` leer, dann wird der "Host" gegen `['localhost', '127.0.0.1', '[::1]']` validiert. Unser Hostname auf PythonAnywhere, wo wir unsere Anwendung deployen werden, würde da nicht passen. Deswegen ändern wir folgende Einstellung:
@@ -113,7 +114,7 @@ ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']
>
> Falls du Cloud9 benutzt, füge auch `.amazonaws.com` zu den `ALLOWED_HOSTS` hinzu
>
-> Wenn du dein Projekt auf `Glitch.com` hostest, dann lass uns den Django-Sekret-Key schützen, der vertraulich bleiben muss (andernfalls könnte jeder, der dein Projekt remixt, diesen sehen):
+> If you are hosting your project on `Glitch.com`, let us protect the Django secret key that needs to remain confidential (otherwise, anyone remixing your project could see it):
>
> - Zuerst erstellen wir einen zufälligen geheimen Schlüssel. Öffne erneut das Glitch-Terminal und gib den folgenden Befehl ein:
>
@@ -140,6 +141,8 @@ ALLOWED_HOSTS = ['127.0.0.1', '.pythonanywhere.com']
> {% filename %}mysite/settings.py{% endfilename %}
>
> ```python
+> import os
+>
> SECRET_KEY = os.getenv('SECRET')
> ```
>
@@ -165,7 +168,7 @@ Das sollte schon in der `mysite/settings.py`-Datei eingestellt sein:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
- 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+ 'NAME': BASE_DIR / 'db.sqlite3',
}
}
```
@@ -176,13 +179,13 @@ Um eine Datenbank für unseren Blog zu erstellen, müssen wir folgenden Befehl i
(myvenv) ~/djangogirls$ python manage.py migrate
Operations to perform:
- Apply all migrations: auth, admin, contenttypes, sessions
+ Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
- Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
- Applying admin.0002_logentry_remove_auto_add... OK
+ Applying admin.0002_logentry_remove_auto_add... OK
+ Applying admin.0003_logentry_add_action_flag_choices... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
@@ -192,6 +195,9 @@ Um eine Datenbank für unseren Blog zu erstellen, müssen wir folgenden Befehl i
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
+ Applying auth.0010_alter_group_name_max_length... OK
+ Applying auth.0011_update_proxy_permissions... OK
+ Applying auth.0012_alter_user_first_name_max_length... OK
Applying sessions.0001_initial... OK
diff --git a/de/django_templates/README.md b/de/django_templates/README.md
index 470a6e09043..3f2a0df4e0e 100644
--- a/de/django_templates/README.md
+++ b/de/django_templates/README.md
@@ -20,7 +20,7 @@ Um eine Variable in einem Django-Template darzustellen, nutzen wir doppelte, ges
{{ posts }}
```
-Versuche das in deinem `blog/templates/blog/post_list.html` Template. Öffne es in deinem Code-Editor und ersetze alles vom zweiten `
` bis zum dritten `
` mit `{{ posts }}`. Speichere die Datei und aktualisiere die Seite, um die Ergebnisse anzuzeigen.
+Versuche das in deinem `blog/templates/blog/post_list.html` Template. Öffne es im Code-Editor und ersetze die vorhandenen ``-Elemente durch `{{ posts }}`. Speichere die Datei und aktualisiere die Seite, um die Ergebnisse anzuzeigen.

diff --git a/de/django_urls/README.md b/de/django_urls/README.md
index 728b50c8461..febedd7f5df 100644
--- a/de/django_urls/README.md
+++ b/de/django_urls/README.md
@@ -96,8 +96,20 @@ Der letzte Teil `name='post_list'` ist der Name der URL, der genutzt wird, um di
Wenn du jetzt versuchst, http://127.0.0.1:8000/ aufzurufen, dann erscheint eine Meldung der Art "Webseite nicht verfügbar". Das erscheint deshalb, weil der Server nicht mehr läuft. (Erinnerst du dich noch, `runserver` eingegeben zu haben?) Schau mal in deiner Server-Konsole nach und finde heraus, warum der Server nicht mehr läuft.
-
+{% filename %}{{ warning_icon }} command-line{% endfilename %}
+
+ return _bootstrap._gcd_import(name[level:], package, level)
+ File "", line 1030, in _gcd_import
+ File "", line 1007, in _find_and_load
+ File "", line 986, in _find_and_load_unlocked
+ File "", line 680, in _load_unlocked
+ File "", line 850, in exec_module
+ File "", line 228, in _call_with_frames_removed
+ File "/Users/ola/djangogirls/blog/urls.py", line 5, in
+ path('', views.post_list, name='post_list'),
+ AttributeError: module 'blog.views' has no attribute 'post_list'
+
Die Konsole zeigt einen Fehler, aber keine Sorge – der ist eigentlich ziemlich nützlich: Er sagt dir, dass **kein Attribut 'post_list'** vorhanden ist. Das ist der Name der *View*, die Django zu finden und zu verwenden versucht, aber wir haben sie noch gar nicht erstellt. In diesem Zustand wird dein `/admin/` auch nicht funktionieren. Keine Sorge, das regeln wir gleich. Wenn du eine andere Fehlermeldung siehst, versuche es nochmal nach einem Neustart des Webservers. Stoppe dazu den Webserver, indem du Strg+C drückst (die Strg- bzw. Ctrl- und die C-Taste zusammen). Auf Windows musst du evtl. Strg+Untbr (bzw. Ctrl+Break) drücken. Dann musst du den Webserver mittels des Kommandos `python manage.py runserver` erneut starten.
-> Wenn du mehr über Django-URLconfs lernen willst, dann öffne die offizielle Dokumentation: https://docs.djangoproject.com/en/2.2/topics/http/urls/
\ No newline at end of file
+> If you want to know more about Django URLconfs, look at the official documentation: https://docs.djangoproject.com/en/3.2/topics/http/urls/
\ No newline at end of file
diff --git a/de/django_views/README.md b/de/django_views/README.md
index ac71c660d35..d8b7905a505 100644
--- a/de/django_views/README.md
+++ b/de/django_views/README.md
@@ -41,4 +41,4 @@ Einen anderen Fehler! Lies, was da jetzt los ist:
Das zeigt, dass der Server zumindest wieder läuft, aber es sieht immer noch nicht richtig aus, oder? Mach dir keine Sorgen, es ist nur eine Fehlerseite, nichts zu befürchten! Genau wie die Fehlermeldungen in der Konsole sind auch die hier ziemlich nützlich. Du erhältst den Hinweis *TemplateDoesNotExist*, also dass es das Template nicht gibt. Lass uns diesen Bug beheben, indem wir im nächsten Kapitel ein Template erstellen!
-> Erfahre mehr über Django Views in der offiziellen Dokumentation: https://docs.djangoproject.com/en/2.2/topics/http/views/
\ No newline at end of file
+> Learn more about Django views by reading the official documentation: https://docs.djangoproject.com/en/3.2/topics/http/views/
\ No newline at end of file
diff --git a/de/domain/README.md b/de/domain/README.md
deleted file mode 100644
index da6c9139258..00000000000
--- a/de/domain/README.md
+++ /dev/null
@@ -1,51 +0,0 @@
-# Die Domain
-
-Heroku hat dir eine Domain bereitgestellt, aber sie ist sehr lang, schwer zu merken und einfach nur hässlich. Es wäre doch toll, einen Domainnamen zu haben, der kürzer und einfacher zu merken ist, oder?
-
-In diesem Kapitel werden wir dir beibringen, wie man eine Domain kauft und sie mit Heroku verknüpft!
-
-## Wo registriert man eine Domain?
-
-Eine typische Domain kostet in etwa 15 $ pro Jahr. Es gibt günstigere und teurere Varianten, je nach Provider. Es gibt viele Unternehmen, bei denen du Domains kaufen kannst: eine einfache [Google-Suche](https://www.google.com/search?q=register%20domain) wird dir hunderte Vorschläge liefern.
-
-Unser Favorit ist [I want my name](https://iwantmyname.com/). Die werben mit "einfachem Domainmanagement" und es ist wirklich simpel.
-
-## Wie registriert man eine Domain auf IWantMyName?
-
-Gehe auf [iwantmyname](http://iwantmyname.com) und tippe eine Domain, die du haben möchtest, in das Suchfeld.
-
-
-
-Du solltest jetzt eine Liste mit all den verfügbaren Domains sehen, die zu deinem Wunschnamen passen. Wie du sehen kannst, zeigt dir ein Smiley an, wenn eine Domain verfügbar ist und ein trauriges Gesicht, wenn sie bereits vergeben ist.
-
-
-
-Wir haben beschlossen, `djangogirls.in` zu kaufen:
-
-
-
-Gehe zur Kasse. Du solltest dich jetzt bei IwantMyName anmelden, wenn du nicht bereits ein Konto dort hast. Danach gib deine Kreditkarteninformationen ein und kaufe deine Domain!
-
-Im Anschluss klickst du auf `Domains` im Menu und wählst deine neu gekaufte Domain aus. Dann suche und klicke auf den `manage DNS records` Link:
-
-
-
-Jetzt musst du dieses Formular finden:
-
-
-
-Fülle es mit den folgenden Details aus: - Hostname: www - Type: CNAME - Value: deine Heroku-Domain (z.B. djangogirls.herokuapp.com) - TTL: 3600
-
-
-
-Klicke auf "Hinzufügen" und speichere die Änderungen am unteren Ende.
-
-Es kann einige Stunden dauern, bevor deine Domain lauffähig ist, hab etwas Geduld!
-
-## Konfigurieren der Domain in Heroku
-
-Du musst Heroku angeben, dass du deine eigene Domain benutzen möchtest.
-
-Gehe zum [Heroku Dashboard](https://dashboard.heroku.com/apps), logge dich auf dein Heroku-Konto ein und wähle deine App aus. Dann geh in das Einstellungsmenu und füge deine Domain in der `Domains` Sektion ein und speichere deine Änderungen.
-
-Das wars!
diff --git a/de/dynamic_data_in_templates/README.md b/de/dynamic_data_in_templates/README.md
index 4af9e9bf509..da4f0e82f75 100644
--- a/de/dynamic_data_in_templates/README.md
+++ b/de/dynamic_data_in_templates/README.md
@@ -81,4 +81,4 @@ def post_list(request):
Das war's! Zeit, zurück zum Template zu gehen und das QuerySet anzuzeigen!
-Wenn du mehr über QuerySets in Django erfahren willst, dann sieh unter diesem Link nach: https://docs.djangoproject.com/en/2.2/ref/models/querysets/
\ No newline at end of file
+Want to read a little bit more about QuerySets in Django? You should look here: https://docs.djangoproject.com/en/3.2/ref/models/querysets/
\ No newline at end of file
diff --git a/de/extend_your_application/README.md b/de/extend_your_application/README.md
index 546a3170994..4f9591f9b7c 100644
--- a/de/extend_your_application/README.md
+++ b/de/extend_your_application/README.md
@@ -78,7 +78,19 @@ Wenn du also `http://127.0.0.1:8000/post/5/` in deinen Browser eingibst, wird Dj
So, jetzt haben wir der `blog/urls.py` ein neues URL-Muster hinzugefügt! Lass uns die Seite http://127.0.0.1:8000/ neu laden - Bumm! Der Server läuft wieder nicht mehr. Schau in die Konsole - wie erwartet gibt es noch einen anderen Fehler!
-
+{% filename %}{{ warning_icon }} command-line{% endfilename %}
+
+ return _bootstrap._gcd_import(name[level:], package, level)
+ File "", line 1030, in _gcd_import
+ File "", line 1007, in _find_and_load
+ File "", line 986, in _find_and_load_unlocked
+ File "", line 680, in _load_unlocked
+ File "", line 850, in exec_module
+ File "", line 228, in _call_with_frames_removed
+ File "/Users/ola/djangogirls/blog/urls.py", line 6, in
+ path('post//', views.post_detail, name='post_detail'),
+ AttributeError: module 'blog.views' has no attribute 'post_detail'
+
Erinnerst du dich, was der nächste Schritt ist? Eine View hinzufügen!
@@ -179,7 +191,7 @@ Es wäre schön zu sehen, ob deine Website noch auf PythonAnywhere funktioniert,
$ git status
$ git add .
$ git status
- $ git commit -m "View und Template für Blogpost-Details sowie CSS für die Website hinzugefügt"
+ $ git commit -m "Added view and template for detailed blog post as well as CSS for the site."
$ git push
@@ -187,7 +199,7 @@ Dann führe Folgendes in der [PythonAnywhere-Bash-Konsole](https://www.pythonany
{% filename %}PythonAnywhere command-line{% endfilename %}
- $ cd ~/.pythonanywhere.com
+ $ cd ~/.pythonanywhere.com
$ git pull
[...]
@@ -202,7 +214,7 @@ Aktiviere also deine virtuelle Umgebung, wenn sie nicht vom letzten Mal noch akt
{% filename %}PythonAnywhere command-line{% endfilename %}
- $ workon .pythonanywhere.com
+ $ workon .pythonanywhere.com
(ola.pythonanywhere.com)$ python manage.py collectstatic
[...]
diff --git a/de/installation/README.md b/de/installation/README.md
index 0e5fc8537fd..ed709da2433 100644
--- a/de/installation/README.md
+++ b/de/installation/README.md
@@ -19,14 +19,13 @@ Wenn du an einer [Django Girls Veranstaltung](https://djangogirls.org/events/) t
In diesem Tutorial wirst du einen Blog bauen. Dafür wirst du während des Tutorials aufgefordert, verschiedene Software auf deinem Computer zu installieren und auch einige Online-Konten anzulegen, wenn sie gebraucht werden. Diese Seite fasst alle Installations- und Kontoeinrichtungs-Anweisungen an einer Stelle zusammen (das ist für einige Workshopformate sinnvoll).
{% include "/chromebook_setup/instructions.md" %}
+data-id="chromebook_setup" data-collapse=true ces--> {% include "/chromebook_setup/instructions.md" %}
# Kurze Einführung in die Kommandozeile {#command-line}
-Viele der folgenden Schritte beziehen sich auf die "Konsole", das "Terminal", das "Kommandozeilen-Fenster" oder die "Kommandozeile" -- all diese Begriffe bezeichnen dasselbe: Ein Fenster auf deinem Computer, in das du Kommandos eingeben kannst. Im Hauptteil des Tutorials wirst du mehr über die Kommandozeile lernen. Vorerst musst du nur wissen, wie du ein Kommandozeilenfester öffnen kannst und wie eines aussieht:
-{% include "/intro_to_command_line/open_instructions.md" %}
+Viele der folgenden Schritte beziehen sich auf die "Konsole", das "Terminal", das "Kommandozeilen-Fenster" oder die "Kommandozeile" -- all diese Begriffe bezeichnen dasselbe: Ein Fenster auf deinem Computer, in das du Kommandos eingeben kannst. Im Hauptteil des Tutorials wirst du mehr über die Kommandozeile lernen. Vorerst musst du nur wissen, wie du ein Kommandozeilenfester öffnen kannst und wie eines aussieht: {% include "/intro_to_command_line/open_instructions.md" %}
# Python installieren {#python}
@@ -66,4 +65,4 @@ Herzlichen Glückwunsch, du hast alles eingerichtet und bist nun bereit loszuleg
# Viel Spaß beim Workshop!
-Wenn du mit dem Workshop anfängst, kannst du direkt zum Kapitel [Dein erstes Django-Projekt!](../django_start_project/README.md) gehen, weil du den Inhalt der vorhergehenden Kapitel schon bearbeitet hast.
+Wenn du mit dem Workshop anfängst, kannst du direkt zum Kapitel [Dein erstes Django-Projekt!](../django_start_project/README.md) gehen, weil du den Inhalt der vorhergehenden Kapitel schon bearbeitet hast.
\ No newline at end of file
diff --git a/de/intro_to_command_line/open_instructions.md b/de/intro_to_command_line/open_instructions.md
index 1ae41063576..26e86572959 100644
--- a/de/intro_to_command_line/open_instructions.md
+++ b/de/intro_to_command_line/open_instructions.md
@@ -1,4 +1,3 @@
-
Abhängig von deiner Windows-Version und deiner Tastatur sollte eine der folgenden Methoden ein Kommandozeilen-Fenster öffnen (du musst vielleicht etwas herumexperimentieren, aber du musst nicht jeden dieser Vorschläge ausprobieren):
@@ -26,4 +25,4 @@ Später im Tutorial wirst du zwei offene Kommandozeilen-Fenster gleichzeitig bra
Wahrscheinlich ist es unter Programme → Zubehör → Terminal, aber das ist von deinem System abhängig. Wenn es nicht da ist, kannst du versuchen, danach zu googlen. :)
-
+
\ No newline at end of file
diff --git a/de/python_introduction/README.md b/de/python_introduction/README.md
index b8263be4e58..bf93e593cda 100644
--- a/de/python_introduction/README.md
+++ b/de/python_introduction/README.md
@@ -6,59 +6,43 @@
Fangen wir an, schreiben wir Code!
-## Der Python-Prompt
+{% include "/python_introduction/prompt.md" %}
-> Für Leserinnen, die sich bereits mit Python auskennen: Dieser Teil befindet sich im [Python Basics: Integers, Strings, Lists, Variables and Errors](https://www.youtube.com/watch?v=MO63L4s-20U) Video.
+## Your first Python command!
-Um Python zu starten, musst du an die *Kommandozeile* deines Computers. Wie das geht, weißt du bereits - denn du hast es im Kapitel [Einführung in die Kommandozeile](../intro_to_command_line/README.md) gelernt.
+After running the Python command, the prompt changed to `>>>`. For us this means that for now we may only use commands in the Python language. You don't have to type in `>>>` – Python will do that for you.
-Also öffne die Konsole, dann fangen wir an.
+If you want to exit the Python console at any point, type `exit()` or use the shortcut `Ctrl + Z` for Windows and `Ctrl + D` for Mac/Linux. Then you won't see `>>>` any longer.
-Wir wollen eine Python Konsole öffnen, also tippe unter Windows `python` oder im Mac OS/Linux Terminal `python3` und drücke `Enter`.
-
-{% filename %}command-line{% endfilename %}
-
- $ python3
- Python {{ book.py_release }} (...)
- Type "help", "copyright", "credits" or "license" for more information.
- >>>
-
-
-## Dein erster Python-Befehl!
-
-Nach Eingabe von python3 in der Konsole ändert sich das Prompt-Zeichen zu `>>>`. Für uns bedeutet das, dass wir ab nun nur noch Python-Code eingeben können. Den Python-Prompt `>>>` musst du nicht jedesmal eingeben - dies macht Python für dich.
-
-Wenn du die Python-Konsole wieder verlassen möchtest, gib `exit()` ein oder nutze das Tastatur-Kürzel `Strg + Z` unter Windows bzw. `Strg + D`, wenn du einen Mac hast oder Linux verwendest. Dann bist du wieder in der normalen Konsole und der Python-Prompt `>>>` ist weg.
-
-Fürs Erste bleiben wir in der Python Konsole, wir wollen mehr darüber lernen. Lass uns mit ein wenig Mathematik anfangen, gib `2 + 3` ein und drück `enter`.
+For now, we don't want to exit the Python console. We want to learn more about it. Let's start by typing some math, like `2 + 3` and hitting `enter`.
{% filename %}command-line{% endfilename %}
```python
->>> 2 + 3
+>>> 2 + 3
5
```
-Cool! Schon ist das Ergebnis da. Python kann rechnen! Probier einfach einige andere Befehle aus, wie z.B.:
+Nice! See how the answer popped out? Python knows math! You could try other commands like:
- `4 * 5`
- `5 - 1`
- `40 / 2`
-Um Potenzen zu berechnen, sagen wir 2 hoch 3, müssen wir Folgendes eingeben: {% filename %}command-line{% endfilename %}
+To perform exponential calculation, say 2 to the power 3, we type: {% filename %}command-line{% endfilename %}
```python
>>> 2 ** 3
8
```
-Spiel ein wenig herum, dann machen wir weiter. :)
+Have fun with this for a little while and then get back here. :)
-Wie du siehst, kann Python richtig toll rechnen. Aber Python kann noch viel mehr ...
+As you can see, Python is a great calculator. If you're wondering what else you can do…
## Strings
-Strings sind Zeichenketten. Das ist eine Folge von Buchstaben, die von Anführungszeichen umgeben sind. Gib einfach mal deinen Namen ein (bei mir "Ola"):
+How about your name? Type your first name in quotes like this:
{% filename %}command-line{% endfilename %}
@@ -67,9 +51,9 @@ Strings sind Zeichenketten. Das ist eine Folge von Buchstaben, die von Anführun
'Ola'
```
-Nun hast du deinen ersten String erzeugt! Dies ist eine Folge von Zeichen (also nicht nur Buchstaben, wie ich oben schrieb, sondern Zeichen aller Art), die von einem Computer verarbeitet werden können. Ein String muss stets mit dem gleichen Zeichen beginnen und enden. Dies kann entweder ein einzelnes Gänsefüßchen sein (`'`) oder ein doppeltes (`"`), da gibt es keinen Unterschied! Die Anführungszeichen zeigen Python nur an, dass alles dazwischen ein String ist.
+You've now created your first string! It's a sequence of characters that can be processed by a computer. The string must always begin and end with the same character. This may be single (`'`) or double (`"`) quotes (there is no difference!) The quotes tell Python that what's inside of them is a string.
-Strings können zusammengesetzt werden. Versuch es einmal:
+Strings can be strung together. Try this:
{% filename %}command-line{% endfilename %}
@@ -78,7 +62,7 @@ Strings können zusammengesetzt werden. Versuch es einmal:
'Hi there Ola'
```
-Du kannst Strings auch vervielfältigen:
+You can also multiply strings with a number:
{% filename %}command-line{% endfilename %}
@@ -87,9 +71,9 @@ Du kannst Strings auch vervielfältigen:
'OlaOlaOla'
```
-Brauchst du einen Apostroph in einem String, so hast du zwei Möglichkeiten.
+If you need to put an apostrophe inside your string, you have two ways to do it.
-Du kannst für den String doppelte Anführungszeichen verwenden:
+Using double quotes:
{% filename %}command-line{% endfilename %}
@@ -98,7 +82,7 @@ Du kannst für den String doppelte Anführungszeichen verwenden:
"Runnin' down the hill"
```
-oder du kannst den Apostroph mit einem Backslash (`\`) markieren:
+or escaping the apostrophe with a backslash (`\`):
{% filename %}command-line{% endfilename %}
@@ -107,7 +91,7 @@ oder du kannst den Apostroph mit einem Backslash (`\`) markieren:
"Runnin' down the hill"
```
-Toll, was? Um deinen Namen in Großbuchstaben anzuzeigen, gib Folgendes ein:
+Nice, huh? To see your name in uppercase letters, type:
{% filename %}command-line{% endfilename %}
@@ -116,9 +100,9 @@ Toll, was? Um deinen Namen in Großbuchstaben anzuzeigen, gib Folgendes ein:
'OLA'
```
-Hier hast du die `upper`-**Methode** auf den String angewendet! Eine Methode (wie `upper()`) ist eine Abfolge von Anweisungen, die Python für ein gegebenes Objekt (hier `"Ola"`) ausführt, wenn sie aufgerufen wird.
+You just used the `upper` **method** on your string! A method (like `upper()`) is a sequence of instructions that Python has to perform on a given object (`"Ola"`) once you call it.
-Nehmen wir an, du möchtest die Zahl der Buchstaben in deinem Namen wissen. Auch dafür gibt es eine **Funktion**!
+If you want to know the number of letters contained in your name, there is a **function** for that too!
{% filename %}command-line{% endfilename %}
@@ -127,22 +111,22 @@ Nehmen wir an, du möchtest die Zahl der Buchstaben in deinem Namen wissen. Auch
3
```
-Nun fragst du dich sicher, warum du manchmal eine Methode mit einem `.` am Ende des Strings (wie bei `"Ola".upper()`) schreibst und manchmal eine Funktion direkt aufrufst und den String dahinter in Klammern setzt? Im ersten Fall gehören solche Methoden, wie `upper()`, zu Objekten (hier: ein String) und funktionieren auch nur bei diesen. In solchen Fällen bezeichnen wir eine Funktion als **Methode**. Andere Funktionen sind dagegen allgemeiner und können auf unterschiedliche Datentypen angewendet werden, wie beispielsweise `len()`. Daher übergeben wir `"Ola"` als Parameter an die `len` Funktion.
+Wonder why sometimes you call functions with a `.` at the end of a string (like `"Ola".upper()`) and sometimes you first call a function and place the string in parentheses? Well, in some cases, functions belong to objects, like `upper()`, which can only be performed on strings. In this case, we call the function a **method**. Other times, functions don't belong to anything specific and can be used on different types of objects, just like `len()`. That's why we're giving `"Ola"` as a parameter to the `len` function.
### Zusammenfassung
-Ok, genug über Strings. Bisher haben wir Folgendes kennengelernt:
+OK, enough of strings. So far you've learned about:
- **Der Prompt** - Wenn wir beim Python-Prompt Anweisungen (oder Programm-Code) in Python eingeben, dann erhalten wir auch Ergebnisse in Python. Man sagt zu dieser Python-Umgebung auch "Python-Shell".
- **Zahlen und Strings** - In Python nutzen wir Zahlen für Berechnungen und Strings für Text-Objekte.
- **Operatoren**, wie + und *, verarbeiten mehrere Werte und erzeugen als Ergebnis einen neuen Wert.
- **Funktionen** - wie upper() und len(), tun etwas mit Objekten (in unserem Beispiel ändern sie diese, wie bei upper(), oder sie geben eine Eigenschaft zurück, wie bei len()).
-Das sind Grundlagen jeder Programmiersprache, die Du lernen wirst. Bist Du bereit für mehr? Bestimmt!
+These are the basics of every programming language you learn. Ready for something harder? We bet you are!
-## Fehler
+## Errors
-Probieren wir etwas Neues: Errors. Können wir die Länge einer Zahl auf die gleiche Weise ermitteln, wie die Länge eines Namens? Gib dazu `len(304023)` ein und drücke auf Enter:
+Let's try something new. Can we get the length of a number the same way we could find out the length of our name? Type in `len(304023)` and hit `enter`:
{% filename %}{{ warning_icon }} command-line{% endfilename %}
@@ -153,9 +137,9 @@ Traceback (most recent call last):
TypeError: object of type 'int' has no len()
```
-Wir haben unsere erste Fehlermeldung (Error) erhalten! Mit dem Icon {{ warning_icon }} teilen wir dir in diesem Tutorial jeweils mit, dass der einzugebende Code nicht wie erwartet funktionieren wird. Fehler zu machen (selbst absichtlich) ist ein wesentlicher Teil beim Lernen!
+We got our first error! The {{ warning_icon }} icon is our way of giving you a heads up that the code you are about to run won't work as expected. Making mistakes (even intentional ones) are an important part of learning!
-Unser erster Fehler sagt, dass Objekte vom Typ "int" (Integers, das sind ganze Zahlen) keine Länge haben. Was also nun? Vielleicht sollten wir unsere Zahl als String schreiben? Denn bei Strings funktioniert es ja, wie wir wissen.
+It says that objects of type "int" (integers, whole numbers) have no length. So what can we do now? Maybe we can write our number as a string? Strings have a length, right?
{% filename %}command-line{% endfilename %}
@@ -164,18 +148,18 @@ Unser erster Fehler sagt, dass Objekte vom Typ "int" (Integers, das sind ganze Z
6
```
-Ja, das funktioniert! Hier haben wir die `str`-Funktion innerhalb der Funktion `len` aufgerufen. `str()` konvertiert alles zu einem String.
+It worked! We used the `str` function inside of the `len` function. `str()` converts everything to strings.
- Die `str`-Funktion wandelt den übergebenen Wert in einen **String** um.
- Die `int`-Funktion wandelt den übergebenen Wert in einen **Integer** um.
-> Wichtig: Zwar können wir Zahlen in Text umwandeln, aber nicht immer auch Text in Zahlen - was beispielsweise sollte `int('hello')` ergeben?
+> Important: we can convert numbers into text, but we can't necessarily convert text into numbers – what would `int('hello')` be anyway?
-## Variablen
+## Variables
-Ein wichtiger Bestandteil beim Programmieren sind Variablen. Eine Variable ist einfach ein Name für etwas, das wir später unter genau diesem Namen wieder verwenden können. Programmiererinnen nutzen Variablen, um Daten zu speichern, den Code lesbar zu halten und um sich nicht immer alles merken zu müssen.
+An important concept in programming is variables. A variable is nothing more than a name for something so you can use it later. Programmers use these variables to store data, make their code more readable and so they don't have to keep remembering what things are.
-Lass uns eine Variable mit der Bezeichnung `name` anlegen:
+Let's say we want to create a new variable called `name`:
{% filename %}command-line{% endfilename %}
@@ -183,9 +167,9 @@ Lass uns eine Variable mit der Bezeichnung `name` anlegen:
>>> name = "Ola"
```
-Wir geben ein: name ist gleich "Ola".
+We type name equals Ola.
-Du hast sicher schon bemerkt, dass Python diesmal kein Ergebnis zurückgegeben hat. Woher sollen wir nun wissen, dass es die Variable jetzt auch tatsächlich gibt? Gib `name` ein und drücke wieder auf `Enter`:
+As you've noticed, your program didn't return anything like it did before. So how do we know that the variable actually exists? Enter `name` and hit `enter`:
{% filename %}command-line{% endfilename %}
@@ -194,7 +178,7 @@ Du hast sicher schon bemerkt, dass Python diesmal kein Ergebnis zurückgegeben h
'Ola'
```
-Hurra! Deine erste Variable :)! Nun kannst du auch stets ändern, was sie enthalten soll:
+Yippee! Your first variable! :) You can always change what it refers to:
{% filename %}command-line{% endfilename %}
@@ -204,7 +188,7 @@ Hurra! Deine erste Variable :)! Nun kannst du auch stets ändern, was sie enthal
'Sonja'
```
-Du kannst die Variable auch in Funktionen verwenden:
+You can use it in functions too:
{% filename %}command-line{% endfilename %}
@@ -213,7 +197,7 @@ Du kannst die Variable auch in Funktionen verwenden:
5
```
-Das ist toll, oder? Variablen können alles enthalten, also auch Zahlen. Versuche Folgendes:
+Awesome, right? Now, variables can be anything – numbers too! Try this:
{% filename %}command-line{% endfilename %}
@@ -224,7 +208,7 @@ Das ist toll, oder? Variablen können alles enthalten, also auch Zahlen. Versuch
24
```
-Was aber, wenn wir für eine Variable den falschen Namen verwenden? Uns einfach vertippen. Hast du schon eine leise Ahnung, was dann passiert? Probieren wir es aus!
+But what if we used the wrong name? Can you guess what would happen? Let's try!
{% filename %}{{ warning_icon }} command-line{% endfilename %}
@@ -236,13 +220,13 @@ Traceback (most recent call last):
NameError: name 'ctiy' is not defined
```
-Ein Fehler! Wie du siehst, kennt Python verschiedene Arten von Fehlern. In unserem Fall hier ist es ein **NameError**. Python liefert diesen Fehler immer dann, wenn du versuchst, eine Variable zu verwenden, die es noch gar nicht gibt. Wenn du einen solchen Fehler erhältst, prüfe einfach in deinem Code, ob du dich irgendwo vertippt hast.
+An error! As you can see, Python has different types of errors and this one is called a **NameError**. Python will give you this error if you try to use a variable that hasn't been defined yet. If you encounter this error later, check your code to see if you've mistyped any names.
-Spiel einfach ein wenig rum und schaue, was alles so passiert.
+Play with this for a while and see what you can do!
-## Die print-Funktion
+## The print function
-Gib einmal Folgendes ein:
+Try this:
{% filename %}command-line{% endfilename %}
@@ -254,15 +238,15 @@ Gib einmal Folgendes ein:
Maria
```
-Wenn du in der zweiten Zeile `name` eintippst, dann gibt der Python-Interpreter die String-*Darstellung* (engl. 'representation') der Variable 'name' aus. In unserem Beispiel die Buchstaben M-a-r-i-a, umschlossen von einfachen Anführungszeichen ('). Wenn du hingegen `print(name)` schreibst, dann gibt Python den Inhalt der Variablen ohne die Anführungszeichen zurück, was etwas schöner aussieht.
+When you just type `name`, the Python interpreter responds with the string *representation* of the variable 'name', which is the letters M-a-r-i-a, surrounded by single quotes, ''. When you say `print(name)`, Python will "print" the contents of the variable to the screen, without the quotes, which is neater.
-Wie wir später sehen werden, ist `print()` auch recht nützlich, wenn wir etwas aus Funktionen heraus ausgeben möchten oder auch eine Ausgabe über mehrere Zeilen darstellen wollen.
+As we'll see later, `print()` is also useful when we want to print things from inside functions, or when we want to print things on multiple lines.
-## Listen
+## Lists
-Außer Strings (Zeichenketten) und Integern (ganze Zahlen) hat Python noch viele andere Arten von Datentypen. Von denen wollen wir uns nun **Listen** anschauen. Listen sind genau das, was du wahrscheinlich schon vermutest: Es sind Objekte, die Listen von anderen Objekten enthalten. :)
+Beside strings and integers, Python has all sorts of different types of objects. Now we're going to introduce one called **list**. Lists are exactly what you think they are: objects which are lists of other objects. :)
-Legen wir los und erzeugen eine Liste:
+Go ahead and create a list:
{% filename %}command-line{% endfilename %}
@@ -271,7 +255,7 @@ Legen wir los und erzeugen eine Liste:
[]
```
-Ja, dies ist eine leere Liste. Für uns noch nicht sehr nützlich. Legen wir nun eine Liste von Lottozahlen an. Da wir uns nicht dauernd wiederholen wollen, ordnen wir diese Liste auch direkt einer Variablen zu:
+Yes, this list is empty. Not very useful, right? Let's create a list of lottery numbers. We don't want to repeat ourselves all the time, so we will put it in a variable, too:
{% filename %}command-line{% endfilename %}
@@ -279,7 +263,7 @@ Ja, dies ist eine leere Liste. Für uns noch nicht sehr nützlich. Legen wir nun
>>> lottery = [3, 42, 12, 19, 30, 59]
```
-So, nun haben wir eine Liste mit Lottozahlen! Was aber können wir damit tun? Zuerst einmal wollen wir feststellen, wie viele Zahlen in ihr enthalten sind. Hast du schon eine Idee, wie dies geht? Klar, das weißt du ja bereits!
+All right, we have a list! What can we do with it? Let's see how many lottery numbers there are in a list. Do you have any idea which function you should use for that? You know this already!
{% filename %}command-line{% endfilename %}
@@ -288,7 +272,7 @@ So, nun haben wir eine Liste mit Lottozahlen! Was aber können wir damit tun? Zu
6
```
-Genau! `len()` liefert die Anzahl von Objekten in einer Liste zurück. Praktisch, nicht wahr? Nun wollen wir die Liste sortieren:
+Yes! `len()` can give you a number of objects in a list. Handy, right? Maybe we will sort it now:
{% filename %}command-line{% endfilename %}
@@ -296,7 +280,7 @@ Genau! `len()` liefert die Anzahl von Objekten in einer Liste zurück. Praktisch
>>> lottery.sort()
```
-Diese Anweisung gibt nichts zurück, sie hat aber die Reihenfolge der Objekte in der Liste geändert. Um zu sehen, was passiert ist, müssen wir die Liste ausgeben:
+This doesn't return anything, it just changed the order in which the numbers appear in the list. Let's print it out again and see what happened:
{% filename %}command-line{% endfilename %}
@@ -305,9 +289,9 @@ Diese Anweisung gibt nichts zurück, sie hat aber die Reihenfolge der Objekte in
[3, 12, 19, 30, 42, 59]
```
-Wie du siehst, sind die Zahlen in der Liste nun aufsteigend sortiert. Super!
+As you can see, the numbers in your list are now sorted from the lowest to highest value. Congrats!
-Aber vielleicht wollten wir es genau andersherum haben? Nichts leichter als das!
+Maybe we want to reverse that order? Let's do that!
{% filename %}command-line{% endfilename %}
@@ -317,7 +301,7 @@ Aber vielleicht wollten wir es genau andersherum haben? Nichts leichter als das!
[59, 42, 30, 19, 12, 3]
```
-Einfach, oder? Du kannst auch etwas zu deiner Liste hinzufügen:
+If you want to add something to your list, you can do this by typing this command:
{% filename %}command-line{% endfilename %}
@@ -327,7 +311,7 @@ Einfach, oder? Du kannst auch etwas zu deiner Liste hinzufügen:
[59, 42, 30, 19, 12, 3, 199]
```
-Falls du nicht immer die gesamte Liste, sondern beispielsweise nur den ersten Eintrag sehen möchtest, kannst du dafür **Indizes** benützen. Ein Index gibt die Stelle innerhalb einer Liste an, die uns interessiert. Programmierer bevorzugen es, bei 0 mit dem Zählen anzufangen. Also hat das erste Objekt in deiner Liste den Index 0, das nächste die 1 und so weiter. Gib einmal Folgendes ein:
+If you want to show only the first number, you can do this by using **indexes**. An index is the number that says where in a list an item occurs. Programmers prefer to start counting at 0, so the first object in your list is at index 0, the next one is at 1, and so on. Try this:
{% filename %}command-line{% endfilename %}
@@ -338,9 +322,9 @@ Falls du nicht immer die gesamte Liste, sondern beispielsweise nur den ersten Ei
42
```
-Wie du siehst, kannst du auf die einzelnen Objekte in deiner Liste zugreifen, indem du den Namen der Liste verwendest und anschließend den Index in eckigen Klammern anfügst.
+As you can see, you can access different objects in your list by using the list's name and the object's index inside of square brackets.
-Um etwas aus deiner Liste zu löschen, musst du die **Indizes** wie gerade gelernt benutzen und die `pop()`-Methode. Lass uns ein Beispiel versuchen und das festigen, was wir zuvor gelernt haben; wir werden die erste Nummer aus unserer Liste löschen.
+To delete something from your list you will need to use **indexes** as we learned above and the `pop()` method. Let's try an example and reinforce what we learned previously; we will be deleting the first number of our list.
{% filename %}command-line{% endfilename %}
@@ -355,17 +339,17 @@ Um etwas aus deiner Liste zu löschen, musst du die **Indizes** wie gerade geler
[42, 30, 19, 12, 3, 199]
```
-Das hat doch super geklappt!
+That worked like a charm!
-Probier einmal andere Indizes aus: 6, 7, 1000, -1, -6 oder -1000 und versuch dir das Ergebnis vorzustellen, bevor du den jeweiligen Index verwendest. Sind die Ergebnisse sinnvoll?
+For extra fun, try some other indexes: 6, 7, 1000, -1, -6 or -1000. See if you can predict the result before trying the command. Do the results make sense?
-Eine Liste aller Methoden, die du auf Listen anwenden kannst, findest du in der Python-Dokumentation: https://docs.python.org/3/tutorial/datastructures.html
+You can find a list of all available list methods in this chapter of the Python documentation: https://docs.python.org/3/tutorial/datastructures.html
## Dictionaries
-> Für die Leser zu Hause: Dieses Kapitel wird im Video [Installing Python Code Editor](https://www.youtube.com/watch?v=ZX1CVvZLE6c) behandelt.
+> For readers at home: this part is covered in the [Python Basics: Dictionaries](https://www.youtube.com/watch?v=ZX1CVvZLE6c) video.
-Ein Wörterbuch (von nun an mit dem englischen Begriff 'Dictionary' bezeichnet) verhält sich ähnlich wie eine Liste, jedoch greifen wir auf die enthaltenen Objekte nicht mit einem Index, sondern mit einem Schlüssel zu (auf englisch 'key', und auch hier verwenden wir im weiteren den englischen Begriff). Ein 'key' kann ein String oder eine Zahl sein. Ein leeres Dictionary legen wir wie folgt an:
+A dictionary is similar to a list, but you access values by looking up a key instead of a numeric index. A key can be any string or number. The syntax to define an empty dictionary is:
{% filename %}command-line{% endfilename %}
@@ -374,9 +358,9 @@ Ein Wörterbuch (von nun an mit dem englischen Begriff 'Dictionary' bezeichnet)
{}
```
-Und schon hast du ein leeres Dictionary erstellt. Super!
+This shows that you just created an empty dictionary. Hurray!
-Nun gib einmal Folgendes ein (verwende statt 'Ola' usw. deine eigenen Informationen):
+Now, try writing the following command (try substituting your own information, too):
{% filename %}command-line{% endfilename %}
@@ -384,13 +368,13 @@ Nun gib einmal Folgendes ein (verwende statt 'Ola' usw. deine eigenen Informatio
>>> participant = {'name': 'Ola', 'country': 'Poland', 'favorite_numbers': [7, 42, 92]}
```
-Du hast nun soeben die Variable mit dem Namen `participant` angelegt, die ein Dictionary mit drei key-value Paaren enthält (values, also Werte, sind die Objekte in einem Dictionary, - aber auch hier bleiben wir beim englischen Begriff):
+With this command, you just created a variable named `participant` with three key–value pairs:
- Der key `name` verweist auf den value `'Ola'` (welches ein `string` Objekt ist),
- `country` verweist auf `'Poland'` (ebenfalls ein `string` Objekt),
- und `favorite_numbers` schließlich verweist auf `[7, 42, 92]` (eine `Liste` mit drei Zahlen).
-Auf die einzelnen Objekte in einem Dictionary kannst du wie folgt zugreifen:
+You can check the content of individual keys with this syntax:
{% filename %}command-line{% endfilename %}
@@ -399,9 +383,9 @@ Auf die einzelnen Objekte in einem Dictionary kannst du wie folgt zugreifen:
Ola
```
-Also ganz ähnlich wie bei einer Liste. Aber statt dir einen Index merken zu müssen, benutzt du bei einem Dictionary einfach einen key (hier: den String 'name').
+See, it's similar to a list. But you don't need to remember the index – just the name.
-Was aber geschieht, wenn wir Python nach dem Wert eines keys fragen, den es gar nicht gibt? Errätst du es schon? Probieren wir es einfach aus und schauen was passiert!
+What happens if we ask Python the value of a key that doesn't exist? Can you guess? Let's try it and see!
{% filename %}{{ warning_icon }} command-line{% endfilename %}
@@ -412,33 +396,33 @@ Traceback (most recent call last):
KeyError: 'age'
```
-Ah, wieder ein Fehler! Diesmal ein **KeyError**. Python hilft uns auch hier und sagt uns, dass es den key `'age'` in diesem Dictionary gar nicht gibt.
+Look, another error! This one is a **KeyError**. Python is helpful and tells you that the key `'age'` doesn't exist in this dictionary.
-Wenn du zwischen Dictionaries und Listen wählen kannst, wann sollte welche Datenstruktur verwendet werden? Das ist eine gute Frage, über die es sich nachzudenken lohnt; und vielleicht möchtest du dies kurz tun, bevor du weiterliest.
+When should you use a dictionary or a list? Well, that's a good point to ponder. Think about the answer before looking at it in the next line.
- Du brauchst nur eine geordnete Folge von Elementen? Dann wähle eine Liste.
- Du brauchst eine Sammlung von Elementen, auf die du später einzeln, gezielt und effizient mit Hilfe eines Namens (d.h. keys) zugreifen kannst? Dann wähle ein Dictionary.
-Dictionaries sind, so wie auch Listen, *mutable*, d. h. nachträglich veränderbar. So kannst du bei Dictionaries später noch weitere key-value Paare hinzufügen:
+Like lists, using the `len()` function on the dictionaries returns the number of key–value pairs in the dictionary. Go ahead and type in this command:
{% filename %}command-line{% endfilename %}
```python
->>> participant['favorite_language'] = 'Python'
+>>> len(participant)
+3
```
-Wie bei Listen können wir auch bei Dictionaries die `len()`-Funktion verwenden, um die Zahl der enthaltenen Einträge (das sind die key-value Paare) zu ermitteln. Probier es gleich aus und tippe dieses Kommando ein:
+Dictionaries, like lists, are *mutable*, meaning that they can be changed after they are created. You can add new key–value pairs to a dictionary after it is created, like this:
{% filename %}command-line{% endfilename %}
```python
->>> len(participant)
-4
+>>> participant['favorite_language'] = 'Python'
```
-Wir hoffen, dass das Alles für dich bisher Sinn ergibt. :) Bist du bereit für mehr Spaß mit Dictionaries? Machen wir weiter.
+I hope it makes sense up to now. :) Ready for some more fun with dictionaries? Read on for some amazing things.
-Zum Löschen von Elementen kannst du den `pop()`-Befehl verwenden. Nehmen wir an, du möchtest den Eintrag mit dem key `'favorite_numbers'` entfernen, dann tippe:
+You can use the `pop()` method to delete an item in the dictionary. Say, if you want to delete the entry corresponding to the key `'favorite_numbers'`, type in the following command:
{% filename %}command-line{% endfilename %}
@@ -449,9 +433,9 @@ Zum Löschen von Elementen kannst du den `pop()`-Befehl verwenden. Nehmen wir an
{'country': 'Poland', 'favorite_language': 'Python', 'name': 'Ola'}
```
-Wie du an der Ausgabe erkennst, ist nun das key-value Paar von 'favorite_numbers' gelöscht.
+As you can see from the output, the key–value pair corresponding to the 'favorite_numbers' key has been deleted.
-Ebenso kannst du auch den Wert eines bestehenden Eintrages ändern:
+As well as this, you can also change a value associated with an already-created key in the dictionary. Type this:
{% filename %}command-line{% endfilename %}
@@ -461,24 +445,24 @@ Ebenso kannst du auch den Wert eines bestehenden Eintrages ändern:
{'country': 'Germany', 'favorite_language': 'Python', 'name': 'Ola'}
```
-Wie du siehst, hast du nun im key-value Paar mit dem key `'country'` den Wert von `'Poland'` nach `'Germany'` geändert. :) Hurra! Schon wieder was gelernt.
+As you can see, the value of the key `'country'` has been altered from `'Poland'` to `'Germany'`. :) Exciting? Hurrah! You just learned another amazing thing.
### Zusammenfassung
-Großartig! Inzwischen hast du schon einiges über Programmierung gelernt und die folgenden Dinge sind dir vertraut:
+Awesome! You know a lot about programming now. In this last part you learned about:
- **Errors** - Du weißt, wie sie zu lesen sind und dass Python sie dann ausgibt, wenn es eine Anweisung von dir nicht ausführen kann.
- **Variablen** - sind Namen für Objekte, die dir dabei helfen, deinen Code leichter zu schreiben und ihn dabei auch gut lesbar zu halten.
- **Listen** - können Objekte in einer geordneten Reihenfolge speichern.
- **Dictionaries** - speichern Objekte als key-value Paare.
-Schon gespannt auf den nächsten Teil? :)
+Excited for the next part? :)
-## Vergleichen
+## Compare things
-> Für die Leser zu Hause: Dieses Kapitel wird im Video [Python Basics: Comparisons](https://www.youtube.com/watch?v=7bzxqIKYgf4) behandelt.
+> For readers at home: this part is covered in the [Python Basics: Comparisons](https://www.youtube.com/watch?v=7bzxqIKYgf4) video.
-Ein großer Teil beim Programmieren besteht darin, Dinge zu vergleichen. Was lässt sich am besten vergleichen? Zahlen! Schauen wir uns mal an, wie das funktioniert:
+A big part of programming involves comparing things. What's the easiest thing to compare? Numbers! Let's see how that works:
{% filename %}command-line{% endfilename %}
@@ -497,11 +481,11 @@ True
True
```
-Hier haben wir Python einige Zahlen zum Vergleichen gegeben. Wie du siehst, kann Python nicht nur die Zahlen vergleichen, sondern auch die Ergebnisse von mathematischen Ausdrücken wie `2 * 2` und Funktionswerte wie die `2`, die von `len([4, 5])` zurückgegeben wird. Cool, nicht wahr?
+We gave Python some numbers to compare. As you can see, not only can Python compare numbers, but it can also compare values of mathematical expressions like `2 * 2` and function results like the `2` returned by `len([4, 5])`. Nice, huh?
-Womöglich wunderst du dich aber über die beiden `==` Gleichheitszeichen zum Vergleich, ob zwei Zahlen den selben Wert haben? Ein einfaches Gleichheitszeichen `=` verwenden wir bereits, um Variablen bestimmte Werte zuzuweisen. Da beim Programmieren alle Anweisungen eindeutig sein müssen, benötigst du in Python daher **stets** zwei `==` Zeichen, um Dinge auf Gleichheit zu testen. Wir können auch feststellen, ob Werte unterschiedlich sind. Dafür verwenden wir das Symbol `!=`, wie im obigen Beispiel.
+Do you wonder why we put two equal signs `==` next to each other to compare if numbers are equal? We use a single `=` for assigning values to variables. You always, **always** need to put two of them – `==` – if you want to check if things are equal to each other. We can also state that things are unequal to each other. For that, we use the symbol `!=`, as shown in the example above.
-Nun noch zwei weitere Vergleiche:
+Give Python two more tasks:
{% filename %}command-line{% endfilename %}
@@ -512,14 +496,14 @@ True
False
```
-`>` und `<` sind klar, was aber sollen `>=` und `<=` bedeuten? Vergleiche liest du folgendermaßen:
+We've seen `>` and `<`, but what do `>=` and `<=` mean? Read them like this:
- x `>` y bedeutet: x ist größer als y
- x `<` y bedeutet: x ist kleiner als y
- x `<=` y bedeutet: x ist kleiner oder gleich y
- x `>=` y bedeutet: x ist größer oder gleich y
-Sensationell! Lust auf mehr? Dann probier das:
+Awesome! Wanna do one more? Try this:
{% filename %}command-line{% endfilename %}
@@ -532,12 +516,12 @@ False
True
```
-Du kannst Python beliebig viele Vergleiche vornehmen lassen und wirst ein Ergebnis erhalten. Das ist wirklich cool, oder?
+You can give Python as many numbers to compare as you want, and it will give you an answer! Pretty smart, right?
- **and** - wenn Du den `and`-Operator verwendest, müssen beide Vergleiche True (d.h. wahr) ergeben, damit das Gesamtergebnis auch True ist
- **or** - wenn Du den `or`-Operator verwendest, genügt es, wenn einer der beiden Vergleiche True ergibt, damit das Gesamtergebnis True ergibt
-Die Redewendung "Äpfel mit Birnen zu vergleichen" hast du bestimmt schon einmal gehört. Machen wir dies doch einmal in Python:
+Have you heard of the expression "comparing apples to oranges"? Let's try the Python equivalent:
{% filename %}{{ warning_icon }} command-line{% endfilename %}
@@ -548,20 +532,20 @@ Traceback (most recent call last):
TypeError: '>' not supported between instances of 'int' and 'str'
```
-Unterschiedliche Dinge, hier die Datentypen Zahlen (`int`) und Strings (`str`), lassen sich auch in Python nicht miteinander vergleichen. In solch einem Fall liefert uns Python einen **TypeError** und sagt uns, dass diese zwei Datentypen nicht miteinander verglichen werden können.
+Here you see that just like in the expression, Python is not able to compare a number (`int`) and a string (`str`). Instead, it shows a **TypeError** and tells us the two types can't be compared together.
## Boolean
-Du hast gerade einen neuen Typ von Python-Objekten kennen gelernt. Er heisst **Boolean**.
+Incidentally, you just learned about a new type of object in Python. It's called **Boolean**.
-Es gibt zwei Boolean-Objekte:
+There are only two Boolean objects:
- True (wahr)
- False (falsch)
-Damit Python diese beiden Werte versteht, musst du sie auch genau so schreiben (den ersten Buchstaben groß, alle weiteren klein). **true, TRUE und tRUE funktionieren nicht – nur True ist korrekt.** (Dasselbe gilt auch für False.)
+But for Python to understand this, you need to always write it as 'True' (first letter uppercase, with the rest of the letters lowercased). **true, TRUE, and tRUE won't work – only True is correct.** (The same applies to 'False' as well.)
-Auch Booleans können Variablen zugewiesen werden:
+Booleans can be variables, too! See here:
{% filename %}command-line{% endfilename %}
@@ -571,7 +555,7 @@ Auch Booleans können Variablen zugewiesen werden:
True
```
-Auch Folgendes geht:
+You can also do it this way:
{% filename %}command-line{% endfilename %}
@@ -581,37 +565,38 @@ Auch Folgendes geht:
False
```
-Übe ein wenig, indem du mit Booleans rumspielst, zum Beispiel mit diesen Anweisungen:
+Practice and have fun with Booleans by trying to run the following commands:
- `True and True`
- `False and True`
- `True or 1 == 1`
- `1 != 2`
-Glückwunsch! Booleans sind echt eine der coolsten Features beim Programmieren und du hast gerade gelernt, damit umzugehen!
+Congrats! Booleans are one of the coolest features in programming, and you just learned how to use them!
# Speicher es!
-> Für die Leser zu Hause: Dieses Kapitel wird im Video [Python Basics: Saving files and "If" statement](https://www.youtube.com/watch?v=dOAg6QVAxyk) behandelt.
+> For readers at home: this part is covered in the [Python Basics: Saving files and "If" statement](https://www.youtube.com/watch?v=dOAg6QVAxyk) video.
-Bisher haben wir den Python-Code nur im Interpreter eingegeben, wodurch wir immer nur eine Zeile Code auf einmal ausführen konnten. Richtige Programme dagegen werden in Dateien gespeichert und, je nach Programmiersprache, durch einen **Interpreter** ausgeführt oder durch einen **Compiler** übersetzt. Unseren bisherigen Code haben wir dagegen im Python-**Interpreter** Zeile für Zeile eingegeben und einzeln ausgeführt. Für die nächsten Beispiele brauchen wir mehr als eine Zeile, daher werden wir nun:
+So far we've been writing all our python code in the interpreter, which limits us to entering one line of code at a time. Normal programs are saved in files and executed by our programming language **interpreter** or **compiler**. So far we've been running our programs one line at a time in the Python **interpreter**. We're going to need more than one line of code for the next few tasks, so we'll quickly need to:
- Den Python-Interpreter beenden
- Einen Code-Editor unserer Wahl öffnen
- Code eingeben und diesen in einer Python-Datei sichern
- Und diesen dann laufen lassen!
-Um den Python-Interpreter zu beenden, nutze die `exit()`-Funktion
+To exit from the Python interpreter that we've been using, type the `exit()` function
{% filename %}command-line{% endfilename %}
```python
>>> exit()
+$
```
-Nun siehst du wieder den normalen Kommandozeilen-Prompt.
+This will put you back into the command prompt.
-Im Kapitel [Code-Editor](../code_editor/README.md) haben wir uns bereits einen Code-Editor ausgesucht. Nun öffnen wir den Code-Editor und schreiben folgenden Code in eine neue Datei (wenn du ein Chromebook benutzt, dann erstelle eine neue Datei in der Cloud-IDE, öffne sie und du befindest dich automatisch im integrierten Code-Editor):
+Earlier, we picked out a code editor from the [code editor](../code_editor/README.md) section. We'll need to open the editor now and write some code into a new file (or if you're using a Chromebook, create a new file in the cloud IDE and open the file, which will be in the included code editor):
{% filename %}editor{% endfilename %}
@@ -619,18 +604,18 @@ Im Kapitel [Code-Editor](../code_editor/README.md) haben wir uns bereits einen C
print('Hello, Django girls!')
```
-Da du nun schon einige Python-Erfahrung hast, schreibe ein wenig Code mit dem, was du bislang gelernt hast.
+Obviously, you're a pretty seasoned Python developer now, so feel free to write some code that you've learned today.
-Als nächstes wollen wir diesen Code in einer Datei mit einem aussagekräftigen Namen speichern. Lass uns die Datei **python_intro.py** nennen und auf dem Desktop speichern. Wir können der Datei jeden Namen geben, den wir wollen, aber es ist wichtig sicherzustellen, dass der Dateiname auf **.py** endet. Die Erweiterung **.py** gibt unserem Betriebssystem an, dass dies ein **Python executable file** ist und Python diese ausführen kann.
+Now we need to save the file and give it a descriptive name. Let's call the file **python_intro.py** and save it to your desktop. We can name the file anything we want, but the important part here is to make sure the file ends in **.py**. The **.py** extension tells our operating system that this is a **Python executable file** and Python can run it.
-> **Hinweis:** Du wirst eines der coolsten Eigenschaften von Code-Editoren bemerken: Farben! In der Python-Konsole hatte alles die gleiche Farbe. Der Code-Editor dagegen sollte dir nun die `print`-Funktion in einer anderen Farbe anzeigen als der von ihr auszugebende Text. Dies wird "Syntax Hervorhebung" ("syntax highlighting") genannt und ist ein wirklich sehr nützliches Werkzeug beim Programmieren. Die Farbe von Dingen gibt dir Hinweise auf z.B. nicht geschlossene Zeichenfolgen oder Tippfehler in einem Schlüsselwort (wie das `def` in einer Funktion, das wir weiter unten sehen werden). Dies ist einer der Gründe, warum wir Code-Editoren verwenden. :)
+> **Note** You should notice one of the coolest thing about code editors: colors! In the Python console, everything was the same color; now you should see that the `print` function is a different color from the string. This is called "syntax highlighting", and it's a really useful feature when coding. The color of things will give you hints, such as unclosed strings or a typo in a keyword name (like the `def` in a function, which we'll see below). This is one of the reasons we use a code editor. :)
-Nun, da die Datei gesichert ist, wollen wir sie ausführen! Nutze, was du bisher über die Kommandozeile (das mit dem Prompt) gelernt hast, um in der Konsole in das Desktop-Verzeichnis zu wechseln.
+With the file saved, it's time to run it! Using the skills you've learned in the command line section, use the terminal to **change directories** to the desktop.
-Auf einem Mac sieht das etwa so aus:
+On a Mac, the command will look something like this:
{% filename %}command-line{% endfilename %}
@@ -642,20 +627,20 @@ Auf einem Mac sieht das etwa so aus:
-Unter Linux ist es ähnlich:
+On Linux, it will be like this:
{% filename %}command-line{% endfilename %}
$ cd ~/Desktop
-(Denk daran, dass das "Desktop"-Verzeichnis bei dir "Schreibtisch" heißen kann.)
+(Remember that the word "Desktop" might be translated to your local language.)
-In der Eingabeaufforderung von Windows wird's so sein:
+On Windows Command Prompt, it will be like this:
{% filename %}command-line{% endfilename %}
@@ -666,7 +651,7 @@ In der Eingabeaufforderung von Windows wird's so sein:
-Und in der Powershell von Windows so:
+And on Windows Powershell, it will be like this:
{% filename %}command-line{% endfilename %}
@@ -675,17 +660,17 @@ Und in der Powershell von Windows so:
-Wenn du nicht weiterkommst, frag' um Hilfe. Denn genau dafür sind die Coaches da!
+If you get stuck, ask for help. That's exactly what the coaches are here for!
-Benutze jetzt Python, um den Code in der Datei auszuführen:
+Now use Python to execute the code in the file like this:
{% filename %}command-line{% endfilename %}
- $ python3 python_intro.py
+ $ python3 python_intro.py
Hello, Django girls!
-Hinweis: Unter Windows gibt es den 'python3'-Befehl nicht. Verwende stattdessen 'python', um die Datei auszuführen:
+Note: on Windows 'python3' is not recognized as a command. Instead, use 'python' to execute the file:
{% filename %}command-line{% endfilename %}
@@ -693,15 +678,15 @@ Hinweis: Unter Windows gibt es den 'python3'-Befehl nicht. Verwende stattdessen
> python python_intro.py
```
-Prima! Du hast soeben dein erstes Python-Programm aus einer Datei heraus ausgeführt. Großartig, oder?
+Alright! You just ran your first Python program that was saved to a file. Feel awesome?
-Nun wollen wir uns einem wichtigen Teil der Programmierung zuwenden:
+You can now move on to an essential tool in programming:
-## Wenn ... sonst-wenn ... sonst (If … elif … else)
+## If … elif … else
-Oft sollen manche Programmteile nur ausgeführt werden, wenn bestimmte Vorbedingungen erfüllt sind. Dafür gibt es in Python sogenannte **if-Anweisungen**.
+Lots of things in code should be executed only when given conditions are met. That's why Python has something called **if statements**.
-Nun ändere den Code in deiner **python_intro.py** Datei:
+Replace the code in your **python_intro.py** file with this:
{% filename %}python_intro.py{% endfilename %}
@@ -709,7 +694,7 @@ Nun ändere den Code in deiner **python_intro.py** Datei:
if 3 > 2:
```
-Würden wir das nun speichern und anschließend ausführen, würden wir einen Fehler erhalten:
+If we were to save and run this, we'd see an error like this:
{% filename %}{{ warning_icon }} command-line{% endfilename %}
@@ -719,7 +704,7 @@ Würden wir das nun speichern und anschließend ausführen, würden wir einen Fe
SyntaxError: unexpected EOF while parsing
-Python erwartet hier noch weiteren Programmcode, der ausgeführt werden soll, wenn die Bedingung `3 > 2` wahr ist (also `True` ergibt). Versuchen wir, Python “It works!” ausgeben zu lassen. Ändere den Code in **python_intro.py** zu:
+Python expects us to give further instructions to it which are executed if the condition `3 > 2` turns out to be true (or `True` for that matter). Let’s try to make Python print “It works!”. Change your code in your **python_intro.py** file to this:
{% filename %}python_intro.py{% endfilename %}
@@ -728,41 +713,41 @@ if 3 > 2:
print('It works!')
```
-Du fragst dich nun, warum wir die angefügte Zeile mit 4 Leerzeichen eingerückt haben? Damit teilen wir Python mit, dass dieser Code ausgeführt werden soll, wenn die vorhergehende Bedingung True ergeben hat. Du könntest auch eine andere Anzahl von Leerzeichen wählen, aber fast alle Python-Programmier nutzen 4 Leerzeichen, damit's gut aussieht. Ein einfaches Tab zählt auch wie 4 Leerzeichen, sofern dies in deinem Editor so eingestellt ist. Wenn du dich einmal entschieden hast, bleib dabei! Wenn du mit 4 Leerzeichen angefangen hast, solltest du alle weiteren Einrückungen auch mit 4 Leerzeichen machen, anderweitig könnte das Probleme verursachen.
+Notice how we've indented the next line of code by 4 spaces? We need to do this so Python knows what code to run if the result is true. You can do one space, but nearly all Python programmers do 4 to make things look neat. A single Tab will also count as 4 spaces as long as your text editor is set to do so. When you made your choice, don't change it! If you already indented with 4 spaces, make any future indentation with 4 spaces, too - otherwise you may run into problems.
-Nun sichere die Datei und führe sie noch einmal aus:
+Save it and give it another run:
{% filename %}command-line{% endfilename %}
```python
-$ python3 python_intro.py
+$ python3 python_intro.py
It works!
```
-Hinweis: Denk daran, dass Windows den 'python3'-Befehl nicht kennt. Falls du auf Windows arbeitest, verwende ab jetzt immer 'python', wenn in dieser Anleitung 'python3' steht.
+Note: Remember that on Windows, 'python3' is not recognized as a command. From now on, replace 'python3' with 'python' to execute the file.
### Was passiert, wenn eine Bedingung nicht wahr (not True) ist?
-In den vorigen Beispielen wurde Code ausgeführt, wenn eine vorhergehende Bedingung True (wahr) ergab. Aber Python kennt auch `elif`- und `else`-Anweisungen:
+In previous examples, code was executed only when the conditions were True. But Python also has `elif` and `else` statements:
{% filename %}python_intro.py{% endfilename %}
```python
if 5 > 2:
- print('5 ist wirklich größer als 2')
+ print('5 is indeed greater than 2')
else:
- print('5 ist nicht größer als 2')
+ print('5 is not greater than 2')
```
-Wenn dies ausgeführt wird, wird es anzeigen:
+When this is run it will print out:
{% filename %}command-line{% endfilename %}
- $ python3 python_intro.py
- 5 ist wirklich größer als 2
+ $ python3 python_intro.py
+ 5 is indeed greater than 2
-Wenn 2 größer als 5 wäre, würde die zweite Anweisung (die nach dem else) ausgeführt. Schauen wir uns nun an, wie `elif` funktioniert:
+If 2 were a greater number than 5, then the second command would be executed. Let's see how `elif` works:
{% filename %}python_intro.py{% endfilename %}
@@ -776,7 +761,7 @@ else:
print('Hey anonymous!')
```
-und ausgeführt erhalten wir:
+and executed:
{% filename %}command-line{% endfilename %}
@@ -784,56 +769,56 @@ und ausgeführt erhalten wir:
Hey Sonja!
-Hast du bemerkt, was passiert ist? `elif` lässt dich zusätzliche Bedingungen hinzufügen, die geprüft werden, falls die vorherige fehlschlägt.
+See what happened there? `elif` lets you add extra conditions that run if the previous conditions fail.
-Du kannst so viele `elif`-Bedingungen nach der anfänglichen `if`-Anweisung hinzufügen, wie du magst. Zum Beispiel:
+You can add as many `elif` statements as you like after your initial `if` statement. For example:
{% filename %}python_intro.py{% endfilename %}
```python
-volume = 57 # "volume" ist Englisch für "Lautstärke"
+volume = 57
if volume < 20:
- print("Das ist etwas leise.")
+ print("It's kinda quiet.")
elif 20 <= volume < 40:
- print("Das ist gut für Hintergrund-Musik.")
+ print("It's nice for background music")
elif 40 <= volume < 60:
- print("Perfekt, ich kann alle Details hören.")
+ print("Perfect, I can hear all the details")
elif 60 <= volume < 80:
- print("Gut für Partys.")
+ print("Nice for parties")
elif 80 <= volume < 100:
- print("Etwas laut!")
+ print("A bit loud!")
else:
- print("Mir tun die Ohren weh! :(")
+ print("My ears are hurting! :(")
```
-Python läuft durch jeden Test der Reihe nach und gibt dann aus:
+Python runs through each test in sequence and prints:
{% filename %}command-line{% endfilename %}
- $ python3 python_intro.py
- Perfekt, ich kann alle Details hören.
+ $ python3 python_intro.py
+ Perfect, I can hear all the details
-## Kommentare
+## Comments
-Kommentare sind Zeilen, die mit `#` beginnen. Du kannst nach dem `#` schreiben, was auch immer du willst, und Python wird es ignorieren. Kommentare können deinen Code für andere Leute einfacher zu verstehen machen.
+Comments are lines beginning with `#`. You can write whatever you want after the `#` and Python will ignore it. Comments can make your code easier for other people to understand.
-Schauen wir, wie das aussieht:
+Let's see how that looks:
{% filename %}python_intro.py{% endfilename %}
```python
-# Ändert die Lautstärke, wenn sie zu leise oder zu laut ist
+# Change the volume if it's too loud or too quiet
if volume < 20 or volume > 80:
volume = 50
- print("So ist's besser!")
+ print("That's better!")
```
-Du musst nicht für jede Codezeile einen Kommentar schreiben, aber Kommentare sind nützlich um zu erklären, wieso dein Code etwas macht, oder um zusammenzufassen, wenn er etwas Komplexes tut.
+You don't need to write a comment for every line of code, but they are useful for explaining why your code is doing something, or providing a summary when it's doing something complex.
### Zusammenfassung
-In den letzten paar Übungen hast du gelernt:
+In the last few exercises you learned about:
- **Vergleiche vorzunehmen** – in Python kannst du Vergleiche mit den folgenden Operatoren `>`, `>=`, `==`, `<=`, `<` sowie `and` und `or` vornehmen
- **Boolsche Datentypen** zu verwenden – dies sind Objekte, die nur zwei Werte annehmen können: `True` bzw. `False`
@@ -841,151 +826,151 @@ In den letzten paar Übungen hast du gelernt:
- **if … elif … else** – Anweisungen, die dir erlauben, bestimmte Programmteile nur auszuführen, wenn bestimmte Bedingungen erfüllt sind.
- **Kommentare** – Zeilen, die Python nicht ausführt und die dir ermöglichen deinen Code zu dokumentieren
-Zeit für den letzten Teil dieses Kapitels!
+Time for the last part of this chapter!
-## Deine eigenen Funktionen!
+## Your own functions!
-> Für die Leser zu Hause: Dieses Kapitel wird im Video [Python Basics: Functions](https://www.youtube.com/watch?v=5owr-6suOl0) behandelt.
+> For readers at home: this part is covered in the [Python Basics: Functions](https://www.youtube.com/watch?v=5owr-6suOl0) video.
-Erinnerst du dich an Funktionen wie `len()`, die du in Python aufrufen kannst? Prima! Du wirst nun lernen, eigene Funktionen zu schreiben!
+Remember functions like `len()` that you can execute in Python? Well, good news – you will learn how to write your own functions now!
-Eine Funktion ist eine Folge von Anweisungen, die Python ausführen soll. Jede Funktions-Definition beginnt mit dem Schlüsselwort (engl. "Keyword") `def`, bekommt einen Namen und kann Argumente (manchmal auch "Parameter" genannt) haben. Probieren wir's aus! Ersetze den Code in der Datei **python_intro.py** mit dem folgenden:
+A function is a sequence of instructions that Python should execute. Each function in Python starts with the keyword `def`, is given a name, and can have some parameters. Let's give it a go. Replace the code in **python_intro.py** with the following:
{% filename %}python_intro.py{% endfilename %}
```python
-def hallo():
- print("Halli-hallo!")
- print("Wie geht's?")
+def hi():
+ print('Hi there!')
+ print('How are you?')
-hallo()
+hi()
```
-Und schon hast du deine erste Funktion erstellt!
+Okay, our first function is ready!
-Nun fragst du dich vielleicht, warum wir am Ende der Datei den Namen der Funktion nochmal hingeschrieben haben. Wenn wir `def hallo():` und die darauf folgenden, eingerückten Zeilen schreiben, dann schreiben wir Anweisungen, was die `hallo()` Funktion tun soll. Python wird diese Anweisungen lesen und speichern, die Funktion jedoch noch nicht ausführen. Um Python zu sagen, dass wir die Funktion ausführen wollen, müssen wir die Funktion mit `hallo()` aufrufen. Python liest und führt die Datei von oben nach unten aus, daher müssen wir die Funktion in der Datei erst definieren bevor wir sie aufrufen.
+You may wonder why we've written the name of the function at the bottom of the file. When we write `def hi():` and the indented lines following, this is us writing instructions for what the `hi()` function should do. Python will read and remember these instructions, but won't run the function yet. To tell Python we want to run the function, we have to call the function with `hi()`. Python reads the file and executes it from top to bottom, so we have to define the function in the file before we call it.
-Schauen wir, was passiert, wenn wir die Datei ausführen:
+Let's run this now and see what happens:
{% filename %}command-line{% endfilename %}
$ python3 python_intro.py
- Halli-hallo!
- Wie geht's?
+ Hi there!
+ How are you?
-Falls das nicht funktionert hat, keine Panik! Die Ausgabe wird dir dabei helfen, herauszufinden wieso:
+Note: if it didn't work, don't panic! The output will help you to figure why:
- Wenn du einen `NameError` erhältst, hast du dich vermutlich irgendwo im Code vertippt. Prüfe also, ob du bei der Funktionsdefinition `def hallo():` und beim Funktionsaufruf `hallo()` den Funktionsnamen gleich geschrieben hast.
- Wenn du einen `IndentationError` bekommst, prüfe, ob beide `print`-Zeilen die gleichen Whitespaces am Zeilenanfang haben: Python will den ganzen Code in einer Funktion hübsch ausgerichtet haben.
- Wenn du gar keine Ausgabe erhältst, stelle sicher, dass `hallo()` am Datei-Ende *nicht* eingerückt ist. Wenn es eingerückt ist, ist dieser Aufruf selbst Teil der Funktion und sie wird gar nicht ausgeführt.
-Als Nächstes bauen wir Funktionen mit sogenannten Argumenten. Wir werden das gerade gebaute Beispiel benutzen – eine Funktion, die die ausführende Person begrüßt – aber diesmal mit Namen:
+Let's build our first function with parameters. We will change the previous example – a function that says 'hi' to the person running it – with a name:
{% filename %}python_intro.py{% endfilename %}
```python
-def hallo(name):
+def hi(name):
```
-Wie du siehst, geben wir der Funktion jetzt einen Parameter, den wir `name` nennen:
+As you can see, we now gave our function a parameter that we called `name`:
{% filename %}python_intro.py{% endfilename %}
```python
-def hallo(name):
+def hi(name):
if name == 'Ola':
- print('Hallo Ola!')
+ print('Hi Ola!')
elif name == 'Sonja':
- print('Hallo Sonja!')
+ print('Hi Sonja!')
else:
- print('Hallo Unbekannte(r)!')
+ print('Hi anonymous!')
-hallo()
+hi()
```
-Denk daran: Die `print`-Funktion ist 4 Leerzeichen innerhalb der `if`-Anweisung eingerückt. Das ist sinnvoll, da die Funktion ausgeführt wird, wenn die Bedingung eintritt. Mal sehen, wie das jetzt funktioniert:
+Remember: The `print` function is indented four spaces within the `if` statement. This is because the function runs when the condition is met. Let's see how it works now:
{% filename %}{{ warning_icon }} command-line{% endfilename %}
- $ python3 python_intro.py
- Traceback (most recent call last):
+ $ python3 python_intro.py
+ Traceback (most recent call last):
File "python_intro.py", line 10, in
- hallo()
- TypeError: hallo() missing 1 required positional argument: 'name'
+ hi()
+ TypeError: hi() missing 1 required positional argument: 'name'
-Hoppla, ein Fehler. Zum Glück gibt uns Python eine recht nützliche Fehlermeldung. Diese besagt, dass die Funktion `hallo()` (welche wir definiert haben) ein erforderliches Argument (namens `name`) hat und dass wir vergessen haben, dieses beim Funktionsaufruf mitzugeben. Lass uns das am unteren Ende der Datei schnell beheben:
+Oops, an error. Luckily, Python gives us a pretty useful error message. It tells us that the function `hi()` (the one we defined) has one required argument (called `name`) and that we forgot to pass it when calling the function. Let's fix it at the bottom of the file:
{% filename %}python_intro.py{% endfilename %}
```python
-hallo("Ola")
+hi("Ola")
```
-Und wir führen sie erneut aus:
+And run it again:
{% filename %}command-line{% endfilename %}
- $ python3 python_intro.py
- Hallo Ola!
+ $ python3 python_intro.py
+ Hi Ola!
-Und wenn wir den Namen ändern?
+And if we change the name?
{% filename %}python_intro.py{% endfilename %}
```python
-hallo("Sonja")
+hi("Sonja")
```
-Und ausgeführt:
+And run it:
{% filename %}command-line{% endfilename %}
- $ python3 python_intro.py
- Hallo Sonja!
+ $ python3 python_intro.py
+ Hi Sonja!
-Nun, was denkst du, wird passieren, wenn du einen anderen Namen dort hinein schreibst? (Weder Ola noch Sonja.) Probier es aus und schau, ob du richtig liegst. Es sollte das Folgende herauskommen:
+Now, what do you think will happen if you write another name in there? (Not Ola or Sonja.) Give it a try and see if you're right. It should print out this:
{% filename %}command-line{% endfilename %}
- Hallo Unbekannte(r)!
+ Hi anonymous!
-Das ist genial, oder? Auf diese Weise musst du dich nicht jedesmal wiederholen, wenn du den Namen der Person änderst, die die Funktion grüßen soll. Und das ist genau der Grund, warum wir Funktionen brauchen – du willst auf keinem Fall deinen Code wiederholen!
+This is awesome, right? This way you don't have to repeat yourself every time you want to change the name of the person the function is supposed to greet. And that's exactly why we need functions – you never want to repeat your code!
-Lass uns noch etwas Schlaueres probieren – es gibt schließlich mehr als zwei Namen und für jeden eine eigene Bedingung aufzuschreiben, wäre ziemlich aufwendig, oder? Ersetze also deinen Code in der Datei durch den folgenden:
+Let's do something smarter – there are more names than two, and writing a condition for each would be hard, right? Replace the content of your file with the following:
{% filename %}python_intro.py{% endfilename %}
```python
-def hallo(name):
- print('Hallo ' + name + '!')
+def hi(name):
+ print('Hi ' + name + '!')
-hallo("Rachel")
+hi("Rachel")
```
-Lass uns den Code aufrufen:
+Let's call the code now:
{% filename %}command-line{% endfilename %}
- $ python3 python_intro.py
- Hallo Rachel!
+ $ python3 python_intro.py
+ Hi Rachel!
-Herzlichen Glückwunsch! Du hast gerade gelernt, wie du Funktionen schreibst! :)
+Congratulations! You just learned how to write functions! :)
-## Schleifen
+## Loops
-> Für die Leser zu Hause: Dieses Kapitel wird im Video [Python Basics: For Loop](https://www.youtube.com/watch?v=aEA6Rc86HF0) behandelt.
+> For readers at home: this part is covered in the [Python Basics: For Loop](https://www.youtube.com/watch?v=aEA6Rc86HF0) video.
-Dies ist bereits der letzte Teil. Das ging doch schnell, oder? :)
+This is the last part already. That was quick, right? :)
-Programmierer wiederholen sich nicht gerne. Beim Programmieren geht es darum, Dinge zu automatisieren. Wir wollen also nicht jede Person mit ihrem Namen manuell grüßen müssen, oder? Für so etwas kommen Schleifen gelegen.
+Programmers don't like to repeat themselves. Programming is all about automating things, so we don't want to greet every person by their name manually, right? That's where loops come in handy.
-Erinnerst du dich noch an Listen? Lass uns eine Liste mit Mädchennamen erstellen:
+Still remember lists? Let's do a list of girls:
{% filename %}python_intro.py{% endfilename %}
@@ -993,7 +978,7 @@ Erinnerst du dich noch an Listen? Lass uns eine Liste mit Mädchennamen erstelle
girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'You']
```
-Wir wollen alle mit ihrem Namen grüßen. Wir besitzen bereits die `hallo`-Funktion, um dies zu tun, also lass sie uns in einer Schleife verwenden:
+We want to greet all of them by their name. We have the `hi` function to do that, so let's use it in a loop:
{% filename %}python_intro.py{% endfilename %}
@@ -1001,42 +986,42 @@ Wir wollen alle mit ihrem Namen grüßen. Wir besitzen bereits die `hallo`-Funkt
for name in girls:
```
-Die `for`-Anweisung verhält sich ähnlich wie die `if`-Anweisung; Code unter beiden muss 4 Leerzeichen eingerückt werden.
+The `for` statement behaves similarly to the `if` statement; code below both of these need to be indented four spaces.
-Hier ist der vollständige Code für die Datei:
+Here is the full code that will be in the file:
{% filename %}python_intro.py{% endfilename %}
```python
-def hallo(name):
- print('Hallo ' + name + '!')
+def hi(name):
+ print('Hi ' + name + '!')
-girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'du']
+girls = ['Rachel', 'Monica', 'Phoebe', 'Ola', 'You']
for name in girls:
- hallo(name)
- print('Nächstes Mädchen')
+ hi(name)
+ print('Next girl')
```
-Und wenn wir es ausführen:
+And when we run it:
{% filename %}command-line{% endfilename %}
$ python3 python_intro.py
- Hallo Rachel!
- Nächstes Mädchen
- Hallo Monica!
- Nächstes Mädchen
- Hallo Phoebe!
- Nächstes Mädchen
- Hallo Ola!
- Nächstes Mädchen
- Hallo du!
- Nächstes Mädchen
+ Hi Rachel!
+ Next girl
+ Hi Monica!
+ Next girl
+ Hi Phoebe!
+ Next girl
+ Hi Ola!
+ Next girl
+ Hi You!
+ Next girl
-Wie du sehen kannst, wird alles, was du innerhalb einer `for`-Anweisung eingerückt hast, für jedes Element der Liste `girls` wiederholt.
+As you can see, everything you put inside a `for` statement with an indent will be repeated for every element of the list `girls`.
-Du kannst auch `for` auf Ganzzahlen beziehen, wenn du die `range`-Funktion benutzt:
+You can also use `for` on numbers using the `range` function:
{% filename %}python_intro.py{% endfilename %}
@@ -1045,7 +1030,7 @@ for i in range(1, 6):
print(i)
```
-Das würde ausgeben:
+Which would print:
{% filename %}command-line{% endfilename %}
@@ -1056,16 +1041,16 @@ Das würde ausgeben:
5
-`range` ist eine Funktion, die eine Liste von aufeinander folgenden Zahlen erschafft (die Randwerte werden von dir als Argumente bereitgestellt).
+`range` is a function that creates a list of numbers following one after the other (these numbers are provided by you as parameters).
-Beachte, dass der zweite der Werte, die du als Argumente übergibst, nicht in der Liste enthalten ist, die von Python ausgegeben wird. (Das bedeutet, dass `range(1, 6)` von 1 bis 5 zählt, aber nicht die Zahl 6 enthält). Das liegt daran, dass "range" halboffen ist, was wiederum bedeutet, dass es den ersten Wert enthält, aber nicht den letzten.
+Note that the second of these two numbers is not included in the list that is output by Python (meaning `range(1, 6)` counts from 1 to 5, but does not include the number 6). That is because "range" is half-open, and by that we mean it includes the first value, but not the last.
-## Zusammenfassung
+## Summary
-Das ist alles. **Du rockst total!** Das war ein kniffliges Kapitel, du darfst also ruhig stolz auf dich sein. Wir sind definitiv stolz auf dich und darauf, dass du es so weit geschafft hast!
+That's it. **You totally rock!** This was a tricky chapter, so you should feel proud of yourself. We're definitely proud of you for making it this far!
-Wenn du zum offiziellen und vollständigen Python-Tutorial willst, besuche https://docs.python.org/3/tutorial/. Dort gibt's (bislang jedoch noch nicht auf Deutsch) eine gründlichere und umfassendere Einführung in diese Programmiersprache. Viel Erfolg! :)
+For official and full python tutorial visit https://docs.python.org/3/tutorial/. This will give you a more thorough and complete study of the language. Cheers! :)
-Bevor du zum nächsten Kapitel übergehst, mach kurz 'was anderes – streck dich, lauf etwas 'rum, ruh' deine Augen aus. :)
+You might want to briefly do something else – stretch, walk around for a bit, rest your eyes – before going on to the next chapter. :)

\ No newline at end of file
diff --git a/de/python_introduction/prompt.md b/de/python_introduction/prompt.md
new file mode 100644
index 00000000000..27f422934c0
--- /dev/null
+++ b/de/python_introduction/prompt.md
@@ -0,0 +1,17 @@
+## Python prompt
+
+> For readers at home: this part is covered in the [Python Basics: Integers, Strings, Lists, Variables and Errors](https://www.youtube.com/watch?v=MO63L4s-20U) video.
+
+To start playing with Python, we need to open up a *command line* on your computer. You should already know how to do that – you learned it in the [Intro to Command Line](../intro_to_command_line/README.md) chapter.
+
+Once you're ready, follow the instructions below.
+
+We want to open up a Python console, so type in `python` on Windows or `python3` on Mac OS/Linux and hit `enter`.
+
+{% filename %}command-line{% endfilename %}
+```
+$ python3
+Python {{ book.py_release }} (...)
+Type "help", "copyright", "credits" or "license" for more information.
+>>>
+```
diff --git a/de/template_extending/README.md b/de/template_extending/README.md
index 5362ae574b6..981ddbca189 100644
--- a/de/template_extending/README.md
+++ b/de/template_extending/README.md
@@ -27,7 +27,7 @@ Wir erstellen jetzt eine `base.html`-Datei in `blog/templates/blog/`:
Django Girls blog
-
+
diff --git a/de/whats_next/README.md b/de/whats_next/README.md
index caa79e6cb03..ed6f0344de1 100644
--- a/de/whats_next/README.md
+++ b/de/whats_next/README.md
@@ -15,7 +15,7 @@ Ja! Es gibt *sehr* viele Online-Ressourcen zum Erlernen aller möglichen Program
#### Django
- Unser anderes Buch, [Django Girls Tutorial: Erweiterungen](https://tutorial-extensions.djangogirls.org/)
-- [Das offizielle Django-Tutorial](https://docs.djangoproject.com/en/2.2/intro/tutorial01/)
+- [Das offizielle Django-Tutorial](https://docs.djangoproject.com/en/3.2/intro/tutorial01/)
- [Video-Lektionen "Getting Started With Django"](http://www.gettingstartedwithdjango.com/)
- Spezialisierung [Django for Everybody](https://www.coursera.org/specializations/django) – einige Video-Lektionen können kostenlos getestet werden und du kannst ein Coursera-Zertifikat erlangen, wenn du diesen Kurs belegst