【问题标题】:Django not translating the site properlyDjango 没有正确翻译网站
【发布时间】:2013-08-12 18:27:19
【问题描述】:

在这方面花费了太多时间之后,StackOverflow 是为了救援。

我的 settings.py 配置如下:

...
TIME_ZONE = 'Europe/Berlin'

LANGUAGE_CODE = 'de'

LANGUAGES = (
  ('en', u'English'),
  ('de', u'German'),
  ('fr', u'French'),
)

USE_I18N = True

USE_L10N = True

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

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'django.core.context_processors.debug',
    'django.core.context_processors.i18n',
    'django.core.context_processors.request',
    'django.core.context_processors.static',
    'django.contrib.messages.context_processors.messages',
)
...

在我的base.html 文件中,我有一个如下表格:

<form action="/i18n/setlang/" method="post">
    {% csrf_token %}
    <input name="next" type="hidden" value="/" />
    <select name="language">
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}
            <option value="{{ language.code }}">{{ language.name_local }} ({{ language.code }})</option>
        {% endfor %}
    </select>
    <input type="submit" value="Go" />
</form>

我的urls.py

urlpatterns = patterns('',
    url(r'^i18n/', include('django.conf.urls.i18n')),
    url(r'^$', 'MainApp.views.index'), #root
)

在同一个base.html 文件中,我在顶部有{% load i18n %},在正文中,我有一个样本{% trans "This is the title." %}。在运行服务器之前,我做了:

django-admin.py makemessages -l de
django-admin.py makemessages -l fr

上面的示例文本是由makemessages 提取的,我为msgstr 提供了相应的翻译。之后,我做了django-admin.py compilemessages. 命令运行良好,并在各自的语言环境文件夹中生成了 .mo 文件。

我运行服务器,但表单不起作用。在另一篇 StackOverflow 帖子中,有人提示我删除 #, fuzzy lines,我照做了。我究竟做错了什么?

谢谢!

【问题讨论】:

    标签: django python-2.7 internationalization django-i18n


    【解决方案1】:

    您应该在 MIDDLEWARE_CLASSES 中将 LocaleMiddleware 放在 SessionMiddleware 之后:

    MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    ....
    )
    

    中间件类的顺序很重要。 LocaleMiddleware 使用会话数据来检测用户语言,所以它必须在 SessionMiddleware 之后。这里的文档中也提到了https://docs.djangoproject.com/en/1.3/topics/i18n/deployment/#how-django-discovers-language-preference

    希望这对你有用!

    【讨论】:

    • 谢谢!这正是问题所在。我将语言环境向下移动,然后繁荣 kaboom 成功了!
    • @ppetrid 你能看看我的帖子,看看你能不能帮到我?我遇到了与这个问题几乎相同的问题,但不知道如何解决这个问题。 stackoverflow.com/questions/23615394/…
    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多