/ 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()