【问题标题】:How to link to language's homepage for untranslated page in django-cms?如何链接到 django-cms 中未翻译页面的语言主页?
【发布时间】:2011-12-22 09:41:10
【问题描述】:

在 django-cms 中,我有两种语言,其中一页是荷兰语,目前还没有翻译成英文。查看此页面时,language_chooser 不提供英文翻译链接(因为没有)。但是,我想将链接链接到英文翻译以链接到主页(或其他一些英文页面,如果它有意义的话)。现在我可以自己创建需要的模板标签,或者一些模板技巧,但我认为这个问题之前已经解决了。遗憾的是,我找不到任何此类解决方案的示例。

语言选择器是这样使用的:

<p><small>Choose your language: {% language_chooser %}</small></p>

此模板标签使用的默认模板(source on github):

{% load menu_tags %}
{% for language in languages %}
<a href="{% page_language_url language.0 %}"{% ifequal current_language language.0 %} class="current"{% endifequal %}>{{ language.1 }}</a>
{% endfor %}

呈现的 html(注意英文链接的空 href):

<p><small>Choose your language: 
<a href="">English</a>
<a href="/nl/contact/" class="current">Nederlands</a>
</small></p>

【问题讨论】:

  • 我通过修改 django-cms 的源来解决这个问题,但这似乎不是一个可持续的解决方案。我还在 django-cms 中标记了这个问题:github.com/divio/django-cms/issues/1087

标签: django internationalization django-cms


【解决方案1】:

我建议如下:

通过继承现有标签为page_language_url创建一个自己的模板标签,将其放入您的一个项目应用程序中的模板标签文件中,我们称之为menu_extra_tags.py

from django import template
from menus.templatetags.menu_tags import PageLanguageUrl
from classytags.arguments import Argument
from classytags.core import Options

register = template.Library()

class PageLanguageUrlAsVariable(PageLanguageUrl):
    name = 'page_language_url_as_variable'
    options = Options(
        Argument('lang'),
        'as',
        Argument('varname', resolve=False),
    )
    def render_tag(self, context, **kwargs):
        varname = kwargs.pop('varname')
        url = super(PageLanguageUrlAsVariable, self).render_tag(context, **kwargs)
        context[varname] = url
        return ''
register.tag(PageLanguageUrlAsVariable)

现在在您的语言选择器模板中执行以下操作:

{% load menu_tags menu_extra_tags %}
{% for language in languages %}
    {% page_language_url_as_variable language.0 as pageurl %}
        <a href="{% if pageurl %}{{ pageurl }}{% else %}/{{ language.0 }}/{% endif %}"{% ifequal current_language language.0 %} class="current"{% endifequal %}>{{ language.1 }}</a>
{% endfor %}

如果此页面的英文翻译不可用,这会将您重定向到/en/(英文主页)。

【讨论】:

  • 虽然我希望有一个干净的解决方案 (DRY),但这可以完成工作。
  • 怎么还不够干?当然,您需要编写自己的模板标签(尽管它只是模板标签的一小部分),并且可能该标签应该已经在核心中了。除此之外,这个解决方案对我来说似乎非常简单和干净
  • 当然,您的解决方案是干净的。我同意你的观点,它应该是核心,这将解决我的“问题”,而你的解决方案不是 DRY。谢谢你。我将在我为 django-cms 提出的问题中链接到您的解决方案。
  • @ojii 请为一个刚接触 django 的人解释答案,我试过但我不知道如何包含 menu_extra_tags.py,我试图将它包含在一个应用程序中,但我得到一个错误menu_extra_tags 未定义。
  • @WebDev 您需要 Django 中的应用程序(INSTALLED_APPS 中的应用程序),其中至少有一个 models.py(因此它会被检测到)。然后在该应用程序中创建一个包templatetags,其中包含一个空的__init__.py 文件和menu_extra_tags.py。另请参阅文档docs.djangoproject.com/en/1.3/howto/custom-template-tags
猜你喜欢
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-08
  • 1970-01-01
  • 2012-12-05
相关资源
最近更新 更多