Pregunta

Estoy tratando de crear mi primer sitio web de Jekyll y me encuentro con un problema para diseñar la parte i18n.

Los diferentes artículos serán totalmente reescritos para cada idioma, por lo que cada uno será una publicación diferente, no hay problemas aquí. De hecho, tengo más dificultades con el texto en mi diseño / incluido.

Por lo general, para el menú, estaba pensando en hacer algo en este sentido:

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

Como sugerido aquí. Pero esto me da el siguiente error:

Incluido el archivo 'menú_location' no se encuentra en el directorio _Includes

¿Es posible usar una variable para la etiqueta de incluir? ¿Tienes alguna otra idea de cómo puedo hacer esto?

Gracias !

PD: Incluso si solo tengo 3 idiomas en mente por el momento, no lo haré con una sintaxis if / loseif / else;)

¿Fue útil?

Solución

Lo que estás tratando de hacer no es posible sin modificar Jekyll. los include Filtro que definieron trata su parámetro como una cadena, no como una expresión.

He creado un par de sitios bilingües con Jekyll en el pasado. Descubrí que la solución más limpia a menudo almacenaba variables dependientes de locales dentro de _config.yml, y referirla cuando sea necesario.

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

Por cada página que rinde, necesito saber su localidad. La forma más sencilla de hacerlo es agregar un locale campo en la página superior yaml:

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

Luego puede obtener el local de la página actual haciendo page.locale.

Si ha dividido su sitio en carpetas (/en/ for english, /es/ for spanish, and so on, puede usar la URL de la página para calcular la configuración regional, para que no necesite especificar la ubicación en cada página:

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

Para una página como /en/blog/, locale será'; por /fr/le-blog, será 'fr'. Sin embargo, tendrá que usar esa línea en todos los diseños e incluye esa necesidad de usar la configuración regional.

Luego puede obtener textos localizados como este:

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

O, si prefieres page.locale:

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

Los menús son los mismos; También puede generarlos desde _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
    ...

Luego puede tener un solo menú.html que genera el menú correcto dependiendo de la localidad de la página:

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

Para usar ´page.locale´ en lugar de'locale ', simplemente retire las dos primeras líneas y reemplace site.locales[locale].nav por site.locales[page.locale].nav

Espero que esto ayude.

¡Saludos!

Otros consejos

¿Qué tal crear un filtro, no sería más simple? Algo como:

<li><a href="http://some.domain.com">{{some_text_id|localize</a></li>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top