/ bjvxlx_util / load_localization.lua
load_localization.lua
 1  --[[ load_localization.lua
 2  Provides a function for loading server-prelocalized text files,
 3  as an alternative and companion to the vanilla locale system,
 4  more geared toward very long strings which would be impractical to specify
 5  in translation files. The function expects server-prelocalized text files
 6  to be located in a directory `[modpath]/locale/[language code]`, e.g.
 7  `.minetest/mods/my_mod/locale/en`. ]]
 8  
 9  local util = bjvxlx.util
10  
11  local function load_localization(fname, lang)
12      local fin = assert(io.open(("%s/locale/%s/%s"):format(
13          mod.modpath, lang, fname
14      ), "r"))
15      local ok, data = pcall(fin.read, fin, "*all")
16      fin:close()
17      if ok then
18          return data
19      else
20          local err = data
21          error(err)
22      end
23  end
24  
25  --[[ bjvxlx.*.load_localization(fname, playername)
26  Loads `fname` from the mod's locale/[language code] directory,
27  selecting [language code] based on player `playername`'s preference. ]]
28  function util.per_mod.load_localization(mod)
29      return function (fname, playername)
30          local lang = minetest.get_player_information(playername)
31          lang = lang and lang.language
32          lang = lang or "en"
33          lang = (lang == "" and "en") or lang
34          local ok, data = pcall(load_localization, fname, lang)
35          if ok then
36              return data
37          elseif lang == "en" then
38              local err = data
39              error(("file locale/en/%s could not be read: %s"):format(
40                  fname, err
41              ))
42          else
43              local err = data
44              ok, data = pcall(load_localization, fname, "en")
45              if ok then
46                  return mod.translate(data)
47              else
48                  local err2 = data
49                  error((
50                      "neither file locale/%s/%s " ..
51                      "nor fallback file locale/en/%s " ..
52                      "could be read: %s; %s"
53                  ):format(lang, fname, fname, err, err2))
54              end
55          end
56      end
57  end
58  
59  util.reregister_all_mods()