为什么request.session ['django language']被浏览器首选语言覆盖?

时间:2013-08-10 16:47:30

标签: django

使用Django,我希望用户能够选择网站语言。

当用户在浏览器中设置首选语言为英语时,它工作正常。 用户可按预期在英语和葡萄牙语之间切换。

但是,当我更改浏览器首选语言时,语言切换器停止工作(我在Opera,Google Chrome,Firefox和Epiphany中测试过 - 无法在IE或Safari上测试)。

我想我做错了什么,但弄不清楚是什么。令我感到困惑的是,当首选语言恢复为默认语言时,它工作正常......

Django文档说它将使用以下内容来选择语言:

  

首先,它在当前用户中查找django_language键   会话。     如果做不到这一点,它会寻找一个cookie。     如果做不到这一点,它会查看Accept-Language HTTP标头。此标头由您的浏览器发送,并按优先级顺序告诉服务器您喜欢哪种语言。 Django尝试标题中的每种语言,直到找到具有可用翻译的语言。     如果不这样做,它会使用全局LANGUAGE_CODE设置。

当浏览器使用首选语言时,为什么我会在语言切换器中获得与使用默认语言时不同的行为?


我的settings.py尊重中间件如下

MIDDLEWARE_CLASSES = ( 
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.locale.LocaleMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
) 

我的语言环境文件夹包含结构:

locale/
    pt_BR/
        LC_MESSAGES/
            django.mo
            django.po

我的语言切换器(在模板中)如下:

    <div id="secondary-menu" class="navigation">
        <ul class="menu">
            <li><a href="/about-us" > {{ second1 }}</a></li>
            <li><a href="/free-culture" > {{ second2 }}</a></li>
            <li><a > {{ second3 }}</a>
                <ul>
                    <li><form name="setLangEnglish" method="post" action="/i18n/setlang/">{% csrf_token %}
                        <input name="next" type="hidden" value="/" />
                        <input type="hidden" name="language" value="en-us"/>
                        <input class="language-switcher" type="submit" alt="English" name="submit" value="English"/>
                        </form>
                    </li>
                    <li><form name="setLangPortuguese" method="post" action="/i18n/setlang/">{% csrf_token %}
                         <input name="next" type="hidden" value="/" />
                         <input type="hidden" name="language" value="pt-br"/>
                        <input class="language-switcher" type="submit" alt="Portugues" name="submit" value="Portugues"/>
                        </form>
                    </li>
                </ul>
            </li>
        </ul>
    </div>

1 个答案:

答案 0 :(得分:0)

我发现了问题所在。

我的语言切换器使用“en-us”设置英语。

如果我有多个英语选项,这只会是正确的。 在这种情况下,我的locale文件夹中应该有一个en_US文件夹(以及其他django.po和django.mo)。

由于我只想使用一个英文选项,我可以使用“en”作为切换台的值。 不需要其他语言环境文件夹,因为“en”是django的默认值。

对于任何可能会觉得有帮助的人,这里有修复:

该行:

  

&LT; input type =“hidden”name =“language” value =“en-us” /&gt;

应该是:

  

&LT;输入类型=“隐藏”name =“language” value =“en” /&gt;