Lua MO files parser translates Lapis site
11 May 2015The parser for MO files was packaged for LuaRocks and uploaded to LuaRocks site as rock “mo”. It is available for installation under terms of MIT license.
$ luarocks install mo
MO file is binary format of GNU gettext used to
store translations. It is created from PO file using tool
msgfmt
. It can be used to translate an application or a site
from English to other language.
J.Jørgen von Bargen sent the code of parser to
lua-l mailing list on Apr, 01, 2010. I have changed
behavior of the function: now it returns translating function
in case of success and function(x) return x end
in case of
errors. The code was covered with unit tests with coverage
100%. Unit tests are written using unit testing
framework Busted.
Where mo.lua is used
I use this package in code of my site kodomoquiz,
based on Lapis. “mo” is used in many files of
kodomoquiz, e.g. in file app.lua (as variable _
).
Let us translate some Lua project into Russian.
$ xgettext -p ru -s -j --language=Lua *.lua --from-code utf-8
This command creates (or adds to) file ru/messages.po
. It
finds texts like _("text")
in source files and adds them to
.po
file.
There are a lot of programs to translate .po file. One of them is poedit.
To compile .po
to .mo
, run the following command:
$ msgfmt ru/messages.po -o ru/messages.mo
Module mo.lua is used to parse .mo
file from Lua:
-- load mo.lua
mo = require 'mo'
-- load .mo file with translations
-- returns translating function on success
-- returns nil, 'error message' on failure
_ = mo('russian.mo')
-- translate from English into Russian
print(_("hello")) -- prints "привет"
-- the function returns its argument if it can't translate it
print(_("unknown phrase")) -- prints "unknown phrase"