【问题标题】:Django i18n language switcher not working on deploy at subdirectoryDjango i18n 语言切换器无法在子目录中部署
【发布时间】:2021-07-17 22:10:48
【问题描述】:

我有一个有两种语言的网站(它会及时获得更多)和一个用于切换语言的小下拉菜单。它在开发服务器中按预期/预期工作。访问网站时,网址如下所示:

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 在某处生成了虚假链接,即它没有以正确的方式实现 '/django' 子目录前缀。

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

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

编辑 1:

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

编辑 2 和 4:

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

mysite.com/django/django/i18n/setlang

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

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

编辑 3:

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

【问题讨论】:

    标签: django internationalization subdirectory


    【解决方案1】:

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

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

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

    在我的例子中,我需要从完整的 url 路径中删除第二个元素,所以我的过滤器函数在 &lt;myapp&gt;_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 }}"

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

    【讨论】:

      猜你喜欢
      • 2017-02-15
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2021-02-19
      • 2014-01-15
      • 1970-01-01
      相关资源
      最近更新 更多