Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
138 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 than 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 in your and you are on a page that doesn't yet have an English translatio 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.