Reputation: 135
I am currently having a language switcher in Django based on flags, but where the URL for all languages are the same.
I would now like to change the language switcher so that selecting a flag also redirects the user to a URL prefix (like /en, /es, /fr, etc.) so I easily can send the page in different default languages to different users. Linking to the URL prefix works fine, but how do I easiest redirect the users there when they select flags in the code below?
<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>
Upvotes: 0
Views: 538
Reputation: 136
On my page I use a simple view and some regex to redirect the users back to the page they was on.
Here is my view
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)
and my 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
Change yoursubdomain (usually www) and yourdomain to work with your own site. You also neeed to add the language codes you have activated to your regex pattern. I use sma and en so I've written (sma|en).
It ain't the prettiest solution, but it works.
Upvotes: 3