Reputation: 21
When I am trying to use next
it doesn't work because in next
-url there are old language code so language doesn't change.
my template:
<a href="{% url "set_language_from_url" user_language="en" %}?next={{request.path}}">en</a>
<a href="{% url "set_language_from_url" user_language="ru" %}?next={{request.path}}">ru</a>
my url:
path('language-change/<user_language>/', views.set_language_from_url, name="set_language_from_url"),
my view:
def set_language_from_url(request, user_language):
translation.activate(user_language)
request.session[translation.LANGUAGE_SESSION_KEY] = user_language
redirect_to = request.POST.get('next', request.GET.get('next', '/'))
return redirect(redirect_to)
Upvotes: 0
Views: 266
Reputation: 5405
You can use Django's built in set_language_view.
This is a view that can be used to change the language of the user, and when passing redirect_to, it will automatically build the correct url for the next page to go to.
You can check out the example provided in the docs.
You can also simply change your code to not include the path of the request, but the name of the url to redirect to, like this (Assuming you have a url in you url_patterns with the name 'view_page':
<a href="{% url "set_language_from_url" user_language="en" %}?next={{'view_page'}}">en</a>
<a href="{% url "set_language_from_url" user_language="ru" %}?next={{'view_page'}}">ru</a>
Your view:
def set_language_from_url(request, user_language):
translation.activate(user_language)
request.session[translation.LANGUAGE_SESSION_KEY] = user_language
redirect_to = request.POST.get('next', request.GET.get('next', '/'))
return redirect(reverse(redirect_to))
Edit:
For returning to the current request instead of predefined request (I have not tested this, so I don't know if it will work):
You could try resolving the path of the current request, and reversing it again, passing in the correct arguments. This should return the exact url as before, only with a different language prefix.
<a href="{% url "set_language_from_url" user_language="en" %}?next={{request.path}}">en</a>
<a href="{% url "set_language_from_url" user_language="ru" %}?next={{request.path}}">ru</a>
def set_language_from_url(request, user_language):
translation.activate(user_language)
request.session[translation.LANGUAGE_SESSION_KEY] = user_language
redirect_to = request.POST.get('next', request.GET.get('next', '/'))
resolved_url = resolve(redirect_to)
if resolved_url.kwargs:
return redirect(reverse(resolved_url.url_name, **resolved_url.kwargs))
else:
return redirect(reverse(resolved_url.redirect_to, *resolved_url.args))
Upvotes: 0