1. Internationalization

1.1. Multilingual URL Middleware

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

Example:

  1. /de/account/login/
  2. /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 MIDDLEWARE_CLASSES setting.

1.2. Language Chooser

The 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:

  1. {% load menu_tags %}
  2. {% 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 get_absolute_url function:

  1. from django.utils.translation import get_language
  2. def get_absolute_url(self, language=None):
  3. if not language:
  4. language = get_language()
  5. reverse("product_view", args=[self.get_slug(language=language)])

In the view pass the get_absolute_url function to the set_language_chooser function:

  1. from cms.utils import set_language_changer
  2. def get_product(request, slug):
  3. item = get_object_or_404(Product, slug=slug, published=True)
  4. set_language_changer(request, item.get_absolute_url)
  5. # ...

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 the language chooser to work the Multilingual URL Middleware must be enabled.

1.3. page_language_url

This template_tag returns the URL of the current page in another language.

Example:

  1. {% page_language_url "de" %}

1.4. CMS_HIDE_UNTRANSLATED

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

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