diff --git a/README.txt b/README.txt index b2cd5b8..4fc43cd 100644 --- a/README.txt +++ b/README.txt @@ -15,7 +15,14 @@ it at the beginning of your source file(s): if minetest.get_modpath("intllib") then S = intllib.Getter() else + -- If you don't use insertions (@1, @2, etc) you can use this: S = function(s) return s end + + -- If you use insertions, but not insertion escapes this will work: + S = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end + + -- Use this if you require full functionality + S = function(s,a,...)if a==nil then return s end a={a,...}return s:gsub("(@?)@(%(?)(%d+)(%)?)",function(e,o,n,c)if e==""then return a[tonumber(n)]..(o==""and c or"")else return"@"..o..n..c end end) end end You will also need to optionally depend on intllib, to do so add "intllib?" to diff --git a/init.lua b/init.lua index 62a8f51..3712bea 100644 --- a/init.lua +++ b/init.lua @@ -1,4 +1,3 @@ - -- Support the old multi-load method intllib = intllib or {} @@ -6,7 +5,6 @@ local MP = minetest.get_modpath("intllib") dofile(MP.."/lib.lua") -local strings = {} local LANG = minetest.setting_get("language") if not (LANG and (LANG ~= "")) then LANG = os.getenv("LANG") end @@ -18,37 +16,59 @@ intllib.getters = intllib.getters or {} intllib.strings = {} + local function noop_getter(s) return s end + +local INS_CHAR = intllib.INSERTION_CHAR +local insertion_pattern = "("..INS_CHAR.."?)"..INS_CHAR.."(%(?)(%d+)(%)?)" + +local function make_getter(strs) + return function(s, ...) + local str = strs[s] + if not str or str == "" then + return s + end + if select("#", ...) == 0 then + return str + end + local args = {...} + local str = str:gsub(insertion_pattern, function(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return INS_CHAR..open..num..close + end + end) + return str + end +end + + function intllib.Getter(modname) modname = modname or minetest.get_current_modname() - if not intllib.getters[modname] then - local modpath = minetest.get_modpath(modname) - if modpath then - local filename = modpath.."/locale/"..LANG..".txt" - local msgstr = intllib.load_strings(filename) - intllib.strings[modname] = msgstr or false - if msgstr then - intllib.getters[modname] = function (s) - if msgstr[s] and msgstr[s] ~= "" then - return msgstr[s] - end - return s - end - else - intllib.getters[modname] = noop_getter - end + if not intllib.getters[modname] then + local msgstr = intllib.get_strings(modname) + if msgstr then + intllib.getters[modname] = make_getter(msgstr) + else + intllib.getters[modname] = noop_getter end end return intllib.getters[modname] end + function intllib.get_strings(modname) modname = modname or minetest.get_current_modname() local msgstr = intllib.strings[modname] - if msgstr == nil then + if not msgstr then local modpath = minetest.get_modpath(modname) msgstr = intllib.load_strings(modpath.."/locale/"..LANG..".txt") intllib.strings[modname] = msgstr diff --git a/lib.lua b/lib.lua index b3f183b..2349de4 100644 --- a/lib.lua +++ b/lib.lua @@ -1,19 +1,37 @@ intllib = intllib or {} +local INS_CHAR = "@" +intllib.INSERTION_CHAR = INS_CHAR + local escapes = { ["\\"] = "\\", ["n"] = "\n", + [INS_CHAR] = INS_CHAR..INS_CHAR, } -local function unescape(s) - return s:gsub("([\\]?)\\(.)", function(slash, what) - if slash and (slash ~= "") then - return "\\"..what +local function unescape(str) + local parts = {} + local n = 1 + local function add(s) + parts[n] = s + n = n + 1 + end + + local start = 1 + while true do + local pos = str:find("\\", start, true) + if pos then + add(str:sub(start, pos - 1)) else - return escapes[what] or what + add(str:sub(start)) + break end - end) + local c = str:sub(pos + 1, pos + 1) + add(escapes[c] or c) + start = pos + 2 + end + return table.concat(parts) end local function find_eq(s) diff --git a/tools/findtext.lua b/tools/findtext.lua index 63137e0..b6360cb 100755 --- a/tools/findtext.lua +++ b/tools/findtext.lua @@ -109,7 +109,7 @@ for _, file in ipairs(inputs) do local infile, e = io.open(file, "r") if infile then for line in infile:lines() do - for s in line:gmatch('S%("([^"]*)"%)') do + for s in line:gmatch('S%("([^"]*)"') do table.insert(messages, s) end end