【问题标题】:Django makemessages errors Unknown encoding "utf8"Django makemessages错误未知编码“utf8”
【发布时间】:2011-05-21 04:19:46
【问题描述】:

我安装了与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,但没有成功。

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

【问题讨论】:

  • 你尝试过按照它的建议做吗?
  • 是的,尝试这样做 xgettext --from-code=utf-8 但没有成功,因为它向我询问输入文件,但我无法想象女巫文件与此有关 =(谢谢
  • 阅读错误信息时,不要停在前几个字之后...
  • init.py 文件清晰!里面没有代码! =(对不起,但我是 python 新手。谢谢
  • 是的,Ignacio,你是对的,我迷路了,找到解决方案只是冷静下来阅读它=(,没想到Django代码会出错。解决方案在文件中视图里面的init.py,有utf8,我改成utf-8并解决了。最好的问候!

标签: python django gettext


【解决方案1】:

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

我的 virtualenv 在我的 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 中的文件。

所以我发现了在 makemessages 过程中忽略文件或文件夹的 -i 标志

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

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

希望对你有帮助

【讨论】:

  • ./manage.py makemessage -l fr -i my_env 为我工作,谢谢!
  • 成功了!谢谢!
  • 对我有用,即使它是带有“S”的“makemessages”。
  • @LéoChazMaltrait 确实,我在编写的代码中犯了一个错误,Davide Pizzolato 纠正了它(makemessage > makemessages)。谢谢他
  • 对 COMPILEMESSAGES 有任何帮助吗?我尝试排除没有运气,我想排除整个虚拟环境文件夹
【解决方案2】:

实际上是的,我已经在 makemessages 中遇到过类似的问题,因为在每个源文件的顶部我都写了“# coding: utf8”。即使它适用于源代码编译,我也不得不在每个文件中将“utf8”替换为“utf-8”。

如果您不习惯生成消息,请注意应用于格式化字符串的 gettext 函数,当有多个占位符时,您将需要字符串包含命名参数。 “%s”很好 “%(max)s”也不错 “%(min)s %(max)s”也是 “%s %s”不行。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      实际上,如果您在 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 文件夹中的.mo 文件

      所以,然后运行:

      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 文件中确保您确实添加/或编辑了网址格式。以下是它的外观示例:

      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/ url 工作。

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

      不要忘记在您的模板中...是的,所有这些,无论它是否是父模板都没有关系。您必须包含 {% load i18n %} 才能使其正常工作。

      重要提示: 当你回到你的模板文件并开始更新你的文本内容并添加你的 transblocks 等。在你这样做之后。回到你的终端并停止你的服务器,如果你的根目录中有你的 venv 文件夹,你必须运行这些命令:

      django-admin.py makemessages -l fr -i venv
      django-admin.py compilemessages
      

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

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

      我希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        最近,我遇到了同样的问题,我在网上找不到合适的解决方案。经过几次尝试,我解决了我的案例中的错误。在创建 trans 标记时,请确保对每个段落都执行此操作,不包括分段符。

        代替:

        <p>
         {% trans "
          Paragraph I
        
          Paragraph II
         " %}
        </p>
        

        这可能会解决错误:

        <p>
         {% trans "Paragraph I" %}
        </p>
        
        <p>
         {% trans "Paragraph II" %}
        </p>
        

        【讨论】:

          猜你喜欢
          • 2012-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多