2011-06-17 36 views
14

Tôi đang cố gắng tạo trang web Jekyll đầu tiên của mình và tôi đang gặp sự cố khi thiết kế phần i18n.Bao gồm các tệp khác nhau trong Jekyll tùy thuộc vào ngôn ngữ

Các bài viết khác nhau sẽ được viết lại hoàn toàn cho từng ngôn ngữ, vì vậy mỗi bài viết sẽ là một bài đăng khác, không có vấn đề gì ở đây. Tôi thực sự gặp nhiều khó khăn hơn với văn bản trong bố cục/bao gồm của tôi.

Thông thường, đối với thực đơn, tôi đã suy nghĩ làm một cái gì đó dọc theo những dòng:

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

như gợi ý here. Nhưng điều này mang lại cho tôi những lỗi sau:

tập tin bao gồm 'menu_location' không tìm thấy trong thư mục _includes

Có thể sử dụng một biến cho thẻ bao gồm? Bạn có ý tưởng nào khác về cách tôi có thể làm điều này không?

Cảm ơn!

PS: Ngay cả khi tôi chỉ có 3 ngôn ngữ trong tâm trí cho thời điểm này, tôi sẽ không làm điều đó với một nếu/elseif/cú pháp khác;)

+0

Có các plugin bổ sung hỗ trợ đa ngôn ngữ cho Jekyll, như [this one by Patrice Brend'amour] (http://brendamour.net/en/2014/08/03/multilingual-jekyll- how-to-post-in-more-hơn-một-ngôn ngữ /). – DevSolar

Trả lời

28

Những gì bạn đang cố gắng làm là không thể thực hiện mà không cần sửa đổi Jekyll. Bộ lọc include mà chúng được định nghĩa xử lý thông số của nó dưới dạng một chuỗi chứ không phải là biểu thức.

Tôi đã tạo một vài trang web song ngữ với Jekyll trong quá khứ. Tôi thấy rằng giải pháp sạch nhất thường lưu trữ các biến phụ thuộc vào miền địa phương trong _config.yml và tham chiếu nó khi cần.

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

Đối với mỗi trang tôi hiển thị, tôi cần biết miền địa phương của nó. Cách đơn giản nhất để làm điều đó là thêm một lĩnh vực locale trên yaml đầu trang đó:

--- 
# a page or post (for example index.html) 
... 
locale: en 
--- 

Sau đó bạn có thể nhận được locale trang hiện bằng cách làm page.locale.

Nếu bạn đã chia trang web của bạn trong các thư mục (/en/ for english, /es/ for spanish, and so on, bạn có thể sử dụng URL của trang để tính toán địa phương, do đó bạn không cần phải xác định miền địa phương trên mỗi trang:

{% capture locale %}{{ page.url | truncate: 3, "" | remove: "/" }}{% endcapture %} 
{% if locale == "" %}{% assign locale = "en" %}{% endif %} 

Đối với một trang như /en/blog/, locale sẽ được 'en'; cho /fr/le-blog, nó sẽ là 'fr' Bạn sẽ phải sử dụng dòng rằng trong tất cả các bố trí và bao gồm mà cần phải sử dụng tên địa phương, mặc dù

Bạn có thể sau đó.. nhận các văn bản được bản địa hóa như sau:

{{ site.locales[locale].welcome_message }} 

Hoặc, nếu bạn thích page.locale:

{{ site.locales[page.locale].welcome_message }} 

Menus đều giống nhau; bạn cũng có thể tạo chúng từ _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 
    ... 

Sau đó, bạn có thể có một menu đơn.html mà tạo ra các menu ngữ cảnh tùy thuộc vào locale page:

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

Để sử dụng'page.locale' thay vì'locale', chỉ cần loại bỏ hai dòng đầu tiên và thay thế site.locales[locale].nav bởi site.locales[page.locale].nav

Tôi hy vọng điều này giúp.

Trân trọng!

0

Làm thế nào để tạo bộ lọc, nó sẽ không đơn giản hơn? Một cái gì đó như:

<li><a href="http://some.domain.com">{{some_text_id|localize</a></li> 
Các vấn đề liên quan