根据区域设置在Jekyll中包含不同的文件

时间:2011-06-17 23:07:31

标签: internationalization jekyll liquid-layout

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

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

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

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

与建议的here一样。但这给了我以下错误:

  

包含的文件'menu_location'不是   在_includes目录

中找到

是否可以为include标记使用变量?你知道我怎么能这样做吗?

谢谢!

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

2 个答案:

答案 0 :(得分:30)

如果不修改杰基尔,你不可能做的事情。他们定义的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),则可以使用页面网址来计算区域设置,这样您就不需要在每个页面上指定区域设置:

{% 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

我希望这会有所帮助。

问候!

答案 1 :(得分:0)

如何创建过滤器,它不会更简单吗?类似的东西:

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