2011-06-17 94 views
14

我試圖創建我的第一個Jekyll網站,並且遇到了設計i18n部分的問題。根據語言環境在Jekyll中包含不同的文件

不同的文章將被完全重寫爲每種語言,所以每一個將是一個不同的職位,這裏沒有問題。實際上我的layout/includes中的文字有更多的困難。

通常情況下,菜單,我在想沿着這些線路做的事情:

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

像建議here。但是,這給了我以下錯誤:

包含文件「menu_location」不 在_includes目錄中找到

是否有可能使用了包括標籤的變量?你有什麼其他想法我怎麼能做到這一點?

謝謝!

PS:就算我只有3記語言的時刻,我不會用if/ELSEIF /其他語法做到這一點;)

+0

有添加多語言支持傑奇,如[這一個帕特里斯Brend'amour]插件(http://brendamour.net/en/2014/08/03/multilingual-jekyll-如何對後在-更比一個語言/)。 – DevSolar

回答

28

你正在嘗試做的也不是沒有可能修改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將是「恩」;對於/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 
    ... 

然後你可以有一個菜單。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[page.locale].nav

我希望這個替換site.locales[locale].nav幫助。

問候!

0

如何創建一個過濾器,會不會更簡單?喜歡的東西:

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