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

Ram*_*hum 20 python django translation gettext django-multilingual

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

翻译的一些常见原因是什么?

Ofr*_*viv 27

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

  • 这也花了我一段时间。不使用任何标记为“模糊”的条目。打算由翻译检查它们,直到不显示已验证(通过除去模糊标志)为止。 (2认同)

Ham*_*ner 19

刚受到一击.我locale/在项目的根目录中有目录,但默认情况下,Django会INSTALLED_APPS目录和默认翻译中查找翻译.所以它没有找到我添加的翻译.但是我的一些字符串是Django附带的默认翻译(例如"搜索"),因此翻译了一些字符串,这让我很困惑.

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

from os import path
LOCALE_PATHS = (
    path.join(path.abspath(path.dirname(__file__)), 'locale'),
)
Run Code Online (Sandbox Code Playgroud)

  • 现在看起来像:`LOCALE_PATHS = ((BASE_DIR / 'locale'), )` (2认同)

Dav*_*cos 8

可能的原因是懒惰翻译.

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

from django.utils.translation import ugettext as _
Run Code Online (Sandbox Code Playgroud)

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

from django.utils.translation import ugettext_lazy as _
Run Code Online (Sandbox Code Playgroud)


Tom*_*gli 8

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

  • 重启网络服务器!

在设置文件中 - USE_I18N = True是必需的

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

  • TEMPLATE_CONTEXT_PROCESSORS中的django.core.context_processors.i18n

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

  • +1!在我的情况下,我只需要重新启动服务器.我正在使用nginx + gunicorn组合.重新启动gunicorn就足够了.谢谢 (2认同)

nal*_*zok 8

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

  • settings.py,在USE_I18NUSE_L10NLANGUAGE_CODE,和LOCALE_PATHS设置正确吗?

    • 有关语言标识符的所有允许值,请参见此列表。请注意,简体中文是由zh-hans而不是指定的zh-cn
  • 在中settings.py以正确的顺序django.middleware.locale.LocaleMiddleware包含吗?MIDDLEWARE

  • 您是否从正确的地方django-admin makemessages -l <locale-name>使用正确的本地名称运行?

    • 您可以通过在计算机上运行或查看源代码来查看允许的语言环境名称的不完整列表ls your/path/to/python/site-packages/django/conf/locale/
    • 请注意,您必须使用_而不是-这里。例如,要指定简体中文,请执行django-admin makemessages -l zh_Hans,而不是zh_CNzh_hanszh-Hans或其他任何内容。
  • 您是否删除了fuzzyPO文件中的所有标签?

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

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

附加条款:

  • 如果您的某些翻译被Django的默认翻译覆盖,请使用上下文标记绕过它。例如,

models.py

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
)
Run Code Online (Sandbox Code Playgroud)

django.po

#: models.py:51
msgctxt "override default"
msgid "first name"
msgstr "?"

#: models.py:55
msgctxt "override default"
msgid "last name"
msgstr "?"
Run Code Online (Sandbox Code Playgroud)

你会看到??而不是默认的????


小智 6

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

LANGUAGES = (
('en', _('English')),
('pt-br', _('Brazilian Portuguese')),
)
Run Code Online (Sandbox Code Playgroud)

以及带有语言环境文件夹和内部子文件夹pt-br的文件夹结构。原来我的翻译没有加载。LANGUAGES变量遵循pt-br模式,并且文件夹必须位于pt_BR模式。至少那是它在这里工作的唯一方式!

  • 我有同样的问题。包含'-'(连字符)的语言代码的正确模式是'&lt;code_prefix&gt; _ &lt;CAPITAL_SUFFIX&gt;'例如:`pt_BR`因此正确的命令是`python manage.py makemessages -l = pt_BR` (2认同)