【问题标题】:Problems with GAE + django 1.2GAE + django 1.2 的问题
【发布时间】:2011-03-02 13:38:18
【问题描述】:

我升级到 django 1.2,现在我收到这个看起来与 i18n 相关的错误消息。你能告诉我该怎么做吗?谢谢

global name '_' is not defined
Traceback (most recent call last):
  File "/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 515, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/classifiedsmarket/blobstore.348713784647505124/i18n.py", line 252, in get
    loginmsg = loginmsg + '<a href=\"%s\">%s</a>' % ('login',_("Log in"))
NameError: global name '_' is not defined

在添加新的导入语句后更新代码的样子

   # let user choose authenticator        
        for p in openIdProviders:
            p_name = p.split('.')[0] # take "AOL" from "AOL.com"
            p_url = p.lower()        # "AOL.com" -> "aol.com"
            loginmsg = loginmsg + '<a href="%s">%s</a> ' % ( #'','')
             #      users.create_login_url(federated_identity=p_url), p_name)
                    'google.com', p_name)
        loginmsg = loginmsg + '<a href=\"%s\">%s</a>' % ('login',_("Log in"))

在模板中

    <ul><li><a href="ai">{% trans "Add" %}</a></li>
    <li><a href="li">{{ latest.modified|date:"d M" }}</a></li>                  
<li>{% if user %}<a href="{{ user_url|fix_ampersands }}">{% trans "Log out" %}</a>
{% else %}{% trans "Log in" %}{{loginmsg}}{% endif %}</li>
</ul>

在视图中引导垃圾,就像此处的图像一样,预期输出是链接和按钮。你能多介绍一点吗?谢谢

现在检查了 HTML,它似乎与 escpae 编码有关。你能告诉我吗?

<ul><li><a href="ai">Add</a></li><li><a href="li">03 Mar</a></li>                   

<li>Log in&lt;a href=&quot;google.com&quot;&gt;Google&lt;/a&gt; &lt;a href=&quot;google.com&quot;&gt;Yahoo&lt;/a&gt; &lt;a href=&quot;google.com&quot;&gt;MySpace&lt;/a&gt; &lt;a href=&quot;google.com&quot;&gt;AOL&lt;/a&gt; &lt;a href=&quot;login&quot;&gt;Log in&lt;/a&gt;</li>

</ul>

【问题讨论】:

    标签: python html django google-app-engine escaping


    【解决方案1】:

    Old Django 1.0 manual 找到这个(我认为 App Engine 的默认版本是 0.98)。

    答案如下:

    标准翻译:

    Python 的标准库 gettext 模块将 _() 作为 gettext() 的别名安装到全局命名空间中。在 Django 中,我们选择不遵循这种做法,原因如下:

    对于国际字符集 (Unicode) 支持,ugettext() 比 gettext() 更有用。有时,您应该使用 ugettext_lazy() 作为特定文件的默认翻译方法。如果全局命名空间中没有 _(),开发者必须考虑哪个是最合适的翻译函数。

    下划线字符 (_) 用于表示 Python 的交互式 shell 和 doctest 测试中的“上一个结果”。安装全局 _() 函数会导致干扰。将 ugettext() 显式导入为 _() 可以避免这个问题。

    这就是为什么旧的可以工作的原因,同时在 Django 1.2 中你需要指定:

    from django.utils.translation import gettext_lazy as _
    

    按照 Niklas R 的建议。

    【讨论】:

    • 谢谢丹尼尔。我更改为上面的导入语句,但它仍然无法正常工作。我用更多信息更新了问题,希望您能提供建议。
    【解决方案2】:

    你好像不见了

    from django.utils.translation import gettext_lazy as _
    

    但我不知道为什么它在以前的版本中有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-30
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      相关资源
      最近更新 更多