【问题标题】:Include different file in Jekyll depending on the locale根据语言环境在 Jekyll 中包含不同的文件
【发布时间】:2011-09-17 13:44:21
【问题描述】:

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

不同的文章将针对每种语言完全重写,因此每一篇都是不同的帖子,这里没有问题。实际上,我的布局/包含中的文本有更多困难。

通常,对于菜单,我正在考虑按照以下方式做一些事情:

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

喜欢建议的here。但这给了我以下错误:

包含文件“menu_location”不 在 _includes 目录中找到

是否可以为包含标签使用变量?您还有其他想法吗?

谢谢!

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

【问题讨论】:

标签: internationalization jekyll liquid-layout


【解决方案1】:

如果不修改 Jekyll,您将无法实现。他们定义的include 过滤器将其参数视为字符串,而不是表达式。

过去我用 Jekyll 创建了几个双语网站。我发现最干净的解决方案通常是将依赖于语言环境的变量存储在 _config.yml 中,并在需要时引用它。

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

对于我呈现的每个页面,我都需要知道它的语言环境。最简单的方法是在该页面的顶部 yaml 中添加一个 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="http://some.domain.com">{{some_text_id|localize</a></li>
    

    【讨论】:

      猜你喜欢
      • 2020-04-18
      • 2019-08-04
      • 1970-01-01
      • 2013-11-20
      • 2020-07-07
      • 1970-01-01
      • 2018-10-05
      • 2011-07-24
      • 2021-11-23
      相关资源
      最近更新 更多