0

使用 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>
4

1 回答 1

0

我发现了问题所在。

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

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

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

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

该行:

< input type="hidden" name="language" value="en-us" />

应该:

< input type="hidden" name="language" value="en" />

于 2013-08-10T17:56:40.820 回答