defset_language(request): language = request.GET.get('lang','en')if language inSUPPORTED_LANGUAGES: request.session['lang']= languageelse: request.session['lang']=DEFAULT_LANGUAGE
2. Get the Language from the Session
defget_language(request): language = request.session.get('lang',DEFAULT_LANGUAGE)return language
3. Load the Translation
from django.utils import translationdefload_translation(language): translation.activate(language) translation.load_paths('your-translation-path')
from django.utils.translation import gettext_lazy
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = ['title', 'content']
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 10:
raise forms.ValidationError(gettext_lazy('Title must be at least 10 characters long.'))
return title
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy
@register.filter
def truncatechars_translated(value, arg):
try:
length = int(arg)
except ValueError:
return value
if len(value) > length:
return mark_safe('%s...' % value[:length])
else:
return value
from django.template import Library
register = Library()
@register.tag
def translate_block(parser, token):
nodelist = parser.parse(('endtranslateblock',))
parser.delete_first_token()
return TranslateBlockNode(nodelist)
class TranslateBlockNode(Node):
def render(self, context):
language = get_language(context['request'])
translation = translation.get_translation(language)
with translation.override(language):
return self.nodelist.render(context)
from django.db.models import CharField
class Article(models.Model):
title = CharField(_('Title'), max_length=255)
from django.db.models import IntegerField, choices
class Article(models.Model):
STATUS_CHOICES = (
(1, _('Draft')),
(2, _('Published')),
)
status = IntegerField(_('Status'), choices=STATUS_CHOICES)
from django.forms import CharField
class ArticleForm(forms.ModelForm):
title = CharField(label=_('Title'))
from django.forms import TextInput
class TranslatedTextInput(TextInput):
def render(self, name, value, attrs=None):
attrs = attrs or {}
attrs['placeholder'] = _('Enter your name')
return super().render(name, value, attrs)
from django.forms import ValidationError
class ArticleForm(forms.ModelForm):
title = forms.CharField(label=_('Title'))
def clean_title(self):
title = self.cleaned_data['title']
if len(title) < 10:
raise ValidationError(_('Title must be at least 10 characters long.'))
return title
from django.utils.deprecation import MiddlewareMixin
class TranslationMiddleware(MiddlewareMixin):
def process_request(self, request):
language = request.GET.get('lang', request.session.get('lang', 'en'))
translation.activate(language)
request.LANGUAGE_CODE = language
from django.contrib import admin
class TranslatedModelAdmin(admin.ModelAdmin):
list_display = ('title', 'content', 'created_at')
from django.contrib import viewsets
class TranslatedModelViewSet(viewsets.ModelViewSet):
queryset = TranslatedModel.objects.all()
serializer_class = TranslatedModelSerializer
from django.contrib.auth.models import User
from rest_framework import serializers
class TranslatedModelSerializer(serializers.ModelSerializer):
class Meta:
model = TranslatedModel
fields = ['title', 'content', 'created_at']
from django.core.handlers.wsgi import WSGIHandler
def translate_wsgi_app(application):
def middleware(environ, start_response):
language = environ.get('HTTP_ACCEPT_LANGUAGE', 'en')
translation.activate(language)
return application(environ, start_response)
return middleware