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:
当我启动命令时:
./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)
希望它会有所帮助
Ste*_*e K 10
实际上是的,我已经在makemessages上遇到了类似的问题,因为在每个源文件的顶部我写了"#coding:utf8".即使它与源代码编译有关,我也不得不在每个文件中用"utf-8"替换"utf8".
如果您不习惯makemessages,请注意应用于格式字符串的gettext函数,当有多个占位符时,您需要包含命名参数的字符串."%s"是好的"%(max)s"也是好的"%(min)s%(max)s"太"%s%s"也不行.
实际上,如果您在 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 文件中手动执行操作。你不想那样做。
我希望这有帮助。
我在http://code.djangoproject.com/ticket/15980 上为此创建了一张票。
这似乎是 Django 代码中的一个简单的错字,问题在于 python 将“utf8”视为“utf-8”的别名,但 xgettext 没有。从 SVN 中的 Django r16169 (05/06/11 12:49:06) 开始,该问题仍然存在。
编辑:该问题现已在 Django 源代码中修复(截至 2011 年 5 月)。