我的文字既有静态部分又有动态部分。
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"
有人可以建议可以在此处使用的方法或黑客手段吗?我在堆栈中提到了许多类似的问题,但是不知何故我无法获得所需的解决方案。
希望有人可以一劳永逸地结束这个问题。
答案 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}中的内容(主要通过gettext
和gettext_lazy
,包括pluralization) }(通过标签trans
,blocktrans
和plural
;甚至_()
在模板中也可用)。
如果您发现UI中存在未翻译的文本,则需要通过上述机制来显示该文本,而不是手动修改PO文件。
因此,如果您有一些状态标志ACTIVE
,INACTIVE
等,那么显然这是特定于语言的内容,需要以某种方式公开。
一种解决方法是,想象一下标志值对人类毫无意义–您将如何确保这些标志值在UI中有意义?确实:您将为其分配字符串标签,并显示这些字符串标签,而不显示任何神秘的状态值。
现在,您只需要通过gettext
公开这些标签,就可以设置了。