django i18n - получить текущий путь для другого языка

Я использую Django и разрабатываю сайт i18n, обслуживающий множество языков. Я хочу создать модальное окно, которое останется в base.html, чтобы пользователи могли переключать язык, где бы они ни находились.

Мне удалось сделать что-то подобное.

<div class="modal-body">
{% get_available_languages as languages %}
    {% for lang_code, lang_name in languages %}
        {% language lang_code %}
        <a href="{% url 'home' %}" class="btn lang-btn {% ifequal request.LANGUAGE_CODE lang_code %}selected{% endifequal %}">{{lang_code|lang_name}}</a>
        {% endlanguage %}
    {% endfor %}
</div>

В результате получаются такие URL-адреса: /ja/, /en/, /fr/ и т. Д., Но такой подход ссылается только на главную страницу.

При использовании {{request.path}} или {{request.get_full_path}} в качестве URL-адреса, например:

<a href="{{ request.path }}" class="btn lang-btn {% ifequal request.LANGUAGE_CODE lang_code %}selected{% endifequal %}">{{lang_code|lang_name}}</a>

Он не включает шаблоны URL-адресов i18n.

Есть ли способ направить текущий URL-адрес с помощью request.path ??

ЦЕЛЬ

Когда в /foo/: /ja/foo/ /en/foo/ /fr/foo/

Когда в /bar/: /ja/bar/ /en/bar/ /fr/bar/

Заранее спасибо!


person Kyuhyeok Park    schedule 25.05.2017    source источник


Ответы (1)


Эта тема обсуждается в этом вопросе SO: Шаблоны Django: получить текущий URL-адрес в другой язык.

В своем проекте я использую этот простой тег шаблона (взятый из https://djangosnippets.org/snippets/2875/), который возвращает URL-адрес текущего представления на другом языке.

foo/templatetags/i18n_urls.py:

from django import template
from django.urls import translate_url

register = template.Library()


@register.simple_tag(takes_context=True)
def change_lang(context, lang: str, *args, **kwargs):
    path = context['request'].path

    return translate_url(path, lang)

some_template.html:

{% load i18n_urls %}

<ul>
    <li>
        <a href="{% change_lang 'en' %}">EN</a>
    </li>
    <li>
        <a href="{% change_lang 'cs' %}">CS</a>
    </li>
    <li>
        <a href="{% change_lang 'de' %}">DE</a>
    </li>
</ul>

Обратите внимание, что функция translate_url не описана в официальных документах Django. Вот исходный код этой функции: https://github.com/django/django/blob/master/django/urls/base.py#L161-L181.

person illagrenan    schedule 25.05.2017
comment
Я использовал ваш код и, наконец, сделал это. Это сработало, когда я выкорчевал тег шаблона {% language %} и изменил только ваш фрагмент. Спасибо! - person Kyuhyeok Park; 25.05.2017