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.
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/'
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.
- 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
).
- Templates for testing added to package.
{% 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.
- templates and locale folder added to setup.py script (Issue #1).
- API changed so it will match with
i18n_patterns
in upcoming Django 1.4 release.
- Some README errors corrected.
- Some code cleanup.
- Initial release.