From 14ddde689e9662076eed4d451e8341de83c49b95 Mon Sep 17 00:00:00 2001 From: = Date: Sun, 24 Dec 2017 04:54:46 +0100 Subject: [PATCH] Support Intlib added. --- depends.txt | 2 + init.lua | 141 +++++++++--------- intllib.lua | 45 ++++++ locale/de_DE.pot | 340 +++++++++++++++++++++++++++++++++++++++++++ locale/template.pot | 333 ++++++++++++++++++++++++++++++++++++++++++ tools/findtext.lua | 142 ++++++++++++++++++ tools/updatetext.lua | 131 +++++++++++++++++ tools/xgettext.bat | 33 +++++ tools/xgettext.sh | 27 ++++ 9 files changed, 1122 insertions(+), 72 deletions(-) create mode 100644 intllib.lua create mode 100644 locale/de_DE.pot create mode 100644 locale/template.pot create mode 100755 tools/findtext.lua create mode 100644 tools/updatetext.lua create mode 100644 tools/xgettext.bat create mode 100755 tools/xgettext.sh diff --git a/depends.txt b/depends.txt index 20b7c42..efd1b25 100644 --- a/depends.txt +++ b/depends.txt @@ -1 +1,3 @@ +intllib? unified_inventory? + diff --git a/init.lua b/init.lua index c569212..15439cc 100644 --- a/init.lua +++ b/init.lua @@ -1,6 +1,9 @@ poi_namefilter = {} poi_categories = {} +-- Load support for intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP.."/intllib.lua") dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/namefilter.lua") -- avoid servercrash loop if someone decided to rename the modfolder ! dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/categories.lua") @@ -31,7 +34,7 @@ local drop_down = 0 local catlist = "" -minetest.register_privilege("poi", "Player may set and manage Points of Interest.") +minetest.register_privilege("poi", S("Player may set and manage Points of Interest.")) --[[ @@ -68,7 +71,7 @@ function poi.list_filter(name) end -- for key, value poi.print(name, list, orange) - poi.print(name, index .. " Filter in List.", green) + poi.print(name, index .. S(" Filter in List."), green) end -- poi.list_filter() @@ -83,7 +86,7 @@ function poi.list_categories(name) end -- for key,value poi.print(name, list, orange) -- Send List to Player - poi.print(name, index .. " Categories in List.", green) -- Send List to Player + poi.print(name, index .. S(" Categories in List."), green) -- Send List to Player end -- poi.list_categories() @@ -127,10 +130,10 @@ function poi.list(name, option) end if (idx > 0) then - poi.print(name, "Point's of Interest in Categorie " .. poi.get_categoriename(idx) .. " are:", green) + poi.print(name, S("Point's of Interest in Categorie ") .. poi.get_categoriename(idx) .. S(" are:"), green) else - poi.print(name, poi.count() .. " Point's of Interest are:", green) + poi.print(name, poi.count() .. S(" Point's of Interest are:"), green) end -- if(idx > 0) @@ -150,7 +153,7 @@ function poi.list(name, option) else -- if(idx > 0) if all then - list = list .. key .. ": " .. pos .. " Categorie: " .. poi.get_categoriename(cat) .. "\n" + list = list .. key .. ": " .. pos .. S(" Categorie: ") .. poi.get_categoriename(cat) .. "\n" else list = list .. key .. "\n" @@ -182,7 +185,7 @@ function poi.set(name, poi_name) if poi.exist(p_name) then -- Ups, Name exists if(poi.get_categorie(p_name) ~= categorie) then -- ok, we want to change the Categorie if(categorie == -1) then -- Invalid Categoriename? - poi.print(name, "Given Categorie don't exists.", red) + poi.print(name, S("Given Categorie don't exists."), red) return false end -- if(poi.get_categoriename()) @@ -191,13 +194,13 @@ function poi.set(name, poi_name) local pos, cat pos, cat = poi.split_pos_cat(poi.points[p_name]) poi.points[p_name] = pos .. "{" .. tonumber(categorie) .. "}" -- Changes the Entry - poi.print(name, name .. " has changed the POI: " .. p_name .. " at " .. pos .. " Categorie: " .. poi.get_categoriename(cat) .. " to Categorie: " .. poi.get_categoriename(categorie) .. "\n", log) - poi.print(name, "POI: " .. p_name .. " at " .. pos .." in Categorie: " .. poi.get_categoriename(cat) .." changed to Categorie: " .. poi.get_categoriename(categorie), green) + poi.print(name, name .. S(" has changed the POI: ") .. p_name .. S(" at ") .. pos .. S(" Categorie: ") .. poi.get_categoriename(cat) .. S(" to Categorie: ") .. poi.get_categoriename(categorie) .. "\n", log) + poi.print(name, "POI: " .. p_name .. S(" at ") .. pos .. S(" in Categorie: ") .. poi.get_categoriename(cat) .. S(" changed to Categorie: ") .. poi.get_categoriename(categorie), green) poi.save() return true else - poi.print(name, "PoI <" .. p_name .. "> in Categorie <" .. categorie .. " - " .. poi.get_categoriename(categorie) .. "> already exists.", red) + poi.print(name, "PoI <" .. p_name .. S("> in Categorie <") .. categorie .. " - " .. poi.get_categoriename(categorie) .. S("> already exists."), red) return false -- Name exists, leave function end -- if(poi.get_categorie) @@ -206,21 +209,21 @@ function poi.set(name, poi_name) if not poi.check_name(p_name) then poi_name = poi.convertnil(poi_name) -- convert possible NIL - poi.print(name, "Invalid or Forbidden Name <" .. p_name .. "> for PoI.", red) + poi.print(name, S("Invalid or Forbidden Name <") .. p_name .. S("> for PoI."), red) return false end -- if poi.check_name if(categorie == -1) then -- Checks invalid Categoriename, then set it on new Entry to 1 - poi.print(name, "Warning: Unkown Categorie, set to Categorie 1.", red) + poi.print(name, S("Warning: Unkown Categorie, set to Categorie 1."), red) categorie = 1 end poi.points[p_name] = minetest.pos_to_string(currpos) .. "{" .. tonumber(categorie) .. "}"-- Insert the new Entry poi.save() -- and write the new List - poi.print(name, name .. " has set the POI: " .. p_name .. " at " .. minetest.pos_to_string(currpos) .. " Categorie: {" .. poi.get_categoriename(categorie) .. "}\n", log) - poi.print(name, "POI: " .. p_name .. " at " .. minetest.pos_to_string(currpos) .." in Categorie: " .. poi.get_categoriename(categorie) .." stored.", green) + poi.print(name, name .. S(" has set the POI: ") .. p_name .. S(" at ") .. minetest.pos_to_string(currpos) .. S(" Categorie: ") .. "{" .. poi.get_categoriename(categorie) .. "}\n", log) + poi.print(name, "POI: " .. p_name .. S(" at ") .. minetest.pos_to_string(currpos) .. S(" in Categorie: ") .. poi.get_categoriename(categorie) .. S(" stored."), green) return true end -- poi.set() @@ -230,7 +233,7 @@ function poi.delete(name, poi_name) if(poi_name == nil or poi_name == "") then -- No PoI-Name given .. - poi.print(name, "Name of the PoI needed.", red) + poi.print(name, S("Name of the PoI needed."), red) return false -- can't delete a non-existing Entry, leave function end @@ -238,7 +241,7 @@ function poi.delete(name, poi_name) if poi.exist(poi_name) == false then poi_name = poi.convertnil(poi_name) -- convert possible NIL - poi.print(name, "PoI <" .. poi_name .. "> unknown to delete.", red) + poi.print(name, "PoI <" .. poi_name .. S("> unknown to delete."), red) return false -- can't delete a non-existing Entry, leave function end -- if poi.exist @@ -248,8 +251,8 @@ function poi.delete(name, poi_name) list = poi_name .. ": " .. poi.points[poi_name] -- Get the full Name of the PoI and save it in a temporary var poi.points[poi_name] = nil -- and delete it - poi.print(name, name .. " has deleted POI-Name: " .. list .. "\n", log) - poi.print(name, list .. " deleted.", red) + poi.print(name, name .. S(" has deleted POI-Name: ") .. list .. "\n", log) + poi.print(name, list .. S(" deleted."), red) poi.save() -- Write the new list at the server return true @@ -261,7 +264,7 @@ function poi.reload(name) poi.points = nil -- Deletes the List of PoI's poi.openlist() -- and Load it new - poi.print(name, "POI-List reloaded.", red) + poi.print(name, S("POI-List reloaded."), red) return true end -- poi.reload() @@ -271,7 +274,7 @@ function poi.jump(name, poi_name) if (poi.exist(poi_name) == false) then -- Unknown or not existing Point of Interest poi_name = poi.convertnil(poi_name) -- convert possible NIL - poi.print(name, "Unknown Point of Interest: " .. poi_name .. ".", red) + poi.print(name, S("Unknown Point of Interest: ") .. poi_name .. ".", red) return false -- POI not in List, leave function end -- if poi.exist @@ -284,7 +287,7 @@ function poi.jump(name, poi_name) poi.play_soundeffect(name, "teleport") -- Play's a Sound player:setpos(minetest.string_to_pos(Position)) -- Move Player to Point - poi.print(name, "You are moved to POI: " .. poi_name .. ".", green) + poi.print(name, S("You are moved to POI: ") .. poi_name .. ".", green) return true end -- poi.jump() @@ -346,36 +349,36 @@ function poi.gui(player_name, showup, main) end -- for key,value if minetest.get_player_privs(player_name).poi then - manageme = "button[5,6.5;2,1;poimanager;Manage_PoI]" + manageme = "button[5,6.5;2,1;poimanager;" .. S("Manage_PoI]") end if main then minetest.show_formspec(player_name,"minetest_poi:thegui", -- The main gui for everyone with interact "size[7,8]" .. - "label[0.4,0;> Doubleclick on destination to teleport <]".. + "label[0.4,0;> ".. S("Doubleclick on destination to teleport") .. " <]".. --showcat.. "textlist[0.4,1;3,5;name;"..list..";selected_idx;false]".. - "label[0.6,6;".. count .. " Points in List]".. - "label[4.3,0.5; Categories ]".. + "label[0.6,6;".. count .. S(" Points in List]") .. + "label[4.3,0.5; ".. S("Categories ]") .. "dropdown[4,1;2,1;dname;"..catlist..";"..drop_down.."]".. - "button[0.4,6.5;1,1;poitelme;Go]".. - "button[1.4,6.5;2,1;poishowall;ShowAll]"..manageme.. - "button_exit[0.4,7.4;3.4,1;poiexit;Quit]" + "button[0.4,6.5;1,1;poitelme;".. S("Go]") .. + "button[1.4,6.5;2,1;poishowall;" .. S("ShowAll]") ..manageme.. + "button_exit[0.4,7.4;3.4,1;poiexit;" .. S("Quit]") ) else minetest.show_formspec(player_name,"minetest_poi:manager", -- The management gui for people with poi priv "size[7,9]" .. "textlist[0.4,0;3,5;maname;"..list..";"..choosen_name..";false]".. "textlist[4,0;2,2;madname;"..catlist..";"..selected_category..";false]".. - "button[4,2.5;2,1;reload;Reload]".. - "button[4,3.5;2,1;validate;Validate]".. + "button[4,2.5;2,1;reload;" .. S("Reload") .. "]" .. + "button[4,3.5;2,1;validate;" .. S("Validate") .. "]".. "field[0.3,5.4;7,1;managename; - enter name -;"..selected_point.."]".. - "button[0.4,6;6,1;set;Set Point or change Categorie]".. - "button[0.4,7;2,1;rename;Rename]".. - "button[2.4,7;2,1;move;Move]".. + "button[0.4,6;6,1;set;" .. S("Set Point or change Categorie") .. "]".. + "button[0.4,7;2,1;rename;" .. S("Rename") .. "]".. + "button[2.4,7;2,1;move;" .. S("Move") .. "]".. "image_button[5.4,7;1,1;minetest_poi_deleteme.png;delete;]".. - "button_exit[0.4,8;3,1;doexit;Quit]".. - "button[3.4,8;3,1;goback;Back]" + "button_exit[0.4,8;3,1;doexit;" .. S("Quit") .. "]".. + "button[3.4,8;3,1;goback;" .. S("Back") .. "]" ) end end -- poi.gui() @@ -468,7 +471,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) poi.delete(player:get_player_name(),selected_point) poi.gui(player:get_player_name(), nil, false) else - poi.print(player:get_player_name()," >>> Sorry this button is for admin only, please use /poi_delete "..selected_point,red) + poi.print(player:get_player_name(),S(" >>> Sorry this button is for admin only, please use /poi_delete ")..selected_point,red) end end @@ -524,7 +527,7 @@ function poi.move(name, poi_name) if (poi.exist(poi_name) == false) then poi_name = poi.convertnil(poi_name) -- convert possible NIL - poi.print(name, "Unknown PoI <" .. poi_name .. ">.", red) + poi.print(name, S("Unknown PoI <") .. poi_name .. ">.", red) return false end -- if poi.exist @@ -537,8 +540,8 @@ function poi.move(name, poi_name) poi.points[poi_name] = minetest.pos_to_string(currpos) .. "{" .. tonumber(cat) .. "}" -- Write the Position new poi.save() -- and write the List - poi.print(name, name .. " has moved the POI: " .. poi_name .. " at " .. oldpos .. " to Position: " .. minetest.pos_to_string(currpos) .. "\n", log) - poi.print(name, "POI: " .. poi_name .. " at " .. oldpos .." moved to Position: " .. minetest.pos_to_string(currpos) .."\n", green) + poi.print(name, name .. S(" has moved the POI: ") .. poi_name .. S(" at ") .. oldpos .. S(" to Position: ") .. minetest.pos_to_string(currpos) .. "\n", log) + poi.print(name, "POI: " .. poi_name .. S(" at ") .. oldpos .. S(" moved to Position: ") .. minetest.pos_to_string(currpos) .."\n", green) return true end -- poi.move @@ -548,26 +551,26 @@ function poi.rename(name, poi_name) local oldname, newname if string.find(poi_name, ",") == nil then - poi.print(name, "/poi_rename: No new Name for Point given.\n", red) + poi.print(name, S("/poi_rename: No new Name for Point given.") .. "\n", red) return false end oldname = poi.trim(string.sub(poi_name,1, string.find(poi_name, ",")-1)) if not poi.exist(oldname) then - poi.print(name, "Point to rename not found.\n", red) + poi.print(name, S("Point to rename not found.") .. "\n", red) return false end newname = poi.trim(string.sub(poi_name, string.find(poi_name, ",") + 1, -1)) if not poi.check_name(newname) then - poi.print(name, "Invalid new Pointname.\n", red) + poi.print(name, S("Invalid new Pointname.") .. "\n", red) return false end if poi.exist(newname) then - poi.print(name, "New Pointname already exists.\n", red) + poi.print(name, S("New Pointname already exists.") .. "\n", red) return false end @@ -578,8 +581,8 @@ function poi.rename(name, poi_name) poi.points[oldname] = nil -- now deletes the old one poi.save() -- saves the List - poi.print(name, name .. " has renamed POI-Name: " .. oldname .. " to: " .. newname .. " - Position: " .. old_position .. "\n", log) - poi.print(name, "PoI-Name: " .. oldname .. " renamed to " .. newname .. " - Position: " .. old_position .. "\n", green) + poi.print(name, name .. S(" has renamed POI-Name: ") .. oldname .. S(" to: ") .. newname .. S(" - Position: ") .. old_position .. "\n", log) + poi.print(name, S("PoI-Name: ") .. oldname .. S(" renamed to ") .. newname .. S(" - Position: ") .. old_position .. "\n", green) end -- poi.rename() @@ -644,12 +647,12 @@ function poi.validate(name) if (count > 0) or (invalid_cat > 0) then poi.print(name, name .. " has deleted with validate " .. count .. " PoI's.\n", log) poi.print(name, name .. " has found " .. invalid_cat .. " Entries with an invalid Categorie.\n", log) - poi.print(name, count .. " invalid PoI's found and deleted.", red) - poi.print(name, invalid_cat .. " PoI's with an invalid Categorie found and set to 1.", red) + poi.print(name, count .. S(" invalid PoI's found and deleted."), red) + poi.print(name, invalid_cat .. S(" PoI's with an invalid Categorie found and set to 1."), red) poi.save() else - poi.print(name, "No invalid PoI found.\n", green) + poi.print(name, S("No invalid PoI found.") .. "\n", green) end @@ -921,8 +924,8 @@ end -- poi.convertnil() --]] minetest.register_chatcommand("poi_set", { - params = "", - description = "Set's a Point of Interest or changes the Categorie of an existing Point.", + params = S(""), + description = S("Set's a Point of Interest or changes the Categorie of an existing Point."), privs = {poi = true}, func = function(name, poi_name) @@ -933,7 +936,7 @@ minetest.register_chatcommand("poi_set", { minetest.register_chatcommand("poi_gui", { params = "", - description = "Shows PoIs in a GUI.", + description = S("Shows PoIs in a GUI."), privs = {interact = true}, func = function(name) @@ -942,8 +945,8 @@ minetest.register_chatcommand("poi_gui", { end, }) minetest.register_chatcommand("poi_list", { - params = "<-a> <-c> <-f> <-i [Categorie[Number]]>", - description = "Shows Point's of Interest.\nOption -a shows Point's of Interest with Coordinates.\nOption -c shows you Categories.\nOption -f shows you the Namefilter\nOption -i shows only the Entries of the given Categorienumber or Name", + params = S("<-a> <-c> <-f> <-i [Categorie[Number]]>"), + description = S("Shows Point's of Interest.\nOption -a shows Point's of Interest with Coordinates.\nOption -c shows you Categories.\nOption -f shows you the Namefilter\nOption -i shows only the Entries of the given Categorienumber or Name"), privs = {interact = true}, func = function(name, arg) @@ -953,8 +956,8 @@ minetest.register_chatcommand("poi_list", { }) minetest.register_chatcommand("poi_delete", { - params = "", - description = "Deletes a Point of Interest.", + params = S(""), + description = S("Deletes a Point of Interest."), privs = {poi = true}, func = function(name, poi_name) @@ -965,7 +968,7 @@ minetest.register_chatcommand("poi_delete", { minetest.register_chatcommand("poi_reload", { params = "", - description = "Loads the List of POI's new.", + description = S("Loads the List of POI's new."), privs = {poi = true}, func = function(name) @@ -976,8 +979,8 @@ minetest.register_chatcommand("poi_reload", { minetest.register_chatcommand("poi_jump", { - params = "", - description = "Jumps to the Position of the Point of Interest.", + params = S(""), + description = S("Jumps to the Position of the Point of Interest."), privs = {interact = true}, func = function(name, poi_name) @@ -987,8 +990,8 @@ minetest.register_chatcommand("poi_jump", { }) minetest.register_chatcommand("poi_move", { - params = "", - description = "Changes the Position of the Point of Interest.", + params = S(""), + description = S("Changes the Position of the Point of Interest."), privs = {interact = true}, func = function(name, poi_name) @@ -998,8 +1001,8 @@ minetest.register_chatcommand("poi_move", { }) minetest.register_chatcommand("poi_rename", { - params = ",", - description = "Changes the Name of the Point of Interest.", + params = S(","), + description = S("Changes the Name of the Point of Interest."), privs = {interact = true}, func = function(name, poi_name) @@ -1010,7 +1013,7 @@ minetest.register_chatcommand("poi_rename", { minetest.register_chatcommand("poi_validate", { params = "", - description = "Validates the List of PoI's.", + description = S("Validates the List of PoI's."), privs = {poi = true}, func = function(name) @@ -1025,7 +1028,7 @@ if (minetest.get_modpath("unified_inventory")) then unified_inventory.register_button("minetest_poi", { type = "image", image = "minetest_poi_button_32x32.png", - tooltip = "Show Points of Interest", + tooltip = S("Show Points of Interest"), hide_lite=true, action = function(player) local player_name = player:get_player_name() @@ -1033,7 +1036,7 @@ if (minetest.get_modpath("unified_inventory")) then if minetest.check_player_privs(player_name, {interact=true}) then poi.gui(player_name,nil,true) else - minetest.chat_send_player(player_name,core.colorize(red, "You need the")..core.colorize(green," interact")..core.colorize(red," priv, please type")..core.colorize(green," /rules")..core.colorize(red," and search for the keyword")) + minetest.chat_send_player(player_name,core.colorize(red, S("You need the"))..core.colorize(green, S(" interact"))..core.colorize(red,S(" priv, please type"))..core.colorize(green,S(" /rules"))..core.colorize(red,S(" and search for the keyword"))) end end, }) @@ -1049,10 +1052,4 @@ poi.openlist() -- Initalize the List on Start poi.filter = poi_namefilter poi.categories = poi_categories poi.max_categories = poi.count_categories() -poi.build_cat_list() - - - - - - +poi.build_cat_list() \ No newline at end of file diff --git a/intllib.lua b/intllib.lua new file mode 100644 index 0000000..6669d72 --- /dev/null +++ b/intllib.lua @@ -0,0 +1,45 @@ + +-- Fallback functions for when `intllib` is not installed. +-- Code released under Unlicense . + +-- Get the latest version of this file at: +-- https://raw.githubusercontent.com/minetest-mods/intllib/master/lib/intllib.lua + +local function format(str, ...) + local args = { ... } + local function repl(escape, open, num, close) + if escape == "" then + local replacement = tostring(args[tonumber(num)]) + if open == "" then + replacement = replacement..close + end + return replacement + else + return "@"..open..num..close + end + end + return (str:gsub("(@?)@(%(?)(%d+)(%)?)", repl)) +end + +local gettext, ngettext +if minetest.get_modpath("intllib") then + if intllib.make_gettext_pair then + -- New method using gettext. + gettext, ngettext = intllib.make_gettext_pair() + else + -- Old method using text files. + gettext = intllib.Getter() + end +end + +-- Fill in missing functions. + +gettext = gettext or function(msgid, ...) + return format(msgid, ...) +end + +ngettext = ngettext or function(msgid, msgid_plural, n, ...) + return format(n==1 and msgid or msgid_plural, ...) +end + +return gettext, ngettext diff --git a/locale/de_DE.pot b/locale/de_DE.pot new file mode 100644 index 0000000..1b3d94d --- /dev/null +++ b/locale/de_DE.pot @@ -0,0 +1,340 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-12-24 03:51+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: init.lua +msgid "Player may set and manage Points of Interest." +msgstr "Spieler dürfen Sehenswürdigkeiten setzen und verwalten." + +#: init.lua +msgid " Filter in List." +msgstr "Filter in Liste." + +#: init.lua +msgid " Categories in List." +msgstr "Kategorien in Liste." + +#: init.lua +msgid "Point's of Interest in Categorie " +msgstr "Sehenswürdigkeiten in Kategorie " + +#: init.lua +msgid " are:" +msgstr " sind:" + +#: init.lua +msgid " Point's of Interest are:" +msgstr " Sehenswürdigkeiten sind:" + +#: init.lua +msgid " Categorie: " +msgstr " Kategorie: " + +#: init.lua +msgid "Given Categorie don't exists." +msgstr "Gegebene Kategorie gibt es nicht." + +#: init.lua +msgid " has changed the POI: " +msgstr " veränderte den POI: " + +#: init.lua +msgid " at " +msgstr " bei " + +#: init.lua +msgid " to Categorie: " +msgstr " zur Kategorie: " + +#: init.lua +msgid " in Categorie: " +msgstr " in der Kategorie: " + +#: init.lua +msgid " changed to Categorie: " +msgstr " verändert zur Kategorie: " + +#: init.lua +msgid "> in Categorie <" +msgstr "> in Kategorie <" + +#: init.lua +msgid "> already exists." +msgstr "> gibts es bereits." + +#: init.lua +msgid "Invalid or Forbidden Name <" +msgstr " Ungültiger oder verbotener Name <" + +#: init.lua +msgid "> for PoI." +msgstr "> für PoI." + +#: init.lua +msgid "Warning: Unkown Categorie, set to Categorie 1." +msgstr "Warnung: Unbekannte Kategorie, auf Kategorie 1 gesetzt." + +#: init.lua +msgid " has set the POI: " +msgstr " hat den POI gesetzt: " + +#: init.lua +msgid " stored." +msgstr " gespeichert." + +#: init.lua +msgid "Name of the PoI needed." +msgstr "Namen der Sehenswürdigkeit benötigt." + +#: init.lua +msgid "> unknown to delete." +msgstr "> unbekannt um zu löschen." + +#: init.lua +msgid " has deleted POI-Name: " +msgstr " löschte POI-Name: " + +#: init.lua +msgid " deleted." +msgstr " gelöscht." + +#: init.lua +msgid "POI-List reloaded." +msgstr "POI-Liste neu geladen." + +#: init.lua +msgid "Unknown Point of Interest: " +msgstr "Unbekannte Sehenswürdigkeit: " + +#: init.lua +msgid "You are moved to POI: " +msgstr "Du wurdest verschoben zur Sehenswürdigkeit: " + +#: init.lua +msgid "Manage_PoI]" +msgstr "Verwalte PoI" + +#: init.lua +msgid " Points in List]" +msgstr " Punkte in Liste]" + +#: init.lua +msgid "Categories ]" +msgstr " Kategorien ]" + +#: init.lua +msgid "Go]" +msgstr "Los]" + +#: init.lua +msgid "ShowAll]" +msgstr "ZeigeAlles]" + +#: init.lua +msgid "Quit]" +msgstr "Ende]" + +#: init.lua +msgid "Doubleclick on destination to teleport" +msgstr "Doppelklick auf Ziel zum Teleportieren" + +#: init.lua +msgid "Reload" +msgstr "Neu laden" + +#: init.lua +msgid "Validate" +msgstr "Überprüfen" + +#: init.lua +msgid "Set Point or change Categorie" +msgstr "Erstelle Punkt oder ändere die Kategorie" + +#: init.lua +msgid "Rename" +msgstr "Umbenennen" + +#: init.lua +msgid "Move" +msgstr "Verschieben" + +#: init.lua +msgid "Quit" +msgstr "Ende" + +#: init.lua +msgid "Back" +msgstr "Zurück" + +#: init.lua +msgid " >>> Sorry this button is for admin only, please use /poi_delete " +msgstr " >>> Tut mir leid, dieser Knopf ist nur für Admin, verwende stattdessen bitte /poi_delete " + +#: init.lua +msgid "Unknown PoI <" +msgstr "Unbekannter PoI <" + +#: init.lua +msgid " has moved the POI: " +msgstr " verschob den POI: " + +#: init.lua +msgid " to Position: " +msgstr " auf Position: " + +#: init.lua +msgid " moved to Position: " +msgstr " verschoben zu Position: " + +#: init.lua +msgid "/poi_rename: No new Name for Point given." +msgstr "/poi_rename: Keinen neuen Namen für Punkt angegeben." + +#: init.lua +msgid "Point to rename not found." +msgstr "Punkt zum Umbenennen nicht gefunden." + +#: init.lua +msgid "Invalid new Pointname." +msgstr "Ungültiger neuer Punktnamen." + +#: init.lua +msgid "New Pointname already exists." +msgstr "Neuen Punktnamen gibt es bereits." + +#: init.lua +msgid " has renamed POI-Name: " +msgstr "hat POI-Name umbenannt: " + +#: init.lua +msgid " to: " +msgstr " zu: " + +#: init.lua +msgid " - Position: " +msgstr " - Position: " + +#: init.lua +msgid "PoI-Name: " +msgstr "PoI-Name: " + +#: init.lua +msgid " renamed to " +msgstr " umbenannt zu " + +#: init.lua +msgid " invalid PoI's found and deleted." +msgstr " ungültige PoI's gefunden und gelöscht." + +#: init.lua +msgid " PoI's with an invalid Categorie found and set to 1." +msgstr " PoI's mit ungültiger Kategorie gefunden und auf 1 gesetzt." + +#: init.lua +msgid "No invalid PoI found." +msgstr "Keinen ungültigen PoI gefunden." + +#: init.lua +msgid "" +msgstr "" + +#: init.lua +msgid "" +"Set's a Point of Interest or changes the Categorie of an existing Point." +msgstr "" +"Erstellt eine Sehenswürdigkeit oder verändert die Kategorie einer existierenden Sehenswürdigkeit." + +#: init.lua +msgid "Shows PoIs in a GUI." +msgstr "Zeigt PoIs in einer GUI" + +#: init.lua +msgid "<-a> <-c> <-f> <-i [Categorie[Number]]>" +msgstr "<-a> <-c> <-f> <-i [Kategorie[Nummer]]>" + +#: init.lua +msgid "" +"Shows Point's of Interest.\n" +"Option -a shows Point's of Interest with Coordinates.\n" +"Option -c shows you Categories.\n" +"Option -f shows you the Namefilter\n" +"Option -i shows only the Entries of the given " +"Categorienumber or Name" +msgstr "" +"Zeigt Sehenswürdigkeiten.\n" +"Option -a zeigt Sehenswürdigkeiten mit Koordinaten.\n" +"Option -c zeigt dir die Kategorien.\n" +"Option -f zeigt dir den Namensfilter\n" +"Option -i zeigt nur die Einträge der gegebenen " +"Kategorienummer oder Name" + +#: init.lua +msgid "" +msgstr "" + +#: init.lua +msgid "Deletes a Point of Interest." +msgstr "Löscht eine Sehenswürdigkeit." + +#: init.lua +msgid "Loads the List of POI's new." +msgstr "Lädt die Liste der POI's neu." + +#: init.lua +msgid "Jumps to the Position of the Point of Interest." +msgstr "Springt zur Position der Sehenswürdigkeit." + +#: init.lua +msgid "Changes the Position of the Point of Interest." +msgstr "Verändert die Position der Sehenswürdigkeit." + +#: init.lua +msgid "," +msgstr "," + +#: init.lua +msgid "Changes the Name of the Point of Interest." +msgstr "Verändert den Namen der Sehenswürdigkeit." + +#: init.lua +msgid "Validates the List of PoI's." +msgstr "Überprüft die Liste der PoI's." + +#: init.lua +msgid "Show Points of Interest" +msgstr "Zeit Sehenswürdigkeiten" + +#: init.lua +msgid "You need the" +msgstr "Du brauchst" + +#: init.lua +msgid " interact" +msgstr " interact" + +#: init.lua +msgid " priv, please type" +msgstr " priv, bitte gib" + +#: init.lua +msgid " /rules" +msgstr " /rules" + +#: init.lua +msgid " and search for the keyword" +msgstr " und suche nach dem Schlüsselwort" diff --git a/locale/template.pot b/locale/template.pot new file mode 100644 index 0000000..fe6099f --- /dev/null +++ b/locale/template.pot @@ -0,0 +1,333 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-12-24 04:05+0100\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: init.lua +msgid "Player may set and manage Points of Interest." +msgstr "" + +#: init.lua +msgid " Filter in List." +msgstr "" + +#: init.lua +msgid " Categories in List." +msgstr "" + +#: init.lua +msgid "Point's of Interest in Categorie " +msgstr "" + +#: init.lua +msgid " are:" +msgstr "" + +#: init.lua +msgid " Point's of Interest are:" +msgstr "" + +#: init.lua +msgid " Categorie: " +msgstr "" + +#: init.lua +msgid "Given Categorie don't exists." +msgstr "" + +#: init.lua +msgid " has changed the POI: " +msgstr "" + +#: init.lua +msgid " at " +msgstr "" + +#: init.lua +msgid " to Categorie: " +msgstr "" + +#: init.lua +msgid " in Categorie: " +msgstr "" + +#: init.lua +msgid " changed to Categorie: " +msgstr "" + +#: init.lua +msgid "> in Categorie <" +msgstr "" + +#: init.lua +msgid "> already exists." +msgstr "" + +#: init.lua +msgid "Invalid or Forbidden Name <" +msgstr "" + +#: init.lua +msgid "> for PoI." +msgstr "" + +#: init.lua +msgid "Warning: Unkown Categorie, set to Categorie 1." +msgstr "" + +#: init.lua +msgid " has set the POI: " +msgstr "" + +#: init.lua +msgid " stored." +msgstr "" + +#: init.lua +msgid "Name of the PoI needed." +msgstr "" + +#: init.lua +msgid "> unknown to delete." +msgstr "" + +#: init.lua +msgid " has deleted POI-Name: " +msgstr "" + +#: init.lua +msgid " deleted." +msgstr "" + +#: init.lua +msgid "POI-List reloaded." +msgstr "" + +#: init.lua +msgid "Unknown Point of Interest: " +msgstr "" + +#: init.lua +msgid "You are moved to POI: " +msgstr "" + +#: init.lua +msgid "Manage_PoI]" +msgstr "" + +#: init.lua +msgid "Doubleclick on destination to teleport" +msgstr "" + +#: init.lua +msgid " Points in List]" +msgstr "" + +#: init.lua +msgid "Categories ]" +msgstr "" + +#: init.lua +msgid "Go]" +msgstr "" + +#: init.lua +msgid "ShowAll]" +msgstr "" + +#: init.lua +msgid "Quit]" +msgstr "" + +#: init.lua +msgid "Reload" +msgstr "" + +#: init.lua +msgid "Validate" +msgstr "" + +#: init.lua +msgid "Set Point or change Categorie" +msgstr "" + +#: init.lua +msgid "Rename" +msgstr "" + +#: init.lua +msgid "Move" +msgstr "" + +#: init.lua +msgid "Quit" +msgstr "" + +#: init.lua +msgid "Back" +msgstr "" + +#: init.lua +msgid " >>> Sorry this button is for admin only, please use /poi_delete " +msgstr "" + +#: init.lua +msgid "Unknown PoI <" +msgstr "" + +#: init.lua +msgid " has moved the POI: " +msgstr "" + +#: init.lua +msgid " to Position: " +msgstr "" + +#: init.lua +msgid " moved to Position: " +msgstr "" + +#: init.lua +msgid "/poi_rename: No new Name for Point given." +msgstr "" + +#: init.lua +msgid "Point to rename not found." +msgstr "" + +#: init.lua +msgid "Invalid new Pointname." +msgstr "" + +#: init.lua +msgid "New Pointname already exists." +msgstr "" + +#: init.lua +msgid " has renamed POI-Name: " +msgstr "" + +#: init.lua +msgid " to: " +msgstr "" + +#: init.lua +msgid " - Position: " +msgstr "" + +#: init.lua +msgid "PoI-Name: " +msgstr "" + +#: init.lua +msgid " renamed to " +msgstr "" + +#: init.lua +msgid " invalid PoI's found and deleted." +msgstr "" + +#: init.lua +msgid " PoI's with an invalid Categorie found and set to 1." +msgstr "" + +#: init.lua +msgid "No invalid PoI found." +msgstr "" + +#: init.lua +msgid "" +msgstr "" + +#: init.lua +msgid "" +"Set's a Point of Interest or changes the Categorie of an existing Point." +msgstr "" + +#: init.lua +msgid "Shows PoIs in a GUI." +msgstr "" + +#: init.lua +msgid "<-a> <-c> <-f> <-i [Categorie[Number]]>" +msgstr "" + +#: init.lua +msgid "" +"Shows Point's of Interest.\n" +"Option -a shows Point's of Interest with Coordinates.\n" +"Option -c shows you Categories.\n" +"Option -f shows you the Namefilter\n" +"Option -i shows only the Entries of the given " +"Categorienumber or Name" +msgstr "" + +#: init.lua +msgid "" +msgstr "" + +#: init.lua +msgid "Deletes a Point of Interest." +msgstr "" + +#: init.lua +msgid "Loads the List of POI's new." +msgstr "" + +#: init.lua +msgid "Jumps to the Position of the Point of Interest." +msgstr "" + +#: init.lua +msgid "Changes the Position of the Point of Interest." +msgstr "" + +#: init.lua +msgid "," +msgstr "" + +#: init.lua +msgid "Changes the Name of the Point of Interest." +msgstr "" + +#: init.lua +msgid "Validates the List of PoI's." +msgstr "" + +#: init.lua +msgid "Show Points of Interest" +msgstr "" + +#: init.lua +msgid "You need the" +msgstr "" + +#: init.lua +msgid " interact" +msgstr "" + +#: init.lua +msgid " priv, please type" +msgstr "" + +#: init.lua +msgid " /rules" +msgstr "" + +#: init.lua +msgid " and search for the keyword" +msgstr "" diff --git a/tools/findtext.lua b/tools/findtext.lua new file mode 100755 index 0000000..e5f6e88 --- /dev/null +++ b/tools/findtext.lua @@ -0,0 +1,142 @@ +#! /usr/bin/env lua + +local me = arg[0]:gsub(".*[/\\](.*)$", "%1") + +local function err(fmt, ...) + io.stderr:write(("%s: %s\n"):format(me, fmt:format(...))) + os.exit(1) +end + +local output +local inputs = { } +local lang +local author + +local i = 1 + +local function usage() + print([[ +Usage: ]]..me..[[ [OPTIONS] FILE... + +Extract translatable strings from the given FILE(s). + +Available options: + -h,--help Show this help screen and exit. + -o,--output X Set output file (default: stdout). + -a,--author X Set author. + -l,--lang X Set language name. +]]) + os.exit(0) +end + +while i <= #arg do + local a = arg[i] + if (a == "-h") or (a == "--help") then + usage() + elseif (a == "-o") or (a == "--output") then + i = i + 1 + if i > #arg then + err("missing required argument to `%s'", a) + end + output = arg[i] + elseif (a == "-a") or (a == "--author") then + i = i + 1 + if i > #arg then + err("missing required argument to `%s'", a) + end + author = arg[i] + elseif (a == "-l") or (a == "--lang") then + i = i + 1 + if i > #arg then + err("missing required argument to `%s'", a) + end + lang = arg[i] + elseif a:sub(1, 1) ~= "-" then + table.insert(inputs, a) + else + err("unrecognized option `%s'", a) + end + i = i + 1 +end + +if #inputs == 0 then + err("no input files") +end + +local outfile = io.stdout + +local function printf(fmt, ...) + outfile:write(fmt:format(...)) +end + +if output then + local e + outfile, e = io.open(output, "w") + if not outfile then + err("error opening file for writing: %s", e) + end +end + +if author or lang then + outfile:write("\n") +end + +if lang then + printf("# Language: %s\n", lang) +end + +if author then + printf("# Author: %s\n", author) +end + +if author or lang then + outfile:write("\n") +end + +local escapes = { + ["\n"] = "\\n", + ["="] = "\\=", + ["\\"] = "\\\\", +} + +local function escape(s) + return s:gsub("[\\\n=]", escapes) +end + +local messages = { } + +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 + table.insert(messages, s) + end + end + infile:close() + else + io.stderr:write(("%s: WARNING: error opening file: %s\n"):format(me, e)) + end +end + +table.sort(messages) + +local last_msg + +for _, msg in ipairs(messages) do + if msg ~= last_msg then + printf("%s =\n", escape(msg)) + end + last_msg = msg +end + +if output then + outfile:close() +end + +--[[ +TESTS: +S("foo") S("bar") +S("bar") +S("foo") +]] diff --git a/tools/updatetext.lua b/tools/updatetext.lua new file mode 100644 index 0000000..5d5734b --- /dev/null +++ b/tools/updatetext.lua @@ -0,0 +1,131 @@ +#! /usr/bin/env lua + +local basedir = "" +if arg[0]:find("[/\\]") then + basedir = arg[0]:gsub("(.*[/\\]).*$", "%1"):gsub("\\", "/") +end +if basedir == "" then basedir = "./" end + +-- Required by load_strings() +function string.trim(s) -- luacheck: ignore + return s:gsub("^%s*(.-)%s*$", "%1") +end + +dofile(basedir.."/../lib.lua") + +local me = arg[0]:gsub(".*[/\\](.*)$", "%1") + +local function err(fmt, ...) + io.stderr:write(("%s: %s\n"):format(me, fmt:format(...))) + os.exit(1) +end + +local output, outfile, template +local catalogs = { } + +local function usage() + print([[ +Usage: ]]..me..[[ [OPTIONS] TEMPLATE CATALOG... + +Update a catalog with new strings from a template. + +Available options: + -h,--help Show this help screen and exit. + -o,--output X Set output file (default: stdout). + +Messages in the template that are not on the catalog are added to the +catalog at the end. + +This tool also checks messages that are in the catalog but not in the +template, and reports such lines. It's up to the user to remove such +lines, if so desired. +]]) + os.exit(0) +end + +local i = 1 + +while i <= #arg do + local a = arg[i] + if (a == "-h") or (a == "--help") then + usage() + elseif (a == "-o") or (a == "--output") then + i = i + 1 + if i > #arg then + err("missing required argument to `%s'", a) + end + output = arg[i] + elseif a:sub(1, 1) ~= "-" then + if not template then + template = a + else + table.insert(catalogs, a) + end + else + err("unrecognized option `%s'", a) + end + i = i + 1 +end + +if not template then + err("no template specified") +elseif #catalogs == 0 then + err("no catalogs specified") +end + +local f, e = io.open(template, "r") +if not f then + err("error opening template: %s", e) +end + +local escapes = { ["\n"] = "\\n", ["="] = "\\=", ["\\"] = "\\\\", } +local function escape(s) + return s:gsub("[\\\n=]", escapes) +end + +if output then + outfile, e = io.open(output, "w") + if not outfile then + err("error opening file for writing: %s", e) + end +end + +local template_msgs = intllib.load_strings(template) + +for _, file in ipairs(catalogs) do + print("Processing: "..file) + local catalog_msgs = intllib.load_strings(file) + local dirty_lines = { } + if catalog_msgs then + -- Add new entries from template. + for k in pairs(template_msgs) do + if not catalog_msgs[k] then + print("NEW: "..k) + table.insert(dirty_lines, escape(k).." =") + end + end + -- Check for old messages. + for k, v in pairs(catalog_msgs) do + if not template_msgs[k] then + print("OLD: "..k) + table.insert(dirty_lines, "OLD: "..escape(k).." = "..escape(v)) + end + end + if #dirty_lines > 0 then + local outf + outf, e = io.open(file, "a+") + if outf then + outf:write("\n") + for _, line in ipairs(dirty_lines) do + outf:write(line) + outf:write("\n") + end + outf:close() + else + io.stderr:write(("%s: WARNING: cannot write: %s\n"):format(me, e)) + end + end + else + io.stderr:write(("%s: WARNING: could not load catalog\n"):format(me)) + end +end diff --git a/tools/xgettext.bat b/tools/xgettext.bat new file mode 100644 index 0000000..18403db --- /dev/null +++ b/tools/xgettext.bat @@ -0,0 +1,33 @@ +@echo off +setlocal + +set me=%~n0 + +rem # Uncomment the following line if gettext is not in your PATH. +rem # Value must be absolute and end in a backslash. +rem set gtprefix=C:\path\to\gettext\bin\ + +if "%1" == "" ( + echo Usage: %me% FILE... 1>&2 + exit 1 +) + +set xgettext=%gtprefix%xgettext.exe +set msgmerge=%gtprefix%msgmerge.exe + +md locale > nul 2>&1 +echo Generating template... 1>&2 +echo %xgettext% --from-code=UTF-8 -kS -kNS:1,2 -k_ -o locale/template.pot %* +%xgettext% --from-code=UTF-8 -kS -kNS:1,2 -k_ -o locale/template.pot %* +if %ERRORLEVEL% neq 0 goto done + +cd locale + +for %%f in (*.po) do ( + echo Updating %%f... 1>&2 + %msgmerge% --update %%f template.pot +) + +echo DONE! 1>&2 + +:done diff --git a/tools/xgettext.sh b/tools/xgettext.sh new file mode 100755 index 0000000..1504f42 --- /dev/null +++ b/tools/xgettext.sh @@ -0,0 +1,27 @@ +#! /bin/bash + +me=$(basename "${BASH_SOURCE[0]}"); + +if [[ $# -lt 1 ]]; then + echo "Usage: $me FILE..." >&2; + exit 1; +fi + +mkdir -p locale; +echo "Generating template..." >&2; +xgettext --from-code=UTF-8 \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --add-comments='Translators:' \ + --add-location=file \ + -o locale/template.pot \ + "$@" \ + || exit; + +find locale -name '*.po' -type f | while read -r file; do + echo "Updating $file..." >&2; + msgmerge --update "$file" locale/template.pot; +done + +echo "DONE!" >&2;