我在这里搜索了谷歌!但是没有成功找到解决方案,我真的是使用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,但也没有成功。
有人可以帮我解决一下吗? :(
谢谢,最诚挚的问候!
答案 0 :(得分:18)
我知道这篇文章已经过时但我今天遇到了同样的问题,我花了几个小时才发现原因。也许人们会遇到同样的情况:
我的virtualenv在我的django根目录中:
这是我的项目树:
DjangoDirectory:
当我启动命令时:
./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>