Python 升级到Django 1.7:为翻译基础架构做好准备

Python 升级到Django 1.7:为翻译基础架构做好准备,python,django,gettext,django-1.7,Python,Django,Gettext,Django 1.7,我正在从Django 1.6升级到1.7,当我尝试执行manage.py runserver时,我得到以下跟踪: Traceback (most recent call last): File "manage.py", line 9, in <module> execute_from_command_line(sys.argv) File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packag

我正在从Django 1.6升级到1.7,当我尝试执行
manage.py runserver
时,我得到以下跟踪:

Traceback (most recent call last):
  File "manage.py", line 9, in <module>
    execute_from_command_line(sys.argv)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 354, in execute
    django.setup()
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/__init__.py", line 21, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/apps/config.py", line 87, in create
    module = import_module(entry)
  File "/usr/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
  File "/home/ben/Code/Repos/myrepo/myproject/core/mail/__init__.py", line 6, in <module>
    from myproject.core.mail.models import IMapEmailMessage, EmailStatus
  File "/home/ben/Code/Repos/myrepo/myproject/core/mail/models.py", line 20, in <module>
    from myproject.core.mail.utils import render_templates
  File "/home/ben/Code/Repos/myrepo/myproject/core/mail/utils.py", line 19, in <module>
    from myproject.core.util import clean_html
  File "/home/ben/Code/Repos/myrepo/myproject/core/util.py", line 1031, in <module>
    def make_url(url, text=_('here')):
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/__init__.py", line 83, in ugettext
    return _trans.ugettext(message)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 325, in ugettext
    return do_translate(message, 'ugettext')
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 306, in do_translate
    _default = translation(settings.LANGUAGE_CODE)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 209, in translation
    default_translation = _fetch(settings.LANGUAGE_CODE)
  File "/home/ben/.virtualenvs/myproject/local/lib/python2.7/site-packages/django/utils/translation/trans_real.py", line 189, in _fetch
    "The translation infrastructure cannot be initialized before the "
django.core.exceptions.AppRegistryNotReady: The translation infrastructure cannot be initialized before the apps registry is ready. Check that you don't make non-lazy gettext calls at import time.
然而,我已经有了这些台词。在文件
myproject/core/util.py
中,我更改了以下行:

from django.utils.translation import ugettext as _
致:


这就把问题转移到了另一个使用
ugettext
的文件中。是否不再可以使用非惰性
ugettext
?或者我需要做一些设置来避免在导入时对其求值?

使用
make\u url(url,text=ugettext('here'))
的问题是
text
的默认参数是在导入模块时求值的,而不是在
make\u url
函数运行时求值的

您还没有显示生成第二个错误的代码,所以我不知道它出了什么问题

可以在函数内部使用
ugettext
(只要该函数在导入期间不运行)。例如:

def make_url(url, text=None):
    if text is None:
        text = ugettext('here')

请注意,您仍然可以在代码中使用
导入uggettext作为
,我刚才使用了上面的
ugettext
来明确说明。

这不是答案!!为什么不想使用上一个版本?1.9我正在以增量方式升级到1.8,但试图先让1.7正常工作。我认为跟踪的最后一行很重要,“检查您在导入时没有进行非惰性gettext调用”。因此,是的,在导入时您需要惰性版本库!就这样。我只需要将
ugettext
更改为
ugettext\u lazy
,无论我在哪里遇到错误。幸运的是只有2例;大部分
ugettext
都像以前一样工作。
from django.utils.translation import ugettext_lazy as _
def make_url(url, text=None):
    if text is None:
        text = ugettext('here')