【问题标题】:weird django translations behaviour奇怪的 Django 翻译行为
【发布时间】:2012-08-09 12:41:58
【问题描述】:

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

我创建了一个类,用于在多个页面上放置“动作”按钮。其中许多按钮都是可重复使用的,所以我为什么要放

<a href="something">blabla</a>

当我可以创建简单的工具栏并使用时,分成几个模板

toolbar.add(tool)

在视图中,然后只使用模板标签来渲染所有工具......无论如何。

这是一个工具的示例:

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 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)

我使用 ugettext 来翻译字符串。使用 (u)gettext=lambda s:s 或 ugettext_lazy 不会给我与函数选择相对应的翻译或代理对象。

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

有人可以帮我找出导致此问题的原因以及如何解决它吗?

【问题讨论】:

    标签: django translation gettext


    【解决方案1】:

    问题解决了。

    问题本身(随机翻译)可能是由使用 ugettext 引起的。但与此同时,我应该改用 ugettext_lazy 。

    因此问题确实来自 ugettext_lazy 返回的代理对象未翻译的字符串...这是由以下原因引起的:

    [报价] 使用惰性翻译对象 ugettext_lazy() 调用的结果可以在 Python 中使用 unicode 字符串(类型为 unicode 的对象)的任何地方使用。如果您尝试在需要字节串(str 对象)的地方使用它,事情将不会按预期工作,因为 ugettext_lazy() 对象不知道如何将自己转换为字节串。您也不能在字节字符串中使用 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")
    

    [/引用]

    取自这里: https://docs.djangoproject.com/en/dev/topics/i18n/translation/#working-with-lazy-translation-objects

    艾伦

    【讨论】:

      【解决方案2】:

      我刚才也遇到了同样的问题。问题是由不正确的中间件顺序引起的 - 我在 CommonMiddleware 之后设置了 LocaleMiddleware。在我将它放在 SessionMiddleware 和 CommonMiddleware 之间之后,它似乎可以正常工作。

      在此处查看更多信息:https://lokalise.com/blog/advanced-django-internationalization/

      我知道,这个问题很久以前就解决了,但它可能对某人有所帮助。

      【讨论】:

        猜你喜欢
        • 2015-05-14
        • 2016-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-14
        • 2012-10-16
        相关资源
        最近更新 更多