31

i18n_patternsDjango アプリで言語プレフィックスを作成するために使用しています。

私の URL は次のようになります。

/de/contact/
/fr/contact/
/it/contact/

私の基本テンプレートでは、使用可能なすべての言語をループして、言語切り替えリンクを表示しています。

{% get_available_languages as languages %}
<nav id="language_chooser">
    <ul>
        {% for lang_code, lang_name in languages %}
            {% language lang_code %}
            <li><a href="{% url 'home' %}" alt="{{ lang_name }}" title="{{ lang_name }}">{{ lang_code }}</a></li
            {% endlanguage %}
        {% endfor %}
    </ul>
</nav>

この場合、「ホーム」URL を逆にしています。代わりに現在のページの翻訳された URL を取得する方法はありますか?

ドイツ語版の「連絡先」ページを表示している場合、「fr」リンクが「ホームページ」ページではなく、フランス語版の「連絡先」ページを指すようにします。

4

13 に答える 13

17

私は言語プレフィックスを使用していませんが、代わりに翻訳された URL を使用しています。ただし、このテンプレート タグも役立ちます。

# This Python file uses the following encoding: utf-8

from django import template
from django.core.urlresolvers import reverse # from django.urls for Django >= 2.0
from django.core.urlresolvers import resolve # from django.urls for Django >= 2.0
from django.utils import translation

register = template.Library()

class TranslatedURL(template.Node):
    def __init__(self, language):
        self.language = language
    def render(self, context):
        view = resolve(context['request'].path)
        request_language = translation.get_language()
        translation.activate(self.language)
        url = reverse(view.url_name, args=view.args, kwargs=view.kwargs)
        translation.activate(request_language)
        return url

@register.tag(name='translate_url')
def do_translate_url(parser, token):
    language = token.split_contents()[1]
    return TranslatedURL(language)

現在の URL を目的の言語で返します。次のように使用します。{% translate_url de %}

改善のためのコメントや提案は大歓迎です。

于 2013-06-27T19:41:45.330 に答える
3

ドキュメントの標準言語形式を使用します

<form action="{% url 'set_language' %}" method="post" id="lang_changer">
{% 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>

URL lang プレフィックスで動作するように jquery を修正します。

$('#lang_changer input[name="next"]').attr('value', '/'+window.location.pathname.substring(4));

ページの準備ができたら実行します。

于 2014-03-11T06:51:40.643 に答える
3

問題に不必要な複雑さを加えていると思います。あなたが探しているのは、単純な言語セレクターです。Django はその機能を標準で提供しており、常に現在のページ (別の言語) にリダイレクトします。

これはここに文書化されています:

https://docs.djangoproject.com/en/dev/topics/i18n/translation/#django.conf.urls.i18n.set_language

唯一のことは、ビューが POST パラメーターを期待しているため、要素set_languageを使用する必要があることです。単純なリンク<form>は使用できません。<a href="...">ただし、言語セレクターを選択ウィジェットを含むフォームではなく、リンクのように見せたい場合があります。私の提案は、フォームを使用することですが、リンクのようにスタイルを設定します。

テンプレートは次のようになります。

<nav id="language_chooser">
    <ul>
        {% get_language_info_list for LANGUAGES as languages %}
        {% for language in languages %}
            <form action="{% url 'set_language' %}" method="post">
                {% csrf_token %}
                <input name="next" type="hidden" value="{{ redirect_to }}" />
                <input name="language" type="hidden" value="{{ language.code }}" />
                <button type="submit">{{ language.local_name }}"</button>
            </form>
        {% endfor %}
    </ul>
</nav>

次に、CSS を使用してフォームと送信ボタンのスタイルを設定し、通常のリンクのように表示します。

ul#language_chooser form {
    display: inline; 
    margin: 0;
    padding: 0;
}

ul#language_chooser button {
    margin: 0;
    padding: 0;
    border: none;
    background: none;
    color: blue; /* whatever you like */
    text-decoration: underline; /* if you like */
}
于 2012-08-13T11:29:58.590 に答える
1

受け入れられた回答にコメントしたいのですが、できないので、自分の回答を投稿しています。https://djangosnippets.org/snippets/2875/に基づいて、かなり似たソリューションを使用しています 。

resolvereverseメソッドの両方がクラッシュする可能性があるという問題があります。

  • resolve特に、すでに 404 ページを表示している場合は、Resolver404 例外が発生する可能性があります (代わりに 500 エラーが発生し、特に DEBUG=True が実際の 404 を表示しない場合は非常に煩わしく、検出が困難です)
  • reverse実際には翻訳されていない別の言語のページを取得しようとすると、クラッシュする可能性があります。

逆は、使用する翻訳方法などに依存する可能性がありますが、404 ページ内でクラッシュを解決することは明らかです。

例外が発生した場合、テンプレートで例外を発生させるのではなく、同じ URL またはインデックス ページへの URL を返すことができます。コードは次のようになります。

from django.core.urlresolvers import resolve, reverse
from django.utils.translation import activate, get_language


@register.simple_tag(takes_context=True, name="change_lang")
def change_lang(context, lang=None, *args, **kwargs):
    url = context['request'].path
    cur_language = get_language()
    try:
        url_parts = resolve(url)
        activate(lang)
        url = reverse(url_parts.view_name, kwargs=url_parts.kwargs)
    except:
        url = reverse("index") #or whatever page you want to link to
        # or just pass if you want to return same url
    finally:
        activate(cur_language)
    return "%s" % url
于 2016-10-04T11:06:38.820 に答える
1

私はそれをできるだけシンプルにしようとしました -reverse()任意の数でdynamic を使用しkwargsて、言語スイッチ (または他の同様のもの) が現在のビューにリダイレクトされるようにします。

templatetags dir ファイルに単純なテンプレート タグを追加しました (例templatetags/helpers.py: ):

from django.core.urlresolvers import reverse

register = template.Library()


@register.simple_tag
def get_url_with_kwargs(request):
    url_name = ''.join([
        request.resolver_match.app_name,
        ':',
        request.resolver_match.url_name,
    ])

    url_kwargs = request.resolver_match.kwargs

    return reverse(url_name, None, None, url_kwargs)

次のような言語切り替えテンプレートで使用できます。

{% load helpers %}

{% get_available_languages as available_languages %}
{% get_language_info_list for available_languages as language_info_list %}

{% for language in language_info_list %}

    {% language language.code %}

        {% get_url_with_kwargs request as url_with_kwargs %}
        <a href="{{ url_with_kwargs }}">{{ language.code }}</a>

    {% endlanguage %}

{% endfor %}

私にとっては非常にうまく機能します。

于 2016-08-05T10:03:02.000 に答える