Ответ 1
То, что вы пытаетесь сделать, невозможно без изменения Jekyll. Фильтр include
, который они определяют, обрабатывает свой параметр как строку, а не как выражение.
В прошлом я создал пару двуязычных сайтов с Jekyll. Я обнаружил, что самое чистое решение часто хранит зависящие от локали переменные внутри _config.yml и ссылается на него при необходимости.
# _config.yml
...
locales:
en:
welcome_message: "Welcome to my site"
...
es:
welcome_message: "Bienvenido a mi sitio"
Для каждой страницы, которую я представляю, мне нужно знать ее локаль. Самый простой способ сделать это - добавить поле locale
на верхнем ямле этой страницы:
---
# 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
Надеюсь, это поможет.
Привет!