Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

139 lines (93 sloc) 4.226 kb


Multilingual URL Middleware

The multilingual URL middleware adds a language prefix to every URL.



It also adds this prefix automatically to every href and form tag. To install it, include 'cms.middleware.multilingual.MultilingualURLMiddleware' in your project's :setting:`django:MIDDLEWARE_CLASSES` setting.


This middleware must be put before



Language Chooser

The :ttag:`language_chooser` template tag will display a language chooser for the current page. You can modify the template in menu/language_chooser.html or provide your own template if necessary.


{% load menu_tags %}
{% language_chooser "myapp/language_chooser.html" %}

If the current URL is not handled by the CMS and you have some i18n slugs in the URL you may use the :func:`menus.utils.set_language_changer` function in the view that handles the current URL.

In the models of the current object add an optional language parameter to the :meth:`~django.db.models.Model.get_absolute_url` method:

from django.utils.translation import get_language

def get_absolute_url(self, language=None):
    if not language:
        language = get_language()
    return reverse("product_view", args=[self.get_slug(language=language)])

In the view pass the :meth:`get_absolute_url` method to the :func:`~menus.utils.set_language_changer` function:

from menus.utils import set_language_changer

def get_product(request, slug):
    item = get_object_or_404(Product, slug=slug, published=True)
    set_language_changer(request, item.get_absolute_url)
    # ...

This allows the language chooser to have another URL than the current one. If the current URL is not handled by the CMS and no :func:`~menus.utils.set_language_changer` function is provided it will take the exact same URL as the current one and will only change the language prefix.

For class-based generic views :func:`~menus.utils.set_language_changer` can be used as follows:

from menus.utils import set_language_changer

class ProductDetailView(DetailView):
    model = Product

    def get_context_data(self, **kwargs):
        context = super(ProductDetailView, self).get_context_data(**kwargs)
        set_language_changer(self.request, self.object.get_absolute_url)
        return context

For the language chooser to work the :class:`cms.middleware.multilingual.MultilingualURLMiddleware` must be enabled.


If the URLs of your views don't actually change besides the language prefix, you can use the :func:`menus.utils.simple_language_changer` view decorator, instead of manually using :func:`~menus.utils.set_language_changer`:

from menus.utils import simple_language_changer

def get_prodcut(request, slug):
    # ...


This template tag returns the URL of the current page in another language.


{% page_language_url "de" %}


If you put :setting:`CMS_HIDE_UNTRANSLATED` to False in your all pages will be displayed in all languages even if they are not translated yet.

If :setting:`CMS_HIDE_UNTRANSLATED` is True in your and you are on a page that doesn't yet have an English translation and you view the German version then the language chooser will redirect to /. The same goes for URLs that are not handled by the CMS and display a language chooser.

Jump to Line
Something went wrong with that request. Please try again.