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\' を削除すると、コードが壊れてしまいます。

文を 2 つの部分に分けた方がよいでしょうか。しかし、これは翻訳者が文の文脈を理解するのに苦労する可能性があります。

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

これに対するより良いアプローチはありますか?

4

2 に答える 2

10

位置文字列補間ではなく名前付き文字列補間を使用すると、翻訳者が翻訳文字列のパラメータの 1 つを忘れた場合の例外から保護されます。

django ドキュメントの例:

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

文字列置換で使用される {'name': 'value'} ペアの辞書に注意してください。

このため、複数のパラメータがある場合は常に、位置補間 (%s や %d など) の代わりに名前付き文字列補間 (%(day)s など) を使用する必要があります。位置補間を使用した場合、翻訳ではプレースホルダー テキストの順序を変更できません。

(ジャンゴのドキュメント)

于 2012-09-10T12:43:32.863 に答える
4

まず、実行時_(u"I am off to school at '%s' o'clock") % timeに の値が使用可能になる前に文字列が grep および変換されるため、である必要がtimeあります。

try...except第二に、コードを w/または使用してラップすることでコードを保護できます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 に答える