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
有更好的方法吗?
答案 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)。如果使用位置插值,则翻译将无法重新排序占位符文本。
答案 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)