如果不修改 Jekyll,您将无法实现。他们定义的include
过滤器将其参数视为字符串,而不是表达式。
过去我用 Jekyll 创建了几个双语网站。我发现最干净的解决方案通常是将依赖于语言环境的变量存储在 _config.yml 中,并在需要时引用它。
# _config.yml
...
locales:
en:
welcome_message: "Welcome to my site"
...
es:
welcome_message: "Bienvenido a mi sitio"
对于我呈现的每个页面,我都需要知道它的语言环境。最简单的方法是locale
在该页面的顶部 yaml 中添加一个字段:
---
# a page or post (for example index.html)
...
locale: en
---
然后,您可以通过执行page.locale
.
如果您已将站点划分为文件夹 ( /en/ for english, /es/ for spanish, and so on
,则可以使用页面 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 生成它们:
# _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
我希望这有帮助。
问候!