diff --git a/README.txt b/README.txt index 04f3d43..3645d5d 100644 --- a/README.txt +++ b/README.txt @@ -15,7 +15,7 @@ The Minetest Game github master HEAD is generally compatible with the github master HEAD of the Minetest engine. Additionally, when the Minetest engine is tagged to be a certain version (eg. -0.4.10), Minetest Game is tagged with the version too. +5.0.1), Minetest Game is tagged with the version too. When stable releases are made, Minetest Game is packaged and made available in http://minetest.net/downloads/ diff --git a/mods/beds/beds.lua b/mods/beds/beds.lua old mode 100644 new mode 100755 index 0bdde9c..2cd174f --- a/mods/beds/beds.lua +++ b/mods/beds/beds.lua @@ -1,7 +1,13 @@ +-- beds/beds.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + -- Fancy shaped bed beds.register_bed("beds:fancy_bed", { - description = "Fancy Bed", + description = S("Fancy Bed"), inventory_image = "beds_bed_fancy.png", wield_image = "beds_bed_fancy.png", tiles = { @@ -52,7 +58,7 @@ beds.register_bed("beds:fancy_bed", { -- Simple shaped bed beds.register_bed("beds:bed", { - description = "Simple Bed", + description = S("Simple Bed"), inventory_image = "beds_bed.png", wield_image = "beds_bed.png", tiles = { diff --git a/mods/beds/depends.txt b/mods/beds/depends.txt old mode 100644 new mode 100755 index 470ec30..b07a92c --- a/mods/beds/depends.txt +++ b/mods/beds/depends.txt @@ -1,2 +1,4 @@ default wool +game_intllib? + diff --git a/mods/beds/gintllib.lua b/mods/beds/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/beds/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/binoculars/depends.txt b/mods/binoculars/depends.txt old mode 100644 new mode 100755 index 1f737c1..fe02eee --- a/mods/binoculars/depends.txt +++ b/mods/binoculars/depends.txt @@ -1,2 +1,4 @@ default creative? +game_intllib? + diff --git a/mods/binoculars/gintllib.lua b/mods/binoculars/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/binoculars/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/binoculars/init.lua b/mods/binoculars/init.lua old mode 100644 new mode 100755 index 0b43a06..e4f0aa8 --- a/mods/binoculars/init.lua +++ b/mods/binoculars/init.lua @@ -1,7 +1,13 @@ +-- binoculars/init.lua + -- Mod global namespace binoculars = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + -- Detect creative mod local creative_mod = minetest.get_modpath("creative") @@ -54,7 +60,7 @@ minetest.after(4.7, cyclic_update) -- Binoculars item minetest.register_craftitem("binoculars:binoculars", { - description = "Binoculars\nUse with 'Zoom' key", + description = S("Binoculars\nUse with 'Zoom' key"), inventory_image = "binoculars_binoculars.png", stack_max = 1, diff --git a/mods/boats/depends.txt b/mods/boats/depends.txt old mode 100644 new mode 100755 index 8e482ce..51f1787 --- a/mods/boats/depends.txt +++ b/mods/boats/depends.txt @@ -1,2 +1,3 @@ default player_api +game_intllib? diff --git a/mods/boats/gintllib.lua b/mods/boats/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/boats/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/boats/init.lua b/mods/boats/init.lua old mode 100644 new mode 100755 index 00cf791..fa8d4cc --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -1,3 +1,9 @@ +-- boats/init.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + -- -- Helper functions -- @@ -149,13 +155,13 @@ function boat.on_step(self, dtime) if ctrl.up and ctrl.down then if not self.auto then self.auto = true - minetest.chat_send_player(self.driver, "[boats] Cruise on") + minetest.chat_send_player(self.driver, S("[boats] Cruise on")) end elseif ctrl.down then self.v = self.v - dtime * 1.8 if self.auto then self.auto = false - minetest.chat_send_player(self.driver, "[boats] Cruise off") + minetest.chat_send_player(self.driver, S("[boats] Cruise off")) end elseif ctrl.up or self.auto then self.v = self.v + dtime * 1.8 @@ -242,7 +248,7 @@ minetest.register_entity("boats:boat", boat) minetest.register_craftitem("boats:boat", { - description = "Boat", + description = S("Boat"), inventory_image = "boats_inventory.png", wield_image = "boats_wield.png", wield_scale = {x = 2, y = 2, z = 1}, diff --git a/mods/bones/depends.txt b/mods/bones/depends.txt old mode 100644 new mode 100755 index 4ad96d5..eaeb762 --- a/mods/bones/depends.txt +++ b/mods/bones/depends.txt @@ -1 +1,3 @@ default +game_intllib? + diff --git a/mods/bones/gintllib.lua b/mods/bones/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/bones/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/bones/init.lua b/mods/bones/init.lua old mode 100644 new mode 100755 index 5fcae41..2e746c0 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -1,6 +1,11 @@ -- Minetest 0.4 mod: bones -- See README.txt for licensing and other information. +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + bones = {} local function is_owner(pos, name) @@ -24,7 +29,7 @@ local share_bones_time = tonumber(minetest.settings:get("share_bones_time")) or local share_bones_time_early = tonumber(minetest.settings:get("share_bones_time_early")) or share_bones_time / 4 minetest.register_node("bones:bones", { - description = "Bones", + description = S("Bones"), tiles = { "bones_top.png^[transform2", "bones_bottom.png", @@ -116,7 +121,7 @@ minetest.register_node("bones:bones", { local meta = minetest.get_meta(pos) local time = meta:get_int("time") + elapsed if time >= share_bones_time then - meta:set_string("infotext", meta:get_string("owner") .. "'s old bones") + meta:set_string("infotext", S("@1's old bones", meta:get_string("owner"))) meta:set_string("owner", "") else meta:set_int("time", time) @@ -194,7 +199,7 @@ minetest.register_on_dieplayer(function(player) minetest.log("action", player_name .. " dies at " .. pos_string .. ". No bones placed") if bones_position_message then - minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. ".") + minetest.chat_send_player(player_name, S("@1 died at @2.", player_name, pos_string)) end return end @@ -204,7 +209,7 @@ minetest.register_on_dieplayer(function(player) minetest.log("action", player_name .. " dies at " .. pos_string .. ". No bones placed") if bones_position_message then - minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. ".") + minetest.chat_send_player(player_name, S("@1 died at @2.", player_name, pos_string)) end return end @@ -230,8 +235,9 @@ minetest.register_on_dieplayer(function(player) minetest.log("action", player_name .. " dies at " .. pos_string .. ". Inventory dropped") if bones_position_message then - minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. - ", and dropped their inventory.") + minetest.chat_send_player(player_name, + S("@1 died at @2, and dropped their inventory.", + player_name, pos_string)) end return end @@ -242,8 +248,9 @@ minetest.register_on_dieplayer(function(player) minetest.log("action", player_name .. " dies at " .. pos_string .. ". Bones placed") if bones_position_message then - minetest.chat_send_player(player_name, player_name .. " died at " .. pos_string .. - ", and bones were placed.") + minetest.chat_send_player(player_name, + S("@1 died at @2, and bones were placed.", + player_name, pos_string)) end local meta = minetest.get_meta(pos) @@ -266,7 +273,7 @@ minetest.register_on_dieplayer(function(player) meta:set_string("owner", player_name) if share_bones_time ~= 0 then - meta:set_string("infotext", player_name .. "'s fresh bones") + meta:set_string("infotext", S("@1's fresh bones.", player_name)) if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then meta:set_int("time", 0) @@ -276,6 +283,6 @@ minetest.register_on_dieplayer(function(player) minetest.get_node_timer(pos):start(10) else - meta:set_string("infotext", player_name.."'s bones") + meta:set_string("infotext", S("@1's bones.", player_name)) end end) diff --git a/mods/bucket/depends.txt b/mods/bucket/depends.txt old mode 100644 new mode 100755 index 3a7daa1..0c4f07f --- a/mods/bucket/depends.txt +++ b/mods/bucket/depends.txt @@ -1,2 +1,4 @@ default +game_intllib? + diff --git a/mods/bucket/gintllib.lua b/mods/bucket/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/bucket/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/bucket/init.lua b/mods/bucket/init.lua old mode 100644 new mode 100755 index 1d37cb4..e2ac8a6 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -1,6 +1,11 @@ -- Minetest 0.4 mod: bucket -- See README.txt for licensing and other information. +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + minetest.register_alias("bucket", "bucket:bucket_empty") minetest.register_alias("bucket_water", "bucket:bucket_water") minetest.register_alias("bucket_lava", "bucket:bucket_lava") @@ -111,7 +116,7 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name end minetest.register_craftitem("bucket:bucket_empty", { - description = "Empty Bucket", + description = S("Empty Bucket"), inventory_image = "bucket.png", stack_max = 99, liquids_pointable = true, @@ -185,7 +190,7 @@ bucket.register_liquid( "default:water_flowing", "bucket:bucket_water", "bucket_water.png", - "Water Bucket", + S("Water Bucket"), {water_bucket = 1} ) @@ -200,7 +205,7 @@ bucket.register_liquid( "default:river_water_flowing", "bucket:bucket_river_water", "bucket_river_water.png", - "River Water Bucket", + S("River Water Bucket"), {water_bucket = 1}, true ) @@ -210,7 +215,7 @@ bucket.register_liquid( "default:lava_flowing", "bucket:bucket_lava", "bucket_lava.png", - "Lava Bucket" + S("Lava Bucket") ) minetest.register_craft({ diff --git a/mods/butterflies/depends.txt b/mods/butterflies/depends.txt old mode 100644 new mode 100755 index df07aca..187943b --- a/mods/butterflies/depends.txt +++ b/mods/butterflies/depends.txt @@ -1,2 +1,3 @@ default -flowers \ No newline at end of file +flowers +game_intllib? diff --git a/mods/butterflies/gintllib.lua b/mods/butterflies/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/butterflies/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/butterflies/init.lua b/mods/butterflies/init.lua old mode 100644 new mode 100755 index 008211e..c09db01 --- a/mods/butterflies/init.lua +++ b/mods/butterflies/init.lua @@ -1,8 +1,14 @@ +-- butrerflies/init.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + -- register butterflies local butter_list = { - {"white", "White"}, - {"red", "Red"}, - {"violet", "Violet"} + {"white", S("White")}, + {"red", S("Red")}, + {"violet", S("Violet")} } for i in ipairs (butter_list) do @@ -10,7 +16,7 @@ for i in ipairs (butter_list) do local desc = butter_list[i][2] minetest.register_node("butterflies:butterfly_"..name, { - description = desc.." Butterfly", + description = S("@1 Butterfly", desc), drawtype = "plantlike", tiles = {{ name = "butterflies_butterfly_"..name.."_animated.png", @@ -56,7 +62,7 @@ for i in ipairs (butter_list) do }) minetest.register_node("butterflies:hidden_butterfly_"..name, { - description = "Hidden "..desc.." Butterfly", + description = S("Hidden @1 Butterfly", desc), drawtype = "airlike", inventory_image = "insects_butterfly_"..name..".png", wield_image = "insects_butterfly_"..name..".png", diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua old mode 100644 new mode 100755 index 855450d..6727b7c --- a/mods/carts/cart_entity.lua +++ b/mods/carts/cart_entity.lua @@ -1,3 +1,10 @@ +-- carts/cart_entity.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + local cart_entity = { initial_properties = { physical = false, -- otherwise going uphill breaks @@ -383,7 +390,7 @@ end minetest.register_entity("carts:cart", cart_entity) minetest.register_craftitem("carts:cart", { - description = "Cart (Sneak+Click to pick up)", + description = S("Cart (Sneak+Click to pick up)"), inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_side.png", "carts_cart_side.png"), wield_image = "carts_cart_side.png", on_place = function(itemstack, placer, pointed_thing) diff --git a/mods/carts/depends.txt b/mods/carts/depends.txt old mode 100644 new mode 100755 index 8e482ce..51f1787 --- a/mods/carts/depends.txt +++ b/mods/carts/depends.txt @@ -1,2 +1,3 @@ default player_api +game_intllib? diff --git a/mods/carts/gintllib.lua b/mods/carts/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/carts/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/carts/rails.lua b/mods/carts/rails.lua old mode 100644 new mode 100755 index a5fff8a..0df8953 --- a/mods/carts/rails.lua +++ b/mods/carts/rails.lua @@ -1,5 +1,11 @@ +-- carts/rails.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + carts:register_rail("carts:rail", { - description = "Rail", + description = S("Rail"), tiles = { "carts_rail_straight.png", "carts_rail_curved.png", "carts_rail_t_junction.png", "carts_rail_crossing.png" @@ -22,7 +28,7 @@ minetest.register_alias("default:rail", "carts:rail") carts:register_rail("carts:powerrail", { - description = "Powered Rail", + description = S("Powered Rail"), tiles = { "carts_rail_straight_pwr.png", "carts_rail_curved_pwr.png", "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png" @@ -41,7 +47,7 @@ minetest.register_craft({ carts:register_rail("carts:brakerail", { - description = "Brake Rail", + description = S("Brake Rail"), tiles = { "carts_rail_straight_brk.png", "carts_rail_curved_brk.png", "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png" diff --git a/mods/creative/depends.txt b/mods/creative/depends.txt old mode 100644 new mode 100755 index 975e652..a3d8a29 --- a/mods/creative/depends.txt +++ b/mods/creative/depends.txt @@ -1,2 +1,3 @@ default sfinv +game_intllib? diff --git a/mods/creative/gintllib.lua b/mods/creative/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/creative/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/creative/init.lua b/mods/creative/init.lua old mode 100644 new mode 100755 index 0f8d4db..bee8d7a --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -1,3 +1,10 @@ +-- creative/init.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + creative = {} local function update_sfinv(name) @@ -14,7 +21,7 @@ local function update_sfinv(name) end minetest.register_privilege("creative", { - description = "Allow player to use creative inventory", + description = S("Allow player to use creative inventory"), give_to_singleplayer = false, give_to_admin = false, on_grant = update_sfinv, diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua old mode 100644 new mode 100755 index 6f485d5..c1e6080 --- a/mods/creative/inventory.lua +++ b/mods/creative/inventory.lua @@ -1,3 +1,10 @@ +-- creative/inventory.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + local player_inventory = {} local inventory_cache = {} @@ -176,10 +183,10 @@ function creative.register_tab(name, title, items) }) end -creative.register_tab("all", "All", minetest.registered_items) -creative.register_tab("nodes", "Nodes", minetest.registered_nodes) -creative.register_tab("tools", "Tools", minetest.registered_tools) -creative.register_tab("craftitems", "Items", minetest.registered_craftitems) +creative.register_tab("all", S("All"), minetest.registered_items) +creative.register_tab("nodes", S("Nodes"), minetest.registered_nodes) +creative.register_tab("tools", S("Tools"), minetest.registered_tools) +creative.register_tab("craftitems", S("Items"), minetest.registered_craftitems) local old_homepage_name = sfinv.get_homepage_name function sfinv.get_homepage_name(player) diff --git a/mods/default/chests.lua b/mods/default/chests.lua old mode 100644 new mode 100755 index b70e5ad..f75c406 --- a/mods/default/chests.lua +++ b/mods/default/chests.lua @@ -1,5 +1,9 @@ default.chest = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + function default.chest.get_chest_formspec(pos) local spos = pos.x .. "," .. pos.y .. "," .. pos.z local formspec = @@ -84,7 +88,7 @@ function default.chest.register_chest(name, d) if def.protected then def.on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("infotext", "Locked Chest") + meta:set_string("infotext", S("Locked Chest")) meta:set_string("owner", "") local inv = meta:get_inventory() inv:set_size("main", 8*4) @@ -92,8 +96,8 @@ function default.chest.register_chest(name, d) def.after_place_node = function(pos, placer) local meta = minetest.get_meta(pos) meta:set_string("owner", placer:get_player_name() or "") - meta:set_string("infotext", "Locked Chest (owned by " .. - meta:get_string("owner") .. ")") + meta:set_string("infotext", S("Locked Chest (owned by @1)", + meta:get_string("owner"))) end def.can_dig = function(pos,player) local meta = minetest.get_meta(pos); @@ -171,7 +175,7 @@ function default.chest.register_chest(name, d) -- verify placer is owner of lockable chest if owner ~= pn then minetest.record_protection_violation(pos, pn) - minetest.chat_send_player(pn, "You do not own this chest.") + minetest.chat_send_player(pn, S("You do not own this chest.")) return nil end @@ -181,12 +185,12 @@ function default.chest.register_chest(name, d) meta:set_string("key_lock_secret", secret) end - return secret, "a locked chest", owner + return secret, S("a locked chest"), owner end else def.on_construct = function(pos) local meta = minetest.get_meta(pos) - meta:set_string("infotext", "Chest") + meta:set_string("infotext", S("Chest")) local inv = meta:get_inventory() inv:set_size("main", 8*4) end @@ -285,7 +289,7 @@ function default.chest.register_chest(name, d) end default.chest.register_chest("chest", { - description = "Chest", + description = S("Chest"), tiles = { "default_chest_top.png", "default_chest_top.png", @@ -301,7 +305,7 @@ default.chest.register_chest("chest", { }) default.chest.register_chest("chest_locked", { - description = "Locked Chest", + description = S("Locked Chest"), tiles = { "default_chest_top.png", "default_chest_top.png", diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua old mode 100644 new mode 100755 index 711e5c1..a15437e --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -1,13 +1,17 @@ -- mods/default/craftitems.lua +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + minetest.register_craftitem("default:stick", { - description = "Stick", + description = S("Stick"), inventory_image = "default_stick.png", groups = {stick = 1, flammable = 2}, }) minetest.register_craftitem("default:paper", { - description = "Paper", + description = S("Paper"), inventory_image = "default_paper.png", groups = {flammable = 3}, }) @@ -108,7 +112,9 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if #short_title > short_title_size + 3 then short_title = short_title:sub(1, short_title_size) .. "..." end - data.description = "\""..short_title.."\" by "..data.owner + -- Make description appropriate to intllib + -- data.description = "\""..short_title.."\" by "..data.owner + data.description = S("\"@1\" by @2", short_title, data.owner) data.text = fields.text:sub(1, max_text_size) data.text = data.text:gsub("\r\n", "\n"):gsub("\r", "\n") data.page = 1 @@ -155,14 +161,14 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end) minetest.register_craftitem("default:book", { - description = "Book", + description = S("Book"), inventory_image = "default_book.png", groups = {book = 1, flammable = 3}, on_use = book_on_use, }) minetest.register_craftitem("default:book_written", { - description = "Book With Text", + description = S("Book With Text"), inventory_image = "default_book_written.png", groups = {book = 1, not_in_creative_inventory = 1, flammable = 3}, stack_max = 1, @@ -199,7 +205,7 @@ minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv end) minetest.register_craftitem("default:skeleton_key", { - description = "Skeleton Key", + description = S("Skeleton Key"), inventory_image = "default_key_skeleton.png", groups = {key = 1}, on_use = function(itemstack, user, pointed_thing) @@ -255,94 +261,93 @@ minetest.register_craftitem("default:skeleton_key", { }) minetest.register_craftitem("default:coal_lump", { - description = "Coal Lump", + description = S("Coal Lump"), inventory_image = "default_coal_lump.png", groups = {coal = 1, flammable = 1} }) minetest.register_craftitem("default:iron_lump", { - description = "Iron Lump", + description = S("Iron Lump"), inventory_image = "default_iron_lump.png", }) minetest.register_craftitem("default:copper_lump", { - description = "Copper Lump", + description = S("Copper Lump"), inventory_image = "default_copper_lump.png", }) minetest.register_craftitem("default:tin_lump", { - description = "Tin Lump", + description = S("Tin Lump"), inventory_image = "default_tin_lump.png", }) minetest.register_craftitem("default:mese_crystal", { - description = "Mese Crystal", + description = S("Mese Crystal"), inventory_image = "default_mese_crystal.png", }) minetest.register_craftitem("default:gold_lump", { - description = "Gold Lump", + description = S("Gold Lump"), inventory_image = "default_gold_lump.png", }) minetest.register_craftitem("default:diamond", { - description = "Diamond", + description = S("Diamond"), inventory_image = "default_diamond.png", }) minetest.register_craftitem("default:clay_lump", { - description = "Clay Lump", + description = S("Clay Lump"), inventory_image = "default_clay_lump.png", }) minetest.register_craftitem("default:steel_ingot", { - description = "Steel Ingot", + description = S("Steel Ingot"), inventory_image = "default_steel_ingot.png", }) minetest.register_craftitem("default:copper_ingot", { - description = "Copper Ingot", + description = S("Copper Ingot"), inventory_image = "default_copper_ingot.png", }) minetest.register_craftitem("default:tin_ingot", { - description = "Tin Ingot", + description = S("Tin Ingot"), inventory_image = "default_tin_ingot.png", }) minetest.register_craftitem("default:bronze_ingot", { - description = "Bronze Ingot", + description = S("Bronze Ingot"), inventory_image = "default_bronze_ingot.png", }) minetest.register_craftitem("default:gold_ingot", { - description = "Gold Ingot", + description = S("Gold Ingot"), inventory_image = "default_gold_ingot.png" }) minetest.register_craftitem("default:mese_crystal_fragment", { - description = "Mese Crystal Fragment", + description = S("Mese Crystal Fragment"), inventory_image = "default_mese_crystal_fragment.png", }) minetest.register_craftitem("default:clay_brick", { - description = "Clay Brick", + description = S("Clay Brick"), inventory_image = "default_clay_brick.png", }) minetest.register_craftitem("default:obsidian_shard", { - description = "Obsidian Shard", + description = S("Obsidian Shard"), inventory_image = "default_obsidian_shard.png", }) minetest.register_craftitem("default:flint", { - description = "Flint", + description = S("Flint"), inventory_image = "default_flint.png" }) minetest.register_craftitem("default:blueberries", { - description = "Blueberries", + description = S("Blueberries"), inventory_image = "default_blueberries.png", - groups = {food_blueberries = 1, food_berry = 1}, on_use = minetest.item_eat(2), }) diff --git a/mods/default/depends.txt b/mods/default/depends.txt old mode 100644 new mode 100755 index e1c3818..39e0035 --- a/mods/default/depends.txt +++ b/mods/default/depends.txt @@ -1 +1,2 @@ player_api? +game_intllib? diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua old mode 100644 new mode 100755 index a06f3b2..66cbc7f --- a/mods/default/furnace.lua +++ b/mods/default/furnace.lua @@ -1,3 +1,9 @@ +-- default/furnace.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + -- -- Formspecs @@ -60,7 +66,7 @@ local function allow_metadata_inventory_put(pos, listname, index, stack, player) if listname == "fuel" then if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then if inv:is_empty("src") then - meta:set_string("infotext", "Furnace is empty") + meta:set_string("infotext", S("Furnace is empty")) end return stack:get_count() else @@ -196,19 +202,19 @@ local function furnace_node_timer(pos, elapsed) if cookable then item_percent = math.floor(src_time / cooked.time * 100) if item_percent > 100 then - item_state = "100% (output full)" + item_state = S("100% (output full)") else - item_state = item_percent .. "%" + item_state = S("@1%", item_percent) end else if srclist[1]:is_empty() then - item_state = "Empty" + item_state = S("Empty") else - item_state = "Not cookable" + item_state = S("Not cookable") end end - local fuel_state = "Empty" + local fuel_state = S("Empty") local active = "inactive" local result = false @@ -230,8 +236,10 @@ local function furnace_node_timer(pos, elapsed) minetest.get_node_timer(pos):stop() end - local infotext = "Furnace " .. active .. "\n(Item: " .. item_state .. - "; Fuel: " .. fuel_state .. ")" +-- local infotext = "Furnace " .. active .. "\n(Item: " .. item_state .. +-- "; Fuel: " .. fuel_state .. ")" + local infotext = S("Furnace @1 \n(Item: @2; Fuel: @3)", active, + item_state, fuel_state) -- -- Set meta values @@ -250,7 +258,7 @@ end -- minetest.register_node("default:furnace", { - description = "Furnace", + description = S("Furnace"), tiles = { "default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", "default_furnace_side.png", @@ -298,7 +306,7 @@ minetest.register_node("default:furnace", { }) minetest.register_node("default:furnace_active", { - description = "Furnace", + description = S("Furnace"), tiles = { "default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", "default_furnace_side.png", diff --git a/mods/default/gintllib.lua b/mods/default/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/default/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/default/nodes.lua b/mods/default/nodes.lua old mode 100644 new mode 100755 index 4cbd505..602f36f --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -1,5 +1,9 @@ -- mods/default/nodes.lua +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + --[[ Node name convention: @@ -230,7 +234,7 @@ default:cloud -- minetest.register_node("default:stone", { - description = "Stone", + description = S("Stone"), tiles = {"default_stone.png"}, groups = {cracky = 3, stone = 1}, drop = 'default:cobble', @@ -239,7 +243,7 @@ minetest.register_node("default:stone", { }) minetest.register_node("default:cobble", { - description = "Cobblestone", + description = S("Cobblestone"), tiles = {"default_cobble.png"}, is_ground_content = false, groups = {cracky = 3, stone = 2}, @@ -247,7 +251,7 @@ minetest.register_node("default:cobble", { }) minetest.register_node("default:stonebrick", { - description = "Stone Brick", + description = S("Stone Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_stone_brick.png"}, @@ -257,7 +261,7 @@ minetest.register_node("default:stonebrick", { }) minetest.register_node("default:stone_block", { - description = "Stone Block", + description = S("Stone Block"), tiles = {"default_stone_block.png"}, is_ground_content = false, groups = {cracky = 2, stone = 1}, @@ -265,7 +269,7 @@ minetest.register_node("default:stone_block", { }) minetest.register_node("default:mossycobble", { - description = "Mossy Cobblestone", + description = S("Mossy Cobblestone"), tiles = {"default_mossycobble.png"}, is_ground_content = false, groups = {cracky = 3, stone = 1}, @@ -274,7 +278,7 @@ minetest.register_node("default:mossycobble", { minetest.register_node("default:desert_stone", { - description = "Desert Stone", + description = S("Desert Stone"), tiles = {"default_desert_stone.png"}, groups = {cracky = 3, stone = 1}, drop = 'default:desert_cobble', @@ -283,7 +287,7 @@ minetest.register_node("default:desert_stone", { }) minetest.register_node("default:desert_cobble", { - description = "Desert Cobblestone", + description = S("Desert Cobblestone"), tiles = {"default_desert_cobble.png"}, is_ground_content = false, groups = {cracky = 3, stone = 2}, @@ -291,7 +295,7 @@ minetest.register_node("default:desert_cobble", { }) minetest.register_node("default:desert_stonebrick", { - description = "Desert Stone Brick", + description = S("Desert Stone Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_desert_stone_brick.png"}, @@ -301,7 +305,7 @@ minetest.register_node("default:desert_stonebrick", { }) minetest.register_node("default:desert_stone_block", { - description = "Desert Stone Block", + description = S("Desert Stone Block"), tiles = {"default_desert_stone_block.png"}, is_ground_content = false, groups = {cracky = 2, stone = 1}, @@ -309,14 +313,14 @@ minetest.register_node("default:desert_stone_block", { }) minetest.register_node("default:sandstone", { - description = "Sandstone", + description = S("Sandstone"), tiles = {"default_sandstone.png"}, groups = {crumbly = 1, cracky = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:sandstonebrick", { - description = "Sandstone Brick", + description = S("Sandstone Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_sandstone_brick.png"}, @@ -326,7 +330,7 @@ minetest.register_node("default:sandstonebrick", { }) minetest.register_node("default:sandstone_block", { - description = "Sandstone Block", + description = S("Sandstone Block"), tiles = {"default_sandstone_block.png"}, is_ground_content = false, groups = {cracky = 2}, @@ -334,14 +338,14 @@ minetest.register_node("default:sandstone_block", { }) minetest.register_node("default:desert_sandstone", { - description = "Desert Sandstone", + description = S("Desert Sandstone"), tiles = {"default_desert_sandstone.png"}, groups = {crumbly = 1, cracky = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:desert_sandstone_brick", { - description = "Desert Sandstone Brick", + description = S("Desert Sandstone Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_desert_sandstone_brick.png"}, @@ -351,7 +355,7 @@ minetest.register_node("default:desert_sandstone_brick", { }) minetest.register_node("default:desert_sandstone_block", { - description = "Desert Sandstone Block", + description = S("Desert Sandstone Block"), tiles = {"default_desert_sandstone_block.png"}, is_ground_content = false, groups = {cracky = 2}, @@ -359,14 +363,14 @@ minetest.register_node("default:desert_sandstone_block", { }) minetest.register_node("default:silver_sandstone", { - description = "Silver Sandstone", + description = S("Silver Sandstone"), tiles = {"default_silver_sandstone.png"}, groups = {crumbly = 1, cracky = 3}, sounds = default.node_sound_stone_defaults(), }) minetest.register_node("default:silver_sandstone_brick", { - description = "Silver Sandstone Brick", + description = S("Silver Sandstone Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_silver_sandstone_brick.png"}, @@ -376,7 +380,7 @@ minetest.register_node("default:silver_sandstone_brick", { }) minetest.register_node("default:silver_sandstone_block", { - description = "Silver Sandstone Block", + description = S("Silver Sandstone Block"), tiles = {"default_silver_sandstone_block.png"}, is_ground_content = false, groups = {cracky = 2}, @@ -384,14 +388,14 @@ minetest.register_node("default:silver_sandstone_block", { }) minetest.register_node("default:obsidian", { - description = "Obsidian", + description = S("Obsidian"), tiles = {"default_obsidian.png"}, sounds = default.node_sound_stone_defaults(), groups = {cracky = 1, level = 2}, }) minetest.register_node("default:obsidianbrick", { - description = "Obsidian Brick", + description = S("Obsidian Brick"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_obsidian_brick.png"}, @@ -401,7 +405,7 @@ minetest.register_node("default:obsidianbrick", { }) minetest.register_node("default:obsidian_block", { - description = "Obsidian Block", + description = S("Obsidian Block"), tiles = {"default_obsidian_block.png"}, is_ground_content = false, sounds = default.node_sound_stone_defaults(), @@ -413,14 +417,14 @@ minetest.register_node("default:obsidian_block", { -- minetest.register_node("default:dirt", { - description = "Dirt", + description = S("Dirt"), tiles = {"default_dirt.png"}, groups = {crumbly = 3, soil = 1}, sounds = default.node_sound_dirt_defaults(), }) minetest.register_node("default:dirt_with_grass", { - description = "Dirt with Grass", + description = S("Dirt with Grass"), tiles = {"default_grass.png", "default_dirt.png", {name = "default_dirt.png^default_grass_side.png", tileable_vertical = false}}, @@ -432,7 +436,7 @@ minetest.register_node("default:dirt_with_grass", { }) minetest.register_node("default:dirt_with_grass_footsteps", { - description = "Dirt with Grass and Footsteps", + description = S("Dirt with Grass and Footsteps"), tiles = {"default_grass.png^default_footprint.png", "default_dirt.png", {name = "default_dirt.png^default_grass_side.png", tileable_vertical = false}}, @@ -444,7 +448,7 @@ minetest.register_node("default:dirt_with_grass_footsteps", { }) minetest.register_node("default:dirt_with_dry_grass", { - description = "Dirt with Dry Grass", + description = S("Dirt with Dry Grass"), tiles = {"default_dry_grass.png", "default_dirt.png", {name = "default_dirt.png^default_dry_grass_side.png", @@ -457,7 +461,7 @@ minetest.register_node("default:dirt_with_dry_grass", { }) minetest.register_node("default:dirt_with_snow", { - description = "Dirt with Snow", + description = S("Dirt with Snow"), tiles = {"default_snow.png", "default_dirt.png", {name = "default_dirt.png^default_snow_side.png", tileable_vertical = false}}, @@ -469,7 +473,7 @@ minetest.register_node("default:dirt_with_snow", { }) minetest.register_node("default:dirt_with_rainforest_litter", { - description = "Dirt with Rainforest Litter", + description = S("Dirt with Rainforest Litter"), tiles = { "default_rainforest_litter.png", "default_dirt.png", @@ -484,7 +488,7 @@ minetest.register_node("default:dirt_with_rainforest_litter", { }) minetest.register_node("default:dirt_with_coniferous_litter", { - description = "Dirt with Coniferous Litter", + description = S("Dirt with Coniferous Litter"), tiles = { "default_coniferous_litter.png", "default_dirt.png", @@ -499,14 +503,14 @@ minetest.register_node("default:dirt_with_coniferous_litter", { }) minetest.register_node("default:permafrost", { - description = "Permafrost", + description = S("Permafrost"), tiles = {"default_permafrost.png"}, groups = {cracky = 3}, sounds = default.node_sound_dirt_defaults(), }) minetest.register_node("default:permafrost_with_stones", { - description = "Permafrost with Stones", + description = S("Permafrost with Stones"), tiles = {"default_permafrost.png^default_stones.png", "default_permafrost.png", "default_permafrost.png^default_stones_side.png"}, @@ -515,7 +519,7 @@ minetest.register_node("default:permafrost_with_stones", { }) minetest.register_node("default:permafrost_with_moss", { - description = "Permafrost with Moss", + description = S("Permafrost with Moss"), tiles = {"default_moss.png", "default_permafrost.png", {name = "default_permafrost.png^default_moss_side.png", tileable_vertical = false}}, @@ -526,21 +530,21 @@ minetest.register_node("default:permafrost_with_moss", { }) minetest.register_node("default:sand", { - description = "Sand", + description = S("Sand"), tiles = {"default_sand.png"}, groups = {crumbly = 3, falling_node = 1, sand = 1}, sounds = default.node_sound_sand_defaults(), }) minetest.register_node("default:desert_sand", { - description = "Desert Sand", + description = S("Desert Sand"), tiles = {"default_desert_sand.png"}, groups = {crumbly = 3, falling_node = 1, sand = 1}, sounds = default.node_sound_sand_defaults(), }) minetest.register_node("default:silver_sand", { - description = "Silver Sand", + description = S("Silver Sand"), tiles = {"default_silver_sand.png"}, groups = {crumbly = 3, falling_node = 1, sand = 1}, sounds = default.node_sound_sand_defaults(), @@ -548,7 +552,7 @@ minetest.register_node("default:silver_sand", { minetest.register_node("default:gravel", { - description = "Gravel", + description = S("Gravel"), tiles = {"default_gravel.png"}, groups = {crumbly = 2, falling_node = 1}, sounds = default.node_sound_gravel_defaults(), @@ -562,7 +566,7 @@ minetest.register_node("default:gravel", { }) minetest.register_node("default:clay", { - description = "Clay", + description = S("Clay"), tiles = {"default_clay.png"}, groups = {crumbly = 3}, drop = 'default:clay_lump 4', @@ -571,7 +575,7 @@ minetest.register_node("default:clay", { minetest.register_node("default:snow", { - description = "Snow", + description = S("Snow"), tiles = {"default_snow.png"}, inventory_image = "default_snowball.png", wield_image = "default_snowball.png", @@ -603,7 +607,7 @@ minetest.register_node("default:snow", { }) minetest.register_node("default:snowblock", { - description = "Snow Block", + description = S("Snow Block"), tiles = {"default_snow.png"}, groups = {crumbly = 3, cools_lava = 1, snowy = 1}, sounds = default.node_sound_snow_defaults(), @@ -618,7 +622,7 @@ minetest.register_node("default:snowblock", { -- 'is ground content = false' to avoid tunnels in sea ice or ice rivers minetest.register_node("default:ice", { - description = "Ice", + description = S("Ice"), tiles = {"default_ice.png"}, is_ground_content = false, paramtype = "light", @@ -628,7 +632,7 @@ minetest.register_node("default:ice", { -- Mapgen-placed ice with 'is ground content = true' to contain tunnels minetest.register_node("default:cave_ice", { - description = "Cave Ice", + description = S("Cave Ice"), tiles = {"default_ice.png"}, paramtype = "light", groups = {cracky = 3, cools_lava = 1, slippery = 3, @@ -642,7 +646,7 @@ minetest.register_node("default:cave_ice", { -- minetest.register_node("default:tree", { - description = "Apple Tree", + description = S("Apple Tree"), tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, paramtype2 = "facedir", is_ground_content = false, @@ -653,7 +657,7 @@ minetest.register_node("default:tree", { }) minetest.register_node("default:wood", { - description = "Apple Wood Planks", + description = S("Apple Wood Planks"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_wood.png"}, @@ -663,7 +667,7 @@ minetest.register_node("default:wood", { }) minetest.register_node("default:sapling", { - description = "Apple Tree Sapling", + description = S("Apple Tree Sapling"), drawtype = "plantlike", tiles = {"default_sapling.png"}, inventory_image = "default_sapling.png", @@ -699,7 +703,7 @@ minetest.register_node("default:sapling", { }) minetest.register_node("default:leaves", { - description = "Apple Tree Leaves", + description = S("Apple Tree Leaves"), drawtype = "allfaces_optional", waving = 1, tiles = {"default_leaves.png"}, @@ -728,7 +732,7 @@ minetest.register_node("default:leaves", { }) minetest.register_node("default:apple", { - description = "Apple", + description = S("Apple"), drawtype = "plantlike", tiles = {"default_apple.png"}, inventory_image = "default_apple.png", @@ -758,7 +762,7 @@ minetest.register_node("default:apple", { }) minetest.register_node("default:apple_mark", { - description = "Apple Marker", + description = S("Apple Marker"), drawtype = "airlike", paramtype = "light", sunlight_propagates = true, @@ -781,7 +785,7 @@ minetest.register_node("default:apple_mark", { minetest.register_node("default:jungletree", { - description = "Jungle Tree", + description = S("Jungle Tree"), tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, paramtype2 = "facedir", @@ -793,7 +797,7 @@ minetest.register_node("default:jungletree", { }) minetest.register_node("default:junglewood", { - description = "Jungle Wood Planks", + description = S("Jungle Wood Planks"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_junglewood.png"}, @@ -803,7 +807,7 @@ minetest.register_node("default:junglewood", { }) minetest.register_node("default:jungleleaves", { - description = "Jungle Tree Leaves", + description = S("Jungle Tree Leaves"), drawtype = "allfaces_optional", waving = 1, tiles = {"default_jungleleaves.png"}, @@ -824,7 +828,7 @@ minetest.register_node("default:jungleleaves", { }) minetest.register_node("default:junglesapling", { - description = "Jungle Tree Sapling", + description = S("Jungle Tree Sapling"), drawtype = "plantlike", tiles = {"default_junglesapling.png"}, inventory_image = "default_junglesapling.png", @@ -860,7 +864,7 @@ minetest.register_node("default:junglesapling", { }) minetest.register_node("default:emergent_jungle_sapling", { - description = "Emergent Jungle Tree Sapling", + description = S("Emergent Jungle Tree Sapling"), drawtype = "plantlike", tiles = {"default_emergent_jungle_sapling.png"}, inventory_image = "default_emergent_jungle_sapling.png", @@ -896,7 +900,7 @@ minetest.register_node("default:emergent_jungle_sapling", { minetest.register_node("default:pine_tree", { - description = "Pine Tree", + description = S("Pine Tree"), tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png", "default_pine_tree.png"}, paramtype2 = "facedir", @@ -908,7 +912,7 @@ minetest.register_node("default:pine_tree", { }) minetest.register_node("default:pine_wood", { - description = "Pine Wood Planks", + description = S("Pine Wood Planks"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_pine_wood.png"}, @@ -918,7 +922,7 @@ minetest.register_node("default:pine_wood", { }) minetest.register_node("default:pine_needles",{ - description = "Pine Needles", + description = S("Pine Needles"), drawtype = "allfaces_optional", tiles = {"default_pine_needles.png"}, waving = 1, @@ -938,7 +942,7 @@ minetest.register_node("default:pine_needles",{ }) minetest.register_node("default:pine_sapling", { - description = "Pine Tree Sapling", + description = S("Pine Tree Sapling"), drawtype = "plantlike", tiles = {"default_pine_sapling.png"}, inventory_image = "default_pine_sapling.png", @@ -975,7 +979,7 @@ minetest.register_node("default:pine_sapling", { minetest.register_node("default:acacia_tree", { - description = "Acacia Tree", + description = S("Acacia Tree"), tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png", "default_acacia_tree.png"}, paramtype2 = "facedir", @@ -987,7 +991,7 @@ minetest.register_node("default:acacia_tree", { }) minetest.register_node("default:acacia_wood", { - description = "Acacia Wood Planks", + description = S("Acacia Wood Planks"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_acacia_wood.png"}, @@ -997,7 +1001,7 @@ minetest.register_node("default:acacia_wood", { }) minetest.register_node("default:acacia_leaves", { - description = "Acacia Tree Leaves", + description = S("Acacia Tree Leaves"), drawtype = "allfaces_optional", tiles = {"default_acacia_leaves.png"}, special_tiles = {"default_acacia_leaves_simple.png"}, @@ -1018,7 +1022,7 @@ minetest.register_node("default:acacia_leaves", { }) minetest.register_node("default:acacia_sapling", { - description = "Acacia Tree Sapling", + description = S("Acacia Tree Sapling"), drawtype = "plantlike", tiles = {"default_acacia_sapling.png"}, inventory_image = "default_acacia_sapling.png", @@ -1054,7 +1058,7 @@ minetest.register_node("default:acacia_sapling", { }) minetest.register_node("default:aspen_tree", { - description = "Aspen Tree", + description = S("Aspen Tree"), tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png", "default_aspen_tree.png"}, paramtype2 = "facedir", @@ -1066,7 +1070,7 @@ minetest.register_node("default:aspen_tree", { }) minetest.register_node("default:aspen_wood", { - description = "Aspen Wood Planks", + description = S("Aspen Wood Planks"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_aspen_wood.png"}, @@ -1076,7 +1080,7 @@ minetest.register_node("default:aspen_wood", { }) minetest.register_node("default:aspen_leaves", { - description = "Aspen Tree Leaves", + description = S("Aspen Tree Leaves"), drawtype = "allfaces_optional", tiles = {"default_aspen_leaves.png"}, waving = 1, @@ -1096,7 +1100,7 @@ minetest.register_node("default:aspen_leaves", { }) minetest.register_node("default:aspen_sapling", { - description = "Aspen Tree Sapling", + description = S("Aspen Tree Sapling"), drawtype = "plantlike", tiles = {"default_aspen_sapling.png"}, inventory_image = "default_aspen_sapling.png", @@ -1136,7 +1140,7 @@ minetest.register_node("default:aspen_sapling", { -- minetest.register_node("default:stone_with_coal", { - description = "Coal Ore", + description = S("Coal Ore"), tiles = {"default_stone.png^default_mineral_coal.png"}, groups = {cracky = 3}, drop = 'default:coal_lump', @@ -1144,7 +1148,7 @@ minetest.register_node("default:stone_with_coal", { }) minetest.register_node("default:coalblock", { - description = "Coal Block", + description = S("Coal Block"), tiles = {"default_coal_block.png"}, is_ground_content = false, groups = {cracky = 3}, @@ -1153,7 +1157,7 @@ minetest.register_node("default:coalblock", { minetest.register_node("default:stone_with_iron", { - description = "Iron Ore", + description = S("Iron Ore"), tiles = {"default_stone.png^default_mineral_iron.png"}, groups = {cracky = 2}, drop = 'default:iron_lump', @@ -1161,7 +1165,7 @@ minetest.register_node("default:stone_with_iron", { }) minetest.register_node("default:steelblock", { - description = "Steel Block", + description = S("Steel Block"), tiles = {"default_steel_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, @@ -1170,7 +1174,7 @@ minetest.register_node("default:steelblock", { minetest.register_node("default:stone_with_copper", { - description = "Copper Ore", + description = S("Copper Ore"), tiles = {"default_stone.png^default_mineral_copper.png"}, groups = {cracky = 2}, drop = 'default:copper_lump', @@ -1178,7 +1182,7 @@ minetest.register_node("default:stone_with_copper", { }) minetest.register_node("default:copperblock", { - description = "Copper Block", + description = S("Copper Block"), tiles = {"default_copper_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, @@ -1187,7 +1191,7 @@ minetest.register_node("default:copperblock", { minetest.register_node("default:stone_with_tin", { - description = "Tin Ore", + description = S("Tin Ore"), tiles = {"default_stone.png^default_mineral_tin.png"}, groups = {cracky = 2}, drop = "default:tin_lump", @@ -1195,7 +1199,7 @@ minetest.register_node("default:stone_with_tin", { }) minetest.register_node("default:tinblock", { - description = "Tin Block", + description = S("Tin Block"), tiles = {"default_tin_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, @@ -1204,7 +1208,7 @@ minetest.register_node("default:tinblock", { minetest.register_node("default:bronzeblock", { - description = "Bronze Block", + description = S("Bronze Block"), tiles = {"default_bronze_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 2}, @@ -1213,7 +1217,7 @@ minetest.register_node("default:bronzeblock", { minetest.register_node("default:stone_with_mese", { - description = "Mese Ore", + description = S("Mese Ore"), tiles = {"default_stone.png^default_mineral_mese.png"}, groups = {cracky = 1}, drop = "default:mese_crystal", @@ -1221,7 +1225,7 @@ minetest.register_node("default:stone_with_mese", { }) minetest.register_node("default:mese", { - description = "Mese Block", + description = S("Mese Block"), tiles = {"default_mese_block.png"}, paramtype = "light", groups = {cracky = 1, level = 2}, @@ -1231,7 +1235,7 @@ minetest.register_node("default:mese", { minetest.register_node("default:stone_with_gold", { - description = "Gold Ore", + description = S("Gold Ore"), tiles = {"default_stone.png^default_mineral_gold.png"}, groups = {cracky = 2}, drop = "default:gold_lump", @@ -1239,7 +1243,7 @@ minetest.register_node("default:stone_with_gold", { }) minetest.register_node("default:goldblock", { - description = "Gold Block", + description = S("Gold Block"), tiles = {"default_gold_block.png"}, is_ground_content = false, groups = {cracky = 1}, @@ -1248,7 +1252,7 @@ minetest.register_node("default:goldblock", { minetest.register_node("default:stone_with_diamond", { - description = "Diamond Ore", + description = S("Diamond Ore"), tiles = {"default_stone.png^default_mineral_diamond.png"}, groups = {cracky = 1}, drop = "default:diamond", @@ -1256,7 +1260,7 @@ minetest.register_node("default:stone_with_diamond", { }) minetest.register_node("default:diamondblock", { - description = "Diamond Block", + description = S("Diamond Block"), tiles = {"default_diamond_block.png"}, is_ground_content = false, groups = {cracky = 1, level = 3}, @@ -1268,7 +1272,7 @@ minetest.register_node("default:diamondblock", { -- minetest.register_node("default:cactus", { - description = "Cactus", + description = S("Cactus"), tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, paramtype2 = "facedir", @@ -1278,7 +1282,7 @@ minetest.register_node("default:cactus", { }) minetest.register_node("default:large_cactus_seedling", { - description = "Large Cactus Seedling", + description = S("Large Cactus Seedling"), drawtype = "plantlike", tiles = {"default_large_cactus_seedling.png"}, inventory_image = "default_large_cactus_seedling.png", @@ -1349,7 +1353,7 @@ minetest.register_node("default:large_cactus_seedling", { }) minetest.register_node("default:papyrus", { - description = "Papyrus", + description = S("Papyrus"), drawtype = "plantlike", tiles = {"default_papyrus.png"}, inventory_image = "default_papyrus.png", @@ -1370,7 +1374,7 @@ minetest.register_node("default:papyrus", { }) minetest.register_node("default:dry_shrub", { - description = "Dry Shrub", + description = S("Dry Shrub"), drawtype = "plantlike", waving = 1, tiles = {"default_dry_shrub.png"}, @@ -1391,7 +1395,7 @@ minetest.register_node("default:dry_shrub", { }) minetest.register_node("default:junglegrass", { - description = "Jungle Grass", + description = S("Jungle Grass"), drawtype = "plantlike", waving = 1, visual_scale = 1.69, @@ -1412,7 +1416,7 @@ minetest.register_node("default:junglegrass", { minetest.register_node("default:grass_1", { - description = "Grass", + description = S("Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_grass_1.png"}, @@ -1441,7 +1445,7 @@ minetest.register_node("default:grass_1", { for i = 2, 5 do minetest.register_node("default:grass_" .. i, { - description = "Grass", + description = S("Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_grass_" .. i .. ".png"}, @@ -1464,7 +1468,7 @@ end minetest.register_node("default:dry_grass_1", { - description = "Dry Grass", + description = S("Dry Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_dry_grass_1.png"}, @@ -1493,7 +1497,7 @@ minetest.register_node("default:dry_grass_1", { for i = 2, 5 do minetest.register_node("default:dry_grass_" .. i, { - description = "Dry Grass", + description = S("Dry Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_dry_grass_" .. i .. ".png"}, @@ -1516,7 +1520,7 @@ end minetest.register_node("default:fern_1", { - description = "Fern", + description = S("Fern"), drawtype = "plantlike", waving = 1, tiles = {"default_fern_1.png"}, @@ -1544,7 +1548,7 @@ minetest.register_node("default:fern_1", { for i = 2, 3 do minetest.register_node("default:fern_" .. i, { - description = "Fern", + description = S("Fern"), drawtype = "plantlike", waving = 1, visual_scale = 2, @@ -1568,7 +1572,7 @@ end minetest.register_node("default:marram_grass_1", { - description = "Marram Grass", + description = S("Marram Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_marram_grass_1.png"}, @@ -1596,7 +1600,7 @@ minetest.register_node("default:marram_grass_1", { for i = 2, 3 do minetest.register_node("default:marram_grass_" .. i, { - description = "Marram Grass", + description = S("Marram Grass"), drawtype = "plantlike", waving = 1, tiles = {"default_marram_grass_" .. i .. ".png"}, @@ -1619,7 +1623,7 @@ end minetest.register_node("default:bush_stem", { - description = "Bush Stem", + description = S("Bush Stem"), drawtype = "plantlike", visual_scale = 1.41, tiles = {"default_bush_stem.png"}, @@ -1636,7 +1640,7 @@ minetest.register_node("default:bush_stem", { }) minetest.register_node("default:bush_leaves", { - description = "Bush Leaves", + description = S("Bush Leaves"), drawtype = "allfaces_optional", waving = 1, tiles = {"default_leaves_simple.png"}, @@ -1655,7 +1659,7 @@ minetest.register_node("default:bush_leaves", { }) minetest.register_node("default:bush_sapling", { - description = "Bush Sapling", + description = S("Bush Sapling"), drawtype = "plantlike", tiles = {"default_bush_sapling.png"}, inventory_image = "default_bush_sapling.png", @@ -1690,7 +1694,7 @@ minetest.register_node("default:bush_sapling", { }) minetest.register_node("default:blueberry_bush_leaves_with_berries", { - description = "Blueberry Bush Leaves with Berries", + description = S("Blueberry Bush Leaves with Berries"), drawtype = "allfaces_optional", waving = 1, tiles = {"default_blueberry_bush_leaves.png^default_blueberry_overlay.png"}, @@ -1707,7 +1711,7 @@ minetest.register_node("default:blueberry_bush_leaves_with_berries", { }) minetest.register_node("default:blueberry_bush_leaves", { - description = "Blueberry Bush Leaves", + description = S("Blueberry Bush Leaves"), drawtype = "allfaces_optional", waving = 1, tiles = {"default_blueberry_bush_leaves.png"}, @@ -1734,7 +1738,7 @@ minetest.register_node("default:blueberry_bush_leaves", { }) minetest.register_node("default:blueberry_bush_sapling", { - description = "Blueberry Bush Sapling", + description = S("Blueberry Bush Sapling"), drawtype = "plantlike", tiles = {"default_blueberry_bush_sapling.png"}, inventory_image = "default_blueberry_bush_sapling.png", @@ -1769,7 +1773,7 @@ minetest.register_node("default:blueberry_bush_sapling", { }) minetest.register_node("default:acacia_bush_stem", { - description = "Acacia Bush Stem", + description = S("Acacia Bush Stem"), drawtype = "plantlike", visual_scale = 1.41, tiles = {"default_acacia_bush_stem.png"}, @@ -1786,7 +1790,7 @@ minetest.register_node("default:acacia_bush_stem", { }) minetest.register_node("default:acacia_bush_leaves", { - description = "Acacia Bush Leaves", + description = S("Acacia Bush Leaves"), drawtype = "allfaces_optional", waving = 1, tiles = {"default_acacia_leaves_simple.png"}, @@ -1805,7 +1809,7 @@ minetest.register_node("default:acacia_bush_leaves", { }) minetest.register_node("default:acacia_bush_sapling", { - description = "Acacia Bush Sapling", + description = S("Acacia Bush Sapling"), drawtype = "plantlike", tiles = {"default_acacia_bush_sapling.png"}, inventory_image = "default_acacia_bush_sapling.png", @@ -1840,7 +1844,7 @@ minetest.register_node("default:acacia_bush_sapling", { }) minetest.register_node("default:pine_bush_stem", { - description = "Pine Bush Stem", + description = S("Pine Bush Stem"), drawtype = "plantlike", visual_scale = 1.41, tiles = {"default_pine_bush_stem.png"}, @@ -1857,7 +1861,7 @@ minetest.register_node("default:pine_bush_stem", { }) minetest.register_node("default:pine_bush_needles", { - description = "Pine Bush Needles", + description = S("Pine Bush Needles"), drawtype = "allfaces_optional", waving = 1, tiles = {"default_pine_needles.png"}, @@ -1876,7 +1880,7 @@ minetest.register_node("default:pine_bush_needles", { }) minetest.register_node("default:pine_bush_sapling", { - description = "Pine Bush Sapling", + description = S("Pine Bush Sapling"), drawtype = "plantlike", tiles = {"default_pine_bush_sapling.png"}, inventory_image = "default_pine_bush_sapling.png", @@ -1911,7 +1915,7 @@ minetest.register_node("default:pine_bush_sapling", { }) minetest.register_node("default:sand_with_kelp", { - description = "Kelp", + description = S("Kelp"), drawtype = "plantlike_rooted", waving = 1, tiles = {"default_sand.png"}, @@ -1987,7 +1991,7 @@ minetest.register_node("default:sand_with_kelp", { -- minetest.register_node("default:coral_green", { - description = "Green Coral", + description = S("Green Coral"), drawtype = "plantlike_rooted", waving = 1, paramtype = "light", @@ -2044,7 +2048,7 @@ minetest.register_node("default:coral_green", { }) minetest.register_node("default:coral_pink", { - description = "Pink Coral", + description = S("Pink Coral"), drawtype = "plantlike_rooted", waving = 1, paramtype = "light", @@ -2101,7 +2105,7 @@ minetest.register_node("default:coral_pink", { }) minetest.register_node("default:coral_cyan", { - description = "Cyan Coral", + description = S("Cyan Coral"), drawtype = "plantlike_rooted", waving = 1, paramtype = "light", @@ -2158,7 +2162,7 @@ minetest.register_node("default:coral_cyan", { }) minetest.register_node("default:coral_brown", { - description = "Brown Coral", + description = S("Brown Coral"), tiles = {"default_coral_brown.png"}, groups = {cracky = 3}, drop = "default:coral_skeleton", @@ -2166,7 +2170,7 @@ minetest.register_node("default:coral_brown", { }) minetest.register_node("default:coral_orange", { - description = "Orange Coral", + description = S("Orange Coral"), tiles = {"default_coral_orange.png"}, groups = {cracky = 3}, drop = "default:coral_skeleton", @@ -2174,7 +2178,7 @@ minetest.register_node("default:coral_orange", { }) minetest.register_node("default:coral_skeleton", { - description = "Coral Skeleton", + description = S("Coral Skeleton"), tiles = {"default_coral_skeleton.png"}, groups = {cracky = 3}, sounds = default.node_sound_stone_defaults(), @@ -2186,9 +2190,8 @@ minetest.register_node("default:coral_skeleton", { -- minetest.register_node("default:water_source", { - description = "Water Source", + description = S("Water Source"), drawtype = "liquid", - waving = 3, tiles = { { name = "default_water_source_animated.png", @@ -2230,9 +2233,8 @@ minetest.register_node("default:water_source", { }) minetest.register_node("default:water_flowing", { - description = "Flowing Water", + description = S("Flowing Water"), drawtype = "flowingliquid", - waving = 3, tiles = {"default_water.png"}, special_tiles = { { @@ -2278,7 +2280,7 @@ minetest.register_node("default:water_flowing", { minetest.register_node("default:river_water_source", { - description = "River Water Source", + description = S("River Water Source"), drawtype = "liquid", tiles = { { @@ -2327,7 +2329,7 @@ minetest.register_node("default:river_water_source", { }) minetest.register_node("default:river_water_flowing", { - description = "Flowing River Water", + description = S("Flowing River Water"), drawtype = "flowingliquid", tiles = {"default_river_water.png"}, special_tiles = { @@ -2376,7 +2378,7 @@ minetest.register_node("default:river_water_flowing", { minetest.register_node("default:lava_source", { - description = "Lava Source", + description = S("Lava Source"), drawtype = "liquid", tiles = { { @@ -2420,7 +2422,7 @@ minetest.register_node("default:lava_source", { }) minetest.register_node("default:lava_flowing", { - description = "Flowing Lava", + description = S("Flowing Lava"), drawtype = "flowingliquid", tiles = {"default_lava.png"}, special_tiles = { @@ -2509,15 +2511,17 @@ local function update_bookshelf(pos) end meta:set_string("formspec", formspec) if n_written + n_empty == 0 then - meta:set_string("infotext", "Empty Bookshelf") + meta:set_string("infotext", S("Empty Bookshelf")) else - meta:set_string("infotext", "Bookshelf (" .. n_written .. - " written, " .. n_empty .. " empty books)") +-- meta:set_string("infotext", "Bookshelf (" .. n_written .. +-- " written, " .. n_empty .. " empty books)") + meta:set_string("infotext", S("Bookshelf (@1 written, @2 empty books)", + n_written, n_empty)) end end minetest.register_node("default:bookshelf", { - description = "Bookshelf", + description = S("Bookshelf"), tiles = {"default_wood.png", "default_wood.png", "default_wood.png", "default_wood.png", "default_bookshelf.png", "default_bookshelf.png"}, paramtype2 = "facedir", @@ -2567,7 +2571,7 @@ minetest.register_node("default:bookshelf", { local function register_sign(material, desc, def) minetest.register_node("default:sign_wall_" .. material, { - description = desc .. " Sign", + description = S("@1 Sign", desc), drawtype = "nodebox", tiles = {"default_sign_wall_" .. material .. ".png"}, inventory_image = "default_sign_" .. material .. ".png", @@ -2604,7 +2608,7 @@ local function register_sign(material, desc, def) return end if string.len(text) > 512 then - minetest.chat_send_player(player_name, "Text too long") + minetest.chat_send_player(player_name, S("Text too long")) return end minetest.log("action", (player_name or "") .. " wrote \"" .. @@ -2616,18 +2620,18 @@ local function register_sign(material, desc, def) }) end -register_sign("wood", "Wooden", { +register_sign("wood", S("Wooden"), { sounds = default.node_sound_wood_defaults(), groups = {choppy = 2, attached_node = 1, flammable = 2, oddly_breakable_by_hand = 3} }) -register_sign("steel", "Steel", { +register_sign("steel", S("Steel"), { sounds = default.node_sound_metal_defaults(), groups = {cracky = 2, attached_node = 1} }) minetest.register_node("default:ladder_wood", { - description = "Wooden Ladder", + description = S("Wooden Ladder"), drawtype = "signlike", tiles = {"default_ladder_wood.png"}, inventory_image = "default_ladder_wood.png", @@ -2650,7 +2654,7 @@ minetest.register_node("default:ladder_wood", { }) minetest.register_node("default:ladder_steel", { - description = "Steel Ladder", + description = S("Steel Ladder"), drawtype = "signlike", tiles = {"default_ladder_steel.png"}, inventory_image = "default_ladder_steel.png", @@ -2672,7 +2676,7 @@ minetest.register_node("default:ladder_steel", { }) default.register_fence("default:fence_wood", { - description = "Apple Wood Fence", + description = S("Apple Wood Fence"), texture = "default_fence_wood.png", inventory_image = "default_fence_overlay.png^default_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", @@ -2684,7 +2688,7 @@ default.register_fence("default:fence_wood", { }) default.register_fence("default:fence_acacia_wood", { - description = "Acacia Wood Fence", + description = S("Acacia Wood Fence"), texture = "default_fence_acacia_wood.png", inventory_image = "default_fence_overlay.png^default_acacia_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", @@ -2696,7 +2700,7 @@ default.register_fence("default:fence_acacia_wood", { }) default.register_fence("default:fence_junglewood", { - description = "Jungle Wood Fence", + description = S("Jungle Wood Fence"), texture = "default_fence_junglewood.png", inventory_image = "default_fence_overlay.png^default_junglewood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", @@ -2708,7 +2712,7 @@ default.register_fence("default:fence_junglewood", { }) default.register_fence("default:fence_pine_wood", { - description = "Pine Wood Fence", + description = S("Pine Wood Fence"), texture = "default_fence_pine_wood.png", inventory_image = "default_fence_overlay.png^default_pine_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", @@ -2720,7 +2724,7 @@ default.register_fence("default:fence_pine_wood", { }) default.register_fence("default:fence_aspen_wood", { - description = "Aspen Wood Fence", + description = S("Aspen Wood Fence"), texture = "default_fence_aspen_wood.png", inventory_image = "default_fence_overlay.png^default_aspen_wood.png^" .. "default_fence_overlay.png^[makealpha:255,126,126", @@ -2732,7 +2736,7 @@ default.register_fence("default:fence_aspen_wood", { }) default.register_fence_rail("default:fence_rail_wood", { - description = "Apple Wood Fence Rail", + description = S("Apple Wood Fence Rail"), texture = "default_fence_rail_wood.png", inventory_image = "default_fence_rail_overlay.png^default_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", @@ -2744,7 +2748,7 @@ default.register_fence_rail("default:fence_rail_wood", { }) default.register_fence_rail("default:fence_rail_acacia_wood", { - description = "Acacia Wood Fence Rail", + description = S("Acacia Wood Fence Rail"), texture = "default_fence_rail_acacia_wood.png", inventory_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", @@ -2756,7 +2760,7 @@ default.register_fence_rail("default:fence_rail_acacia_wood", { }) default.register_fence_rail("default:fence_rail_junglewood", { - description = "Jungle Wood Fence Rail", + description = S("Jungle Wood Fence Rail"), texture = "default_fence_rail_junglewood.png", inventory_image = "default_fence_rail_overlay.png^default_junglewood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", @@ -2768,7 +2772,7 @@ default.register_fence_rail("default:fence_rail_junglewood", { }) default.register_fence_rail("default:fence_rail_pine_wood", { - description = "Pine Wood Fence Rail", + description = S("Pine Wood Fence Rail"), texture = "default_fence_rail_pine_wood.png", inventory_image = "default_fence_rail_overlay.png^default_pine_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", @@ -2780,7 +2784,7 @@ default.register_fence_rail("default:fence_rail_pine_wood", { }) default.register_fence_rail("default:fence_rail_aspen_wood", { - description = "Aspen Wood Fence Rail", + description = S("Aspen Wood Fence Rail"), texture = "default_fence_rail_aspen_wood.png", inventory_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" .. "default_fence_rail_overlay.png^[makealpha:255,126,126", @@ -2792,7 +2796,7 @@ default.register_fence_rail("default:fence_rail_aspen_wood", { }) minetest.register_node("default:glass", { - description = "Glass", + description = S("Glass"), drawtype = "glasslike_framed_optional", tiles = {"default_glass.png", "default_glass_detail.png"}, paramtype = "light", @@ -2804,7 +2808,7 @@ minetest.register_node("default:glass", { }) minetest.register_node("default:obsidian_glass", { - description = "Obsidian Glass", + description = S("Obsidian Glass"), drawtype = "glasslike_framed_optional", tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"}, paramtype = "light", @@ -2817,7 +2821,7 @@ minetest.register_node("default:obsidian_glass", { minetest.register_node("default:brick", { - description = "Brick Block", + description = S("Brick Block"), paramtype2 = "facedir", place_param2 = 0, tiles = {"default_brick.png"}, @@ -2828,7 +2832,7 @@ minetest.register_node("default:brick", { minetest.register_node("default:meselamp", { - description = "Mese Lamp", + description = S("Mese Lamp"), drawtype = "glasslike", tiles = {"default_meselamp.png"}, paramtype = "light", @@ -2840,7 +2844,7 @@ minetest.register_node("default:meselamp", { }) minetest.register_node("default:mese_post_light", { - description = "Mese Post Light", + description = S("Mese Post Light"), tiles = {"default_mese_post_light_top.png", "default_mese_post_light_top.png", "default_mese_post_light_side_dark.png", "default_mese_post_light_side_dark.png", "default_mese_post_light_side.png", "default_mese_post_light_side.png"}, @@ -2865,7 +2869,7 @@ minetest.register_node("default:mese_post_light", { -- minetest.register_node("default:cloud", { - description = "Cloud", + description = S("Cloud"), tiles = {"default_cloud.png"}, is_ground_content = false, sounds = default.node_sound_defaults(), diff --git a/mods/default/tools.lua b/mods/default/tools.lua old mode 100644 new mode 100755 index 9f503ed..71e3593 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -1,5 +1,9 @@ -- mods/default/tools.lua +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + -- The hand minetest.register_item(":", { type = "none", @@ -22,7 +26,7 @@ minetest.register_item(":", { -- minetest.register_tool("default:pick_wood", { - description = "Wooden Pickaxe", + description = S("Wooden Pickaxe"), inventory_image = "default_tool_woodpick.png", tool_capabilities = { full_punch_interval = 1.2, @@ -37,7 +41,7 @@ minetest.register_tool("default:pick_wood", { }) minetest.register_tool("default:pick_stone", { - description = "Stone Pickaxe", + description = S("Stone Pickaxe"), inventory_image = "default_tool_stonepick.png", tool_capabilities = { full_punch_interval = 1.3, @@ -51,7 +55,7 @@ minetest.register_tool("default:pick_stone", { }) minetest.register_tool("default:pick_bronze", { - description = "Bronze Pickaxe", + description = S("Bronze Pickaxe"), inventory_image = "default_tool_bronzepick.png", tool_capabilities = { full_punch_interval = 1.0, @@ -65,7 +69,7 @@ minetest.register_tool("default:pick_bronze", { }) minetest.register_tool("default:pick_steel", { - description = "Steel Pickaxe", + description = S("Steel Pickaxe"), inventory_image = "default_tool_steelpick.png", tool_capabilities = { full_punch_interval = 1.0, @@ -79,7 +83,7 @@ minetest.register_tool("default:pick_steel", { }) minetest.register_tool("default:pick_mese", { - description = "Mese Pickaxe", + description = S("Mese Pickaxe"), inventory_image = "default_tool_mesepick.png", tool_capabilities = { full_punch_interval = 0.9, @@ -93,7 +97,7 @@ minetest.register_tool("default:pick_mese", { }) minetest.register_tool("default:pick_diamond", { - description = "Diamond Pickaxe", + description = S("Diamond Pickaxe"), inventory_image = "default_tool_diamondpick.png", tool_capabilities = { full_punch_interval = 0.9, @@ -111,7 +115,7 @@ minetest.register_tool("default:pick_diamond", { -- minetest.register_tool("default:shovel_wood", { - description = "Wooden Shovel", + description = S("Wooden Shovel"), inventory_image = "default_tool_woodshovel.png", wield_image = "default_tool_woodshovel.png^[transformR90", tool_capabilities = { @@ -127,7 +131,7 @@ minetest.register_tool("default:shovel_wood", { }) minetest.register_tool("default:shovel_stone", { - description = "Stone Shovel", + description = S("Stone Shovel"), inventory_image = "default_tool_stoneshovel.png", wield_image = "default_tool_stoneshovel.png^[transformR90", tool_capabilities = { @@ -142,7 +146,7 @@ minetest.register_tool("default:shovel_stone", { }) minetest.register_tool("default:shovel_bronze", { - description = "Bronze Shovel", + description = S("Bronze Shovel"), inventory_image = "default_tool_bronzeshovel.png", wield_image = "default_tool_bronzeshovel.png^[transformR90", tool_capabilities = { @@ -157,7 +161,7 @@ minetest.register_tool("default:shovel_bronze", { }) minetest.register_tool("default:shovel_steel", { - description = "Steel Shovel", + description = S("Steel Shovel"), inventory_image = "default_tool_steelshovel.png", wield_image = "default_tool_steelshovel.png^[transformR90", tool_capabilities = { @@ -172,7 +176,7 @@ minetest.register_tool("default:shovel_steel", { }) minetest.register_tool("default:shovel_mese", { - description = "Mese Shovel", + description = S("Mese Shovel"), inventory_image = "default_tool_meseshovel.png", wield_image = "default_tool_meseshovel.png^[transformR90", tool_capabilities = { @@ -187,7 +191,7 @@ minetest.register_tool("default:shovel_mese", { }) minetest.register_tool("default:shovel_diamond", { - description = "Diamond Shovel", + description = S("Diamond Shovel"), inventory_image = "default_tool_diamondshovel.png", wield_image = "default_tool_diamondshovel.png^[transformR90", tool_capabilities = { @@ -206,7 +210,7 @@ minetest.register_tool("default:shovel_diamond", { -- minetest.register_tool("default:axe_wood", { - description = "Wooden Axe", + description = S("Wooden Axe"), inventory_image = "default_tool_woodaxe.png", tool_capabilities = { full_punch_interval = 1.0, @@ -221,7 +225,7 @@ minetest.register_tool("default:axe_wood", { }) minetest.register_tool("default:axe_stone", { - description = "Stone Axe", + description = S("Stone Axe"), inventory_image = "default_tool_stoneaxe.png", tool_capabilities = { full_punch_interval = 1.2, @@ -235,7 +239,7 @@ minetest.register_tool("default:axe_stone", { }) minetest.register_tool("default:axe_bronze", { - description = "Bronze Axe", + description = S("Bronze Axe"), inventory_image = "default_tool_bronzeaxe.png", tool_capabilities = { full_punch_interval = 1.0, @@ -249,7 +253,7 @@ minetest.register_tool("default:axe_bronze", { }) minetest.register_tool("default:axe_steel", { - description = "Steel Axe", + description = S("Steel Axe"), inventory_image = "default_tool_steelaxe.png", tool_capabilities = { full_punch_interval = 1.0, @@ -263,7 +267,7 @@ minetest.register_tool("default:axe_steel", { }) minetest.register_tool("default:axe_mese", { - description = "Mese Axe", + description = S("Mese Axe"), inventory_image = "default_tool_meseaxe.png", tool_capabilities = { full_punch_interval = 0.9, @@ -277,7 +281,7 @@ minetest.register_tool("default:axe_mese", { }) minetest.register_tool("default:axe_diamond", { - description = "Diamond Axe", + description = S("Diamond Axe"), inventory_image = "default_tool_diamondaxe.png", tool_capabilities = { full_punch_interval = 0.9, @@ -295,7 +299,7 @@ minetest.register_tool("default:axe_diamond", { -- minetest.register_tool("default:sword_wood", { - description = "Wooden Sword", + description = S("Wooden Sword"), inventory_image = "default_tool_woodsword.png", tool_capabilities = { full_punch_interval = 1, @@ -310,7 +314,7 @@ minetest.register_tool("default:sword_wood", { }) minetest.register_tool("default:sword_stone", { - description = "Stone Sword", + description = S("Stone Sword"), inventory_image = "default_tool_stonesword.png", tool_capabilities = { full_punch_interval = 1.2, @@ -324,7 +328,7 @@ minetest.register_tool("default:sword_stone", { }) minetest.register_tool("default:sword_bronze", { - description = "Bronze Sword", + description = S("Bronze Sword"), inventory_image = "default_tool_bronzesword.png", tool_capabilities = { full_punch_interval = 0.8, @@ -338,7 +342,7 @@ minetest.register_tool("default:sword_bronze", { }) minetest.register_tool("default:sword_steel", { - description = "Steel Sword", + description = S("Steel Sword"), inventory_image = "default_tool_steelsword.png", tool_capabilities = { full_punch_interval = 0.8, @@ -352,7 +356,7 @@ minetest.register_tool("default:sword_steel", { }) minetest.register_tool("default:sword_mese", { - description = "Mese Sword", + description = S("Mese Sword"), inventory_image = "default_tool_mesesword.png", tool_capabilities = { full_punch_interval = 0.7, @@ -366,7 +370,7 @@ minetest.register_tool("default:sword_mese", { }) minetest.register_tool("default:sword_diamond", { - description = "Diamond Sword", + description = S("Diamond Sword"), inventory_image = "default_tool_diamondsword.png", tool_capabilities = { full_punch_interval = 0.7, @@ -380,7 +384,7 @@ minetest.register_tool("default:sword_diamond", { }) minetest.register_tool("default:key", { - description = "Key", + description = S("Key"), inventory_image = "default_key.png", groups = {key = 1, not_in_creative_inventory = 1}, stack_max = 1, diff --git a/mods/default/torch.lua b/mods/default/torch.lua old mode 100644 new mode 100755 index 5de5f89..ad847ce --- a/mods/default/torch.lua +++ b/mods/default/torch.lua @@ -1,3 +1,9 @@ +-- default/torch.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + local function on_flood(pos, oldnode, newnode) minetest.add_item(pos, ItemStack("default:torch 1")) -- Play flame-extinguish sound if liquid is not an 'igniter' @@ -14,7 +20,7 @@ local function on_flood(pos, oldnode, newnode) end minetest.register_node("default:torch", { - description = "Torch", + description = S("Torch"), drawtype = "mesh", mesh = "torch_floor.obj", inventory_image = "default_torch_on_floor.png", diff --git a/mods/default/trees.lua b/mods/default/trees.lua old mode 100644 new mode 100755 index 564b714..573cc92 --- a/mods/default/trees.lua +++ b/mods/default/trees.lua @@ -1,3 +1,10 @@ +-- default/trees.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + local random = math.random -- @@ -560,9 +567,12 @@ function default.sapling_on_place(itemstack, placer, pointed_thing, interval) then minetest.record_protection_violation(pos, player_name) -- Print extra information to explain +-- minetest.chat_send_player(player_name, +-- itemstack:get_definition().description .. " will intersect protection " .. +-- "on growth") minetest.chat_send_player(player_name, - itemstack:get_definition().description .. " will intersect protection " .. - "on growth") + S("@1 will intersect protection on growth.", + itemstack:get_definition().description)) return itemstack end diff --git a/mods/doors/depends.txt b/mods/doors/depends.txt old mode 100644 new mode 100755 index 5e28bee..4c997c6 --- a/mods/doors/depends.txt +++ b/mods/doors/depends.txt @@ -1,2 +1,3 @@ default screwdriver? +game_intllib? diff --git a/mods/doors/gintllib.lua b/mods/doors/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/doors/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/doors/init.lua b/mods/doors/init.lua old mode 100644 new mode 100755 index dff65c7..43f1117 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -4,6 +4,11 @@ doors = {} doors.registered_doors = {} doors.registered_trapdoors = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + local function replace_old_owner_information(pos) local meta = minetest.get_meta(pos) local owner = meta:get_string("doors_owner") @@ -71,7 +76,7 @@ end -- this hidden node is placed on top of the bottom, and prevents -- nodes from being placed in the top half of the door. minetest.register_node("doors:hidden", { - description = "Hidden Door Segment", + description = S("Hidden Door Segment"), -- can't use airlike otherwise falling nodes will turn to entities -- and will be forever stuck until door is removed. drawtype = "nodebox", @@ -327,7 +332,7 @@ function doors.register(name, def) if def.protected then meta:set_string("owner", pn) - meta:set_string("infotext", "Owned by " .. pn) + meta:set_string("infotext", S("Owned by @1", pn)) end if not (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) then @@ -401,7 +406,7 @@ function doors.register(name, def) -- verify placer is owner of lockable door if owner ~= pname then minetest.record_protection_violation(pos, pname) - minetest.chat_send_player(pname, "You do not own this locked door.") + minetest.chat_send_player(pname, S("You do not own this locked door.")) return nil end @@ -449,7 +454,7 @@ end doors.register("door_wood", { tiles = {{ name = "doors_door_wood.png", backface_culling = true }}, - description = "Wooden Door", + description = S("Wooden Door"), inventory_image = "doors_item_wood.png", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, recipe = { @@ -461,7 +466,7 @@ doors.register("door_wood", { doors.register("door_steel", { tiles = {{name = "doors_door_steel.png", backface_culling = true}}, - description = "Steel Door", + description = S("Steel Door"), inventory_image = "doors_item_steel.png", protected = true, groups = {cracky = 1, level = 2}, @@ -477,7 +482,7 @@ doors.register("door_steel", { doors.register("door_glass", { tiles = {"doors_door_glass.png"}, - description = "Glass Door", + description = S("Glass Door"), inventory_image = "doors_item_glass.png", groups = {cracky=3, oddly_breakable_by_hand=3}, sounds = default.node_sound_glass_defaults(), @@ -492,7 +497,7 @@ doors.register("door_glass", { doors.register("door_obsidian_glass", { tiles = {"doors_door_obsidian_glass.png"}, - description = "Obsidian Glass Door", + description = S("Obsidian Glass Door"), inventory_image = "doors_item_obsidian_glass.png", groups = {cracky=3}, sounds = default.node_sound_glass_defaults(), @@ -580,7 +585,7 @@ function doors.register_trapdoor(name, def) local pn = placer:get_player_name() local meta = minetest.get_meta(pos) meta:set_string("owner", pn) - meta:set_string("infotext", "Owned by "..pn) + meta:set_string("infotext", S("Owned by @1", pn)) return (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) end @@ -599,7 +604,7 @@ function doors.register_trapdoor(name, def) -- verify placer is owner of lockable door if owner ~= pname then minetest.record_protection_violation(pos, pname) - minetest.chat_send_player(pname, "You do not own this trapdoor.") + minetest.chat_send_player(pname, S("You do not own this trapdoor.")) return nil end @@ -642,14 +647,10 @@ function doors.register_trapdoor(name, def) type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} } - def_closed.tiles = { - def.tile_front, - def.tile_front .. '^[transformFY', - def.tile_side, - def.tile_side, - def.tile_side, - def.tile_side - } + def_closed.tiles = {def.tile_front, + def.tile_front .. '^[transformFY', + def.tile_side, def.tile_side, + def.tile_side, def.tile_side} def_opened.node_box = { type = "fixed", @@ -659,14 +660,11 @@ function doors.register_trapdoor(name, def) type = "fixed", fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} } - def_opened.tiles = { - def.tile_side, - def.tile_side .. '^[transform2', - def.tile_side .. '^[transform3', - def.tile_side .. '^[transform1', - def.tile_front .. '^[transform46', - def.tile_front .. '^[transform6' - } + def_opened.tiles = {def.tile_side, def.tile_side, + def.tile_side .. '^[transform3', + def.tile_side .. '^[transform1', + def.tile_front .. '^[transform46', + def.tile_front .. '^[transform6'} def_opened.drop = name_closed def_opened.groups.not_in_creative_inventory = 1 @@ -679,7 +677,7 @@ function doors.register_trapdoor(name, def) end doors.register_trapdoor("doors:trapdoor", { - description = "Wooden Trapdoor", + description = S("Wooden Trapdoor"), inventory_image = "doors_trapdoor.png", wield_image = "doors_trapdoor.png", tile_front = "doors_trapdoor.png", @@ -688,7 +686,7 @@ doors.register_trapdoor("doors:trapdoor", { }) doors.register_trapdoor("doors:trapdoor_steel", { - description = "Steel Trapdoor", + description = S("Steel Trapdoor"), inventory_image = "doors_trapdoor_steel.png", wield_image = "doors_trapdoor_steel.png", tile_front = "doors_trapdoor_steel.png", @@ -788,42 +786,42 @@ function doors.register_fencegate(name, def) minetest.register_craft({ output = name .. "_closed", recipe = { - {"group:stick", def.material, "group:stick"}, - {"group:stick", def.material, "group:stick"} + {"default:stick", def.material, "default:stick"}, + {"default:stick", def.material, "default:stick"} } }) end doors.register_fencegate("doors:gate_wood", { - description = "Apple Wood Fence Gate", + description = S("Apple Wood Fence Gate"), texture = "default_wood.png", material = "default:wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} }) doors.register_fencegate("doors:gate_acacia_wood", { - description = "Acacia Wood Fence Gate", + description = S("Acacia Wood Fence Gate"), texture = "default_acacia_wood.png", material = "default:acacia_wood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} }) doors.register_fencegate("doors:gate_junglewood", { - description = "Jungle Wood Fence Gate", + description = S("Jungle Wood Fence Gate"), texture = "default_junglewood.png", material = "default:junglewood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} }) doors.register_fencegate("doors:gate_pine_wood", { - description = "Pine Wood Fence Gate", + description = S("Pine Wood Fence Gate"), texture = "default_pine_wood.png", material = "default:pine_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} }) doors.register_fencegate("doors:gate_aspen_wood", { - description = "Aspen Wood Fence Gate", + description = S("Aspen Wood Fence Gate"), texture = "default_aspen_wood.png", material = "default:aspen_wood", groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} diff --git a/mods/dye/depends.txt b/mods/dye/depends.txt old mode 100644 new mode 100755 index e69de29..72538d8 --- a/mods/dye/depends.txt +++ b/mods/dye/depends.txt @@ -0,0 +1 @@ +game_intllib? diff --git a/mods/dye/gintllib.lua b/mods/dye/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/dye/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/dye/init.lua b/mods/dye/init.lua old mode 100644 new mode 100755 index 42f59cf..00d53cb --- a/mods/dye/init.lua +++ b/mods/dye/init.lua @@ -1,23 +1,28 @@ dye = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + -- Make dye names and descriptions available globally dye.dyes = { - {"white", "White"}, - {"grey", "Grey"}, - {"dark_grey", "Dark grey"}, - {"black", "Black"}, - {"violet", "Violet"}, - {"blue", "Blue"}, - {"cyan", "Cyan"}, - {"dark_green", "Dark green"}, - {"green", "Green"}, - {"yellow", "Yellow"}, - {"brown", "Brown"}, - {"orange", "Orange"}, - {"red", "Red"}, - {"magenta", "Magenta"}, - {"pink", "Pink"}, + {"white", S("White")}, + {"grey", S("Grey")}, + {"dark_grey", S("Dark grey")}, + {"black", S("Black")}, + {"violet", S("Violet")}, + {"blue", S("Blue")}, + {"cyan", S("Cyan")}, + {"dark_green", S("Dark green")}, + {"green", S("Green")}, + {"yellow", S("Yellow")}, + {"brown", S("Brown")}, + {"orange", S("Orange")}, + {"red", S("Red")}, + {"magenta", S("Magenta")}, + {"pink", S("Pink")}, } -- Define items @@ -30,7 +35,7 @@ for _, row in ipairs(dye.dyes) do minetest.register_craftitem("dye:" .. name, { inventory_image = "dye_" .. name .. ".png", - description = description .. " Dye", + description = S("@1 Dye", description), groups = groups }) diff --git a/mods/farming/api.lua b/mods/farming/api.lua old mode 100644 new mode 100755 index 4a7b93d..c2cb7c9 --- a/mods/farming/api.lua +++ b/mods/farming/api.lua @@ -1,3 +1,7 @@ +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + -- Wear out hoes, place soil -- TODO Ignore group:flower @@ -78,7 +82,7 @@ farming.register_hoe = function(name, def) end -- Check def table if def.description == nil then - def.description = "Hoe" + def.description = S("Hoe") end if def.inventory_image == nil then def.inventory_image = "unknown_item.png" @@ -251,7 +255,7 @@ farming.register_plant = function(name, def) -- Check def table if not def.description then - def.description = "Seed" + def.description = S("Seed") end if not def.inventory_image then def.inventory_image = "unknown_item.png" diff --git a/mods/farming/depends.txt b/mods/farming/depends.txt old mode 100644 new mode 100755 index 301d971..72a966b --- a/mods/farming/depends.txt +++ b/mods/farming/depends.txt @@ -1,3 +1,4 @@ default wool stairs +game_intllib? diff --git a/mods/farming/gintllib.lua b/mods/farming/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/farming/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/farming/hoes.lua b/mods/farming/hoes.lua old mode 100644 new mode 100755 index d6a6565..c510b0c --- a/mods/farming/hoes.lua +++ b/mods/farming/hoes.lua @@ -1,5 +1,9 @@ +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + farming.register_hoe(":farming:hoe_wood", { - description = "Wooden Hoe", + description = S("Wooden Hoe"), inventory_image = "farming_tool_woodhoe.png", max_uses = 30, material = "group:wood", @@ -7,14 +11,14 @@ farming.register_hoe(":farming:hoe_wood", { }) farming.register_hoe(":farming:hoe_stone", { - description = "Stone Hoe", + description = S("Stone Hoe"), inventory_image = "farming_tool_stonehoe.png", max_uses = 90, material = "group:stone" }) farming.register_hoe(":farming:hoe_steel", { - description = "Steel Hoe", + description = S("Steel Hoe"), inventory_image = "farming_tool_steelhoe.png", max_uses = 500, material = "default:steel_ingot" @@ -26,21 +30,21 @@ farming.register_hoe(":farming:hoe_steel", { -- release. farming.register_hoe(":farming:hoe_bronze", { - description = "Bronze Hoe", + description = S("Bronze Hoe"), inventory_image = "farming_tool_bronzehoe.png", max_uses = 220, groups = {not_in_creative_inventory = 1}, }) farming.register_hoe(":farming:hoe_mese", { - description = "Mese Hoe", + description = S("Mese Hoe"), inventory_image = "farming_tool_mesehoe.png", max_uses = 350, groups = {not_in_creative_inventory = 1}, }) farming.register_hoe(":farming:hoe_diamond", { - description = "Diamond Hoe", + description = S("Diamond Hoe"), inventory_image = "farming_tool_diamondhoe.png", max_uses = 500, groups = {not_in_creative_inventory = 1}, diff --git a/mods/farming/init.lua b/mods/farming/init.lua old mode 100644 new mode 100755 index 723201d..55e5e36 --- a/mods/farming/init.lua +++ b/mods/farming/init.lua @@ -11,10 +11,15 @@ dofile(farming.path .. "/nodes.lua") dofile(farming.path .. "/hoes.lua") +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + -- WHEAT farming.register_plant("farming:wheat", { - description = "Wheat Seed", + description = S("Wheat Seed"), paramtype2 = "meshoptions", inventory_image = "farming_wheat_seed.png", steps = 8, @@ -26,13 +31,13 @@ farming.register_plant("farming:wheat", { }) minetest.register_craftitem("farming:flour", { - description = "Flour", + description = S("Flour"), inventory_image = "farming_flour.png", groups = {food_flour = 1, flammable = 1}, }) minetest.register_craftitem("farming:bread", { - description = "Bread", + description = S("Bread"), inventory_image = "farming_bread.png", on_use = minetest.item_eat(5), groups = {food_bread = 1, flammable = 2}, @@ -55,7 +60,7 @@ minetest.register_craft({ -- Cotton farming.register_plant("farming:cotton", { - description = "Cotton Seed", + description = S("Cotton Seed"), inventory_image = "farming_cotton_seed.png", steps = 8, minlight = 13, @@ -65,7 +70,7 @@ farming.register_plant("farming:cotton", { }) minetest.register_craftitem("farming:string", { - description = "String", + description = S("String"), inventory_image = "farming_string.png", groups = {flammable = 2}, }) diff --git a/mods/farming/nodes.lua b/mods/farming/nodes.lua old mode 100644 new mode 100755 index cc9d1f6..af85f1e --- a/mods/farming/nodes.lua +++ b/mods/farming/nodes.lua @@ -1,3 +1,10 @@ +-- farming/nodes.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + minetest.override_item("default:dirt", { soil = { base = "default:dirt", @@ -39,7 +46,7 @@ minetest.override_item("default:dirt_with_coniferous_litter", { }) minetest.register_node("farming:soil", { - description = "Soil", + description = S("Soil"), tiles = {"default_dirt.png^farming_soil.png", "default_dirt.png"}, drop = "default:dirt", groups = {crumbly=3, not_in_creative_inventory=1, soil=2, grassland = 1, field = 1}, @@ -52,7 +59,7 @@ minetest.register_node("farming:soil", { }) minetest.register_node("farming:soil_wet", { - description = "Wet Soil", + description = S("Wet Soil"), tiles = {"default_dirt.png^farming_soil_wet.png", "default_dirt.png^farming_soil_wet_side.png"}, drop = "default:dirt", groups = {crumbly=3, not_in_creative_inventory=1, soil=3, wet = 1, grassland = 1, field = 1}, @@ -73,7 +80,7 @@ minetest.override_item("default:desert_sand", { } }) minetest.register_node("farming:desert_sand_soil", { - description = "Desert Sand Soil", + description = S("Desert Sand Soil"), drop = "default:desert_sand", tiles = {"farming_desert_sand_soil.png", "default_desert_sand.png"}, groups = {crumbly=3, not_in_creative_inventory = 1, falling_node=1, sand=1, soil = 2, desert = 1, field = 1}, @@ -86,7 +93,7 @@ minetest.register_node("farming:desert_sand_soil", { }) minetest.register_node("farming:desert_sand_soil_wet", { - description = "Wet Desert Sand Soil", + description = S("Wet Desert Sand Soil"), drop = "default:desert_sand", tiles = {"farming_desert_sand_soil_wet.png", "farming_desert_sand_soil_wet_side.png"}, groups = {crumbly=3, falling_node=1, sand=1, not_in_creative_inventory=1, soil=3, wet = 1, desert = 1, field = 1}, @@ -99,7 +106,7 @@ minetest.register_node("farming:desert_sand_soil_wet", { }) minetest.register_node("farming:straw", { - description = "Straw", + description = S("Straw"), tiles = {"farming_straw.png"}, is_ground_content = false, groups = {snappy=3, flammable=4, fall_damage_add_percent=-30}, @@ -111,8 +118,8 @@ stairs.register_stair_and_slab( "farming:straw", {snappy = 3, flammable = 4}, {"farming_straw.png"}, - "Straw Stair", - "Straw Slab", + S("Straw Stair"), + S("Straw Slab"), default.node_sound_leaves_defaults(), true ) diff --git a/mods/fire/depends.txt b/mods/fire/depends.txt old mode 100644 new mode 100755 index 4ad96d5..6ba4b42 --- a/mods/fire/depends.txt +++ b/mods/fire/depends.txt @@ -1 +1,2 @@ default +game_intllib? diff --git a/mods/fire/gintllib.lua b/mods/fire/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/fire/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/fire/init.lua b/mods/fire/init.lua old mode 100644 new mode 100755 index 9c36720..74df5db --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -2,6 +2,11 @@ fire = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + -- 'Enable fire' setting local fire_enabled = minetest.settings:get_bool("enable_fire") @@ -82,7 +87,7 @@ minetest.register_node("fire:basic_flame", { }) minetest.register_node("fire:permanent_flame", { - description = "Permanent Flame", + description = S("Permanent Flame"), drawtype = "firelike", tiles = { { @@ -113,7 +118,7 @@ minetest.register_node("fire:permanent_flame", { -- Flint and steel minetest.register_tool("fire:flint_and_steel", { - description = "Flint and Steel", + description = S("Flint and Steel"), inventory_image = "fire_flint_steel.png", sound = {breaks = "default_tool_breaks"}, @@ -320,7 +325,7 @@ if fire_enabled then interval = 7, chance = 12, catch_up = false, - action = function(pos) + action = function(pos, node, active_object_count, active_object_count_wider) local p = minetest.find_node_near(pos, 1, {"air"}) if p then minetest.set_node(p, {name = "fire:basic_flame"}) @@ -337,18 +342,17 @@ if fire_enabled then interval = 5, chance = 18, catch_up = false, - action = function(pos) + action = function(pos, node, active_object_count, active_object_count_wider) local p = minetest.find_node_near(pos, 1, {"group:flammable"}) - if not p then - return - end - local flammable_node = minetest.get_node(p) - local def = minetest.registered_nodes[flammable_node.name] - if def.on_burn then - def.on_burn(p) - else - minetest.remove_node(p) - minetest.check_for_falling(p) + if p then + local flammable_node = minetest.get_node(p) + local def = minetest.registered_nodes[flammable_node.name] + if def.on_burn then + def.on_burn(p) + else + minetest.remove_node(p) + minetest.check_for_falling(p) + end end end, }) diff --git a/mods/fireflies/depends.txt b/mods/fireflies/depends.txt old mode 100644 new mode 100755 index e0585b4..c4faa8a --- a/mods/fireflies/depends.txt +++ b/mods/fireflies/depends.txt @@ -1,2 +1,3 @@ default -vessels \ No newline at end of file +vessels +game_intllib? diff --git a/mods/fireflies/gintllib.lua b/mods/fireflies/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/fireflies/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/fireflies/init.lua b/mods/fireflies/init.lua old mode 100644 new mode 100755 index 066bfb4..9a07d98 --- a/mods/fireflies/init.lua +++ b/mods/fireflies/init.lua @@ -1,6 +1,12 @@ -- firefly + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + minetest.register_node("fireflies:firefly", { - description = "Firefly", + description = S("Firefly"), drawtype = "plantlike", tiles = {{ name = "fireflies_firefly_animated.png", @@ -47,7 +53,7 @@ minetest.register_node("fireflies:firefly", { }) minetest.register_node("fireflies:hidden_firefly", { - description = "Hidden Firefly", + description = S("Hidden Firefly"), drawtype = "airlike", inventory_image = "fireflies_firefly.png", wield_image = "fireflies_firefly.png", @@ -84,7 +90,7 @@ minetest.register_node("fireflies:hidden_firefly", { -- bug net minetest.register_tool("fireflies:bug_net", { - description = "Bug Net", + description = S("Bug Net"), inventory_image = "fireflies_bugnet.png", on_use = function(itemstack, player, pointed_thing) if not pointed_thing or pointed_thing.type ~= "node" or @@ -113,14 +119,14 @@ minetest.register_craft( { recipe = { {"farming:string", "farming:string"}, {"farming:string", "farming:string"}, - {"group:stick", ""} + {"default:stick", ""} } }) -- firefly in a bottle minetest.register_node("fireflies:firefly_bottle", { - description = "Firefly in a Bottle", + description = S("Firefly in a Bottle"), inventory_image = "fireflies_bottle.png", wield_image = "fireflies_bottle.png", tiles = {{ diff --git a/mods/flowers/depends.txt b/mods/flowers/depends.txt old mode 100644 new mode 100755 index 4ad96d5..6ba4b42 --- a/mods/flowers/depends.txt +++ b/mods/flowers/depends.txt @@ -1 +1,2 @@ default +game_intllib? diff --git a/mods/flowers/gintllib.lua b/mods/flowers/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/flowers/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/flowers/init.lua b/mods/flowers/init.lua old mode 100644 new mode 100755 index 49799cf..8072237 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -6,10 +6,14 @@ flowers = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + -- Map Generation -dofile(minetest.get_modpath("flowers") .. "/mapgen.lua") +dofile(MP .. "/mapgen.lua") -- @@ -46,6 +50,7 @@ local function add_simple_flower(name, desc, box, f_groups) paramtype = "light", walkable = false, buildable_to = true, + stack_max = 99, groups = f_groups, sounds = default.node_sound_leaves_defaults(), selection_box = { @@ -58,49 +63,49 @@ end flowers.datas = { { "rose", - "Red Rose", + S("Red Rose"), {-2 / 16, -0.5, -2 / 16, 2 / 16, 5 / 16, 2 / 16}, {color_red = 1, flammable = 1} }, { "tulip", - "Orange Tulip", + S("Orange Tulip"), {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}, {color_orange = 1, flammable = 1} }, { "dandelion_yellow", - "Yellow Dandelion", + S("Yellow Dandelion"), {-4 / 16, -0.5, -4 / 16, 4 / 16, -2 / 16, 4 / 16}, {color_yellow = 1, flammable = 1} }, { "chrysanthemum_green", - "Green Chrysanthemum", + S("Green Chrysanthemum"), {-4 / 16, -0.5, -4 / 16, 4 / 16, -1 / 16, 4 / 16}, {color_green = 1, flammable = 1} }, { "geranium", - "Blue Geranium", + S("Blue Geranium"), {-2 / 16, -0.5, -2 / 16, 2 / 16, 2 / 16, 2 / 16}, {color_blue = 1, flammable = 1} }, { "viola", - "Viola", + S("Viola"), {-5 / 16, -0.5, -5 / 16, 5 / 16, -1 / 16, 5 / 16}, {color_violet = 1, flammable = 1} }, { "dandelion_white", - "White Dandelion", + S("White Dandelion"), {-5 / 16, -0.5, -5 / 16, 5 / 16, -2 / 16, 5 / 16}, {color_white = 1, flammable = 1} }, { "tulip_black", - "Black Tulip", + S("Black Tulip"), {-2 / 16, -0.5, -2 / 16, 2 / 16, 3 / 16, 2 / 16}, {color_black = 1, flammable = 1} }, @@ -180,7 +185,7 @@ minetest.register_abm({ -- minetest.register_node("flowers:mushroom_red", { - description = "Red Mushroom", + description = S("Red Mushroom"), tiles = {"flowers_mushroom_red.png"}, inventory_image = "flowers_mushroom_red.png", wield_image = "flowers_mushroom_red.png", @@ -199,7 +204,7 @@ minetest.register_node("flowers:mushroom_red", { }) minetest.register_node("flowers:mushroom_brown", { - description = "Brown Mushroom", + description = S("Brown Mushroom"), tiles = {"flowers_mushroom_brown.png"}, inventory_image = "flowers_mushroom_brown.png", wield_image = "flowers_mushroom_brown.png", @@ -221,10 +226,8 @@ minetest.register_node("flowers:mushroom_brown", { -- Mushroom spread and death function flowers.mushroom_spread(pos, node) - if minetest.get_node_light(pos, 0.5) > 3 then - if minetest.get_node_light(pos, nil) == 15 then - minetest.remove_node(pos) - end + if minetest.get_node_light(pos, nil) == 15 then + minetest.remove_node(pos) return end local positions = minetest.find_nodes_in_area_under_air( @@ -236,7 +239,8 @@ function flowers.mushroom_spread(pos, node) end local pos2 = positions[math.random(#positions)] pos2.y = pos2.y + 1 - if minetest.get_node_light(pos2, 0.5) <= 3 then + if minetest.get_node_light(pos, 0.5) <= 3 and + minetest.get_node_light(pos2, 0.5) <= 3 then minetest.set_node(pos2, {name = node.name}) end end @@ -267,7 +271,7 @@ minetest.register_alias("mushroom:red_natural", "flowers:mushroom_red") -- minetest.register_node("flowers:waterlily", { - description = "Waterlily", + description = S("Waterlily"), drawtype = "nodebox", paramtype = "light", paramtype2 = "facedir", diff --git a/mods/game_commands/depends.txt b/mods/game_commands/depends.txt new file mode 100755 index 0000000..72538d8 --- /dev/null +++ b/mods/game_commands/depends.txt @@ -0,0 +1 @@ +game_intllib? diff --git a/mods/game_commands/gintllib.lua b/mods/game_commands/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/game_commands/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/game_commands/init.lua b/mods/game_commands/init.lua old mode 100644 new mode 100755 index 609c4a7..f6ac51c --- a/mods/game_commands/init.lua +++ b/mods/game_commands/init.lua @@ -1,5 +1,12 @@ +-- game_commands + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + minetest.register_chatcommand("killme", { - description = "Kill yourself to respawn", + description = S("Kill yourself to respawn"), func = function(name) local player = minetest.get_player_by_name(name) if player then @@ -15,11 +22,11 @@ minetest.register_chatcommand("killme", { -- There doesn't seem to be a way to get a default spawn pos -- from the lua API - return false, "No static_spawnpoint defined" + return false, S("No static_spawnpoint defined") end else -- Show error message if used when not logged in, eg: from IRC mod - return false, "You need to be online to be killed!" + return false, S("You need to be online to be killed!") end end }) diff --git a/mods/game_intllib/LICENSE.md b/mods/game_intllib/LICENSE.md new file mode 100755 index 0000000..c218f79 --- /dev/null +++ b/mods/game_intllib/LICENSE.md @@ -0,0 +1,44 @@ + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + +- - - + +Minetest Game Translation with 'game_intllib' (based on 'intllib') +Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +This software and all of its parts are distributed under the same license +as the Minetest Game package and/or the above license. + +The mod 'game-intllib' and the 'gintllib.lua' file are derived from +the 2018-08-11 release of 'intllib'. + +https://github.com/minetest-mods/intllib/releases/tag/20180811 +(kaeza released this on 12 Aug 2018) + +See https://github.com/minetest-mods/intllib for the original software. + +Consult the applicable README.txt files on the respective mod license. +[snoopy (Zweihorn)], 2019-05-07 diff --git a/mods/game_intllib/README.md b/mods/game_intllib/README.md new file mode 100755 index 0000000..9fe20ce --- /dev/null +++ b/mods/game_intllib/README.md @@ -0,0 +1,54 @@ + +# Internationalization Lib for default game mods of the Minetest game + +This is 'game_intllib' by [snoopy (Zweihorn)] 2019-05-07 +[Fork from 'intllib' by Diego Martínez (kaeza).] +Released under (LGPLv2.1+). See `LICENSE.md` or `license.txt` for details. + +'game_intllib' is an attempt at providing internationalization support +for the default game mods only. + +This 'game_intllib' internal mod is specifially aimed at default mods +internal to the game in the 'minetest_game' folder. + +The original 'intllib' mod is an attempt at providing internationalization +support for external mods (something Minetest currently lacks). + +Should you have any comments/suggestions, please post them in the +[forum topic][topic]. For bug reports, use the [bug tracker][bugtracker] +on Github. + +## How to use 'intllib' (the original mod) + +If you are a regular player looking for translated texts of mods, just +[install][installing_mods] the original 'intllib' mod like any other +one, then enable it in the GUI of the MT client. + +## How to use 'game_intllib' (this mod specifically) + +The use of this mod is at the deliberations of the Minetest game devs. + +The mod tries to detect your language, but since there's currently no +portable way to do this, it tries several alternatives: + +* `language` setting in `minetest.conf`. +* `LANGUAGE` environment variable. +* `LANG` environment variable. +* If all else fails, uses `en`. + +In any case, the end result should be the [ISO 639-1 Language Code][ISO639-1] +of the desired language. + +### Mod developers + +If you are a mod developer looking to add internationalization support to +your mod, please use the original 'intllib' mod and see `doc/developer.md`. + +### Translators + +If you are a translator, see `doc/translator.md`. + +[topic]: https://forum.minetest.net/viewtopic.php?id=4929 +[bugtracker]: https://github.com/minetest-mods/intllib/issues +[installing_mods]: https://wiki.minetest.net/Installing_mods +[ISO639-1]: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes diff --git a/mods/game_intllib/description.txt b/mods/game_intllib/description.txt new file mode 100755 index 0000000..1c8cc95 --- /dev/null +++ b/mods/game_intllib/description.txt @@ -0,0 +1,6 @@ +Game internationalization library. +This mod provides a way to internationalize/localize the default game +mods to other languages in an easy way. It was derived from intllib +but instead is aimed at the default minetest_game mod tree only. +One should make use of inttlib for external mods without interference. +See the README file for details. diff --git a/mods/game_intllib/doc/developer.md b/mods/game_intllib/doc/developer.md new file mode 100755 index 0000000..d87f95f --- /dev/null +++ b/mods/game_intllib/doc/developer.md @@ -0,0 +1,62 @@ + +# Intllib developer documentation + +## Enabling internationalization + +In order to enable internationalization for your mod, you will need to copy the +file `lib/intllib.lua` into the root directory of your mod, then include this +boilerplate code in files needing localization: + + -- Load support for game_intllib. + local MP = minetest.get_modpath(minetest.get_current_modname()) + local S, NS = dofile(MP.."/intllib.lua") + +You will also need to optionally depend on intllib, to do so add `intllib?` +to an empty line in your `depends.txt`. Also note that if intllib is not +installed, the getter functions are defined so they return the string +unchanged. This is done so you don't have to sprinkle tons of `if`s (or +similar constructs) to check if the lib is actually installed. + +Once you have the code in place, you need to mark strings that need +translation. For each translatable string in your sources, use the `S` +function (see above) to return the translated string. For example: + + minetest.register_node("mymod:mynode", { + -- Simple string: + description = S("My Fabulous Node"), + -- String with insertions: + description = S("@1 Car", "Blue"), + -- ... + }) + +The `NS` function is the equivalent of `ngettext`. It should be used when the +string to be translated has singular and plural forms. For example: + + -- The first `count` is for `ngettext` to determine which form to use. + -- The second `count` is the actual replacement. + print(NS("You have one item.", "You have @1 items.", count, count)) + +## Generating and updating catalogs + +This is the basic workflow for working with [gettext][gettext] + +Each time you have new strings to be translated, you should do the following: + + cd /path/to/mod + /path/to/intllib/tools/xgettext.sh file1.lua file2.lua ... + +The script will create a directory named `locale` if it doesn't exist yet, +and will generate the file `template.pot` (a template with all the translatable +strings). If you already have translations, the script will proceed to update +all of them with the new strings. + +The script passes some options to the real `xgettext` that should be enough +for most cases. You may specify other options if desired: + + xgettext.sh -o file.pot --keyword=blargh:4,5 a.lua b.lua ... + +NOTE: There's also a Windows batch file `xgettext.bat` for Windows users, +but you will need to install the gettext command line tools separately. See +the top of the file for configuration. + +[gettext]: https://www.gnu.org/software/gettext/ diff --git a/mods/game_intllib/doc/localefile.md b/mods/game_intllib/doc/localefile.md new file mode 100755 index 0000000..777e759 --- /dev/null +++ b/mods/game_intllib/doc/localefile.md @@ -0,0 +1,42 @@ + +# Locale file format + +*Note: This document explains the old conf/ini-like file format. +The new interface uses [gettext][gettext] `.po` files. +See [The Format of PO Files][PO-Files] for more information.* + +Here's an example for a Spanish locale file (`es.txt`): + + # A comment. + # Another comment. + This line is ignored since it has no equals sign. + Hello, World! = Hola, Mundo! + String with\nnewlines = Cadena con\nsaltos de linea + String with an \= equals sign = Cadena con un signo de \= igualdad + +Locale (or translation) files are plain text files consisting of lines of the +form `source text = translated text`. The file must reside in the mod's `locale` +subdirectory, and must be named after the two-letter +[ISO 639-1 Language Code][ISO639-1] of the language you want to support. + +The translation files should use the UTF-8 encoding. + +Lines beginning with a pound sign are comments and are effectively ignored +by the reader. Note that comments only span until the end of the line; +there's no support for multiline comments. Lines without an equals sign are +also ignored. + +Characters that are considered "special" can be "escaped" so they are taken +literally. There are also several escape sequences that can be used: + + * Any of `#`, `=` can be escaped to take them literally. The `\#` + sequence is useful if your source text begins with `#`. + * The common escape sequences `\n` and `\t`, meaning newline and + horizontal tab respectively. + * The special `\s` escape sequence represents the space character. It + is mainly useful to add leading or trailing spaces to source or + translated texts, as these spaces would be removed otherwise. + +[gettext]: https://www.gnu.org/software/gettext +[PO-Files]: https://www.gnu.org/software/gettext/manual/html_node/PO-Files.html +[ISO639-1]: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes diff --git a/mods/game_intllib/doc/translator.md b/mods/game_intllib/doc/translator.md new file mode 100755 index 0000000..3c278e8 --- /dev/null +++ b/mods/game_intllib/doc/translator.md @@ -0,0 +1,20 @@ + +# Intllib translator documentation + +#### New interface + +Use your favorite tools to edit the `.po` files. + +#### Old interface + +To translate an intllib-supporting mod to your desired language, copy the +`locale/template.txt` file to `locale/LANGUAGE.txt` (where `LANGUAGE` is the +[ISO 639-1 Language Code][ISO639-1] of your language. + +Open up the new file in your favorite editor, and translate each line putting +the translated text after the equals sign. + +See `localefile.md` for more information about the file format. + +[gettext]: https://www.gnu.org/software/gettext/ +[ISO639-1]: https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes diff --git a/mods/game_intllib/gettext.lua b/mods/game_intllib/gettext.lua new file mode 100755 index 0000000..211621f --- /dev/null +++ b/mods/game_intllib/gettext.lua @@ -0,0 +1,227 @@ +-- game_intllib/gettext.lua + +local strsub, strrep = string.sub, string.rep +local strmatch, strgsub = string.match, string.gsub + +local function trim(str) + return strmatch(str, "^%s*(.-)%s*$") +end + +local escapes = { n="\n", r="\r", t="\t" } + +local function unescape(str) + return (strgsub(str, "(\\+)([nrt]?)", function(bs, c) + local bsl = #bs + local realbs = strrep("\\", bsl/2) + if bsl%2 == 1 then + c = escapes[c] or c + end + return realbs..c + end)) +end + +local function parse_po(str) + local state, msgid, msgid_plural, msgstrind + local texts = { } + local lineno = 0 + local function perror(msg) + return error(msg.." at line "..lineno) + end + for _, line in ipairs(str:split("\n")) do repeat + lineno = lineno + 1 + line = trim(line) + + if line == "" or strmatch(line, "^#") then + state, msgid, msgid_plural = nil, nil, nil + break -- continue + end + + local mid = strmatch(line, "^%s*msgid%s*\"(.*)\"%s*$") + if mid then + if state == "id" then + return perror("unexpected msgid") + end + state, msgid = "id", unescape(mid) + break -- continue + end + + mid = strmatch(line, "^%s*msgid_plural%s*\"(.*)\"%s*$") + if mid then + if state ~= "id" then + return perror("unexpected msgid_plural") + end + state, msgid_plural = "idp", unescape(mid) + break -- continue + end + + local ind, mstr = strmatch(line, + "^%s*msgstr([0-9%[%]]*)%s*\"(.*)\"%s*$") + if ind then + if not msgid then + return perror("missing msgid") + elseif ind == "" then + msgstrind = 0 + elseif strmatch(ind, "%[[0-9]+%]") then + msgstrind = tonumber(strsub(ind, 2, -2)) + else + return perror("malformed msgstr") + end + texts[msgid] = texts[msgid] or { } + if msgid_plural then + texts[msgid_plural] = texts[msgid] + end + texts[msgid][msgstrind] = unescape(mstr) + state = "str" + break -- continue + end + + mstr = strmatch(line, "^%s*\"(.*)\"%s*$") + if mstr then + if state == "id" then + msgid = msgid..unescape(mstr) + break -- continue + elseif state == "idp" then + msgid_plural = msgid_plural..unescape(mstr) + break -- continue + elseif state == "str" then + local text = texts[msgid][msgstrind] + texts[msgid][msgstrind] = text..unescape(mstr) + break -- continue + end + end + + return perror("malformed line") + + -- luacheck: ignore + until true end -- end for + + return texts +end + +local M = { } + +local function warn(msg) + minetest.log("warning", "[game_intllib] "..msg) +end + +-- hax! +-- This function converts a C expression to an equivalent Lua expression. +-- It handles enough stuff to parse the `Plural-Forms` header correctly. +-- Note that it assumes the C expression is valid to begin with. +local function compile_plural_forms(str) + local plural = strmatch(str, "plural=([^;]+);?$") + local function replace_ternary(s) + local c, t, f = strmatch(s, "^(.-)%?(.-):(.*)") + if c then + return ("__if(" + ..replace_ternary(c) + ..","..replace_ternary(t) + ..","..replace_ternary(f) + ..")") + end + return s + end + plural = replace_ternary(plural) + plural = strgsub(plural, "&&", " and ") + plural = strgsub(plural, "||", " or ") + plural = strgsub(plural, "!=", "~=") + plural = strgsub(plural, "!", " not ") + local f, err = loadstring([[ + local function __if(c, t, f) + if c and c~=0 then return t else return f end + end + local function __f(n) + return (]]..plural..[[) + end + return (__f(...)) + ]]) + if not f then return nil, err end + local env = { } + env._ENV, env._G = env, env + setfenv(f, env) + return function(n) + local v = f(n) + if type(v) == "boolean" then + -- Handle things like a plain `n != 1` + v = v and 1 or 0 + end + return v + end +end + +local function parse_headers(str) + local headers = { } + for _, line in ipairs(str:split("\n")) do + local k, v = strmatch(line, "^([^:]+):%s*(.*)") + if k then + headers[k] = v + end + end + return headers +end + +local function load_catalog(filename) + local f, data, err + + local function bail(msg) + warn(msg..(err and ": " or "")..(err or "")) + return nil + end + + f, err = io.open(filename, "rb") + if not f then + return --bail("failed to open catalog") + end + + data, err = f:read("*a") + + f:close() + + if not data then + return bail("failed to read catalog") + end + + data, err = parse_po(data) + if not data then + return bail("failed to parse catalog") + end + + err = nil + local hdrs = data[""] + if not (hdrs and hdrs[0]) then + return bail("catalog has no headers") + end + + hdrs = parse_headers(hdrs[0]) + + local pf = hdrs["Plural-Forms"] + if not pf then + -- XXX: Is this right? Gettext assumes this if header not present. + pf = "nplurals=2; plural=n != 1" + end + + data.plural_index, err = compile_plural_forms(pf) + if not data.plural_index then + return bail("failed to compile plural forms") + end + + --warn("loaded: "..filename) + + return data +end + +function M.load_catalogs(path) + local langs = gintllib.get_detected_languages() + + local cats = { } + for _, lang in ipairs(langs) do + local cat = load_catalog(path.."/"..lang..".po") + if cat then + cats[#cats+1] = cat + end + end + + return cats +end + +return M diff --git a/mods/game_intllib/init.lua b/mods/game_intllib/init.lua new file mode 100755 index 0000000..611532a --- /dev/null +++ b/mods/game_intllib/init.lua @@ -0,0 +1,183 @@ +-- game_intllib/init.lua + +gintllib = { + getters = {}, + strings = {}, +} + +local MP = minetest.get_modpath("game_intllib") + +dofile(MP .. "/lib.lua") + + +local LANG = minetest.settings:get("language") +if not (LANG and (LANG ~= "")) then LANG = os.getenv("LANG") end +if not (LANG and (LANG ~= "")) then LANG = "en" end + + +local INS_CHAR = gintllib.INSERTION_CHAR +local insertion_pattern = "("..INS_CHAR.."?)"..INS_CHAR.."(%(?)(%d+)(%)?)" + +local function do_replacements(str, ...) + local args = {...} + -- Outer parens discard extra return values + return (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)) +end + +local function make_getter(msgstrs) + return function(s, ...) + local str + if msgstrs then + str = msgstrs[s] + end + if not str or str == "" then + str = s + end + if select("#", ...) == 0 then + return str + end + return do_replacements(str, ...) + end +end + + +local function Getter(modname) + modname = modname or minetest.get_current_modname() + if not gintllib.getters[modname] then + local msgstr = gintllib.get_strings(modname) + gintllib.getters[modname] = make_getter(msgstr) + end + return gintllib.getters[modname] +end + + + +local strfind, strsub = string.find, string.sub +local langs + +local function split(str, sep) + local pos, endp = 1, #str+1 + return function() + if (not pos) or pos > endp then return end + local s, e = strfind(str, sep, pos, true) + local part = strsub(str, pos, s and s-1) + pos = e and e + 1 + return part + end +end + +function gintllib.get_detected_languages() + if langs then return langs end + + langs = { } + + local function addlang(l) + local sep + langs[#langs+1] = l + sep = strfind(l, ".", 1, true) + if sep then + l = strsub(l, 1, sep-1) + langs[#langs+1] = l + end + sep = strfind(l, "_", 1, true) + if sep then + langs[#langs+1] = strsub(l, 1, sep-1) + end + end + + local v + + v = minetest.settings:get("language") + if v and v~="" then + addlang(v) + end + + v = os.getenv("LANGUAGE") + if v then + for item in split(v, ":") do + langs[#langs+1] = item + end + end + + v = os.getenv("LANG") + if v then + addlang(v) + end + + langs[#langs+1] = "en" + + return langs +end + + +-- local gettext = dofile(minetest.get_modpath("game_intllib").."/gettext.lua") +local gettext = dofile(MP .. "/gettext.lua") + + +local function catgettext(catalogs, msgid) + for _, cat in ipairs(catalogs) do + local msgstr = cat and cat[msgid] + if msgstr and msgstr~="" then + local msg = msgstr[0] + return msg~="" and msg or nil + end + end +end + +local function catngettext(catalogs, msgid, msgid_plural, n) + n = math.floor(n) + for _, cat in ipairs(catalogs) do + local msgstr = cat and cat[msgid] + if msgstr then + local index = cat.plural_index(n) + local msg = msgstr[index] + return msg~="" and msg or nil + end + end + return n==1 and msgid or msgid_plural +end + + +local gettext_getters = { } + +function gintllib.make_gettext_pair(modname) + modname = modname or minetest.get_current_modname() + if gettext_getters[modname] then + return unpack(gettext_getters[modname]) + end +-- Set central locale dir for the minetest_game mod tree instead of: +-- local localedir = minetest.get_modpath(modname).."/locale" + local localedir = minetest.get_modpath("game_intllib").."/locale" + local catalogs = gettext.load_catalogs(localedir) + local getter = Getter(modname) + local function gettext_func(msgid, ...) + local msgstr = (catgettext(catalogs, msgid) + or getter(msgid)) + return do_replacements(msgstr, ...) + end + local function ngettext_func(msgid, msgid_plural, n, ...) + local msgstr = (catngettext(catalogs, msgid, msgid_plural, n) + or getter(msgid)) + return do_replacements(msgstr, ...) + end + gettext_getters[modname] = { gettext_func, ngettext_func } + return gettext_func, ngettext_func +end + + +function gintllib.get_strings(modname, langcode) + modname = modname or minetest.get_current_modname() + return gintllib.strings[modname] +end + + diff --git a/mods/game_intllib/intltest/README.md b/mods/game_intllib/intltest/README.md new file mode 100755 index 0000000..9122d9e --- /dev/null +++ b/mods/game_intllib/intltest/README.md @@ -0,0 +1,10 @@ + +# Intllib example + +This is a simple mod showing how to use intllib. + +It defines a test `intltest:test` item whose description is translated +according to the user's language. + +Additionally, it demonstrates how to use plural forms by counting the +number of times the item has been used. diff --git a/mods/game_intllib/intltest/depends.txt b/mods/game_intllib/intltest/depends.txt new file mode 100755 index 0000000..72538d8 --- /dev/null +++ b/mods/game_intllib/intltest/depends.txt @@ -0,0 +1 @@ +game_intllib? diff --git a/mods/game_intllib/intltest/gintllib.lua b/mods/game_intllib/intltest/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/game_intllib/intltest/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/game_intllib/intltest/init.lua b/mods/game_intllib/intltest/init.lua new file mode 100755 index 0000000..d5d3acb --- /dev/null +++ b/mods/game_intllib/intltest/init.lua @@ -0,0 +1,30 @@ +-- game_intllib/intltest/init.lua + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/intllib.lua") + +local use_count = 0 + +minetest.log("action", S("Hello, world!")) + +minetest.register_craftitem("gintltest:test", { + -- Example use of replacements. + -- Translators: @1 is color, @2 is object. + description = S("Test: @1 @2", S("Blue"), S("Car")), + + inventory_image = "default_sand.png", + + on_use = function(stack, user, pt) + use_count = use_count + 1 + -- Example use of `ngettext` function by the NS enclosure. + -- `n` <= 1 gives first phrase. `n` > 1 gives second phrase. + -- First `use_count` is `n` for ngettext to chose the phrase; + -- Second one is actual replacement. + -- Translators: @1 becomes the value of the 2nd use_count. + local message = NS("Item has been used @1 time.", + "Item has been used @1 times.", + use_count, use_count) + minetest.chat_send_player(user:get_player_name(), message) + end, +}) diff --git a/mods/game_intllib/intltest/locale/es.po b/mods/game_intllib/intltest/locale/es.po new file mode 100755 index 0000000..cd51b8f --- /dev/null +++ b/mods/game_intllib/intltest/locale/es.po @@ -0,0 +1,43 @@ +# I18N Test Mod. +# Copyright (C) 2013-2017 Diego Martínez +# This file is distributed under the same license as the intllib mod. +# Diego Martínez , 2013-2017. +# +msgid "" +msgstr "" +"Project-Id-Version: I18N Test Mod 0.1.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2017-02-25 20:40-0300\n" +"PO-Revision-Date: 2017-01-23 17:36-0300\n" +"Last-Translator: Diego Martnez \n" +"Language-Team: Spanish\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: init.lua +msgid "Hello, world!" +msgstr "¡Hola, mundo!" + +#. Translators: @1 is color, @2 is object. +#: init.lua +msgid "Blue" +msgstr "Azul" + +#: init.lua +msgid "Car" +msgstr "Carro" + +#. Translators: @1 is color, @2 is object. +#: init.lua +msgid "Test: @1 @2" +msgstr "Prueba: @2 @1" + +#. Translators: @1 is use count. +#: init.lua +msgid "Item has been used @1 time." +msgid_plural "Item has been used @1 times." +msgstr[0] "El objeto ha sido usado @1 vez." +msgstr[1] "El objeto ha sido usado @1 veces." diff --git a/mods/game_intllib/intltest/locale/template.pot b/mods/game_intllib/intltest/locale/template.pot new file mode 100755 index 0000000..2090d61 --- /dev/null +++ b/mods/game_intllib/intltest/locale/template.pot @@ -0,0 +1,44 @@ +# 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-02-25 20:40-0300\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" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: init.lua +msgid "Hello, world!" +msgstr "" + +#. Translators: @1 is color, @2 is object. +#: init.lua +msgid "Blue" +msgstr "" + +#: init.lua +msgid "Car" +msgstr "" + +#. Translators: @1 is color, @2 is object. +#: init.lua +msgid "Test: @1 @2" +msgstr "" + +#. Translators: @1 is use count. +#: init.lua +msgid "Item has been used @1 time." +msgid_plural "Item has been used @1 times." +msgstr[0] "" +msgstr[1] "" diff --git a/mods/game_intllib/lib.lua b/mods/game_intllib/lib.lua new file mode 100755 index 0000000..f899aba --- /dev/null +++ b/mods/game_intllib/lib.lua @@ -0,0 +1,68 @@ +-- game_intllib/lib.lua + +gintllib = gintllib or {} + +local INS_CHAR = "@" +gintllib.INSERTION_CHAR = INS_CHAR + +local escapes = { + ["\\"] = "\\", + ["n"] = "\n", + ["s"] = " ", + ["t"] = "\t", + ["r"] = "\r", + ["f"] = "\f", + [INS_CHAR] = INS_CHAR..INS_CHAR, +} + +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 + add(str:sub(start)) + break + 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) + for slashes, pos in s:gmatch("([\\]*)=()") do + if (slashes:len() % 2) == 0 then + return pos - 1 + end + end +end + +function gintllib.load_strings(filename) + local file, err = io.open(filename, "r") + if not file then + return nil, err + end + local strings = {} + for line in file:lines() do + line = line:trim() + if line ~= "" and line:sub(1, 1) ~= "#" then + local pos = find_eq(line) + if pos then + local msgid = unescape(line:sub(1, pos - 1):trim()) + strings[msgid] = unescape(line:sub(pos + 1):trim()) + end + end + end + file:close() + return strings +end diff --git a/mods/game_intllib/lib/gintllib.lua b/mods/game_intllib/lib/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/game_intllib/lib/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/game_intllib/license.txt b/mods/game_intllib/license.txt new file mode 100755 index 0000000..c218f79 --- /dev/null +++ b/mods/game_intllib/license.txt @@ -0,0 +1,44 @@ + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to + +- - - + +Minetest Game Translation with 'game_intllib' (based on 'intllib') +Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +This software and all of its parts are distributed under the same license +as the Minetest Game package and/or the above license. + +The mod 'game-intllib' and the 'gintllib.lua' file are derived from +the 2018-08-11 release of 'intllib'. + +https://github.com/minetest-mods/intllib/releases/tag/20180811 +(kaeza released this on 12 Aug 2018) + +See https://github.com/minetest-mods/intllib for the original software. + +Consult the applicable README.txt files on the respective mod license. +[snoopy (Zweihorn)], 2019-05-07 diff --git a/mods/game_intllib/locale/de.po b/mods/game_intllib/locale/de.po new file mode 100644 index 0000000..e7be188 --- /dev/null +++ b/mods/game_intllib/locale/de.po @@ -0,0 +1,1762 @@ +# Minetest Game Translation with intllib +# Copyright (2019) The Minetest Core & Minetest Game Developers +# This file is distributed under the same license as the Minetest Game package. +# Consult the ../../LICENSE.txt file for information on the game license. +# Consult the applicable README.txt file in each mod on the rBirkective mod license. +# snoopy, 2019-05-07. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-10 02:37+0200\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=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: beds/beds.lua +msgid "Fancy Bed" +msgstr "Schönes Bett" + +#: beds/beds.lua +msgid "Simple Bed" +msgstr "Einfaches Bett" + +#: binoculars/init.lua +msgid "" +"Binoculars\n" +"Use with 'Zoom' key" +msgstr "" +"Fernglas\n" +"(mit der 'Zoom'-Taste nutzen)" + +#: boats/init.lua +msgid "[boats] Cruise on" +msgstr "" + +#: boats/init.lua +msgid "[boats] Cruise off" +msgstr "" + +#: boats/init.lua +msgid "Boat" +msgstr "Boot" + +#: bones/init.lua +msgid "Bones" +msgstr "Knochen" + +#: bones/init.lua +msgid "@1's old bones" +msgstr "" + +#: bones/init.lua +msgid "@1 died at @2." +msgstr "" + +#: bones/init.lua +msgid "@1 died at @2, and dropped their inventory." +msgstr "" + +#: bones/init.lua +msgid "@1 died at @2, and bones were placed." +msgstr "" + +#: bones/init.lua +msgid "@1's fresh bones." +msgstr "" + +#: bones/init.lua +msgid "@1's bones." +msgstr "" + +#: bucket/init.lua +msgid "Empty Bucket" +msgstr "Leerer Eimer" + +#: bucket/init.lua +#, fuzzy +msgid "Water Bucket" +msgstr "Eimer mit Wasser" + +#: bucket/init.lua +msgid "River Water Bucket" +msgstr "Eimer mit Flusswasser" + +#: bucket/init.lua +#, fuzzy +msgid "Lava Bucket" +msgstr "Leerer Eimer" + +#: butterflies/init.lua dye/init.lua wool/init.lua +msgid "White" +msgstr "Weiß" + +#: butterflies/init.lua dye/init.lua wool/init.lua +msgid "Red" +msgstr "Rot" + +#: butterflies/init.lua dye/init.lua wool/init.lua +msgid "Violet" +msgstr "Lila" + +#: butterflies/init.lua +#, fuzzy +msgid "@1 Butterfly" +msgstr "Schmetterling (%s)" + +#: butterflies/init.lua +#, fuzzy +msgid "Hidden @1 Butterfly" +msgstr "Stiller Leuchtkäfer" + +#: carts/cart_entity.lua +msgid "Cart (Sneak+Click to pick up)" +msgstr "" + +#: carts/rails.lua +msgid "Rail" +msgstr "Schiene" + +#: carts/rails.lua +msgid "Powered Rail" +msgstr "Antriebsschiene" + +#: carts/rails.lua +msgid "Brake Rail" +msgstr "Bremsschiene" + +#: creative/init.lua +msgid "Allow player to use creative inventory" +msgstr "" + +#: creative/inventory.lua +msgid "All" +msgstr "" + +#: creative/inventory.lua +msgid "Nodes" +msgstr "" + +#: creative/inventory.lua +msgid "Tools" +msgstr "" + +#: creative/inventory.lua +msgid "Items" +msgstr "" + +#: default/chests.lua +msgid "Locked Chest" +msgstr "Verschlossene Truhe" + +#: default/chests.lua +msgid "Locked Chest (owned by @1)" +msgstr "Verschlossene Truhe von @1." + +#: default/chests.lua +msgid "You do not own this chest." +msgstr "Dies ist eine fremde Truhe!" + +#: default/chests.lua +msgid "a locked chest" +msgstr "eine verschlossene Truhe" + +#: default/chests.lua +msgid "Chest" +msgstr "Truhe" + +#: default/craftitems.lua +msgid "Stick" +msgstr "Stab" + +#: default/craftitems.lua +msgid "Paper" +msgstr "Papier" + +#: default/craftitems.lua +msgid "\"@1\" by @2" +msgstr "\"@1\" von @2" + +#: default/craftitems.lua +msgid "Book" +msgstr "Buch" + +#: default/craftitems.lua +msgid "Book With Text" +msgstr "Beschriebenes Buch" + +#: default/craftitems.lua +msgid "Skeleton Key" +msgstr "Schlüsselrohling" + +#: default/craftitems.lua +msgid "Coal Lump" +msgstr "Kohleklumpen" + +#: default/craftitems.lua +msgid "Iron Lump" +msgstr "Eisenklumpen" + +#: default/craftitems.lua +msgid "Copper Lump" +msgstr "Kupferklumpen" + +#: default/craftitems.lua +msgid "Tin Lump" +msgstr "Zinnklumpen" + +#: default/craftitems.lua +msgid "Mese Crystal" +msgstr "Mese-Kristall" + +#: default/craftitems.lua +msgid "Gold Lump" +msgstr "Goldklumpen" + +#: default/craftitems.lua +msgid "Diamond" +msgstr "Diamant" + +#: default/craftitems.lua +msgid "Clay Lump" +msgstr "Tonklumpen" + +#: default/craftitems.lua +msgid "Steel Ingot" +msgstr "Eisenbarren" + +#: default/craftitems.lua +msgid "Copper Ingot" +msgstr "Kupferbarren" + +#: default/craftitems.lua +msgid "Tin Ingot" +msgstr "Zinnbarren" + +#: default/craftitems.lua +msgid "Bronze Ingot" +msgstr "Bronzebarren" + +#: default/craftitems.lua +msgid "Gold Ingot" +msgstr "Goldbarren" + +#: default/craftitems.lua +msgid "Mese Crystal Fragment" +msgstr "Mese-Kristallsplitter" + +#: default/craftitems.lua +msgid "Clay Brick" +msgstr "Tonstein" + +#: default/craftitems.lua +msgid "Obsidian Shard" +msgstr "Obsidiansplitter" + +#: default/craftitems.lua +msgid "Flint" +msgstr "Feuerstein" + +#: default/craftitems.lua +msgid "Blueberries" +msgstr "Heidelbeere" + +#: default/furnace.lua +#, fuzzy +msgid "Furnace is empty" +msgstr "Brennofen" + +#: default/furnace.lua +msgid "100% (output full)" +msgstr "" + +#: default/furnace.lua +msgid "@1%" +msgstr "" + +#: default/furnace.lua +msgid "Empty" +msgstr "" + +#: default/furnace.lua +msgid "Not cookable" +msgstr "" + +#: default/furnace.lua +msgid "" +"Furnace @1 \n" +"(Item: @2; Fuel: @3)" +msgstr "" + +#: default/furnace.lua +msgid "Furnace" +msgstr "Brennofen" + +#: default/nodes.lua +#, fuzzy +msgid "Stone" +msgstr "Steinaxt" + +#: default/nodes.lua +msgid "Cobblestone" +msgstr "Bruchstein" + +#: default/nodes.lua +#, fuzzy +msgid "Stone Brick" +msgstr "Steinspitzhacke" + +#: default/nodes.lua +#, fuzzy +msgid "Stone Block" +msgstr "Steinhacke" + +#: default/nodes.lua +msgid "Mossy Cobblestone" +msgstr "Moosiger Bruchstein" + +#: default/nodes.lua +#, fuzzy +msgid "Desert Stone" +msgstr "Wüstenboden" + +#: default/nodes.lua +msgid "Desert Cobblestone" +msgstr "Wüstenbruchstein" + +#: default/nodes.lua +#, fuzzy +msgid "Desert Stone Brick" +msgstr "Wüstenboden" + +#: default/nodes.lua +#, fuzzy +msgid "Desert Stone Block" +msgstr "Wüstensteinblock" + +#: default/nodes.lua +msgid "Sandstone" +msgstr "Sandstein" + +#: default/nodes.lua +#, fuzzy +msgid "Sandstone Brick" +msgstr "Mauersandstein" + +#: default/nodes.lua +msgid "Sandstone Block" +msgstr "Sandsteinblock" + +#: default/nodes.lua +#, fuzzy +msgid "Desert Sandstone" +msgstr "Wüstensandstein" + +#: default/nodes.lua +#, fuzzy +msgid "Desert Sandstone Brick" +msgstr "Wüstensandmauerstein" + +#: default/nodes.lua +#, fuzzy +msgid "Desert Sandstone Block" +msgstr "Wüstensandsteinblock" + +#: default/nodes.lua +msgid "Silver Sandstone" +msgstr "Feinsandstein" + +#: default/nodes.lua +msgid "Silver Sandstone Brick" +msgstr "Feinsandmauerstein" + +#: default/nodes.lua +msgid "Silver Sandstone Block" +msgstr "Feinsandblock" + +#: default/nodes.lua +#, fuzzy +msgid "Obsidian" +msgstr "Obsidiansplitter" + +#: default/nodes.lua +#, fuzzy +msgid "Obsidian Brick" +msgstr "Obsidiansplitter" + +#: default/nodes.lua +#, fuzzy +msgid "Obsidian Block" +msgstr "Tür aus Obsidianglas" + +#: default/nodes.lua +msgid "Dirt" +msgstr "Erde" + +#: default/nodes.lua +msgid "Dirt with Grass" +msgstr "Grassodenerde" + +#: default/nodes.lua +msgid "Dirt with Grass and Footsteps" +msgstr "Grassodenerde mit Fußstapfen" + +#: default/nodes.lua +msgid "Dirt with Dry Grass" +msgstr "Erde mit Trockengras" + +#: default/nodes.lua +msgid "Dirt with Snow" +msgstr "Erde mit Schnee" + +#: default/nodes.lua +msgid "Dirt with Rainforest Litter" +msgstr "Regenwalderde" + +#: default/nodes.lua +msgid "Dirt with Coniferous Litter" +msgstr "Nadelwalderde" + +#: default/nodes.lua +msgid "Permafrost" +msgstr "Permafrostboden" + +#: default/nodes.lua +msgid "Permafrost with Stones" +msgstr "Steiniger Permafrostboden" + +#: default/nodes.lua +msgid "Permafrost with Moss" +msgstr "Moosiger Permafrostboden" + +#: default/nodes.lua +msgid "Sand" +msgstr "Sand" + +#: default/nodes.lua +#, fuzzy +msgid "Desert Sand" +msgstr "Wüstenboden" + +#: default/nodes.lua +msgid "Silver Sand" +msgstr "Feinsand" + +#: default/nodes.lua +msgid "Gravel" +msgstr "Schotter" + +#: default/nodes.lua +#, fuzzy +msgid "Clay" +msgstr "Ton" + +#: default/nodes.lua +msgid "Snow" +msgstr "Schnee" + +#: default/nodes.lua +msgid "Snow Block" +msgstr "Schneeblock" + +#: default/nodes.lua +msgid "Ice" +msgstr "Eis" + +#: default/nodes.lua +msgid "Cave Ice" +msgstr "Höhleneis" + +#: default/nodes.lua +msgid "Apple Tree" +msgstr "Apfelbaum" + +#: default/nodes.lua +#, fuzzy +msgid "Apple Wood Planks" +msgstr "Zaungatter aus Apfelbaumholz" + +#: default/nodes.lua +msgid "Apple Tree Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Apple Tree Leaves" +msgstr "Apfelbaumsetzling" + +#: default/nodes.lua +msgid "Apple" +msgstr "Apfel" + +#: default/nodes.lua +msgid "Apple Marker" +msgstr "Markierter Apfel" + +#: default/nodes.lua +msgid "Jungle Tree" +msgstr "Tropenbaum" + +#: default/nodes.lua +#, fuzzy +msgid "Jungle Wood Planks" +msgstr "Planken aus Tropenholz" + +#: default/nodes.lua +#, fuzzy +msgid "Jungle Tree Leaves" +msgstr "Tropenholzblätter" + +#: default/nodes.lua +msgid "Jungle Tree Sapling" +msgstr "Tropenbaumsetzling" + +#: default/nodes.lua +msgid "Emergent Jungle Tree Sapling" +msgstr "Tropenbaumspross" + +#: default/nodes.lua +msgid "Pine Tree" +msgstr "Fichtenbaum" + +#: default/nodes.lua +#, fuzzy +msgid "Pine Wood Planks" +msgstr "Planken aus Fichtenholz" + +#: default/nodes.lua +msgid "Pine Needles" +msgstr "Fichtennadeln" + +#: default/nodes.lua +msgid "Pine Tree Sapling" +msgstr "Fichtensetzling" + +#: default/nodes.lua +msgid "Acacia Tree" +msgstr "" + +#: default/nodes.lua +#, fuzzy +msgid "Acacia Wood Planks" +msgstr "Planken aus Akazienholz" + +#: default/nodes.lua +#, fuzzy +msgid "Acacia Tree Leaves" +msgstr "Akazienlaub" + +#: default/nodes.lua +msgid "Acacia Tree Sapling" +msgstr "Akaziensetzling" + +#: default/nodes.lua +msgid "Aspen Tree" +msgstr "Birke" + +#: default/nodes.lua +#, fuzzy +msgid "Aspen Wood Planks" +msgstr "Planken aus Birkenholz" + +#: default/nodes.lua +msgid "Aspen Tree Leaves" +msgstr "Birkenlaub" + +#: default/nodes.lua +msgid "Aspen Tree Sapling" +msgstr "Birkensetzling" + +#: default/nodes.lua +msgid "Coal Ore" +msgstr "Kohle" + +#: default/nodes.lua +msgid "Coal Block" +msgstr "Kohlenblock" + +#: default/nodes.lua +msgid "Iron Ore" +msgstr "Eisenerz" + +#: default/nodes.lua +#, fuzzy +msgid "Steel Block" +msgstr "Eisenblock" + +#: default/nodes.lua +#, fuzzy +msgid "Copper Ore" +msgstr "Kupfererz" + +#: default/nodes.lua +#, fuzzy +msgid "Copper Block" +msgstr "Kupferblock" + +#: default/nodes.lua +msgid "Tin Ore" +msgstr "Zinnerz" + +#: default/nodes.lua +msgid "Tin Block" +msgstr "Zinnblock" + +#: default/nodes.lua +#, fuzzy +msgid "Bronze Block" +msgstr "Bronzehacke" + +#: default/nodes.lua +#, fuzzy +msgid "Mese Ore" +msgstr "Mese-Axt" + +#: default/nodes.lua +#, fuzzy +msgid "Mese Block" +msgstr "Mese-Hacke" + +#: default/nodes.lua +msgid "Gold Ore" +msgstr "" + +#: default/nodes.lua +#, fuzzy +msgid "Gold Block" +msgstr "Goldbarren" + +#: default/nodes.lua +#, fuzzy +msgid "Diamond Ore" +msgstr "Diamantene Axt" + +#: default/nodes.lua +#, fuzzy +msgid "Diamond Block" +msgstr "Diamantene Hacke" + +#: default/nodes.lua +msgid "Cactus" +msgstr "Kaktus" + +#: default/nodes.lua +msgid "Large Cactus Seedling" +msgstr "Großer Kaktussetzling" + +#: default/nodes.lua +msgid "Papyrus" +msgstr "Papyrus" + +#: default/nodes.lua +msgid "Dry Shrub" +msgstr "Trockenes Gestrüpp" + +#: default/nodes.lua +msgid "Jungle Grass" +msgstr "Elefantengras" + +#: default/nodes.lua +msgid "Grass" +msgstr "Gras" + +#: default/nodes.lua +msgid "Dry Grass" +msgstr "Trockenes Gras" + +#: default/nodes.lua +msgid "Fern" +msgstr "Farn" + +#: default/nodes.lua +msgid "Marram Grass" +msgstr "Strandhafer" + +#: default/nodes.lua +msgid "Bush Stem" +msgstr "Buschstamm" + +#: default/nodes.lua +msgid "Bush Leaves" +msgstr "Buschblätter" + +#: default/nodes.lua +msgid "Bush Sapling" +msgstr "Buschsetzling" + +#: default/nodes.lua +msgid "Blueberry Bush Leaves with Berries" +msgstr "Heidelbeerbusch mit Beeren" + +#: default/nodes.lua +#, fuzzy +msgid "Blueberry Bush Leaves" +msgstr "Heidelbeerblätter" + +#: default/nodes.lua +msgid "Blueberry Bush Sapling" +msgstr "Heidelbeersetzling" + +#: default/nodes.lua +msgid "Acacia Bush Stem" +msgstr "Stamm der Acacia victoriae" + +#: default/nodes.lua +msgid "Acacia Bush Leaves" +msgstr "Blätter der Acacia victoriae" + +#: default/nodes.lua +msgid "Acacia Bush Sapling" +msgstr "Setzling der Acacia victoriae" + +#: default/nodes.lua +msgid "Pine Bush Stem" +msgstr "Nadelbuschstamm" + +#: default/nodes.lua +msgid "Pine Bush Needles" +msgstr "Buschnadeln" + +#: default/nodes.lua +msgid "Pine Bush Sapling" +msgstr "Nadelbuschsetzling" + +#: default/nodes.lua +msgid "Kelp" +msgstr "Seetang" + +#: default/nodes.lua +#, fuzzy +msgid "Green Coral" +msgstr "Grün" + +#: default/nodes.lua +msgid "Pink Coral" +msgstr "Rosa Koralle" + +#: default/nodes.lua +msgid "Cyan Coral" +msgstr "Türkise Koralle" + +#: default/nodes.lua +#, fuzzy +msgid "Brown Coral" +msgstr "Braun" + +#: default/nodes.lua +#, fuzzy +msgid "Orange Coral" +msgstr "Orangene Tulpe" + +#: default/nodes.lua +#, fuzzy +msgid "Coral Skeleton" +msgstr "Schlüsselrohling" + +#: default/nodes.lua +msgid "Water Source" +msgstr "Wasserquelle" + +#: default/nodes.lua +msgid "Flowing Water" +msgstr "Fließendes Wasser" + +#: default/nodes.lua +msgid "River Water Source" +msgstr "Flusswasserquelle" + +#: default/nodes.lua +msgid "Flowing River Water" +msgstr "Fließendes Flusswasser" + +#: default/nodes.lua +msgid "Lava Source" +msgstr "Lavaquelle" + +#: default/nodes.lua +msgid "Flowing Lava" +msgstr "Fließende Lava" + +#: default/nodes.lua +#, fuzzy +msgid "Empty Bookshelf" +msgstr "Bücherbord" + +#: default/nodes.lua +msgid "Bookshelf (@1 written, @2 empty books)" +msgstr "" + +#: default/nodes.lua +#, fuzzy +msgid "Bookshelf" +msgstr "Bücherbord" + +#: default/nodes.lua +msgid "@1 Sign" +msgstr "" + +#: default/nodes.lua +msgid "Text too long" +msgstr "" + +#: default/nodes.lua +#, fuzzy +msgid "Wooden" +msgstr "Hölzerne Axt" + +#: default/nodes.lua +#, fuzzy +msgid "Steel" +msgstr "Eisenaxt" + +#: default/nodes.lua +#, fuzzy +msgid "Wooden Ladder" +msgstr "Holzleiter" + +#: default/nodes.lua +#, fuzzy +msgid "Steel Ladder" +msgstr "Eisenleiter" + +#: default/nodes.lua +#, fuzzy +msgid "Apple Wood Fence" +msgstr "Apfelbaumzaun" + +#: default/nodes.lua +#, fuzzy +msgid "Acacia Wood Fence" +msgstr "Akazienzaun" + +#: default/nodes.lua +#, fuzzy +msgid "Jungle Wood Fence" +msgstr "Tropenholzzaun" + +#: default/nodes.lua +#, fuzzy +msgid "Pine Wood Fence" +msgstr "Fichtenzaun" + +#: default/nodes.lua +#, fuzzy +msgid "Aspen Wood Fence" +msgstr "Birkenzaun" + +#: default/nodes.lua +#, fuzzy +msgid "Apple Wood Fence Rail" +msgstr "Zaungatter aus Apfelbaumholz" + +#: default/nodes.lua +#, fuzzy +msgid "Acacia Wood Fence Rail" +msgstr "Zaungatter aus Akazienholz" + +#: default/nodes.lua +#, fuzzy +msgid "Jungle Wood Fence Rail" +msgstr "Zaungatter aus Tropenholz" + +#: default/nodes.lua +#, fuzzy +msgid "Pine Wood Fence Rail" +msgstr "Zaungatter aus Fichtenholz" + +#: default/nodes.lua +#, fuzzy +msgid "Aspen Wood Fence Rail" +msgstr "Zaungatter aus Birkenholz" + +#: default/nodes.lua +#, fuzzy +msgid "Glass" +msgstr "Fesnterglas" + +#: default/nodes.lua +#, fuzzy +msgid "Obsidian Glass" +msgstr "Obsidianglas" + +#: default/nodes.lua +msgid "Brick Block" +msgstr "Mauerblock" + +#: default/nodes.lua +msgid "Mese Lamp" +msgstr "Mese-Leuchte" + +#: default/nodes.lua +msgid "Mese Post Light" +msgstr "Mese-Leuchtpfosten" + +#: default/nodes.lua +msgid "Cloud" +msgstr "Wolke" + +#: default/tools.lua +msgid "Wooden Pickaxe" +msgstr "Hölzerne Spitzhacke" + +#: default/tools.lua +msgid "Stone Pickaxe" +msgstr "Steinspitzhacke" + +#: default/tools.lua +msgid "Bronze Pickaxe" +msgstr "Bronzespitzhacke" + +#: default/tools.lua +msgid "Steel Pickaxe" +msgstr "Eisenspitzhacke" + +#: default/tools.lua +msgid "Mese Pickaxe" +msgstr "Mese-Spitzhacke" + +#: default/tools.lua +msgid "Diamond Pickaxe" +msgstr "Diamantene Spitzhacke" + +#: default/tools.lua +msgid "Wooden Shovel" +msgstr "Holzschaufel" + +#: default/tools.lua +msgid "Stone Shovel" +msgstr "Steinschaufel" + +#: default/tools.lua +msgid "Bronze Shovel" +msgstr "Bronzeschaufel" + +#: default/tools.lua +msgid "Steel Shovel" +msgstr "Eisenschaufel" + +#: default/tools.lua +msgid "Mese Shovel" +msgstr "Mese-Schaufel" + +#: default/tools.lua +msgid "Diamond Shovel" +msgstr "Diamantene Schaufel" + +#: default/tools.lua +msgid "Wooden Axe" +msgstr "Hölzerne Axt" + +#: default/tools.lua +msgid "Stone Axe" +msgstr "Steinaxt" + +#: default/tools.lua +msgid "Bronze Axe" +msgstr "Bronzeaxt" + +#: default/tools.lua +msgid "Steel Axe" +msgstr "Eisenaxt" + +#: default/tools.lua +msgid "Mese Axe" +msgstr "Mese-Axt" + +#: default/tools.lua +msgid "Diamond Axe" +msgstr "Diamantene Axt" + +#: default/tools.lua +msgid "Wooden Sword" +msgstr "Holzschwert" + +#: default/tools.lua +msgid "Stone Sword" +msgstr "Steinschwert" + +#: default/tools.lua +msgid "Bronze Sword" +msgstr "Bronzeschwert" + +#: default/tools.lua +msgid "Steel Sword" +msgstr "Eisenschwert" + +#: default/tools.lua +msgid "Mese Sword" +msgstr "Mese-Schwert" + +#: default/tools.lua +msgid "Diamond Sword" +msgstr "Diamantenes Schwert" + +#: default/tools.lua +msgid "Key" +msgstr "Schlüssel" + +#: default/torch.lua +msgid "Torch" +msgstr "Fackel" + +#: default/trees.lua +msgid "@1 will intersect protection on growth." +msgstr "" + +#: doors/init.lua +msgid "Hidden Door Segment" +msgstr "Verborgenes Türelement" + +#: doors/init.lua +msgid "Owned by @1" +msgstr "Im Eigentum von @1" + +#: doors/init.lua +msgid "You do not own this locked door." +msgstr "Dies ist eine fremde Tür!" + +#: doors/init.lua +msgid "Wooden Door" +msgstr "Holztür" + +#: doors/init.lua +msgid "Steel Door" +msgstr "Eiserne Tür" + +#: doors/init.lua +msgid "Glass Door" +msgstr "Glastür" + +#: doors/init.lua +msgid "Obsidian Glass Door" +msgstr "Tür aus Obsidianglas" + +#: doors/init.lua +msgid "You do not own this trapdoor." +msgstr "Dies ist eine fremde Falltür!" + +#: doors/init.lua +msgid "Wooden Trapdoor" +msgstr "Hölzerne Falltür" + +#: doors/init.lua +msgid "Steel Trapdoor" +msgstr "Eiserne Falltür" + +#: doors/init.lua +msgid "Apple Wood Fence Gate" +msgstr "Zaungatter aus Apfelbaumholz" + +#: doors/init.lua +msgid "Acacia Wood Fence Gate" +msgstr "Zaungatter aus Akazienholz" + +#: doors/init.lua +msgid "Jungle Wood Fence Gate" +msgstr "Zaungatter aus Tropenholz" + +#: doors/init.lua +msgid "Pine Wood Fence Gate" +msgstr "Zaungatter aus Fichtenholz" + +#: doors/init.lua +msgid "Aspen Wood Fence Gate" +msgstr "Zaungatter aus Birkenholz" + +#: dye/init.lua wool/init.lua +msgid "Grey" +msgstr "Grau" + +#: dye/init.lua +msgid "Dark grey" +msgstr "Dunkelgrau" + +#: dye/init.lua wool/init.lua +msgid "Black" +msgstr "Schwarz" + +#: dye/init.lua wool/init.lua +msgid "Blue" +msgstr "Blau" + +#: dye/init.lua wool/init.lua +msgid "Cyan" +msgstr "Türkis" + +#: dye/init.lua +msgid "Dark green" +msgstr "Dunkelgrün" + +#: dye/init.lua wool/init.lua +msgid "Green" +msgstr "Grün" + +#: dye/init.lua wool/init.lua +msgid "Yellow" +msgstr "Gelb" + +#: dye/init.lua wool/init.lua +msgid "Brown" +msgstr "Braun" + +#: dye/init.lua wool/init.lua +msgid "Orange" +msgstr "Orange" + +#: dye/init.lua wool/init.lua +msgid "Magenta" +msgstr "Magenta" + +#: dye/init.lua wool/init.lua +msgid "Pink" +msgstr "Rosa" + +#: dye/init.lua +msgid "@1 Dye" +msgstr "Farbpulver (@1)" + +#: farming/api.lua +msgid "Hoe" +msgstr "Hacke" + +#: farming/api.lua +msgid "Seed" +msgstr "Samen" + +#: farming/hoes.lua +msgid "Wooden Hoe" +msgstr "Hölzerne Hacke" + +#: farming/hoes.lua +msgid "Stone Hoe" +msgstr "Steinhacke" + +#: farming/hoes.lua +msgid "Steel Hoe" +msgstr "Eisenhacke" + +#: farming/hoes.lua +msgid "Bronze Hoe" +msgstr "Bronzehacke" + +#: farming/hoes.lua +msgid "Mese Hoe" +msgstr "Mese-Hacke" + +#: farming/hoes.lua +msgid "Diamond Hoe" +msgstr "Diamantene Hacke" + +#: farming/init.lua +msgid "Wheat Seed" +msgstr "Weizensaat" + +#: farming/init.lua +msgid "Flour" +msgstr "Mehl" + +#: farming/init.lua +msgid "Bread" +msgstr "Brot" + +#: farming/init.lua +msgid "Cotton Seed" +msgstr "Baumwollsamen" + +#: farming/init.lua +msgid "String" +msgstr "Schnurfaden" + +#: farming/nodes.lua +msgid "Soil" +msgstr "Boden" + +#: farming/nodes.lua +msgid "Wet Soil" +msgstr "Ackerboden" + +#: farming/nodes.lua +msgid "Desert Sand Soil" +msgstr "Wüstenboden" + +#: farming/nodes.lua +msgid "Wet Desert Sand Soil" +msgstr "Wüstenackerboden" + +#: farming/nodes.lua +msgid "Straw" +msgstr "Stroh" + +#: farming/nodes.lua +#, fuzzy +msgid "Straw Stair" +msgstr "Stroh" + +#: farming/nodes.lua +#, fuzzy +msgid "Straw Slab" +msgstr "Stroh" + +#: fire/init.lua +msgid "Permanent Flame" +msgstr "Andauernde Flamme" + +#: fire/init.lua +msgid "Flint and Steel" +msgstr "Feuerstein mit Stahl" + +#: fireflies/init.lua +msgid "Firefly" +msgstr "Glühwürmchen" + +#: fireflies/init.lua +msgid "Hidden Firefly" +msgstr "Stiller Leuchtkäfer" + +#: fireflies/init.lua +msgid "Bug Net" +msgstr "Insektenkescher" + +#: fireflies/init.lua +msgid "Firefly in a Bottle" +msgstr "Glühwürmchenglas" + +#: flowers/init.lua +msgid "Red Rose" +msgstr "Rote Rose" + +#: flowers/init.lua +msgid "Orange Tulip" +msgstr "Orangene Tulpe" + +#: flowers/init.lua +msgid "Yellow Dandelion" +msgstr "Löwenzahn" + +#: flowers/init.lua +msgid "Green Chrysanthemum" +msgstr "Grüne Chrysantheme" + +#: flowers/init.lua +msgid "Blue Geranium" +msgstr "Blaue Geranie" + +#: flowers/init.lua +msgid "Viola" +msgstr "Veilchen" + +#: flowers/init.lua +msgid "White Dandelion" +msgstr "Gänseblümchen" + +#: flowers/init.lua +msgid "Black Tulip" +msgstr "Schwarze Tulpe" + +#: flowers/init.lua +msgid "Red Mushroom" +msgstr "Fliegenpliz" + +#: flowers/init.lua +msgid "Brown Mushroom" +msgstr "Steinpliz" + +#: flowers/init.lua +msgid "Waterlily" +msgstr "Seerose" + +#: game_commands/init.lua +msgid "Kill yourself to respawn" +msgstr "Eine Wiedererweckung erfordert den Selbstmord!" + +#: game_commands/init.lua +msgid "No static_spawnpoint defined" +msgstr "Unbekannter Erweckungspunkt (no static_spawnpoint)" + +#: game_commands/init.lua +msgid "You need to be online to be killed!" +msgstr "Kein Tod ohne Online-Verbindung möglich!" + +#: map/init.lua +msgid "" +"Mapping Kit\n" +"Use with 'Minimap' key" +msgstr "" +"Kartenwerkzeug\n" +"(mit 'Minimap'-Taste nutzen)" + +#: screwdriver/init.lua +msgid "Screwdriver (left-click rotates face, right-click rotates axis)" +msgstr "Schraubendreher (Links-Klick stürzt, Rechts-Klick dreht)" + +#: sethome/init.lua +msgid "Can use /sethome and /home" +msgstr "Die Befehle /sethome und /home sind möglich." + +#: sethome/init.lua +msgid "Teleport you to your home point" +msgstr "Zum Heimatpunkt teleportieren." + +#: sethome/init.lua +msgid "Teleported to home!" +msgstr "Hiermit zum Heimatpunkt teleportiert!" + +#: sethome/init.lua +msgid "Set a home using /sethome" +msgstr "Den Heimatpunkt mit dem Befehl /sethome setzen." + +#: sethome/init.lua +msgid "Set your home point" +msgstr "Den Heimatpunkt setzen." + +#: sethome/init.lua +msgid "Home set!" +msgstr "Der Heimatpunkt ist hiermit gesetzt!" + +#: sethome/init.lua +msgid "Player not found!" +msgstr "Spielfigur nicht gefunden!" + +#: stairs/init.lua +msgid "Inner @1" +msgstr "Innere @1" + +#: stairs/init.lua +msgid "Outer @1" +msgstr "Äußere @1" + +#: stairs/init.lua +#, fuzzy +msgid "Wooden Stair" +msgstr "Holzschwert" + +#: stairs/init.lua +#, fuzzy +msgid "Wooden Slab" +msgstr "Holzschaufel" + +#: stairs/init.lua +#, fuzzy +msgid "Jungle Wood Stair" +msgstr "Planken aus Tropenholz" + +#: stairs/init.lua +#, fuzzy +msgid "Jungle Wood Slab" +msgstr "Planken aus Tropenholz" + +#: stairs/init.lua +#, fuzzy +msgid "Pine Wood Stair" +msgstr "Planken aus Fichtenholz" + +#: stairs/init.lua +#, fuzzy +msgid "Pine Wood Slab" +msgstr "Planken aus Fichtenholz" + +#: stairs/init.lua +#, fuzzy +msgid "Acacia Wood Stair" +msgstr "Planken aus Akazienholz" + +#: stairs/init.lua +#, fuzzy +msgid "Acacia Wood Slab" +msgstr "Planken aus Akazienholz" + +#: stairs/init.lua +#, fuzzy +msgid "Aspen Wood Stair" +msgstr "Planken aus Birkenholz" + +#: stairs/init.lua +#, fuzzy +msgid "Aspen Wood Slab" +msgstr "Planken aus Birkenholz" + +#: stairs/init.lua +#, fuzzy +msgid "Stone Stair" +msgstr "Steinschwert" + +#: stairs/init.lua +#, fuzzy +msgid "Stone Slab" +msgstr "Steinschaufel" + +#: stairs/init.lua +#, fuzzy +msgid "Cobblestone Stair" +msgstr "Bruchstein" + +#: stairs/init.lua +#, fuzzy +msgid "Cobblestone Slab" +msgstr "Bruchstein" + +#: stairs/init.lua +#, fuzzy +msgid "Mossy Cobblestone Stair" +msgstr "Moosiger Bruchstein" + +#: stairs/init.lua +#, fuzzy +msgid "Mossy Cobblestone Slab" +msgstr "Moosiger Bruchstein" + +#: stairs/init.lua +#, fuzzy +msgid "Stone Brick Stair" +msgstr "Steinspitzhacke" + +#: stairs/init.lua +#, fuzzy +msgid "Stone Brick Slab" +msgstr "Steinspitzhacke" + +#: stairs/init.lua +#, fuzzy +msgid "Stone Block Stair" +msgstr "Steinhacke" + +#: stairs/init.lua +#, fuzzy +msgid "Stone Block Slab" +msgstr "Steinhacke" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Stone Stair" +msgstr "Wüstenboden" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Stone Slab" +msgstr "Wüstenboden" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Cobblestone Stair" +msgstr "Wüstenbruchstein" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Cobblestone Slab" +msgstr "Wüstenbruchstein" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Stone Brick Stair" +msgstr "Wüstenboden" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Stone Brick Slab" +msgstr "Wüstenboden" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Stone Block Stair" +msgstr "Wüstensteinblock" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Stone Block Slab" +msgstr "Wüstensteinblock" + +#: stairs/init.lua +#, fuzzy +msgid "Sandstone Stair" +msgstr "Sandstein" + +#: stairs/init.lua +#, fuzzy +msgid "Sandstone Slab" +msgstr "Sandstein" + +#: stairs/init.lua +#, fuzzy +msgid "Sandstone Brick Stair" +msgstr "Mauersandstein" + +#: stairs/init.lua +#, fuzzy +msgid "Sandstone Brick Slab" +msgstr "Mauersandstein" + +#: stairs/init.lua +#, fuzzy +msgid "Sandstone Block Stair" +msgstr "Sandsteinblock" + +#: stairs/init.lua +#, fuzzy +msgid "Sandstone Block Slab" +msgstr "Sandsteinblock" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Sandstone Stair" +msgstr "Wüstensandstein" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Sandstone Slab" +msgstr "Wüstensandstein" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Sandstone Brick Stair" +msgstr "Wüstensandmauerstein" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Sandstone Brick Slab" +msgstr "Wüstensandmauerstein" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Sandstone Block Stair" +msgstr "Wüstensandsteinblock" + +#: stairs/init.lua +#, fuzzy +msgid "Desert Sandstone Block Slab" +msgstr "Wüstensandsteinblock" + +#: stairs/init.lua +#, fuzzy +msgid "Silver Sandstone Stair" +msgstr "Feinsandstein" + +#: stairs/init.lua +#, fuzzy +msgid "Silver Sandstone Slab" +msgstr "Feinsandstein" + +#: stairs/init.lua +#, fuzzy +msgid "Silver Sandstone Brick Stair" +msgstr "Feinsandmauerstein" + +#: stairs/init.lua +#, fuzzy +msgid "Silver Sandstone Brick Slab" +msgstr "Feinsandmauerstein" + +#: stairs/init.lua +#, fuzzy +msgid "Silver Sandstone Block Stair" +msgstr "Feinsandblock" + +#: stairs/init.lua +#, fuzzy +msgid "Silver Sandstone Block Slab" +msgstr "Feinsandblock" + +#: stairs/init.lua +#, fuzzy +msgid "Obsidian Stair" +msgstr "Obsidiansplitter" + +#: stairs/init.lua +#, fuzzy +msgid "Obsidian Slab" +msgstr "Obsidiansplitter" + +#: stairs/init.lua +#, fuzzy +msgid "Obsidian Brick Stair" +msgstr "Obsidiansplitter" + +#: stairs/init.lua +#, fuzzy +msgid "Obsidian Brick Slab" +msgstr "Obsidiansplitter" + +#: stairs/init.lua +#, fuzzy +msgid "Obsidian Block Stair" +msgstr "Tür aus Obsidianglas" + +#: stairs/init.lua +#, fuzzy +msgid "Obsidian Block Slab" +msgstr "Tür aus Obsidianglas" + +#: stairs/init.lua +msgid "Brick Stair" +msgstr "" + +#: stairs/init.lua +#, fuzzy +msgid "Brick Slab" +msgstr "Mauerblock" + +#: stairs/init.lua +#, fuzzy +msgid "Steel Block Stair" +msgstr "Eisenblock" + +#: stairs/init.lua +#, fuzzy +msgid "Steel Block Slab" +msgstr "Eisenblock" + +#: stairs/init.lua +#, fuzzy +msgid "Tin Block Stair" +msgstr "Zinnblock" + +#: stairs/init.lua +#, fuzzy +msgid "Tin Block Slab" +msgstr "Zinnblock" + +#: stairs/init.lua +#, fuzzy +msgid "Copper Block Stair" +msgstr "Kupferblock" + +#: stairs/init.lua +#, fuzzy +msgid "Copper Block Slab" +msgstr "Kupferblock" + +#: stairs/init.lua +#, fuzzy +msgid "Bronze Block Stair" +msgstr "Bronzehacke" + +#: stairs/init.lua +#, fuzzy +msgid "Bronze Block Slab" +msgstr "Bronzehacke" + +#: stairs/init.lua +#, fuzzy +msgid "Gold Block Stair" +msgstr "Goldbarren" + +#: stairs/init.lua +#, fuzzy +msgid "Gold Block Slab" +msgstr "Goldbarren" + +#: stairs/init.lua +msgid "Ice Stair" +msgstr "" + +#: stairs/init.lua +msgid "Ice Slab" +msgstr "" + +#: stairs/init.lua +#, fuzzy +msgid "Snow Block Stair" +msgstr "Schneeblock" + +#: stairs/init.lua +#, fuzzy +msgid "Snow Block Slab" +msgstr "Schneeblock" + +#: stairs/init.lua +#, fuzzy +msgid "Glass Stair" +msgstr "Glastür" + +#: stairs/init.lua +#, fuzzy +msgid "Glass Slab" +msgstr "Glasscheibe" + +#: stairs/init.lua +#, fuzzy +msgid "Obsidian Glass Stair" +msgstr "Obsidianglas" + +#: stairs/init.lua +#, fuzzy +msgid "Obsidian Glass Slab" +msgstr "Obsidianglas" + +#: tnt/init.lua +msgid "Gun Powder" +msgstr "Schießpulver" + +#: tnt/init.lua +msgid "TNT Stick" +msgstr "Dynamitstange" + +#: tnt/init.lua +msgid "TNT" +msgstr "Sprengladung" + +#: vessels/init.lua +msgid "Vessels Shelf" +msgstr "Geschirrschrank" + +#: vessels/init.lua +msgid "Empty Glass Bottle" +msgstr "Leere Glasflasche" + +#: vessels/init.lua +msgid "Empty Drinking Glass" +msgstr "Leeres Trinkglas" + +#: vessels/init.lua +msgid "Empty Heavy Steel Bottle" +msgstr "Leere Stahlflasche" + +#: vessels/init.lua +msgid "Glass Fragments" +msgstr "Glassplitter" + +#: walls/init.lua +#, fuzzy +msgid "Cobblestone Wall" +msgstr "Bruchstein" + +#: walls/init.lua +#, fuzzy +msgid "Mossy Cobblestone Wall" +msgstr "Moosiger Bruchstein" + +#: walls/init.lua +#, fuzzy +msgid "Desert Cobblestone Wall" +msgstr "Wüstenbruchstein" + +#: wool/init.lua +msgid "Dark Grey" +msgstr "Dunkelgrau" + +#: wool/init.lua +msgid "Dark Green" +msgstr "Dunkelgrün" + +#: wool/init.lua +msgid "@1 Wool" +msgstr "Wolle (@1)" + +#: xpanes/init.lua +#, fuzzy +msgid "Glass Pane" +msgstr "Glasscheibe" + +#: xpanes/init.lua +#, fuzzy +msgid "Obsidian Glass Pane" +msgstr "Obsidianglasscheibe" + +#: xpanes/init.lua +#, fuzzy +msgid "Steel Bars" +msgstr "Eisengitter" diff --git a/mods/game_intllib/locale/template.pot b/mods/game_intllib/locale/template.pot new file mode 100644 index 0000000..abeaaa3 --- /dev/null +++ b/mods/game_intllib/locale/template.pot @@ -0,0 +1,1622 @@ +# Minetest Game Translation with intllib +# Copyright (2019) The Minetest Core & Minetest Game Developers +# This file is distributed under the same license as the Minetest Game package. +# Consult the ../../LICENSE.txt file for information on the game license. +# Consult the applicable README.txt file in each mod on the respective mod license. +# snoopy, 2019-05-07. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2019-05-10 10:02+0200\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=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: beds/beds.lua +msgid "Fancy Bed" +msgstr "" + +#: beds/beds.lua +msgid "Simple Bed" +msgstr "" + +#: binoculars/init.lua +msgid "" +"Binoculars\n" +"Use with 'Zoom' key" +msgstr "" + +#: boats/init.lua +msgid "[boats] Cruise on" +msgstr "" + +#: boats/init.lua +msgid "[boats] Cruise off" +msgstr "" + +#: boats/init.lua +msgid "Boat" +msgstr "" + +#: bones/init.lua +msgid "Bones" +msgstr "" + +#: bones/init.lua +msgid "@1's old bones" +msgstr "" + +#: bones/init.lua +msgid "@1 died at @2." +msgstr "" + +#: bones/init.lua +msgid "@1 died at @2, and dropped their inventory." +msgstr "" + +#: bones/init.lua +msgid "@1 died at @2, and bones were placed." +msgstr "" + +#: bones/init.lua +msgid "@1's fresh bones." +msgstr "" + +#: bones/init.lua +msgid "@1's bones." +msgstr "" + +#: bucket/init.lua +msgid "Empty Bucket" +msgstr "" + +#: bucket/init.lua +msgid "Water Bucket" +msgstr "" + +#: bucket/init.lua +msgid "River Water Bucket" +msgstr "" + +#: bucket/init.lua +msgid "Lava Bucket" +msgstr "" + +#: butterflies/init.lua dye/init.lua wool/init.lua +msgid "White" +msgstr "" + +#: butterflies/init.lua dye/init.lua wool/init.lua +msgid "Red" +msgstr "" + +#: butterflies/init.lua dye/init.lua wool/init.lua +msgid "Violet" +msgstr "" + +#: butterflies/init.lua +msgid "@1 Butterfly" +msgstr "" + +#: butterflies/init.lua +msgid "Hidden @1 Butterfly" +msgstr "" + +#: carts/cart_entity.lua +msgid "Cart (Sneak+Click to pick up)" +msgstr "" + +#: carts/rails.lua +msgid "Rail" +msgstr "" + +#: carts/rails.lua +msgid "Powered Rail" +msgstr "" + +#: carts/rails.lua +msgid "Brake Rail" +msgstr "" + +#: creative/init.lua +msgid "Allow player to use creative inventory" +msgstr "" + +#: creative/inventory.lua +msgid "All" +msgstr "" + +#: creative/inventory.lua +msgid "Nodes" +msgstr "" + +#: creative/inventory.lua +msgid "Tools" +msgstr "" + +#: creative/inventory.lua +msgid "Items" +msgstr "" + +#: default/chests.lua +msgid "Locked Chest" +msgstr "" + +#: default/chests.lua +msgid "Locked Chest (owned by @1)" +msgstr "" + +#: default/chests.lua +msgid "You do not own this chest." +msgstr "" + +#: default/chests.lua +msgid "a locked chest" +msgstr "" + +#: default/chests.lua +msgid "Chest" +msgstr "" + +#: default/craftitems.lua +msgid "Stick" +msgstr "" + +#: default/craftitems.lua +msgid "Paper" +msgstr "" + +#: default/craftitems.lua +msgid "\"@1\" by @2" +msgstr "" + +#: default/craftitems.lua +msgid "Book" +msgstr "" + +#: default/craftitems.lua +msgid "Book With Text" +msgstr "" + +#: default/craftitems.lua +msgid "Skeleton Key" +msgstr "" + +#: default/craftitems.lua +msgid "Coal Lump" +msgstr "" + +#: default/craftitems.lua +msgid "Iron Lump" +msgstr "" + +#: default/craftitems.lua +msgid "Copper Lump" +msgstr "" + +#: default/craftitems.lua +msgid "Tin Lump" +msgstr "" + +#: default/craftitems.lua +msgid "Mese Crystal" +msgstr "" + +#: default/craftitems.lua +msgid "Gold Lump" +msgstr "" + +#: default/craftitems.lua +msgid "Diamond" +msgstr "" + +#: default/craftitems.lua +msgid "Clay Lump" +msgstr "" + +#: default/craftitems.lua +msgid "Steel Ingot" +msgstr "" + +#: default/craftitems.lua +msgid "Copper Ingot" +msgstr "" + +#: default/craftitems.lua +msgid "Tin Ingot" +msgstr "" + +#: default/craftitems.lua +msgid "Bronze Ingot" +msgstr "" + +#: default/craftitems.lua +msgid "Gold Ingot" +msgstr "" + +#: default/craftitems.lua +msgid "Mese Crystal Fragment" +msgstr "" + +#: default/craftitems.lua +msgid "Clay Brick" +msgstr "" + +#: default/craftitems.lua +msgid "Obsidian Shard" +msgstr "" + +#: default/craftitems.lua +msgid "Flint" +msgstr "" + +#: default/craftitems.lua +msgid "Blueberries" +msgstr "" + +#: default/furnace.lua +msgid "Furnace is empty" +msgstr "" + +#: default/furnace.lua +msgid "100% (output full)" +msgstr "" + +#: default/furnace.lua +msgid "@1%" +msgstr "" + +#: default/furnace.lua +msgid "Empty" +msgstr "" + +#: default/furnace.lua +msgid "Not cookable" +msgstr "" + +#: default/furnace.lua +msgid "" +"Furnace @1 \n" +"(Item: @2; Fuel: @3)" +msgstr "" + +#: default/furnace.lua +msgid "Furnace" +msgstr "" + +#: default/nodes.lua +msgid "Stone" +msgstr "" + +#: default/nodes.lua +msgid "Cobblestone" +msgstr "" + +#: default/nodes.lua +msgid "Stone Brick" +msgstr "" + +#: default/nodes.lua +msgid "Stone Block" +msgstr "" + +#: default/nodes.lua +msgid "Mossy Cobblestone" +msgstr "" + +#: default/nodes.lua +msgid "Desert Stone" +msgstr "" + +#: default/nodes.lua +msgid "Desert Cobblestone" +msgstr "" + +#: default/nodes.lua +msgid "Desert Stone Brick" +msgstr "" + +#: default/nodes.lua +msgid "Desert Stone Block" +msgstr "" + +#: default/nodes.lua +msgid "Sandstone" +msgstr "" + +#: default/nodes.lua +msgid "Sandstone Brick" +msgstr "" + +#: default/nodes.lua +msgid "Sandstone Block" +msgstr "" + +#: default/nodes.lua +msgid "Desert Sandstone" +msgstr "" + +#: default/nodes.lua +msgid "Desert Sandstone Brick" +msgstr "" + +#: default/nodes.lua +msgid "Desert Sandstone Block" +msgstr "" + +#: default/nodes.lua +msgid "Silver Sandstone" +msgstr "" + +#: default/nodes.lua +msgid "Silver Sandstone Brick" +msgstr "" + +#: default/nodes.lua +msgid "Silver Sandstone Block" +msgstr "" + +#: default/nodes.lua +msgid "Obsidian" +msgstr "" + +#: default/nodes.lua +msgid "Obsidian Brick" +msgstr "" + +#: default/nodes.lua +msgid "Obsidian Block" +msgstr "" + +#: default/nodes.lua +msgid "Dirt" +msgstr "" + +#: default/nodes.lua +msgid "Dirt with Grass" +msgstr "" + +#: default/nodes.lua +msgid "Dirt with Grass and Footsteps" +msgstr "" + +#: default/nodes.lua +msgid "Dirt with Dry Grass" +msgstr "" + +#: default/nodes.lua +msgid "Dirt with Snow" +msgstr "" + +#: default/nodes.lua +msgid "Dirt with Rainforest Litter" +msgstr "" + +#: default/nodes.lua +msgid "Dirt with Coniferous Litter" +msgstr "" + +#: default/nodes.lua +msgid "Permafrost" +msgstr "" + +#: default/nodes.lua +msgid "Permafrost with Stones" +msgstr "" + +#: default/nodes.lua +msgid "Permafrost with Moss" +msgstr "" + +#: default/nodes.lua +msgid "Sand" +msgstr "" + +#: default/nodes.lua +msgid "Desert Sand" +msgstr "" + +#: default/nodes.lua +msgid "Silver Sand" +msgstr "" + +#: default/nodes.lua +msgid "Gravel" +msgstr "" + +#: default/nodes.lua +msgid "Clay" +msgstr "" + +#: default/nodes.lua +msgid "Snow" +msgstr "" + +#: default/nodes.lua +msgid "Snow Block" +msgstr "" + +#: default/nodes.lua +msgid "Ice" +msgstr "" + +#: default/nodes.lua +msgid "Cave Ice" +msgstr "" + +#: default/nodes.lua +msgid "Apple Tree" +msgstr "" + +#: default/nodes.lua +msgid "Apple Wood Planks" +msgstr "" + +#: default/nodes.lua +msgid "Apple Tree Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Apple Tree Leaves" +msgstr "" + +#: default/nodes.lua +msgid "Apple" +msgstr "" + +#: default/nodes.lua +msgid "Apple Marker" +msgstr "" + +#: default/nodes.lua +msgid "Jungle Tree" +msgstr "" + +#: default/nodes.lua +msgid "Jungle Wood Planks" +msgstr "" + +#: default/nodes.lua +msgid "Jungle Tree Leaves" +msgstr "" + +#: default/nodes.lua +msgid "Jungle Tree Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Emergent Jungle Tree Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Pine Tree" +msgstr "" + +#: default/nodes.lua +msgid "Pine Wood Planks" +msgstr "" + +#: default/nodes.lua +msgid "Pine Needles" +msgstr "" + +#: default/nodes.lua +msgid "Pine Tree Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Acacia Tree" +msgstr "" + +#: default/nodes.lua +msgid "Acacia Wood Planks" +msgstr "" + +#: default/nodes.lua +msgid "Acacia Tree Leaves" +msgstr "" + +#: default/nodes.lua +msgid "Acacia Tree Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Aspen Tree" +msgstr "" + +#: default/nodes.lua +msgid "Aspen Wood Planks" +msgstr "" + +#: default/nodes.lua +msgid "Aspen Tree Leaves" +msgstr "" + +#: default/nodes.lua +msgid "Aspen Tree Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Coal Ore" +msgstr "" + +#: default/nodes.lua +msgid "Coal Block" +msgstr "" + +#: default/nodes.lua +msgid "Iron Ore" +msgstr "" + +#: default/nodes.lua +msgid "Steel Block" +msgstr "" + +#: default/nodes.lua +msgid "Copper Ore" +msgstr "" + +#: default/nodes.lua +msgid "Copper Block" +msgstr "" + +#: default/nodes.lua +msgid "Tin Ore" +msgstr "" + +#: default/nodes.lua +msgid "Tin Block" +msgstr "" + +#: default/nodes.lua +msgid "Bronze Block" +msgstr "" + +#: default/nodes.lua +msgid "Mese Ore" +msgstr "" + +#: default/nodes.lua +msgid "Mese Block" +msgstr "" + +#: default/nodes.lua +msgid "Gold Ore" +msgstr "" + +#: default/nodes.lua +msgid "Gold Block" +msgstr "" + +#: default/nodes.lua +msgid "Diamond Ore" +msgstr "" + +#: default/nodes.lua +msgid "Diamond Block" +msgstr "" + +#: default/nodes.lua +msgid "Cactus" +msgstr "" + +#: default/nodes.lua +msgid "Large Cactus Seedling" +msgstr "" + +#: default/nodes.lua +msgid "Papyrus" +msgstr "" + +#: default/nodes.lua +msgid "Dry Shrub" +msgstr "" + +#: default/nodes.lua +msgid "Jungle Grass" +msgstr "" + +#: default/nodes.lua +msgid "Grass" +msgstr "" + +#: default/nodes.lua +msgid "Dry Grass" +msgstr "" + +#: default/nodes.lua +msgid "Fern" +msgstr "" + +#: default/nodes.lua +msgid "Marram Grass" +msgstr "" + +#: default/nodes.lua +msgid "Bush Stem" +msgstr "" + +#: default/nodes.lua +msgid "Bush Leaves" +msgstr "" + +#: default/nodes.lua +msgid "Bush Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Blueberry Bush Leaves with Berries" +msgstr "" + +#: default/nodes.lua +msgid "Blueberry Bush Leaves" +msgstr "" + +#: default/nodes.lua +msgid "Blueberry Bush Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Acacia Bush Stem" +msgstr "" + +#: default/nodes.lua +msgid "Acacia Bush Leaves" +msgstr "" + +#: default/nodes.lua +msgid "Acacia Bush Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Pine Bush Stem" +msgstr "" + +#: default/nodes.lua +msgid "Pine Bush Needles" +msgstr "" + +#: default/nodes.lua +msgid "Pine Bush Sapling" +msgstr "" + +#: default/nodes.lua +msgid "Kelp" +msgstr "" + +#: default/nodes.lua +msgid "Green Coral" +msgstr "" + +#: default/nodes.lua +msgid "Pink Coral" +msgstr "" + +#: default/nodes.lua +msgid "Cyan Coral" +msgstr "" + +#: default/nodes.lua +msgid "Brown Coral" +msgstr "" + +#: default/nodes.lua +msgid "Orange Coral" +msgstr "" + +#: default/nodes.lua +msgid "Coral Skeleton" +msgstr "" + +#: default/nodes.lua +msgid "Water Source" +msgstr "" + +#: default/nodes.lua +msgid "Flowing Water" +msgstr "" + +#: default/nodes.lua +msgid "River Water Source" +msgstr "" + +#: default/nodes.lua +msgid "Flowing River Water" +msgstr "" + +#: default/nodes.lua +msgid "Lava Source" +msgstr "" + +#: default/nodes.lua +msgid "Flowing Lava" +msgstr "" + +#: default/nodes.lua +msgid "Empty Bookshelf" +msgstr "" + +#: default/nodes.lua +msgid "Bookshelf (@1 written, @2 empty books)" +msgstr "" + +#: default/nodes.lua +msgid "Bookshelf" +msgstr "" + +#: default/nodes.lua +msgid "@1 Sign" +msgstr "" + +#: default/nodes.lua +msgid "Text too long" +msgstr "" + +#: default/nodes.lua +msgid "Wooden" +msgstr "" + +#: default/nodes.lua +msgid "Steel" +msgstr "" + +#: default/nodes.lua +msgid "Wooden Ladder" +msgstr "" + +#: default/nodes.lua +msgid "Steel Ladder" +msgstr "" + +#: default/nodes.lua +msgid "Apple Wood Fence" +msgstr "" + +#: default/nodes.lua +msgid "Acacia Wood Fence" +msgstr "" + +#: default/nodes.lua +msgid "Jungle Wood Fence" +msgstr "" + +#: default/nodes.lua +msgid "Pine Wood Fence" +msgstr "" + +#: default/nodes.lua +msgid "Aspen Wood Fence" +msgstr "" + +#: default/nodes.lua +msgid "Apple Wood Fence Rail" +msgstr "" + +#: default/nodes.lua +msgid "Acacia Wood Fence Rail" +msgstr "" + +#: default/nodes.lua +msgid "Jungle Wood Fence Rail" +msgstr "" + +#: default/nodes.lua +msgid "Pine Wood Fence Rail" +msgstr "" + +#: default/nodes.lua +msgid "Aspen Wood Fence Rail" +msgstr "" + +#: default/nodes.lua +msgid "Glass" +msgstr "" + +#: default/nodes.lua +msgid "Obsidian Glass" +msgstr "" + +#: default/nodes.lua +msgid "Brick Block" +msgstr "" + +#: default/nodes.lua +msgid "Mese Lamp" +msgstr "" + +#: default/nodes.lua +msgid "Mese Post Light" +msgstr "" + +#: default/nodes.lua +msgid "Cloud" +msgstr "" + +#: default/tools.lua +msgid "Wooden Pickaxe" +msgstr "" + +#: default/tools.lua +msgid "Stone Pickaxe" +msgstr "" + +#: default/tools.lua +msgid "Bronze Pickaxe" +msgstr "" + +#: default/tools.lua +msgid "Steel Pickaxe" +msgstr "" + +#: default/tools.lua +msgid "Mese Pickaxe" +msgstr "" + +#: default/tools.lua +msgid "Diamond Pickaxe" +msgstr "" + +#: default/tools.lua +msgid "Wooden Shovel" +msgstr "" + +#: default/tools.lua +msgid "Stone Shovel" +msgstr "" + +#: default/tools.lua +msgid "Bronze Shovel" +msgstr "" + +#: default/tools.lua +msgid "Steel Shovel" +msgstr "" + +#: default/tools.lua +msgid "Mese Shovel" +msgstr "" + +#: default/tools.lua +msgid "Diamond Shovel" +msgstr "" + +#: default/tools.lua +msgid "Wooden Axe" +msgstr "" + +#: default/tools.lua +msgid "Stone Axe" +msgstr "" + +#: default/tools.lua +msgid "Bronze Axe" +msgstr "" + +#: default/tools.lua +msgid "Steel Axe" +msgstr "" + +#: default/tools.lua +msgid "Mese Axe" +msgstr "" + +#: default/tools.lua +msgid "Diamond Axe" +msgstr "" + +#: default/tools.lua +msgid "Wooden Sword" +msgstr "" + +#: default/tools.lua +msgid "Stone Sword" +msgstr "" + +#: default/tools.lua +msgid "Bronze Sword" +msgstr "" + +#: default/tools.lua +msgid "Steel Sword" +msgstr "" + +#: default/tools.lua +msgid "Mese Sword" +msgstr "" + +#: default/tools.lua +msgid "Diamond Sword" +msgstr "" + +#: default/tools.lua +msgid "Key" +msgstr "" + +#: default/torch.lua +msgid "Torch" +msgstr "" + +#: default/trees.lua +msgid "@1 will intersect protection on growth." +msgstr "" + +#: doors/init.lua +msgid "Hidden Door Segment" +msgstr "" + +#: doors/init.lua +msgid "Owned by @1" +msgstr "" + +#: doors/init.lua +msgid "You do not own this locked door." +msgstr "" + +#: doors/init.lua +msgid "Wooden Door" +msgstr "" + +#: doors/init.lua +msgid "Steel Door" +msgstr "" + +#: doors/init.lua +msgid "Glass Door" +msgstr "" + +#: doors/init.lua +msgid "Obsidian Glass Door" +msgstr "" + +#: doors/init.lua +msgid "You do not own this trapdoor." +msgstr "" + +#: doors/init.lua +msgid "Wooden Trapdoor" +msgstr "" + +#: doors/init.lua +msgid "Steel Trapdoor" +msgstr "" + +#: doors/init.lua +msgid "Apple Wood Fence Gate" +msgstr "" + +#: doors/init.lua +msgid "Acacia Wood Fence Gate" +msgstr "" + +#: doors/init.lua +msgid "Jungle Wood Fence Gate" +msgstr "" + +#: doors/init.lua +msgid "Pine Wood Fence Gate" +msgstr "" + +#: doors/init.lua +msgid "Aspen Wood Fence Gate" +msgstr "" + +#: dye/init.lua wool/init.lua +msgid "Grey" +msgstr "" + +#: dye/init.lua +msgid "Dark grey" +msgstr "" + +#: dye/init.lua wool/init.lua +msgid "Black" +msgstr "" + +#: dye/init.lua wool/init.lua +msgid "Blue" +msgstr "" + +#: dye/init.lua wool/init.lua +msgid "Cyan" +msgstr "" + +#: dye/init.lua +msgid "Dark green" +msgstr "" + +#: dye/init.lua wool/init.lua +msgid "Green" +msgstr "" + +#: dye/init.lua wool/init.lua +msgid "Yellow" +msgstr "" + +#: dye/init.lua wool/init.lua +msgid "Brown" +msgstr "" + +#: dye/init.lua wool/init.lua +msgid "Orange" +msgstr "" + +#: dye/init.lua wool/init.lua +msgid "Magenta" +msgstr "" + +#: dye/init.lua wool/init.lua +msgid "Pink" +msgstr "" + +#: dye/init.lua +msgid "@1 Dye" +msgstr "" + +#: farming/api.lua +msgid "Hoe" +msgstr "" + +#: farming/api.lua +msgid "Seed" +msgstr "" + +#: farming/hoes.lua +msgid "Wooden Hoe" +msgstr "" + +#: farming/hoes.lua +msgid "Stone Hoe" +msgstr "" + +#: farming/hoes.lua +msgid "Steel Hoe" +msgstr "" + +#: farming/hoes.lua +msgid "Bronze Hoe" +msgstr "" + +#: farming/hoes.lua +msgid "Mese Hoe" +msgstr "" + +#: farming/hoes.lua +msgid "Diamond Hoe" +msgstr "" + +#: farming/init.lua +msgid "Wheat Seed" +msgstr "" + +#: farming/init.lua +msgid "Flour" +msgstr "" + +#: farming/init.lua +msgid "Bread" +msgstr "" + +#: farming/init.lua +msgid "Cotton Seed" +msgstr "" + +#: farming/init.lua +msgid "String" +msgstr "" + +#: farming/nodes.lua +msgid "Soil" +msgstr "" + +#: farming/nodes.lua +msgid "Wet Soil" +msgstr "" + +#: farming/nodes.lua +msgid "Desert Sand Soil" +msgstr "" + +#: farming/nodes.lua +msgid "Wet Desert Sand Soil" +msgstr "" + +#: farming/nodes.lua +msgid "Straw" +msgstr "" + +#: farming/nodes.lua +msgid "Straw Stair" +msgstr "" + +#: farming/nodes.lua +msgid "Straw Slab" +msgstr "" + +#: fire/init.lua +msgid "Permanent Flame" +msgstr "" + +#: fire/init.lua +msgid "Flint and Steel" +msgstr "" + +#: fireflies/init.lua +msgid "Firefly" +msgstr "" + +#: fireflies/init.lua +msgid "Hidden Firefly" +msgstr "" + +#: fireflies/init.lua +msgid "Bug Net" +msgstr "" + +#: fireflies/init.lua +msgid "Firefly in a Bottle" +msgstr "" + +#: flowers/init.lua +msgid "Red Rose" +msgstr "" + +#: flowers/init.lua +msgid "Orange Tulip" +msgstr "" + +#: flowers/init.lua +msgid "Yellow Dandelion" +msgstr "" + +#: flowers/init.lua +msgid "Green Chrysanthemum" +msgstr "" + +#: flowers/init.lua +msgid "Blue Geranium" +msgstr "" + +#: flowers/init.lua +msgid "Viola" +msgstr "" + +#: flowers/init.lua +msgid "White Dandelion" +msgstr "" + +#: flowers/init.lua +msgid "Black Tulip" +msgstr "" + +#: flowers/init.lua +msgid "Red Mushroom" +msgstr "" + +#: flowers/init.lua +msgid "Brown Mushroom" +msgstr "" + +#: flowers/init.lua +msgid "Waterlily" +msgstr "" + +#: game_commands/init.lua +msgid "Kill yourself to respawn" +msgstr "" + +#: game_commands/init.lua +msgid "No static_spawnpoint defined" +msgstr "" + +#: game_commands/init.lua +msgid "You need to be online to be killed!" +msgstr "" + +#: map/init.lua +msgid "" +"Mapping Kit\n" +"Use with 'Minimap' key" +msgstr "" + +#: screwdriver/init.lua +msgid "Screwdriver (left-click rotates face, right-click rotates axis)" +msgstr "" + +#: sethome/init.lua +msgid "Can use /sethome and /home" +msgstr "" + +#: sethome/init.lua +msgid "Teleport you to your home point" +msgstr "" + +#: sethome/init.lua +msgid "Teleported to home!" +msgstr "" + +#: sethome/init.lua +msgid "Set a home using /sethome" +msgstr "" + +#: sethome/init.lua +msgid "Set your home point" +msgstr "" + +#: sethome/init.lua +msgid "Home set!" +msgstr "" + +#: sethome/init.lua +msgid "Player not found!" +msgstr "" + +#: stairs/init.lua +msgid "Inner @1" +msgstr "" + +#: stairs/init.lua +msgid "Outer @1" +msgstr "" + +#: stairs/init.lua +msgid "Wooden Stair" +msgstr "" + +#: stairs/init.lua +msgid "Wooden Slab" +msgstr "" + +#: stairs/init.lua +msgid "Jungle Wood Stair" +msgstr "" + +#: stairs/init.lua +msgid "Jungle Wood Slab" +msgstr "" + +#: stairs/init.lua +msgid "Pine Wood Stair" +msgstr "" + +#: stairs/init.lua +msgid "Pine Wood Slab" +msgstr "" + +#: stairs/init.lua +msgid "Acacia Wood Stair" +msgstr "" + +#: stairs/init.lua +msgid "Acacia Wood Slab" +msgstr "" + +#: stairs/init.lua +msgid "Aspen Wood Stair" +msgstr "" + +#: stairs/init.lua +msgid "Aspen Wood Slab" +msgstr "" + +#: stairs/init.lua +msgid "Stone Stair" +msgstr "" + +#: stairs/init.lua +msgid "Stone Slab" +msgstr "" + +#: stairs/init.lua +msgid "Cobblestone Stair" +msgstr "" + +#: stairs/init.lua +msgid "Cobblestone Slab" +msgstr "" + +#: stairs/init.lua +msgid "Mossy Cobblestone Stair" +msgstr "" + +#: stairs/init.lua +msgid "Mossy Cobblestone Slab" +msgstr "" + +#: stairs/init.lua +msgid "Stone Brick Stair" +msgstr "" + +#: stairs/init.lua +msgid "Stone Brick Slab" +msgstr "" + +#: stairs/init.lua +msgid "Stone Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Stone Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Desert Stone Stair" +msgstr "" + +#: stairs/init.lua +msgid "Desert Stone Slab" +msgstr "" + +#: stairs/init.lua +msgid "Desert Cobblestone Stair" +msgstr "" + +#: stairs/init.lua +msgid "Desert Cobblestone Slab" +msgstr "" + +#: stairs/init.lua +msgid "Desert Stone Brick Stair" +msgstr "" + +#: stairs/init.lua +msgid "Desert Stone Brick Slab" +msgstr "" + +#: stairs/init.lua +msgid "Desert Stone Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Desert Stone Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Sandstone Stair" +msgstr "" + +#: stairs/init.lua +msgid "Sandstone Slab" +msgstr "" + +#: stairs/init.lua +msgid "Sandstone Brick Stair" +msgstr "" + +#: stairs/init.lua +msgid "Sandstone Brick Slab" +msgstr "" + +#: stairs/init.lua +msgid "Sandstone Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Sandstone Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Desert Sandstone Stair" +msgstr "" + +#: stairs/init.lua +msgid "Desert Sandstone Slab" +msgstr "" + +#: stairs/init.lua +msgid "Desert Sandstone Brick Stair" +msgstr "" + +#: stairs/init.lua +msgid "Desert Sandstone Brick Slab" +msgstr "" + +#: stairs/init.lua +msgid "Desert Sandstone Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Desert Sandstone Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Silver Sandstone Stair" +msgstr "" + +#: stairs/init.lua +msgid "Silver Sandstone Slab" +msgstr "" + +#: stairs/init.lua +msgid "Silver Sandstone Brick Stair" +msgstr "" + +#: stairs/init.lua +msgid "Silver Sandstone Brick Slab" +msgstr "" + +#: stairs/init.lua +msgid "Silver Sandstone Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Silver Sandstone Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Obsidian Stair" +msgstr "" + +#: stairs/init.lua +msgid "Obsidian Slab" +msgstr "" + +#: stairs/init.lua +msgid "Obsidian Brick Stair" +msgstr "" + +#: stairs/init.lua +msgid "Obsidian Brick Slab" +msgstr "" + +#: stairs/init.lua +msgid "Obsidian Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Obsidian Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Brick Stair" +msgstr "" + +#: stairs/init.lua +msgid "Brick Slab" +msgstr "" + +#: stairs/init.lua +msgid "Steel Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Steel Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Tin Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Tin Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Copper Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Copper Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Bronze Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Bronze Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Gold Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Gold Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Ice Stair" +msgstr "" + +#: stairs/init.lua +msgid "Ice Slab" +msgstr "" + +#: stairs/init.lua +msgid "Snow Block Stair" +msgstr "" + +#: stairs/init.lua +msgid "Snow Block Slab" +msgstr "" + +#: stairs/init.lua +msgid "Glass Stair" +msgstr "" + +#: stairs/init.lua +msgid "Glass Slab" +msgstr "" + +#: stairs/init.lua +msgid "Obsidian Glass Stair" +msgstr "" + +#: stairs/init.lua +msgid "Obsidian Glass Slab" +msgstr "" + +#: tnt/init.lua +msgid "Gun Powder" +msgstr "" + +#: tnt/init.lua +msgid "TNT Stick" +msgstr "" + +#: tnt/init.lua +msgid "TNT" +msgstr "" + +#: vessels/init.lua +msgid "Vessels Shelf" +msgstr "" + +#: vessels/init.lua +msgid "Empty Glass Bottle" +msgstr "" + +#: vessels/init.lua +msgid "Empty Drinking Glass" +msgstr "" + +#: vessels/init.lua +msgid "Empty Heavy Steel Bottle" +msgstr "" + +#: vessels/init.lua +msgid "Glass Fragments" +msgstr "" + +#: walls/init.lua +msgid "Cobblestone Wall" +msgstr "" + +#: walls/init.lua +msgid "Mossy Cobblestone Wall" +msgstr "" + +#: walls/init.lua +msgid "Desert Cobblestone Wall" +msgstr "" + +#: wool/init.lua +msgid "Dark Grey" +msgstr "" + +#: wool/init.lua +msgid "Dark Green" +msgstr "" + +#: wool/init.lua +msgid "@1 Wool" +msgstr "" + +#: xpanes/init.lua +msgid "Glass Pane" +msgstr "" + +#: xpanes/init.lua +msgid "Obsidian Glass Pane" +msgstr "" + +#: xpanes/init.lua +msgid "Steel Bars" +msgstr "" diff --git a/mods/game_intllib/tools/findtext.lua b/mods/game_intllib/tools/findtext.lua new file mode 100755 index 0000000..5a68977 --- /dev/null +++ b/mods/game_intllib/tools/findtext.lua @@ -0,0 +1,144 @@ +#! /usr/bin/env lua + +-- game_intllib/tools/findtext.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/mods/game_intllib/tools/updatetext.lua b/mods/game_intllib/tools/updatetext.lua new file mode 100755 index 0000000..3447fed --- /dev/null +++ b/mods/game_intllib/tools/updatetext.lua @@ -0,0 +1,133 @@ +#! /usr/bin/env lua + +-- game_intllib/tools/updatetext.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/mods/game_intllib/tools/xgettext.bat b/mods/game_intllib/tools/xgettext.bat new file mode 100755 index 0000000..feb7f94 --- /dev/null +++ b/mods/game_intllib/tools/xgettext.bat @@ -0,0 +1,35 @@ +@echo off +setlocal + +set me=%~n0 + +rem # -- game_intllib/tools/xgettext.bat + +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 game_intllib/locale/template.pot %* +%xgettext% --from-code=UTF-8 -kS -kNS:1,2 -k_ -o game_intllib/locale/template.pot %* +if %ERRORLEVEL% neq 0 goto done + +cd game_intllib/locale + +for %%f in (*.po) do ( + echo Updating %%f... 1>&2 + %msgmerge% --update %%f template.pot +) + +echo DONE! 1>&2 + +:done diff --git a/mods/game_intllib/tools/xgettext.sh b/mods/game_intllib/tools/xgettext.sh new file mode 100755 index 0000000..731581d --- /dev/null +++ b/mods/game_intllib/tools/xgettext.sh @@ -0,0 +1,30 @@ +#! /bin/bash + +# -- game_intllib/tools/xgettext.sh + +me=$(basename "${BASH_SOURCE[0]}"); + +if [[ $# -lt 1 ]]; then + echo "Usage: $me FILE..." >&2; + exit 1; +fi + +GLOCALE="./game_intllib/locale/" +mkdir -p ${GLOCALE}; +echo "Generating template in ${GLOCALE} folder..." >&2; +xgettext --from-code=UTF-8 \ + --keyword=S \ + --keyword=NS:1,2 \ + --keyword=N_ \ + --add-comments='Translators:' \ + --add-location=file \ + -o ${GLOCALE}template.pot \ + "$@" \ + || exit; + +find ${GLOCALE} -name '*.po' -type f | while read -r file; do + echo "Updating $file..." >&2; + msgmerge --update "$file" ${GLOCALE}template.pot; +done + +echo "DONE!" >&2; diff --git a/mods/map/depends.txt b/mods/map/depends.txt old mode 100644 new mode 100755 index 4b15f6a..c72b161 --- a/mods/map/depends.txt +++ b/mods/map/depends.txt @@ -1,3 +1,5 @@ default dye creative? +game_intllib? + diff --git a/mods/map/gintllib.lua b/mods/map/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/map/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/map/init.lua b/mods/map/init.lua old mode 100644 new mode 100755 index e769e77..12d4771 --- a/mods/map/init.lua +++ b/mods/map/init.lua @@ -3,6 +3,11 @@ map = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + -- Cache creative mode setting local creative_mode_cache = minetest.settings:get_bool("creative_mode") @@ -49,7 +54,7 @@ minetest.after(5.3, cyclic_update) -- Mapping kit item minetest.register_craftitem("map:mapping_kit", { - description = "Mapping Kit\nUse with 'Minimap' key", + description = S("Mapping Kit\nUse with 'Minimap' key"), inventory_image = "map_mapping_kit.png", stack_max = 1, groups = {flammable = 3}, @@ -65,7 +70,7 @@ minetest.register_craftitem("map:mapping_kit", { minetest.register_craft({ output = "map:mapping_kit", recipe = { - {"default:glass", "default:paper", "group:stick"}, + {"default:glass", "default:paper", "default:stick"}, {"default:steel_ingot", "default:paper", "default:steel_ingot"}, {"group:wood", "default:paper", "dye:black"}, } diff --git a/mods/screwdriver/depends.txt b/mods/screwdriver/depends.txt new file mode 100755 index 0000000..72538d8 --- /dev/null +++ b/mods/screwdriver/depends.txt @@ -0,0 +1 @@ +game_intllib? diff --git a/mods/screwdriver/gintllib.lua b/mods/screwdriver/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/screwdriver/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/screwdriver/init.lua b/mods/screwdriver/init.lua old mode 100644 new mode 100755 index 634edf8..bca7c41 --- a/mods/screwdriver/init.lua +++ b/mods/screwdriver/init.lua @@ -1,5 +1,10 @@ screwdriver = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + screwdriver.ROTATE_FACE = 1 screwdriver.ROTATE_AXIS = 2 screwdriver.disallow = function(pos, node, user, mode, new_param2) @@ -144,7 +149,7 @@ end -- Screwdriver minetest.register_tool("screwdriver:screwdriver", { - description = "Screwdriver (left-click rotates face, right-click rotates axis)", + description = S("Screwdriver (left-click rotates face, right-click rotates axis)"), inventory_image = "screwdriver.png", on_use = function(itemstack, user, pointed_thing) screwdriver.handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE, 200) diff --git a/mods/sethome/depends.txt b/mods/sethome/depends.txt new file mode 100755 index 0000000..09b10df --- /dev/null +++ b/mods/sethome/depends.txt @@ -0,0 +1,2 @@ +game_intllib? + diff --git a/mods/sethome/gintllib.lua b/mods/sethome/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/sethome/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/sethome/init.lua b/mods/sethome/init.lua old mode 100644 new mode 100755 index 4563381..6d3e343 --- a/mods/sethome/init.lua +++ b/mods/sethome/init.lua @@ -1,6 +1,11 @@ sethome = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + local homes_file = minetest.get_worldpath() .. "/homes" local homepos = {} @@ -68,30 +73,30 @@ sethome.go = function(name) end minetest.register_privilege("home", { - description = "Can use /sethome and /home", + description = S("Can use /sethome and /home"), give_to_singleplayer = false }) minetest.register_chatcommand("home", { - description = "Teleport you to your home point", + description = S("Teleport you to your home point"), privs = {home = true}, func = function(name) if sethome.go(name) then - return true, "Teleported to home!" + return true, S("Teleported to home!") end - return false, "Set a home using /sethome" + return false, S("Set a home using /sethome") end, }) minetest.register_chatcommand("sethome", { - description = "Set your home point", + description = S("Set your home point"), privs = {home = true}, func = function(name) name = name or "" -- fallback to blank name if nil local player = minetest.get_player_by_name(name) if player and sethome.set(name, player:get_pos()) then - return true, "Home set!" + return true, S("Home set!") end - return false, "Player not found!" + return false, S("Player not found!") end, }) diff --git a/mods/stairs/depends.txt b/mods/stairs/depends.txt old mode 100644 new mode 100755 index 4ad96d5..6ba4b42 --- a/mods/stairs/depends.txt +++ b/mods/stairs/depends.txt @@ -1 +1,2 @@ default +game_intllib? diff --git a/mods/stairs/gintllib.lua b/mods/stairs/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/stairs/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/stairs/init.lua b/mods/stairs/init.lua old mode 100644 new mode 100755 index e9f6dc1..d6a6c49 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -6,6 +6,10 @@ stairs = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + -- Register aliases for new pine node names @@ -308,7 +312,7 @@ function stairs.register_stair_inner(subname, recipeitem, groups, images, local new_groups = table.copy(groups) new_groups.stair = 1 minetest.register_node(":stairs:stair_inner_" .. subname, { - description = "Inner " .. description, + description = S("Inner @1", description), drawtype = "nodebox", tiles = stair_images, paramtype = "light", @@ -389,7 +393,7 @@ function stairs.register_stair_outer(subname, recipeitem, groups, images, local new_groups = table.copy(groups) new_groups.stair = 1 minetest.register_node(":stairs:stair_outer_" .. subname, { - description = "Outer " .. description, + description = S("Outer @1", description), drawtype = "nodebox", tiles = stair_images, paramtype = "light", @@ -462,8 +466,8 @@ stairs.register_stair_and_slab( "default:wood", {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, {"default_wood.png"}, - "Wooden Stair", - "Wooden Slab", + S("Wooden Stair"), + S("Wooden Slab"), default.node_sound_wood_defaults(), false ) @@ -473,8 +477,8 @@ stairs.register_stair_and_slab( "default:junglewood", {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, {"default_junglewood.png"}, - "Jungle Wood Stair", - "Jungle Wood Slab", + S("Jungle Wood Stair"), + S("Jungle Wood Slab"), default.node_sound_wood_defaults(), false ) @@ -484,8 +488,8 @@ stairs.register_stair_and_slab( "default:pine_wood", {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, {"default_pine_wood.png"}, - "Pine Wood Stair", - "Pine Wood Slab", + S("Pine Wood Stair"), + S("Pine Wood Slab"), default.node_sound_wood_defaults(), false ) @@ -495,8 +499,8 @@ stairs.register_stair_and_slab( "default:acacia_wood", {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, {"default_acacia_wood.png"}, - "Acacia Wood Stair", - "Acacia Wood Slab", + S("Acacia Wood Stair"), + S("Acacia Wood Slab"), default.node_sound_wood_defaults(), false ) @@ -506,8 +510,8 @@ stairs.register_stair_and_slab( "default:aspen_wood", {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, {"default_aspen_wood.png"}, - "Aspen Wood Stair", - "Aspen Wood Slab", + S("Aspen Wood Stair"), + S("Aspen Wood Slab"), default.node_sound_wood_defaults(), false ) @@ -517,8 +521,8 @@ stairs.register_stair_and_slab( "default:stone", {cracky = 3}, {"default_stone.png"}, - "Stone Stair", - "Stone Slab", + S("Stone Stair"), + S("Stone Slab"), default.node_sound_stone_defaults(), true ) @@ -528,8 +532,8 @@ stairs.register_stair_and_slab( "default:cobble", {cracky = 3}, {"default_cobble.png"}, - "Cobblestone Stair", - "Cobblestone Slab", + S("Cobblestone Stair"), + S("Cobblestone Slab"), default.node_sound_stone_defaults(), true ) @@ -539,8 +543,8 @@ stairs.register_stair_and_slab( "default:mossycobble", {cracky = 3}, {"default_mossycobble.png"}, - "Mossy Cobblestone Stair", - "Mossy Cobblestone Slab", + S("Mossy Cobblestone Stair"), + S("Mossy Cobblestone Slab"), default.node_sound_stone_defaults(), true ) @@ -550,8 +554,8 @@ stairs.register_stair_and_slab( "default:stonebrick", {cracky = 2}, {"default_stone_brick.png"}, - "Stone Brick Stair", - "Stone Brick Slab", + S("Stone Brick Stair"), + S("Stone Brick Slab"), default.node_sound_stone_defaults(), false ) @@ -561,8 +565,8 @@ stairs.register_stair_and_slab( "default:stone_block", {cracky = 2}, {"default_stone_block.png"}, - "Stone Block Stair", - "Stone Block Slab", + S("Stone Block Stair"), + S("Stone Block Slab"), default.node_sound_stone_defaults(), true ) @@ -572,8 +576,8 @@ stairs.register_stair_and_slab( "default:desert_stone", {cracky = 3}, {"default_desert_stone.png"}, - "Desert Stone Stair", - "Desert Stone Slab", + S("Desert Stone Stair"), + S("Desert Stone Slab"), default.node_sound_stone_defaults(), true ) @@ -583,8 +587,8 @@ stairs.register_stair_and_slab( "default:desert_cobble", {cracky = 3}, {"default_desert_cobble.png"}, - "Desert Cobblestone Stair", - "Desert Cobblestone Slab", + S("Desert Cobblestone Stair"), + S("Desert Cobblestone Slab"), default.node_sound_stone_defaults(), true ) @@ -594,8 +598,8 @@ stairs.register_stair_and_slab( "default:desert_stonebrick", {cracky = 2}, {"default_desert_stone_brick.png"}, - "Desert Stone Brick Stair", - "Desert Stone Brick Slab", + S("Desert Stone Brick Stair"), + S("Desert Stone Brick Slab"), default.node_sound_stone_defaults(), false ) @@ -605,8 +609,8 @@ stairs.register_stair_and_slab( "default:desert_stone_block", {cracky = 2}, {"default_desert_stone_block.png"}, - "Desert Stone Block Stair", - "Desert Stone Block Slab", + S("Desert Stone Block Stair"), + S("Desert Stone Block Slab"), default.node_sound_stone_defaults(), true ) @@ -616,8 +620,8 @@ stairs.register_stair_and_slab( "default:sandstone", {crumbly = 1, cracky = 3}, {"default_sandstone.png"}, - "Sandstone Stair", - "Sandstone Slab", + S("Sandstone Stair"), + S("Sandstone Slab"), default.node_sound_stone_defaults(), true ) @@ -627,8 +631,8 @@ stairs.register_stair_and_slab( "default:sandstonebrick", {cracky = 2}, {"default_sandstone_brick.png"}, - "Sandstone Brick Stair", - "Sandstone Brick Slab", + S("Sandstone Brick Stair"), + S("Sandstone Brick Slab"), default.node_sound_stone_defaults(), false ) @@ -638,8 +642,8 @@ stairs.register_stair_and_slab( "default:sandstone_block", {cracky = 2}, {"default_sandstone_block.png"}, - "Sandstone Block Stair", - "Sandstone Block Slab", + S("Sandstone Block Stair"), + S("Sandstone Block Slab"), default.node_sound_stone_defaults(), true ) @@ -649,8 +653,8 @@ stairs.register_stair_and_slab( "default:desert_sandstone", {crumbly = 1, cracky = 3}, {"default_desert_sandstone.png"}, - "Desert Sandstone Stair", - "Desert Sandstone Slab", + S("Desert Sandstone Stair"), + S("Desert Sandstone Slab"), default.node_sound_stone_defaults(), true ) @@ -660,8 +664,8 @@ stairs.register_stair_and_slab( "default:desert_sandstone_brick", {cracky = 2}, {"default_desert_sandstone_brick.png"}, - "Desert Sandstone Brick Stair", - "Desert Sandstone Brick Slab", + S("Desert Sandstone Brick Stair"), + S("Desert Sandstone Brick Slab"), default.node_sound_stone_defaults(), false ) @@ -671,8 +675,8 @@ stairs.register_stair_and_slab( "default:desert_sandstone_block", {cracky = 2}, {"default_desert_sandstone_block.png"}, - "Desert Sandstone Block Stair", - "Desert Sandstone Block Slab", + S("Desert Sandstone Block Stair"), + S("Desert Sandstone Block Slab"), default.node_sound_stone_defaults(), true ) @@ -682,8 +686,8 @@ stairs.register_stair_and_slab( "default:silver_sandstone", {crumbly = 1, cracky = 3}, {"default_silver_sandstone.png"}, - "Silver Sandstone Stair", - "Silver Sandstone Slab", + S("Silver Sandstone Stair"), + S("Silver Sandstone Slab"), default.node_sound_stone_defaults(), true ) @@ -693,8 +697,8 @@ stairs.register_stair_and_slab( "default:silver_sandstone_brick", {cracky = 2}, {"default_silver_sandstone_brick.png"}, - "Silver Sandstone Brick Stair", - "Silver Sandstone Brick Slab", + S("Silver Sandstone Brick Stair"), + S("Silver Sandstone Brick Slab"), default.node_sound_stone_defaults(), false ) @@ -704,8 +708,8 @@ stairs.register_stair_and_slab( "default:silver_sandstone_block", {cracky = 2}, {"default_silver_sandstone_block.png"}, - "Silver Sandstone Block Stair", - "Silver Sandstone Block Slab", + S("Silver Sandstone Block Stair"), + S("Silver Sandstone Block Slab"), default.node_sound_stone_defaults(), true ) @@ -715,8 +719,8 @@ stairs.register_stair_and_slab( "default:obsidian", {cracky = 1, level = 2}, {"default_obsidian.png"}, - "Obsidian Stair", - "Obsidian Slab", + S("Obsidian Stair"), + S("Obsidian Slab"), default.node_sound_stone_defaults(), true ) @@ -726,8 +730,8 @@ stairs.register_stair_and_slab( "default:obsidianbrick", {cracky = 1, level = 2}, {"default_obsidian_brick.png"}, - "Obsidian Brick Stair", - "Obsidian Brick Slab", + S("Obsidian Brick Stair"), + S("Obsidian Brick Slab"), default.node_sound_stone_defaults(), false ) @@ -737,8 +741,8 @@ stairs.register_stair_and_slab( "default:obsidian_block", {cracky = 1, level = 2}, {"default_obsidian_block.png"}, - "Obsidian Block Stair", - "Obsidian Block Slab", + S("Obsidian Block Stair"), + S("Obsidian Block Slab"), default.node_sound_stone_defaults(), true ) @@ -748,8 +752,8 @@ stairs.register_stair_and_slab( "default:brick", {cracky = 3}, {"default_brick.png"}, - "Brick Stair", - "Brick Slab", + S("Brick Stair"), + S("Brick Slab"), default.node_sound_stone_defaults(), false ) @@ -759,8 +763,8 @@ stairs.register_stair_and_slab( "default:steelblock", {cracky = 1, level = 2}, {"default_steel_block.png"}, - "Steel Block Stair", - "Steel Block Slab", + S("Steel Block Stair"), + S("Steel Block Slab"), default.node_sound_metal_defaults(), true ) @@ -770,8 +774,8 @@ stairs.register_stair_and_slab( "default:tinblock", {cracky = 1, level = 2}, {"default_tin_block.png"}, - "Tin Block Stair", - "Tin Block Slab", + S("Tin Block Stair"), + S("Tin Block Slab"), default.node_sound_metal_defaults(), true ) @@ -781,8 +785,8 @@ stairs.register_stair_and_slab( "default:copperblock", {cracky = 1, level = 2}, {"default_copper_block.png"}, - "Copper Block Stair", - "Copper Block Slab", + S("Copper Block Stair"), + S("Copper Block Slab"), default.node_sound_metal_defaults(), true ) @@ -792,8 +796,8 @@ stairs.register_stair_and_slab( "default:bronzeblock", {cracky = 1, level = 2}, {"default_bronze_block.png"}, - "Bronze Block Stair", - "Bronze Block Slab", + S("Bronze Block Stair"), + S("Bronze Block Slab"), default.node_sound_metal_defaults(), true ) @@ -803,8 +807,8 @@ stairs.register_stair_and_slab( "default:goldblock", {cracky = 1}, {"default_gold_block.png"}, - "Gold Block Stair", - "Gold Block Slab", + S("Gold Block Stair"), + S("Gold Block Slab"), default.node_sound_metal_defaults(), true ) @@ -814,8 +818,8 @@ stairs.register_stair_and_slab( "default:ice", {cracky = 3, cools_lava = 1, slippery = 3}, {"default_ice.png"}, - "Ice Stair", - "Ice Slab", + S("Ice Stair"), + S("Ice Slab"), default.node_sound_glass_defaults(), true ) @@ -825,8 +829,8 @@ stairs.register_stair_and_slab( "default:snowblock", {crumbly = 3, cools_lava = 1, snowy = 1}, {"default_snow.png"}, - "Snow Block Stair", - "Snow Block Slab", + S("Snow Block Stair"), + S("Snow Block Slab"), default.node_sound_snow_defaults(), true ) @@ -840,7 +844,7 @@ stairs.register_stair( {"stairs_glass_split.png", "default_glass.png", "stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png", "default_glass.png", "stairs_glass_split.png"}, - "Glass Stair", + S("Glass Stair"), default.node_sound_glass_defaults(), false ) @@ -850,7 +854,7 @@ stairs.register_slab( "default:glass", {cracky = 3}, {"default_glass.png", "default_glass.png", "stairs_glass_split.png"}, - "Glass Slab", + S("Glass Slab"), default.node_sound_glass_defaults(), false ) @@ -862,7 +866,7 @@ stairs.register_stair_inner( {"stairs_glass_stairside.png^[transformR270", "default_glass.png", "stairs_glass_stairside.png^[transformFX", "default_glass.png", "default_glass.png", "stairs_glass_stairside.png"}, - "Glass Stair", + S("Glass Stair"), default.node_sound_glass_defaults(), false ) @@ -874,7 +878,7 @@ stairs.register_stair_outer( {"stairs_glass_stairside.png^[transformR90", "default_glass.png", "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png", "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"}, - "Glass Stair", + S("Glass Stair"), default.node_sound_glass_defaults(), false ) @@ -886,7 +890,7 @@ stairs.register_stair( {"stairs_obsidian_glass_split.png", "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png^[transformFX", "stairs_obsidian_glass_stairside.png", "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"}, - "Obsidian Glass Stair", + S("Obsidian Glass Stair"), default.node_sound_glass_defaults(), false ) @@ -896,7 +900,7 @@ stairs.register_slab( "default:obsidian_glass", {cracky = 3}, {"default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"}, - "Obsidian Glass Slab", + S("Obsidian Glass Slab"), default.node_sound_glass_defaults(), false ) @@ -908,7 +912,7 @@ stairs.register_stair_inner( {"stairs_obsidian_glass_stairside.png^[transformR270", "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png^[transformFX", "default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png"}, - "Obsidian Glass Stair", + S("Obsidian Glass Stair"), default.node_sound_glass_defaults(), false ) @@ -920,7 +924,7 @@ stairs.register_stair_outer( {"stairs_obsidian_glass_stairside.png^[transformR90", "default_obsidian_glass.png", "stairs_obsidian_glass_outer_stairside.png", "stairs_obsidian_glass_stairside.png", "stairs_obsidian_glass_stairside.png^[transformR90","stairs_obsidian_glass_outer_stairside.png"}, - "Obsidian Glass Stair", + S("Obsidian Glass Stair"), default.node_sound_glass_defaults(), false ) diff --git a/mods/tnt/depends.txt b/mods/tnt/depends.txt old mode 100644 new mode 100755 index 5ff216f..ac20a27 --- a/mods/tnt/depends.txt +++ b/mods/tnt/depends.txt @@ -1,3 +1,3 @@ default fire - +game_intllib? diff --git a/mods/tnt/gintllib.lua b/mods/tnt/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/tnt/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/tnt/init.lua b/mods/tnt/init.lua old mode 100644 new mode 100755 index 3efc6ec..5a588cf --- a/mods/tnt/init.lua +++ b/mods/tnt/init.lua @@ -1,5 +1,10 @@ tnt = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + -- Default to enabled when in singleplayer local enable_tnt = minetest.settings:get_bool("enable_tnt") if enable_tnt == nil then @@ -422,7 +427,7 @@ minetest.register_node("tnt:boom", { }) minetest.register_node("tnt:gunpowder", { - description = "Gun Powder", + description = S("Gun Powder"), drawtype = "raillike", paramtype = "light", is_ground_content = false, @@ -547,7 +552,7 @@ minetest.register_craft({ }) minetest.register_craftitem("tnt:tnt_stick", { - description = "TNT Stick", + description = S("TNT Stick"), inventory_image = "tnt_tnt_stick.png", groups = {flammable = 5}, }) @@ -675,6 +680,6 @@ end tnt.register_tnt({ name = "tnt:tnt", - description = "TNT", + description = S("TNT"), radius = tnt_radius, }) diff --git a/mods/vessels/depends.txt b/mods/vessels/depends.txt old mode 100644 new mode 100755 index 4ad96d5..6ba4b42 --- a/mods/vessels/depends.txt +++ b/mods/vessels/depends.txt @@ -1 +1,2 @@ default +game_intllib? diff --git a/mods/vessels/gintllib.lua b/mods/vessels/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/vessels/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/vessels/init.lua b/mods/vessels/init.lua old mode 100644 new mode 100755 index e5c68a7..7213919 --- a/mods/vessels/init.lua +++ b/mods/vessels/init.lua @@ -1,6 +1,11 @@ -- Minetest 0.4 mod: vessels -- See README.txt for licensing and other information. +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + local vessels_shelf_formspec = "size[8,7;]" .. "list[context;vessels;0,0.3;8,2;]" .. @@ -30,7 +35,7 @@ local function get_vessels_shelf_formspec(inv) end minetest.register_node("vessels:shelf", { - description = "Vessels Shelf", + description = S("Vessels Shelf"), tiles = {"default_wood.png", "default_wood.png", "default_wood.png", "default_wood.png", "vessels_shelf.png", "vessels_shelf.png"}, paramtype2 = "facedir", @@ -91,7 +96,7 @@ minetest.register_craft({ }) minetest.register_node("vessels:glass_bottle", { - description = "Empty Glass Bottle", + description = S("Empty Glass Bottle"), drawtype = "plantlike", tiles = {"vessels_glass_bottle.png"}, inventory_image = "vessels_glass_bottle.png", @@ -117,7 +122,7 @@ minetest.register_craft( { }) minetest.register_node("vessels:drinking_glass", { - description = "Empty Drinking Glass", + description = S("Empty Drinking Glass"), drawtype = "plantlike", tiles = {"vessels_drinking_glass.png"}, inventory_image = "vessels_drinking_glass_inv.png", @@ -143,7 +148,7 @@ minetest.register_craft( { }) minetest.register_node("vessels:steel_bottle", { - description = "Empty Heavy Steel Bottle", + description = S("Empty Heavy Steel Bottle"), drawtype = "plantlike", tiles = {"vessels_steel_bottle.png"}, inventory_image = "vessels_steel_bottle.png", @@ -172,7 +177,7 @@ minetest.register_craft( { -- Glass and steel recycling minetest.register_craftitem("vessels:glass_fragments", { - description = "Glass Fragments", + description = S("Glass Fragments"), inventory_image = "vessels_glass_fragments.png", }) diff --git a/mods/walls/depends.txt b/mods/walls/depends.txt old mode 100644 new mode 100755 index 4ad96d5..eaeb762 --- a/mods/walls/depends.txt +++ b/mods/walls/depends.txt @@ -1 +1,3 @@ default +game_intllib? + diff --git a/mods/walls/gintllib.lua b/mods/walls/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/walls/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/walls/init.lua b/mods/walls/init.lua old mode 100644 new mode 100755 index 91a89cf..4510b5f --- a/mods/walls/init.lua +++ b/mods/walls/init.lua @@ -1,5 +1,10 @@ walls = {} +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + walls.register = function(wall_name, wall_desc, wall_texture_table, wall_mat, wall_sounds) --make wall_texture_table paramenter backwards compatible for mods passing single texture if type(wall_texture_table) ~= "table" then @@ -39,12 +44,12 @@ walls.register = function(wall_name, wall_desc, wall_texture_table, wall_mat, wa end -walls.register("walls:cobble", "Cobblestone Wall", {"default_cobble.png"}, +walls.register("walls:cobble", S("Cobblestone Wall"), {"default_cobble.png"}, "default:cobble", default.node_sound_stone_defaults()) -walls.register("walls:mossycobble", "Mossy Cobblestone Wall", {"default_mossycobble.png"}, +walls.register("walls:mossycobble", S("Mossy Cobblestone Wall"), {"default_mossycobble.png"}, "default:mossycobble", default.node_sound_stone_defaults()) -walls.register("walls:desertcobble", "Desert Cobblestone Wall", {"default_desert_cobble.png"}, +walls.register("walls:desertcobble", S("Desert Cobblestone Wall"), {"default_desert_cobble.png"}, "default:desert_cobble", default.node_sound_stone_defaults()) diff --git a/mods/wool/depends.txt b/mods/wool/depends.txt old mode 100644 new mode 100755 index 4ad96d5..6ba4b42 --- a/mods/wool/depends.txt +++ b/mods/wool/depends.txt @@ -1 +1,2 @@ default +game_intllib? diff --git a/mods/wool/gintllib.lua b/mods/wool/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/wool/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/wool/init.lua b/mods/wool/init.lua old mode 100644 new mode 100755 index 3e565a4..97a29b9 --- a/mods/wool/init.lua +++ b/mods/wool/init.lua @@ -1,26 +1,33 @@ +-- wool + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + + local dyes = { - {"white", "White"}, - {"grey", "Grey"}, - {"black", "Black"}, - {"red", "Red"}, - {"yellow", "Yellow"}, - {"green", "Green"}, - {"cyan", "Cyan"}, - {"blue", "Blue"}, - {"magenta", "Magenta"}, - {"orange", "Orange"}, - {"violet", "Violet"}, - {"brown", "Brown"}, - {"pink", "Pink"}, - {"dark_grey", "Dark Grey"}, - {"dark_green", "Dark Green"}, + {"white", S("White")}, + {"grey", S("Grey")}, + {"black", S("Black")}, + {"red", S("Red")}, + {"yellow", S("Yellow")}, + {"green", S("Green")}, + {"cyan", S("Cyan")}, + {"blue", S("Blue")}, + {"magenta", S("Magenta")}, + {"orange", S("Orange")}, + {"violet", S("Violet")}, + {"brown", S("Brown")}, + {"pink", S("Pink")}, + {"dark_grey", S("Dark Grey")}, + {"dark_green", S("Dark Green")}, } for i = 1, #dyes do local name, desc = unpack(dyes[i]) minetest.register_node("wool:" .. name, { - description = desc .. " Wool", + description = S("@1 Wool", desc), tiles = {"wool_" .. name .. ".png"}, is_ground_content = false, groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 3, diff --git a/mods/xpanes/depends.txt b/mods/xpanes/depends.txt old mode 100644 new mode 100755 index 331d858..6ba4b42 --- a/mods/xpanes/depends.txt +++ b/mods/xpanes/depends.txt @@ -1 +1,2 @@ -default \ No newline at end of file +default +game_intllib? diff --git a/mods/xpanes/gintllib.lua b/mods/xpanes/gintllib.lua new file mode 100755 index 0000000..444665c --- /dev/null +++ b/mods/xpanes/gintllib.lua @@ -0,0 +1,50 @@ +-- gintllib.lua +-- should be copied from ../game_intllib/lib/gintllib.lua (2019-05-12) + +-- Please note: This is for the default minetest_game mod tree only. +-- For external mods one should make use of the original inttlib mod +-- without interference to the game_intllib mod and it's functions. + +-- Fallback functions for when `game_intllib` is not installed. +-- Code released under ../gintllib/LICENSE.md [snoopy (Zweihorn)] + +-- Minetest Game Translation with 'game_intllib' (based on 'intllib') +-- Copyright (2019) The Minetest Core & Minetest Game Developers (LGPLv2.1+) + +-- Fallback to handle a S("string") enclosure if not installed. + +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 + +-- Hopefully, use make_gettext_pair from game_intllib if installed. + +if minetest.get_modpath("game_intllib") then + gettext, ngettext = gintllib.make_gettext_pair() +end + +-- Fill in missing functions if game_intllib is not installed. + +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/mods/xpanes/init.lua b/mods/xpanes/init.lua old mode 100644 new mode 100755 index 653c8cd..3bb4caf --- a/mods/xpanes/init.lua +++ b/mods/xpanes/init.lua @@ -1,3 +1,9 @@ +-- xpanes + +-- Load support for game_intllib. +local MP = minetest.get_modpath(minetest.get_current_modname()) +local S, NS = dofile(MP .. "/gintllib.lua") + local function is_pane(pos) return minetest.get_item_group(minetest.get_node(pos).name, "pane") > 0 @@ -148,7 +154,7 @@ function xpanes.register_pane(name, def) end xpanes.register_pane("pane", { - description = "Glass Pane", + description = S("Glass Pane"), textures = {"default_glass.png","xpanes_pane_half.png","xpanes_edge.png"}, inventory_image = "default_glass.png", wield_image = "default_glass.png", @@ -161,7 +167,7 @@ xpanes.register_pane("pane", { }) xpanes.register_pane("obsidian_pane", { - description = "Obsidian Glass Pane", + description = S("Obsidian Glass Pane"), textures = {"default_obsidian_glass.png","xpanes_pane_half.png","xpanes_edge_obsidian.png"}, inventory_image = "default_obsidian_glass.png", wield_image = "default_obsidian_glass.png", @@ -174,7 +180,7 @@ xpanes.register_pane("obsidian_pane", { }) xpanes.register_pane("bar", { - description = "Steel Bars", + description = S("Steel Bars"), textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_bar_top.png"}, inventory_image = "xpanes_bar.png", wield_image = "xpanes_bar.png",