You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
297 lines
6.7 KiB
297 lines
6.7 KiB
|
|
caption="Add locale to NI-Image"
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
n = neutrino()
|
|
locales = {}
|
|
|
|
chooser = nil
|
|
infobox = nil
|
|
|
|
tmp_dir = "/tmp/add-locale.data"
|
|
user_agent = "\"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0\""
|
|
wget_cmd = "wget -q -U " .. user_agent .. " -O "
|
|
remote_dir = "http://neutrino-images.de/neutrino-images/locale"
|
|
locale_dir = "/var/tuxbox/locale"
|
|
icons_dir = "/var/tuxbox/icons"
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
function trim(s)
|
|
return (s:gsub("^%s*(.-)%s*$", "%1"))
|
|
end
|
|
|
|
function capitalize(s)
|
|
return (s:gsub("^%l", string.upper))
|
|
end
|
|
|
|
function file_exists(name)
|
|
local f = io.open(name, "r")
|
|
if f ~= nil then
|
|
io.close(f)
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end
|
|
|
|
function delay(timeout)
|
|
local timeout = timeout or 2
|
|
local i = 0
|
|
repeat
|
|
i = i + 1
|
|
msg, data = n:GetInput(500)
|
|
until msg == RC.ok or msg == RC.home or i == (timeout * 2)
|
|
end
|
|
|
|
function cleanup()
|
|
os.execute("rm -rf " .. tmp_dir)
|
|
end
|
|
|
|
function init()
|
|
cleanup()
|
|
os.execute("mkdir -p " .. tmp_dir)
|
|
local tmp_data = tmp_dir .. "/index.html"
|
|
os.execute(wget_cmd .. tmp_data .. " '" .. remote_dir .. "'");
|
|
|
|
local fp = io.open(tmp_data, "r")
|
|
if fp == nil then
|
|
error("Error opening file '" .. tmp_data .. "'.")
|
|
end
|
|
for line in fp:lines() do
|
|
local match = string.find(line, "<a href=\".*.locale\">")
|
|
if match ~= nil then
|
|
match = line:gsub("^.*\"(.-).locale\".*$", "%1")
|
|
table.insert(locales, match)
|
|
end
|
|
end
|
|
fp:close()
|
|
|
|
os.execute("mkdir -p " .. locale_dir)
|
|
os.execute("mkdir -p " .. icons_dir)
|
|
end
|
|
|
|
function is_used(locale)
|
|
local ret = false
|
|
|
|
local conf = io.open("/var/tuxbox/config/neutrino.conf", "r")
|
|
if conf then
|
|
for line in conf:lines() do
|
|
local key, val = line:match("^([^=#]+)=([^\n]*)")
|
|
if (key) then
|
|
if key == "language" then
|
|
if (val == locale) then
|
|
ret = true
|
|
end
|
|
end
|
|
end
|
|
end
|
|
conf:close()
|
|
end
|
|
|
|
return ret
|
|
end
|
|
|
|
function get_icon(locale)
|
|
local icon = "dummy"
|
|
if file_exists(icons_dir .. "/" .. locale .. ".png") then
|
|
icon = locale
|
|
end
|
|
return icon
|
|
end
|
|
|
|
function paint_infobox(locale, text)
|
|
hide_menu()
|
|
|
|
local dx = n:scale2Res(450)
|
|
local dy = n:scale2Res(150)
|
|
local x = SCREEN.OFF_X + (((SCREEN.END_X - SCREEN.OFF_X) - dx) / 2)
|
|
local y = SCREEN.OFF_Y + (((SCREEN.END_Y - SCREEN.OFF_Y) - dy) / 2)
|
|
|
|
infobox = cwindow.new{x=x, y=y, dx=dx, dy=dy, title=capitalize(locale), icon=get_icon(locale), has_shadow=true, show_footer=true}
|
|
local t = ctext.new {
|
|
parent=infobox,
|
|
x=n:scale2Res(10),
|
|
y=n:scale2Res(10),
|
|
dx=dx-n:scale2Res(2*10),
|
|
dy=dy-infobox:headerHeight()-n:scale2Res(2*10),
|
|
text=text,
|
|
font_text=FONT.MENU,
|
|
mode="ALIGN_CENTER"
|
|
}
|
|
infobox:paint()
|
|
end
|
|
|
|
function hide_infobox()
|
|
if infobox ~= nil then
|
|
infobox:hide()
|
|
infobox = nil
|
|
end
|
|
end
|
|
|
|
function update(locale)
|
|
paint_infobox(locale, "Updating" .. " \"" .. locale .. "\"")
|
|
download(locale)
|
|
delay(2)
|
|
hide_infobox()
|
|
return MENU_RETURN.EXIT
|
|
end
|
|
|
|
function install(locale)
|
|
paint_infobox(locale, "Installing" .. " \"" .. locale .. "\"")
|
|
download(locale)
|
|
delay(2)
|
|
hide_infobox()
|
|
return MENU_RETURN.EXIT
|
|
end
|
|
|
|
function remove(locale)
|
|
paint_infobox(locale, "Removing" .. " \"" .. locale .. "\"")
|
|
delete(locale)
|
|
delay(2)
|
|
hide_infobox()
|
|
return MENU_RETURN.EXIT
|
|
end
|
|
|
|
function download(locale)
|
|
local ll = locale_dir .. "/" .. locale .. ".locale"
|
|
local lr = remote_dir .. "/" .. locale .. ".locale"
|
|
os.execute(wget_cmd .. ll .. " '" .. lr .. "'");
|
|
if not file_exists(ll) then
|
|
showhint("Error", "Download failed: " .. locale .. ".locale", "error")
|
|
return MENU_RETURN.EXIT
|
|
end
|
|
|
|
local il = icons_dir .. "/" .. locale .. ".png"
|
|
local ir = remote_dir .. "/" .. locale .. ".png"
|
|
os.execute(wget_cmd .. il .. " '" .. ir .. "'");
|
|
if not file_exists(il) then
|
|
showhint("Error", "Download failed: " .. locale .. ".png", "error")
|
|
return MENU_RETURN.EXIT
|
|
end
|
|
end
|
|
|
|
function delete(locale)
|
|
local ll = locale_dir .. "/" .. locale .. ".locale"
|
|
if file_exists(ll) then
|
|
assert(os.remove(ll), "Error removing file '" .. ll .. "'.")
|
|
end
|
|
local il = icons_dir .. "/" .. locale .. ".png"
|
|
if file_exists(il) then
|
|
assert(os.remove(il), "Error removing file '" .. il .. "'.")
|
|
end
|
|
end
|
|
|
|
function w_chooser(locale)
|
|
hide_menu()
|
|
|
|
local dx = n:scale2Res(450)
|
|
local dy = n:scale2Res(150)
|
|
local x = SCREEN.OFF_X + (((SCREEN.END_X - SCREEN.OFF_X) - dx) / 2)
|
|
local y = SCREEN.OFF_Y + (((SCREEN.END_Y - SCREEN.OFF_Y) - dy) / 2)
|
|
|
|
local chooser = cwindow.new{x=x, y=y, dx=dx, dy=dy, title=capitalize(locale), icon=get_icon(locale), has_shadow=true, show_footer=true, btnRed="Remove", btnGreen="Update"}
|
|
ctext.new {
|
|
parent=chooser,
|
|
x=n:scale2Res(10),
|
|
y=n:scale2Res(10),
|
|
dx=dx-n:scale2Res(2*10),
|
|
dy=dy-chooser:headerHeight()-n:scale2Res(2*10),
|
|
text="Remove or update ?",
|
|
font_text=FONT.MENU,
|
|
mode="ALIGN_CENTER"
|
|
}
|
|
chooser:paint()
|
|
|
|
repeat
|
|
msg, data = n:GetInput(500)
|
|
if (msg == RC.red) then
|
|
remove(locale)
|
|
msg = RC.home;
|
|
elseif (msg == RC.ok) or (msg == RC.green) then
|
|
update(locale)
|
|
msg = RC.home;
|
|
end
|
|
until msg == RC.home or msg == RC.setup;
|
|
|
|
chooser:hide()
|
|
chooser = nil
|
|
|
|
if msg == RC.setup then
|
|
repaint_menu = false
|
|
return MENU_RETURN.EXIT_ALL
|
|
end
|
|
return MENU_RETURN.EXIT
|
|
end
|
|
|
|
function showhint(caption, text, icon, timeout)
|
|
local caption = caption or "Info"
|
|
local text = text or ""
|
|
local icon = icon or "information"
|
|
|
|
local h = hintbox.new{caption=caption, text=text, icon=icon}
|
|
h:paint()
|
|
delay(5)
|
|
h:hide()
|
|
end
|
|
|
|
function paint_menu()
|
|
m = menu.new{name=caption, icon="language"}
|
|
m:addKey{directkey=RC.setup, id="setup", action="exit_menu"}
|
|
m:addItem{type="separator"}
|
|
m:addItem{type="forwarder", id="home", action="exit_menu", name="Back", icon="home", directkey=RC.home, hint="Return to previous menu", hint_icon="hint_back"};
|
|
m:addItem{type="separatorline"}
|
|
|
|
for index, locale in pairs(locales) do
|
|
if file_exists(locale_dir .. "/" .. locale .. ".locale") then
|
|
install_or_update = "update"
|
|
action_function = "update"
|
|
if not is_used(locale) then
|
|
action_function = "w_chooser"
|
|
end
|
|
else
|
|
install_or_update = "install"
|
|
action_function = "install"
|
|
end
|
|
|
|
m:addItem{
|
|
type="forwarder",
|
|
action=action_function,
|
|
id=locale,
|
|
icon=get_icon(locale),
|
|
name=capitalize(locale),
|
|
value=capitalize(install_or_update),
|
|
hint=capitalize(install_or_update) .." the language \"" .. capitalize(locale) .. "\"",
|
|
hint_icon="hint_language"
|
|
}
|
|
|
|
end
|
|
|
|
m:exec()
|
|
end
|
|
|
|
function hide_menu()
|
|
if m ~= nil then
|
|
m:hide()
|
|
end
|
|
end
|
|
|
|
function exit_menu(id)
|
|
repaint_menu = false
|
|
if id == "setup" then
|
|
return MENU_RETURN.EXIT_ALL
|
|
end
|
|
return MENU_RETURN.EXIT
|
|
end
|
|
|
|
-- ---------------------------------------------------------------------------
|
|
|
|
init()
|
|
|
|
repaint_menu = true
|
|
while repaint_menu do
|
|
paint_menu()
|
|
end
|
|
|
|
cleanup()
|
|
|