Skip to content

HTTPS clone URL

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

Internationalization

Multilingual URL Middleware

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

Example:

/de/account/login/
/fr/account/login/

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.

Note

This middleware must be put before cms.middleware.page.CurrentPageMiddleware

Example:

MIDDLEWARE_CLASSES = (
    ...
    'cms.middleware.multilingual.MultilingualURLMiddleware',
    'cms.middleware.user.CurrentUserMiddleware',
    'cms.middleware.page.CurrentPageMiddleware',
    'cms.middleware.toolbar.ToolbarMiddleware'
    ...
)

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.

Example:

{% 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.

simple_language_changer

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

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

page_language_url

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

Example:

{% page_language_url "de" %}

CMS_HIDE_UNTRANSLATED

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

If :setting:`CMS_HIDE_UNTRANSLATED` is True in your settings.py 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.