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

Dan*_*gen 28 django django-templates internationalization

我正在使用i18n_patternsDjango应用程序创建语言前缀.

我的网址如下所示:

/de/contact/
/fr/contact/
/it/contact/
Run Code Online (Sandbox Code Playgroud)

在我的基本模板中,我循环遍历所有可用语言以显示语言切换链接.

{% 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>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我正在撤消"主页"URL.有没有办法获得当前页面的翻译URL?

如果我在我的"联系"页面的德语版本上,我希望"fr"链接指向"联系"页面的法语版本,而不是"主页"页面.

Phi*_*ler 16

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

# 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)
Run Code Online (Sandbox Code Playgroud)

它以所需语言返回当前URL.像这样使用它:{% translate_url de %}

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

  • 谢谢,您的解决方案对我有用,但收效甚微.我在forloop中使用简单标签...`@register.simple_tag(name ='translate_url')def do_translate_url(language):return TranslatedURL(language)`...然后在模板中...`{%get_language_info_list for LANGUAGES as语言%} {%语言中的语言%} <a href="{% translate_url language.code %}"> {{language.name_local}} </a> {%endfor%}` (4认同)

sed*_*nym 7

这段代码应该这样做:

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

一旦你补充说,作为一个自定义的模板标签,那么你可以这样做:

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


Cha*_*thk 6

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

# 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)
Run Code Online (Sandbox Code Playgroud)

然后在你的 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>
Run Code Online (Sandbox Code Playgroud)

对于 hreflang :

{% get_available_languages as languages %}
{% for lang_code, lang_name in languages %}
    <link rel="alternate" hreflang="{{lang_code}}" href="{% translate_url lang_code %}" />
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


Paw*_*cha 5

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

from django.urls import translate_url
translate_url(url, lang_code)
Run Code Online (Sandbox Code Playgroud)

  • 这充其量只是一条评论。 (3认同)