除非修改Jekyll,否则你无法实现你想要做的事情。他们定义的include
过滤器将其参数视为字符串而不是表达式。
我以前用Jekyll创建过几个双语站点。我发现最干净的解决方案通常是将与语言相关的变量存储在_config.yml中,并在需要时引用它。
...
locales:
en:
welcome_message: "Welcome to my site"
...
es:
welcome_message: "Bienvenido a mi sitio"
对于我渲染的每个页面,我都需要知道它的语言环境。最简单的方法是在页面顶部的 yaml 中添加一个 locale
字段:
For every page I render, I need to know its locale. The simplest way of doing that is adding a
locale
field on the top yaml that page:
---
...
locale: en
---
你可以通过执行 page.locale
来获取当前页面的语言设置。
如果你将网站划分为文件夹(例如用于英语的/en/
,用于西班牙语的/es/
等),则可以使用页面URL来计算语言设置,这样就不需要在每个页面上指定语言设置:
{% capture locale %}{{ page.url | truncate: 3, "" | remove: "/" }}{% endcapture %}
{% if locale == "" %}{% assign locale = "en" %}{% endif %}
对于类似/en/blog/
这样的页面,locale
将是'en'; 对于/fr/le-blog
,它将是'fr'。您将不得不在所有需要使用语言环境的布局和包含文件中使用该行。
然后,您可以这样获取本地化文本:
{{ site.locales[locale].welcome_message }}
或者,如果您更喜欢page.locale
:
{{ site.locales[page.locale].welcome_message }}
菜单是一样的,你也可以从_config.yml文件中生成它们:
...
locales:
en:
nav:
- text: Welcome
url: /en/welcome
- text: Blog
url: /en/blog
layout: post
...
es:
nav:
- text: Bienvenido
url: /es/bienvenido
- text: Blog
url: /es/blog
layout: post
...
那么您可以拥有一个单独的menu.html文件,根据页面的语言环境生成相应的菜单:
{% capture locale %}{{ page.url | truncate: 3, "" | remove: "/" }}{% endcapture %}
{% if locale == "" %}{% assign locale = "en" %}{% endif %}
<nav>
<ul class="nav">
{% for link in site.locales[locale].nav %}
{% assign current = nil %}
{% if page.url == link.url or page.layout == link.layout %}
{% assign current = 'current' %}
{% endif %}
<li class="{% if forloop.first %}first{% endif %} {{ current }} {% if forloop.last %}last{% endif %}">
<a class="{{ current }}" href="{{ link.url }}">{{ link.text }}</a>
</li>
{% endfor %}
</ul>
</nav>
想要使用 ´page.locale´ 替代 `locale`,只需删除前两行,并将 site.locales[locale].nav
替换为 site.locales[page.locale].nav
希望这可以帮助到您。
祝好!