如何以正确的方式设置Django翻译?

时间:2013-12-09 09:55:28

标签: python django django-i18n

我遇到了翻译不能使用Django 1.6的问题!我已添加到我的settings.py

LANGUAGE_CODE = 'en-us'
ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('de', ugettext('German')),
)

还添加了中间件:

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

以及我的* .py文件,每当我使用的字符串应该是l10nd:

from django.utils.translation import ugettext_lazy as _

我的模板以

开头
{% extends "base.html" %}
{% load i18n %}

和模板内部比我使用trans占位符。例如。

<h1>{% trans "Register a tank" %}</h1>

实际上,字符串出现在locale / de / LC_MESSAGES / django.po中,并且在运行时我已经翻译了它们。例如。

msgid "Register a tank"
msgstr "Einen neuen Tank anmelden"

我的浏览器设置为首先请求德语内容: Browser settings

我错过了什么?

P.S。我目前正在模糊的项目托管在github上:https://github.com/frlan/blankspot

5 个答案:

答案 0 :(得分:40)

LOCALE_PATHS添加到settings.py并将其设置为以下:

请注意LOCALE_PATHS必须是元组(查看路径末尾的逗号)

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

现在基于LOCALE_PATHSlocale文件夹应位于项目的根目录中。

请务必从项目的根目录运行django-admin.py makemessages -l dedjango-admin.py compilemessages cmds。

djPrj
  |
  +---> djPrj
  |
  +---> djApp
  |
  +---> locale
  |
  +---> templates

MIDDLEWARE_CLASSES之后和提及hereLocaleMiddleware之前,还要将SessionMiddleware重新排列为CommonMiddleware

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',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

重新启动您的服务(python manage.py runserver)并再次检查。


为了确保您的本地化应用于django的默认django.mo文件的django管理页面,请执行以下测试:

项目的主要urls.py中的第一个用patterns替换i18n_patterns

from django.conf.urls.i18n import i18n_patterns

urlpatterns = i18n_patterns('',
    url(r'^admin/', include(admin.site.urls)),
    # ...
)

现在转到带有Admin前缀的de页面,例如:http://127.0.0.1:8000/de/admin/ Admin页面应以German语言显示。

好的,你能用Admin语言看到django的de页吗?

同时使用de前缀检查您的观点。


根据您的project代码,某些句子不在反式块中。把它们当作:

{% trans "your sentence" %}

此外,您必须在代码中使用ugettext_lazy代替ugettext查看视图和模型,(read here

替换这个:

from django.utils.translation import ugettext as _ 

with:

from django.utils.translation import ugettext_lazy as _

现在一切都会奏效。

答案 1 :(得分:4)

就我而言,我使用en-gb作为运行

的参数

django-admin.py makemessages -l en-gb

相反,它应该是en_GB。

django-admin.py makemessages -l en_GB

答案 2 :(得分:2)

请在translated string中设置django.po,然后使用python manage.py compilemessages

for e.g 

#: path/to/python/module.py:23
msgid "Welcome to my site."
msgstr "put appropriate translated string here"

建议 - :您可以使用django-rosetta包从UI界面添加translated string。从django-admin添加T-string很容易。 https://github.com/mbi/django-rosetta

答案 3 :(得分:2)

检查cookie和会话 - 根据How Django Discovers Language Preference,流程如下:

    在URLconf中使用i18n_patterns时,
  1. URL中的语言前缀
  2. 当前用户会话中的
  3. _language键
  4. django_language cookie(或由settings.LANGUAGE_COOKIE_NAME指定)
  5. Accept-Language HTTP标头(这是您的浏览器设置发送的内容)
  6. settings.LANGUAGE_CODE
  7. 由于您的浏览器设置设置为首选&#39; de&#39;,我怀疑LocaleMiddleware必须在之前的步骤1中确定其他步骤。 -

答案 4 :(得分:0)

您需要在设置中enable the LocaleMiddleware告诉Django根据浏览器设置进行语言检测。更改语言首选项会有效地设置Accept-Language标题。您可能需要签入隐身窗口,因为其他语言检测方法具有更高的优先级,例如用户的会话和django_language cookie。