Python Django i18n:翻译未出现的常见原因

Python Django i18n:翻译未出现的常见原因,python,django,translation,gettext,django-multilingual,Python,Django,Translation,Gettext,Django Multilingual,我正在制作一个多语言的Django网站。我创建了一个消息文件,填充并编译了它。我用我想要的语言(希伯来语)检查了网站(本例中是管理员),大多数短语都应该用希伯来语出现,但有些没有。我检查了源代码,它们仍然显示为。('Whatever'),就像它们应该显示的一样,它们也被翻译到消息文件中,是的,我记得做了编译消息 翻译不象这样出现的常见原因是什么?一个可能的原因是 例如,在views.py中,您应该使用ugettext: from django.utils.translation import u

我正在制作一个多语言的Django网站。我创建了一个消息文件,填充并编译了它。我用我想要的语言(希伯来语)检查了网站(本例中是管理员),大多数短语都应该用希伯来语出现,但有些没有。我检查了源代码,它们仍然显示为
。('Whatever')
,就像它们应该显示的一样,它们也被翻译到消息文件中,是的,我记得做了
编译消息

翻译不象这样出现的常见原因是什么?

一个可能的原因是

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

from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy as _
但是在models.py中,应该使用ugettext\u lazy

from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy as _

可能翻译后的字符串被标记为
fuzzy

嗨,请附上一些我过去必须做的修复:

  • 重新启动Web服务器
在设置文件中 -
需要使用_I18N=True

  • 中间件模块中的django.middleware.locale.LocaleMiddleware(但只要django根本不关心您的本地模块,就不一定是这样)

  • django.core.context_processors.i18n在模板_context_处理器之间


当然,我还有其他与翻译相关的问题,但我不记得所有的问题。。。希望这能有所帮助

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


在运行应用程序翻译的
makemassages
命令之前,请仔细阅读manage命令中有关要创建哪个目录的错误消息。(对于应用程序,它必须是
locale
,而不是
conf/locale
)请注意,即使目录结构错误,管理命令也可以正常工作。

我注意到,当我的文本中有
%
时,没有使用翻译文本。可能还有其他字符会导致此问题。我通过转义
%%
解决了这个问题,因为
%%

刚刚被一个问题击中。我在项目的根目录中有
locale/
目录,但默认情况下在
INSTALLED\u APPS
目录和默认翻译中。所以它没有找到我添加的翻译。但是我的一些字符串是Django附带的默认翻译(例如“搜索”),所以翻译了一些字符串,这让我很困惑

要将我的翻译所在的目录添加到Django将查找翻译的位置列表中,我必须设置。因此,在我的例子中,
locale/
目录和
settings.py
都位于django项目的根目录中,我可以将以下内容放入
settings.py

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

我现在的项目有这个问题。我将settings.py上的变量语言设置为:

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

和一个文件夹结构,其中包含一个区域设置文件夹和一个子文件夹pt br。结果是我的翻译没有加载。LANGUAGES变量遵循pt br模式,文件夹必须位于pt_br模式上。至少这是它在这里工作的唯一方式

我试图提供一份完整的检查清单:

  • settings.py
    中,是否正确设置了
    USE\u I18N
    USE\u L10N
    LANGUAGE\u code
    区域设置路径

    • 有关语言标识符的所有允许值,请参阅。请注意,简体中文由
      zh-hans
      指定,而不是
      zh-cn
      指定
  • settings.py
    中,是
    django.middleware.locale.localemidleware
    包含在
    middleware
    中吗

  • 您是否(重新)使用正确的本地名称运行了django admin makemessages-l

    • 通过在计算机上运行
      ls/path/to/python/site packages/django/conf/locale/
      ,或者
    • 请注意,您必须在此处使用
      而不是
      -
      例如,要指定简体中文,请执行
      django admin makemessages-l zh_Hans
      ,而不是
      zh_CN
      zh_Hans
      或任何其他命令
  • 您是否已删除采购订单文件中的所有
    模糊标记

  • 您是否使用django admin compilemessages重新编译了OP文件

  • 您重新启动web服务器了吗

补充说明:

  • 如果您的某些翻译被Django的默认翻译覆盖,请使用绕过它。比如说,
models.py

django.po


您将看到
而不是默认的
姓氏
名字

我的回答是,除了我在
模型中使用的2个
日期字段
外,我所有的翻译都有效。 原来我的
forms.py
中有一个小部件不能很好地处理翻译


我只是暂时把它删除了,这样我就可以享受圣诞节了,谢谢,但这似乎不是问题所在。我登录到shell,然后执行
ugettext(“我的表达式”)
,得到的是
“我的表达式”
,而不是翻译。(是的,我在执行此操作之前激活了另一种语言,并确认我可以使用此函数翻译其他字符串。)你在作弊,Ofri:)是的,这是错过翻译的原因之一,谢谢。我也花了一段时间才弄清楚。不使用任何标记为“模糊”的条目。它们将由翻译人员审查,直到验证(通过移除模糊标志)为止,不会显示。+1!就我而言,我只需要重新启动服务器。我使用的是nginx+gunicorn组合。重新启动gunicorn就足够了。感谢在这里使用pt br(使用Django==1.10.5),我也遇到了同样的问题。包含“-”(连字符)的语言代码的正确模式是“\u”exmaple:
pt\u BR
因此正确的命令是
python manage。