Включите разные файлы в Jekyll в зависимости от локали - PullRequest
15 голосов
/ 18 июня 2011

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

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

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

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

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

Включенный файл 'menu_location' отсутствует находится в каталоге _include

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

Спасибо!

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

Ответы [ 2 ]

30 голосов
/ 21 июня 2011

То, что вы пытаетесь сделать, невозможно без изменения Джекила. Определенный ими фильтр 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

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

Привет!

0 голосов
/ 12 мая 2014

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

<li><a href="http://some.domain.com">{{some_text_id|localize</a></li>
...