使用标志和 url 切换 Django 语言

Switching Django languages with flags and urls

我目前在 Django 中有一个基于标志的语言切换器,但是所有语言的 URL 都是相同的。

我现在想更改语言切换器,以便 select 标记也可以将用户重定向到 URL 前缀(如 /en、/es、/fr 等)所以我可以轻松地将不同默认语言的页面发送给不同的用户。链接到 URL 前缀工作正常,但是当用户在下面的代码中 select 标记时,我如何最简单地将用户重定向到那里?

<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>

在我的页面上,我使用一个简单的视图和一些正则表达式将用户重定向回他们所在的页面。

这是我的看法

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

更改 您的子域(通常是 www)和 您的域 以使用您自己的站点。您还需要将已激活的语言代码添加到您的正则表达式模式中。我使用 smaen 所以我写了 (sma|en).

这不是最漂亮的解决方案,但它确实有效。