Django无法为djangojs制作消息

时间:2016-09-16 11:51:52

标签: django

目前我在尝试翻译Django的javascript文件时遇到此问题。我在urls.py中有url(r'^jsi18n/$', javascript_catalog, js_info_dict, name='javascript-catalog'),并在模板中获取该值。这似乎不是翻译的问题,当我运行django-admin.py makemessages命令时,它会抛出一些错误,我不知道为什么。

   $ django-admin.py makemessages -d djangojs -l nl_NL --keep-pot
    CommandError: errors happened while running msguniq
    /Users/../../src/locale/djangojs.pot:120: context separator <EOT> within string
    /Users/../../src/locale/djangojs.pot:121: context separator <EOT> within string
    msguniq: found 2 fatal errors

这是我在djangojs.pot文件

中找到的内容
#: static/jsi18n/djangojs.js:38 static/jsi18n/djangojs.js:46
#: static/jsi18n/nl/djangojs.js:84 static/jsi18n/nl/djangojs.js:92
msgid " "
msgid_plural ""
msgstr[0] ""
msgstr[1] ""

当我用空字符串删除这些行并再次运行命令时,它会在命令运行后再次添加它们。以前有人遇到过这个问题吗?

2 个答案:

答案 0 :(得分:0)

我通过从\x04文件中删除djangojs.js字符串来修复此问题,并在那里留下一个空字符串。这不是一个很好的解决方案,但它似乎对我有用。我在这张票https://code.djangoproject.com/ticket/17008中读到了一些关于这个问题的内容。好像它无法在javascript文件中逃避这一点。

./static/jsi18n/djangojs.js:90: warning: Empty msgid.  It is reserved by GNU gettext:
                                         gettext("") returns the header entry with
                                         meta information, not the empty string.

这是我得到的警告,但是现在这似乎解决了翻译问题。

答案 1 :(得分:0)

  

错误说明

在此情况下,它为所有受支持的语言和每种语言创建了 djangojs.js 文件,例如 static / js / i18n / nl_NL / djangojs.js 文件,这些文件中包含'\ x04'字符串

因此,当您运行此命令时

django-admin.py makemessages -d djangojs -l nl_NL

它将这些djangojs.js文件视为有效的源代码,用于为i18n提取其中的字符串,因此它将这些'\ x04'字符串并创建一个msgid在 .po 文件中创建该条目,然后在 .pot 文件中创建该条目

msgid "^D"
msgstr ""

^ D 是一个<EOT>字符,这就是django在出现以下错误时所说的话

djangojs.pot:120: context separator <EOT> within string

因此,无论哪里出现此错误,您的命令都将在此处退出而不完成。修复后,您需要重新运行此命令以完全执行它。

  

解决方案

您需要执行以下操作

  1. 无需更改任何 djangojs.js 文件
  2. 不考虑i18n的 djangojs.js 文件

因此,要解决此问题,您需要忽略这些文件,并且不考虑在i18n(国际化)中使用这些文件,只需在下面的makemessages命令中添加--ignore关键字

django-admin makemessages --locale=$bn --domain=djangojs --ignore=static/js/i18n/*

它将解决您的错误。 :)