奇怪的django翻译行为

奇怪的django翻译行为,django,translation,gettext,Django,Translation,Gettext,我对django的翻译有奇怪的问题,我需要帮助解决。问题是,每次我似乎都随机得到翻译字符串或默认字符串,而不是得到翻译字符串 我创建了一个类,用于在多个页面上放置“操作”按钮。这些按钮中有很多是可重复使用的,那么我为什么要把 当我可以创建简单的工具栏并使用 工具栏。添加(工具) 在视图中,然后仅使用templatetag渲染所有工具。。。。无论如何 这是一个工具的示例: class NewUserGroupButton(MyTool): tool_id = 'new-user-grou

我对django的翻译有奇怪的问题,我需要帮助解决。问题是,每次我似乎都随机得到翻译字符串或默认字符串,而不是得到翻译字符串

我创建了一个类,用于在多个页面上放置“操作”按钮。这些按钮中有很多是可重复使用的,那么我为什么要把

当我可以创建简单的工具栏并使用

工具栏。添加(工具)

在视图中,然后仅使用templatetag渲染所有工具。。。。无论如何

这是一个工具的示例:

class NewUserGroupButton(MyTool):
    tool_id = 'new-user-group'
    button_label = ugettext(u'Create new user group')
    tool_href = 'new/'
    js = ()

    def render(self):
        s = '<a id="%(tool_id)s" href="%(tool_href)s" class="button blue">%(button_label)s</a>'
        return s % {'tool_id': self.tool_id, 'tool_href': self.tool_href, 'button_label':self.button_label}
class NewUserGroupButton(MyTool):
工具id='新用户组'
按钮\u label=ugettext(u‘创建新用户组’)
工具_href='new/'
js=()
def渲染(自):
s=“”
返回s%{'tool_id':self.tool_id,'tool_href':self.tool_href,'button_label':self.button_label}
工具的渲染方式如下所示:

class ToolbarTools:
    def __init__(self):
        self.tools = []

    def add(self, tool):
        self.tools.append(tool)

    def render(self):
        # Organize tools by weight
        self.tools.sort(key=lambda x: x.weight)

        # Render tools
        output = '<ul id="toolbar" class="clearfix">'

        for tool in self.tools:
            output += '<li id="%s">' % ('tool-'+ tool.tool_id)
            output += tool.render() if tool.renderable else ''
            output += '</li>'

        output += '</ul>'

        # Reset tools container
        self.tools = []

        return mark_safe(output)
类工具栏工具:
定义初始化(自):
self.tools=[]
def添加(自身、工具):
self.tools.append(工具)
def渲染(自):
#按重量组织工具
self.tools.sort(key=lambda x:x.weight)
#渲染工具
输出='
    ' 对于self.tools中的工具: 输出+='
  • '%(“工具-”+tool.tool\u id) 如果tool.renderable else为“”,则输出+=tool.render() 输出+='
  • ' 输出+='
' #重置工具容器 self.tools=[] 返回标记_安全(输出)
我用ugettext翻译字符串。使用(u)gettext=lambda s:s或ugettext_lazy,我要么没有对应于函数选择的翻译,要么没有对应于函数选择的代理对象

正如我所说的,虽然页面的其余部分使用的是正确的语言,但工具栏按钮似乎是随机翻译或不翻译的。如果我使用不同的“工具”在不同的页面之间移动,甚至多次刷新同一页面,那么错误行为仍然是一致的

有人能帮我找出导致此问题的原因和解决方法吗?

问题已解决

问题本身(随机翻译)可能是使用ugettext造成的。但同时我应该用ugettext_lazy来代替

因此,问题实际上来自ugettext\u延迟返回代理对象而不是转换的字符串。。。这是由以下原因造成的:

[引述] 使用惰性转换对象 在Python中使用unicode字符串(unicode类型的对象)的任何地方都可以使用ugettext_lazy()调用的结果。如果您尝试在需要bytestring(str对象)的地方使用它,事情将不会像预期的那样工作,因为ugettext_lazy()对象不知道如何将自己转换为bytestring。您也不能在bytestring中使用unicode字符串,因此这与正常的Python行为是一致的。例如:

This is fine: putting a unicode proxy into a unicode string.
u"Hello %s" % ugettext_lazy("people")
This will not work, since you cannot insert a unicode object
into a bytestring (nor can you insert our unicode proxy there)
"Hello %s" % ugettext_lazy("people")
[Quote]

摘自这里:

艾伦