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 :

xgettext -L python test_i18n.lua --from-code=UTF-8
msgid "other"
msgstr "autre"
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