Django模板:使用其他语言获取当前URL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django模板:使用其他语言获取当前URL相关的知识,希望对你有一定的参考价值。

我正在使用i18n_patterns在Django应用程序中创建语言前缀。

我的网址如下所示:

/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”链接指向“联系”页面的法语版本,而不是“主页”页面。

答案

我没有使用语言前缀,而是翻译了网址。但是,此模板标记还应该可以帮助您:

# 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 %}

欢迎提出改进意见和建议。

另一答案

对于Django 2.0(基于Philipp Zedler的answer

自定义模板:

from django import template
from django.urls import reverse
from django.urls import resolve
from django.utils import translation
register = template.Library()

@register.simple_tag(takes_context=True)
def translate_url(context, language):
  view = resolve(context['request'].path)
  request_language = translation.get_language()
  translation.activate(language)
  url = reverse(view.app_name+":"+view.url_name, args=view.args, kwargs=view.kwargs, )
  translation.activate(request_language)
  return url

在模板中:

{% get_available_languages as LANGUAGES %}
<ul>
  {% for lang_code, lang_name in LANGUAGES %}
    <li><a href="{% translate_url lang_code %}">{{ lang_name }}</a></li>
  {% endfor %}
</ul>
另一答案

一个简单的解决方案是使用Django's translate_url function和模板标签:

# utils/templatetags/utils.py
from django.template import Library
from django.urls import translate_url as django_translate_url

register = Library()

@register.simple_tag(takes_context=True)
def translate_url(context, lang_code):
    path = context.get('request').get_full_path()
    return django_translate_url(path, lang_code)

然后在你的html中以这种方式使用它来进行语言选择:

{% load i18n utils %}
{% get_available_languages as languages %}

<ul>
{% for lang_code, lang_name in languages %}
     <li><a href="{% translate_url lang_code %}">{{ lang_code }}</a></li>
{% endfor %}
</ul>

对于hreflangs:

{% get_available_languages as languages %}
{% for lang_code, lang_name in languages %}
    <link rel="alternate" hreflang="{{lang_code}}" href="{% translate_url lang_code %}" />
{% endfor %}

希望这可以帮助。

另一答案

这段代码应该这样做:

https://djangosnippets.org/snippets/2875/

一旦你有added that as a custom template tag,那么你可以做类似的事情:

<a href='{% change_lang 'fr' %}'>View this page in French</a>

另一答案

我认为值得一提的是有一个名为translate_url的内置函数。

from django.urls import translate_url
translate_url(url, lang_code)
另一答案

我认为你正在为这个问题添加不必要的复杂功能。您正在寻找的是一个简单的语言选择器。 Django提供开箱即用的功能,它总是重定向到当前页面(用另一种语言)。

这在此处记录:

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

唯一的问题是set_language视图需要一个POST参数,所以你需要使用一个<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 */
}
另一答案

使用django_hreflang

{% load hreflang %}

<ul>
    <li><a href="{% translate_url 'en' %}" hreflang="en">English</a></li>
    <li><a href="{% translate_url 'ru' %}" hreflang="ru">Russian</a></li>
</ul>
另一答案

我使用docs的标准语言形式

<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>

和jquery修复了使用url lang前缀:

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

页面准备好后运行。

另一答案

我对自定义模板标记的问题是该函数根据当前url计算其他语言等价物,因为我使用的是modeltranslation package,然后urg之间的slug总是相同的。例如。:

example.com/en/article/english-slug
example.com/es/articulo/english-slug

为了解决这个问题,我采用了稍微不同的方法,在视图级别计算备用URL并在模板上下文中使用它们。

为此工作:

1-使用以下帮助程序函数创建一个utils.py文件

from django.utils.translation import activate, get_language
from django.conf import settings

def getAlternateUrls(object):
    #iterate through all translated languages and get its url for alt lang meta tag                      
    cur_language = get_language()
    altUrls = {}
    for language in settings.LANGUAGES:
        try:
            code = language[0]
            activate(code)
            url = object.get_absolute_url()
            altUrls[code] = url
        finally:
            activate(cur_language)
    return altUrls;

2-让你的模型定义反向网址:如何在 GAE 模板中获取当前页面的 url

如何在 Django 模板中获取当前 URL?

如何在 Django 模板中获取当前 URL?

如何在 Django 模板中获取当前 URL?

Django——有没有办法从模板中引用/获取当前页面 URL? [复制]

当前在 Django 模板中获取主页 URL(域)的方法?