9

私は Django 1.5.1 を使用していますが、翻訳で「奇妙な動作」が発生しています。同じ Python ファイルでugettextandを使用しています。ugettext_lazyインポートを次のように整理すると:

from django.utils.translation import ugettext as trans
from django.utils.translation import ugettext_lazy as _

また

from django.utils.translation import ugettext as trans, ugettext_lazy as _

としてマークされた文字列は、コマンドのtrans("string")実行時にスキップされますmakemessages

ただし、名前を変更しないugettextと、両方のバージョンでうまく機能します。

from django.utils.translation import ugettext
from django.utils.translation import ugettext_lazy as _

また

from django.utils.translation import ugettext, ugettext_lazy as _

trans("string")はうまくいきます。

では、このインポートの名前変更によって、名前が変更された関数が呼び出されない理由を知っている人はいますか? これは、同じモジュール内で複数の関数の名前を変更するときに知らなかった実際の Python の「制限」ですか?


アップデート

いくつかのテストの後、次のコードを使用してアプリ内に空の python モジュールを作成しても機能しないことがわかりました。

from django.utils.translation import ugettext_lazy as translate

a = translate("string")

ただし、_エイリアスに使用すると機能します。

from django.utils.translation import ugettext_lazy as _

a = _("string")

私の結論は次のとおりです。Django ではand (またはその他の関連する変換関数)のエイリアスのみを使用できます。そうしないと、 command_ugettextugettext_lazymakemessagesによって認識されません。技術的な説明は、Robert Lujo の回答にあります。

ありがとう!

4

4 に答える 4

28

Django コマンド ユーティリティの makemessages は、次のようにxgettextプログラムを内部的に呼び出します。

cmd = (
    'xgettext -d %s -L Python %s %s --keyword=gettext_noop '
    '--keyword=gettext_lazy --keyword=ngettext_lazy:1,2 '
    '--keyword=ugettext_noop --keyword=ugettext_lazy '
    '--keyword=ungettext_lazy:1,2 --keyword=pgettext:1c,2 '
    '--keyword=npgettext:1c,2,3 --keyword=pgettext_lazy:1c,2 '
    '--keyword=npgettext_lazy:1c,2,3 --from-code UTF-8 '
    '--add-comments=Translators -o - "%s"' %
    (domain, wrap, location, work_file))

(ソースはここにあります)。したがって、いくつかのキーワードはxgettextユーティリティによって事前定義されています (--keyword のリファレンスを確認してください)。

  • Python の場合 - gettext、ugettext、dgettext、ngettext、ungettext、dngettext、_

一部は django ユーティリティによって追加されます。

  • gettext_lazy 、 ngettext_lazy 、 ugettext_noop 、 ugettext_lazy 、 ungettext_lazy 、 pgettext 、 npgettext 、 pgettext_lazy 、 npgettext_lazy

キーワードtransは、これらのキーワード セットのいずれにも含まれていないため、翻訳対象のテキストをマークするために使用しないでください。

于 2013-05-12T18:00:13.353 に答える
8

予期しない ugettext エイリアスは、makemessages次のようにコマンドをオーバーライドすることで処理できます。

from django.core.management.commands import makemessages

class Command(makemessages.Command):
    """
    Extends the makemessages command to look for additional aliases.
    """
    xgettext_options = makemessages.Command.xgettext_options + ['--keyword=_lazy']

https://docs.djangoproject.com/en/1.8/topics/i18n/translation/#customizing-the-makemessages-commandを参照してください

于 2015-06-23T10:05:01.500 に答える
0

Django プロジェクトの多言語サポートに関するこれらのメモにより、何が問題なのかを特定できる場合があります。ほとんどの場合、名前の変更は失敗の根本的な原因ではありません。

これらのメモのいくつかの警告:

  • Web サイトの各テンプレートは、i18n タグ ライブラリをロードする必要があります。{% load %}

  • makemessages を実行する前にロケール ディレクトリを手動で作成する必要があります。

  • 言語ファイルは、使用する前にファイルにコンパイルする必要があり.moます-これも行いました

編集

私の投稿にリンクしたページでは、テンプレートで次の構文を使用しています。

{% trans "Hello" %}

それはあなたがすでに試したことですか?

于 2013-05-12T17:03:00.763 に答える