Localization with jekyll
Do you want to create a multilingual blog with jekyll? Here’s an easy way to setup jekyll to have content in multiple languages.
Create localized string data file
Create a folder named _data
if you don’t already have one. Inside that folder, create a localization data file and name it messages.yml
.
mkdir _data
touch messages.yml
Edit messages.yml
and add localized strings. For the moment, I will just create a simple phrase and 2 localized strings in English and Vietnamese for testing purpose.
locales:
en:
example: "example"
vn:
example: "Ví dụ"
Display localized strings on post/page
Now you need to capture the locale of the current page. You can do it either by capturing the url (if you organize posts by folders of language’s name) or from the page variable. To make it easy in this port, i will use the current page’s locale variable; if not specified then default to ‘en’.
locale: "vn"
Get the localized string with this syntax
{{ site.data.messages.locales[locale].example }}
And that’s it. Go back and add more localized strings, update templates and publish changes. Your website is now multilingual.
To make it even more visitor-friendly, you can create a separate RSS feed for each one of the language.
Alternatively, you can use jekyll-multiple-languages-plugin
1, though I’m not a big fan of using plugin when not I don’t really need to.
-
http://rubydoc.info/gems/jekyll-multiple-languages-plugin/1.2.5/frames ↩
My favorite tiling window manager for OS X
The problem of window manager has been with us ever since GUI and multitasking were introduced. Despite being considered as a most modern OS, OS X failed short when it comes to window manager, especially when compared with Linux. I’ve tried many so-called tiling window managers for OS X. All have failed for me so far but Amethyst.
To name a fews that I’ve tried: SizeUp, Spectacle, DoublePane, Slate, BetterSnapTool and some others… Most of them are not tiling but just simple window managers.
I’ve tried Amethyst before but it was not stable enough for daily usage at the time. I like the concept every much though. I later settled on SizeUp and Witch combo for window manager. They suck. But they suck the least at the time. And most importantly, it wasn’t really tiling at all.
About Amethyst
Tiling window manager for OS X similar to xmonad. Was originally written as an alternative to fjolnir’s awesome xnomad but written in pure Objective-C. It’s expanded to include some more features like Spaces support not reliant on fragile private APIs.
A quick screencast to show basic features of Amethyst
Getting started with Amethyst
Basic usage of Amethyst is very well-covered in its documentation on GitHub. I won’t go into details here. Some commonly used shortcuts are:
-
mod1
-option + shift
-
mod2
-ctrl + option + shift
-
mod1 + space
— cycle to next layout -
mod1 + j
- focus the next window counterclockwise -
mod1 + k
- focus the next window clockwise -
mod1 + return
- swap the focused window with the main window -
mod1 + h
- shrink the main pane -
mod1 + l
- expand the main pane
That’re probably all you need to know to get started with Amethyst. Go figure some more when you’re familiar with the new tool. All of them are configurable in .amethyst
configuration file in your home directory.
Amethyst is probably the best tiling window manager for OS X right now. It’s simple, intuitive and very lightweight with a low learning curve. You don’t have to learn a whole lot of new shortcuts to make the best out of Amethyst. It’s currently the top app on my software recommendation list.
Post scheduling with jekyll
First, update your _config.yml
and set future
to false. By doing this, jekyll will not publish any post with future date.
future: false
Setup a cronjob to check and rebuild the site if there’re posts to be published. Since I already setup a hook on post-receive
(trigger on receving a git push) to rebuild the site, I’m going to set a cronjob to execute this script instead of writing something new. The content of the post-receive
looks like this.
# post-receive
#!/bin/bash -l
GIT_REPO=$HOME/repos/myblog.git
TMP_GIT_CLONE=$HOME/tmp/git/myblog
PUBLIC_WWW=/var/www/myblog
git clone $GIT_REPO $TMP_GIT_CLONE
jekyll build --source $TMP_GIT_CLONE --destination $PUBLIC_WWW
rm -Rf $TMP_GIT_CLONE
exit
Cronjob that execute post-receive
every hour at 0 minute, everyday.
@hourly /path/to/my/post-receive
The only downside of this is you need to be able to setup cronjob. GitHub Pages and shared hostings are probably not going to work in this case. You will need to verify this yourself.
How to setup Discourse local dev environment on OS X
I find this the easiest way to install Discourse on OS X for local development purpose. The idea is this: you install Ubuntu as a VM and setup Discourse on top of that.
Install Vagrant
Setup Vagrant is as easy as double click the installer and a couple of next click. I have a license for Parallels 9 so I use Parallels as default provider. You can use VMWare if you own one or VirtualBox for free if you don’t feel like paying.
I use puphpet’s Ubuntu 14.04 x64 as base box but literally, anything Ubuntu 14.04 would work. Ubuntu 14.04 is recommended version by Discourse.
You can use PuPHPet online GUI configurator to create a configuration of your own.
vagrant plugin install vagrant-parallels
mkdir discourse-local
cd discourse-local
vagrant init puphpet/ubuntu1404-x64
vagrant up --provider=parallels
vagrant ssh
Install Discourse with Docker
Follow this tutorial on Discourse Meta to setup Discourse on your Vagrant box.
Discourse should be up and running on your Vagrant box’s IP address after this.
jekyll full-text search without jQuery or plugin
I did a quick search for full-text search solutions for jekyll (or any static websites). A notable fews have come up in search result:
-
index_tank
lunr-js-search
A quick look at the plugin’s dependency, I give up right away even though I only need that on search page. For the very same reason I opted for jekyll - a static site generator, I want my site to load as fast as possible. Adding a bunch of dependencies like that is against the purpose. I rather go for DuckDuckGo as I’m currently doing.
Dependencies for the jQuery plugin are as follows.
- jQuery
- lunr.js
- Mustache.js
- date.format.js
- URI.js
index_tank
Too bad the service is no longer available.
tapir
The most decent service I found so far. You sign up, add your feed URL so that the service can start indexing your website, add jQuery and tapir.js
and you’re good to go.
Search API:
api/1/search.json?token=******&query=*****
/api/1/search.json?token=******&query=*****&callback=myCallback
tapir.js
looks like a pretty short and simple js file. Adding jQuery dependency on it, is totally overkill.
Exercise for next week: I’m going to replace DuckDuckGo search with Tapir’s search in a few days once I’m done converting Tapir’s jQuery plugin to a pure js solution.
We’re on track to roll out SSL for all CloudFlare customers by mid-October. When we do, the number of sites that support HTTPS on the Internet will more than double. That they’ll also rank a bit higher is pretty cool too.
CloudFlare is the coolest free CDN option out there. They responds so quick to the new Google’s HTTPS as a ranking signal.
Make your jekyll blog a little bit more SEO-friendly
Content is the king but making the site a bit more SEO-friendly (or should I say Google-friendly?) doesn’t hurt.
Load speed
Relevant link: Optimize the hell out of your website for PageSpeed.
Sitemap
Help Google’s bots crawl your site better. jekyll provides it as a plugin.
Structure data markup
Use Google’s structure data markup helper to generate structure data markup code. Use structure data testing tool to verify it afterward.
SSL
Google recently announced that they are taking HTTPS as a ranking signal. StartSSL offers free SSL that is included in root SSL of most major browers. CloudFlare is also going to offer free-SSL to all customers (mid-October). I’m going to wait for CloudFlare a bit since I’m already using CloudFlare for this blog.
jekyll plugin directory
Another attempt at regular blogging
I believe blogging help me learn better. In order to write about a subject, first I have to understand it throughly. Blogging is a way to documentating all your thought, your understanding into words.
Many people I talked with afraid of being wrong on the Internet. Don’t be. I do it all the time. I learnt a lot from the feedbacks.
If the feedback is right, you then learn something new, which is great. That’s the whole point, right!
If you’re wrong, please don’t get offended. A feedback could be wrong but it will also help you understand the subject better and get better at defending your view. Either way, it helps.
Actually, being wrong may actually speed up the learning process.
“The best way to get the right answer on the Internet is not to ask a question, it’s to post the wrong answer.”
You will be surprised at number of people can’t wait to prove you wrong.
Paginated post plugin for jekyll
I was wondering if anyone has created one like this before and stumbled across this issue on octopress
repo. imathis came up with this proposition for paginated post.
-
The primary page would be the standard post url.
-
Successive pages would be at
post-url/2/index.html
, etc. -
The atom feed will still show the full un-broken post.
-
A unified post will live at
post-url/all/index.html
containing a print-friendly, un-broken version of the post. -
Pagination at the bottom will like to each page followed by a link to
post-url/all/
. -
Posts will have paginate: true in their YAML header to enable this feature.
-
Posts will be broken up by html comments like
<!--page-->
. -
The un-broken post will add visual page divisions, probably an
<hr>
. -
There will be a way to direct read-later services (like Instapaper) to the un-broken post page.
I don’t actually need this plugin as my posts are mostly short posts but I will take this as a fun exercise over this weekend or next. The plugin will be available on GitHub later.