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