【发布时间】: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