Django makemessages errors未知编码"utf8"

Rod*_*ari 14 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.
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,最好的问候!

Que*_*tin 23

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

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

这是我的项目树:

DjangoDirectory:

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

当我启动命令时:

./manage.py makemessages -l fr 
Run Code Online (Sandbox Code Playgroud)

我犯了同样的错误 :

Error: errors happened while running xgettext on __init__.py
...
Run Code Online (Sandbox Code Playgroud)

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

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

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

./manage.py makemessages -l fr -i my_env
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助

  • ./manage.py makemessage -l fr -i my_env 为我工作,谢谢! (2认同)

Ste*_*e K 10

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

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


Eli*_*tis 9

实际上,如果您在 settings.py、视图和模板中正确完成了所有配置,并且安装了 gettext 并且一切正常,那么您可能需要检查您的虚拟环境在哪里。例如,如果它位于项目文件夹中的根文件夹内,我认为您的结构是 myapp_project/venv/

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

例如,如果您要翻译法语,请尝试像这样运行它:并注意:将 venv 替换为您为虚拟环境命名的任何名称。

这是简短的答案

django-admin.py makemessages -l fr -i venv
Run Code Online (Sandbox Code Playgroud)

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

那么,然后运行:

django-admin.py compilemessages
Run Code Online (Sandbox Code Playgroud)

现在你应该得到 django.po 文件。

这是很长的答案

如果您urls.py使用 i18n_patterns 正确配置了您的内容,并且您在 .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'),
]
Run Code Online (Sandbox Code Playgroud)

另外,settings.py请确保在中间件列表中添加该组件。'django.middleware.locale.LocaleMiddleware'当该组件从上到下执行时,将该组件放在列表中的哪个位置非常重要。所以把它放在sessions组件下。

对于您的主应用程序(您可能有几个或一个)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)
Run Code Online (Sandbox Code Playgroud)

您可以使用它,显然上面的路径不包括管理员。因此,只需尝试一下,只是让您了解/fr/url 应该是什么样子才能正常工作。

您还会注意到该行上方prefix_default_language=False这是为了防止 /en/ 默认模式。在此示例中,我们将从英语翻译为法语。所以模式中不需要有 /en/ 。

不要忘记在您的模板中...是的,所有这些,无论它是否是父模板都没关系。您必须包含{% load i18n %}此内容才能发挥作用。

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

django-admin.py makemessages -l fr -i venv
django-admin.py compilemessages
Run Code Online (Sandbox Code Playgroud)

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

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

我希望这有帮助。


Mu *_*ind 5

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

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

编辑:该问题现已在 Django 源代码中修复(截至 2011 年 5 月)。