Включите другой файл в Jekyll в зависимости от локали

Я пытаюсь создать свой первый сайт Jekyll, и я столкнулся с проблемой разработки части i18n.

Различные статьи будут полностью переписаны для каждого языка, поэтому каждый из них будет другим, и никаких проблем здесь нет. У меня на самом деле больше проблем с текстом в моем макете/включает.

Как правило, для меню я думал о том, чтобы что-то делать в этих строках:

{% capture menu_location %}menu.{{ lang }}.html{% endcapture %}
{% include menu_location %}

как предлагается здесь. Но это дает мне следующую ошибку:

Включен файл 'menu_location' not найдено в каталоге _includes

Можно ли использовать переменную для тега include? Есть ли у вас другая идея, как я могу это сделать?

Спасибо!

PS: Даже если на данный момент у меня есть только 3 языка, я не буду делать это с синтаксисом if/elseif/else;)

Ответы

Ответ 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

Надеюсь, это поможет.

Привет!

Ответ 2

Как насчет создания фильтра, не проще ли это? Что-то вроде:

<li><a href="#" onclick="location.href='http://some.domain.com'; return false;">{{some_text_id|localize</a></li>