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>
「locale」の代わりに「page.locale」を使用するには、最初の2行を削除して、次のように置き換えますsite.locales[locale].nav
。site.locales[page.locale].nav
これがお役に立てば幸いです。
よろしく!