Detecció idioma per subdomini en Django

Published on diciembre 30th, 2015

Django ens proporciona eines per detectar i fixar l'idioma de la nostra aplicació. Normalment es fa servir i18n_patterns a través del qual s'encapsulen les urls amb el mateix per tal que ens fixi a l'inici del path de la url el codi d'idioma. Amb el middleware que explicarem no cal fer servir l'i18n_patterns ja que serà el pròpi "middleware" que detectarà i fixarà l'idioma de l'aplicació.

Primer de tot crearem l'arxiu que contindrà el "middleware":

# -*- encoding: utf-8 -*-

from django.utils import translation  
from django.conf import settings

class SubdomainLanguageMiddleware(object):  
    """  
    Set the language for the site based on the subdomain the request  
    is being served on. For example, serving on 'fr.domain.com' would  
    make the language French (fr).  
    """  
    language_codes = [it[0] for it in settings.LANGUAGES]

    def process_request(self, request):  
        try:  
            lang = request.get_host().split('.')[0]  
        except IndexError:  
            lang = self.language_codes[0]  
        if lang == 'www':  
            lang = self.language_codes[0]  
        if lang and lang in self.language_codes:  
            translation.activate(lang)  
            request.LANGUAGE_CODE = lang

Fixem-nos en el cas que no s'ens indica cap codi d'idioma i ens ve "www", que fixem el primer idioma per defecte definit als "settings.py".

Llavors, als "settings.py" hem de tenir configurats els idiomes amb els quals volem fer feina:

LANGUAGES = (  
    ('ca', 'Català'),  
    ('es', 'Español'),  
    ('de', 'Deutsch'),  
    ('en', 'English'),  
)

i, com a darrer pas, li hem d'indicar als "settings.py" que ens agafi el "middleware" que acabem de crear:

MIDDLEWARE_CLASSES = (  
    ...,  
    'myproject.language_middleware.SubdomainLanguageMiddleware',  
)

Llavors ja podrem accedir a la web fixant l'idioma en el subdomini:

http://www.lamevaweb.com  
http://es.lamevaweb.com  
http://de.lamevaweb.com  
http://en.lamevaweb.com