Django翻译生成po和mo文件,但翻译失败,显示占位符

6 投票
1 回答
8245 浏览
提问于 2025-04-18 09:41

我正在使用 Django 1.6.5 和 virtualenv(虚拟环境)以及 apache2

我的 settings.py 文件结构如下:

from django.utils.translation import ugettext_lazy as _

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',
)

LANGUAGE_CODE = 'tr_TR'
LANGUAGE_COOKIE_NAME = 'wm_lang'
LOCALE_PATHS = (
    '/home/mustafa/python/myproject/locale'
)

USE_I18N = True
USE_L10N = True

LANGUAGES = (
    ('tr', _(u'Türkçe')),
    ('en', _(u'English')),
)

我有一个模板文件,长这样:

{% extends .... %}
{% load i18n %}

{% block content %}
    <h2>{% trans 'Hosgeldin' %}</h2>
....
....

我运行以下命令来创建 po 文件:

django-admin.py makemessages  --locale=tr --locale=en

这会生成以下文件:

/home/mustafa/python/myproject/locale/tr/LC_MESSAGES/django.po
/home/mustafa/python/myproject/locale/en/LC_MESSAGES/django.po

我应用了翻译字符串,所以我的 django.po 翻译文件看起来是这样的:

英文:

#: templates/websitesi/index.html:6
msgid "Hosgeldin"
msgstr "Welcome, that is a test"

土耳其文:

#: templates/websitesi/index.html:6
msgid "Hosgeldin"
msgstr "Hoşgeldiniz, bu bir deneme"

然后我用以下命令编译它们:

django-admin.py compilemessages

这样 Django 会在 django.po 文件旁边生成 django.mo 文件,适用于两种语言。

但是当我访问页面时,我看到的是 Hosgeldin(翻译占位符),而不是翻译后的文本。

在模板中写 {{ LANGUAGE_CODE }} 会显示所选的语言代码。当我的地址是 someadress/en 时,语言代码显示为 en...

我漏掉了什么吗?

更新:这是我 根目录urls.py 的一部分:

urlpatterns = patterns('',
    (r'^i18n/', include('django.conf.urls.i18n')),
)

urlpatterns += i18n_patterns('',
    url(r'^admin/docs/', include('django.contrib.admindocs.urls')),
    url(r'^admin/', include(admin.site.urls)),
)

urlpatterns += staticfiles_urlpatterns()

urlpatterns += i18n_patterns('websitesi.views',
    url(r'^$', 'index', name='index'),  # This is my home page
                         ....
                         ....

然后我去 my_local_server/my_local_server/trmy_local_server/en 测试,但翻译都失败了。

当我通过 my_local_server/tr/adminmy_local_server/en/admin 访问管理界面时,Django 的翻译功能正常工作。

1 个回答

7

最后,果然是个打字错误。

settings.py 文件里

LOCALE_PATHS = (
    '/home/mustafa/python/myproject/locale'
)

但是 Django 期望 LOCALE_PATHS 是一个元组,所以加上一个逗号就解决了这个问题...

LOCALE_PATHS = (
    '/home/mustafa/python/myproject/locale',
)

撰写回答