具有 i18n 模式和普通 url_pattern 的 Django 切换语言

Django Switch language with i18n pattern and normal url_pattern

我必须为一个应用程序切换语言,该应用程序在 i18n 模式中有一些 urls,例如我们要翻译的所有页面,以具有良好的 SEO 前缀,以及我们需要翻译的其他页面不想在 url.

中有前缀

所以我将 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??一个有 URL 前缀,一个没有...

语言在某些情况下被很好地激活。

提前致谢!

好的,所以我设法让它工作我只需要将 {% language lang_code %} 添加到我的 link.

现在我的 url 正在使用通用的下一个值。

<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>

我只是 post 我的小 javascript 它可以帮助你让它发挥作用并了解我是如何做到这一点的:

  $('.lang-switch li a').click(function (e) {
e.preventDefault;
var lang = $(this).attr('rel');
$('.langform #language').val(lang);
$('.langform').submit();
});
@register.filter(name="strip_lang")
def strip_lang(value):
    lang = get_language()
    return value.replace('/{0}/'.format(lang), '/')

适合我。