Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

137 lines (92 sloc) 4.05 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 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 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 then the current one. If the current URL is not handled by the CMS and no 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 set_languager_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 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 is in your and you are on a page that hasn't got a english translation yet 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.