intllib = { };

local strings = { };

local INTLLIB_DEBUG = true;

local LANG = minetest.setting_get("language") or os.getenv("LANG") or "en";
LANG = LANG:sub(1, 2);

local TRACE;

if (INTLLIB_DEBUG) then
    TRACE = function ( s )
        print("*** DEBUG: "..s);
    end
else
    TRACE = function ( ) end
end

local repr2esc = {
    ["n"] = "\n";
    ["r"] = "";
    ["t"] = "\t";
    ["\\"] = "\\";
    ["\""] = "\"";
};

local esc2repr = {
    ["\n"] = "\\n";
    ["\r"] = "";
    ["\t"] = "\\t";
    ["\\"] = "\\\\";
    ["\\\""] = "\"";
};

local function parse ( s )
    return s:gsub("\\([nrt\"\'\\\\])", function ( c )
        return (repr2esc[c] or c);
    end);
end

local function repr ( s )
    return s:gsub("[\n\t\"\'\\\\]", function ( c )
        return (esc2repr[c] or c);
    end);
end

local function do_load_strings ( f )
    local msgstr = { };
    for line in f:lines() do
        line = line:trim();
        if ((line ~= "") and (line:sub(1, 1) ~= "#")) then
            local pos = line:find("=", 1, true);
            while (pos and (line:sub(pos - 1, pos - 1) == "\\")) do
                local pos = line:find("=", pos + 1, true);
            end
            if (pos) then
                local msgid = line:sub(1, pos - 1):trim();
                local str = line:sub(pos + 1):trim();
                msgstr[msgid] = parse(str);
            end
        end
    end
    return msgstr;
end

function load_strings ( modname, lang )
    lang = lang or LANG;
    local f, e = io.open(minetest.get_modpath(modname).."/locale/"..lang..".txt");
    if (not f) then
        f, e = io.open(minetest.get_modpath("intllib").."/locale/"..modname.."/"..lang..".txt");
        if (not f) then
            return nil;
        end
    end
    local strings;
    strings = do_load_strings(f);
    f:close();
    return strings;
end

local getters = { };

function intllib.Getter ( modname )
    if (not modname) then modname = minetest.get_current_modname(); end
    if (not getters[modname]) then 
        local msgstr = load_strings(modname, lang) or { };
        getters[modname] = function ( s )
            return msgstr[repr(s)] or s;
        end;
    end
    return getters[modname];
end

function intllib.get_current_language ( )
    return LANG;
end