我需要包含两个按钮或链接以允许用户在英语和西班牙语之间切换语言。我已经阅读 了文档 并尝试了这个:
<form action="/i18n/setlang/" method="post">{% csrf_token %}
<input name="language" type="hidden" value="es" />
<input type="submit" value="ES" />
</form>
但是,每次我单击该按钮时,页面都会重新加载,但语言根本没有改变。我错过了什么吗?
注意:我没有设置 next
,因为我只想以所需的语言重新加载当前页面。
如果我使用文档提供的默认表单,结果是一样的:页面重新加载但语言没有改变:
<form action="{% url 'set_language' %}" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
{{ language.name_local }} ({{ language.code }})
</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>
更新:
经过进一步测试,我注意到在 --- 中同时使用 i18n_patterns
和 patterns
urls.py
问题。目前我有一个看起来像这样的文件:
urlpatterns = i18n_patterns('',
url(r'^contents/', include('contents.urls')),
url(r'^events/', include('events.urls')),
# ...
)
urlpatterns += patterns('',
url(r'^i18n/', include('django.conf.urls.i18n')),
)
这似乎不起作用。但是,如果我删除 i18n_patterns
并将其更改为 patterns
那么它似乎可以工作:
urlpatterns = patterns('',
url(r'^contents/', include('contents.urls')),
url(r'^events/', include('events.urls')),
# ...
)
urlpatterns += patterns('',
url(r'^i18n/', include('django.conf.urls.i18n')),
)
文档说您不必将它包含在 i18n_patterns
中,所以我认为这应该可行,但事实并非如此!在 django.conf.urls.i18n
i18n_patterns
,它总是做同样的事情。
原文由 Caumons 发布,翻译遵循 CC BY-SA 4.0 许可协议
经过更多测试并感谢@AronYsidoro 链接的 相关问题,我终于找到了问题和一个非常简单的解决方案,实际上解决了这个问题。
首先,让我解释一下这个问题:当使用
i18_patterns
在你的urls.py
中添加语言代码时,如果你调用 URLset_language
更改语言a-指定next
,它默认为当前的,但带有前置的旧语言代码!所以,语言又回到了原来的样子!而且,如果您明确指定next
,则必须确保不要在开头包含语言代码。如果您使用
{{ request.path }}
或{{ request.get_full_path }}
指定next
作为当前页面,语言代码在返回时也不会工作。那么,在使用
i18n_patterns
时,我们如何删除这个不需要的语言代码以重新加载当前页面并更改语言?很简单,我们只需要分割前 3 个字符(斜线和两个字符的语言代码)!这里有两个例子。第一个以选择的形式(以语言作为选择)和另一个以按钮的形式(每种语言)。
我真的希望这可以帮助别人。您可以复制并粘贴代码,它应该可以工作。但是,如果使用“按钮形式”,您只需将语言设置为您想要的!
从列表中更改语言:
将语言更改为按钮: