ugettext:如何处理句子中的变量?

时间:2012-09-10 12:12:58

标签: django

from django.utils.translation import ugettext_lazy as _

_(u"I am off to school at '%s' o'clock" % time)

这有点奇怪,因为我会像这样翻译一整行

"I am off to school at \'%s\' o'clock"

现在,如果翻译错误地删除了''%s \',它会破坏代码。

我应该把句子分成两部分吗?但这可能会让翻译人员无法理解句子的背景。

_(u"I am off to school at ") + '%s' + _(u"o'clock") % time

有更好的方法吗?

2 个答案:

答案 0 :(得分:9)

如果使用命名字符串插值而不是位置字符串插值,如果翻译器从其翻译的字符串中忘记了其中一个参数,这可以保护您免受异常。

django docs的一个例子:

def my_view(request, m, d):
    output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}
    return HttpResponse(output)

请注意字符串替换中使用的{'name':'value'}字典。

  

因此,只要有多个参数,就应该使用命名字符串插值(例如,%(天)s)而不是位置插值(例如%s或%d)。如果使用位置插值,则翻译将无法重新排序占位符文本。

(django docs)

答案 1 :(得分:4)

首先,它应该是_(u"I am off to school at '%s' o'clock") % time,因为字符串是grep并在time的值在运行时可用之前被翻译。

其次,您可以使用try...except或使用string.Template.safe_substitute包装来保护您的代码:

from string import Template 

# for ugettext
Template(ugettext(u"I am off to school at '$time' o'clock")).safe_substitute(time=time)

# for ugettext_lazy
from django.utils.encodings import force_unicode
Template(force_unicode(ugettext_lazy(u"I am off to school at '$time' o'clock"))).safe_substitute(time=time)

# shortcut
def safe_trans(msg, **kwargs):
    return Template(force_unicode(msg)).safe_substitute(kwargs)
safe_trans(_("I am off to school at '$time' o'clock"), time=12)