在Django中翻译动态内容

时间:2019-02-27 14:46:59

标签: django translation

我的文字既有静态部分又有动态部分。

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手动枚举django.po文件,以获取每个card_status的可能值。

但是,例如,这未被考虑

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

有人可以建议可以在此处使用的方法或黑客手段吗?我在堆栈中提到了许多类似的问题,但是不知何故我无法获得所需的解决方案。

希望有人可以一劳永逸地结束这个问题。

2 个答案:

答案 0 :(得分:0)

为将来可能需要它的人提供答案。

这不是我自己创建的解决方案,而是更多的理解。

首先我有这个

{% 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),而不是{{variable_name}}。通过将with标记与blocktrans和template trans过滤器一起使用来归档。上面显示的示例。

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

注3:确保在po文件中填充的各个值的msgstr部分已填充...

答案 1 :(得分:0)

Django提供了很多工具来本地化Python code和{{3}中的内容(主要通过gettextgettext_lazy,包括pluralization) }(通过标签transblocktransplural;甚至_()在模板中也可用)。

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

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

一种解决方法是,想象一下标志值对人类毫无意义–您将如何确保这些标志值在UI中有意义?确实:您将为其分配字符串标签,并显示这些字符串标签,而不显示任何神秘的状态值。

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