我要为那些在i18n模式中有一些网址的应用程序执行切换语言,就像我们想用前缀翻译的所有页面一样,以便拥有良好的搜索引擎优化,以及其他我们不希望拥有的网页网址中的前缀。
所以我分开了2个模式,直到这一切都没问题,当我在处理切换语言的表单时,我只面临问题:
这是我的表格:
<form action="{% url 'set_language' %}" method="POST" class="langform" style="display:none;">
{% csrf_token %}
<input name="next" type="hidden" value="{{ request.get_full_path|strip_lang }}" />
<input name="language" id="language" type="hidden" value="" />
</form>
我通过javascript验证。一切都很好,我填写语言值,表格很好提交。 我真正的问题是下一个值,因为我需要一个通用的下一个值,所以我做了一个带有像这样的过滤器的request.path:
@register.filter(name="strip_lang")
def strip_lang(value):
lang = get_language()
return '/%s/' % value.lstrip('/%s/' % lang)
此过滤器的目标是观察url是否具有语言前缀(如果是),将其删除以使下一个值中只有不带前缀的url。
这个过滤器的输出是这样的:如果我们在/ fr / pages / default它将是/ pages / default /
我点击切换语言但没有任何效果。它仍然是同一种语言。所以我删除了一个斜杠但是它是404,因为它不是正确的路径......
我可以做些什么来管理我的两种网址?一个有URL前缀,一个没有...
在某些情况下,语言会很好地激活。
提前感谢!
答案 0 :(得分:0)
好的,所以我设法让它工作我只需要将{%language lang_code%}添加到我的链接中。
现在我的网址正在使用通用的下一个值。
<ul class="lang-switch">
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
{% language lang_code %}
<li><a href="#" rel="{{ language.code }}">{{ language.code|upper }}</a></li>
{% endlanguage %}
{% endfor %}
</ul>
我只是发布我的小javascript,它可以帮助你使它工作并理解我是如何做到的:
$('.lang-switch li a').click(function (e) {
e.preventDefault;
var lang = $(this).attr('rel');
$('.langform #language').val(lang);
$('.langform').submit();
});
答案 1 :(得分:0)
@register.filter(name="strip_lang")
def strip_lang(value):
lang = get_language()
return value.replace('/{0}/'.format(lang), '/')
适合我。