Djangoで現在の言語を取得するにはどうすればよいですか?


93

モデルの現在のスレッドまたは管理者で現在の言語を取得するにはどうすればよいですか?


5
具体的にご記入ください。「私のWebの言語」-Webリクエスト、Webサーバー、または何を意味しますか?
mikemaccana '10

回答:


139

特に興味深い関数はdjango.utils.translation.get_language()、現在のスレッドで使用されている言語を返す関数です。ドキュメントを参照してください。


2
警告:翻訳が一時的に非アクティブ化された場合(deactivate_all()によって、またはoverride()にNoneが渡された場合)はNoneを返します。Django 1.8より前のバージョンでは、翻訳が非アクティブ化されると、get_language()は常にLANGUAGE_CODEを返しました。
Pieter 2017年

89

または、ビューでこれを取得することもできます

request.LANGUAGE_CODE

6
私はこれに投票しました(何らかの理由で-1から)。次の点に注意してください(docs.djangoproject.com/en/dev/topics/i18n/deployment/…から"静的(ミドルウェアなし)の翻訳では、言語はsettings.LANGUAGE_CODEにありますが、動的(ミドルウェア)の翻訳では、 request.LANGUAGE_CODE。」
Alexander Marquardt

4
そのリンクは死んでいる、と私は文書化され受け入れられた溶液の上を使用していないため何の理由を見ていない:django.utils.translation.get_language()
qris

4
たとえばモデルで言語を取得しようとしても、まだリクエストがない場合は不可能です。私django.utils.translation.get_language()は常により良い解決策だと思います。
Hussam

テンプレートで現在の言語を取得するにはどうすればよいですか?
azmeuk 2016年

2
これはあなたのための役に立つかもしれない@azmeuk docs.djangoproject.com/en/dev/topics/i18n/translation/...
IgnasButėnas

37

言語を取得するために使用する方法に注意してください。どの方法を使用するかによって、Djangoはさまざまな方法と情報を使用して、使用する適切な言語を決定します。

django.utils.translation.get_language()関数を使用すると、スレッド言語にリンクされます。Django 1.8より前のバージョンではsettings.LANGUAGE_CODE、翻訳が無効になっていると常に戻りまし た。スレッド言語を手動でオーバーライドする場合は、override()またはactivate()関数を使用できます。これは、明示的に名前が付けられていませんが、まだ便利です。

from django.utils import translation

with translation.override('fr'):
    print(_("Hello")) # <= will be translated inside the with block

translation.activate('fr') # <= will change the language for the whole thread.
# You then have to manually "restore" the language with another activate()
translation.activate('en') # <= change languages manually

djangoがパスやリクエスト(言語Cookieなど)をチェックするようにしたい場合は、たとえばwww.example.com/en/<somepath>vsのようにwww.example.com/fr/<somepath>、より一般的django.utils.translation.get_language_from_request(request, check_path=False)です。また、常に有効な言語セットを返しますsettings.LANGUAGES

このテーマについてGoogleでこれらの違いを見つけるのは簡単ではないので、ここで参考にしてください。


django.utils.translation翻訳ではなくであることに注意してください。提供されたリンクにスペルミスがあります。スニペットでは正しいです。
J0ANMM 2017年

4
違いのため+1 django.utils.translation.get_language()django.utils.translation.get_language_from_request(request, check_path)。ビューでは、あなたが後者を使用する必要がある場合はcheck_path = True、あなたのテンプレートがでレンダリングされます言語を取得する。
オンドレイSkalicka

7

追加するだけで、使用するdjango.utils.translation.get_language()場合は、コードのそのセクションが非同期に呼び出される場合(たとえば、セロリタスクとして)、別のスレッドで実行されているため、このアプローチは機能しないことに注意してください。


2
ここでの明らかなアプローチは、タスクパラメータとして言語を渡し、translation.activate(language)で言語を設定することです
xyzman

1

あなたはこれを使うことができます

from django.utils import  translation
translation.get_language()

すでにmicha480で回答済み。あなたの答えは価値を追加しません。
Samuel Dauzon

0

システムのlocale言語情報を読むことができます。


5
あなたは-3にモデレートされていますが、質問は曖昧だと思います-「私のウェブの現在の言語」。これを推測するのはあなたの責任ではなく、OSです。
mikemaccana
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.