Django国际化和翻译问题

13
我在使用 Django 翻译时遇到了问题。
问题1 - 我更新了 django.po 文件中的字符串,但更改没有出现在网页上。
问题2 - 我使用 django-admin.py makemessages -l et 命令创建了自己的本地化文件,并将翻译字符串添加到文件中,但它们也没有出现在页面上。
我认为这不是设置问题,因为来自 django.po 文件的翻译确实出现在网站上,只有来自我自己生成的文件的更改和翻译没有出现。
编辑: 我的 settings.py 中包含以下内容:
gettext = lambda s: s
LANGUAGE_CODE = 'et'

LANGUAGES = (
             ('et', gettext('Estonian')),
             )

我的本地化文件位于

/path/to/project/locale/et/LC_MESSAGES/

文件是

django.mo 和 django.po

在问题1中我提到的文件是 Django 的自有翻译,我对其进行了修改。


你准备好阅读关于 i18n 的文档了吗?我猜测,你在模板中启用了 i18n 标签吗? 你确定你的.po文件路径正确吗? 你能写更多信息吗? - diegueus9
是的。在模板中启用国际化(i18n)要使用 {% load i18n %}。由于 django.po 文件位于正确路径(问题1),我不认为这是启用或加载 i18n 的问题。因为,像我说的那样,现有的翻译已经被加载到模板中。但是,如何知道问题2的区域设置文件是否放置在正确的位置?它们的位置应该与通过 django-admin.py makemessages -l et 生成的位置相同。 - Odif Yltsaeb
阅读此内容:http://docs.djangoproject.com/en/1.1/topics/i18n/localization/#message-files路径将为:your_project/locale/et/LC_MESSAGES/django.po。 - diegueus9
再问一遍,我猜测一下,你是否编译了你的.po文件?你确定你的.po文件没有问题吗? - diegueus9
是的,我编译了自己的.po文件。它在我的locale文件夹中创建了.mo文件。所以这也不应该是问题。如果我的.po文件存在问题,我该如何知道呢?除了在空的""之间输入翻译字符串外,我什么也没做。 - Odif Yltsaeb
显示剩余3条评论
7个回答

27

我刚刚也遇到了这个错误。我通过删除django.po文件中翻译字符串上的“#,fuzzy”标记来解决了它。如果翻译文本带有此标记,则似乎不会提供翻译后的文本,因此请确保先翻译文本,然后再删除此行。

下面是一个在po文件中没有被提供的翻译文本的示例:

     #: course/models.py:13
     #, fuzzy
     msgid "code"
     msgstr "código"

所以,只需删除标志(flag),像这样:

     #: course/models.py:13
     msgid "code"
     msgstr "código"

我希望这对你有用,祝你好运!

参考资料:http://share-experiences.com/blog/what-fuzzy-means-python-django-gettext/

注:我知道你几个月前遇到了这个问题,但是我留下这个回应是因为我们从来没有听到你是否解决了这个问题。


4
因为那些“绒毛”,我也拔了几根头发 :) - Tomasz Zieliński
1
那对我来说没用。Django目前的工作方式很神秘 :( - Shailen
唉!我刚刚花了半个小时试图弄清楚它,结果是这个糟糕的模糊。 - 3cheesewheel
你不知道调试这个问题花费了我多少时间...谢谢你的提示! - Paul Bormans

12

我遇到了与翻译未显示相同/类似的问题。设置LOCALE_PATHS解决了该问题:

# settings.py
USE_I18N = True
USE_L10N = True

LOCALE_PATHS = (
  '/path/to/djangoapp/locale',
)

嗯,是的,自我发布这个问题以来,Django已经进行了4次重大升级。Locale路径确实是解决翻译问题的方法之一,它们在Django 1.4中被添加了。 - Odif Yltsaeb
2
更好的做法是我建议使用 os.path.join(BASE_DIR, 'locale')。不要使用相对路径,因为虽然它们在开发环境中可以工作,但根据服务器等情况,在生产环境中可能无法正常工作。我曾经吃过这个亏。 - Wtower

7

翻译文件(PO)只加载一次,更改翻译文件后Django无法自动更新。若要加载新的翻译文件,您需要重新启动Django(例如停止/启动runserver、Apache或NGINX)。


你必须重新启动Django服务器,这也是我的经验,但奇怪的是在文档中没有提到。 - qff

1
一个导致Django翻译无法工作的额外原因是使用与运行应用程序不同的Python版本编译.po文件。确保使用相同的版本。

0
如果您正在使用gettext.translation来获取翻译,即:
text_de = gettext.translation('django', locale_dir, ['de'], fallback=True).ugettext('Welcome to my site')

...如果你的翻译在开发服务器上能够工作但是在生产环境中不行,注意 locale_dir 必须指向你的本地化目录。它可能位于其中一个系统的其他位置。我花了大约 2 小时才找到它。


0

请确保使用ugettext_lazy而不是ugettext


-2

检查 USE_I18N 设置。更多信息。不管怎样,我认为默认值是 True...


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