2011-10-02 2 views
11

Djangoのドキュメントの状態: 計算された値のエントリをdjango国際化メッセージファイルに正しく追加するには?

以前 の2つの例のように、変数や計算済みの値を使う場合は、されていることは、Djangoの翻訳文字列検出ユーティリティ django-admin.py makemessagesの節では、ないでしょうこれらの文字列を見つけることができます。

私にとってはうまくいくので、翻訳された変数のすべての可能な値を手動で翻訳する準備は整っています。しかし、それを行う方法?

のは、私はこのような私のテンプレートコードを持っているとしましょう:

{% trans var %} 

VARは、データベースから抽出された、と私はそれの可能な値のすべてを知っている - のは、可能な値は「アリス」と言ってみましょうと "ボブ"。 django.poファイル内

msgid "Alice" 
msgstr "Alicja" 

:私は私が行うために必要なすべての考え

は、これらのようなエントリを提供しています。私はその後djangoadminのmakemessagesの節を実行するたびに残念ながら、これらのエントリはコメントアウトされています:私は間違って何をやっている

#~ msgid "Alice" 
#~ msgstr "Alicja" 

?計算された値を変換するという考えを誤解しましたか?

答えて

8

私たちは現在、この問題も解決しています。私たちはそれほど適切に行っていませんが、私たちはそれを回避するためには面倒な醜いハックを持っています。

単純に、コードのどこかにダミー関数を定義して(たとえば、models.pyやsettings.pyなど)、変換が必要なすべての文字列を入力します。

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

def dummy_for_makemessages(): 
    """ 
    This function allows manage makemessages to find the forecast types for translation. 
    Removing this code causes makemessages to comment out those PO entries, so don't do that 
    unless you find a better way to do this 
    """ 
    pgettext('forecast type', 'some string') 
    pgettext('forecast type', 'some other string') 
    pgettext('forecast type', 'yet another string') 
    pgettext('forecast type', 'etc') 
    pgettext('forecast type', 'etc again') 
    pgettext('forecast type', 'and again and again') 

この関数は呼び出されませんが、単純に定義することはmakemessagesの節ではコメントアウト取得からメッセージ文字列を防ぎありません。

最も洗練されたソリューションではありませんが、機能します。

+1

"正しい" "エレガント"で広く受け入れられている解決策はないようです。同情。あなたは私にとって最適なようです、ありがとう! –

+0

また、テンプレートを使用することもできます(アプリケーション内の任意の場所でそのテンプレートを使用する必要はありません)。例については、[this gist](https://gist.github.com/4298465)を参照してください。また、モデルオブジェクトの翻訳を扱う際に特別なパッケージを使用することもできます(管理サイトを使用して翻訳を編集することもできます)。私は要点へのコメントにいくつかのリンクを追加しました。 – aruseni

+0

これは文字列の場合にのみ良いと思います。文字列のように、外部の文字列のように、コードにはまったく表示されません。そうでない場合は、他の解決策があります。 (私の答えを見てください)。 –

1

これを行う良い方法が1つあります。 (私は同じコードで作業したので知っています)。

まず、この値はどこかで計算されます。だから、あなたのアクションで、あなたが持っている可能性があります

context['var'] = 'good' if condition(request) else 'bad' 

以降のテンプレートで:

{% if var == 'good' %} 
    {% trans "Congratulations, var equals: "} 
{% else %} 
    {% trans "Oops, var equals: "} 
{% endif %} 
{% trans var %} 

あなたはこのトリックを使用しない限り、あなたは...非現実的になることができ、異なる値を持つことがあります。

_ = lambda x: x 
context['var'] = _('good') if condition(request) else _('bad') 

ugettext_lazyなどと衝突したくない場合は、_をローカルにする必要があります。

この方法で、あなたはありませんね。

  • は、「リスト」あなたの翻訳された文字列
  • が台無し、とmanage.py makemessagesを放棄したために、いくつかのラメ「ダミー」冗長機能を使用して途中で
  • を翻訳します
0

私は@StFS答えで提案された同様の解決策でそれを解決しました。

私はpgettext('forecast type', 'some string')を使用した場合、その後、私のテンプレートで{% trans varName %}を使用すると、まだ「いくつかの文字列」ではなく、翻訳のための「新しいテキスト」のを返します。

私は関数内の構文をgettext('some string')に変更しました。

{% trans varName %}を使用すると、テンプレートに「新しいテキスト」が表示されます。

+0

これは質問に答えないと言うのはなぜですか?翻訳ファイルにコメントアウトしない文字列を追加することができます。私は何を逃したのですか? –

+0

これは、StFSの回答よりも、それ自身の答えよりも強調されています。それがStFSの答えに含まれていたのであれば、ここでそれを持っていたよりも良いでしょう。しかし、私は今私のコメントを削除し、あなたの答えを書式設定しています。 – rakhi4110