You have to do this at the webserver level (for example using mod_rewrite in Apache) or with middleware (for example this snippet)
Also see this SO question
Update: after your comment I thought about it some more. I liked Carl Meyer's answer, but then realized it wouldn't handle {% url %} reversing properly. So here's what I would do:
Multiple sites: You need to use the Django sites framework. Which means making site instances for each language using the Django admin.
Multiple settings: Each language site will also have its own settings.py. The only differences between each site will be the SITE_ID
and ROOT_URLCONF
settings so, to follow DRY principle, you should keep the common settings in a different file and import them into the master file like this:
# settings_fr.py
SITE_ID = 1
ROOT_URLCONF = 'app.urls_fr'
from settings_common import *
# settings_de.py
SITE_ID = 2
ROOT_URLCONF = 'app.urls_de'
from settings_common import *
... and so on.
Multiple URL conf: As implied above, a url conf for each site:
# urls_fr.py
urlpatterns = patterns('',
url(r'^Livres/$', books_view, name="books"),
)
# urls_de.py
urlpatterns = patterns('',
url(r'^Bücher/$', books_view, name="books"),
)
... and so on.
This way the url name (in this example "books") is the same for all languages, and therefore {% url books %}
will reverse properly and the domain name will be the domain_name field of the Site object with SITE_ID
.
Multiple web server instances: In order for each SITE to work properly they each need their own server instances. For apache + mod_wsgi this means a different wsgi application for each SITE like this:
# site_fr.wsgi
import os, sys, django.core.handlers.wsgi
os.environ['DJANGO_SETTINGS_MODULE'] = 'app.settings_fr'
application = django.core.handlers.wsgi.WSGIHandler()
... and so on along with matching apache virtual host for each site:
<VirtualHost *:80>
ServerName mybooks.fr
WSGIScriptAlias / /path/to/site_fr.wsgi
...
</VirtualHost>
Hopefully this is clear :)