尝试从 Django 模板更改语言的问题

新手上路,请多包涵

我需要包含两个按钮或链接以允许用户在英语和西班牙语之间切换语言。我已经阅读 了文档 并尝试了这个:

 <form action="/i18n/setlang/" method="post">{% csrf_token %}
    <input name="language" type="hidden" value="es" />
    <input type="submit" value="ES" />
</form>

但是,每次我单击该按钮时,页面都会重新加载,但语言根本没有改变。我错过了什么吗?

注意:我没有设置 next ,因为我只想以所需的语言重新加载当前页面。

如果我使用文档提供的默认表单,结果是一样的:页面重新加载但语言没有改变:

 <form action="{% url 'set_language' %}" method="post">
    {% csrf_token %}
    <input name="next" type="hidden" value="{{ redirect_to }}" />
    <select name="language">
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}
            <option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
                {{ language.name_local }} ({{ language.code }})
            </option>
        {% endfor %}
    </select>
    <input type="submit" value="Go" />
</form>

更新

经过进一步测试,我注意到在 --- 中同时使用 i18n_patternspatterns urls.py 问题。目前我有一个看起来像这样的文件:

 urlpatterns = i18n_patterns('',
    url(r'^contents/', include('contents.urls')),
    url(r'^events/', include('events.urls')),
    # ...
)
urlpatterns += patterns('',
    url(r'^i18n/', include('django.conf.urls.i18n')),
)

这似乎不起作用。但是,如果我删除 i18n_patterns 并将其更改为 patterns 那么它似乎可以工作:

 urlpatterns = patterns('',
    url(r'^contents/', include('contents.urls')),
    url(r'^events/', include('events.urls')),
    # ...
)
urlpatterns += patterns('',
    url(r'^i18n/', include('django.conf.urls.i18n')),
)

文档说您不必将它包含在 i18n_patterns 中,所以我认为这应该可行,但事实并非如此!在 django.conf.urls.i18n i18n_patterns ,它总是做同样的事情。

原文由 Caumons 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 586
2 个回答

经过更多测试并感谢@AronYsidoro 链接的 相关问题,我终于找到了问题和一个非常简单的解决方案,实际上解决了这个问题。

首先,让我解释一下这个问题:当使用 i18_patterns 在你的 urls.py 中添加语言代码时,如果你调用 URL set_language 更改语言a-指定 next ,它默认为当前的,但带有前置的旧语言代码!所以,语言又回到了原来的样子!而且,如果您明确指定 next ,则必须确保不要在开头包含语言代码。

如果您使用 {{ request.path }}{{ request.get_full_path }} 指定 next 作为当前页面,语言代码在返回时也不会工作。

那么,在使用 i18n_patterns 时,我们如何删除这个不需要的语言代码以重新加载当前页面并更改语言?很简单,我们只需要分割前 3 个字符(斜线和两个字符的语言代码)!

这里有两个例子。第一个以选择的形式(以语言作为选择)和另一个以按钮的形式(每种语言)。

我真的希望这可以帮助别人。您可以复制并粘贴代码,它应该可以工作。但是,如果使用“按钮形式”,您只需将语言设置为您想要的!

从列表中更改语言:

 <form action="{% url 'set_language' %}" method="post">
  {% csrf_token %}
  <input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" />
  <select name="language">
    {% get_language_info_list for LANGUAGES as languages %}
      {% for language in languages %}
        <option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
          {{ language.name_local }} ({{ language.code }})
        </option>
      {% endfor %}
  </select>
  <input type="submit" value="Change" />
</form>

将语言更改为按钮:

 <form action="{% url 'set_language' %}" method="post">
  {% csrf_token %}
  <input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" />
  <input name="language" type="hidden" value="es" />
  <input type="submit" value="ES" />
</form>

原文由 Caumons 发布,翻译遵循 CC BY-SA 3.0 许可协议

可能选项的总结:

使用 select 更改用户的会话语言

Django 文档 上有一个很好的广泛描述和示例。

使用按钮更改用户的会话语言

没有必要像@Caumons 建议的那样为每个按钮重复一个表单,相反,您可以简单地在表单中包含与语言一样多的按钮。

 <form action="{% url 'set_language' %}" method="post">
    {% csrf_token %}
    <input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" />
    <ul class="nav navbar-nav navbar-right language menu">
        {% get_current_language as LANGUAGE_CODE %}
        {% get_available_languages as LANGUAGES %}
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}
            <li>
                <button type="submit"
                        name="language"
                        value="{{ language.code }}"
                        class="{% if language.code == LANGUAGE_CODE %}selected{% endif %}">
                    {{ language.name_local }}
                </button>
            </li>
        {% endfor %}
    </ul>
</form>

您当然可以将按钮样式设置为看起来像链接或其他任何东西。

更改链接显示的语言

如果不需要更改默认用户会话语言,则可以使用简单的链接来更改内容:

 <ul class="nav navbar-nav navbar-right language menu">
    {% get_current_language as LANGUAGE_CODE %}
    {% get_available_languages as LANGUAGES %}
    {% get_language_info_list for LANGUAGES as languages %}
    {% for language in languages %}
        <li>
            <a href="/{{ language.code }}{{ request.get_full_path|slice:'3:' }}"
               class="{% if language.code == LANGUAGE_CODE %}selected{% endif %}"
               lang="{{ language.code }}">
                {{ language.name_local }}
            </a>
        </li>
    {% endfor %}
</ul>

搜索引擎优化

如果按照 Django 的建议,使用表单更改会话语言,我不完全确定内容是否对 SEO 友好。因此,链接 <a> 标记可能会添加为隐藏在 <button> 元素下方。

原文由 Wtower 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏