Как обслуживать несколько языков

Если вы использовали django CMS installer для запуска своего проекта, вы увидите, что он уже настроен для обслуживания многоязычного контента. То же самое делает и наше руководство Как установить django CMS вручную.

Это руководство описывает шаги, необходимые для включения многоязыковой поддержки, на случай, если вам понадобится сделать это вручную.

Многоязычные URL-адреса

Если вы используете более одного языка, ссылки на URL-адреса django CMS, включая URL-адреса администратора, должны быть указаны через i18n_patterns(). Для получения дополнительной информации об этом смотрите официальную статью Django documentation по этому вопросу.

Вот полный пример urls.py:

from django.conf.urls.i18n import i18n_patterns
from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.urls import include, re_path
from django.views.i18n import JavaScriptCatalog


admin.autodiscover()

urlpatterns = i18n_patterns(
    re_path(r'^jsi18n/$', JavaScriptCatalog.as_view(), name='javascript-catalog'),
)
urlpatterns += staticfiles_urlpatterns()

# note the django CMS URLs included via i18n_patterns
urlpatterns += i18n_patterns(
    re_path(r'^admin/', include(admin.site.urls)),
    re_path(r'^', include('cms.urls')),
)

Одноязычные URL-адреса

Конечно, если вам нужны только одноязычные URL, без кода языка, просто не используйте i18n_patterns():

urlpatterns += [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'^', include('cms.urls')),
]

Хранить языковые предпочтения пользователя

Предпочтительный язык пользователя сохраняется в течение сеанса просмотра. Чтобы django CMS помнил предпочтения пользователя в последующих сессиях, они должны храниться в куках. Чтобы включить это, cms.middleware.language.LanguageCookieMiddleware должно быть добавлено к настройке проекта MIDDLEWARE.

См. Как django CMS определяет, какой язык обслуживать для получения дополнительной информации о том, как это работает.

Работа в шаблонах

Отображение выбора языка на странице

Тег шаблона language_chooser отображает выбор языка для текущей страницы. При необходимости вы можете изменить шаблон в menu/language_chooser.html или предоставить свой собственный шаблон.

Пример:

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

Если вы находитесь в apphook и имеете детальное представление объекта, вы можете установить объект на панель инструментов в вашем представлении. cms вызовет get_absolute_url на соответствующем языке для выбора языка:

Пример:

class AnswerView(DetailView):
    def get(self, *args, **kwargs):
        self.object = self.get_object()
        if hasattr(self.request, 'toolbar'):
            self.request.toolbar.set_object(self.object)
        response = super().get(*args, **kwargs)
        return response

С помощью этого вы можете легче контролировать, какой url будет возвращен в выборе языка.

Примечание

Если у вас есть многоязычные объекты, убедитесь, что вы возвращаете правильный url, если у вас нет перевода для этого языка в get_absolute_url.

Получение URL текущей страницы для другого языка

page_language_url возвращает URL текущей страницы на другом языке.

Пример:

{% page_language_url "de" %}

Настройка поведения при работе с языками

CMS_LANGUAGES описывает все доступные опции для определения того, как django CMS обслуживает содержимое на нескольких языках.

Вернуться на верх