krt*_*tek 15 internationalization liquid-layout jekyll
我正在尝试创建我的第一个Jekyll网站,我遇到了设计i18n部分的问题.
对于每种语言,不同的文章将被完全重写,因此每篇文章都是不同的帖子,这里没有问题.我的布局/包含中的文本实际上有更多困难.
通常,对于菜单,我正在考虑按照以下方式做一些事情:
{% capture menu_location %}menu.{{ lang }}.html{% endcapture %}
{% include menu_location %}
Run Code Online (Sandbox Code Playgroud)
建议喜欢这里.但这给了我以下错误:
在_includes目录中找不到包含的文件'menu_location'
是否可以为include标记使用变量?你知道我怎么能这样做吗?
谢谢 !
PS:即使我目前只考虑3种语言,我也不会用if/elseif/else语法来做;)
kik*_*ito 30
如果不修改杰基尔,你所要做的就是不可能.include他们定义的过滤器将其参数视为字符串,而不是表达式.
我过去曾与Jekyll创建了几个双语网站.我发现最干净的解决方案通常是在_config.yml中存储依赖于语言环境的变量,并在需要时引用它.
# _config.yml
...
locales:
en:
welcome_message: "Welcome to my site"
...
es:
welcome_message: "Bienvenido a mi sitio"
Run Code Online (Sandbox Code Playgroud)
对于我渲染的每个页面,我都需要知道它的语言环境.最简单的方法是在locale页面的顶部yaml上添加一个字段:
---
# a page or post (for example index.html)
...
locale: en
---
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过执行获取当前页面区域设置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 %}
Run Code Online (Sandbox Code Playgroud)
对于像这样的页面/en/blog/,locale将是'en'; 因为/fr/le-blog,它将是'fr'.您必须在所有布局中使用该行,并包括使用区域设置的需要.
然后,您可以获得这样的本地化文本:
{{ site.locales[locale].welcome_message }}
Run Code Online (Sandbox Code Playgroud)
或者,如果您愿意page.locale:
{{ site.locales[page.locale].welcome_message }}
Run Code Online (Sandbox Code Playgroud)
菜单是一样的; 你也可以从_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
...
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用单个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>
Run Code Online (Sandbox Code Playgroud)
要使用'page.locale'而不是'locale',只需删除前两行并替换site.locales[locale].nav为site.locales[page.locale].nav
我希望这有帮助.
问候!