web-dev-qa-db-ja.com

Django管理ページの国際化-モデル名と属性を翻訳する

Djangoの国際化は非常に優れています(gettextベース、LocaleMiddleware)が、管理ページのモデル名と属性を変換する適切な方法は何ですか?ドキュメントでこれについて何も見つかりませんでした:

「Выберитеorderдляизменения」の代わりに「Выберитезаказдляизменения」をお願いします。 'order'は翻訳されないことに注意してください。

まず、モデルを定義し、settings.pyでUSE_I18N = Trueをアクティブにして、Django-admin makemessages -l ruを実行しました。モデル名と属性のエントリはデフォルトでは作成されません。

私が見つけたDjangoソースコードをgrepしている:

$ ack "Select %s to change"
contrib/admin/views/main.py
70:        self.title = (self.is_popup and ugettext('Select %s') % force_unicode(self.opts.verbose_name) or ugettext('Select %s to change') % force_unicode(self.opts.verbose_name))

したがって、verbose_nameメタプロパティはここで何らかの役割を果たしているようです。それを使用しようとしました:

class Order(models.Model):
    subject = models.CharField(max_length=150)
    description = models.TextField()
    class Meta:
        verbose_name = _('order')

これで、更新されたpoファイルに翻訳可能なmsgid 'order'が含まれます。だから私は翻訳を入れました。残念ながら、管理ページを実行すると、「Выберитеorderдляизменения」の同じ組み合わせが表示されます。

私は現在Django1.1.1を使用しています。誰かが私に関連するドキュメントを教えてもらえますか?グーグルはできないので。 ;-)それまでの間、Djangoソースコードについて詳しく説明します。

27
geekQ

Djangoドキュメントに記載されていない重要なこと:

  • _Django-admin compilemessages_を実行します。例:ビルドプロセスの一部として。 stevejalimに感謝します!
  • djangoのugettext_lazy()をモデル名に適用します(Metaクラスと_verbose_name_)
  • 属性(モデルフィールド_verbose_name_)の名前は、ugettext_lazy()で変換することもできます。
  • モデルメタデータで遅延変換を使用します。そうしないと、モデルクラスの読み込み中に変換が行われ、ユーザーの設定、特にブラウザの設定が考慮されません。
  • 属性名にいくつかのスコープを使用します。モデル名と属性名をパイプで区切ります。同じ規則がRuby-gettextでも使用されています。背景:「title」や「name」などの属性名は、コンテキストに応じてほとんどの言語で異なる方法で翻訳されます。ドイツ語の「Book | title」->「Titel」または「Buchtitel」の例。ただし、「Chapter | title」は「Überschrift」と翻訳されます。

上記の原則を使用した例:

_from Django.utils.translation import ugettext_lazy as _
class Order(models.Model):
    subject = models.CharField(max_length=150, verbose_name = _('Order|subject'))
    description = models.TextField(            verbose_name = _('Order|description'))
    class Meta:
        verbose_name = _('order')
        verbose_name_plural = _('orders')
_

または、モデルと管理ページを翻訳するためのより良い方法はありますか?

いずれにせよ、Djangoドキュメントを強化し、ギャップを埋める必要があります!

38
geekQ