10

Django Django はまだ Python 3 をサポートしていませんが、最終的にはサポートするので、コードを可能な限り「将来に備えた」状態に保ちたいと考えています。

Python 2.7 以降、文字列補間演算子 ( %) は非推奨になりました。そして、翻訳が必要なすべての文字列が%補間構文を使用していることに気付きました。そして、Djangoのドキュメントには、新しいstr.format方法(文字列フォーマットの「新しい」公式の方法)についての言及はありません...

ライブラリの制限があるのか​​もしれgettextませんが、文字列が .PO ファイルで同じように見えるので、私はそうは思いません。

問題は、新しい文字列formatメソッドを翻訳に使用できるかどうかです。

古い方法:

class Post(models.Model):
    title = models.CharField(max_length=50)
    date = models.DateField()
    # ...
    def __unicode__(self):
        return _('%(title)s (%(date)s)') % {
            'title': self.title,
            'date': self.date,
        }

「新しい」方法:

class Post(models.Model):
    title = models.CharField(max_length=50)
    date = models.DateField()
    # ...
    def __unicode__(self):
        return _('{title} ({date})').format(
            title=self.title,
            date=self.date,
        )

また、ugettext_lazy実際には文字列ではなくPromises、必要な場合にのみ評価されるオブジェクトを返します。

4

1 に答える 1

18

安心してご利用いただけました。例えば

ugettext_lazy('{foo}').format(foo='bar')

Django が使用する翻訳プログラムxgettextは、翻訳する内容を気にしません。または.pyなどのキーワードでファイルを検索して、翻訳可能な文字列を収集するだけです( xgettextおよびDjangoコードのマニュアルを参照)ugettext_lazy_

さらに、.format()上記のメソッドは、次のようなプロキシ オブジェクトによって提供されるラッパーです。

>>> ugettext_lazy(u'{foo}').format
<bound method __proxy__.__wrapper__ of <django.utils.functional.__proxy__ object at 0x102f19050>>

上記の呼び出しは、.format()何らかのu'{foo}'unicode に変換されてから、実際の引数でvalue呼び出されます。翻訳とさまざまな段階で起こるvalue.formatことがわかります。value.format

于 2012-06-12T16:53:34.737 に答える