I18nを使用して別の言語でテンプレートをレンダリングしようとしています。言語コードの設定、テンプレート内の翻訳タグを含む翻訳ファイルの作成とコンパイルなど、私が読むことができるすべてのことを行いましたが、{{LANGUAGE_CODE}}変数が指すようにしても、テンプレートは英語でレンダリングされますレンダリングするつもりだった正しい(そして異なる)コード。何が欠けていますか?
テンプレート:
{% extends "base.html" %}
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}
{% block title %}{% trans "translation test" %}{% endblock %}
{% block content %}
<div id="some-text">
{% trans "some translated text goes here" %}
{% blocktrans %}
<ol>
<li>here are some</li>
<li>items that should be</li>
<li>translated as well</li>
</ol>
{% endblocktrans %}
<ul>
<li>The current language is <b>{{ LANGUAGE_CODE }}</b></li>
{% if LANGUAGE_BIDI %}
<li>The current language is bidirectional</li>
{% else %}
<li>The current language is <b>not</b> bidirectional</li>
{% endif %}
<li>Available languages are:
<ul>
{% for lang in LANGUAGES %}
<li>{{ lang.1}}</li>
{% endfor %}
</ul>
</li>
</ul>
</div>
{% endblock %}
見る:
from Django.shortcuts import render_to_response
from Django.template import RequestContext
from pdb import set_trace as debugger
def check(request):
return render_to_response('index.html', context_instance=RequestContext(request)
コマンドライン(.poファイルに正しい翻訳を入力しました):
$ Django-admin.py makemessages -l he-il -e html
$ Django-admin.py compilemessages
settings.py:
# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'he-il'
gettext = lambda s: s
LANGUAGES = (
('he-il', gettext('Hebrew')),
('en-us', gettext('English')),
)
# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True
TEMPLATE_CONTEXT_PROCESSORS = (
"Django.core.context_processors.auth",
"Django.core.context_processors.i18n",
)
MIDDLEWARE_CLASSES = (
'Django.middleware.common.CommonMiddleware',
'Django.contrib.sessions.middleware.SessionMiddleware',
'Django.middleware.locale.LocaleMiddleware',
'Django.contrib.auth.middleware.AuthenticationMiddleware',
)
私がそれを行った方法は、Djangoが独自の翻訳ファイルで使用する正確な言語コードを使用することです(settings.py内で提供されるリンクではありません)。この言語がサポートされている場合( Djangoにも)独自の翻訳ファイルを提供する必要があるため、状況が複雑になることはありません。
$ Django_DIR/conf/localeに移動してフォルダーの名前を確認することでこのコードを見つけました(私にとっては/usr/local/lib/python2.6/dist-packages/Django/conf/localeにありましたが、異なる場合がありますOSなどによって異なります)。
次のように、生成されたロケールファイルのパスをsettings.py
ファイルに追加するだけです。
LOCALE_PATHS = ( "/xxx/xxx/Projects/xxx/sites/avb/locale/",)
これは私がDjango 1.4から、そして1.7.1でもまだ使用している完全なソリューションです:
Settings.pyで…
MIDDLEWEAR_CLASSES、ロケールに追加します。リクエストに基づいて言語を選択できるようにします。
'Django.middleware.locale.LocaleMiddleware',
LOCALE_PATHSを追加します。これは、翻訳ファイルが保存される場所です。
LOCALE_PATHS = (
os.path.join(PROJECT_PATH, 'locale/'),
)
I18Nを有効にする:
USE_I18N = True
サイトを翻訳する言語を次のように設定します。
ugettext = lambda s: s
LANGUAGES = (
('en', ugettext('English')),
('fr', ugettext('French')),
('pl', ugettext('Polish')),
)
I18nテンプレートコンテキストプロセッサをTEMPLATE_CONTEXT_PROCESSORSに追加すると、リクエストにLANGUAGESおよびLANGUAGE_CODEが含まれるようになります。
'Django.core.context_processors.i18n',
Urls.pyで:
Url_patternsに以下を追加すると、設定言語のリダイレクトビューが有効になります。
url(r'^i18n/', include('Django.conf.urls.i18n')),
詳細については、 Translations のその他を参照してください。
以下のインポートを追加し、i18n_patternsで翻訳するURLをカプセル化します。これは私のものです:
from Django.conf.urls.i18n import i18n_patterns
from Django.utils.translation import ugettext_lazy as _
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^i18n/', include('Django.conf.urls.i18n')),
)
urlpatterns += i18n_patterns('',
(_(r'^dual-lang/'), include('duallang.urls')),
(r'^', include('home.urls')),
)
テキストを使用して変換したい場所ならどこでも、lazytextをインポートして、すべての文字列を_( 'text')のようにラップします。他のurls.pyファイルに移動して、次のようにurl変換を行うこともできます。
url(_(r'^dual_language/$'), landing, name='duallang_landing'),
翻訳したいテキストを、models.py、views.pyなどの他のファイルにラップできます。以下は、labelおよびhelp_textの翻訳を含むモデルフィールドの例です。
name = models.CharField(_('name'), max_length=255, unique=True, help_text=_("Name of the FAQ Topic"))
あなたのhtmlテンプレートで...
テンプレートについても同じことを行い、i18nテンプレートタグをロードして、翻訳する静的なものにtransとtransblockを使用します。次に例を示します。
{% load i18n %}
{% trans "This is a translation" %}<br><br>
{% blocktrans with book_t='book title'|title author_t='an author'|title %}
This is {{ book_t }} by {{ author_t }}. Block trans is powerful!
{% endblocktrans %}
次に、ロケールごとにmakemessagesを実行します。
./manage.py makemessages -l pl
あとは、/ localesフォルダーに移動して、各.poファイルを編集するだけです。各msgstrのデータを入力します。その一例を次に示します。
msgid "English"
msgstr "Angielski"
そして最後にメッセージをコンパイルします:
./manage.py compilemessages
モデルインスタンスデータの変換には、次のような再利用可能なパッケージの一部を使用できます。
翻訳で学ぶべきことは他にもたくさんあります internationalization はこのトピックに密接に関連しているので、ドキュメントもチェックしてください。 Djangoのような Django-rosetta や Django-linguo など)で利用できるいくつかの国際化パッケージをチェックすることもお勧めします。モデルの翻訳に役立ちますDjango-rosuoはデータベースに新しいエントリを作成しませんが、Django-linguoは作成します。
あなたがこれに従ったなら、あなたは良いスタートを切るはずです。これは、サイトを複数の言語で実行するための最も標準化された方法だと思います。乾杯!
私は間違っているかもしれません-私が翻訳を使用したのは何ヶ月も前のテストプロジェクトだったからです-しかし、あなたはこれを望んでいないと思います:
$ Django-admin.py makemessages -l he-il -e html
しかし、むしろこれ:
$ Django-admin.py makemessages -l he_il -e html
he_il
の下線に注意してください。
代わりにpt_brでメッセージファイルを作成するまで、pt-BRでも問題が発生していました。それから物事は働き始めました...
ええ、それは明白ではなく、私はそれについてのドキュメントをどこにも見つけることができませんでした。
お役に立てば幸いです。
私は同じ問題を抱えています。しかし、私は "Language:"を.poファイルに置くことによってそれを解決します。私の場合、.poファイルには「Language:」属性が含まれていません。
"言語チーム:LANGUAGE\n" "言語:\ n" "MIME-Version:1.0\n"
しかし、言語コードを入れたとき(私の場合は 'ru'または 'en')
"言語チーム:LANGUAGE\n" "言語:ru\n" "MIME-Version:1.0\n"
わたしにはできる
私は同じ問題を抱えていました、あなたのロケールパスはスラッシュで終わるでなければならないようです:
LOCALE_PATHS = (
'/dir/to/my/locale/',
)
はい、celopesが提案するようにメッセージファイルを作成してコンパイルする必要があります
python manage.py compilemessages
しかし、まだ問題があります。
LocaleMiddlewareを少し無効にします。つまり、これを削除します
Django.middleware.locale.LocaleMiddleware
ミドルウェアリストから。実行時に言語を切り替える必要がない場合は使用しないでください。ただし、必要な場合は solution を使用してください。以前は 同じ問題 があり、誰かがこれを私に説明しました。
また、以前は この奇妙な問題 がありました。 Makemessagesコマンドは、.pyファイルでバックスラッシュでラップされた文字列を窒息させます。
私は非常に同じ問題がありました、私は自分の言語を切り替えようとしました、そしてDjangoはノーと言いました。エラーなし、警告なしですが、Django言語をpl-に切り替えましたpl(私の場合)ただし、ロケールからすべてのフォルダーを削除してコマンドを実行:Django-admin.py makemessages -l pl_PL(2番目のPLのダッシュと大文字の代わりにアンダースコアを使用すると、この問題は解決しました)。
私はそれがそこにいる何人かの人に役立つことを願っています。
同じ問題がありました。 別の同様の質問の下のこのリンク で詳細を説明しました。
簡単に言うと、このコードでサーバーをリロードすることで私の問題は解決されました。
Sudo /etc/init.d/uwsgi reload
フレーズを変更するたびに、言語ファイルをコンパイルした後、サーバーもリロードして変更を確認します。