An MkDocs plugin that helps you support multiple language versions of your site / documentation.
The mkdocs-static-i18n
plugin allows you to support multiple languages of your documentation by adding static translation files to your existing documentation pages.
Multi language support is just one .<language>.md
file away!
Even better, the mkdocs-static-i18n
also allows you to build and serve localized versions of any file extension to display localized images, medias and assets.
Localized images/medias/assets are just one .<language>.<extension>
file away!
If you want to see how it looks, check out the demo documentation here.
Like what you π? Give it a β!
This plugin is made to be as simple as possible and will generate a default version of your website + one version per configured language on the <language>/
path.
- the
default
version will use any.md
documentation file first and fallback to any.<default_language>.md
file found - the
/<language>
language versions will use any.<language>.md
documentation file first and fallback to any.<default_language>.md
file before fallbacking to any default.md
file found
Since demonstrations are better than words, check out the demo documentation here which showcases the logic.
Just pip install mkdocs-static-i18n
!
Supported parameters:
- default_language (mandatory): 2-letter ISO-639-1 language code (
en
) or 5-letter language code with added territory/region/country (en_US
) - default_language_only (default: false): boolean - see this section for more info
- languages (mandatory): mapping of 2-letter or 5-letter language code: display value
- material_alternate (default: true): boolean - see this section for more info
- nav_translations (default: empty): nested mapping of language: default title: translated title - see this section for more info
Basic usage:
plugins:
- i18n:
default_language: en
languages:
en: English
fr: Français
Using the configuration above on the following docs/
structure will build the following site/
(leaving out static files for readability):
docs
βββ image.en.png
βββ image.fr.png
βββ index.fr.md
βββ index.md
βββ topic1
β βββ index.en.md
β βββ index.fr.md
βββ topic2
βββ index.en.md
βββ index.md
site
βββ en
β βββ image.png
β βββ index.html
β βββ topic1
β β βββ index.html
β βββ topic2
β βββ index.html
βββ fr
β βββ image.png
β βββ index.html
β βββ topic1
β β βββ index.html
β βββ topic2
β βββ index.html
βββ image.png
βββ index.html
βββ topic1
β βββ index.html
βββ topic2
βββ index.html
If you do not wish to build a dedicated <language>/
path for the default_language
version of your documentation, simply do not list it on the languages
list. See issue #5 for more information.
The following configuration:
plugins:
- i18n:
default_language: en
languages:
fr: Français
Applied on the following structure:
docs
βββ image.en.png
βββ image.fr.png
βββ index.fr.md
βββ index.md
βββ topic1
β βββ index.en.md
β βββ index.fr.md
βββ topic2
βββ index.en.md
βββ index.md
Will build:
site
βββ fr
β βββ image.png
β βββ index.html
β βββ topic1
β β βββ index.html
β βββ topic2
β βββ index.html
βββ image.png
βββ index.html
βββ topic1
β βββ index.html
βββ topic2
βββ index.html
When working on your project, building a version for each supported language can be slow depending on the size of your documentation.
The default_language_only
option allows you to only build the selected
default_language
of your documentation for faster development.
Coupled with MkDocs >= 1.2 support for environment variables,
this option can easily be passed dynamically within your mkdocs.yml
file like this!
You can read more about the rationale behind this feature here.
Focus on translating your content, not on updating all the links and references to your assets!
Let mkdocs-static-i18n
do the heavy lifting of dynamically localizing your
assets and just reference everything without their localized extension.
Since the generated site
files have their localization extension removed
during the build process, you can reference them in your markdown source
without it (this includes links to .md
files)!
This simple docs structure:
docs
βββ image.en.png
βββ image.fr.png
βββ index.fr.md
βββ index.md
Will generate this site tree:
site
βββ fr
β βββ image.png
β βββ index.html
βββ image.png
βββ index.html
Which means that the image.png
and its fr/image.png
localized counterpart
can be referenced the same way as ![my image](image.png)
on both index.md
and index.fr.md
!
Using the nav_translations
configuration option, you can translate all your
navigation titles easily.
Translations are applied to all titles so you only need to provide a given translation once and it will be used to translate all the sections, links and pages which share the same title.
This example will translate any navigation item title from Topic1 to Sujet1 on the French version of the documentation:
plugins:
- i18n:
default_language: en
languages:
en: english
fr: français
nav_translations:
fr:
Topic1: Sujet1
Topic2: Sujet2
If you enabled the search
plugin embedded with MkDocs, this plugin will
automatically populate its lang
option with the the configured languages
as long as they are supported by lunr.
This means that your search results can't be contextual to the language you are currently browsing.
The mkdocs-static-i18n
plugin will try to be smart and deduplicate the
pages from the default_language
so that search results are not polluted.
This is because the MkDocs search
plugin is hardcoded in the themes
javascript sources so there can only be one search index for the whole
build.
This plugin is compatible with the following mkdocs plugins:
- MkDocs Material: the
search
plugin text will be switched automatically to the right language depending on the version you're browsing and thelanguage selector
will automatically be setup for you (requires mkdocs-material>=7.1.0) - MkDocs Awesome Pages Plugin: the page ordering is preserved on the language specific versions of your site
Starting version 7.1.0, mkdocs-material supports a site language selector configuration.
The mkdocs-static-i18n
plugin will detect if you're using mkdocs-material
and, if its version is at least 7.1.0
, will enable and configure the site language selector automatically for you unless you specified your own extra.alternate
configuration!
If you wish to disable that feature, simply set the material_alternate
option to false
:
plugins:
- i18n:
default_language: en
languages:
en: English
fr: Français
material_alternate: false
Let's take mkdocs-material
as an example and say we would like to add two buttons to allow our visitors to switch to their preferred language.
The following explanation was showcased in the demo website up to 0.7 so you can find the files here:
We need to add a custom_dir
to our theme
configuration:
theme:
name: material
custom_dir: theme_overrides
Then override the header.html
to insert something like:
{% if "i18n" in config.plugins %}
<div style="margin-left: 10px; margin-right: 10px;">
{% include "partials/i18n_languages.html" %}
</div>
{% endif %}
And add a i18n_languages.html
that could look like this:
{% for lang, display in config.plugins.i18n.config.languages.items() -%}
<div style="display: inline-block; margin-right:5px;"><a href="/{{ lang }}/">{{ display }}</a></div>
{% endfor %}
The resulting files should be placed like this:
theme_overrides
βββ partials
βββ header.html
βββ i18n_languages.html
Feel free to ask questions, enhancements and to contribute to this project!