web-dev-qa-db-ja.com

Django翻訳を設定する正しい方法は何ですか?

Django 1.6で動作しない翻訳に問題があります。これをsettings.pyに追加しました:

LANGUAGE_CODE = 'en-us'
ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('de', ugettext('German')),
)

ミドルウェアも追加されました。

MIDDLEWARE_CLASSES = (
    'Django.middleware.common.CommonMiddleware',
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'Django.middleware.locale.LocaleMiddleware',
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
)

同様に、l10ndとなる文字列を使用している場合は、*。pyファイルにも:

from Django.utils.translation import ugettext_lazy as _

私のテンプレートは以下で始まります:

{% extends "base.html" %}
{% load i18n %}

テンプレート内では、transプレースホルダーを使用しました。例えば。

<h1>{% trans "Register a tank" %}</h1>

Locale/de/LC_MESSAGES/Django.poで翻訳を提供しました:

msgid "Register a tank"
msgstr "Einen neuen Tank anmelden"

私のブラウザは、ドイツ語のコンテンツを最初に要求するように設定されています。 ブラウザ設定

私は何を取りこぼしたか?

追伸私が現在ファジーなプロジェクトは、GitHubでホストされています: https://github.com/frlan/blankspot

26
frlan

LOCALE_PATHSsettings.pyに追加し、次のように設定します。

import os
BASE_DIR = os.path.dirname(os.path.dirname(__file__))

LOCALE_PATHS = (
    os.path.join(BASE_DIR, 'locale'),
)

LOCALE_PATHSはタプルでなければならないことに注意してください(パスの末尾のコンマを見てください)。

LOCALE_PATHSに基づいて、localeフォルダーがプロジェクトのルートにあるはずです。

そして、プロジェクトのルートからコマンドDjango-admin.py makemessages -l deおよびDjango-admin.py compilemessagesを必ず実行してください。

djPrj
  |
  +---> djPrj
  |
  +---> djApp
  |
  +---> locale
  |
  +---> templates

また、MIDDLEWARE_CLASSESを、LocaleMiddlewareの後、SessionMiddlewareの前にCommonMiddlewareになるように再配置します here

MIDDLEWARE_CLASSES = (
    'Django.contrib.sessions.middleware.SessionMiddleware',
    'Django.middleware.locale.LocaleMiddleware',
    'Django.middleware.common.CommonMiddleware',
    'Django.middleware.csrf.CsrfViewMiddleware',
    'Django.contrib.auth.middleware.AuthenticationMiddleware',
    'Django.contrib.messages.middleware.MessageMiddleware',
    'Django.middleware.clickjacking.XFrameOptionsMiddleware',
)

サービス(python manage.py runserver)を再起動して、もう一度確認してください。


ローカリゼーションがDjangoのデフォルトDjango.moファイルを使用してDjango adminページに適用されることを確認するために、次のテストを実行します。

まず、プロジェクトのメインurls.pypatternsi18n_patternsに置き換えます。

from Django.conf.urls.i18n import i18n_patterns

urlpatterns = i18n_patterns('',
    url(r'^admin/', include(admin.site.urls)),
    # ...
)

次のように、deプレフィックスを付けて管理ページに移動します。http://127.0.0.1:8000/de/admin/そして、管理ページはドイツ語で表示されるはずです。

OK、あなたはDjangoのドイツ語での管理ページを見ることができますか?

また、deプレフィックスを使用してビューを確認してください。


プロジェクトコード によると、一部の文はtransブロックにありません。次のように配置します。

{% trans "your sentence" %}

また、ビューおよびモデルのコードでは、ugettextの代わりにugettext_lazyを使用する必要があります( here および here をお読みください)。

これを置き換えます:

from Django.utils.translation import ugettext as _ 

で:

from Django.utils.translation import ugettext_lazy as _

そして今、すべてが動作します。

41
Omid Raha

私の場合、実行するパラメーターとしてen-gbを使用しました

Django-admin.py makemessages -l en-gb

代わりに、en_GBにする必要があります。

Django-admin.py makemessages -l en_GB

4
James J. Ye

Cookieとセッションを確認します- How Django Discovers Language Preference に従って、プロセスは次のとおりです:

  1. uRLconfでi18n_patternsを使用する場合、URLの言語プレフィックス
  2. 現在のユーザーのセッションの_languageキー
  3. Django_language cookie(またはsettings.LANGUAGE_COOKIE_NAMEで指定されたとおり)
  4. Accept-Language HTTPヘッダー(これはブラウザ設定が送信するものです)
  5. settings.LANGUAGE_CODE

ブラウザの設定は「de」を優先するように設定されているため、LocaleMiddlewareは前の手順1〜3のいずれかで別の方法で決定する必要があります。

2
miraculixx

translated stringDjango.poを設定してから、python manage.py compilemessagesを使用してください

for e.g 

#: path/to/python/module.py:23
msgid "Welcome to my site."
msgstr "put appropriate translated string here"

提案-:Django-rosettaパッケージを使用して、UIインターフェースからtranslated stringを追加できます。 Django-adminからT文字列を簡単に追加できます。 https://github.com/mbi/Django-rosetta

2
Nilesh

設定でLocaleMiddlewareを有効にする を指定して、Django=ブラウザー設定に基づいて言語検出を行うようにします。言語設定を効果的に変更するには、 Accept-Languageヘッダー。ユーザーのセッションやDjango_language クッキー。

0
sk1p