繁体   English   中英

在 Django 中翻译动态内容

[英]Translating dynamic content in django

我有一个像这样既有静态部分又有动态部分的文本。

Custom message with %(card_status)s text inside

我正在确定翻译文本的最佳方法是什么。

这是我目前所拥有的

{% blocktrans with obj.card_status as card_status %}Custom message with {{ card_status }} text inside{% endblocktrans %}

如果我这样做,生成的消息是

msgid "Custom message with %(card_status)s text inside"
msgstr "This will be translated"

但是这种方法的问题在于,无论 card_status 变量是什么,翻译的文本都是一样的。

我尝试使用 msgid 为每个 card_status 的可能值手动枚举 django.po 文件。

但这没有被考虑,例如,

msgid "Custom message with ACTIVE text inside"
msgstr "This will be translated with ACTIVE text"

有人可以建议可以在这里使用的方法或技巧。 我提到的堆栈中有许多类似的问题,但不知何故我无法获得我需要的解决方案。

希望有人能一劳永逸地结束这个问题,让大家开心。

为将来可能需要此功能的人回答此问题。

这更像是一种理解,而不是我创建的解决方案。

首先我有这个

{% blocktrans with obj.card_status as card_status %}Custom message with {{ card_status }} text inside{% endblocktrans %}

问题:部分 card_status 被替换为动态值,但没有被翻译。

解决方案:因此,我将名为template_trans的模板过滤器应用于计算值“ card_status ”,该值向 django 标记该变量也需要翻译。 (将在下面添加该过滤器代码)

{% blocktrans with obj.card_status|template_trans as card_status %}Custom message with {{ card_status }} text inside{% endblocktrans %}

现在执行makemessages命令会像以前一样在po 文件中生成此文本

Custom message with %(card_status)s text inside

现在您需要手动将 card_status 可以采用的所有可能值添加到同一个po 文件中 就像在我的情况下,我添加了这些值

msgid "ACTIVE"
msgstr ""

msgid "INACTIVE"
msgstr ""

msgid "LOST"
msgstr ""

现在 template_trans 的代码在这里,添加它作为一个过滤器,你通常会有其他过滤器。

from django.utils.translation import ugettext
@register.filter(name='template_trans')
def template_trans(text):
    try:
        return ugettext(text)
    except Exception, e:
        return text

就是这样,django 现在为您做了两个翻译,一个是使用上面发布的第一个 msgid 的静态部分。 然后它根据实际值 ACTIVE 或 INACTIVE 等执行第二个操作,为您提供组合输出。

注意 1:翻译者应该在消息 id 中看到这个 %(variable_name)s 而不是 {{ variable_name }}。 这是通过使用 with 标记以及 blocktrans 和模板 trans 过滤器来归档的。 示例如上所示。

注意 2:您应该在 django.po 中填充 %(variable_name)s 的所有可能值。 如果不是,您将获得变量的值而不是翻译后的值。

注意 3:确保您在 po 文件中填充的各个值都填充了它们的 msgstr 部分...

Django提供了许多工具来本地化Python 代码(主要通过gettextgettext_lazy ,包括复数)和模板(通过标签transblocktransplural ;甚至_()在模板中可用)中的内容。

如果您发现 UI 中有未翻译的文本,则需要通过上述机制公开该文本,而不是手动修改 PO 文件。

因此,如果您有一些状态标志ACTIVEINACTIVE等,那么这显然是需要以某种方式公开的特定于语言的内容。

一种方法是想象标志值对人类毫无意义——你会怎么做才能确保它们在 UI 中有意义? 确切地说:您将为它们分配字符串标签,并且您将显示这些字符串标签而不是任何神秘的状态值。

现在您只需要通过gettext公开这些标签就可以了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM