Tuesday, April 25, 2023

Re: Runtime decision on language support

Thank you so much for your incredibly thorough response, Emmanuel! That is exactly the kind of insight I was hoping for.

 

Best,
Shawn

 

 

From: django-users@googlegroups.com <django-users@googlegroups.com> on behalf of ASAMOAH EMMANUEL <emmanuelasamoah179@gmail.com>
Date: Monday, April 24, 2023 at 10:22 PM
To: django-users@googlegroups.com <django-users@googlegroups.com>
Subject: Re: Runtime decision on language support


To achieve this, you can create a custom middleware that inherits from `LocaleMiddleware`. In your custom middleware, you can override the `process_request` method to check for the tenant's allowed languages and set the request's language accordingly.

1. Create a new model field for the Tenant model that stores the allowed languages as a list. This can be a JSON field or a ManyToMany field linked to a Language model.

# models.py
from django.contrib.postgres.fields import ArrayField
from django.db import models

class Tenant(models.Model):
    ...
    allowed_languages = ArrayField(models.CharField(max_length=10))


2. Create a custom middleware that inherits from `django.middleware.locale.LocaleMiddleware`:
# custom_middleware.py
from django.middleware.locale import LocaleMiddleware
from django.utils import translation

class CustomLocaleMiddleware(LocaleMiddleware):
    def process_request(self, request):
        # Get the current tenant
        current_tenant = request.tenant

        # Get the user's preferred language from the request
        language = translation.get_language_from_request(request, check_path=True)

        # Check if the preferred language is in the tenant's allowed_languages list
        if language not in current_tenant.allowed_languages:
            # If not, set the default language for the tenant
            language = current_tenant.default_language

        # Activate the chosen language
        translation.activate(language)
        request.LANGUAGE_CODE = translation.get_language()
3. Replace `LocaleMiddleware` with your custom middleware in your `MIDDLEWARE` settings:

# settings.py
MIDDLEWARE = [
    ...
    # 'django.middleware.locale.LocaleMiddleware',
    'your_app.custom_middleware.CustomLocaleMiddleware'.
Now, when a user requests a page, the custom middleware checks if the requested language is in the tenant's `allowed_languages` list. If it is not, the tenant's default language will be used. This ensures that the UI and the data are shown in a consistent language.

--
You received this message because you are subscribed to a topic in the Google Groups "Django users" group.
To unsubscribe from this topic, visit https://groups.google.com/d/topic/django-users/dlE8lWEPMDg/unsubscribe.
To unsubscribe from this group and all its topics, send an email to django-users+unsubscribe@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CABFHQYzdc29n%2BBA3DfVo7HSh3%2B1XPQCSM%3DsXrwHPTVzVw%2B8-sA%40mail.gmail.com.

No comments:

Post a Comment