15

最初のJekyllWebサイトを作成しようとしていますが、i18nパーツの設計で問題が発生しています。

異なる記事は言語ごとに完全に書き直されるので、それぞれが異なる投稿になります。ここでは問題ありません。私は実際に私のレイアウト/インクルードのテキストにもっと問題があります。

通常、メニューについては、次のようなことを考えていました。

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

ここで提案されているように。しかし、これは私に次のエラーを与えます:

インクルードファイル'menu_location'が_includesディレクトリに見つかりません

インクルードタグに変数を使用することは可能ですか?私がこれをどのように行うことができるか他に何か考えがありますか?

ありがとう !

PS:今のところ3つの言語しか考えていなくても、if / elseif / else構文では実行しません;)

4

2 に答える 2

30

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].navsite.locales[page.locale].nav

これがお役に立てば幸いです。

よろしく!

于 2011-06-21T10:34:25.473 に答える
0

フィルタを作成するのはどうですか、それはもっと簡単ではないでしょうか?何かのようなもの:

<li><a href="http://some.domain.com">{{some_text_id|localize</a></li>
于 2014-05-12T12:13:50.747 に答える