Zum Inhalt

Übersetzung & Internationalisierung

Bifolk unterstützt Englisch und Deutsch mit vollständiger Django-i18n-Unterstützung.

Zielgruppe: Softwareentwickler


Unterstützte Sprachen

Sprache Code Status
Englisch en Primär (Quellsprache)
Deutsch de Formelle "Sie"-Form

Abdeckungsziel: 100%


Sprachauswahl

Bifolk verwendet ein zweistufiges Spracherkennungssystem:

1. Benutzerprofil-Sprache (höchste Priorität) → UserLanguageMiddleware
2. Sprach-Cookie                              → LocaleMiddleware (Django)
3. Browser Accept-Language Header             → LocaleMiddleware (Django)
4. LANGUAGE_CODE-Einstellung (Standard: 'en') → Fallback

UserLanguageMiddleware

Benutzerdefinierte Middleware (bifolk/middleware.py), die die Sprache aus user.profile.language liest und für authentifizierte Benutzer aktiviert. Überschreibt Browser-Erkennung.

Konfiguration

# bifolk/settings.py
LANGUAGE_CODE = 'en'

LANGUAGES = [
    ('en', 'English'),
    ('de', 'Deutsch'),
]

LOCALE_PATHS = [
    BASE_DIR / 'locale',
]

Übersetzungs-Workflow

1. Strings markieren  → _("text") oder {% trans "text" %}
2. Extrahieren        → python manage.py makemessages -l de --ignore=venv
3. Übersetzen         → locale/de/LC_MESSAGES/django.po bearbeiten
4. Kompilieren        → python manage.py compilemessages -l de
5. Verifizieren       → python scripts/translation/check_translations.py

Strings zur Übersetzung markieren

In Python-Code

from django.utils.translation import gettext_lazy as _

# Modellfelder (Modulebene) — gettext_lazy verwenden
class Hive(models.Model):
    name = models.CharField(max_length=100, verbose_name=_("Bienenstockname"))

# Choices — gettext_lazy verwenden
HEALTH_CHOICES = [
    ('excellent', _('Ausgezeichnet')),
    ('good', _('Gut')),
]

# Nachrichten in Views (Funktionsebene) — gettext_lazy funktioniert auch hier
from django.contrib import messages
messages.success(request, _("Bienenstock erfolgreich erstellt"))

Note

Verwenden Sie gettext_lazy (als _ importiert) überall. Es funktioniert sowohl auf Modulebene (Models, Forms) als auch auf Funktionsebene (Views). Verwenden Sie gettext nur, wenn Sie ausdrücklich eine sofortige Übersetzung benötigen.

In Templates

{% load i18n %}

{# Einfacher String #}
<h1>{% trans "Bienenstockverwaltung" %}</h1>

{# Mit Variablen #}
{% blocktrans %}Willkommen bei {{ site_name }}{% endblocktrans %}

{# Pluralisierung #}
{% blocktrans count counter=hives.count %}
Sie haben {{ counter }} Bienenstock.
{% plural %}
Sie haben {{ counter }} Bienenstöcke.
{% endblocktrans %}

{# Kontext für mehrdeutige Wörter #}
<button>{% trans "Speichern" context "button" %}</button>

In Formularen

from django.utils.translation import gettext_lazy as _

class HiveForm(forms.ModelForm):
    class Meta:
        model = Hive
        fields = ['name', 'location']
        labels = {
            'name': _('Bienenstockname'),
            'location': _('Standort'),
        }

Übersetzungsdateien

Dateispeicherort

app/locale/
└── de/
    └── LC_MESSAGES/
        ├── django.po      # Quellübersetzungen (diese bearbeiten)
        └── django.mo      # Kompilierte Binärdatei (automatisch generiert)

.po-Dateiformat

# Übersetzerkommentar
#: hives/models.py:28
msgid "Hive Type"
msgstr "Bienenstocktyp"

# Kontextspezifische Übersetzung
msgctxt "button"
msgid "Save"
msgstr "Speichern"

# Pluralisierung
msgid "%(count)s hive"
msgid_plural "%(count)s hives"
msgstr[0] "%(count)s Bienenstock"
msgstr[1] "%(count)s Bienenstöcke"

Befehlsreferenz

Nachrichten extrahieren

# Für Deutsch extrahieren
cd app && python manage.py makemessages -l de --ignore=venv

# Für alle Sprachen extrahieren
cd app && python manage.py makemessages -a --ignore=venv

Nachrichten kompilieren

cd app && python manage.py compilemessages -l de

Abdeckung prüfen

python scripts/translation/check_translations.py

Übersetzungen auditieren

python scripts/translation/audit_translations.py

Hardcodierte Strings erkennen

python scripts/translation/detect_hardcoded_strings.py

Siehe scripts/translation/README.md für vollständige Skript-Dokumentation.


Mehrsprachige Modellfelder

Für dynamische, benutzerkonfigurierbare Choices verwendet Bifolk explizite Sprachspalten:

class ConfigurableChoice(models.Model):
    value = models.CharField(max_length=100)    # Interner Wert
    label_en = models.CharField(max_length=200)  # Englisches Label
    label_de = models.CharField(max_length=200)  # Deutsches Label

    def get_label(self, language='en'):
        if language == 'de' and self.label_de:
            return self.label_de
        return self.label_en

Verwendung in Views:

label = choice.get_label(request.LANGUAGE_CODE)

Neue Sprache hinzufügen

  1. Zu LANGUAGES in bifolk/settings.py hinzufügen
  2. Zu Profile.LANGUAGE_CHOICES in users/models.py hinzufügen
  3. Migration erstellen: python manage.py makemigrations users
  4. Nachrichten extrahieren: python manage.py makemessages -l <code> --ignore=venv
  5. Die .po-Datei übersetzen
  6. Kompilieren: python manage.py compilemessages -l <code>

Richtlinien für deutsche Übersetzung

  • Formelles Deutsch verwenden ("Sie"-Form, nicht "du")
  • Konsistente Terminologie beibehalten:
Englisch Deutsch
Hive Bienenstock
Queen Königin
Inspection Kontrolle
Harvest Ernte
Batch Charge
Bucket Eimer
Jar Glas

Fehlerbehebung

Problem Lösung
Übersetzungen erscheinen nicht compilemessages ausführen und neu starten
Fuzzy-Übersetzungen ignoriert #, fuzzy aus .po-Datei entfernen, neu kompilieren
Falsche Sprache angezeigt Benutzerprofil-Sprache prüfen, Browser-Cookies löschen
makemessages fehlen Strings _() oder {% trans %}-Syntax prüfen, --ignore-Muster prüfen

Verwandte Dokumentation