我使用Sylvain Durand的设置making Jekyll multilingual以多种语言运行了一个Jekyll博客,而没有使用任何插件。
所有帖子都有以下标记:
---
title: Hello world!
lang: en
ref: hello
---
帖子使用的是常规文件夹结构:
jekyll
|
-- posts
|
--name-of-post
--name-of-post-2
--name-of-post-3
我有一个名为 en.md 的页面,该页面带有layout: home
和lang: en
标记,该页面正确显示了英文帖子,并在 home.html < / strong>
{% assign posts=site.posts | where:"lang", page.lang %}
<ul>
{% for post in posts %}
<li>
<a href="{{ post.url }}">{{ post.title }}</a>
</li>
{% endfor %}
</ul>
但我想改为按类别显示帖子,并按语言过滤。
试图通过以下方法实现这一目标:
{% assign posts=site.categories | where:"lang", page.lang %}
<div class="categories">
{% for category in site.categories %}
<li><a name="{{ category | first }}">{{ category | first }}</a>
<ul>
{% for posts in category %}
{% for post in posts %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
{% endfor %}
</ul>
</li>
{% endfor %}
</div>
构建时会显示以下消息
液体异常:/ _ layouts / home.html中没有将字符串隐式转换为Integer
尝试了许多变种,但似乎没有一个起作用。
答案 0 :(得分:2)
这可以解决问题:
---
Title: English posts
lang: en
---
<ul>
{% for category in site.categories %}
{% comment %}
Here we have something like this
category = Array[
"category1",
[doc1, doc2]
]
{% endcomment %}
{% assign name = category[0] %}
{% assign posts = category[1] %}
{% comment %}
>> This also works
{% assign name = category.first %}
{% assign posts = category.last %}
{% endcomment %}
{% comment %}
>> Filtering posts based on their `lang` variable
>> and on the current `page.lang`
{% endcomment %}
{% assign selectedPosts = posts | where:"lang", page.lang %}
{% comment %}
>> Let's make sure that we need to print something
{% endcomment %}
{% if selectedPosts.size > 0 %}
<li>
Category {{ name }} :
<ul>
{% for post in selectedPosts %}
<li><a href="{{ site.baseurl }}{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
</ul>
</li>
{% endif %}
{% endfor %}
</ul>
简短版本:
<ul class="post-list">
{% for c in site.categories %}
{% assign selectedPosts = c.last | where:"lang", page.lang %}
{% if selectedPosts.size > 0 %}
<li>Category {{ c.first }} :
<ul>
{% for post in selectedPosts %}
<li><a href="{{ site.baseurl }}{{ post.url }}">{{ post.title }} - {{ post.lang }}</a></li>
{% endfor %}
</ul>
</li>
{% endif %}
{% endfor %}
</ul>
答案 1 :(得分:1)
我发现this partial solution,就像您所做的...:
{% for category in site.categories %}
<li><a name="{{ category | first }}">{{ category | first }}</a>
<ul>
{% for posts in category %}
{% for post in posts %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
{% endfor %}
</ul>
</li>
{% endfor %}
您要/要执行的操作是使用页面语言过滤'posts'变量。确实可以使用assign
使用where
过滤器来完成此操作,但是应该看起来像这样(因为“ lang”是单个帖子的属性,而不是类别的属性):
{% assign lang_posts = posts | where:"lang", page.lang %}
这将导致以下代码:
{% for category in site.categories %}
<li><a name="{{ category | first }}">{{ category | first }}</a>
<ul>
{% for posts in category %}
{% assign lang_posts = posts | where:"lang", page.lang %}
{% for post in lang_posts %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endfor %}
{% endfor %}
</ul>
</li>
{% endfor %}
如果您的前件事情有随机的类别列表,例如:
- categories:
- web
- css
- internet
...,并且您的网站_config.yml
包含类似(但更完整)的列表,如下所示:
- categories:
- web
- css
- internet
- html5
- jekyll
您还有其他问题。在这种情况下,您不会使用Jekyll的内置类别解决方案,并且this solution不适用。在这种情况下,很多语句意味着不同的事情,例如:
{% for category in site.categories %}
{{ category | first }}
这意味着您可以遍历_config.yml
中的所有现有类别,然后category | first
应该是category
。在这种情况下,您可能想要这样的东西:
<ul class="categories">
{% for category in site.categories %}
<li><a name="{{ category }}">{{ category }}</a>
<ul>
{% assign posts=site.posts | where:"lang", page.lang %}
{% for post in posts %}
{% if post.categories contains category %}
<li><a href="{{ post.url }}">{{ post.title }}</a></li>
{% endif %}
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
请注意,这只是覆盖Jekyll类别变量的简单Jekyll /液体数组逻辑。