在Django中翻译动态内容

5

我有一段文本,其中包含静态和动态部分,如下所示。

自定义消息,其中包含%(card_status)s文本

我不确定最佳的翻译方法是什么。

这是我目前拥有的内容,

{% 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变量是什么,翻译后的文本都一样。

我尝试手动枚举django.po文件中每个可能的card_status值对应的msgid。

但这并没有被考虑进去,例如:

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

有人能提供一种方法或技巧来解决这个问题吗?我参考了堆栈中许多类似的问题,但不知何故我无法得到所需的解决方案。

希望有人能为大家的快乐一劳永逸地结束这个问题。


相关链接:https://stackoverflow.com/q/7976495 - undefined
2个回答

4
回答此问题是为了方便未来有需求的人们。
这更多是理解而不是我创建的解决方案。
首先,我有这个:
{% 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 ""

现在模板转换的代码在这里,将其作为过滤器添加到您通常拥有其他过滤器的位置。

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和template trans过滤器来实现。如上所示的示例。

注意2:您应该在django.po中填写%(variable_name)s的所有可能值。如果没有这样做,您将得到变量的值,而不是经过翻译的值。

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


1
如果您有需要翻译的内容,您需要在Django中公开该内容以进行翻译,而不是手动输入或通过脚本输入到po文件中——除了比必要的工作更多之外,这将是一个维护噩梦。 - Endre Both

0

Django 提供了大量工具来本地化内容,既可以在Python代码中使用(主要是通过 gettext gettext_lazy 实现,包括复数化),也可以在模板中使用(通过标签 trans blocktrans plural ;甚至在模板中也可以使用_())。

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

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

一种处理这个问题的方法是想象标志值对人类而言毫无意义 - 那么你会做什么来确保它们在用户界面上有意义呢?没错:你会为它们分配字符串标签,并显示这些字符串标签,而不是任何神秘的状态值。
现在,您只需要通过gettext公开这些标签即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接