根据语言环境在Jekyll中包含不同的文件

15

我正在尝试创建我的第一个Jekyll网站,我在设计i18n部分时遇到了问题。

每种语言的文章将完全重写,因此每篇文章都是不同的帖子,没有问题。实际上,我在布局/包含文件中的文本方面遇到了更多困难。

通常,对于菜单,我考虑采取以下方式:

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

就像这里建议的那样。但是这给了我以下错误:

在_includes目录中找不到已包含的文件'menu_location'

是否可以为include标签使用变量?您是否有任何其他想法可以实现此功能?

谢谢!

附言:即使我目前只考虑三种语言,我也不会使用if / elseif / else语法;)


Jekyll有一些插件可以添加多语言支持,比如Patrice Brend'amour开发的这个 - DevSolar
2个回答

30

除非修改Jekyll,否则你无法实现你想要做的事情。他们定义的include过滤器将其参数视为字符串而不是表达式。

我以前用Jekyll创建过几个双语站点。我发现最干净的解决方案通常是将与语言相关的变量存储在_config.yml中,并在需要时引用它。

# _config.yml
...
locales:
  en:
    welcome_message: "Welcome to my site"
    ...
  es:
    welcome_message: "Bienvenido a mi sitio"

对于我渲染的每个页面,我都需要知道它的语言环境。最简单的方法是在页面顶部的 yaml 中添加一个 locale 字段:


For every page I render, I need to know its locale. The simplest way of doing that is adding a locale field on the top yaml that page:
---
# a page or post (for example index.html)
...
locale: en
---

你可以通过执行 page.locale 来获取当前页面的语言设置。

如果你将网站划分为文件夹(例如用于英语的/en/,用于西班牙语的/es/等),则可以使用页面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
创建一个过滤器怎么样?这样不是更简单吗?像这样:
<li><a href="http://some.domain.com">{{some_text_id|localize</a></li>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接