Django i18n:翻译的常见原因没有出现

时间:2010-02-24 17:45:13

标签: python django translation gettext django-multilingual

我正在制作一个多语言的Django网站。我创建了一个消息文件,填充并编译它。我用我想要的语言(希伯来语)检查了网站(在这种情况下为管理员),并且大多数短语都像希伯来语一样出现,但有些则没有。我检查了源代码,这些内容仍然显示为_('Whatever'),它们也会在消息文件中翻译,是的,我记得要compilemessages

翻译的哪些常见原因不是这样?

9 个答案:

答案 0 :(得分:25)

也许已翻译的字符串标记为fuzzy

答案 1 :(得分:15)

刚受到一击。我在项目的根目录中有locale/目录,但在INSTALLED_APPS目录中默认为Django looks for translations,在默认翻译中。所以它没有找到我添加的翻译。但是我的一些字符串是Django附带的默认翻译(例如“搜索”),因此翻译了一些字符串,这让我很困惑。

要将我的翻译所在的目录添加到Django寻找翻译的地方列表中,我必须设置LOCALE_PATHS setting。所以在我的情况下,locale/目录和settings.py都在django项目的根目录中,我可以将以下内容放在settings.py中:

from os import path
LOCALE_PATHS = (
    path.join(path.abspath(path.dirname(__file__)), 'locale'),
)

答案 2 :(得分:8)

可能的原因是Lazy Translation

例如,在views.py中,您应该使用 ugettext

from django.utils.translation import ugettext as _

但是在models.py中,你应该使用 ugettext_lazy

from django.utils.translation import ugettext_lazy as _

答案 3 :(得分:6)

您只需附上我过去必须做的一些修补程序:

  • 重新启动网络服务器!

在设置文件中 - 需要USE_I18N = True

    中间件模块中的
  • django.middleware.locale.LocaleMiddleware(但只要Django根本不关心你的本地,这不是你的情况)

  • TEMPLATE_CONTEXT_PROCESSORS中的django.core.context_processors.i18n

我确实有其他与翻译有关的问题,但我不记得所有这些...希望这可以帮助你!

答案 4 :(得分:5)

我的项目现在遇到了这个问题。我在settings.py上设置了变量LANGUAGES:

LANGUAGES = (
('en', _('English')),
('pt-br', _('Brazilian Portuguese')),
)

带有locale文件夹的文件夹结构,以及一个子文件夹pt-br。事实证明我的翻译没有加载。 LANGUAGES变量遵循pt-br模式,文件夹必须位于pt_BR模式上。至少这是它在这里工作的唯一方式!

答案 5 :(得分:5)

我正在尝试提供完整的检查清单:

  • settings.py中,USE_I18NUSE_L10NLANGUAGE_CODELOCALE_PATHS是否设置正确?

    • 有关语言标识符的所有允许值,请参阅this list。请注意,简体中文由zh-hans指定,而不是zh-cn
  • settings.py中,django.middleware.locale.LocaleMiddleware in correct order中是否包含MIDDLEWARE

  • 您是否(重新)使用正确的本地名称from the correct place运行django-admin makemessages -l <locale-name>

    • 您可以在计算机上运行ls your/path/to/python/site-packages/django/conf/locale/,或通过taking a look at the source code
    • 查看允许的区域设置名称的不完整列表
    • 请注意,您必须在此使用_而不是-例如,要指定简体中文,请执行django-admin makemessages -l zh_Hans,而不是{{1} }或zh_CNzh_hans或其他任何内容。
  • 您是否删除了PO文件中的所有zh-Hans代码?

  • 您是否已使用fuzzy(重新)编译了OP文件?

  • 您是否重新启动了网络服务器?

附加说明:

  • 如果您的某些翻译被Django的默认翻译覆盖,请使用contextual markers来绕过它。例如,
  

models.py

django-admin compilemessages
  

django.po

first_name = models.CharField(
    pgettext_lazy('override default', 'first name'),
    max_length=30
)

last_name = models.CharField(
    pgettext_lazy('override default', 'last name'),
    max_length=150
)

您将看到#: models.py:51 msgctxt "override default" msgid "first name" msgstr "姓" #: models.py:55 msgctxt "override default" msgid "last name" msgstr "名" 而不是默认姓氏

答案 6 :(得分:0)

另一个原因可能是错误的目录结构。

在运行 app 翻译的makemassages命令之前,请仔细阅读manage命令的错误消息,该消息指示要创建的目录。 (对于某个应用,它必须是locale不是 conf/locale。)请注意,即使目录结构错误,管理命令也能正常工作。

答案 7 :(得分:0)

我注意到,当我的文字中有%时,翻译后的文字没有被使用。可能有其他字符可能导致此问题。我通过将%转义为%%来解决问题。

答案 8 :(得分:0)

我的回答在这里,除了我在 DateField 中使用的 2 个 ModelForm 之外,我的所有翻译都有效。 原来我的 forms.py 中有一个小部件不能很好地处理翻译。

我暂时删除了它,所以我可以享受圣诞节 =D