6
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

有更好的方法吗?

4

2 回答 2

10

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

来自 django 文档的示例:

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

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

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

(django 文档)

于 2012-09-10T12:43:32.863 回答
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)
于 2012-09-10T13:40:31.260 回答