# Entwicklung [← zurück zum Überblick](../README.md) · [alle Kapitel](README.md) Tests, Übersetzungen, Layoutprüfung und das Erweitern des Artenkatalogs. Wer etwas beitragen will, findet die Spielregeln in [CONTRIBUTING.md](../CONTRIBUTING.md). ```bash ./venv/bin/python -m unittest discover tests # Detector cd web && ../venv/bin/python manage.py test dex # Web-App ``` ### Übersetzungen Oberflächentexte laufen über Djangos i18n, Artentexte über eigene Felder am Modell (`beschreibung_en` und Geschwister). Abzeichen und Ränge liegen als deutscher Text in der Datenbank und werden erst bei der Ausgabe übersetzt — sie sind ein fester, im Code definierter Satz, und so braucht ein Sprachwechsel keine Migration. ```bash cd web && ../venv/bin/python manage.py makemessages -l en --ignore=venv cd .. && ./venv/bin/python scripts/update_translations.py cd web && ../venv/bin/python manage.py compilemessages -l en ``` **Die .po-Datei nicht von Hand pflegen.** `makemessages` ruft `msgmerge` auf, und das rät: Ein neuer Text, der einem alten ähnelt, erbt dessen Übersetzung und wird als `#, fuzzy` markiert. So wurde aus „Sammler" ein „Collection" (von „Sammlung"). `msgfmt` wirft Fuzzy-Einträge weg, im Betrieb sieht man also deutschen Resttext — und wer dann „ersetze `msgstr`, wenn leer" anwendet, greift daneben, weil leer eben nichts ist. `scripts/update_translations.py` überschreibt deshalb immer und räumt die Marke weg. ### Layout prüfen **Layoutänderungen gehören in vier Breiten angesehen**, bevor sie rausgehen: iPad hochkant (810), iPad quer (1180), iPhone (390), Desktop (1440). Blind gebaute Layouts sehen auf genau einer Breite gut aus, und das ist selten die, auf der jemand liest. `color-mix()` gibt es erst ab Safari 16.2, `aspect-ratio` erst ab Safari 15. Beides fällt auf älteren Geräten ersatzlos weg: Farben verschwinden, und Bildkästen verlieren ihre Höhe, sodass jedes Foto in seiner natürlichen Größe rendert. Deshalb werden Typfarben in `web/dex/species_meta.py` vorberechnet und Bildverhältnisse über `padding-top` gelöst. Fehlt Chromium und gibt es kein root, hilft `apt-get download` — das braucht keine Rechte: ```bash mkdir -p ~/.local/chromium-deps && cd ~/.local/chromium-deps for p in libatk1.0-0t64 libatk-bridge2.0-0t64 libatspi2.0-0t64 \ libxdamage1 libasound2t64 libasound2-data; do apt-get download "$p"; done mkdir -p root && for d in *.deb; do dpkg -x "$d" root/; done export LD_LIBRARY_PATH=~/.local/chromium-deps/root/usr/lib/x86_64-linux-gnu ``` Dasselbe funktioniert für `gettext`, falls `msgfmt` fehlt. > `runserver --noreload` cached auch Templates. Nach Template-Änderungen neu > starten, sonst sieht man weiter die alte Fassung. ### Den Katalog erweitern `detector/species_de.py` enthält die Kernarten mit Erzähltext, `detector/species_extra.py` die übrigen mit Strukturdaten, `detector/profiles/` die Steckbriefe. Jede neue Art muss im Label-File des Modells vorkommen, sonst kann sie niemand freischalten — ein Test prüft das. Ebenso, dass jeder benutzte Typ in der Web-App eine Farbe und einen englischen Namen hat.