Como criar uma página multilingue com o Jekyll
9 mins 11 Oct 2016Um guia para páginas múltilíngues, baseado no tutorial do Sylvain Durand.
Algumas coisas precisaram ser adaptadas e saíram diferentes.
O principío do método proposto por Sylvain é bem simples: indicar qual a língua da página (lang),
e um identificador único (ref) para conectar as diferentes traduções da mesma página.
Além desses dois itens, precisei adicionar um a mais (class), para poder trabalhar com CSS.
Seletor de línguas
todas as páginas/posts ganharam essas tres linhas a mais no front matter:
---
lang: português
class: pt
ref: home
---
classé usado para aplicar uma classe de CSS (``)refserve para identificar as páginas traduzidas.
Para criar o menu de línguas, basta inserir o seguinte código (proposto por Sylvain Durand):
<ul>
<!-- {% assign posts=site.posts | where:"ref", page.ref | sort: 'lang' %}
{% for post in posts %}
<li>
<a href="{{ post.url }}" class="{{ post.lang }}">{{ post.lang }}</a>
</li>
{% endfor %}
{% assign pages=site.pages | where:"ref", page.ref | sort: 'lang' %}
{% for page in pages %}
<li>
<a href="{{ page.url }}" class="{{ page.lang }}">{{ page.lang }}</a>
</li>
{% endfor %}
</ul>
Porém, troquei dentro das classes, substituindo por
. O motivo? No artigo, Sylvain Durand sugere nomear as línguas com
dois caractéres; português vira pt, inglês vira en e etc.
O problema é que dependendo das línguas que tiver no site, isso fica estranho.
Em um site em dinamarquês, por exemplo, fica bem estranho já que en e pt são abreviações
usadas.
Sendo assim, resolvi mudar todos os atributos de, por exemplo lang: en para lang: english.
Nesse ponto, Sylvain sugere que, para criar um menu das línguas, que realce a língua ativa:
en:lang(en), .fr:lang(fr), .zh:lang(zh){
font-weight: bold;
}
Porém, se mudarmos o fr:lang(fr) para français:lang(français) teremos problemas com SASS
ao executar o servidor do Jekyll. E o mesmo acontece se colocarmos o português: por causa do
chapéu em cima do ê, o sass-converter não vai rodar.
O jeito foi editar todas as páginas e adicionar o atributo class. Deste modo o código em HTML
acima vai passar sem problemas, já que o atributo page.lang não é tratado pelo SASS e/ou CSS.
E o atributo class também passa sem problemas, já que ele vira apenas class: pt ao invés de
class: português (com o acento circumflexo).
O HTML final
fica mais ou menos assim:
<ul>
{% assign posts=site.posts | where:"ref", page.ref | sort: 'lang' %}
{% for post in posts %}
<li>
<a href="{{ post.url }}" class="{{ post.class }}">{{ post.lang }}</a>
</li>
{% endfor %}
{% assign pages=site.pages | where:"ref", page.ref | sort: 'lang' %}
{% for page in pages %}
<li>
<a href="{{ page.url }}" class="{{ page.class }}">{{ page.lang }}</a>
</li>
{% endfor %}
</ul>
E CSS final
pode ficar assim:
.en:lang(en), .fr:lang(fr), .zh:lang(zh){
font-weight: bold;
}
Exatamente como Sylvain Durand segeriu. o/
Menu principal
Para construir o menu da página, ele sugere adicionar ao _config.yml
algo mais ou menos assim:
t:
en:
home:
name: "Home"
url: "/"
about:
name: "About"
url: "/about/"
fr:
home:
name: "Accueil"
url: "/accueil/"
about:
name: "À propos"
url: "/a-propos/"
Como to trabalhando com várias línguas, adicionar o nome e o url de cada
link no menu (para cada língua) transformaria o _config.yml em uma bagunça
chata pra editar. Por isso, adotei a ideia que vi no tema Starving Artist
de Chris Tarwater, que cria um arquivo
/_data/nav.yml para cuidar do menu.
Esse arquivo usa a mesma estrutura proposta por Chris no código do tema
Starving Artis, adicionando o t: en: proposto no tutorial de Sylvain,
mas com os nomes completos de cada língua:
t:
english:
- title: "home"
href: "/home/"
- title: "blog"
href: "/blog/"
- title: "categories"
subcategories:
- subtitle: "category1"
subhref: "/category1/"
português:
- title: "home"
href: "/home-pt/"
- title: "blog"
href: "/blog-pt/"
- title: "categorias"
subcategories:
- subtitle: "categoria1-pt"
subhref: "/categoria1-pt/"
Ao invés de usar o nome completo da língua (lang: português, poderia usar
a classe (class: pt), assim ficaria igual ao tutorial. Mas como no caso desta
página o único link ativo é o do seletor de línguas, deixei assim mesmo e
não tive problemas, pois a aparência do menu é tratada pelas classes dos <div>,
não pelas classes das línguas (que teriam problemas por causa dos caracteres
especias.
É uma página onde o menu de navegação não é realçado de acordo com
a página, mas apenas o menu de línguas, de acordo com a língua da página que o usuário se encontra.
Uma vez que o _data/nav.yml está criado, é preciso incluí-lo. No caso, editei
o arquivo _includes/navigation.html - responsável pelo código do menu. Para mostrar
apenas o menu da língua da página, mudei essa linha no template:
{% for nav in site.data.nav %}
…adicionando as referências do _data/nav.yml:
{% for nav in site.data.nav.t[page.lang] %}
Aqui, novamente daria no mesmo usar page.lang ou page.class, já que todas
as páginas possuem duas referências as línguas (lang: e class:).
Resumindo
A variável lang: só precisa ser evitada se ela for passar como uma classe em
CSS. Por exemplo:
<div class="{{page.lang}}>{{page.title}}
precisaria virar:
<div class="{{page.class}}>{{page.title}}
Lista de posts na mesma língua
Para listar somente posts na mesma língua, segui o tutorial e adicionei
editei a seguinte linha em _layouts/blog.html:
{% assign posts=site.posts | where:"lang", page.lang %}
Banner para a página principal da língua
atualização/novembro
Reparei que o banner do site estava sempre direcionando para o index.html.
Isso quer dizer que ao clicar no banner, ao invés de ir para a página principal
(em relação a língua), o usuário iria para a página principal (index.html).
Neste caso, o index.html está em inglês. Se o usuário passa um bom tempo lendo
os arquivos em português, e de repente decide ir para a página principal em
português, a única maneira seria:
- clicar no banner (ir para `index.html` em inglês)
- escolher `português` na barra de idiomas
Isso acontece porque usando esse formato, o link português vai levar a página
em português referente a página atual, e não para a página principal.
Tentei várias formas, mas não conseguir resolver. No final, o jeito foi criar o
arquivo _data/home.yml:
t:
english:
- href: "/"
português:
- href: "/pt/"
dansk:
- href: "/da/"
E editar o _includes/header.html, adicionando um for, no mesmo esquema usado
para compor o menu:
{% for home in site.data.home.t[page.lang] %}
<a href="{{ home.href }}"><img src="{{ page.header }}" alt="{{ site.title }} banner image" title="{{ site.title }} banner image" class="center"></a>
{% endfor %}