使用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>
答案 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;