URL-адрес Django изменить код языка

Я пытаюсь изменить язык веб-сайта, когда пользователи нажимают кнопку в Django.

У меня есть базовый проект, и URL-адреса:

urlpatterns += i18n_patterns(
    # Ecommerce is the app where I want to change the language
    url(r'^', include("ecommerce.urls")),
)

URL-адрес внутри Ecommerce.urls:

urlpatterns = [
    url(r'^testing/$', views.test, name='url_testing'),
    ... other urls
]

Когда я посещаю указанный выше URL, я сначала иду по адресу: http://localhost/en/testing/.

Я хочу установить ссылку <a href="{% url 'url_testing' %}">Change Language</a>, чтобы при нажатии на нее пользователи меняли язык на http://localhost/zh-hans/testing/. Как мне это сделать в моем шаблоне?

ИЗМЕНИТЬ

Теперь я могу изменить язык, используя следующий код, но проблема в том, что он работает только один раз:

<form id="languageForm" action="/i18n/setlang/" method="post">
    {% csrf_token %}
    <input name="next" type="hidden" value="{% url 'url_testing' %}" /> 
    <input id="newLanguageInput" type="hidden" name="language"/>
</form>

И мои ссылки:

<li><a onclick="changeLanguage('zh-hans')">简体</a></li>
<li><a onclick="changeLanguage('zh-hant')">繁體</a></li>

Функция changeLanguage определяется следующим образом:

function changeLanguage(newLanguage) {
    $('input[name="newLanguageInput"]').val(newLanguage);
    $('#languageForm').submit();
}

Код работает, когда я впервые нажимаю любую из двух ссылок, и меня перенаправляют на URL-адрес http://localhost/zh-hans/testing/ или http://localhost/zh-hant/testing/. Проблема в том, что после того, как я один раз сменил язык, он больше не меняется. Что-то не так с моей отправкой?


person Rgfvfk Iff    schedule 12.03.2017    source источник


Ответы (2)


На самом деле это будет не простая ссылка <a>, а ссылка <form>.

Прочитайте как set_language перенаправить просмотр. Эта форма будет отвечать за смену языков. Это просто как пирог.

Убедитесь, что вы сначала установили LANGUAGES.

person nik_m    schedule 12.03.2017
comment
Можно ли сделать это со ссылкой, а не с формой? - person Rgfvfk Iff; 12.03.2017
comment
Я считаю, что да, это можно сделать, но вы потеряете настройку языка при следующем запросе. Это не будет настойчиво. - person nik_m; 12.03.2017
comment
@RgfvfkIff Вы можете создать собственное представление для изменения языков в запросе GET, но причина, по которой этого не делается, заключается в том, что вы не должны изменять настройки в запросах GET из-за уязвимости CSRF. Если ваши пользователи посетят другой сайт, этот сайт может изменить свой язык. - person Mark; 27.03.2018

Вы можете изменить язык веб-сайта, когда пользователи нажимают на ссылку (без перевода URL-адреса, без публикации) следующим образом:

navigation.html (с bootstrap4 и шрифтом awesome)

<li class="nav-item dropdown">
  {% get_current_language as LANGUAGE_CODE %}
  <a class="nav-link dropdown-toggle" href="#" data-toggle="dropdown">{{ LANGUAGE_CODE }}</a>
  <div class="dropdown-menu dropdown-menu-right">

    {% get_available_languages as languages %}
    {% for lang_code, lang_name in languages %}

    <a href="{% url 'main:activate_language' lang_code %}" class="dropdown-item">
      {% if lang_code == LANGUAGE_CODE %}
        <i class="fas fa-check-circle"></i>&nbsp;&nbsp;
      {% else %}
        <i class="far fa-circle"></i>&nbsp;&nbsp;
      {% endif %}
      {{ lang_name }} ({{ lang_code }})
    </a>

    {% endfor %}
  </div>
</li>

views.py

from django.shortcuts import redirect
from django.utils import translation
from django.views.generic.base import View

class ActivateLanguageView(View):
    language_code = ''
    redirect_to   = ''

    def get(self, request, *args, **kwargs):
        self.redirect_to   = request.META.get('HTTP_REFERER')
        self.language_code = kwargs.get('language_code')
        translation.activate(self.language_code)
        request.session[translation.LANGUAGE_SESSION_KEY] = self.language_code
        return redirect(self.redirect_to)

urls.py

from django.urls import path
from .views import ActivateLanguageView

app_name = 'main'
urlpatterns = [
    path('language/activate/<language_code>/', ActivateLanguageView.as_view(), name='activate_language'),
]

Это работа для меня.

person Boris Đurkan    schedule 02.05.2018