Présentation
Il s’agit de traduire les retours d’un script Lua dans la langue de l’utilisateur.
Nous montrerons un début de piste qui permet d’utiliser des fichiers mo, issus de gettext.
Exemple de code contenant les fonctions nécessaires et un test
Script trouvé sur le wiki lua-users.org. Le mérite de l’existence du script est à donner à J.Jorgen von Bargen (comme décrit dans le code).
#!/usr/bin/env lua
-----------------------------------------------------------
-- load an mo file and return a lua table
-- @param mo_file name of the file to load
-- @return table on success
-- @return nil,string on failure
-- @copyright J.Jorgen von Bargen
-- @licence I provide this as public domain
-- @see http://www.gnu.org/software/hello/manual/gettext/MO-Files.html
-----------------------------------------------------------
function load_mo_file(mo_file)
--------------------------------
-- open file and read data
--------------------------------
local fd,err=io.open(mo_file,"rb")
if not fd then return nil,err end
local mo_data=fd:read("*all")
fd:close()
--------------------------------
-- precache some functions
--------------------------------
local byte=string.byte
local sub=string.sub
--------------------------------
-- check format
--------------------------------
local peek_long --localize
local magic=sub(mo_data,1,4)
-- intel magic 0xde120495
if magic=="\222\018\004\149" then
peek_long=function(offs)
local a,b,c,d=byte(mo_data,offs+1,offs+4)
return ((d*256+c)*256+b)*256+a
end
-- motorola magic = 0x950412de
elseif magic=="\149\004\018\222" then
peek_long=function(offs)
local a,b,c,d=byte(mo_data,offs+1,offs+4)
return ((a*256+b)*256+c)*256+d
end
else
return nil,"no valid mo-file"
end
--------------------------------
-- version
--------------------------------
local V=peek_long(4)
if V~=0 then
return nul,"unsupported version"
end
------------------------------
-- get number of offsets of table
------------------------------
local N,O,T=peek_long(8),peek_long(12),peek_long(16)
------------------------------
-- traverse and get strings
------------------------------
local hash={}
for nstr=1,N do
local ol,oo=peek_long(O),peek_long(O+4) O=O+8
local tl,to=peek_long(T),peek_long(T+4) T=T+8
hash[sub(mo_data,oo+1,oo+ol)]=sub(mo_data,to+1,to+tl)
end
return function(text)
return hash[text] or text
end
end
-- Create a function named '_' (this is not a smiley...)
_=assert(load_mo_file("messages.mo"))
print (_('other'))
Le programme demande un fichier nommé messages.mo, pour le générer, voici les étapes :
- enregistrez le fichier précédent avec une dénomination comme test_i18n.lua
- parcourir le fichier pour extraire les chaînes à traduire (note: xgettext ne supporte pas Lua, avec Python ça semble fonctionner) :
xgettext -L python test_i18n.lua --from-code=UTF-8
- un fichier messages.po a été crée. Ouvrez-le et changez la chaîne pour quelque chose comme :
msgid "other"
msgstr "autre"
- on le transforme en fichier .mo :
msgfmt messages.po -cv -o messages.mo
Le fichier messages.mo nécessaire pour notre programme est donc crée. Il ne reste plus qu’à l’utiliser en lançant le fichier lua :
lua test_i18n.lua
Astuce : Pour des chaînes formatées, dans le code Lua il suffit de faire quelque chose qui ressemble à ce qui suit.
string.format(_('Ma phrase avec une variable: %s.'), var)
Il suffit ensuite de laisser %s dans la chaîne traduite.
Lien : La fonction chaîne en Lua