Django makemessages 错误 未知编码 "utf8
我安装了一个和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 个回答
其实,如果你在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文件中手动处理内容,这可不是什么好事。
希望这些对你有帮助。
其实是的,我之前也遇到过类似的问题,跟使用makemessages有关。因为在每个源文件的开头我都写了“# coding: utf8”。虽然这样在源代码编译时是可以工作的,但我还是不得不把每个文件里的“utf8”都改成“utf-8”。
如果你对makemessages不太熟悉,要注意在格式字符串中使用gettext函数时,字符串里需要包含命名参数,特别是当有多个占位符的时候。比如说:
- “%s”是可以的
- “%(max)s”也是可以的
- “%(min)s %(max)s”也可以
- 但“%s %s”就不行。
我知道这篇帖子有点过时,但我今天遇到了同样的问题,花了我好几个小时才搞明白原因。也许其他人也会遇到类似的情况:
我的虚拟环境放在了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
希望这能帮到你。