From d3c7fa71c03258dd2c4c86e54da6ad8c3135f990 Mon Sep 17 00:00:00 2001 From: blaboing <56389853+blaboing@users.noreply.github.com> Date: Wed, 10 May 2023 21:41:35 +0200 Subject: [PATCH 1/6] Filename seperator setting to fix #54 (#83) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds a filename split seperator setting that lets you choose between old style `_` and `.` because dot is the only char that isn´t allowed in playername but in texturenames. Default value is `_` to keep it compatible with older versions, while `.` offers a solution to fix #54. --- init.lua | 6 ++++++ settingtypes.txt | 3 +++ skinlist.lua | 2 +- skins_updater.lua | 4 ++-- textures/readme.txt | 12 ++++++++++++ updater/update_skins.py | 8 ++++++-- 6 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 settingtypes.txt diff --git a/init.lua b/init.lua index 34e4540..976c014 100644 --- a/init.lua +++ b/init.lua @@ -8,6 +8,12 @@ skins = {} skins.modpath = minetest.get_modpath(minetest.get_current_modname()) skins.default = "character" +-- see skindsdb/textures/readme.txt to avoid playername with underscore problem +skins.fsep = minetest.settings:get("skinsdb_fsep") or "_" +if skins.fsep == "_" then + minetest.log("warning", "skinsdb filename seperator is set to " .. skins.fsep .. ", see skindsdb/textures/readme.txt to avoid problems with playernames containing underscore") +end + dofile(skins.modpath.."/skin_meta_api.lua") dofile(skins.modpath.."/api.lua") dofile(skins.modpath.."/skinlist.lua") diff --git a/settingtypes.txt b/settingtypes.txt new file mode 100644 index 0000000..e47be76 --- /dev/null +++ b/settingtypes.txt @@ -0,0 +1,3 @@ +# texture filename seperator, default "_" +# see skindsdb/textures/readme.txt to avoid playername with underscore problem +skinsdb_fsep (texture filename seperator) enum _ _,. \ No newline at end of file diff --git a/skinlist.lua b/skinlist.lua index bde0ae5..dc8a155 100644 --- a/skinlist.lua +++ b/skinlist.lua @@ -2,7 +2,7 @@ local skins_dir_list = minetest.get_dir_list(skins.modpath.."/textures") for _, fn in pairs(skins_dir_list) do local name, sort_id, is_preview, playername - local nameparts = string.gsub(fn, "[.]", "_"):split("_") + local nameparts = string.gsub(fn, "[.]", skins.fsep):split(skins.fsep) -- check allowed prefix and file extension if (nameparts[1] == 'player' or nameparts[1] == 'character') and diff --git a/skins_updater.lua b/skins_updater.lua index 1e461ed..1b0f565 100644 --- a/skins_updater.lua +++ b/skins_updater.lua @@ -88,7 +88,7 @@ local function safe_single_skin(skin) skin.license } - local name = "character_" .. skin.id + local name = "character" .. skins.fsep .. skin.id -- core.safe_file_write does not work here unsafe_file_write( @@ -101,7 +101,7 @@ local function safe_single_skin(skin) core.decode_base64(skin.img) ) fetch_url(preview_url:format(skin.id), function(preview) - unsafe_file_write(skins_path .. name .. "_preview.png", preview) + unsafe_file_write(skins_path .. name .. skins.fsep .. "preview.png", preview) end) core.log("action", ("%s: Completed skin %s"):format(_ID_, name)) end diff --git a/textures/readme.txt b/textures/readme.txt index 9d0b450..e53e112 100644 --- a/textures/readme.txt +++ b/textures/readme.txt @@ -1,5 +1,17 @@ In this folder the skin files could be placed according the following file naming convention. +skinsdb uses an underscore as default seperator for filename splitting which can cause problems with playernames containing "_", +see https://github.com/minetest-mods/skinsdb/issues/54. +The config setting skinsdb_fsep (texture filename seperator) was added as a workaround which also offers "."(dot) as seperator, +dot is the only character which is allowed in textures but not in playernames. +To keep compatibility with older versions underscore is the default value. + +fresh install: +you should change the seperator to "." to avoid that problem. +existing install: +- change the filenames according to the naming convention with dot as seperator instead of underscore +- change the texture filename seperator in settings or add "skinsdb_fsep = ." to your minetest.conf before starting your server + Public skin available for all users: character_[number-or-name].png diff --git a/updater/update_skins.py b/updater/update_skins.py index 8b760b7..b5ec889 100644 --- a/updater/update_skins.py +++ b/updater/update_skins.py @@ -1,5 +1,9 @@ import sys, requests, base64 +# filename seperator to use, either default "-" or ".". see skinsdb/textures/readme.txt +#fsep = "_" +fsep = "." + download_preview = ( len (sys.argv) > 1 and sys.argv[1] == "with_preview" ) @@ -24,7 +28,7 @@ for json in data["skins"]: # Texture file raw_data = base64.b64decode(json["img"]) - file = open("../textures/character_" + id + ".png", "wb") + file = open("../textures/character" + fsep + id + ".png", "wb") file.write(bytearray(raw_data)) file.close() @@ -44,7 +48,7 @@ for json in data["skins"]: if r2.status_code == 200: # Preview file preview = r2.content - file = open("../textures/character_" + id + "_preview.png", "wb") + file = open("../textures/character_" + id + fsep + "preview.png", "wb") file.write(bytearray(preview)) file.close() else: From 271c10907396ae17853e2d55001f719a5db1f1ba Mon Sep 17 00:00:00 2001 From: wsor4035 <24964441+wsor4035@users.noreply.github.com> Date: Wed, 6 Sep 2023 10:39:11 -0400 Subject: [PATCH 2/6] Replace skinsdb API source (#91) The old API is no longer reachable, thus got replaced. This also removes the obsolete skin preview download because the mod is capable of generating them automatically. Co-authored-by: CallMeDax <142984237+CallMeDax@users.noreply.github.com> --- skins_updater.lua | 8 ++------ updater/update_skins.py | 22 +++------------------- 2 files changed, 5 insertions(+), 25 deletions(-) diff --git a/skins_updater.lua b/skins_updater.lua index 1b0f565..91b9802 100644 --- a/skins_updater.lua +++ b/skins_updater.lua @@ -47,9 +47,8 @@ if #internal.errors > 0 then end -- http://minetest.fensta.bplaced.net/api/apidoku.md -local root_url = "http://minetest.fensta.bplaced.net" -local page_url = root_url .. "/api/v2/get.json.php?getlist&page=%i&outformat=base64" -- [1] = Page# -local preview_url = root_url .. "/skins/1/%i.png" -- [1] = ID +local root_url = "http://skinsdb.terraqueststudios.net" +local page_url = root_url .. "/api/v1/content?client=mod&page=%i" -- [1] = Page# local mod_path = skins.modpath local meta_path = mod_path .. "/meta/" @@ -100,9 +99,6 @@ local function safe_single_skin(skin) skins_path .. name .. ".png", core.decode_base64(skin.img) ) - fetch_url(preview_url:format(skin.id), function(preview) - unsafe_file_write(skins_path .. name .. skins.fsep .. "preview.png", preview) - end) core.log("action", ("%s: Completed skin %s"):format(_ID_, name)) end diff --git a/updater/update_skins.py b/updater/update_skins.py index b5ec889..00249e6 100644 --- a/updater/update_skins.py +++ b/updater/update_skins.py @@ -4,12 +4,11 @@ import sys, requests, base64 #fsep = "_" fsep = "." -download_preview = ( len (sys.argv) > 1 and sys.argv[1] == "with_preview" ) -print("Downloading skins from minetest.fensta.bplaced.net ...") +print("Downloading skins from skinsdb.terraqueststudio.net ...") # Requesting all skins and their raw texture using the API -r = requests.get('http://minetest.fensta.bplaced.net/api/v2/get.json.php?getlist&page=1&per_page=999999999') +r = requests.get('http://skinsdb.terraqueststudios.net/api/v1/content?client=script&page=1&per_page=10000') if r.status_code != 200: sys.exit("Request failed!") @@ -17,10 +16,7 @@ if r.status_code != 200: data = r.json() count = 0 -if download_preview: - print("Writing to file and downloading previews ...") -else: - print("Writing skins") +print("Writing skins") for json in data["skins"]: @@ -42,17 +38,5 @@ for json in data["skins"]: print("Added #%s Name: %s Author: %s License: %s" % (id, name, author, license)) count += 1 - if download_preview: - # Downloading the preview of the skin - r2 = requests.get('http://minetest.fensta.bplaced.net/skins/1/' + id + ".png") - if r2.status_code == 200: - # Preview file - preview = r2.content - file = open("../textures/character_" + id + fsep + "preview.png", "wb") - file.write(bytearray(preview)) - file.close() - else: - print("Failed to download skin preview #" + id) - print("Fetched " + str(count) + " skins!") From 616262de4b24a99fa7a50370e581d4cbd64000bd Mon Sep 17 00:00:00 2001 From: Andrey Andreyevich Bienkowski Date: Sun, 17 Dec 2023 09:05:53 +0000 Subject: [PATCH 3/6] Update instructions for downloading skins (#93) Corrected URL and updater instructions. --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index f53c600..4c5c26b 100644 --- a/README.md +++ b/README.md @@ -20,15 +20,16 @@ This Minetest mod offers changeable player skins with a graphical interface for ## Installing skins -### Download from the [database](http://minetest.fensta.bplaced.net/) +### Download from the [database](https://skinsdb.terraqueststudios.net/) #### Ingame Downloader 1) Get Minetest 5.1.0-dev-cb00632 or newer -2) Start your world -3) Run `/skinsdb_download_skins ` -4) Wait for the Minetest server to shut down -5) Start the server again +2) In the settings menu show advanced options, find the "Developer Options" tab and add "skinsdb" to "Trusted mods" (secure.trusted_mods in minetest.conf) +3) Start your world +4) Run `/skinsdb_download_skins ` +5) Wait for the Minetest server to shut down +6) Start the server again You might want to run `minetest` in a Terminal/Console window to check the log output instantly. From e1cd93747080c607526502dea88d4d106ce076e0 Mon Sep 17 00:00:00 2001 From: Andrey Andreyevich Bienkowski Date: Thu, 21 Dec 2023 16:08:17 +0000 Subject: [PATCH 4/6] Fix typo privat -> private (#94) --- API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/API.md b/API.md index 3cfe77c..acb51d0 100644 --- a/API.md +++ b/API.md @@ -91,7 +91,7 @@ The next metadata keys are filled or/and used interally in skinsdb framework - name - A name for the skin - author - The skin author - license - THe skin texture license - - assignment - (obsolete) is "player:playername" in case the skin is assigned to be privat for a player + - assignment - (obsolete) is "player:playername" in case the skin is assigned to be private for a player - playername - Player assignment for private skin. Set false for skins not usable by all players (like NPC-Skins), true or nothing for all player skins - in_inventory_list - If set to false the skin is not visible in inventory skins selection but can be still applied to the player - _sort_id - Thi skins lists are sorted by this field for output (internal key) From 58739e9f9fc9660ed0a4cd0889782d5b688ae539 Mon Sep 17 00:00:00 2001 From: Jaidyn Ann <10477760+JadedCtrl@users.noreply.github.com> Date: Tue, 2 Jan 2024 21:29:18 -0600 Subject: [PATCH 5/6] Make command parameters translatable --- chatcommands.lua | 2 +- locale/skinsdb.de.tr | 22 +++++++++++----------- locale/skinsdb.fr.tr | 21 +++++++++++---------- locale/skinsdb.ms.tr | 21 +++++++++++---------- locale/skinsdb.pt_BR.tr | 23 +++++++++++------------ locale/skinsdb.ru.tr | 24 +++++++++++------------- locale/skinsdb.uk.tr | 24 +++++++++++------------- locale/skinsdb.zh_CN.tr | 19 +++++++++---------- locale/skinsdb.zh_TW.tr | 20 ++++++++++---------- locale/template.txt | 23 +++++++++++------------ skins_updater.lua | 2 +- 11 files changed, 98 insertions(+), 103 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index 25e43d0..a60c1ca 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -11,7 +11,7 @@ end minetest.register_chatcommand("skinsdb", { - params = "[set] | show [] | list | list private | list public | [ui]", + params = S("[set] | show [] | list | list private | list public | [ui]"), description = S("Show, list or set player's skin"), func = function(name, param) local player = minetest.get_player_by_name(name) diff --git a/locale/skinsdb.de.tr b/locale/skinsdb.de.tr index 8813756..dc15284 100644 --- a/locale/skinsdb.de.tr +++ b/locale/skinsdb.de.tr @@ -1,19 +1,19 @@ # textdomain: skinsdb -# Translation by Xanthin - -Raw texture=Rohtextur -Name=Name -Author=Autor -Change=Wechseln -Page=Seite -License=Lizenz -Description=Beschreibung +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=Anzeigen oder setzen der Spieler-Skins Player not found=Spieler nicht da unknown command=unbekannter Befehl see /help skinsdb for supported parameters=Lese /help für erlaubte Parameter skin set to=Skin ist jetzt invalid skin=unbekannter Skin -unknown parameter=unbekannter Parameter -Skins=Aussehen Requires skin key=Benötigt Skin-Name +unknown parameter=unbekannter Parameter +Raw texture=Rohtextur +Page=Seite +Name=Name +Author=Autor +License=Lizenz + = +Downloads the specified range of skins and shuts down the server= +Change=Wechseln +Skins=Aussehen diff --git a/locale/skinsdb.fr.tr b/locale/skinsdb.fr.tr index 7122d78..5b072b5 100644 --- a/locale/skinsdb.fr.tr +++ b/locale/skinsdb.fr.tr @@ -1,18 +1,19 @@ # textdomain: skinsdb - -Raw texture=Texture -Name=Nom -Author=Auteur -Change=Changer -Page=Page -License=Licence -Description=Description +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=Afficher, lister ou définir le skin du joueur Player not found=Joueur non trouvé unknown command=commande inconnue see /help skinsdb for supported parameters=voir /help skinsdb pour les paramètres supportés skin set to=skin définie sur invalid skin=skin peau invalide +Requires skin key= unknown parameter=paramètre inconnu -unknown skin=skin inconnue - +Raw texture=Texture +Page=Page +Name=Nom +Author=Auteur +License=Licence + = +Downloads the specified range of skins and shuts down the server= +Change=Changer +Skins= diff --git a/locale/skinsdb.ms.tr b/locale/skinsdb.ms.tr index 61eb1a0..02fc27c 100644 --- a/locale/skinsdb.ms.tr +++ b/locale/skinsdb.ms.tr @@ -1,18 +1,19 @@ # textdomain: skinsdb -# Malay translation by muhdnurhidayat - -Raw texture=Tekstur mentah -Name=Nama -Author=Pencipta -Change=Ubah -Page=Halaman -License=Lesen -Description=Keterangan +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=Tunjukkan, senaraikan atau tetapkan kulit pemain Player not found=Pemain tidak dijumpai unknown command=perintah tidak diketahui see /help skinsdb for supported parameters=lihat /help skinsdb untuk parameter yang disokong skin set to=kulit ditetapkan kepada invalid skin=kulit tidak sah +Requires skin key= unknown parameter=parameter tidak diketahui -unknown skin=kulit tidak diketahui +Raw texture=Tekstur mentah +Page=Halaman +Name=Nama +Author=Pencipta +License=Lesen + = +Downloads the specified range of skins and shuts down the server= +Change=Ubah +Skins= diff --git a/locale/skinsdb.pt_BR.tr b/locale/skinsdb.pt_BR.tr index 58700db..d1246e2 100644 --- a/locale/skinsdb.pt_BR.tr +++ b/locale/skinsdb.pt_BR.tr @@ -1,20 +1,19 @@ # textdomain: skinsdb - -Raw texture=Textura crua -Name=Nome -Author=Autor -Change=Mudar -Page=Página -License=Licença -Description=Descrição +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=Mostrar, listar ou definir a skin do jogador Player not found=Jogador não encontrado unknown command=Comando desconhecido see /help skinsdb for supported parameters= consulte /help skinsdb para obter os parâmetros suportados skin set to=Aparência definida para invalid skin=Aparência inválida -unknown parameter=parâmetro desconhecido -unknown skin=Aparência desconhecida -Downloads thespecified range of skins and shuts down the server= Baixa o intervalo especificado de capas e desliga o servidor -Skins=Aparência Requires skin key=Requer chave de aparência +unknown parameter=parâmetro desconhecido +Raw texture=Textura crua +Page=Página +Name=Nome +Author=Autor +License=Licença + = +Downloads the specified range of skins and shuts down the server=Baixa o intervalo especificado de capas e desliga o servidor +Change=Mudar +Skins=Aparência diff --git a/locale/skinsdb.ru.tr b/locale/skinsdb.ru.tr index 25dc5c6..cab0618 100644 --- a/locale/skinsdb.ru.tr +++ b/locale/skinsdb.ru.tr @@ -1,21 +1,19 @@ # textdomain: skinsdb -# Translation by Baytuch - -Raw texture=Текстура -Name=Имя -Author=Автор -Change=Изменить -Page=Страница -License=Лицензия -Description=Описание +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=Показать скин, список скинов, установить скин игрока Player not found=Игрок не найден unknown command=неизвестная команда see /help skinsdb for supported parameters=смотрите /help skinsdb для просмотра параметров skin set to=установлено скин invalid skin=некорректный скин -unknown parameter=неопределенный параметр -unknown skin=неопределенный скин -Downloads the specified range of skins and shuts down the server=Загрузить массив скинов и остановить сервер -Skins=Скины Requires skin key=Зависимый идентификатор скина +unknown parameter=неопределенный параметр +Raw texture=Текстура +Page=Страница +Name=Имя +Author=Автор +License=Лицензия + = +Downloads the specified range of skins and shuts down the server=Загрузить массив скинов и остановить сервер +Change=Изменить +Skins=Скины diff --git a/locale/skinsdb.uk.tr b/locale/skinsdb.uk.tr index 75775f8..dca44f5 100644 --- a/locale/skinsdb.uk.tr +++ b/locale/skinsdb.uk.tr @@ -1,21 +1,19 @@ # textdomain: skinsdb -# Translation by Baytuch - -Raw texture=Текстура -Name=Ім'я -Author=Автор -Change=Змінити -Page=Сторінка -License=Ліцензія -Description=Опис +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=Показати скін, список скінів, встановити скін гравця Player not found=Гравець не знайдений unknown command=невідома команда see /help skinsdb for supported parameters=дивіться /help skinsdb для перегляду параметрів skin set to=встановлено скін invalid skin=некоректний скін -unknown parameter=невизначений параметр -unknown skin=невизначений скін -Downloads the specified range of skins and shuts down the server=Завантажити масив скінів та зупинити сервер -Skins=Скіни Requires skin key=Залежний ідентифікатор скіна +unknown parameter=невизначений параметр +Raw texture=Текстура +Page=Сторінка +Name=Ім'я +Author=Автор +License=Ліцензія + = +Downloads the specified range of skins and shuts down the server=Завантажити масив скінів та зупинити сервер +Change=Змінити +Skins=Скіни diff --git a/locale/skinsdb.zh_CN.tr b/locale/skinsdb.zh_CN.tr index b6832dd..f608a1f 100644 --- a/locale/skinsdb.zh_CN.tr +++ b/locale/skinsdb.zh_CN.tr @@ -1,20 +1,19 @@ # textdomain: skinsdb -#Translation by IFRFSX(BingFengFSX) - -Raw texture=自然状态的纹理 -Name=名称 -Author=作者 -Change=更换 -Page=页面 -License=许可证 -Description=说明 +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin=显示,列出或者设置玩家的皮肤 Player not found=玩家未找到 unknown command=未知命令 see /help skinsdb for supported parameters=有关skinsdb支持的参数,参见 /help skin set to=皮肤设置为 invalid skin=无效皮肤 +Requires skin key= unknown parameter=未知参数 -unknown skin=未知皮肤 +Raw texture=自然状态的纹理 +Page=页面 +Name=名称 +Author=作者 +License=许可证 + = Downloads the specified range of skins and shuts down the server=下载指定范围的皮肤并关闭服务器 +Change=更换 Skins=皮肤 diff --git a/locale/skinsdb.zh_TW.tr b/locale/skinsdb.zh_TW.tr index 236b55d..e51d553 100644 --- a/locale/skinsdb.zh_TW.tr +++ b/locale/skinsdb.zh_TW.tr @@ -1,19 +1,19 @@ # textdomain: skinsdb -#Translation by IFRFSX(BingFengFSX) -Raw texture=自然狀態的紋理 -Name=名稱 -Author=作者 -Change=更換 -Page=頁面 -License=許可證 -Description=說明 -Show,list or set player's skin=顯示,列出或者設定玩家的皮膚 +[set] | show [] | list | list private | list public | [ui]= +Show, list or set player's skin=顯示,列出或者設定玩家的皮膚 Player not found=玩家未找到 unknown command=未知命令 see /help skinsdb for supported parameters=有關skinsdb支持的參數,參見/help skin set to=皮膚設定為 invalid skin=無效皮膚 +Requires skin key= unknown parameter=未知參數 -unknown skin=未知皮膚 +Raw texture=自然狀態的紋理 +Page=頁面 +Name=名稱 +Author=作者 +License=許可證 + = Downloads the specified range of skins and shuts down the server=下載指定範圍的皮膚並關閉服務器 +Change=更換 Skins=皮膚 diff --git a/locale/template.txt b/locale/template.txt index 35d3021..d2285fc 100644 --- a/locale/template.txt +++ b/locale/template.txt @@ -1,20 +1,19 @@ # textdomain: skinsdb - -Raw texture= -Name= -Author= -Change= -Page= -License= -Description= +[set] | show [] | list | list private | list public | [ui]= Show, list or set player's skin= Player not found= unknown command= see /help skinsdb for supported parameters= skin set to= invalid skin= -unknown parameter= -unknown skin= -Downloads the specified range of skins and shuts down the server= -Skins= Requires skin key= +unknown parameter= +Raw texture= +Page= +Name= +Author= +License= + = +Downloads the specified range of skins and shuts down the server= +Change= +Skins= diff --git a/skins_updater.lua b/skins_updater.lua index 91b9802..61b99d5 100644 --- a/skins_updater.lua +++ b/skins_updater.lua @@ -20,7 +20,7 @@ if not ie or not http then end minetest.register_chatcommand("skinsdb_download_skins", { - params = " ", + params = S(" "), description = S("Downloads the specified range of skins and shuts down the server"), privs = {server=true}, func = function(name, param) From cd27e24b6f0275c015487b4998dcfc8932baf8c0 Mon Sep 17 00:00:00 2001 From: Jaidyn Ann <10477760+JadedCtrl@users.noreply.github.com> Date: Tue, 2 Jan 2024 21:47:44 -0600 Subject: [PATCH 6/6] Added Esperanto (eo) translation --- locale/skinsdb.eo.tr | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 locale/skinsdb.eo.tr diff --git a/locale/skinsdb.eo.tr b/locale/skinsdb.eo.tr new file mode 100644 index 0000000..f683d7a --- /dev/null +++ b/locale/skinsdb.eo.tr @@ -0,0 +1,19 @@ +# textdomain: skinsdb +[set] | show [] | list | list private | list public | [ui]=[set] | show [] | list | list private | list public | [ui] +Show, list or set player's skin=Montri haŭtojn («show»), listigi haŭtojn («list»), aŭ agordi onian haŭton («set») +Player not found=Ludanto ne trovita +unknown command=nekonata ordono +see /help skinsdb for supported parameters=rulu «/help skinsdb» por vidi subtenatajn parametrojn +skin set to=haŭto agordita al +invalid skin=nevalida haŭto +Requires skin key=Postulas haŭtonomon +unknown parameter=nekonata parametro +Raw texture=Kruda bildo +Page=Paĝo +Name=Nomo +Author=Aŭtoro +License=Permesilo + = +Downloads the specified range of skins and shuts down the server=Elŝutinte haŭtojn el skindb inter la donitaj paĝoj, restartigas la servilon +Change=Ŝanĝi +Skins=Haŭtoj