web-dev-qa-db-ja.com

djangoテンプレートの可変コンテンツを翻訳する

{%trans%}テンプレートタグを使用しています。 Djangoドキュメントは言う:

{%trans%}テンプレートタグは、定数文字列(一重引用符または二重引用符で囲まれている)または可変コンテンツのいずれかを変換します。

{%trans「これはタイトルです。」 %} {%trans myvar%}

https://docs.djangoproject.com/en/1.3/topics/i18n/internationalization/#trans-template-tag

Makemessagesコマンドを実行した後、myvarがDjango.poファイルに表示されないため、{%trans myvar%}を実行できないことがわかりました。

私はそれを間違って使用していますか?これを手伝ってくれる人はいますか?

34
thoslin

この場合、 blocktrans テンプレートタグを使用できます。

{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}
28
Jeff Wilcox

{% trans myvar %}が機能します。したがって、POファイルをチェックして、myvarの値がPO msgidにあることを確認してください。

<title>{% trans myvar %}</title>

たとえば、myvar"Some Publisher"が含まれている場合、POファイルに次のように書き込むことができます。

msgid "Some Publisher"
msgstr "কিছু প্রকাশক"

また、実行したことを確認してください:

python manage.py compilemessages
19
David Dehghan

Djangoはその変数の内容を推測できないため、英語(msgid)とローカライズされた(msgstr)文字列の両方を追加して、自分で翻訳する必要があります。

8
Gabi Purcaru

ここでの私の経験は、変数変換はそれ自体ではテンプレートで機能しないことです。ただし、変数の内容がわかっている場合は、適切な解決策を見つけました(つまり、変数はフリーテキストではなく、データベースで設定した一連の選択肢です)。

ビューまたはフィルタータグで翻訳を強制する必要があります。

総括する:

  1. テンプレートでblocktransを使用します
  2. 変数を強制的に変換する
    • トランスレーション用にすでにマークされているコンテキストで変数を設定するか
    • またはフィルターを使用して翻訳します
  3. .poファイルに翻訳を生成する

物語はこのようなものです:

views.py

def my_view(request):
    return render(request, 'i18n_test.html', {'salutation':"Hola"})

templates/i18n_test.html

...
{% blocktrans %}{{ salutation }}{% endblocktrans %}
...

また、テンプレートをレンダリングすると、現在の言語が常にHolaと表示されます。

翻訳を強制するには、ビューでugettextを使用する必要があります。

def my_view(request):
    return render(request, 'i18n_test.html', {'salutation':ugettext("Hola")})

ただし、ビューにアクセスできるとは限りません。だから私はこのようなフィルターを使うことを好む。

templatetags/i18n_extras.py

@register.filter(name='translate')
def translate(text):
  try:    
    return ugettext(text)

そしてテンプレートは

...
{% blocktrans s=salutation|translate %}{{ s }}{% endblocktrans %}
...

現在の言語に応じて、Hola、Hello、Ciao、Salutを生成します。

欠点( docs で指摘されている)は、makemessagesがこれらの翻訳を自動的に含めないため、手動で含める必要があることです。 Django.poファイル:

locales/en/Django.po

...
msgid "Hola"
msgstr "Hello"
...
5
kiril

変数は、pythonここでのようなコードでsettings.SITE_NAME

from Django.conf import settings
from Django.utils.translation import ugettext_lazy as _

def processor004(request):
 my_dict = {
    'site_id004': settings.SITE_ID,
    'site_name004': _(settings.SITE_NAME),
    'installed_apps004': settings.INSTALLED_APPS,
    'embedded_widget004': settings.EMBEDDED_WIDGET,
    'base_template004': settings.BASE_TEMPLATE,
}

return my_dict
1
K.Karamazen

これは複雑なエレガントなソリューションであり、モデルフィールドから値を変換する場合に役立ちます。 http://Django-modeltranslation.readthedocs.org

「モデル翻訳

Modeltranslationアプリケーションは、既存のDjangoモデルの動的コンテンツを、元のモデルクラスを変更せずに任意の数の言語に翻訳するために使用されます。 "

0
Kshatra

自分のタグを作る

from Django.utils.translation import ugettext as _

@register.simple_tag
def trans2(tr, *args, **kwargs):
    # print(':', kwargs)
    trans = _(tr)
    trans_str = trans.format(**kwargs)
    return trans_str

テンプレート内:

{% trans2 columns_once.res_data.message with value=columns_once.res_data.recommend%}

django.po

#: default_content.py:136
msgid "_audit_recommend_speed"
msgstr "Рекомендованная скорость до {value} сек"
0
Koshak01

私には、これはTEMPLATES.DIRS outside my Django project directory。テンプレートをプロジェクトディレクトリにフェッチすると問題が解決しました。

0
Philipp Zedler