Django Translation Internationalization and localization: forms, models, tables

374 Views Asked by At

I have two questions. How can I translate in forms: a) labels b) Form ValidationErrors ?

forms.py

from django import forms
from django.db.models import Max, Min
from .models import Application, FlowRate, WaterFilterSubType, Fineness, Dirt
from .models import DirtProperties, Flange

class InputDataWaterForm(forms.Form):
    '''Application'''
    choices = list(Application.objects.values_list('id','application'))
    application = forms.ChoiceField(choices = choices, initial="1", label="Specify application:")
    ....

    def clean(self):
        cleaned_data = super(InputDataWaterForm, self).clean()
        application = cleaned_data.get('application')
    ...

        '''OTHER CONDITIONS if not flowrate ...'''
        if not (flowrate or pressure or dirt or dirtproperties or
            application or fineness or temperature or
            flange or atex or aufstellung or ventil):
            raise forms.ValidationError('PLEASE ENTER THE REQUIRED INFO')

How can I translate content of a table in a database? All records eg. product names in a table must be translated.

models.py

from django.db import models

'''FILTER PROPERTIES LIKE COLOR'''
class FP_sealing(models.Model):
    value = models.CharField('Material Sealing', max_length=10)
    descr = models.CharField('Description', max_length=200, default="")
    def __str__(self):
        return("Seal: " + self.value)

Thank you

1

There are 1 best solutions below

4
willeM_ Van Onsem On

Translations are normally done with Django's translation framework. For eager translations, one uses gettext, for lazy translations (translations that should be calculated when rendered), one uses gettext_lazy. You can for example translate your application with:

from django import forms
from django.db.models import Max, Min
from .models import Application, FlowRate, WaterFilterSubType, Fineness, Dirt
from .models import DirtProperties, Flange
from django.utils.translation import gettext_lazy as _

class InputDataWaterForm(forms.Form):
    '''Application'''
    choices = list(Application.objects.values_list('id','application'))
    application = forms.ChoiceField(choices = choices, initial="1", label=_("Specify application:"))
    # …

    def clean(self):
        cleaned_data = super(InputDataWaterForm, self).clean()
        application = cleaned_data.get('application')
        # …

        '''OTHER CONDITIONS if not flowrate …'''
        if not (flowrate or pressure or dirt or dirtproperties or
            application or fineness or temperature or
            flange or atex or aufstellung or ventil):
            raise forms.ValidationError(_('PLEASE ENTER THE REQUIRED INFO'))

For choice values in models, as is specified in the documentation:

from django.utils.translation import gettext_lazy as _

class Student(models.Model):

    class YearInSchool(models.TextChoices):
        FRESHMAN = 'FR', _('Freshman')
        SOPHOMORE = 'SO', _('Sophomore')
        JUNIOR = 'JR', _('Junior')
        SENIOR = 'SR', _('Senior')
        GRADUATE = 'GR', _('Graduate')

    year_in_school = models.CharField(
        max_length=2,
        choices=YearInSchool.choices,
        default=YearInSchool.FRESHMAN,
    )

    def is_upperclass(self):
        return self.year_in_school in {
            self.YearInSchool.JUNIOR,
            self.YearInSchool.SENIOR,
        }

Then you can run the makemessages command [Django-doc] to make translation files:

django-admin makemessages --locale=de_DE

Django will then make *.po files where you can define the translations for the strings you defined.

Then you can use the compilemessages command [Django-doc] to compile these translation files to *.mo files:

django-admin compilemessages --locale=de_DE