首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >允许在django中使用?lang=<code>通过查询字符串参数i18n进行语言更改

允许在django中使用?lang=<code>通过查询字符串参数i18n进行语言更改
EN

Stack Overflow用户
提问于 2017-04-06 16:43:32
回答 2查看 2.5K关注 0票数 1

在django中,我希望允许表单?...&lang=&...的查询字符串设置当前的url。理想情况下,将从查询字符串中删除lang=,并将会话语言键设置为新语言。

最终产生的url将是浏览器登陆的url。除了i18n提供的其他语言选择方法(因此我猜这将是一个中间件),站点上的每个url都会出现这种情况。

我非常不喜欢POST视图方法,这似乎是django-i18n的标准。

像这样的东西已经存在了吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-10 12:04:08

在阅读了Django文档之后,意识到Django开发人员似乎也在执行自己的编码标准(在这里,我特别想到源代码中的这个注释:

代码语言:javascript
复制
 Since this view changes how the user will see the rest of the site, it must
only be accessed as a POST request. If called as a GET request, it will
redirect to the page in the request (the 'next' parameter) without changing
any state.

)我决定使用概述的解决方案在这个岗位上,我在下面(几乎)逐字粘贴该解决方案(因此是非语义表布局):

代码语言:javascript
复制
<div id="languages">
      <table >
        <tr>
      {% get_available_languages as languages %}
      {% for key, item in languages %}
        <td>
        <form action="/i18n/setlang/" method="post">
      {% csrf_token %}
          <input type="hidden" name="language" value="{{key}}"/>
          <input id="lang_select_{{key}}" type = "image" src="/media/img/{{ key }}.gif" alt="{{ item }}"/>
        </form>
          </td>
          {% endfor %}
        </tr>
      </table>     
</div>

我还想出了我自己的JS解决方案,它更灵活,也更复杂,所以它并不值得(尽管它提供链接:但是由于它们需要onClick属性或道义上的等价物,它们对于SEO的目的是无用的)。

当然,抛出代码并删除dumbass GET限制也是一种选择--尽管维护性更高。

P.S:那些认为我的评论带有对抗性的人(毫无疑问,我的追求也被误导了)应该考虑一下,要求POST转换语言的立场是如何面对SE遍历的,同时强制跳过这种循环,以遵守允许用户通过点击标志图标来切换语言的既定设计惯例。

票数 1
EN

Stack Overflow用户

发布于 2019-11-09 23:41:29

Django中间件语言更改查询字符串?hl=langcode

https://gist.github.com/teury/5d2213181ed0abe06c316c19431f355e

代码语言:javascript
复制
import django
from django.utils import translation
from django.shortcuts import redirect, reverse


def is_django_greater_than_1_10():
    main_version = django.VERSION[0]
    if main_version > 1:
        return True

    sub_version = django.VERSION[1]
    if main_version == 1 and sub_version >= 10:
        return True

    return False


if is_django_greater_than_1_10():
    from django.utils.deprecation import MiddlewareMixin
    superclass = MiddlewareMixin
else:
    superclass = object


class LanguageMiddleware(superclass):
    def process_response(self, request, response):
        if request.resolver_match.view_name is "home":   
            lang_url = request.GET.get('hl')
            if not lang_url:
                return response

            current_language = translation.get_language()
            if lang_url == current_language:
                return response

            translation.activate(lang_url)
            request.session[translation.LANGUAGE_SESSION_KEY] = lang_url
            return redirect(reverse('home') + '?hl=' + lang_url)  

        else:
            return response

我在一个“家庭”网址上实现了这个系统。

根据键值更改语言

谷歌提供的。Idioma =Espa ol

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43261173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档