web-dev-qa-db-ja.com

Django 2言語のサイト

デフォルト言語、母国語、オプションの英語の2言語でサイトを開発したいと考えています。私は自分のドメインをそのようにするつもりです:

www.mydomain.com/tr/
www.mydomain.com/en/

デフォルトでは、ユーザーがmydomain.comを入力すると、それらは/tr/バージョンにリダイレクトされ、必要に応じてトップメニューから/ en /に移動することを選択します。そして、これが私の質問です。

Django両方の言語を維持するための最良の方法は何ですか。自動翻訳はしたくないが、両方の言語のテキストを自分で維持したいことに注意してください。

ありがとう

30
Hellnar

私が見ると、ここには2つの主要なオプションがあります。

(1)サイトの2つの別々のコピーを別のDjangoアプリとして保持し、単に rlconf これらのアプリを指すようにすることができます-url(r'^/en/', include(myproject.en))はあなたのurlconfにあなたの英語のアプリを指し、他は他の言語を指します。これは、2つのアプリに対して異なるurlconfのセットや異なるhtmlテンプレートなどを維持することを含みます。 URL自体もさまざまな言語を反映しています(たとえば、スペイン語 "/ pagina/uno"と英語 "/ page/one")。

(2) Django sessions を使用して、言語設定をCookieに記録し(実際にそうする必要があります)、そのCookieから好きな方法で適切なバージョンのテキストをテンプレートに配信させます。このためのコードは次のとおりです。

# views.py

# default to your native language
request.session['lang'] = 'tr'

# someone clicks the link to change to English
def switch_to_English_link(request):
    request.session['lang'] = 'en'

そして、テンプレートでこの情報を収集するには、次のようにします。

<!-- my_Django_template.html -->
<div>
  <span>
     {% if request.session.lang == "en" %}
        This is my text in English!
     {% else %}
        Şimdi benim sitede Türk var!
     {% endif %}
  </span>
</div>
30
jdotjdot

だからここにあなたの質問の長いバージョンがあります。 Django 1.4から1.7.1まで:

Settings.pyで…

ロケールにMIDDLEWARE_CLASSESを追加すると、リクエストに基づいて言語を選択できるようになります。

'Django.middleware.locale.LocaleMiddleware',

LOCALE_PATHSを追加します。これは、翻訳ファイルが保存される場所です。

LOCALE_PATHS = (
    os.path.join(PROJECT_PATH, 'locale/'),
)

I18Nを有効にする

USE_I18N = True

サイトを翻訳するLANGUAGESを設定します。

ugettext = lambda s: s
LANGUAGES = (
    ('en', ugettext('English')),
    ('pl', ugettext('Polish')),
)

I18nテンプレートコンテキストプロセッサを追加すると、リクエストにLANGUAGESLANGUAGE_CODEが含まれるようになります。

Django <1.8の場合、ここに配置します。

TEMPLATE_CONTEXT_PROCESSORS = (
    ....
    'Django.core.context_processors.i18n', # this one
)

Django> = 1.8の場合は、ここに配置します。

TEMPLATES = [
    {
        'OPTIONS': { 'context_processors': [
        'Django.template.context_processors.i18n', # this one
    ]}
]

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')),
)

注:管理URLをi18n_patternsにドロップすることもできます。

遅延テキストでテキストをラップしてください! (上記のように)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"))

Django翻訳ドキュメントはこれに最適です!

あなたの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-rosettaDjango-linguo など)で利用できるいくつかの国際化パッケージをチェックすることもお勧めします。モデルの翻訳に役立ちますコンテンツでは、Django-rosettaはデータベースに新しいエントリを作成しませんが、Django-linguoは作成します。

また、完全に機能するソリューションを見たい人のために Django翻訳デモ も作成しました。

これに従えば、良いスタートを切るはずです。これは、サイトを複数の言語で実行するための最も標準化された方法だと思います。乾杯!

68
radtek

1.4以降で使用可能な翻訳可能なURLパターンを使用できます。

https://docs.djangoproject.com/en/dev/topics/i18n/translation/#url-internationalization

3
user1349830

URLでページの言語を指定する必要がある場合は、 Django-localeurl アプリを使用する必要があります。つまり具体的には、例で何をしているのか。 デフォルトDjango翻訳機構 は、URLの前に付けるだけで、SEO戦略では効果がない可能性があります。Django-localeurlは、URLの処理部分を修正するだけです。残りのデフォルトDjango翻訳機構。