【问题标题】:Switching Django languages with flags and urls使用标志和 url 切换 Django 语言
【发布时间】:2021-10-05 17:48:52
【问题描述】:

我目前在 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>

【问题讨论】:

    标签: django internationalization


    【解决方案1】:

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

    这是我的看法

    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 以使用您自己的网站。您还需要将已激活的语言代码添加到您的正则表达式模式中。我使用 smaen 所以我写了 (sma|en)。

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

    【讨论】:

    • 谢谢!我尝试了一下,但我认为我只是设置了与您的环境有点不同的环境-就像您对事物的功能性方法一样。最终基于我的解决方案:brainstorm.it/snippets/django-language-switching 但包括一些手动语言切换。更不漂亮,但它的工作! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 2012-02-15
    • 2014-09-01
    • 2015-04-24
    • 2013-12-25
    • 2018-12-21
    • 2012-01-13
    相关资源
    最近更新 更多