Detecció idioma per subdomini en Django

4 de Enero de 2016 · 2 min de lectura

Logo APSL

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
Comparte este artículo
Artículos recientes