私はDjangoによって実行されている、かなりシンプルな情報ウェブサイトを持っています。ビューに正しい値が指定されていないUgettext(古い言語値をキャッシュしています)
def index(request):
return render_to_response(**create_render_args('Index.html', request))
def somepage(request):
return render_to_response(**create_render_args('Somepage.html', request, _(u'Some page title'), 'somepage.css'))
# other pages are also rendered in that way
create_render_args機能は次のとおりです:
def create_render_args(html, request, title = _(u'Default title'), page_css = ''):
return {
'template_name' : html,
'dictionary' :
{
'title' : title,
'page_css' : '' if page_css == '' else '<link rel="stylesheet" href="/css/{}" />'.format(page_css),
# other template variables...
},
'context_instance' : RequestContext(request)
}
Essentialyそれは私が避けるために使用する簡単な方法です
そのページ(ビュー)は、このように使用されるrender_to_responseショートカットによってレンダリングされています余分なコードブロックを作成することなく、サイトが翻訳される言語ごとにユニークなCSSとローカライズされたページタイトルを指定できるようになります(ローカライズされて4になります)。おそらくこれを行う良い方法がありますが、私はこの問題に関して私のDjangoの経験はまだ限られていることを認めなければなりません。私は客観的な批判を聞きたいと思います。
問題は、私は_
としてugettext使用しており、私は/スイッチの言語/リロードページを移動するとき、テンプレートで使用されている、時には「タイトル」変数はたとえ古い言葉で「立ち往生」されることを思われることですページ自体はすでに新しい言語に翻訳されています。
例えば、サイトがイタリア語であれば、私はメインページを開き、タイトルは適切です。 それから、私は英語に切り替えます(言語スイッチを扱う私のjavascriptがページをリロードします)。他のものはすべて英語ですが、タイトルはまだイタリア語です。私は別のページに移動し、再びメインページに移動し、ページを数回リロードします。タイトルはイタリア語、ページは英語です。私はサーバーコンソールに行き、wsgiファイルに触れる(手動でDjangoをリロードする) - メインページは次のリロード時に完全に英語である。しかし、その後、私は言語をイタリア語に再度切り替えます。ページはイタリア語で、タイトルは英語です。
時には動作がさらに奇数になる— F5キーを押してページをリロードし続けると、前の言語のタイトルが2回連続して表示され、正しいタイトルが一度だけ表示され、次のリロードで「古い」タイトルを取得します。
ugettext_lazyを_
とすると、私は全く問題ありません。です。タイトルは常に他のページと同じ言語です。
私が知る限り、各ページビューでビューが呼び出されているので、私は遭遇するものと信じています。create_render_args()
の各ページの出力はどこかにキャッシュされ、常に同じ辞書を返します。可能。
この問題の原因は何ですか?私は何が欠けていますか?
「ugettext_lazy」はそれを解決していますが、私は元々の問題の原因を知りました。 AFAIK、ugettext_lazy'は、新しいページビューごとに実行されることを意図していないコードで使用する必要があります(ビューの怠惰なバージョンのugettextを使用すると、私にとって奇妙な解決策であると感じるため)。私は今、デフォルトの引数評価の問題を見ると思います。ありがとうございました! – havelock