【问题标题】:set_language not changing language in certain cases (django)set_language 在某些情况下不改变语言(django)
【发布时间】:2019-03-17 10:33:35
【问题描述】:

我有以下菜单可以在我的网站中更改语言:

<div class="btn-group navbar-right language menu">
    <button class="btn btn-secondary btn-sm dropdown-toggle language-btn" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
        {% get_language_info for LANGUAGE_CODE as lang %}
        {{ lang.name_local }} ({{ lang.code }})
    </button>
    <div class="dropdown-menu" aria-labelledby="dropdownMenu2">

        {% get_current_language as LANGUAGE_CODE %}
        {% get_available_languages as LANGUAGES %}
        {% get_language_info_list for LANGUAGES as languages %}

        {% for language in languages %}
            <ul class="language-item">
              <form action="{% url 'set_language' %}" method="post">
                {% csrf_token %}
                <input name="next" type="hidden" value="{{ request.get_full_path }}" />
                <input name="language" type="hidden" value="{{ language.code }}" />
                <input type="submit" value="{{ language.name_local }} ({{ language.code }})" /> <span>{% if language.code == LANGUAGE_CODE %}✓{% endif %}</span>
              </form>
            </ul>
        {% endfor %}
    </div> 
</div>

显示为

这与the form suggested by Django docs 的工作方式相同,但避免使用“开始”按钮来切换语言。

它通常会正确切换语言,除非在某些情况下,正如我在用户报告问题后发现的那样。

如果用户通过www.mydomain.com 访问我的网站,它将被重定向到www.mydomain.com/en/(或/es//de/),据我所知,更改语言按预期工作。

但是,如果用户通过www.mydomain.com/es/ 访问我的网站,那么当尝试通过菜单更改语言时,www.mydomain.com/es/ 会再次加载。 www.mydomain.com/de/ 也会发生同样的行为。

奇怪的是,当通过www.mydomain.com/en/ 进入我的网站时,更改语言可以正常工作。也许是因为它是默认语言?

如果通过隐身窗口进入该站点,我能够始终如一地复制该问题。如果我通过普通窗口进行操作,这是一种类似的行为,但并不总是一致的。例如,有时通过www.mydomain.com/en/ 输入也不会让我更改语言。这让我觉得这可能与 cookie 有关。但这是我所知道的。

我在几个小时内检查了类似的问题,我发现的唯一类似的事情是 Django 票 In some cases i18n set_language does not change url language。其结论是:

...我重新创建了问题:我们设置了一种语言(一次)然后尝试反转 再次设置语言时使用旧语言的 URL。

这显然失败了。

解决方法:

  • 跟踪旧语言并在使用当前语言查找失败时回退尝试。
  • 跨浏览器选项卡发出信号,表明我们已经更改了语言并进行了相应调整 (???)。

这两个都超出了内置 i18n 的范围。 (第一个会 在项目级别上是可能的 - 重新实现例如set_language — 如果 它被认为具有成本效益。)

我将在此基础上关闭它。

我不确定它是否是相同的情况,因为我不明白为什么它“明显失败”。在我看来,显而易见的行为应该是更改语言。

我很惊讶这样一个基本功能不起作用,所以我可能遗漏了一些东西。

为什么它在所描述的情况下不起作用? 任何帮助将不胜感激。


编辑 1:

之前我使用的是翻译后的 URL,而不是表单,正如 here 所建议的那样。但是,由于 slug 的翻译,渲染需要 1 秒。这就是我决定改变的原因

【问题讨论】:

    标签: django django-i18n


    【解决方案1】:

    我遇到了同样的问题。这仍然是一个存在的问题,django 似乎没有翻译 HTTP 引用标头。

    See Django source code of set_language

    解决此问题的一种方法是发送一个名为 next 的隐藏输入字段,您将其设置为您所在的相同 url (request.get_full_path),但将当前语言部分替换为您打算切换到的语言。

    这是解决此问题的语言切换器的 sn-p:

        <li {% if current_language|slice:":2"  == 'en' %} class="active"{% endif %}>
          <form method="POST" action="{% url 'set_language' %}" autocomplete="off">
            {% csrf_token %}
            <span class="language-code">en</span>
            <input type="submit" name="language" value="en">
            <input type="hidden" name="next" value="{{ request.get_full_path|replace_language:"en" }}">
          </form>
        </li>
        <li{% if current_language|slice:":2" == 'da' %} class="active"{% endif %}>
          <form method="POST" action="{% url 'set_language' %}" autocomplete="off">
            {% csrf_token %}
            <span class="language-code">dk</span>
            <input type="submit" name="language" value="da">
            <input type="hidden" name="next" value="{{ request.get_full_path|replace_language:"da" }}">
          </form>
        </li>
    

    然后您可以实现一个名为 replace_language 的custom template tag,它贯穿您配置的语言并将其替换为参数。

    希望这会有所帮助:-)

    【讨论】:

      【解决方案2】:

      为了进一步参考,我只是按照here 的建议重新使用翻译后的 URL,而不是表单。

      我发现是什么让它变得如此缓慢。 事实证明这是可以优化的,所以现在翻译后的 URL 加载速度也非常快。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        • 2016-09-04
        • 1970-01-01
        • 2013-07-28
        • 2015-09-27
        相关资源
        最近更新 更多