Переключение языков 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).
Это не самое красивое решение, но оно работает.