31

我遇到了翻译无法在 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',
)

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

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"

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

我错过了什么?

PS我目前模糊的项目托管在GitHub上:https ://github.com/frlan/blankspot

4

5 回答 5

50

添加LOCALE_PATHSsettings.py设置如下:

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

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

注意LOCALE_PATHS必须是一个元组(看路径末尾的逗号)。

现在基于LOCALE_PATHS,该locale文件夹应该位于项目的根目录中。

django-admin.py makemessages -l de并确保django-admin.py compilemessages从项目的根目录运行命令。

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

还要重新安排你MIDDLEWARE_CLASSES在之前和之后LocaleMiddleware的位置,如此所述:SessionMiddlewareCommonMiddleware

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项目的主要部分替换patternsi18n_patterns

from django.conf.urls.i18n import i18n_patterns

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

现在转到带有de前缀的管理页面,例如:http://127.0.0.1:8000/de/admin/ 并且管理页面应该以德语显示。

好的,你能看到德语的 Django 管理页面吗?

de还要使用前缀检查您的视图。


根据您的项目代码,有些句子不是trans块状的。把它们当作:

{% trans "your sentence" %}

此外,您必须在代码中使用ugettext_lazy而不是ugettext视图和模型(阅读此处此处。)

替换这个:

from django.utils.translation import ugettext as _ 

和:

from django.utils.translation import ugettext_lazy as _

现在一切都会好起来的。

于 2014-01-02T23:22:28.113 回答
4

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

django-admin.py makemessages -l en-gb

相反,它应该是 en_GB。

django-admin.py makemessages -l en_GB

于 2014-10-09T07:20:51.783 回答
2

请设置后再translated string使用django.popython manage.py compilemessages

for e.g 

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

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

于 2013-12-09T10:32:35.920 回答
2

检查 cookie 和会话——根据How Django Discovers Language Preference,过程是这样的:

  1. URL 中的语言前缀,当在 URLconf 中使用 i18n_patterns 时
  2. 当前用户会话中的 _language 键
  3. django_language cookie(或由 settings.LANGUAGE_COOKIE_NAME 指定)
  4. Accept-Language HTTP 标头(这是您的浏览器设置发送的内容)
  5. settings.LANGUAGE_CODE

由于您的浏览器设置设置为首选“de”,我怀疑 LocaleMiddleware 必须在前面的步骤 1.-3 中做出其他决定。

于 2014-01-03T22:53:11.650 回答
0

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

于 2014-01-02T01:36:41.990 回答