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

frl*_*lan 27 python django django-i18n

我有一个翻译不能在Django 1.6上工作的问题!我已经添加到我的settings.py中

LANGUAGE_CODE = 'en-us'
ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('de', ugettext('German')),
)
Run Code Online (Sandbox Code Playgroud)

还添加了中间件:

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',
)
Run Code Online (Sandbox Code Playgroud)

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

from django.utils.translation import ugettext_lazy as _
Run Code Online (Sandbox Code Playgroud)

我的模板以

{% extends "base.html" %}
{% load i18n %}
Run Code Online (Sandbox Code Playgroud)

并且在模板内部比我使用trans占位符.例如

<h1>{% trans "Register a tank" %}</h1>
Run Code Online (Sandbox Code Playgroud)

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

msgid "Register a tank"
msgstr "Einen neuen Tank anmelden"
Run Code Online (Sandbox Code Playgroud)

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

我错过了什么?

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

Omi*_*aha 44

添加LOCALE_PATHSsettings.py并将其设置为:

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

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

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)
Run Code Online (Sandbox Code Playgroud)

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

并确保你运行django-admin.py makemessages -l dedjango-admin.py compilemessages从项目的根CMDS.

djPrj
  |
  +---> djPrj
  |
  +---> djApp
  |
  +---> locale
  |
  +---> templates
Run Code Online (Sandbox Code Playgroud)

还重新安排MIDDLEWARE_CLASSESLocaleMiddleware经过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',
)
Run Code Online (Sandbox Code Playgroud)

重新启动您的服务(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)),
    # ...
)
Run Code Online (Sandbox Code Playgroud)

现在转到de页有http://127.0.0.1:8000/de/admin/前缀,如:detrans网页应显示在ugettext_lazy语言.

好的,你能用语言看到ugettextdjango的页面LOCALE_PATHS吗?

还可以使用settings.py前缀检查您的视图.


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

{% trans "your sentence" %}
Run Code Online (Sandbox Code Playgroud)

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

替换这个:

from django.utils.translation import ugettext as _ 
Run Code Online (Sandbox Code Playgroud)

有:

from django.utils.translation import ugettext_lazy as _
Run Code Online (Sandbox Code Playgroud)

现在一切都会奏效.