Multi-Lingual Interface With Jekyll
Latest update:
Imagine you have a site in N languages, for example, in English & Ukrainian. The content of articles is different & cannot be auto-translated, but we can ensure that the GUI on each part of the site is localized. All menus, buttons, tooltips, etc can be edited or localized without modifying the app source code.
Let's start with the example.
$ jekyll --version
jekyll 1.2.1
$ jekyll new blog && cd blog && mkdir _plugins
$ for i in en uk
do
(mkdir $i \
&& cd $i && ln -s ../css ../_l* ../_plugins . \
&& cp -r ../*yml ../_posts ../*html .); \
done
$ rm -rf _config.yml _posts index.html
For each section we copied _posts
, _config.yml
& index.html
,
because for each site they all are different, and we symlinked css
&
_layouts
directories because for each site they will be the same.
The site's structure looks like this:
_layouts/
|__ ..
|__ default.html
|__ post.html
_plugins/
|__ ..
css/
|__ ..
|__ main.css
|__ syntax.css
en/
|__ ..
|__ _layouts@ -> ../_layouts/
|__ _plugins@ -> ../_plugins/
|__ _posts/
|__ css@ -> ../css/
|__ _config.yml
|__ index.html
uk/
|__ ..
|__ _layouts@ -> ../_layouts/
|__ _plugins@ -> ../_plugins/
|__ _posts/
|__ css@ -> ../css/
|__ _config.yml
|__ index.html
.gitignore
Now, install jekyll-msgcat:
$ gem install jekyll-msgcat
Create _plugins/req.rb file & add to it 1 line:
require 'jekyll/msgcat'
Add to uk/_config.yml:
msgcat:
locale: uk
# may be 'domain' or 'nearby'
deploy: nearby
Then open _layouts/default.html, find the line
<a class="extra" href="/">home</a>
& replace it with:
<a class="extra" href="/">{{ 'Return to Home' | mc }}</a>
(Quotes are essential.)
As you see, we are using some unknown Liquid filter 'mc'. If you check the uk site
$ (cd uk; jekyll serve)
& go to http://127.0.0.1:4000/, nothing will change, everything would be in English as before. To automatically substitute 'Return to Home' string with something else we need to create a message catalog.
In our case, the message catalog is just a .yaml file:
$ cat uk/_msgcat.yaml
uk:
'Return to Home': На головну сторiнку
What is handy about this is that if the string in the message catalog
isn't provided or if there is no _msgcat.yaml
file at all, the
default English string would be used. Kill jekyll's server & start it
again to test.
Links to Localized Versions
The other problem you may have is how to generate a link from a current page to the same page in other language.
If you choose to host each site on a separate subdomain,
e.g. en.example.com & uk.example.com, set the value of msgcat.deploy
key in site's _config.yml
to domain
. If you like a scheme without
subdomains & prefer example.com/blog/en && example.com/blog/uk, set
the key's value to nearby
.
Make sure you have url
& baseurl
in _config.yml
. In Liquid
templates use cur_page_in_another_locale
filter. For example, in
_layouts/default.html
:
{{ 'en' | cur_page_in_another_locale }}
{{ 'uk' | cur_page_in_another_locale }}
will generate in en site (msgcat.deploy == domain):
<a href='#' class='btn btn-primary btn-xs disabled'>en</a>
<a href='http://uk.example.com/index.html' class='btn btn-primary btn-xs '>uk</a>
or for msgcat.deploy == nearby:
<a href='#' class='btn btn-primary btn-xs disabled'>en</a>
<a href='/blog/uk/index.html' class='btn btn-primary btn-xs '>uk</a>
If you don't like injected names of Bootstrap's CSS classes, use the filter with an empty parameter:
{{ 'en' | cur_page_in_another_locale: "" }}
{{ 'uk' | cur_page_in_another_locale: "" }}
Or provide your own class name(s) instead of the empty string.
Tags: ойті
Authors: ag