Переключение языков Django с помощью флагов и урлов

В настоящее время у меня есть переключатель языков в Django, основанный на флагах, но где URL для всех языков одинаков.

Теперь я хочу изменить переключатель языков так, чтобы выбор флага также перенаправлял пользователя на префикс URL (например, /en, /es, /fr и т.д.), чтобы я мог легко отправить страницу на разных языках по умолчанию разным пользователям. Ссылка на префикс URL работает отлично, но как мне проще всего перенаправить туда пользователей, когда они выбирают флаги в приведенном ниже коде?

<div class="navbar-btns ml-3">
 <div class="navbar-btns-inner">
   <div id="language-switcher" class="navbar-btn collapsed">
     <form action="{% url 'set_language' %}" method="post">
         {% csrf_token %}
         <input name="next" type="hidden" value="/" />
         <select name="language" onchange="this.form.submit()">
             {% for language in request|get_language_info_list_ex %}
                 <option value="{{ language.code }}" {% if language.is_current %} selected="selected"{% endif %}>
                     <span class="flag">{{ language.flag }}</span>
                     {# {{ language.code }} #}
                 </option>
             {% endfor %}
         </select>
     </form>
   </div>
 </div>
</div>

На моей странице я использую простой вид и некоторые regex для перенаправления пользователей обратно на страницу, на которой они были.

Вот мое мнение

from django.conf import settings
from django.http import HttpResponseRedirect
from yourapp.utils.translation import get_locale_url

def set_language(request, language_code=None):
    url = request.META.get('HTTP_REFERER', settings.BASE_URL)
    url = get_locale_url(url, language_code)

    return HttpResponseRedirect(url)

и мой utils.translation.py

import re
from django.conf import settings
from django.utils.translation import get_language

def get_locale_url(url, language_code):
    pattern = r'^(?:/)|^#$|(?:(?:https?://)?(?:yoursubdomain\.)?domain\.com/?(?:(?:sma|en)?/?)?)'
    if settings.USE_I18N:
        if any(language_code in language for language in settings.LANGUAGES):
            if re.match(pattern, url, flags=re.I):
                split_url = re.split(pattern, url, flags=re.I)
                if language_code == "nb":
                    url = settings.BASE_URL + "/" + split_url[len(split_url)-1]

                else:
                    url = settings.BASE_URL + "/" + language_code + "/" + split_url[len(split_url)-1]

    return url

Измените yoursubdomain (обычно www) и yourdomain для работы с вашим собственным сайтом. Вам также необходимо добавить коды языков, которые вы активировали, к вашему шаблону regex. Я использую sma и en, поэтому я написал (sma|en).

Это не самое красивое решение, но оно работает.

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