Django makemessages errors未知编码“utf8”

时间:2010-12-06 19:14:17

标签: python django gettext

我在这里搜索了谷歌!但是没有成功找到解决方案,我真的是使用python的noob但是能够安装与yum分开的python。

现在,我需要重新编译OSQA系统的语言包,但是得到这样的信息:

Error: errors happened while running xgettext on __init__.py
xgettext: ./Django-1.2.3/tests/regressiontests/views/__init__.py:1: Unknown encoding "utf8". Proceeding with ASCII instead.
xgettext: Non-ASCII string at ./Django-1.2.3/tests/regressiontests/views/__init__.py:7.
          Please specify the source encoding through --from-code or through a comment
          as specified in http://www.python.org/peps/pep-0263.html.

我试过,但没有成功解决它,在manage.py文件中将utf设置为utf-8,但也没有成功。

有人可以帮我解决一下吗? :(

谢谢,最诚挚的问候!

5 个答案:

答案 0 :(得分:18)

我知道这篇文章已经过时但我今天遇到了同样的问题,我花了几个小时才发现原因。也许人们会遇到同样的情况:

我的virtualenv在我的django根目录中:

这是我的项目树:

DjangoDirectory:

  • my_env
  • Django_App1
  • Django_App2
  • ...
  • ...
  • manage.py

当我启动命令时:

./manage.py makemessages -l fr 

我得到同样的错误:

Error: errors happened while running xgettext on __init__.py
...

事实上,我注意到xgettext查看了我文件夹中的所有文件以及my_env中的文件。

所以我在makemessages过程中找到了忽略文件或文件夹的-i标志

所以现在,使用下面的命令,它就像一个魅力,我不再得到错误了。

./manage.py makemessages -l fr -i my_env

希望它会有所帮助

答案 1 :(得分:10)

实际上是的,我已经遇到过与makemessages类似的问题,因为除了每个源文件之外,我写了“#coding:utf8”。即使它与源代码编译有关,我也不得不在每个文件中用“utf-8”替换“utf8”。

如果您不习惯makemessages,请注意应用于格式化字符串的gettext函数,当有多个占位符时,您需要包含命名参数的字符串。 “%s”很好 “%(max)s”也很好 “%(min)s%(max)s”也是 “%s%s”不行。

答案 2 :(得分:4)

我已在http://code.djangoproject.com/ticket/15980为此创建了一张票。

在Django代码中似乎是一个简单的拼写错误,问题是python将“utf8”视为“utf-8”的别名,但xgettext却没有。从SVN的Django r16169(05/06/11 12:49:06)仍然存在这个问题。

编辑:这个问题现已在Django来源中修复(截至2011年5月)。

答案 3 :(得分:2)

实际上,如果您在settings.py,视图和模板中正确地进行了所有配置,并且安装了gettext,并且一切都很好,那么您可能要检查虚拟环境的位置。例如,如果它位于项目文件夹中的根文件夹中,则我的结构应该是myapp_project / venv /

我还假设您已经在根myapp_project文件夹中创建了一个名为locale的空文件夹。

例如,如果要翻译法语,请尝试这样运行: 和 note:用您命名的虚拟环境替换venv。

这是简短的答案

django-admin.py makemessages -l fr -i venv

以上内容将为您提供local/fr/LC_MESSAGES/django.po,但现在您必须运行第二条命令来将makemessages创建的.po文件编译为.mo中的LC_MESSAGES文件文件夹

因此,然后运行:

django-admin.py compilemessages

现在这应该为您获取django.po文件。

这是很长的答案

如果您使用i18n_patterns正确配置了urls.py,并在.po文件中填充了msgstr ""的翻译,然后再次运行django-admin.py compilemessages,则现在可以运行服务器并转到您所需的页面127.0.0.1:8000/fr/,您应该会看到您的翻译。

如果您想知道settings.py文件的外观(法语)。它至少应该看起来像这样。

from django.utils.translation import gettext_lazy as _

LANGUAGES = [
   ('fr', _('French')),
   ('en', _('English')),
]

LANGUAGE_CODE = 'en-us'


TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

LOCALE_PATHS = [
    os.path.join(BASE_DIR, 'locale'),
]

还要在MIDDLEWARE列表的settings.py中,确保添加了组件。 'django.middleware.locale.LocaleMiddleware',将组件从上到下执行在列表中的何处很重要。因此,将其放在会话组件下。

对于您的主应用程序(可能有几个或一个)urls.py文件,请确保导入from django.conf.urls.i18n import i18n_patterns

接下来,在同一urls.py文件上,请确保已正确添加/或编辑url模式。这是一个看起来像的例子:

urlpatterns += i18n_patterns (
    path('', include('pages.urls')),
    path('meals/', include('meals.urls')),
    prefix_default_language=False
 ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

您可以使用它,并且显然在其上方的路径中不包含管理员。因此,您可以试玩一下,只是让您了解如何使/fr/网址正常工作。

您还将注意到在prefix_default_language=False行上方,这是为了防止使用/ en /默认模式。在此示例中,我们将英语翻译为法语。因此,无需在模式中包含/ en/。

不要忘记您的模板...是的,所有模板,是否是父模板都没有关系。您必须包含{% load i18n %}才能使此工作正常。

重要提示: 回到模板文件后,您便开始更新文本内容并添加跨块等。执行此操作之后。返回终端并停止服务器,如果根目录中有venv文件夹,则必须再次运行以下命令:

django-admin.py makemessages -l fr -i venv
django-admin.py compilemessages

现在,您可以打开django.po文件,并将翻译添加到模板中已编辑的文本内容中。如果您的venv文件夹不在您的根文件夹中。您可以改为运行django-admin.py makemessages -l fr

如果不执行此操作,最终将在.po文件中手动执行操作。你不想那样做。

我希望这会有所帮助。

答案 4 :(得分:0)

最近,我遇到了同样的问题,我在网上找不到合适的解决方案。经过几次尝试,我解决了我的案例中的错误。创建 trans 标记时,请确保对除分段符之外的每个段落都执行此操作。

代替:

<p>
 {% trans "
  Paragraph I

  Paragraph II
 " %}
</p>

这可能会解决错误:

<p>
 {% trans "Paragraph I" %}
</p>

<p>
 {% trans "Paragraph II" %}
</p>