То, что вы пытаетесь сделать, невозможно без изменения Джекила. Определенный ими фильтр include
обрабатывает его параметр как строку, а не как выражение.
В прошлом я создал пару двуязычных сайтов с Джекиллом. Я обнаружил, что самое чистое решение часто хранит переменные, зависящие от локали, внутри _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
Надеюсь, это поможет.
Привет!