Dienstag, 12. Dezember 2023

Django: Übersetzungen von Forms im Template anzeigen

Neulich habe ich zum ersten Mal eines meiner mit Django erstellten Projekt übersetzt. Bis jetzt waren die komplett in englisch gehalten, jetzt habe ich eine deutsche Übersetzung hinzugefügt.

Wie Übersetzungen / Internationalisierung mit Django funktionieren ist ja ausführlich in der Doku beschrieben (Link zur Django 4.2 Doku). Das hat bei mir auch alles einwandfrei funktioniert - nur wurden die Labels von Formularen aus der Datei forms.py im Template nicht übersetzt angezeigt.

Die forms.py sah so aus:

from django import forms
from django.utils.translation import gettext as _


class SelectByDimensionsForm(forms.Form):
    width = forms.IntegerField(label=_('Inner Width, mm'))
    width_tolerance = forms.IntegerField(label=_('tolerance for width, mm'),
                                         initial=20)
    (...)

und das Template so:

{% extends 'laundercalc/base.html' %}
{% load i18n %}

{% block content %}
{% translate "Please enter your data in the following form:" %} (...)
{% csrf_token %} {{ form.as_p }} (...)
(...)

Während der Text aus dem Template übersetzt angezeigt wurde (wie das "Please enter ...") erschienen die Labels des Formular nach wie vor in Englisch. In der Übersetzungsdatei waren die Labels übersetzt hinterlegt.

Die Lösung, wie man die Übersetzung angezeigt bekommt, ist ganz einfach: man muss nur gettext_lazy in der forms.py importieren, also from django.utils.translation import gettext_lazy as _ (statt ...import gettext as _) verwenden.

Dann wird die Übersetzung erst abgerufen, wenn diese wirklich benötigt wird, im gegebenen Fall also, wenn das Template gerendert wird. Und dann wird es auch komplett übersetzt angezeigt.

Weitere Informationen zu gettext_lazy sind auch in der Django Dokumentation zu finden.

Keine Kommentare:

Kommentar veröffentlichen