Django URL internationalization
This Django app makes it possible to prefix URL patterns with the active language and to make URL patterns translatable by using gettext. As well this package contains a middleware which is able to activate the right language (based on the language-prefix in the requested URL).
Note
During the DjangoCon EU 2011 sprints, I wrote a patch for including this functionality into the Django core. This patch was accepted and will be included in Django 1.4 (thanks to Jannis Leidel and Russell Keith-Magee for their feedback and reviewing the patch).
Django documentation: Internationalization: in URL patterns.
Translating URL patterns
After installing this package, URL patterns can also be marked translatable
using the ugettext_lazy()
function. Example:
from django.conf.urls.defaults import patterns, include, url from django.utils.translation import ugettext_lazy as _ from i18nurls.i18n import i18n_patterns urlpatterns = patterns('' url(r'^sitemap\.xml$', 'sitemap.view', name='sitemap_xml'), ) news_patterns = patterns('' url(r'^$', 'news.views.index', name='index'), url(_(r'^category/(?P<slug>[\w-]+)/$'), 'news.views.category', name='category'), url(r'^(?P<slug>[\w-]+)/$', 'news.views.details', name='detail'), ) urlpatterns += i18n_patterns('', url(_(r'^about/$'), 'about.view', name='about'), url(_(r'^news/$'), include(news_patterns, namespace='news')), )
After you've created the translations, the reverse()
function will return
the URL in the active language. Example:
from django.core.urlresolvers import reverse from django.utils.translation import activate >>> activate('en') >>> reverse('news:category', kwargs={'slug': 'recent'}) '/en/news/category/recent/' >>> activate('nl') >>> reverse('news:category', kwargs={'slug': 'recent'}) '/nl/nieuws/categorie/recent/'
Reversing in templates
If localized URLs get reversed in templates they always use the current
language. To link to a URL in another language use the language
template
tag. It enables the given language in the enclosed template section:
{% load i18nurls i18n %} {% get_available_languages as languages %} {% trans "View this category in:" %} {% for lang_code, lang_name in languages %} {% language lang_code %} <a href="{% url category slug=category.slug %}">{{ lang_name }}</a> {% endlanguage %} {% endfor %}
See also: Reversing in templates.
Installation
- Install the
django-i18nurls
package (eg:pip install django-i18nurls
). - Add
i18nurls
to yoursettings.INSTALLED_APPS
. - Add
i18nurls.middleware.LocaleMiddleware
to yoursettings.MIDDLEWARE_CLASSES
(make sure it comes before theCommonMiddleware
).
Changelog
v0.7.1 (in development)
- Templates for testing added to package.
v0.7
-
{% language %}
template-tag implemented (thanks to Harro van der Klauw). -
LocaleMiddleware
class is not patched anymore (Issue #3). -
i18n_patterns
is not patched anymore. - Trailing slash is now optional in
LocaleMiddleware
regex.
v0.6.1
- templates and locale folder added to setup.py script (Issue #1).
v0.6
- API changed so it will match with
i18n_patterns
in upcoming Django 1.4 release.
v0.5.2
- Some README errors corrected.
v0.5.1
- Some code cleanup.
v0.5
- Initial release.