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 */
}
{% 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