如何解决Django i18n 语言切换器无法在子目录中部署
我有一个有两种语言的网站(它会及时提供更多)和一个用于切换语言的小下拉菜单。它在开发服务器中按需要/预期工作。访问网站时,网址如下所示:
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' 子目录前缀。
我觉得这应该是一个简单的解决方法——一个在某处切换的设置——但是在花了一天的大部分时间谷歌搜索和阅读文档后,我很难过。我很高兴分享设置片段等,但老实说,我不确定什么是相关的。
有人可以用关键字或建议为我指出正确的方向吗?
编辑 1:
我尝试将前缀添加到 <input>
标记中的 value。所以它读取 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 }}"
现在站点正确重定向到子目录前缀下。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。