This is a simple example of an implementation of a multilingual site using Jekyll + netlify-cms.
Optional: In a terminal (to run the cms locally):
cd <PROJECT>
PORT=8076 npx netlify-cms-proxy-server
In another terminal:
cd <PROJECT>
bundle exec jekyll serve
This explanation is based on the idea that the reader has knowledge of both techonologies.
Netlify-cms gets linked to a collection languages that will define the laguages available (here limited by this issue):
- label: "Languages"
name: "languages"
folder: "_data/languages"
extension: "yml"
format: "yml"
create: false
slug: "{{code}}"
editor:
preview: false
fields:
- { label: "Language", name: "language" , widget: string}
- { label: "Country Code (for url)", name: "code" , widget: string}
This collection is located in the directory _data/laguages
to allow the template to generate automatically the list of available languages.
All the templates are located in the directory _includes
in this example only index.html
and about.html
.
For every language there is a directory named by the code of the language: for example fr
. This directory will contain all the layouts and include the corresponding template with the lang
variable set as the code of the language. The index in french would look like this:
---
layout: default
---
{% include index.html lang="fr" %}
Once all this is setup let's have a look at the collections defined in netlify-cms configuration file.
- label: "Post"
name: "post"
folder: "_posts"
slug: "{{year}}-{{month}}-{{day}}-{{title}}"
create: true
editor:
preview: false
fields:
- label: Language
name: language
widget: relation
collection: languages
searchFields: ["language"]
valueField: code
displayFields: ["language"]
default: "en"
- { label: "Title", name: "title", widget: "string" }
- { label: "Body", name: "body", widget: "markdown" }
Every collection have the field language which is a relation based on the list of languages. This allows the user to set a language for the content being written.
Every content created will have the variable language
set in its frontmatter. This allows the templates to then filter the relevant content based on this variable.
Et voilà !
To add a new language, Italian for example:
touch _includes/languages/it.yaml
$EDITOR _includes/languages/it.yaml
language: Italiano
code: it
mkdir it
fr/
) and change the variable lang
to have the value it
English has been set as default language. For that in each file contained in the language directory the line permalink: /<CHANGE URL>
needs to be added. This line can be removed from the previous default language.
With <3 from toto