97 lines
3.4 KiB
Lua
97 lines
3.4 KiB
Lua
-- This scrips extracts all text messages for ZeroBrane Studio and generates
|
|
-- a file that can be used to provide translation to a particular language.
|
|
-- The name of the file -- ll-cc.lua -- has two segments:
|
|
-- ll (mandatory) -- two letter [language code](http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes);
|
|
-- cc (optional) -- two letter [country code](http://en.wikipedia.org/wiki/ISO_3166-1#Officially_assigned_code_elements).
|
|
|
|
-- You can generate an empty file with all messages by running:
|
|
-- > bin\lua.exe build/messages.lua
|
|
-- You can also update an existing file with new messages by running:
|
|
-- > bin\lua.exe build/messages.lua cfg/i18n/ru.lua
|
|
|
|
-- store `print` function as it's modified by wxlua and LuaJIT doesn't like
|
|
-- what wxlua has done in that function.
|
|
local print = print
|
|
|
|
local iswindows = os.getenv('WINDIR') or (os.getenv('OS') or ''):match('[Ww]indows')
|
|
if iswindows or not pcall(require, "wx") then
|
|
package.cpath = (iswindows and 'bin/?.dll;' or 'bin/lib?.dylib;') .. package.cpath
|
|
end
|
|
|
|
require "wx"
|
|
|
|
function FileSysGet(dir,spec)
|
|
local content = {}
|
|
local browse = wx.wxFileSystem()
|
|
local cwd = wx.wxGetCwd()
|
|
if not wx.wxFileName(dir):DirExists() then return content end
|
|
local f = browse:FindFirst(dir,spec)
|
|
while #f>0 do
|
|
if f:match("^file:") then -- remove file: protocol (wx2.9+)
|
|
f = f:gsub(iswindows and "^file:/?" or "^file:","")
|
|
:gsub('%%(%x%x)', function(n) return string.char(tonumber(n, 16)) end)
|
|
end
|
|
-- wx2.9+ return absolute path here instead of expected relative; fix it
|
|
if wx.wxIsAbsolutePath(f) then
|
|
local relative = wx.wxFileName(f)
|
|
relative:MakeRelativeTo(cwd)
|
|
f = relative:GetFullPath()
|
|
end
|
|
table.insert(content, f)
|
|
f = browse:FindNext()
|
|
end
|
|
return content
|
|
end
|
|
|
|
function FileRead(file)
|
|
local f = wx.wxFile(file, wx.wxFile.read)
|
|
if not f:IsOpened() then
|
|
error("Can't open file '"..file.."': "..wx.wxSysErrorMsg()) end
|
|
local _, content = f:Read(f:Length())
|
|
f:Close()
|
|
return content
|
|
end
|
|
|
|
local file = ... -- pass an existing file name as a parameter
|
|
local messages = {}
|
|
for _, mask in ipairs({"zbstudio/*.lua", "src/main.lua", "src/editor/*.lua"}) do
|
|
for _, file in ipairs(FileSysGet(mask, wx.wxFILE)) do
|
|
local content = FileRead(file)
|
|
for msg in content:gmatch("[^%w]TR(%b())") do
|
|
-- remove brackets aroung ("foo")
|
|
-- extract message from ("foo", count)
|
|
msg = msg:gsub("^%(", ""):gsub("%)$", ""):gsub([[(["']), .+]], "%1")
|
|
messages[msg] = messages[msg] or {}
|
|
messages[msg][file] = (messages[msg][file] or 0) + 1
|
|
end
|
|
end
|
|
end
|
|
|
|
local existing = {}
|
|
if file then
|
|
local content = FileRead(file)
|
|
for msg, translation in content:gmatch("%s*%[([^%]]+)%]%s*=%s*([^\010\013]+)") do
|
|
if not translation:find('^nil') then existing[tonumber(msg) or msg] = translation end
|
|
end
|
|
end
|
|
|
|
local plural = existing[0] and (" [0] = "..existing[0].."\n") or ""
|
|
existing[0] = nil
|
|
|
|
local msgs = {}
|
|
for m, files in pairs(messages) do
|
|
local str = " ["..m.."] = "..(existing[m] or 'nil, --')
|
|
str = str:gsub(" %-%-.*$", "").." -- "
|
|
for f in pairs(files) do str = str .. f .. ", " end
|
|
msgs[#msgs+1] = str:gsub(", $", "")
|
|
existing[m] = nil -- remove from the list of existing elements
|
|
end
|
|
|
|
table.sort(msgs)
|
|
print("return {\n"..plural..table.concat(msgs, "\n").."\n}")
|
|
if next(existing) then
|
|
local str = "-- no match found for the following elements: "
|
|
for msg in pairs(existing) do str = str .. msg .. ", " end
|
|
print((str:gsub(", $", "")))
|
|
end
|