Django i18n 语言切换器无法在子目录中部署

Django i18n language switcher not working on deploy at subdirectory

我有一个有两种语言的网站(它会及时更新)和一个用于切换语言的小下拉菜单。它在开发服务器中作为 desired/expected 工作。访问网站时,网址看起来像这样:

localhost:8000/en/home
localhost:8000/pl/home

django 项目部署在服务器(Apache w/ mod-wsgi)的子目录位置,比方说:

mysite.com/django

一切都按预期工作,甚至是该子目录下的管理站点等,但是,我用于更改语言的小菜单不再起作用。当我更改语言时,页面会重新加载,但使用的语言与我尝试更改时使用的语言相同。我可以通过在浏览器中手动更改 url 来在语言之间来回切换,并且所有页面都按预期的方式工作;只是下拉按钮不再起作用了。

mysite.com/django/en/home
mysite.com/django/pl/home

起初,我以为这是我的按钮(非常标准的教程):

                            <form action="{% url 'set_language' %}" method="post" class="form-inline">{% csrf_token %}
                                <div class="form-group mx-sm-3 mb-0">
                                    <input type="hidden" name="text" value="{{ redirect_to }}" class="form-control form-control-sm">
                                    <select name="language" id="langselect" onchange="this.form.submit()">
                                        {% get_available_languages as LANGUAGES %}
                                        {% get_language_info_list for LANGUAGES as languages %}
                                        {% for language in languages %}
                                            <option value="{{ language.code }}" {% if language.code == LANGUAGE_CODE %} selected {% endif %}>
                                                {{ language.name_local }} ({{ language.code }})
                                            </option>
                                        {% endfor %}
                                    </select>
                                  </div>
                            </form> 

但实际上,如果我更改 Apache 配置以将站点部署在服务器根目录 mysite.com(只是为了尝试隔离问题),下拉按钮、翻译和其他一切都会按预期工作。我认为这意味着 i18n 在某个地方生成了一个伪造的 link,即它没有以正确的方式实现 '/django' 子目录前缀。

我觉得这应该是一个简单的解决方法——一个在某处切换的设置——但我在花了一天的大部分时间谷歌搜索和阅读文档后感到困惑。我很乐意分享设置片段等,但老实说,我不确定什么是相关的。

有人可以用关键字或建议如何解决这个问题为我指明正确的方向吗?

编辑 1:

我尝试将前缀添加到 <input> 标记中的值。所以它显示为 value="/django{{ redirect_to }}" 但这也不起作用。

编辑 2 和 4:

在打开网络检查器的情况下使用我的切换器按钮显示 setlang 函数调用错误 url。

mysite.com/django/django/i18n/setlang

我仍然不知道如何解决它,但我相当确定这就是问题所在。

如果我将 apache 配置更改为部署在 mysite.com,则重定向是通过 mysite.com/i18n/setlang,因此我似乎需要以某种方式控制 django 子目录前缀的解释方式。但是如何?!?!?

编辑 3:

切换器成功更改了 cookie,尽管没有重新加载到正确的语言。

所以在经历了很多挫折之后,我有了一个可行的解决方案。

我必须首先创建一个自定义过滤器,从 url 中删除语言代码。由于现有代码成功更新了语言首选项 cookie,并且由于导航到任何没有语言代码的路径会自动/成功附加语言路径,所以我可以使用我的切换器重定向到没有语言代码的路径,并且网站将根据以下内容成功呈现用户的浏览器首选项或 cookie。从 url 中删除语言代码似乎是目前最合理的方法。

根据文档 here 添加自定义模板标签的设置基础结构。我在我的应用程序中添加了一个 templatetags 目录,在一个 __init__.py 文件和一个 <myapp>_extras.py 文件中

在我的例子中,我需要从完整的 url 路径中删除第二个元素,所以我的过滤器函数在 <myapp>_extras.py 中。该文件如下所示:

from django import template

register = template.Library()

@register.filter
def custom_redir_lang(url_fullpath):
    ls_urls = url_fullpath.split('/')
    del ls_urls[1]
    return '/'.join(ls_urls)

然后我将模板中输入标签的 value"{{ redirect_to }}" 更改为 "{{ request.get_full_path|custom_redir_lang }}"

现在站点正确重定向到子目录前缀下。