12

ユーザーが英語とスペイン語の間で言語を変更できるようにするには、2 つのボタンまたはリンクを含める必要があります。ドキュメントを読んで、これを試しました:

<form action="/i18n/setlang/" method="post">{% csrf_token %}
    <input name="language" type="hidden" value="es" />
    <input type="submit" value="ES" />
</form>

ただし、ボタンをクリックするたびにページがリロードされますが、言語はまったく変更されません。何か不足していますか?

注:next現在のページを目的の言語でリロードしたいだけなので、設定していません。

ドキュメントで提供されているデフォルトのフォームを使用すると、結果は同じです。ページはリロードされますが、言語は変更されません。

<form action="{% url 'set_language' %}" method="post">
    {% csrf_token %}
    <input name="next" type="hidden" value="{{ redirect_to }}" />
    <select name="language">
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}
            <option value="{{ language.code }}"{% if language.code == LANGUAGE_CODE %} selected="selected"{% endif %}>
                {{ language.name_local }} ({{ language.code }})
            </option>
        {% endfor %}
    </select>
    <input type="submit" value="Go" />
</form>

更新

i18n_patternsさらにテストした結果、 で と の両方を使用すると問題があることがわかりましpatternsurls.py。現在、次のようなファイルがあります。

urlpatterns = i18n_patterns('',
    url(r'^contents/', include('contents.urls')),
    url(r'^events/', include('events.urls')),
    # ...
)
urlpatterns += patterns('',
    url(r'^i18n/', include('django.conf.urls.i18n')),
)

そして、これはうまくいかないようです。ただし、を削除しi18n_patternsて変更するとpatterns、動作するようです:

urlpatterns = patterns('',
    url(r'^contents/', include('contents.urls')),
    url(r'^events/', include('events.urls')),
    # ...
)
urlpatterns += patterns('',
    url(r'^i18n/', include('django.conf.urls.i18n')),
)

ドキュメントには、 の中に含める必要はないと書かれているi18n_patternsので、これでうまくいくはずですが、そうではありません! django.conf.urls.i18nbefore または afterを含めるかどうかは関係ありませんi18n_patterns。常に同じことを行います。

4

8 に答える 8

17

可能なオプションの要約:

ユーザーのセッション言語をselect

Django docsには、例を含む優れた広範な説明があります。

ボタンでユーザーのセッション言語を変更する

@Caumonsが提案したように、ボタンごとにフォームを繰り返す必要はありません。代わりに、言語と同じ数のボタンをフォームに含めることができます。

<form action="{% url 'set_language' %}" method="post">
    {% csrf_token %}
    <input name="next" type="hidden" value="{{ request.get_full_path|slice:'3:' }}" />
    <ul class="nav navbar-nav navbar-right language menu">
        {% get_current_language as LANGUAGE_CODE %}
        {% get_available_languages as LANGUAGES %}
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}
            <li>
                <button type="submit"
                        name="language"
                        value="{{ language.code }}"
                        class="{% if language.code == LANGUAGE_CODE %}selected{% endif %}">
                    {{ language.name_local }}
                </button>
            </li>
        {% endfor %}
    </ul>
</form>

ボタンをリンクなどのようにスタイルアップできます。

リンクで表示される言語を変更する

デフォルトのユーザー セッション言語を変更する必要がない場合は、単純なリンクを使用してコンテンツを変更できます。

<ul class="nav navbar-nav navbar-right language menu">
    {% get_current_language as LANGUAGE_CODE %}
    {% get_available_languages as LANGUAGES %}
    {% get_language_info_list for LANGUAGES as languages %}
    {% for language in languages %}
        <li>
            <a href="/{{ language.code }}{{ request.get_full_path|slice:'3:' }}"
               class="{% if language.code == LANGUAGE_CODE %}selected{% endif %}"
               lang="{{ language.code }}">
                {{ language.name_local }}
            </a>
        </li>
    {% endfor %}
</ul>

SEO

Django が推奨するように、フォームを使用してセッション言語を変更する場合、コンテンツが seo フレンドリーであるかどうかは完全にはわかりません。したがって、リンク<a>マークアップが要素の下に非表示で追加される可能性があり<button>ます。

于 2015-06-11T11:33:08.470 に答える
2

2 つの言語だけが必要な場合は、例: 英語とフランス語で、これを settings.py で定義し、デフォルトの言語を設定し、メイン アプリで urls.py を正しく構成しました。次に、テンプレート (または部分、トップバーなど) でこれを使用するbtn-kinito "btn-headerだけで、css または JS で操作できるスタイリング クラスになります。

内部のループまたは反復はLANGUAGES[]、 で定義したリストをループするだけsettings.pyで、ボタンを作成します。文字「|」&nbsp;ラングが2つしかないので、かわいく見せるためのスペース。

これ{% url 'set_language' %}は、URL にリダイレクトする set_language と呼ばれる Django のリダイレクト ビューです。これが、この場合、メイン アプリの urls.py に配置する必要がある理由ですpath('i18n/', include('django.conf.urls.i18n')),。したがって、リスト内の言語ごとにボタンが作成された後、その URL にリダイレクトできるようになります。

  <div class="btn-header">
    <form action="{% url 'set_language' %}" method="post">
      {% csrf_token %}
      <input name="next" type="hidden" value="{{ redirect_to }}" />
        {% get_current_language as LANGUAGE_CODE %}
        {% get_available_languages as LANGUAGES %}
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}
          <button type="submit" name="language" value="{{ language.code }}"
            class="btn-kinito">
            {{ language.code }}
          </button>|&nbsp;
        {% endfor %}
    </form>
  </div>

urls.py の場合、次のようになると思います。

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from django.conf.urls.i18n import i18n_patterns


# I don't want my admin translated
urlpatterns = [
    path('admin/', admin.site.urls),
]

urlpatterns += i18n_patterns (
    path('i18n/', include('django.conf.urls.i18n')),
    path('', include('pages.urls')),
    path('cats', include('cats.urls')),
    path('dogs', include('dogs.urls')),
    prefix_default_language=False,
 ) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

これはオプションであり、URL からデフォルトの言語プレフィックスを削除します。prefix_default_language=False,これは、2 つまたは 3 つの言語を取得した場合に意味があります。過去にこれで問題が発生しましたが、prefix_default_language=False,機能しませんでした。

prefix_default_language=False,機能しない、または URL からデフォルトの言語プレフィックスを削除しないという問題を解決する方法

私のsettings.pyで変更 LANGUAGE_CODE = 'en-us'しました:LANGUAGE_CODE = 'en'

(解決したようです)

于 2020-01-29T01:02:09.550 に答える
1

それが確実な解決策ではないことはわかっていますが、切り替えボタンが必要でした(2つの言語を切り替えたいのでドロップダウンリストではありません)。

{% get_language_info_list for LANGUAGES as languages %}
{% if LANGUAGE_CODE == languages.0.code %}
    <form action="{% url 'set_language' %}" method="post">
    {% csrf_token %}
    <div class="lang-btn">
        <input name="next" type="hidden" value="{{ redirect_to }}" />
        <input name="language" type="hidden" value="{{ languages.1.code }}" />
        <button type="submit"><img width="30" src="{% static 'united-kingdom.png' %}" alt=""></button>
        </div>
        </form>
{% else %}
    <form action="{% url 'set_language' %}" method="post">
    {% csrf_token %}
        <div class="lang-btn">
            <input name="next" type="hidden" value="{{ redirect_to }}" />
            <input name="language" type="hidden" value="{{ languages.0.code }}" />
            <button type="submit"><img width="30" src="{% static 'turkey.png' %}" alt=""></button>
        </div>
    </form>
{% endif %}
于 2021-10-27T07:25:03.813 に答える