Django makemessages 错误 未知编码 "utf8

29 投票
6 回答
13345 浏览
提问于 2025-04-16 08:08

我安装了一个和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-8,但没成功。

有人能帮我解决这个问题吗?

6 个回答

9

其实,如果你在settings.py、视图和模板中都配置正确,并且安装了gettext等一切正常,那么你可能需要检查一下你的虚拟环境的位置。例如,如果它在你的项目根文件夹内,那么你的文件结构应该是myapp_project/venv/。

另外,我假设你在myapp_project根文件夹里创建了一个空的locale文件夹。

如果你是在翻译法语,可以尝试这样运行: 注意:把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文件。

这是详细的回答

如果你在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'),
]

另外,在settings.py的MIDDLEWARE列表中,确保你添加了组件'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)

你可以在这个基础上进行调整,显然上面的路径不包括admin。所以可以随意尝试,但我只是给你一个大概念,让/fr/这个URL能正常工作。

你还会注意到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文件中手动处理内容,这可不是什么好事。

希望这些对你有帮助。

13

其实是的,我之前也遇到过类似的问题,跟使用makemessages有关。因为在每个源文件的开头我都写了“# coding: utf8”。虽然这样在源代码编译时是可以工作的,但我还是不得不把每个文件里的“utf8”都改成“utf-8”。

如果你对makemessages不太熟悉,要注意在格式字符串中使用gettext函数时,字符串里需要包含命名参数,特别是当有多个占位符的时候。比如说:

  • “%s”是可以的
  • “%(max)s”也是可以的
  • “%(min)s %(max)s”也可以
  • 但“%s %s”就不行。
61

我知道这篇帖子有点过时,但我今天遇到了同样的问题,花了我好几个小时才搞明白原因。也许其他人也会遇到类似的情况:

我的虚拟环境放在了Django项目的根目录下:

这是我的项目结构:

Django目录:

  • 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里的文件。

所以我找到了一个-i参数,可以在生成消息的过程中忽略某些文件或文件夹。

现在,使用下面的命令就能顺利运行,不再出现错误了。

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

希望这能帮到你。

撰写回答