This code correctly sets the language in Chrome (100) & Firefox (99.0.1),
but not in Safari (15.4).
{% load i18n %}
<form action="{% url 'set_language' %}" method="post">{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code ==
LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ language.name_local }} ({{ language.code }})
</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>
Request is made, its redirected to /i18n/setlang/ and back to the original
page, but not switching language.
--
Ticket URL: <https://code.djangoproject.com/ticket/33668>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
Old description:
> Trying to implement a session / cookie based translation selector.
>
> This code correctly sets the language in Chrome (100) & Firefox (99.0.1),
> but not in Safari (15.4).
>
> {% load i18n %}
>
> <form action="{% url 'set_language' %}" method="post">{% csrf_token %}
> <input name="next" type="hidden" value="{{ redirect_to }}" />
> <select name="language">
> {% get_current_language as LANGUAGE_CODE %}
> {% get_available_languages as LANGUAGES %}
> {% get_language_info_list for LANGUAGES as languages %}
> {% for language in languages %}
> <option value="{{ language.code }}"{% if language.code ==
> LANGUAGE_CODE %} selected="selected"{% endif %}>
> {{ language.name_local }} ({{ language.code }})
> </option>
> {% endfor %}
> </select>
> <input type="submit" value="Go" />
> </form>
>
> Request is made, its redirected to /i18n/setlang/ and back to the
> original page, but not switching language.
New description:
Trying to implement a session / cookie based translation selector.
This code correctly sets the language in Chrome (100) & Firefox (99.0.1),
but not in Safari (15.4).
{{{
{% load i18n %}
<form action="{% url 'set_language' %}" method="post">{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code ==
LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ language.name_local }} ({{ language.code }})
</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>
}}}
Request is made, its redirected to /i18n/setlang/ and back to the original
page, but not switching language.
--
--
Ticket URL: <https://code.djangoproject.com/ticket/33668#comment:1>
Comment (by Carlton Gibson):
This might be the intelligent tracking protection — it doesn't send the
cookies after a-certain-number of redirects. 🤔
Can I ask: if you refresh, is the language then-set? This sometimes
happens with logins, but when I've seen it, the login has worked, it's
just that the cookie wasn't sent for the final redirect request, and so
refreshing then sends it.
Was this working previously? Or are you only implementing it now? (Not
sure if this is something we'd be able to work around... — short of Use
less internal redirects... 🤔)
--
Ticket URL: <https://code.djangoproject.com/ticket/33668#comment:2>
* cc: Carlton Gibson (added)
* stage: Unreviewed => Accepted
Comment:
I'm going to Accept as
[https://docs.djangoproject.com/en/4.0/topics/i18n/translation/#the-set-
language-redirect-view The set_language redirect view docs] have this
exact form, so we'll need to review if a note or such is needed even if we
can't suggest a different flow.
--
Ticket URL: <https://code.djangoproject.com/ticket/33668#comment:3>
* owner: nobody => Eknath Baravkar
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/33668#comment:4>