Django翻译模板 {% trans "something" %}

9

好的,我已经疯狂地搜索了这个我认为很简单的问题。

我使用的是Django 1.4。

问题在于django无法在我的模板中翻译一个简单的{% trans "work" %}。

这是我所做的:

Settings.py:

LANGUAGE_CODE = 'en-us'
USE_I18N = True
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',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.static",
    "django.core.context_processors.request",
)

LOCALE_PATHS = (
    '/home/m00p/PycharmProjects/astrid/locale'
)

这是我的地图结构:
/
myproject/
apps/
locale/
template/

所以我运行了:

django-admin.py makemessages -l nl -i settings.py

它成功地在locale文件夹nl/LC_MESSAGES/django.po中创建了文件,然后我编辑了它在django.po中找到的翻译内容。

#: templates/base.html:22
msgid "work"
msgstr "ddddddddddddd"

我随后运行了编译命令:

django-admin.py compilemessages

它成功地在正确的文件夹中创建了一个django.mo文件。
我还在myproject/urls.py中添加了这个内容。
urlpatterns = patterns('',
    url(r'^i18n/', include('django.conf.urls.i18n')),
)

urlpatterns += i18n_patterns('',
    url(r'^$', 'front.views.home', name='home'),
)

我在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>

当我访问这个网站时,URL中会显示127.0.0.1:8000/en/。这是正确的,因为英语是默认语言。当我用表单将它改成荷兰语(NL)时,它会重定向到127.0.0.1:8000/nl/,但是我翻译的文本没有改变。我确定语言已经切换成了荷兰语,因为当我显示{{ LANGUAGE_CODE }}时,它显示的是NL。

有人知道为什么它没有改变吗?

谢谢m00p

问题已解决

在添加内容时,我忘记清除浏览器缓存,因此它仍然使用旧页面。当我在Chrome中清除浏览器数据并重新访问该页面并更改语言时,它就可以正确翻译了。无论如何,感谢您的建议!


我也在使用多语言概念,我做了和你一样的事情,但是我的django.po文件中不包含我可以编辑的模板文件行,例如你的.po文件包含#: templates/base.html:22 msgid "work"...但是它包含所有的文件在site-packages/django内部(即admin部分)。我不想编辑这些管理文件,但我想编辑以查看翻译是否有效,但对于这个管理部分它并没有起作用..........所以我的主要问题是如何显示我可以编辑的模板数据。 - Inforian
1
我已经在我的模板中指定了 `{% load i18n %}{% trans "Hello" %}`,以便 .po 文件可以捕获它,并且我可以在 .po 文件中添加翻译数据............但是它仍然无法捕获 .po 文件中的这些模板..... ??? - Inforian
4个回答

13

我刚刚在开发我的新项目Sportolio时花费了几个小时尝试解决这个Django 1.5的问题,结果发现我在LOCALE_PATH的末尾缺少了逗号

LOCALE_PATHS = (
    '/path/to/my/project/locale/',
)

这非常重要,因为 Django 期望 LOCALE_PATHS 是元组而不是字符串。

希望能对某人有所帮助 :)


绝对刚刚保存了我的! - Angwen

5
在Django 1.4中,项目根目录下的locale文件夹不再被支持。您应将其添加到LOCALE_PATHS设置中,默认情况下为空。有关详细信息,请参见Django设置
但是,似乎与本地化生成相关的管理命令可以正常工作,因此我不知道您是否已经这样做。

我做了,但是没有任何改变 :( - m00p

0

我曾经遇到过同样的情况。有些短语被翻译了,但大部分只显示了键值。我们有两种主要语言:英语和波斯语。两者都存在相同的问题。 我查看了所有关于Django翻译的在线文档,并检查了所有相同的问题。我可以说我几乎尝试了所有方法。 唯一的区别是我们在生产服务器上进行测试。 而我没有重新加载服务器! 所以这个一行命令让我摆脱了痛苦:

sudo /etc/init.d/uwsgi reload

我做错的是我重新启动了wsgi而不是uwsgi!
如果你想像我一样做,这里是步骤: 我在服务器上按照以下顺序执行:
django-admin makemessages -l en
django-admin makemessages -l fa

添加波斯语短语和一些英文文本以进行测试。

django-admin compilemessages
python manage.py clear_cache
python manage.py runserver

服务器没有错误运行。但是英文或波斯语的更改都没有生效。看起来Django正在从旧缓存中加载。因此,我删除了整个缓存,甚至从服务器中删除了所有文件并重新安装了整个项目。然而问题仍然存在。

我在我的笔记本电脑上使用Django制作了消息并将其发送到服务器。此外,我尝试了不同的文本编辑器和翻译工具,例如poedit生成po和mo文件。但问题仍然存在。

我使用并替换了trans标签以查看它们是否在其中之一起作用:

{% trans ' ' %}
{% trans " " %}
{% blocktrans %} {% endblocktrans %}
{% trans "xyz" az XYZ %} {{ XYZ }}
{{ _() }}

它们都没有起作用!

但重新加载服务器可以使一切恢复正常。 我希望这对某些人有所帮助。


0

你输入命令的位置很重要。

在我的情况下,这是我的项目结构:

myproject/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    apps/
        migrations/
        __init__.py
        admin.py
        models.py
        tests.py
        views.py

如果我在mysite文件夹中调用makemessages,就像这样:
D:\...\myproject\mysite> python ../manage.py makemessages -all

它不会获取HTML中的字符串{% trans "str" %}
但是如果我在myproject文件夹中调用makemessages,就像这样:

D:\...\myproject> python manage.py makemessages -all

没问题!它可以在 HTML 中找到所有的 {% trans "str" %}
所以请注意您的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接