From 950d6f640cae76d28253fadb7974a064017b104c Mon Sep 17 00:00:00 2001 From: orwell96 Date: Mon, 4 Sep 2023 19:34:47 +0200 Subject: Begin major rework of track registration system --- advtrains/signals.lua | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'advtrains/signals.lua') diff --git a/advtrains/signals.lua b/advtrains/signals.lua index b26c950..58d28a5 100644 --- a/advtrains/signals.lua +++ b/advtrains/signals.lua @@ -40,9 +40,6 @@ local suppasp = { for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", als="green"}}) do - advtrains.trackplacer.register_tracktype("advtrains:retrosignal", "") - advtrains.trackplacer.register_tracktype("advtrains:signal", "") - for rotid, rotation in ipairs({"", "_30", "_45", "_60"}) do local crea=1 if rotid==1 and r=="off" then crea=0 end @@ -108,8 +105,8 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", }, can_dig = can_dig_func, after_dig_node = after_dig_func, + --TODO add rotation using trackworker }) - advtrains.trackplacer.add_worked("advtrains:retrosignal", r, rotation, nil) minetest.register_node("advtrains:signal_"..r..rotation, { drawtype = "mesh", @@ -179,8 +176,8 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", }, can_dig = can_dig_func, after_dig_node = after_dig_func, + --TODO add rotation using trackworker }) - advtrains.trackplacer.add_worked("advtrains:signal", r, rotation, nil) end local crea=1 -- cgit v1.2.3 From f52653209aecb2310c1fb9598391c86113296f27 Mon Sep 17 00:00:00 2001 From: orwell Date: Fri, 24 May 2024 00:00:12 +0200 Subject: Fix working of the legacy signals under new system --- advtrains/passive.lua | 6 ++ advtrains/signals.lua | 111 ++++++++++++--------------------- advtrains_interlocking/database.lua | 2 +- advtrains_interlocking/demosignals.lua | 97 ---------------------------- advtrains_interlocking/init.lua | 1 - advtrains_interlocking/signal_api.lua | 15 +++-- 6 files changed, 55 insertions(+), 177 deletions(-) delete mode 100644 advtrains_interlocking/demosignals.lua (limited to 'advtrains/signals.lua') diff --git a/advtrains/passive.lua b/advtrains/passive.lua index 37b79e4..aad309e 100644 --- a/advtrains/passive.lua +++ b/advtrains/passive.lua @@ -70,6 +70,12 @@ function advtrains.setstate(parpos, newstate, pnode) end -- invalidate paths (only relevant if this is a track) advtrains.invalidate_all_paths(pos) + -- hack for old signals. Compatibility only, DO NOT USE for new signals! + if advtrains.interlocking and ndef.advtrains._is_passivenode_signal then + -- forcefully clears any set aspect, so that aspect system doesnt override it again + -- implicitly does an signal.notify_trains(pos) + advtrains.interlocking.signal.clear_aspect(pos) + end return true end diff --git a/advtrains/signals.lua b/advtrains/signals.lua index 58d28a5..0b874bf 100644 --- a/advtrains/signals.lua +++ b/advtrains/signals.lua @@ -5,13 +5,13 @@ local mrules_wallsignal = advtrains.meseconrules local function can_dig_func(pos) if advtrains.interlocking then - return advtrains.interlocking.signal_can_dig(pos) + return advtrains.interlocking.signal.can_dig(pos) end return true end local function after_dig_func(pos) if advtrains.interlocking then - return advtrains.interlocking.signal_after_dig(pos) + return advtrains.interlocking.signal.after_dig(pos) end return true end @@ -26,18 +26,20 @@ return { } end -local suppasp = { - main = {0, -1}, - dst = {false}, - shunt = nil, - proceed_as_main = true, - info = { - call_on = false, - dead_end = false, - w_speed = nil, - } +local main_aspects = { + { name = "free", description = "Free" } } +local function simple_apply_aspect(offname, onname) + return function(pos, node, main_aspect, rem_aspect, rem_aspinfo) + if main_aspect.halt then + advtrains.ndb.swap_node(pos, {name = offname, param2 = node.param2}) + else + advtrains.ndb.swap_node(pos, {name = onname, param2 = node.param2}) + end + end +end + for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", als="green"}}) do for rotid, rotation in ipairs({"", "_30", "_45", "_60"}) do @@ -71,7 +73,9 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", ["action_"..f.as] = function (pos, node) advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}, true) if advtrains.interlocking then - advtrains.interlocking.signal_on_aspect_changed(pos) + -- forcefully clears any set aspect, so that aspect system doesnt override it again + -- implicitly does an signal.notify_trains(pos) + advtrains.interlocking.signal.clear_aspect(pos) end end }}, @@ -85,23 +89,17 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", elseif advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}, true) if advtrains.interlocking then - advtrains.interlocking.signal_on_aspect_changed(pos) + -- forcefully clears any set aspect, so that aspect system doesnt override it again + -- implicitly does an signal.notify_trains(pos) + advtrains.interlocking.signal.clear_aspect(pos) end end end, - -- new signal API + -- very new signal API advtrains = { - set_aspect = function(pos, node, asp) - if asp.main ~= 0 then - advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_on"..rotation, param2 = node.param2}, true) - else - advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_off"..rotation, param2 = node.param2}, true) - end - end, - get_aspect = function(pos, node) - return aspect(r=="on") - end, - supported_aspects = suppasp, + main_aspects = main_aspects, + apply_aspect = simple_apply_aspect("advtrains:retrosignal_off"..rotation, "advtrains:retrosignal_on"..rotation), + get_aspect_info = function() return aspect(r=="on") end, }, can_dig = can_dig_func, after_dig_node = after_dig_func, @@ -136,7 +134,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", ["action_"..f.as] = function (pos, node) advtrains.setstate(pos, f.als, node) if advtrains.interlocking then - advtrains.interlocking.signal_on_aspect_changed(pos) + advtrains.interlocking.signal.notify_on_aspect_changed(pos) end end }}, @@ -149,30 +147,16 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", advtrains.interlocking.show_ip_form(pos, pname) elseif advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then advtrains.setstate(pos, f.als, node) - if advtrains.interlocking then - advtrains.interlocking.signal_on_aspect_changed(pos) - end end end, - -- new signal API + -- very new signal API advtrains = { - set_aspect = function(pos, node, asp) - if asp.main ~= 0 then - advtrains.ndb.swap_node(pos, {name = "advtrains:signal_on"..rotation, param2 = node.param2}, true) - else - advtrains.ndb.swap_node(pos, {name = "advtrains:signal_off"..rotation, param2 = node.param2}, true) - end - end, - get_aspect = function(pos, node) - return aspect(r=="on") - end, - supported_aspects = suppasp, - getstate = f.ls, - setstate = function(pos, node, newstate) - if newstate == f.als then - advtrains.ndb.swap_node(pos, {name = "advtrains:signal_"..f.as..rotation, param2 = node.param2}, true) - end - end, + main_aspects = main_aspects, + apply_aspect = simple_apply_aspect("advtrains:signal_off"..rotation, "advtrains:signal_on"..rotation), + get_aspect_info = function() return aspect(r=="on") end, + node_state = f.ls, + node_state_map = { red = "advtrains:signal_off"..rotation, green = "advtrains:signal_on"..rotation}, + _is_passivenode_signal = true }, can_dig = can_dig_func, after_dig_node = after_dig_func, @@ -211,9 +195,6 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", rules = mrules_wallsignal, ["action_"..f.as] = function (pos, node) advtrains.setstate(pos, f.als, node) - if advtrains.interlocking then - advtrains.interlocking.signal_on_aspect_changed(pos) - end end }}, on_rightclick=function(pos, node, player) @@ -225,30 +206,16 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", advtrains.interlocking.show_ip_form(pos, pname) elseif advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then advtrains.setstate(pos, f.als, node) - if advtrains.interlocking then - advtrains.interlocking.signal_on_aspect_changed(pos) - end end end, - -- new signal API + -- very new signal API advtrains = { - set_aspect = function(pos, node, asp) - if asp.main ~= 0 then - advtrains.ndb.swap_node(pos, {name = "advtrains:signal_wall_"..loc.."_on", param2 = node.param2}, true) - else - advtrains.ndb.swap_node(pos, {name = "advtrains:signal_wall_"..loc.."_off", param2 = node.param2}, true) - end - end, - get_aspect = function(pos, node) - return aspect(r=="on") - end, - supported_aspects = suppasp, - getstate = f.ls, - setstate = function(pos, node, newstate) - if newstate == f.als then - advtrains.ndb.swap_node(pos, {name = "advtrains:signal_wall_"..loc.."_"..f.as, param2 = node.param2}, true) - end - end, + main_aspects = main_aspects, + apply_aspect = simple_apply_aspect("advtrains:signal_wall_"..loc.."_off", "advtrains:signal_wall_"..loc.."_on"), + get_aspect_info = function() return aspect(r=="on") end, + node_state = f.ls, + node_state_map = { red = "advtrains:signal_wall_"..loc.."_off", green = "advtrains:signal_wall_"..loc.."_on" }, + _is_passivenode_signal = true }, can_dig = can_dig_func, after_dig_node = after_dig_func, diff --git a/advtrains_interlocking/database.lua b/advtrains_interlocking/database.lua index e2df547..49ca13d 100644 --- a/advtrains_interlocking/database.lua +++ b/advtrains_interlocking/database.lua @@ -1006,7 +1006,7 @@ end function ildb.get_ip_signal_asp(pts, connid) local p = ildb.get_ip_signal(pts, connid) if p then - local asp = advtrains.interlocking.signal.get_aspect(p) + local asp = advtrains.interlocking.signal.get_aspect_info(p) if not asp then atlog("Clearing orphaned signal influence point", pts, "/", connid) ildb.clear_ip_signal(pts, connid) diff --git a/advtrains_interlocking/demosignals.lua b/advtrains_interlocking/demosignals.lua deleted file mode 100644 index de6926a..0000000 --- a/advtrains_interlocking/demosignals.lua +++ /dev/null @@ -1,97 +0,0 @@ --- Demonstration signals --- Those can display the 3 main aspects of Ks signals - --- Note that the group value of advtrains_signal is 2, which means "step 2 of signal capabilities" --- advtrains_signal=1 is meant for signals that do not implement set_aspect. - - -local setaspect = function(pos, node, asp) - if asp.main == 0 then - advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_danger"}) - else - if asp.dst ~= 0 and asp.main == -1 then - advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_free"}) - else - advtrains.ndb.swap_node(pos, {name="advtrains_interlocking:ds_slow"}) - end - end - local meta = minetest.get_meta(pos) - if meta then - meta:set_string("infotext", minetest.serialize(asp)) - end -end - -local suppasp = { - main = {0, 6, -1}, - dst = {0, false}, - shunt = false, - proceed_as_main = true, - info = { - call_on = false, - dead_end = false, - w_speed = nil, - } -} - -minetest.register_node("advtrains_interlocking:ds_danger", { - description = "Demo signal at Danger", - tiles = {"at_il_signal_asp_danger.png"}, - groups = { - cracky = 3, - advtrains_signal = 2, - save_in_at_nodedb = 1, - }, - advtrains = { - set_aspect = setaspect, - supported_aspects = suppasp, - get_aspect = function(pos, node) - return advtrains.interlocking.DANGER - end, - }, - on_rightclick = advtrains.interlocking.signal_rc_handler, - can_dig = advtrains.interlocking.signal_can_dig, - after_destruct = advtrains.interlocking.signal_after_dig, -}) -minetest.register_node("advtrains_interlocking:ds_free", { - description = "Demo signal at Free", - tiles = {"at_il_signal_asp_free.png"}, - groups = { - cracky = 3, - advtrains_signal = 2, - save_in_at_nodedb = 1, - }, - advtrains = { - set_aspect = setaspect, - supported_aspects = suppasp, - get_aspect = function(pos, node) - return { - main = -1, - } - end, - }, - on_rightclick = advtrains.interlocking.signal_rc_handler, - can_dig = advtrains.interlocking.signal_can_dig, - after_destruct = advtrains.interlocking.signal_after_dig, -}) -minetest.register_node("advtrains_interlocking:ds_slow", { - description = "Demo signal at Slow", - tiles = {"at_il_signal_asp_slow.png"}, - groups = { - cracky = 3, - advtrains_signal = 2, - save_in_at_nodedb = 1, - }, - advtrains = { - set_aspect = setaspect, - supported_aspects = suppasp, - get_aspect = function(pos, node) - return { - main = 6, - } - end, - }, - on_rightclick = advtrains.interlocking.signal_rc_handler, - can_dig = advtrains.interlocking.signal_can_dig, - after_destruct = advtrains.interlocking.signal_after_dig, -}) - diff --git a/advtrains_interlocking/init.lua b/advtrains_interlocking/init.lua index c397aa6..a4ddbad 100644 --- a/advtrains_interlocking/init.lua +++ b/advtrains_interlocking/init.lua @@ -17,7 +17,6 @@ local modpath = minetest.get_modpath(minetest.get_current_modname()) .. DIR_DELI dofile(modpath.."database.lua") dofile(modpath.."signal_api.lua") dofile(modpath.."signal_aspect_ui.lua") -dofile(modpath.."demosignals.lua") dofile(modpath.."train_sections.lua") dofile(modpath.."route_prog.lua") dofile(modpath.."routesetting.lua") diff --git a/advtrains_interlocking/signal_api.lua b/advtrains_interlocking/signal_api.lua index 7826d30..6f52816 100644 --- a/advtrains_interlocking/signal_api.lua +++ b/advtrains_interlocking/signal_api.lua @@ -272,14 +272,14 @@ local function cache_mainaspects(ndefat) end function signal.get_aspect_internal(pos, aspt) - if not aspt then - -- oh, no main aspect, nevermind - return signal.MASP_HALT, nil, nil - end atdebug("get_aspect_internal",pos,aspt) -- look aspect in nodedef local node = advtrains.ndb.get_node_or_nil(pos) local ndef = node and minetest.registered_nodes[node.name] + if not aspt then + -- oh, no main aspect, nevermind + return signal.MASP_HALT, nil, node, ndef + end local ndefat = ndef and ndef.advtrains if ndefat and ndefat.apply_aspect then -- only if signal defines main aspect and its set in aspt @@ -318,7 +318,9 @@ function signal.get_aspect_info(pos) local masp, remote, node, ndef = signal.get_aspect_internal(pos, aspt) -- call into ndef if ndef.advtrains and ndef.advtrains.get_aspect_info then - return ndef.advtrains.get_aspect_info(pos, masp) + local ai = ndef.advtrains.get_aspect_info(pos, masp) + atdebug(pos,"aspectinfo",ai) + return ai end end @@ -333,11 +335,12 @@ function signal.reapply_aspect(pts) -- get aspt local aspt = signal.aspects[pts] atdebug("reapply_aspect",advtrains.decode_pos(pts),"aspt",aspt) + local pos = advtrains.decode_pos(pts) if not aspt then + signal.notify_trains(pos) return -- oop, nothing to do end -- resolve mainaspect table by name - local pos = advtrains.decode_pos(pts) local masp, remote, node, ndef = signal.get_aspect_internal(pos, aspt) -- if we have remote, resolve remote local rem_masp, rem_aspi -- cgit v1.2.3 From 72cae1327527672afe2bbb47662d42a44f086942 Mon Sep 17 00:00:00 2001 From: orwell Date: Tue, 11 Jun 2024 22:30:40 +0200 Subject: Fix more setstate stuff with new API (compat legacy) --- advtrains/p_mesecon_iface.lua | 24 ++++++++---------- advtrains/passive.lua | 6 ----- advtrains/signals.lua | 47 +++++++++++++++++++---------------- advtrains_interlocking/signal_api.lua | 15 +++++++++++ advtrains_signals_japan/init.lua | 6 ++--- 5 files changed, 54 insertions(+), 44 deletions(-) (limited to 'advtrains/signals.lua') diff --git a/advtrains/p_mesecon_iface.lua b/advtrains/p_mesecon_iface.lua index 33fcecd..0b99891 100644 --- a/advtrains/p_mesecon_iface.lua +++ b/advtrains/p_mesecon_iface.lua @@ -14,13 +14,11 @@ minetest.override_item("mesecons_switch:mesecon_switch_off", { minetest.sound_play("mesecons_switch", {pos=pos}) end, advtrains = { - getstate = "off", - setstate = function(pos, node, newstate) - if newstate=="on" then - advtrains.ndb.swap_node(pos, {name="mesecons_switch:mesecon_switch_on", param2=node.param2}) - if advtrains.is_node_loaded(pos) then - mesecon.receptor_on(pos) - end + node_state = "off", + node_state_map = { on = "mesecons_switch:mesecon_switch_on", off = "mesecons_switch:mesecon_switch_off" }, + node_on_switch_state = function(pos, new_node, old_state, new_state) + if advtrains.is_node_loaded(pos) then + mesecon.receptor_on(pos) end end, on_updated_from_nodedb = function(pos, node) @@ -41,13 +39,11 @@ minetest.override_item("mesecons_switch:mesecon_switch_on", { minetest.sound_play("mesecons_switch", {pos=pos}) end, advtrains = { - getstate = "on", - setstate = function(pos, node, newstate) - if newstate=="off" then - advtrains.ndb.swap_node(pos, {name="mesecons_switch:mesecon_switch_off", param2=node.param2}) - if advtrains.is_node_loaded(pos) then - mesecon.receptor_off(pos) - end + node_state = "on", + node_state_map = { on = "mesecons_switch:mesecon_switch_on", off = "mesecons_switch:mesecon_switch_off" }, + node_on_switch_state = function(pos, new_node, old_state, new_state) + if advtrains.is_node_loaded(pos) then + mesecon.receptor_off(pos) end end, fallback_state = "off", diff --git a/advtrains/passive.lua b/advtrains/passive.lua index aad309e..37b79e4 100644 --- a/advtrains/passive.lua +++ b/advtrains/passive.lua @@ -70,12 +70,6 @@ function advtrains.setstate(parpos, newstate, pnode) end -- invalidate paths (only relevant if this is a track) advtrains.invalidate_all_paths(pos) - -- hack for old signals. Compatibility only, DO NOT USE for new signals! - if advtrains.interlocking and ndef.advtrains._is_passivenode_signal then - -- forcefully clears any set aspect, so that aspect system doesnt override it again - -- implicitly does an signal.notify_trains(pos) - advtrains.interlocking.signal.clear_aspect(pos) - end return true end diff --git a/advtrains/signals.lua b/advtrains/signals.lua index 0b874bf..3f736c9 100644 --- a/advtrains/signals.lua +++ b/advtrains/signals.lua @@ -74,8 +74,9 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}, true) if advtrains.interlocking then -- forcefully clears any set aspect, so that aspect system doesnt override it again - -- implicitly does an signal.notify_trains(pos) - advtrains.interlocking.signal.clear_aspect(pos) + advtrains.interlocking.signal.unregister_aspect(pos) + -- notify trains + advtrains.interlocking.signal.notify_trains(pos) end end }}, @@ -90,8 +91,9 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", advtrains.ndb.swap_node(pos, {name = "advtrains:retrosignal_"..f.as..rotation, param2 = node.param2}, true) if advtrains.interlocking then -- forcefully clears any set aspect, so that aspect system doesnt override it again - -- implicitly does an signal.notify_trains(pos) - advtrains.interlocking.signal.clear_aspect(pos) + advtrains.interlocking.signal.unregister_aspect(pos) + -- notify trains + advtrains.interlocking.signal.notify_trains(pos) end end end, @@ -133,9 +135,6 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", rules=advtrains.meseconrules, ["action_"..f.as] = function (pos, node) advtrains.setstate(pos, f.als, node) - if advtrains.interlocking then - advtrains.interlocking.signal.notify_on_aspect_changed(pos) - end end }}, on_rightclick=function(pos, node, player) @@ -156,7 +155,14 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", get_aspect_info = function() return aspect(r=="on") end, node_state = f.ls, node_state_map = { red = "advtrains:signal_off"..rotation, green = "advtrains:signal_on"..rotation}, - _is_passivenode_signal = true + node_on_switch_state = function(pos, new_node, old_state, new_state) + if advtrains.interlocking then + -- forcefully clears any set aspect, so that aspect system doesnt override it again + advtrains.interlocking.signal.unregister_aspect(pos) + -- notify trains + advtrains.interlocking.signal.notify_trains(pos) + end + end, }, can_dig = can_dig_func, after_dig_node = after_dig_func, @@ -215,7 +221,14 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", get_aspect_info = function() return aspect(r=="on") end, node_state = f.ls, node_state_map = { red = "advtrains:signal_wall_"..loc.."_off", green = "advtrains:signal_wall_"..loc.."_on" }, - _is_passivenode_signal = true + node_on_switch_state = function(pos, new_node, old_state, new_state) + if advtrains.interlocking then + -- forcefully clears any set aspect, so that aspect system doesnt override it again + advtrains.interlocking.signal.unregister_aspect(pos) + -- notify trains + advtrains.interlocking.signal.notify_trains(pos) + end + end, }, can_dig = can_dig_func, after_dig_node = after_dig_func, @@ -253,12 +266,8 @@ minetest.register_node("advtrains:across_off", { end }}, advtrains = { - getstate = "off", - setstate = function(pos, node, newstate) - if newstate == "on" then - advtrains.ndb.swap_node(pos, {name = "advtrains:across_on", param2 = node.param2}, true) - end - end, + node_state = "off", + node_state_map = { on = "advtrains:across_on", off = "advtrains:across_off" }, }, on_rightclick=function(pos, node, player) if advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then @@ -294,12 +303,8 @@ minetest.register_node("advtrains:across_on", { end }}, advtrains = { - getstate = "on", - setstate = function(pos, node, newstate) - if newstate == "off" then - advtrains.ndb.swap_node(pos, {name = "advtrains:across_off", param2 = node.param2}, true) - end - end, + node_state = "on", + node_state_map = { on = "advtrains:across_on", off = "advtrains:across_off" }, fallback_state = "off", }, on_rightclick=function(pos, node, player) diff --git a/advtrains_interlocking/signal_api.lua b/advtrains_interlocking/signal_api.lua index a300ab1..b1e8b20 100644 --- a/advtrains_interlocking/signal_api.lua +++ b/advtrains_interlocking/signal_api.lua @@ -211,6 +211,21 @@ function signal.clear_aspect(pos, skip_dst_notify) end end +-- Clear any info about aspects from this signal, without resetting/reapplying the aspect. +-- Supposed to be used for legacy on-off signals when the on-off toggle is used +function signal.unregister_aspect(pos) + local main_pts = advtrains.encode_pos(pos) + local old_tbl = signal.aspects[main_pts] + local old_remote = old_tbl and old_tbl.remote + + -- unregister from old remote + if old_remote then + signal.distant_refs[old_remote][main_pts] = nil + end + + signal.aspects[main_pts] = nil +end + -- Notify distant signals of main_pts of a change in the aspect of this signal -- function signal.notify_distants_of(main_pts, limit) diff --git a/advtrains_signals_japan/init.lua b/advtrains_signals_japan/init.lua index d7cf035..fc33e63 100644 --- a/advtrains_signals_japan/init.lua +++ b/advtrains_signals_japan/init.lua @@ -447,9 +447,9 @@ for _, rtab in ipairs { end, ]] }, - on_rightclick = advtrains.interlocking.signal_rc_handler, - can_dig = advtrains.interlocking.signal_can_dig, - after_dig_node = advtrains.interlocking.signal_after_dig, + on_rightclick = advtrains.interlocking.signal.on_rightclick, + can_dig = advtrains.interlocking.signal.can_dig, + after_dig_node = advtrains.interlocking.signal.after_dig, }) --advtrains.trackplacer.add_worked("advtrains_signals_japan:"..sigtype, asp, "_"..rot) end -- cgit v1.2.3 From bed66e0f901ae9f8e21675035f174292120fea4f Mon Sep 17 00:00:00 2001 From: ywang Date: Sat, 27 Mar 2021 14:13:53 +0100 Subject: Rework translation system to use PO files The French translations are provided by Tanavit. Unfortunately I was not able to keep this addition as a separate commit as the translation file was originally added as a .tr file that I then converted to .po file in the meantime. Also note that this commit is created from squashing 20+ commits from the l10n branch that preceded the transition to PO files. In addition to changes to the locale files (which were all included in the single commit for transitioning to PO files), these commits also included code that has now become obsolete for l10n work. In particular, it included a GUI program written in Tcl to edit .tr files; this program can now be found in the following repo: https://codeberg.org/y5nw/mt_tr_editor Co-authored-by: Tanavit --- .gitignore | 1 + advtrains/copytool.lua | 16 +- advtrains/couple.lua | 4 +- advtrains/init.lua | 5 +- advtrains/locale/README.md | 69 ++++ advtrains/locale/advtrains.de.tr | 169 +++++++--- advtrains/locale/advtrains.fr.tr | 146 +++++++++ advtrains/locale/advtrains.zh_CN.tr | 135 +++++--- advtrains/locale/advtrains.zh_TW.tr | 146 +++++++++ advtrains/locale/gui | 638 ++++++++++++++++++++++++++++++++++++ advtrains/locale/template.txt | 146 +++++++++ advtrains/locale/topo.sh | 4 + advtrains/po/de.po | 580 ++++++++++++++++++++++++++++++++ advtrains/po/fr.po | 579 ++++++++++++++++++++++++++++++++ advtrains/po/template.pot | 505 ++++++++++++++++++++++++++++ advtrains/po/update-translations.sh | 24 ++ advtrains/po/zh_CN.po | 560 +++++++++++++++++++++++++++++++ advtrains/po/zh_TW.po | 560 +++++++++++++++++++++++++++++++ advtrains/protection.lua | 6 +- advtrains/signals.lua | 13 +- 20 files changed, 4194 insertions(+), 112 deletions(-) create mode 100644 advtrains/locale/README.md create mode 100644 advtrains/locale/advtrains.fr.tr create mode 100644 advtrains/locale/advtrains.zh_TW.tr create mode 100755 advtrains/locale/gui create mode 100644 advtrains/locale/template.txt create mode 100755 advtrains/locale/topo.sh create mode 100644 advtrains/po/de.po create mode 100644 advtrains/po/fr.po create mode 100644 advtrains/po/template.pot create mode 100755 advtrains/po/update-translations.sh create mode 100644 advtrains/po/zh_CN.po create mode 100644 advtrains/po/zh_TW.po (limited to 'advtrains/signals.lua') diff --git a/.gitignore b/.gitignore index b3180de..2920966 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ ## Eclipse project files & directories .project .settings +*~ diff --git a/advtrains/copytool.lua b/advtrains/copytool.lua index 0c1cdfe..7ad4330 100644 --- a/advtrains/copytool.lua +++ b/advtrains/copytool.lua @@ -26,7 +26,7 @@ minetest.register_tool("advtrains:copytool", { return itemstack end if not minetest.check_player_privs(placer, {train_operator = true }) then - minetest.chat_send_player(pname, "You don't have the train_operator privilege.") + minetest.chat_send_player(pname, S("You do not have the @1 privilege.", "train_operator")) return itemstack end if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pointed_thing.under, placer:get_player_name()) then @@ -38,7 +38,7 @@ minetest.register_tool("advtrains:copytool", { local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, {default=true}) if not prevpos then - minetest.chat_send_player(pname, "The track you are trying to place the wagon on is not long enough!") + minetest.chat_send_player(pname, attrans("The track you are trying to place the wagon on is not long enough!")) return end @@ -49,12 +49,12 @@ minetest.register_tool("advtrains:copytool", { end local clipboard = meta:get_string("clipboard") if (clipboard == "") then - minetest.chat_send_player(pname, "The clipboard is empty."); + minetest.chat_send_player(pname, attrans("The clipboard is empty.")); return end clipboard = minetest.deserialize(clipboard) if (clipboard.wagons == nil) then - minetest.chat_send_player(pname, "The clipboard is empty."); + minetest.chat_send_player(pname, attrans("The clipboard is empty.")); return end @@ -71,7 +71,7 @@ minetest.register_tool("advtrains:copytool", { local train = advtrains.trains[id] train.off_track = train.end_index= 0} { + if {$line eq ""} { + lappend translationTemplate $line + } elseif {[string match {#*} $line]} { + lappend translationTemplate $line + } elseif {[regexp {^(.+[^@])=.+$} $line x str]} { + lappend translationTemplate $str + } + } + close $handle +} + +proc readTranslationFiles {} { + global translationData translationLangs + array set translationData [list] + set translationLangs [list] + foreach fn [translationFilePaths] { + if {[regexp {\.([^.]+)\.tr$} $fn x lang]} { + set handle [open $fn "r"] + fconfigure $handle -translation lf + while {[gets $handle line] >= 0} { + if {[regexp {^([^#].+[^@])=(.+)$} $line x ori tr]} { + set translationData($lang,$ori) $tr + } + } + lappend translationLangs $lang + close $handle + } + } + set translationLangs [lsort $translationLangs] +} + +proc readTranslations {} { + readTranslationTemplate + readTranslationFiles +} + +proc writeTranslationTemplate {} { + global translationTemplate translationTemplatePath + set handle [open $translationTemplatePath "w"] + fconfigure $handle -translation lf + foreach line $translationTemplate { + if {$line eq ""} { + puts $handle "" + } elseif {[string match {#*} $line]} { + puts $handle $line + } else { + puts $handle "$line=$line" + } + } + close $handle +} + +proc writeTranslationFiles {} { + global translationDir translationDomain translationData translationLangs translationTemplate + foreach lang $translationLangs { + set handle [open [file join $translationDir "$translationDomain.$lang.tr"] "w"] + fconfigure $handle -translation lf + foreach i $translationTemplate { + if {$i eq ""} { + puts $handle "" + } elseif {[string match {#*} $i]} { + puts $handle $i + } else { + puts $handle [format "%s=%s" $i [getTranslationString $lang $i]] + } + } + close $handle + } +} + +proc writeTranslations {} { + writeTranslationTemplate + writeTranslationFiles +} + +proc hasTranslationString {lang str} { + return [expr {[getTranslationString $lang $str] ne $str}] +} + +proc maybeGetTranslationString {lang str} { + set tr [getTranslationString $lang $str] + if {$tr eq $str} { + return {} + } else { + return $tr + } +} + +proc getTranslationString {lang str} { + global translationData + if {[info exists translationData($lang,$str)]} { + return $translationData($lang,$str) + } else { + return $str + } +} + +proc setTranslationString {lang ori tr} { + global translationData + set translationData($lang,$ori) $tr +} + +proc rewordTranslationString {old new} { + global translationData translationLangs + foreach lang $translationLangs { + if {[hasTranslationString $lang $old]} { + setTranslationString $lang $new [getTranslationString $lang $old] + } else { + setTranslationString $lang $new $new + } + } +} + +# GUI helpers +proc gAddTab {basename title elems dummies} { + global gMainNotebook + gAddFrame $basename $elems $dummies + $gMainNotebook add "$gMainNotebook.$basename" -text $title +} + +proc gAddFrame {basename elems dummies} { + global gMainNotebook + set varbase [string cat "g" [firstupper $basename]] + set varname "${varbase}Frame" + set pathname "$gMainNotebook.$basename" + global $varname + set $varname $pathname + ttk::frame $pathname -padding 5 + foreach i $elems { + set varname [string cat $varbase [firstupper $i]] + global $varname + set $varname "$pathname.$i" + } + foreach i $dummies { + set varname [string cat $varbase [firstupper $i]] + global $varname + set $varname {} + } +} + +proc gReloadTranslations {} { + readTranslations + gTrLoadTranslations + gTmLoadTranslations +} + +proc gAddMenu {varname parent menuname entries} { + global $varname + set path "${parent}.${menuname}" + set $varname $path + $parent configure -menu [menu $path -tearoff false] + foreach i $entries { + $path add {*}$i + } + return $parent +} +set gMenuItemNotImplemented [list command -state disabled -label "(Not implemented)"] + +proc gNotImplemented {args} { + tk_messageBox -message "Not implemented" -icon error -type ok +} + +# Main window + +set gMainFrame ".f" +set gMainFrameWidgetCount 0 +foreach i [list readBtn writeBtn notebookTopSeparator notebook] { + set [string cat "gMain" [firstupper $i]] "$gMainFrame.$i" +} + +wm title . "Advtrains Translation File Editor" +grid rowconfigure . 0 -weight 1 +grid columnconfigure . 0 -weight 1 + +ttk::frame $gMainFrame +grid $gMainFrame -column 0 -row 0 -sticky nsew +grid rowconfigure $gMainFrame 2 -weight 1 + +foreach i [list \ + [ttk::button $gMainReadBtn -text "Reload translation files" -command gReloadTranslations] \ + [ttk::button $gMainWriteBtn -text "Write changes" -command writeTranslations] \ +] { + grid $i -column $gMainFrameWidgetCount -row 0 -sticky ns + incr gMainFrameWidgetCount +} + +grid columnconfigure $gMainFrame $gMainFrameWidgetCount -weight 1 + +ttk::separator $gMainNotebookTopSeparator -orient horizontal +grid $gMainNotebookTopSeparator -column 0 -row 1 -columnspan [expr {1+$gMainFrameWidgetCount}] -sticky ew + +ttk::notebook $gMainNotebook +grid $gMainNotebook -column 0 -row 2 -columnspan [expr {1+$gMainFrameWidgetCount}] -sticky nsew + +# Translation Manager +# FIXME?: it seems like Tcl requires -textvariable globals to be set first before they are accessible + +gAddTab tr "Translations" \ + [list langSelect refLangSelect readBtn writeBtn treeviewFrame origTextLabel origTextField translatedTextLabel translatedTextField refTextLabel refTextField] \ + [list langValue refLangValue origTextValue translatedTextValue refTextValue] +set gTrTreeview "$gTrTreeviewFrame.main" +set gTrTreeviewScrollbar "$gTrTreeviewFrame.scrollbar" + +grid rowconfigure $gTrFrame 0 -weight 1 +grid columnconfigure $gTrFrame 2 -weight 1 + +ttk::frame $gTrTreeviewFrame -borderwidth 1 -relief sunken +grid $gTrTreeviewFrame -column 0 -row 0 -columnspan 3 -sticky nsew +grid rowconfigure $gTrTreeviewFrame 0 -weight 1 +grid columnconfigure $gTrTreeviewFrame 0 -weight 1 +ttk::treeview $gTrTreeview -selectmode browse -columns {translation} -yscrollcommand {$gTrTreeviewScrollbar set} +grid $gTrTreeview -column 0 -row 0 -sticky nsew +bind $gTrTreeview <> gTrTreeviewSelectionCallback +ttk::scrollbar $gTrTreeviewScrollbar -orient vertical -command {$gTrTreeview yview} +grid $gTrTreeviewScrollbar -column 1 -row 0 -sticky ns +$gTrTreeview heading #0 -text "Original text" + +lmap i [list \ + [list \ + [ttk::label $gTrOrigTextLabel -text "Original" -anchor w] \ + {} \ + [ttk::entry $gTrOrigTextField -state readonly -textvariable gTrOrigTextValue] \ + ] \ + [list \ + [ttk::label $gTrTranslatedTextLabel -text "Translation" -anchor w] \ + [ttk::combobox $gTrLangSelect -exportselection false -state readonly -textvariable gTrLangValue] \ + [ttk::entry $gTrTranslatedTextField -textvariable gTrTranslatedTextValue] \ + ] \ + [list \ + [ttk::label $gTrRefTextLabel -text "Reference" -anchor w] \ + [ttk::combobox $gTrRefLangSelect -exportselection false -state readonly -textvariable gTrRefLangValue] \ + [ttk::entry $gTrRefTextField -state readonly -textvariable gTrRefTextValue] \ + ] \ +] row [list 1 2 3] { + lmap item $i col [list 0 1 2] { + if {$item eq ""} { + continue + } + grid $item -column $col -row $row -sticky nswe + } + grid rowconfigure $gTrFrame $row -uniform bottom + incr gTrRowCount +} + +bind $gTrLangSelect <> gTrLoadTranslationsToTreeview +trace add variable gTrTranslatedTextValue write gTrApplyTranslationString +bind $gTrRefLangSelect <> gTrTreeviewSelectionCallback + +proc gTrLoadTranslationsToTreeview {} { + global translationTemplate gTrTreeview gTrLangValue + $gTrTreeview heading translation -text "Translation: $gTrLangValue" + set prevFocus [$gTrTreeview item [$gTrTreeview focus] -text] + array set openedSections [list] + foreach i [$gTrTreeview children {}] { + if {[$gTrTreeview item $i -open]} { + set openedSections([$gTrTreeview item $i -text]) 1 + } + } + $gTrTreeview delete [$gTrTreeview children {}] + set parent {} + foreach i [lrange $translationTemplate 1 end] { + if {[regexp {^\#+\s*(.+)} $i x comment]} { + set parent [$gTrTreeview insert {} end -text $comment -tags {notranslate}] + if {[info exists openedSections($comment)]} { + $gTrTreeview item $parent -open true + } + if {$comment eq $prevFocus} { + $gTrTreeview focus $parent + $gTrTreeview selection set $parent + } + } elseif {$i ne ""} { + set last [$gTrTreeview insert $parent end -text $i -values [list [maybeGetTranslationString $gTrLangValue $i]]] + if {$i eq $prevFocus} { + $gTrTreeview focus $last + $gTrTreeview selection set $last + } + } + } + gTrTreeviewSelectionCallback +} + +proc gTrTreeviewSelectionCallback {} { + global gTrOrigTextValue gTrTreeview gTrLangSelect gTrLangValue gTrRefLangSelect gTrRefLangValue gTrTranslatedTextField gTrTranslatedTextValue gTrRefTextField gTrRefTextValue + set focused [$gTrTreeview focus] + set gTrOrigTextValue [$gTrTreeview item $focused -text] + if {$focused eq ""} { + $gTrTranslatedTextField state disabled + $gTrRefTextField state disabled + set gTrTranslatedTextValue "Select an entry to translate" + set gTrRefTextValue "" + } elseif {[$gTrTreeview tag has notranslate $focused]} { + $gTrTranslatedTextField state disabled + $gTrRefTextField state disabled + set gTrTranslatedTextValue "Category names cannot be translated" + set gTrRefTextValue "" + } else { + $gTrTranslatedTextField state !disabled + set gTrTranslatedTextValue [maybeGetTranslationString $gTrLangValue $gTrOrigTextValue] + set gTrRefTextValue [maybeGetTranslationString $gTrRefLangValue $gTrOrigTextValue] + if {$gTrRefLangValue eq ""} { + $gTrRefTextField state disabled + set gTrRefTextValue "" + } elseif {$gTrRefTextValue eq ""} { + $gTrRefTextField state disabled + set gTrRefTextValue "The selected string is not yet translated to the reference language" + } else { + $gTrRefTextField state !disabled + } + } + $gTrLangSelect selection clear + $gTrRefLangSelect selection clear +} + +proc gTrLoadTranslations {} { + global translationLangs gTrLangSelect gTrLangValue gTrRefLangSelect gTrRefLangValue + set prevLang $gTrLangValue + set prevRefLang $gTrRefLangValue + $gTrLangSelect configure -values $translationLangs + $gTrRefLangSelect configure -values [linsert $translationLangs 0 ""] + if {[llength $translationLangs] < 1} { + tk_messageBox -icon error type ok -title "Error" -message "No translation files present." + exit 1 + } + if {$prevLang ni $translationLangs} { + $gTrLangSelect current 0 + } + if {$prevRefLang ni $translationLangs} { + $gTrRefLangSelect current 0 + } + gTrLoadTranslationsToTreeview +} + +proc gTrApplyTranslationString args { + global gTrTreeview gTrLangValue gTrOrigTextValue gTrTranslatedTextValue + set focused [$gTrTreeview focus] + if {![$gTrTreeview tag has notranslate $focused]} { + setTranslationString $gTrLangValue $gTrOrigTextValue $gTrTranslatedTextValue + $gTrTreeview item $focused -values [list $gTrTranslatedTextValue] + } +} + +# Translation Template Editor + +gAddTab tm "Template" \ + [list addStringMenuBtn addHeadingMenuBtn removeMenuBtn moveMenuBtn textField setMenuBtn treeviewFrame] \ + [list textValue] +set gTmTreeview "$gTmTreeviewFrame.main" +set gTmTreeviewScrollbar "$gTmTreeviewFrame.scrollbar" + +set gTmRowCount 0 +foreach i [list \ + [gAddMenu gTmAddStringMenu [ttk::menubutton $gTmAddStringMenuBtn -text "Add string"] "menu" [list \ + [list command -label "Insert before current entry" -command {gTmInsertStringAt true 0}] \ + [list command -label "Insert after current entry" -command {gTmInsertStringAt true 1}] \ + [list command -label "Insert as the first entry" -command {gTmInsertStringAt false 0}] \ + [list command -label "Insert as the last entry" -command {gTmInsertStringAt false end}] \ + ]] \ + [gAddMenu gTmAddHeadingMenu [ttk::menubutton $gTmAddHeadingMenuBtn -text "Add heading"] "menu" [list \ + [list command -label "Insert before current section" -command {gTmInsertHeadingAt true 0}] \ + [list command -label "Insert after current section" -command {gTmInsertHeadingAt true 1}] \ + ]] \ + [gAddMenu gTmRemoveMenu [ttk::menubutton $gTmRemoveMenuBtn -text "Remove"] "menu" [list \ + [list command -label "Remove entry" -command gTmDeleteEntry] \ + [list command -label "Remove section" -command gTmDeleteEntry] \ + [list command -label "Merge with previous section" -command gTmMergeWithPrevious] \ + ]] \ + [gAddMenu gTmMoveMenu [ttk::menubutton $gTmMoveMenuBtn -text "Move"] "menu" [list \ + [list command -label "Up" -command {gTmMoveInSection true -1}] \ + [list command -label "Down" -command {gTmMoveInSection true 1}] \ + [list command -label "To first" -command {gTmMoveInSection false 0}] \ + [list command -label "To last" -command {gTmMoveInSection false end}] \ + ]] \ +] { + grid $i -column 1 -row $gTmRowCount -sticky we + incr gTmRowCount +} + +ttk::frame $gTmTreeviewFrame -borderwidth 1 -relief sunken +grid $gTmTreeviewFrame -column 0 -row 0 -rowspan [expr {1+$gTmRowCount}] -sticky nsew +grid rowconfigure $gTmTreeviewFrame 0 -weight 1 +grid columnconfigure $gTmTreeviewFrame 0 -weight 1 +grid rowconfigure $gTmFrame $gTmRowCount -weight 1 +grid columnconfigure $gTmFrame 0 -weight 1 +ttk::treeview $gTmTreeview -selectmode browse -show tree -yscrollcommand {$gTmTreeviewScrollbar set} +bind $gTmTreeview <> gTmTreeviewSelectionCallback +grid $gTmTreeview -column 0 -row 0 -sticky nsew +ttk::scrollbar $gTmTreeviewScrollbar -orient vertical -command {$gTmTreeview yview} +grid $gTmTreeviewScrollbar -column 1 -row 0 -sticky ns +incr gTmRowCount + +ttk::entry $gTmTextField -textvariable gTmTextValue +grid $gTmTextField -column 0 -row $gTmRowCount -sticky nsew + +gAddMenu gTmSetMenu [ttk::menubutton $gTmSetMenuBtn -text "Set"] "menu" [list \ + [list command -label "Set heading" -command gTmSetEntry] \ + [list command -label "Set and copy translations" -command gTmSetEntryAndCopy] \ + [list command -label "Set without copying translations" -command gTmSetEntry] \ +] +grid $gTmSetMenuBtn -column 1 -row $gTmRowCount -sticky nsew + +proc gTmLoadTranslationsToTreeview {} { + global translationTemplate gTmTreeview + set prevFocus [$gTmTreeview item [$gTmTreeview focus] -text] + array set openedSections [list] + foreach i [$gTmTreeview children {}] { + if {[$gTmTreeview item $i -open]} { + set openedSections([$gTmTreeview item $i -text]) 1 + } + } + $gTmTreeview delete [$gTmTreeview children {}] + set parent {} + foreach i [lrange $translationTemplate 1 end] { + if {[regexp {^\#+\s*(.+)} $i x comment]} { + set parent [$gTmTreeview insert {} end -text $comment -tags {heading}] + if {[info exists openedSections($comment)]} { + $gTmTreeview item $parent -open true + } + if {$comment eq $prevFocus} { + $gTmTreeview focus $parent + $gTmTreeview selection set $parent + } + } elseif {$i ne ""} { + set last [$gTmTreeview insert $parent end -text $i] + if {$i eq $prevFocus} { + $gTmTreeview focus $last + $gTmTreeview selection set $last + } + } + } + gTmTreeviewSelectionCallback +} + +proc gTmTreeviewSelectionCallback {} { + global gTmTreeview gTmTextField gTmTextValue gTmAddStringMenu gTmAddHeadingMenu gTmRemoveMenu gTmMoveMenu gTmSetMenu + set focused [$gTmTreeview focus] + if {$focused eq {}} { + $gTmTextField state disabled + set gTmTextValue "Select an entry to edit" + foreach m [list $gTmAddStringMenu $gTmAddHeadingMenu $gTmRemoveMenu $gTmMoveMenu $gTmSetMenu] { + for {set i 0} {$i <= [$m index end]} {incr i} { $m entryconfigure $i -state disabled} + } + } else { + $gTmTextField state !disabled + set headingSetState disabled + set entrySetState normal + if {[$gTmTreeview tag has heading $focused]} { + set headingSetState normal + set entrySetState disabled + } + foreach ent [list \ + [list $gTmAddStringMenu \ + [list 0 -state $entrySetState] \ + [list 1 -state $entrySetState] \ + [list 2 -state normal] \ + [list 3 -state normal] \ + ] \ + [list $gTmAddHeadingMenu \ + [list 0 -state normal] \ + [list 1 -state normal] \ + ] \ + [list $gTmMoveMenu \ + [list 0 -state normal] \ + [list 1 -state normal] \ + [list 2 -state normal] \ + [list 3 -state normal] \ + ] \ + [list $gTmRemoveMenu \ + [list 0 -state $entrySetState] \ + [list 1 -state $headingSetState] \ + [list 2 -state $headingSetState] \ + ] \ + [list $gTmSetMenu \ + [list 0 -state $headingSetState] \ + [list 1 -state $entrySetState] \ + [list 2 -state $entrySetState] \ + ] \ + ] { + set m [lindex $ent 0] + lmap i [lrange $ent 1 end] { + $m entryconfigure {*}$i + } + } + set gTmTextValue [$gTmTreeview item $focused -text] + } +} + +proc gTmUpdateTemplateAux {parent} { + global translationTemplate gTmTreeview + foreach i [$gTmTreeview children $parent] { + set tval [$gTmTreeview item $i -text] + if {[$gTmTreeview tag has heading $i]} { + lappend translationTemplate {} + set tval "# $tval" + } + lappend translationTemplate $tval + gTmUpdateTemplateAux $i + } +} + +proc gTmUpdateTemplate {} { + global translationTemplate translationDomain + set translationTemplate [list "# textdomain: $translationDomain"] + gTmUpdateTemplateAux {} + gTrLoadTranslations + gTmLoadTranslationsToTreeview +} + +proc gTmSetEntry {} { + global gTmTreeview gTmTextValue + $gTmTreeview item [$gTmTreeview focus] -text $gTmTextValue + gTmUpdateTemplate +} + +proc gTmSetEntryAndCopy {} { + global gTmTreeview gTmTextValue + set focus [$gTmTreeview focus] + rewordTranslationString [$gTmTreeview item $focus -text] $gTmTextValue + gTmSetEntry +} + +proc gTmInsertStringAt {relative idx} { + global gTmTreeview + set focus [$gTmTreeview focus] + set parent [$gTmTreeview parent $focus] + set relidx [$gTmTreeview index $focus] + if {[$gTmTreeview tag has heading $focus]} { + set parent $focus + set relindex 0 + } + set newidx $idx + if {$relative} { + set newidx [expr {$idx+$relidx}] + } + set item [$gTmTreeview insert $parent $newidx -text {}] + $gTmTreeview focus $item + $gTmTreeview selection set $item +} + +proc gTmInsertHeadingAt {relative idx} { + global gTmTreeview + set focus [$gTmTreeview focus] + if {![$gTmTreeview tag has heading $focus]} { + set focus [$gTmTreeview parent $focus] + } + set parent [$gTmTreeview parent $focus] + set relidx [$gTmTreeview index $focus] + if {$focus eq {}} { + set parent {} + set relidx 0 + } + set newidx $idx + if {$relative} { + set newidx [expr {$idx+$relidx}] + } + set item [$gTmTreeview insert $parent $newidx -text {} -tags {heading}] + $gTmTreeview focus $item + $gTmTreeview selection set $item +} + +proc gTmMoveInSection {relative idx} { + global gTmTreeview + set focus [$gTmTreeview focus] + set parent [$gTmTreeview parent $focus] + set relidx [$gTmTreeview index $focus] + set newidx $idx + if {$relative} { + set newidx [expr {$idx+$relidx}] + } + $gTmTreeview move $focus $parent $newidx + gTmUpdateTemplate +} + +proc gTmDeleteEntry {} { + global gTmTreeview + $gTmTreeview delete [$gTmTreeview focus] + gTmUpdateTemplate +} + +proc gTmMergeWithPrevious {} { + global gTmTreeview + set parent [$gTmTreeview focus] + set prev [$gTmTreeview prev $parent] + set newindex end + if {$prev eq {}} { + set prev [$gTmTreeview parent $parent] + set newindex 0 + } + foreach i [$gTmTreeview children $parent] { + $gTmTreeview move $i $prev $newindex + } + $gTmTreeview delete $parent + gTmUpdateTemplate +} + +proc gTmLoadTranslations {} { + gTmLoadTranslationsToTreeview +} + +# Initialization + +gReloadTranslations diff --git a/advtrains/locale/template.txt b/advtrains/locale/template.txt new file mode 100644 index 0000000..8c8b859 --- /dev/null +++ b/advtrains/locale/template.txt @@ -0,0 +1,146 @@ +# textdomain: advtrains + +# Advtrains Core (unorganized) +This wagon is owned by @1, you can't destroy it.=This wagon is owned by @1, you can't destroy it. +Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon.=Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon. +This position is protected!=This position is protected! +Can't place: not pointing at node=Can't place: not pointing at node +Can't place: space occupied!=Can't place: space occupied! +Can't place: protected position!=Can't place: protected position! +Can't place: Not enough slope items left (@1 required)=Can't place: Not enough slope items left (@1 required) +Can't place: There's no slope of length @1=Can't place: There's no slope of length @1 +Can't place: no supporting node at upper end.=Can't place: no supporting node at upper end. +Deprecated Track=Deprecated Track +Can't get on: wagon full or doors closed!=Can't get on: wagon full or doors closed! +Use Sneak+rightclick to bypass closed doors!=Use Sneak+rightclick to bypass closed doors! +Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!=Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off! +Access to @1=Access to @1 +You do not have the @1 privilege.=You do not have the @1 privilege. +The wagon's inventory is not empty!=The wagon's inventory is not empty! +Position is occupied by a train.=Position is occupied by a train. +There's a Track Circuit Break here.=There's a Track Circuit Break here. +There's a Signal Influence Point here.=There's a Signal Influence Point here. + +# Trackworker, rotation, adjustment +This node can't be rotated using the trackworker!=This node can't be rotated using the trackworker! +This node can't be changed using the trackworker!=This node can't be changed using the trackworker! +This track can not be changed!=This track can not be changed! +This track can not be rotated!=This track can not be rotated! +This track can not be removed!=This track can not be removed! + +# ATC +ATC controller, unconfigured.=ATC controller, unconfigured. +ATC controller=ATC controller +ATC controller, mode @1@nChannel: @2=ATC controller, mode @1@nChannel: @2 +ATC controller, mode @1@nCommand: @2=ATC controller, mode @1@nCommand: @2 +Command=Command +Command (on)=Command (on) +Digiline channel=Digiline channel +ATC Kick command warning: Doors closed=ATC Kick command warning: Doors closed +ATC Kick command warning: Train moving=ATC Kick command warning: Train moving +ATC Reverse command warning: didn't reverse train, train moving!=ATC Reverse command warning: didn't reverse train, train moving! +ATC command syntax error: I statement not closed: @1=ATC command syntax error: I statement not closed: @1 +ATC command parse error: Unknown command: @1=ATC command parse error: Unknown command: @1 + +# Coupling +Lock couples=Lock couples +You need to own at least one neighboring wagon to destroy this couple.=You need to own at least one neighboring wagon to destroy this couple. +Buffer and Chain Coupler=Buffer and Chain Coupler +Scharfenberg Coupler=Scharfenberg Coupler +Japanese Train Inter-Wagon Connection=Japanese Train Inter-Wagon Connection +Can not couple: The couplers of the trains do not match (@1 and @2).=Can not couple: The couplers of the trains do not match (@1 and @2). +You are not allowed to couple trains without the train_operator privilege.=You are not allowed to couple trains without the train_operator privilege. + +# Clipboard +The track you are trying to place the wagon on is not long enough!=The track you are trying to place the wagon on is not long enough! +The clipboard couldn't access the metadata. Paste failed.=The clipboard couldn't access the metadata. Paste failed. +The clipboard couldn't access the metadata. Copy failed.=The clipboard couldn't access the metadata. Copy failed. +The clipboard is empty.=The clipboard is empty. +Back of train would end up off track, cancelling.=Back of train would end up off track, cancelling. +No such lua entity!=No such lua entity! +No such wagon: @1=No such wagon: @1 +No such train: @1=No such train: @1 +Train copied!=Train copied! + +# Protection +You are not allowed to build tracks without the track_builder privilege.=You are not allowed to build tracks without the track_builder privilege. +You are not allowed to build near tracks without the track_builder privilege.=You are not allowed to build near tracks without the track_builder privilege. +You are not allowed to build tracks at this protected position.=You are not allowed to build tracks at this protected position. +You are not allowed to build near tracks at this protected position.=You are not allowed to build near tracks at this protected position. +You are not allowed to operate turnouts and signals without the railway_operator privilege.=You are not allowed to operate turnouts and signals without the railway_operator privilege. + +# Train HUD/Formspecs +Speed:=Speed: +Target:=Target: +Show Inventory=Show Inventory +Select seat:=Select seat: +Wagon properties=Wagon properties +Save wagon properties=Save wagon properties +Text displayed outside on train=Text displayed outside on train +Text displayed inside train=Text displayed inside train +Line=Line +Routingcode=Routingcode +Get off=Get off +Get off (forced)=Get off (forced) +(Doors closed)=(Doors closed) + +# General +Save=Save + +# Line automation +Station Code=Station Code +Station Name=Station Name +Door Delay=Door Delay +Door Side=Door Side +Dep. Speed=Dep. Speed +Stop Time=Stop Time + +# Items +Track Worker Tool@n@nLeft-click: change rail type (straight/curve/switch)@nRight-click: rotate rail/bumper/signal/etc.=Track Worker Tool@n@nLeft-click: change rail type (straight/curve/switch)@nRight-click: rotate rail/bumper/signal/etc. +Passive Component Naming Tool@n@nRight-click to name a passive component.=Passive Component Naming Tool@n@nRight-click to name a passive component. +Train copy/paste tool@n@nLeft-click: copy train@nRight-click: paste train=Train copy/paste tool@n@nLeft-click: copy train@nRight-click: paste train +Track=Track +Perpendicular Diamond Crossing Track=Perpendicular Diamond Crossing Track +Diagonal Diamond Crossing Track=Diagonal Diamond Crossing Track +90+Angle Diamond Crossing Track=90+Angle Diamond Crossing Track +Y-turnout=Y-turnout +3-way turnout=3-way turnout +Unloading Track=Unloading Track +Loading Track=Loading Track +Bumper=Bumper +Detector Rail=Detector Rail +@1 Slope=@1 Slope +@1 Platform (low)=@1 Platform (low) +@1 Platform (high)=@1 Platform (high) +@1 Platform (low, 45 degree)=@1 Platform (low, 45 degree) +@1 Platform (45 degree)=@1 Platform (45 degree) +Lampless Signal=Lampless Signal +Signal=Signal +Wallmounted Signal (l)=Wallmounted Signal (l) +Wallmounted Signal (r)=Wallmounted Signal (r) +Wallmounted Signal (t)=Wallmounted Signal (t) +Andrew's Cross=Andrew's Cross +Boiler=Boiler +driver's cab=driver's cab +Wheel=Wheel +Chimney=Chimney + +# Seats +Default Seat=Default Seat +Default Seat (driver stand)=Default Seat (driver stand) +Driver stand=Driver stand +Driver Stand (left)=Driver Stand (left) +Driver Stand (right)=Driver Stand (right) + +# Wagon/engine types +Industrial Train Engine=Industrial Train Engine +Big Industrial Train Engine=Big Industrial Train Engine +Industrial tank wagon=Industrial tank wagon +Industrial wood wagon=Industrial wood wagon +Japanese Train Engine=Japanese Train Engine +Japanese Train Wagon=Japanese Train Wagon +Steam Engine=Steam Engine +Detailed Steam Engine=Detailed Steam Engine +Passenger Wagon=Passenger Wagon +Box Wagon=Box Wagon +Subway Passenger Wagon=Subway Passenger Wagon diff --git a/advtrains/locale/topo.sh b/advtrains/locale/topo.sh new file mode 100755 index 0000000..23f81b1 --- /dev/null +++ b/advtrains/locale/topo.sh @@ -0,0 +1,4 @@ +#!/bin/sh + +head -n18 ../po/template.pot | sed 's/charset=CHARSET/charset=UTF-8/' +sed -En 's/@n/\\n/g;s/@\n/\\n/g;s/\"/\\"/g;s/^([^=]+)=\1$/\1=/;s/^([^=]+)=([^=]*)$/\nmsgid "\1"\nmsgstr "\2"/gp' diff --git a/advtrains/po/de.po b/advtrains/po/de.po new file mode 100644 index 0000000..ebd6339 --- /dev/null +++ b/advtrains/po/de.po @@ -0,0 +1,580 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-04 15:40+0200\n" +"PO-Revision-Date: 2022-11-02 15:08+0100\n" +"Last-Translator: Y. Wang \n" +"Language-Team: German\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: advtrains/atc.lua:109 +msgid "ATC controller, unconfigured." +msgstr "Nicht konfiguierte Zugbeeinflussungsgleis" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"Zugbeeinflussungsgleis in Betriebsart „@1“\n" +"Befehl: @2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "Befehl" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "Befehl (wenn aktiviert)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Digiline-Kanal" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +msgid "Save" +msgstr "Speichern" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving!" +msgstr "" +"Zugbeeinflussung: der Befehl „R“ wurde nicht ausgeführt, Zug in Bewegung!" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: Doors closed" +msgstr "" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: Train moving" +msgstr "" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "Zugbeeinflussung: Unbekannter Befehl: @1" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "" + +#: advtrains/craft_items.lua:9 +msgid "driver's cab" +msgstr "" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "Niedriger @1-Bahnsteig" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "Hoher @1-Bahnsteig" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "Hoher @1-Bahnsteig (45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "Niedriger @1-Bahnsteig (45°)" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate rail/bumper/signal/etc." +msgstr "" +"Gleiswerkzeug\n" +"\n" +"Linksklick: Gleistyp ändern, Rechtsklick: Objekt drehen." + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker!" +msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden." + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated!" +msgstr "Dieses Gleis kann nicht gedreht werden!" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker!" +msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden." + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed!" +msgstr "Dieses Gleis kann nicht geändert werden!" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "Dieser Waggon gehört @1, Sie dürfen ihn nicht abbauen." + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty!" +msgstr "Das Inventar dieses Waggons ist nicht leer!" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"Warnung: Durch den Abbau des Waggons erhalten Sie nur etwas Stahl zurück. " +"Nutzen Sie Schleichen+Linksklick, um dem Waggon abzubauen." + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "Inventar Zeigen" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "Waggon-Einstellungen" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "Aussteigen" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "Ausstieg zwingen" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(Türen geschlossen)" + +#: advtrains/wagons.lua:712 +msgid "Can't get on: " +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "Wählen Sie einen Sitzplatz aus:" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "Waggon-Einstellungen speichern" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "Äußere Anzeige" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "Innere Anzeige" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "Linie" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed! Use Sneak+rightclick to ignore the closed doors and get " +"off!" +msgstr "" +"Die Türen sind geschlossen. Nutzen Sie Schleichen+Rechtsklick, um trotz " +"geschlossener Türen auszusteigen." + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed!" +msgstr "Dieses Gleis kann nicht entfernt werden!" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "Ein Zug steht an dieser Position." + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)." + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "Hier ist ein Signal-Beeinflussungspunkt." + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1 Steigung" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place: not pointing at node" +msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block." + +#: advtrains/tracks.lua:658 +msgid "Can't place: space occupied!" +msgstr "Es kann nicht platziert werden: diese Position ist besetzt." + +#: advtrains/tracks.lua:711 +msgid "Can't place: Not enough slope items left (@1 required)" +msgstr "" +"Es kann nicht platziert werden: Sie haben nicht genug Steigungsblöcke, es " +"werden insgesamt @1 benötigt." + +#: advtrains/tracks.lua:714 +msgid "Can't place: There's no slope of length @1" +msgstr "" +"Es kann nicht platziert werden: die Steigung der Länge @1 ist nicht " +"definiert." + +#: advtrains/tracks.lua:721 +msgid "Can't place: no supporting node at upper end." +msgstr "" +"Es kann nicht platziert werden: es gibt keinen unterstützenden Block am Ende " +"der Steigung." + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "Mechanisches Signal" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "Lichtsignal" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (l)" +msgstr "An der linken Seite montiertes Signal" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (r)" +msgstr "An der rechten Seite montiertes Signal" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (t)" +msgstr "An der Decke montiertes Signal" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "Schraubenkupplung" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenbergkupplung" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "Sie dürfen ohne das „train_builder“-Privileg keine Züge ankuppeln." + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "Die Kupplungen der Züge passen nicht zueinander (@1 und @2)." + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"Werkzeug zur Erstellung von Zugkopien\n" +"\n" +"Linksklick: Zug ins Clipboard kopieren\n" +"Right-click: Kopierten Zug einfügen" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "Ihnen fehlt das „@1“-Privileg." + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough!" +msgstr "Das Gleis, auf dem der Waggon platziert werden woll, ist zu kurz." + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "" +"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte eine Kopie des " +"Zuges nicht eingefügt werden." + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "Das Clipboard ist leer." + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "Der hinterer Teil dez Zuges wäre nicht auf dem Gleis." + +#: advtrains/copytool.lua:92 +msgid "No such lua entity!" +msgstr "" +"Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden " +"kann." + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1" +msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon." + +#: advtrains/copytool.lua:104 +msgid "No such train: @1" +msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug." + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "" +"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug nicht " +"kopiert werden." + +#: advtrains/copytool.lua:180 +msgid "Train copied!" +msgstr "Der Zug wurde Kopiert." + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" +"Sie dürfen ohne das „track_builder“-Privileg nicht in der Nähe von Gleisen " +"bauen." + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "Sie dürfen ohne das „track_builder“-Privileg kein Gleis bauen." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "Sie dürfen an geschützten Stellen nicht in der Nähe von Gleisen bauen." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen." + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" +"Sie dürfen ohne das „railway_operator“-Privileg keine Bahnanlage operieren." + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "Code der Haltestelle" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "Name der Haltestelle" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "Zeit für die Türschließung" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "Zielgeschwindigkeit bei Abfahrt" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "Gleis" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "Wartezeit" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:26 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"PC-Benennungswerkzeug\n" +"\n" +"Rechtsklick zur Benennung der passiven Komponente" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "Y-Weiche" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "Dreiwegweiche" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "Kreuzung mit zueinander orthogonalen Gleisen" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "Kreuzung mit einem achsenparallelen Gleis" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "Diagonale Gleiskreuzung" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "Prellbock" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "Zugbeeinflussungsgleis" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "Abladungsgleis" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "Beladungsgleis" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "Detektorgleis" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "Führerstand Rechts" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "Führerstand Links" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "Industrielle Lokomotive" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "Große Industrielle Lokomotive" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "Tankwaggon" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "Holztransportwaggon" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "Waggonzwischenverbindung Japanischer Personenzüge" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "Führerstand" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "Japanische Personenzug-Lokomotive" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "Japanischer Personenzug-Passagierwaggon" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "Dampflokomotive" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "detaillierte Dampflokomotive" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "Passagierwaggon" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "Güterwaggon" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "U-Bahn-Waggon" + +#~ msgid "This position is protected!" +#~ msgstr "Diese Position ist geschützt!" + +#~ msgid "Can't place: protected position!" +#~ msgstr "Es kann nicht platziert werden: diese Position ist geschützt." + +#~ msgid "Deprecated Track" +#~ msgstr "ausrangiertes Gleis, nicht verwenden." + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "" +#~ "Sie können nicht einsteigen: der Waggon ist voll oder die Türen sind " +#~ "geschlossen." + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "" +#~ "Nutzen Sie Schleichen+Rechtsklick, um trotz geschlossener Türen " +#~ "einzusteigen." + +#~ msgid "Access to @1" +#~ msgstr "Zugang zu @1" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n" +#~ "Kanal: @2" + +#~ msgid "Lock couples" +#~ msgstr "Kupplungen sperren" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "" +#~ "Sie müssen Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln." + +#~ msgid "Speed:" +#~ msgstr "Geschw.:" + +#~ msgid "Target:" +#~ msgstr "Zielges.:" + +#~ msgid "Default Seat" +#~ msgstr "Standardsitzplatz" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "Standardsitzplatz (Führerstand)" diff --git a/advtrains/po/fr.po b/advtrains/po/fr.po new file mode 100644 index 0000000..9a16799 --- /dev/null +++ b/advtrains/po/fr.po @@ -0,0 +1,579 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-04 15:40+0200\n" +"PO-Revision-Date: 2022-07-05 10:11+0200\n" +"Last-Translator: Tanavit \n" +"Language-Team: French\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: advtrains/atc.lua:109 +msgid "ATC controller, unconfigured." +msgstr "Controlleur ATC, non-configuré " + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"Controlleur ATC, mode @1\n" +"Commande : @2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "Commande" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "Commande (marche) " + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Canal Digiline" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +msgid "Save" +msgstr "Sauvegarder" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving!" +msgstr "" +"Attention : Commande ATC de renversement impossible car le train se déplace !" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: Doors closed" +msgstr "" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: Train moving" +msgstr "" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "Erreur de syntaxe de commande ATC : instruction \"I\" incomplète : @1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "Chaudière à vapeur" + +#: advtrains/craft_items.lua:9 +msgid "driver's cab" +msgstr "Cabine de pilotage" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "Roue" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "Cheminée" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "Quai @1 (bas)" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "Quai @1 (haut)" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "Quai @1 (haut, 45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "Quai @1 (bas, 45°)" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate rail/bumper/signal/etc." +msgstr "" +"Outil \"Trackworker\"\n" +"\n" +"Clic-Gauche : change le type de rail (droit/courbé/aiguillage)\n" +"\n" +"Clic-Droit : tourne le rail/butoir/signal/etc..." + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker!" +msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated!" +msgstr "Cette voie ne peut pas être tournée !" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker!" +msgstr "Ce nœud ne peut être modifié avec l'outil \"Trackworker\" !" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed!" +msgstr "Cette voie ne peut pas être modifiée !" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "Ce wagon est la propriété de @1, vous ne pouvez pas le détruire." + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty!" +msgstr "Le stock de ce wagon n'est pas vide !" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"Attention: Si vous détruisez ce wagon, vous ne récupérerez que de la " +"ferraille ! Si vous êtes sûr de vous, appuyez la touche \"Marcher lentement " +"(Sneak)\" et Clic-Gauche." + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "Montrer le stock" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "Propriétés du wagon" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "Débarquer" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "Débarquer (de force)" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(Portes closes)" + +#: advtrains/wagons.lua:712 +msgid "Can't get on: " +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "Choisir le siège" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "Sauvegarder les propriétés du wagon" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "Texte affiché à l'extérieur du train" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "Texte affiché à l'intérieur du train" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "Ligne " + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "Code de routage" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed! Use Sneak+rightclick to ignore the closed doors and get " +"off!" +msgstr "" +"Portes closes ! Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour " +"franchir les portes et débarquer !" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed!" +msgstr "Cette voie ne peut pas être enlevée !" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "Cet emplacement est occupé par un train." + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "Il y a un \"Track Circuit Break\" ici." + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "Il y a un \"Signal Influence Point\" ici." + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "Pente @1" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place: not pointing at node" +msgstr "Placement impossible : ne pointe pas un nœud" + +#: advtrains/tracks.lua:658 +msgid "Can't place: space occupied!" +msgstr "Placement impossible : espace occupé" + +#: advtrains/tracks.lua:711 +msgid "Can't place: Not enough slope items left (@1 required)" +msgstr "" +"Placement impossible : quantité insuffisante de voie pentue (@1 manquant)" + +#: advtrains/tracks.lua:714 +msgid "Can't place: There's no slope of length @1" +msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1" + +#: advtrains/tracks.lua:721 +msgid "Can't place: no supporting node at upper end." +msgstr "Placement impossible : pas de nœud d'appui à l'extrémité supérieure" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "Sémaphore" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (l)" +msgstr "Signal mural (gauche)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (r)" +msgstr "Signal mural (droit)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (t)" +msgstr "Signal mural (plafond)" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "Croix de Saint André" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "Attelage à tampon et vis" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Attelage Scharfenberg" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "" +"Accouplement impossible: les attelages des trains ne concordent pas (@1 et " +"@2)." + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"Outil de copie/collage de train\n" +"\n" +"Clic-Gauche : copie\n" +"\n" +"Clic-Droit : collage" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "Vous ne possédez pas le privilège \"@1\"." + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough!" +msgstr "La voie sur laquelle vous tentez de placer le wagon est trop courte !" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec du collage." + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "Le presse-papier est vide." + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "La fin du train serait hors voie : annulation." + +#: advtrains/copytool.lua:92 +msgid "No such lua entity!" +msgstr "Pas de telle entité lua !" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1" +msgstr "Pas de tel wagon : @1" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1" +msgstr "Pas de tel train : @1" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec de la copie." + +#: advtrains/copytool.lua:180 +msgid "Train copied!" +msgstr "Train copié !" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" +"Vous ne pouvez pas construire à proximité d'une voie sans le privilège " +"\"track_builder\" (?)" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "" +"Vous ne pouvez pas construire une voie sans le privilège \"track_builder\"" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "" +"Vous ne pouvez pas construire à proximité d'une voie à cet emplacement " +"protégé" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" +"Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège " +"\"railway_operator\" manquant)" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "Code de Station" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "Nom de Station" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "Durée d'ouverture des portes" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "Vitesse de départ" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "Voie" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "Durée d'arrêt" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:26 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"Outil de nommage de composant passif\n" +"\n" +"Clic-Droit pour nommer un composant passif." + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "Embranchement en Y" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "Embranchement triple" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "Croisement perpendiculaire" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "Croisement perpendiculo-diagonal" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "Croisement diagonal" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "Heurtoir" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "Controlleur ATC" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "Voie de Déchargement" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "Voie de Chargement" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "Voie détectrice" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "Poste de pilotage (droit)" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "Poste de pilotage (gauche)" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "Locomotive industrielle" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "Grosse locomotive industrielle " + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "Wagon-citerne industriel" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "Wagon grumier industriel" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "Passage inter-voiture de train Japonais" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "Poste de pilotage" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "Motrice Japonaise" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "Voiture Japonaise" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "Locomotive à vapeur" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "Locomotive à vapeur complexe" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "Voiture passager" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "Wagon de frêt" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "Voiture de Métropolitain" + +#~ msgid "This position is protected!" +#~ msgstr "Cet emplacement est protégé !" + +#~ msgid "Can't place: protected position!" +#~ msgstr "Placement impossible : emplacement protégé" + +#~ msgid "Deprecated Track" +#~ msgstr "Voie déconseillée" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "" +#~ "Embarquement impossible : le wagon est plein ou ses portes sont closes !" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "" +#~ "Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour franchir les " +#~ "portes closes !" + +#~ msgid "Access to @1" +#~ msgstr "Accès à @1" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "Controlleur ATC, mode @1\n" +#~ "Canal : @2" + +#~ msgid "Lock couples" +#~ msgstr "Verrouiller l'accouplement" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "" +#~ "Vous devez être propriétaire d'au moins un wagon voisin pour supprimer " +#~ "cet attelage." + +#~ msgid "Speed:" +#~ msgstr "Vitesse : " + +#~ msgid "Target:" +#~ msgstr "Destination : " + +#~ msgid "Default Seat" +#~ msgstr "Siège par défaut" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "Siège par défaut (poste de pilotage)" diff --git a/advtrains/po/template.pot b/advtrains/po/template.pot new file mode 100644 index 0000000..23aaa6a --- /dev/null +++ b/advtrains/po/template.pot @@ -0,0 +1,505 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the advtrains package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-04 15:40+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=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: advtrains/atc.lua:109 +msgid "ATC controller, unconfigured." +msgstr "" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +msgid "Save" +msgstr "" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving!" +msgstr "" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: Doors closed" +msgstr "" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: Train moving" +msgstr "" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "" + +#: advtrains/craft_items.lua:9 +msgid "driver's cab" +msgstr "" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate rail/bumper/signal/etc." +msgstr "" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker!" +msgstr "" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated!" +msgstr "" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker!" +msgstr "" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed!" +msgstr "" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "" + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty!" +msgstr "" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "" + +#: advtrains/wagons.lua:712 +msgid "Can't get on: " +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed! Use Sneak+rightclick to ignore the closed doors and get " +"off!" +msgstr "" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed!" +msgstr "" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place: not pointing at node" +msgstr "" + +#: advtrains/tracks.lua:658 +msgid "Can't place: space occupied!" +msgstr "" + +#: advtrains/tracks.lua:711 +msgid "Can't place: Not enough slope items left (@1 required)" +msgstr "" + +#: advtrains/tracks.lua:714 +msgid "Can't place: There's no slope of length @1" +msgstr "" + +#: advtrains/tracks.lua:721 +msgid "Can't place: no supporting node at upper end." +msgstr "" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (l)" +msgstr "" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (r)" +msgstr "" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (t)" +msgstr "" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough!" +msgstr "" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity!" +msgstr "" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1" +msgstr "" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1" +msgstr "" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "" + +#: advtrains/copytool.lua:180 +msgid "Train copied!" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:26 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "" diff --git a/advtrains/po/update-translations.sh b/advtrains/po/update-translations.sh new file mode 100755 index 0000000..d86c568 --- /dev/null +++ b/advtrains/po/update-translations.sh @@ -0,0 +1,24 @@ +#!/bin/sh +# NOTE: Please make sure you also have basic_trains installed, as it uses attrans for historical reasons + +ATDIR=`dirname "$0"`/../.. +BTDIR="$ATDIR"/../basic_trains + +xgettext \ + -D "$ATDIR" \ + -D "$BTDIR" \ + -d advtrains \ + -p . \ + -L lua \ + --from-code=UTF-8 \ + --keyword='attrans' \ + --keyword='S' \ + --package-name='advtrains' \ + --msgid-bugs-address='advtrains-discuss@lists.sr.ht' \ + `find $ATDIR $BTDIR -name '*.lua' -printf '%P\n'` \ + && +mv advtrains.po template.pot && +for i in *.po; do + msgmerge -U \ + $i template.pot +done diff --git a/advtrains/po/zh_CN.po b/advtrains/po/zh_CN.po new file mode 100644 index 0000000..c81cf6c --- /dev/null +++ b/advtrains/po/zh_CN.po @@ -0,0 +1,560 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-04 15:40+0200\n" +"PO-Revision-Date: 2022-11-02 15:08+0100\n" +"Last-Translator: Y. Wang \n" +"Language-Team: Chinese (Simplified)\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: advtrains/atc.lua:109 +msgid "ATC controller, unconfigured." +msgstr "ATC 控制器 (未配置)" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"ATC 控制器\n" +"模式:@1\n" +"命令:@2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "命令" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "命令 (激活时)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Digiline 频道" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +msgid "Save" +msgstr "保存" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving!" +msgstr "ATC 警告:未执行“R”命令,火车在移动" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: Doors closed" +msgstr "" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: Train moving" +msgstr "" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "ATC 语法错误:“I”命令不完整:@1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "ATC 语法错误:未知命令:@1" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "锅炉" + +#: advtrains/craft_items.lua:9 +msgid "driver's cab" +msgstr "驾驶室" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "车轮" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "烟囱" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "较低的@1站台" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "较高的@1站台" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "较高的@1站台 (45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "较低的@1站台 (45°)" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate rail/bumper/signal/etc." +msgstr "" +"铁路调整工具\n" +"\n" +"左键单击:切换轨道类型\n" +"右键单击:旋转方块" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker!" +msgstr "您不能使用铁路调整工具旋转这个方块。" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated!" +msgstr "您不能旋转这段轨道。" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker!" +msgstr "您不能使用铁路调整工具调整这个方块。" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed!" +msgstr "您不能调整这段轨道。" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "这是 @1 的车厢,您不能摧毁它。" + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty!" +msgstr "" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"警告:如果您摧毁此车厢,您只能拿到一些钢方块。如果您确定要摧毁这节车厢,请按" +"潜行键并左键单击此车厢。" + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "显示物品栏" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "车厢属性" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "下车" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "强制下车" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(车门已关闭)" + +#: advtrains/wagons.lua:712 +msgid "Can't get on: " +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "请选择座位" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "保存车厢属性" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "车厢外部显示" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "车厢内部显示" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "火车线路" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "路由码" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed! Use Sneak+rightclick to ignore the closed doors and get " +"off!" +msgstr "车门已关闭,请使用潜行+右键单击下车。" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed!" +msgstr "您不能移除这段轨道。" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1斜坡" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place: not pointing at node" +msgstr "无法放置:您没有选择任何方块。" + +#: advtrains/tracks.lua:658 +msgid "Can't place: space occupied!" +msgstr "无法放置:此区域已被占用。" + +#: advtrains/tracks.lua:711 +msgid "Can't place: Not enough slope items left (@1 required)" +msgstr "无法放置:您没有足够的铁路斜坡放置工具 (您总共需要@1个)" + +#: advtrains/tracks.lua:714 +msgid "Can't place: There's no slope of length @1" +msgstr "无法放置:advtrains 不支持长度为@1米的斜坡。" + +#: advtrains/tracks.lua:721 +msgid "Can't place: no supporting node at upper end." +msgstr "无法放置:较高端没有支撑方块。" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "臂板信号机" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "信号灯" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (l)" +msgstr "壁挂式信号灯 (左侧)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (r)" +msgstr "壁挂式信号灯 (右侧)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (t)" +msgstr "悬挂式信号灯" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "铁路道口信号灯" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "链式车钩" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenberg 式车钩" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "您没有“train_operator”权限,不能连接这两节车厢。" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"火车复制工具\n" +"\n" +"左键单击:复制\n" +"右键单击:粘帖" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "您没有“@1”权限。" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough!" +msgstr "轨道太短。" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "无法粘贴:剪贴板无法访问元数据。" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "剪贴板是空的。" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "火车后部不在轨道上。" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity!" +msgstr "您没有指向一个可以用火车复制工具复制的物体。" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1" +msgstr "ID 为“@1”的车厢不存在。" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1" +msgstr "ID 为“@1”的列车不存在。" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "无法复制:剪贴板无法访问元数据。" + +#: advtrains/copytool.lua:180 +msgid "Train copied!" +msgstr "已复制" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "您没有“train_operator”权限,不能在铁路附近建任何东西。" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "您没有“train_operator”权限,不能在这里建造铁路。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "这里已被保护,您不能在这里建造铁路。" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "您没有“railway_operator”权限,不能控制铁路设施。" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "车站代码" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "车站名称" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "车门关闭时间" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "出发速度" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "轨道" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "停站时间" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:26 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"被动元件命名工具\n" +"\n" +"右键单击命名所选元件" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "对称道岔" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "三开道岔" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "垂直交叉轨道" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "交叉轨道 (其中一条轨道与坐标轴平行)" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "交叉轨道" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "保险杠" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "ATC 控制器" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "卸货轨道" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "装货轨道" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "探测轨道" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "右侧司机座位" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "左侧司机座位" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "工业用火车头" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "大型工业用火车头" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "液体运输车厢" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "木材运输车厢" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "日本火车车钩" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "司机座位" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "高速列车车头" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "高速列车车厢" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "蒸汽机车" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "精细的蒸汽机车" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "客车" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "货运车厢" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "地铁车厢" + +#~ msgid "This position is protected!" +#~ msgstr "这里已被保护。" + +#~ msgid "Can't place: protected position!" +#~ msgstr "无法放置:此区域已被保护。" + +#~ msgid "Deprecated Track" +#~ msgstr "请不要使用" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "无法上车:车门已关闭或车厢已满。" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "请使用潜行+右键上车。" + +#~ msgid "Access to @1" +#~ msgstr "可前往@1" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "ATC 控制器\n" +#~ "模式:@1\n" +#~ "频道:@2" + +#~ msgid "Lock couples" +#~ msgstr "锁定连接处" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "您必须至少拥有其中一节车厢才能分开这两节车厢。" + +#~ msgid "Speed:" +#~ msgstr "速度" + +#~ msgid "Target:" +#~ msgstr "目标速度" + +#~ msgid "Default Seat" +#~ msgstr "默认座位" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "默认座位 (司机座位)" diff --git a/advtrains/po/zh_TW.po b/advtrains/po/zh_TW.po new file mode 100644 index 0000000..91a205f --- /dev/null +++ b/advtrains/po/zh_TW.po @@ -0,0 +1,560 @@ +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-04 15:40+0200\n" +"PO-Revision-Date: 2022-11-02 15:08+0100\n" +"Last-Translator: Y. Wang \n" +"Language-Team: Chinese (Traditional)\n" +"Language: zh_TW\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: advtrains/atc.lua:109 +msgid "ATC controller, unconfigured." +msgstr "ATC 控制器 (未配置)" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" +"ATC 控制器\n" +"模式:@1\n" +"命令:@2" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "命令" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "命令 (啟用時)" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "Digiline 頻道" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +msgid "Save" +msgstr "儲存" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving!" +msgstr "ATC 警告:未執行「R」命令,火車在移動" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: Doors closed" +msgstr "" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: Train moving" +msgstr "" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "ATC 語法錯誤:「I」命令不完整:@1" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "ATC 語法錯誤:未知命令:@1" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "鍋爐" + +#: advtrains/craft_items.lua:9 +msgid "driver's cab" +msgstr "駕駛室" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "車輪" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "煙囪" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "較低的@1月臺" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "較高的@1月臺" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "較高的@1月臺 (45°)" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "較低的@1月臺 (45°)" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate rail/bumper/signal/etc." +msgstr "" +"鐵路調整工具\n" +"\n" +"左鍵單擊:切換軌道型別\n" +"右鍵單擊:旋轉方塊" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker!" +msgstr "您不能使用鐵路調整工具旋轉這個方塊。" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated!" +msgstr "您不能旋轉這段軌道。" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker!" +msgstr "您不能使用鐵路調整工具調整這個方塊。" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed!" +msgstr "您不能調整這段軌道。" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "這是 @1 的車廂,您不能摧毀它。" + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty!" +msgstr "" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" +"警告:如果您摧毀此車廂,您只能拿到一些鋼方塊。如果您確定要摧毀這節車廂,請按" +"潛行鍵並左鍵單擊此車廂。" + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "顯示物品欄" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "車廂屬性" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "下車" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "強制下車" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "(車門已關閉)" + +#: advtrains/wagons.lua:712 +msgid "Can't get on: " +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "請選擇座位" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "儲存車廂屬性" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "車廂外部顯示" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "車廂內部顯示" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "火車線路" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "路由碼" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed! Use Sneak+rightclick to ignore the closed doors and get " +"off!" +msgstr "車門已關閉,請使用潛行+右鍵單擊下車。" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed!" +msgstr "您不能移除這段軌道。" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1斜坡" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place: not pointing at node" +msgstr "無法放置:您沒有選擇任何方塊。" + +#: advtrains/tracks.lua:658 +msgid "Can't place: space occupied!" +msgstr "無法放置:此區域已被佔用。" + +#: advtrains/tracks.lua:711 +msgid "Can't place: Not enough slope items left (@1 required)" +msgstr "無法放置:您沒有足夠的鐵路斜坡放置工具 (您總共需要@1個)" + +#: advtrains/tracks.lua:714 +msgid "Can't place: There's no slope of length @1" +msgstr "無法放置:advtrains 不支援長度為@1米的斜坡。" + +#: advtrains/tracks.lua:721 +msgid "Can't place: no supporting node at upper end." +msgstr "無法放置:較高階沒有支撐方塊。" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "臂木式號誌機" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "色燈號誌機" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (l)" +msgstr "壁掛式色燈號誌機 (左側)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (r)" +msgstr "壁掛式色燈號誌機 (右側)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (t)" +msgstr "懸掛式色燈號誌機" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "平交道號誌燈" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "鏈式連結器" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenberg 式連結器" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "您沒有「train_operator」許可權,不能連結這兩節車廂。" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"火車複製工具\n" +"\n" +"左鍵單擊:複製\n" +"右鍵單擊:粘帖" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "您沒有「@1」許可權。" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough!" +msgstr "軌道太短。" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "無法貼上:剪貼簿無法訪問元資料。" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "剪貼簿是空的。" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "火車後部不在軌道上。" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity!" +msgstr "您沒有指向一個可以用火車複製工具複製的物體。" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1" +msgstr "ID 為「@1」的車廂不存在。" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1" +msgstr "ID 為「@1」的列車不存在。" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "無法複製:剪貼簿無法訪問元資料。" + +#: advtrains/copytool.lua:180 +msgid "Train copied!" +msgstr "已複製" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "您沒有「train_operator」許可權,不能在鐵路附近建任何東西。" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "您沒有「train_operator」許可權,不能在這裡建造鐵路。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "這裡已被保護,您不能在這裡建造鐵路。" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "您沒有「railway_operator」許可權,不能控制鐵路設施。" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "車站碼" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "車站名稱" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "車門關閉時間" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "出發速度" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "軌道" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "停站時間" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:26 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"被動元件命名工具\n" +"\n" +"右鍵單擊命名所選元件" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "對稱道岔" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "三開道岔" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "垂直交叉軌道" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "交叉軌道 (其中一條軌道與座標軸平行)" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "交叉軌道" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "保險槓" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "ATC 控制器" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "卸貨軌道" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "裝貨軌道" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "探測軌道" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "右側司機座位" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "左側司機座位" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "工業用火車頭" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "大型工業用火車頭" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "液體運輸車廂" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "木材運輸車廂" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "日本火車連結器" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "司機座位" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "高速列車車頭" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "高速列車車廂" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "蒸汽機車" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "精細的蒸汽機車" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "客車" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "貨運車廂" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "地鐵車廂" + +#~ msgid "This position is protected!" +#~ msgstr "這裡已被保護。" + +#~ msgid "Can't place: protected position!" +#~ msgstr "無法放置:此區域已被保護。" + +#~ msgid "Deprecated Track" +#~ msgstr "請不要使用" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "無法上車:車門已關閉或車廂已滿。" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "請使用潛行+右鍵上車。" + +#~ msgid "Access to @1" +#~ msgstr "可前往@1" + +#~ msgid "" +#~ "ATC controller, mode @1\n" +#~ "Channel: @2" +#~ msgstr "" +#~ "ATC 控制器\n" +#~ "模式:@1\n" +#~ "頻道:@2" + +#~ msgid "Lock couples" +#~ msgstr "鎖定連結處" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "您必須至少擁有其中一節車廂才能分開這兩節車廂。" + +#~ msgid "Speed:" +#~ msgstr "速度" + +#~ msgid "Target:" +#~ msgstr "目標速度" + +#~ msgid "Default Seat" +#~ msgstr "預設座位" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "預設座位 (司機座位)" diff --git a/advtrains/protection.lua b/advtrains/protection.lua index 7474977..89e15eb 100644 --- a/advtrains/protection.lua +++ b/advtrains/protection.lua @@ -145,12 +145,12 @@ function advtrains.check_track_protection(pos, pname, near, prot_p) --atdebug("CTP: ",pos,pname,near,prot_p,"priv=",priv,"prot=",prot,"dprot=",dprot) if not priv and (not boo or prot or not dprot) then - minetest.chat_send_player(pname, "You are not allowed to build "..nears.."tracks without track_builder privilege") + minetest.chat_send_player(pname, near and attrans("You are not allowed to build near tracks without the track_builder privilege.") or attrans("You are not allowed to build tracks without the track_builder privilege.")) minetest.log("action", pname.." tried to modify terrain "..nears.."track at "..minetest.pos_to_string(apos).." but is not permitted to (no privilege)") return false end if prot then - minetest.chat_send_player(pname, "You are not allowed to build "..nears.."tracks at protected position!") + minetest.chat_send_player(pname, near and attrans("You are not allowed to build near tracks at this protected position.") or attrans("You are not allowed to build tracks at this protected position.")) minetest.record_protection_violation(pos, pname) minetest.log("action", pname.." tried to modify "..nears.."track at "..minetest.pos_to_string(apos).." but position is protected!") return false @@ -181,7 +181,7 @@ function advtrains.check_turnout_signal_protection(pos, pname) nocheck=false return true else - minetest.chat_send_player(pname, "You are not allowed to operate turnouts and signals (missing railway_operator privilege)") + minetest.chat_send_player(pname, attrans("You are not allowed to operate turnouts and signals without the railway_operator privilege.")) minetest.log("action", pname.." tried to operate turnout/signal at "..minetest.pos_to_string(pos).." but does not have railway_operator") nocheck=false return false diff --git a/advtrains/signals.lua b/advtrains/signals.lua index b26c950..74841d3 100644 --- a/advtrains/signals.lua +++ b/advtrains/signals.lua @@ -60,7 +60,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", tiles = {"advtrains_retrosignal.png"}, inventory_image="advtrains_retrosignal_inv.png", drop="advtrains:retrosignal_off", - description=attrans("Lampless Signal (@1)", attrans(r..rotation)), + description=attrans("Lampless Signal"), sunlight_propagates=true, groups = { cracky=3, @@ -124,7 +124,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", tiles = {"advtrains_signal_"..r..".png"}, inventory_image="advtrains_signal_inv.png", drop="advtrains:signal_off", - description=attrans("Signal (@1)", attrans(r..rotation)), + description=attrans("Signal"), groups = { cracky=3, not_blocking_trains=1, @@ -187,6 +187,11 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", if r=="off" then crea=0 end --tunnel signals. no rotations. + local swdesc = { -- needed for xgettext + l = attrans("Wallmounted Signal (l)"), + r = attrans("Wallmounted Signal (r)"), + t = attrans("Wallmounted Signal (t)"), + } for loc, sbox in pairs({l={-1/2, -1/2, -1/4, 0, 1/2, 1/4}, r={0, -1/2, -1/4, 1/2, 1/2, 1/4}, t={-1/2, 0, -1/4, 1/2, 1/2, 1/4}}) do minetest.register_node("advtrains:signal_wall_"..loc.."_"..r, { drawtype = "mesh", @@ -200,7 +205,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", mesh = "advtrains_signal_wall_"..loc..".b3d", tiles = {"advtrains_signal_wall_"..r..".png"}, drop="advtrains:signal_wall_"..loc.."_off", - description=attrans("Wallmounted Signal ("..loc..")"), + description=swdesc[loc], groups = { cracky=3, not_blocking_trains=1, @@ -314,7 +319,7 @@ minetest.register_node("advtrains:across_on", { mesh = "advtrains_across.obj", tiles = {{name="advtrains_across_anim.png", animation={type="vertical_frames", aspect_w=64, aspect_h=64, length=1.0}}}, drop="advtrains:across_off", - description=attrans("Andrew's Cross (on) (you hacker you)"), + description=attrans("Andrew's Cross"), groups = { cracky=3, not_blocking_trains=1, -- cgit v1.2.3 From eb0c5b78627505bcba409dc5f52dbb05891954c5 Mon Sep 17 00:00:00 2001 From: "Y. Wang" Date: Wed, 4 Oct 2023 22:14:18 +0200 Subject: Various translation improvements --- advtrains/atc.lua | 8 +- advtrains/copytool.lua | 10 +- advtrains/couple.lua | 4 +- advtrains/craft_items.lua | 2 +- advtrains/po/advtrains.pot | 632 +++++++++++++++++++++++ advtrains/po/de.po | 674 +++++++++++++++---------- advtrains/po/fr.po | 636 ++++++++++++++--------- advtrains/po/template.pot | 505 ------------------ advtrains/po/update-translations.sh | 14 +- advtrains/po/zh_CN.po | 604 +++++++++++++--------- advtrains/po/zh_TW.po | 604 +++++++++++++--------- advtrains/protection.lua | 8 +- advtrains/signals.lua | 6 +- advtrains/trackplacer.lua | 12 +- advtrains/tracks.lua | 14 +- advtrains/wagons.lua | 14 +- advtrains_interlocking/tsr_rail.lua | 12 +- advtrains_line_automation/stoprail.lua | 10 +- advtrains_luaautomation/active_common.lua | 20 +- advtrains_luaautomation/atc_rail.lua | 2 +- advtrains_luaautomation/init.lua | 6 +- advtrains_luaautomation/mesecon_controller.lua | 3 +- advtrains_luaautomation/operation_panel.lua | 3 +- advtrains_luaautomation/pcnaming.lua | 8 +- 24 files changed, 2255 insertions(+), 1556 deletions(-) create mode 100644 advtrains/po/advtrains.pot delete mode 100644 advtrains/po/template.pot (limited to 'advtrains/signals.lua') diff --git a/advtrains/atc.lua b/advtrains/atc.lua index c1ff218..b572cdc 100644 --- a/advtrains/atc.lua +++ b/advtrains/atc.lua @@ -106,7 +106,7 @@ local apn_func=function(pos) -- FIX for long-persisting ndb bug: there's no node in parameter 2 of this function! local meta=minetest.get_meta(pos) if meta then - meta:set_string("infotext", attrans("ATC controller, unconfigured.")) + meta:set_string("infotext", attrans("Unconfigured ATC controller")) meta:set_string("formspec", atc.get_atc_controller_formspec(pos, meta)) end end @@ -233,7 +233,7 @@ local matchptn={ advtrains.train_ensure_init(id, train) -- no one minds if this failed... this shouldn't even be called without train being initialized... else - atwarn(sid(id), attrans("ATC Reverse command warning: didn't reverse train, train moving!")) + atwarn(sid(id), attrans("ATC Reverse command warning: didn't reverse train, train moving.")) end return 1 end, @@ -245,11 +245,11 @@ local matchptn={ end, ["K"] = function(id, train) if train.door_open == 0 then - atwarn(sid(id), attrans("ATC Kick command warning: Doors closed")) + atwarn(sid(id), attrans("ATC Kick command warning: doors are closed.")) return 1 end if train.velocity > 0 then - atwarn(sid(id), attrans("ATC Kick command warning: Train moving")) + atwarn(sid(id), attrans("ATC Kick command warning: train moving.")) return 1 end local tp = train.trainparts diff --git a/advtrains/copytool.lua b/advtrains/copytool.lua index 7ad4330..ca5cae1 100644 --- a/advtrains/copytool.lua +++ b/advtrains/copytool.lua @@ -38,7 +38,7 @@ minetest.register_tool("advtrains:copytool", { local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, {default=true}) if not prevpos then - minetest.chat_send_player(pname, attrans("The track you are trying to place the wagon on is not long enough!")) + minetest.chat_send_player(pname, attrans("The track you are trying to place the wagon on is not long enough.")) return end @@ -89,19 +89,19 @@ minetest.register_tool("advtrains:copytool", { local le = pointed_thing.ref:get_luaentity() if (le == nil) then - minetest.chat_send_player(user:get_player_name(), attrans("No such lua entity!")) + minetest.chat_send_player(user:get_player_name(), attrans("No such lua entity.")) return end local wagon = advtrains.wagons[le.id] if (not (le.id and advtrains.wagons[le.id])) then - minetest.chat_send_player(user:get_player_name(), attrans("No such wagon: @1", le.id)) + minetest.chat_send_player(user:get_player_name(), attrans("No such wagon: @1.", le.id)) return end local train = advtrains.trains[wagon.train_id] if (not train) then - minetest.chat_send_player(user:get_player_name(), attrans("No such train: @1", wagon.train_id)) + minetest.chat_send_player(user:get_player_name(), attrans("No such train: @1.", wagon.train_id)) return end @@ -177,7 +177,7 @@ minetest.register_tool("advtrains:copytool", { return end meta:set_string("clipboard", minetest.serialize(clipboard)) - minetest.chat_send_player(user:get_player_name(), attrans("Train copied!")) + minetest.chat_send_player(user:get_player_name(), attrans("Train copied.")) return itemstack end }) diff --git a/advtrains/couple.lua b/advtrains/couple.lua index d82e193..9474dcf 100644 --- a/advtrains/couple.lua +++ b/advtrains/couple.lua @@ -335,11 +335,11 @@ function advtrains.check_matching_coupler_types(t1, t1_front, t2, t2_front) for typ,_ in pairs(t1_cplt) do table.insert(t1_cplhr, advtrains.coupler_types[typ] or typ) end - if #t1_cplhr==0 then t1_cplhr[1]=attrans("") end + if #t1_cplhr==0 then t1_cplhr[1]=attrans("") end for typ,_ in pairs(t2_cplt) do table.insert(t2_cplhr, advtrains.coupler_types[typ] or typ) end - if #t2_cplhr==0 then t2_cplhr[1]=attrans("") end + if #t2_cplhr==0 then t2_cplhr[1]=attrans("") end return false, attrans("Can not couple: The couplers of the trains do not match (@1 and @2).", table.concat(t1_cplhr, ","), table.concat(t2_cplhr, ",")) end diff --git a/advtrains/craft_items.lua b/advtrains/craft_items.lua index 0e693eb..1188b64 100644 --- a/advtrains/craft_items.lua +++ b/advtrains/craft_items.lua @@ -6,7 +6,7 @@ core.register_craftitem("advtrains:boiler", { core.register_craftitem("advtrains:driver_cab", { - description = attrans("driver's cab"), + description = attrans("Driver's cab"), inventory_image = "advtrains_driver_cab.png", }) diff --git a/advtrains/po/advtrains.pot b/advtrains/po/advtrains.pot new file mode 100644 index 0000000..6fda1d7 --- /dev/null +++ b/advtrains/po/advtrains.pot @@ -0,0 +1,632 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the advtrains package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: advtrains\n" +"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" +"POT-Creation-Date: 2023-10-09 11: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=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: advtrains/atc.lua:109 +msgid "Unconfigured ATC controller" +msgstr "" + +#: advtrains/atc.lua:150 +msgid "" +"ATC controller, mode @1\n" +"Command: @2" +msgstr "" + +#: advtrains/atc.lua:180 +msgid "Command" +msgstr "" + +#: advtrains/atc.lua:184 +msgid "Command (on)" +msgstr "" + +#: advtrains/atc.lua:187 +msgid "Digiline channel" +msgstr "" + +#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 +msgid "Save" +msgstr "" + +#: advtrains/atc.lua:236 +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "" + +#: advtrains/atc.lua:248 +msgid "ATC Kick command warning: doors are closed." +msgstr "" + +#: advtrains/atc.lua:252 +msgid "ATC Kick command warning: train moving." +msgstr "" + +#: advtrains/atc.lua:322 +msgid "ATC command syntax error: I statement not closed: @1" +msgstr "" + +#: advtrains/atc.lua:385 +msgid "ATC command parse error: Unknown command: @1" +msgstr "" + +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "" + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "" + +#: advtrains/craft_items.lua:3 +msgid "Boiler" +msgstr "" + +#: advtrains/craft_items.lua:9 +msgid "Driver's cab" +msgstr "" + +#: advtrains/craft_items.lua:15 +msgid "Wheel" +msgstr "" + +#: advtrains/craft_items.lua:21 +msgid "Chimney" +msgstr "" + +#: advtrains/misc_nodes.lua:16 +msgid "@1 Platform (low)" +msgstr "" + +#: advtrains/misc_nodes.lua:33 +msgid "@1 Platform (high)" +msgstr "" + +#: advtrains/misc_nodes.lua:59 +msgid "@1 Platform (45 degree)" +msgstr "" + +#: advtrains/misc_nodes.lua:81 +msgid "@1 Platform (low, 45 degree)" +msgstr "" + +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "" + +#: advtrains/trackplacer.lua:313 +msgid "" +"Track Worker Tool\n" +"\n" +"Left-click: change rail type (straight/curve/switch)\n" +"Right-click: rotate object" +msgstr "" + +#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 +msgid "This node can't be rotated using the trackworker." +msgstr "" + +#: advtrains/trackplacer.lua:350 +msgid "This track can not be rotated." +msgstr "" + +#: advtrains/trackplacer.lua:404 +msgid "This node can't be changed using the trackworker." +msgstr "" + +#: advtrains/trackplacer.lua:414 +msgid "This track can not be changed." +msgstr "" + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "" + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "" + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "" + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "" + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + +#: advtrains/wagons.lua:179 +msgid "This wagon is owned by @1, you can't destroy it." +msgstr "" + +#: advtrains/wagons.lua:203 +msgid "The wagon's inventory is not empty." +msgstr "" + +#: advtrains/wagons.lua:210 +msgid "Wagon needs to be decoupled from other wagons in order to destroy it." +msgstr "" + +#: advtrains/wagons.lua:216 +msgid "" +"Warning: If you destroy this wagon, you only get some steel back! If you are " +"sure, hold Sneak and left-click the wagon." +msgstr "" + +#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 +msgid "Show Inventory" +msgstr "" + +#: advtrains/wagons.lua:652 +msgid "Onboard Computer" +msgstr "" + +#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 +msgid "Wagon properties" +msgstr "" + +#: advtrains/wagons.lua:658 +msgid "Get off" +msgstr "" + +#: advtrains/wagons.lua:661 +msgid "Get off (forced)" +msgstr "" + +#: advtrains/wagons.lua:663 +msgid "(Doors closed)" +msgstr "" + +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "" + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "" + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "" + +#: advtrains/wagons.lua:712 +msgid "You can't get on this wagon." +msgstr "" + +#: advtrains/wagons.lua:838 +msgid "Select seat:" +msgstr "" + +#: advtrains/wagons.lua:880 +msgid "Save wagon properties" +msgstr "" + +#: advtrains/wagons.lua:965 +msgid "Text displayed outside on train" +msgstr "" + +#: advtrains/wagons.lua:966 +msgid "Text displayed inside train" +msgstr "" + +#: advtrains/wagons.lua:967 +msgid "Line" +msgstr "" + +#: advtrains/wagons.lua:968 +msgid "Routingcode" +msgstr "" + +#: advtrains/wagons.lua:1241 +msgid "" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." +msgstr "" + +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "" + +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:54 +msgid "Station Code" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:55 +msgid "Station Name" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:56 +msgid "Door Delay" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:57 +msgid "Dep. Speed" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 +#: advtrains_train_track/init.lua:156 +msgid "Track" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:59 +msgid "Stop Time" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:60 +msgid "Door Side" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:62 +msgid "Reverse train" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:63 +msgid "Kick out passengers" +msgstr "" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" + +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "" + +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" + +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" + +#: advtrains_train_industrial/init.lua:10 +#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 +#: advtrains_train_steam/init.lua:91 +msgid "Driver Stand (right)" +msgstr "" + +#: advtrains_train_industrial/init.lua:17 +#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 +#: advtrains_train_steam/init.lua:85 +msgid "Driver Stand (left)" +msgstr "" + +#: advtrains_train_industrial/init.lua:40 +msgid "Industrial Train Engine" +msgstr "" + +#: advtrains_train_industrial/init.lua:79 +msgid "Big Industrial Train Engine" +msgstr "" + +#: advtrains_train_industrial/init.lua:98 +msgid "Industrial tank wagon" +msgstr "" + +#: advtrains_train_industrial/init.lua:116 +msgid "Industrial wood wagon" +msgstr "" + +#: advtrains_train_japan/init.lua:4 +msgid "Japanese Train Inter-Wagon Connection" +msgstr "" + +#: advtrains_train_japan/init.lua:37 +msgid "Driver stand" +msgstr "" + +#: advtrains_train_japan/init.lua:101 +msgid "Japanese Train Engine" +msgstr "" + +#: advtrains_train_japan/init.lua:176 +msgid "Japanese Train Wagon" +msgstr "" + +#: advtrains_train_steam/init.lua:75 +msgid "Steam Engine" +msgstr "" + +#: advtrains_train_steam/init.lua:159 +msgid "Detailed Steam Engine" +msgstr "" + +#: advtrains_train_steam/init.lua:206 +msgid "Passenger Wagon" +msgstr "" + +#: advtrains_train_steam/init.lua:226 +msgid "Box Wagon" +msgstr "" + +#: advtrains_train_subway/init.lua:144 +msgid "Subway Passenger Wagon" +msgstr "" + +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "" + +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "" + +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "" + +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "" diff --git a/advtrains/po/de.po b/advtrains/po/de.po index ebd6339..8821fe3 100644 --- a/advtrains/po/de.po +++ b/advtrains/po/de.po @@ -2,18 +2,19 @@ msgid "" msgstr "" "Project-Id-Version: advtrains\n" "Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" -"POT-Creation-Date: 2023-10-04 15:40+0200\n" -"PO-Revision-Date: 2022-11-02 15:08+0100\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2023-10-09 11:18+0200\n" "Last-Translator: Y. Wang \n" "Language-Team: German\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" #: advtrains/atc.lua:109 -msgid "ATC controller, unconfigured." -msgstr "Nicht konfiguierte Zugbeeinflussungsgleis" +msgid "Unconfigured ATC controller" +msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis" #: advtrains/atc.lua:150 msgid "" @@ -36,21 +37,27 @@ msgid "Digiline channel" msgstr "Digiline-Kanal" #: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 msgid "Save" msgstr "Speichern" #: advtrains/atc.lua:236 -msgid "ATC Reverse command warning: didn't reverse train, train moving!" +msgid "ATC Reverse command warning: didn't reverse train, train moving." msgstr "" -"Zugbeeinflussung: der Befehl „R“ wurde nicht ausgeführt, Zug in Bewegung!" +"Zugbeeinflussung: Der Zug befindet sich in Bewegung und kann nicht umgekehrt " +"werden." #: advtrains/atc.lua:248 -msgid "ATC Kick command warning: Doors closed" +msgid "ATC Kick command warning: doors are closed." msgstr "" +"Zugbeeinflussung: Wegen geschlossener Türen werden Fahrgäste nicht zum " +"Ausstieg gezwungen." #: advtrains/atc.lua:252 -msgid "ATC Kick command warning: Train moving" +msgid "ATC Kick command warning: train moving." msgstr "" +"Zugbeeinflussung: Der Zug befindet sich in Bewegung, Fahrgäste werden nicht " +"zum Ausstieg gezwungen." #: advtrains/atc.lua:322 msgid "ATC command syntax error: I statement not closed: @1" @@ -60,13 +67,92 @@ msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1" msgid "ATC command parse error: Unknown command: @1" msgstr "Zugbeeinflussung: Unbekannter Befehl: @1" +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"Werkzeug zur Erstellung von Zugkopien\n" +"\n" +"Linksklick: Zug ins Clipboard kopieren\n" +"Right-click: Kopierten Zug einfügen" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "Ihnen fehlt das „@1“-Privileg." + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "Das Gleis, auf dem der Waggon platziert werden woll, ist zu kurz." + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "" +"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte eine Kopie des " +"Zuges nicht eingefügt werden." + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "Das Clipboard ist leer." + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "Der hinterer Teil dez Zuges wäre nicht auf dem Gleis." + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "" +"Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden " +"kann." + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon." + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug." + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "" +"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug nicht " +"kopiert werden." + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "Der Zug wurde Kopiert." + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "Schraubenkupplung" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenbergkupplung" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "Sie dürfen ohne das „train_operator“-Privileg keine Züge ankuppeln." + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "Die Kupplungen der Züge passen nicht zueinander (@1 und @2)." + #: advtrains/craft_items.lua:3 msgid "Boiler" msgstr "" #: advtrains/craft_items.lua:9 -msgid "driver's cab" -msgstr "" +msgid "Driver's cab" +msgstr "Führerstand" #: advtrains/craft_items.lua:15 msgid "Wheel" @@ -92,44 +178,164 @@ msgstr "Hoher @1-Bahnsteig (45°)" msgid "@1 Platform (low, 45 degree)" msgstr "Niedriger @1-Bahnsteig (45°)" +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" +"Sie dürfen ohne das „track_builder“-Privileg nicht in der Nähe von Gleisen " +"bauen." + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "Sie dürfen ohne das „track_builder“-Privileg kein Gleis bauen." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "Sie dürfen an geschützten Stellen nicht in der Nähe von Gleisen bauen." + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen." + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" +"Sie dürfen ohne das „railway_operator“-Privileg keine Bahnanlage operieren." + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "Mechanisches Signal" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "Lichtsignal" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "An der linken Seite montiertes Signal" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "An der rechten Seite montiertes Signal" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "An der Decke montiertes Signal" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "Andreaskreuz" + #: advtrains/trackplacer.lua:313 msgid "" "Track Worker Tool\n" "\n" "Left-click: change rail type (straight/curve/switch)\n" -"Right-click: rotate rail/bumper/signal/etc." +"Right-click: rotate object" msgstr "" "Gleiswerkzeug\n" "\n" -"Linksklick: Gleistyp ändern, Rechtsklick: Objekt drehen." +"Linksklick: Gleistyp ändern\n" +"Rechtsklick: Objekt drehen" #: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 -msgid "This node can't be rotated using the trackworker!" +msgid "This node can't be rotated using the trackworker." msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden." #: advtrains/trackplacer.lua:350 -msgid "This track can not be rotated!" -msgstr "Dieses Gleis kann nicht gedreht werden!" +msgid "This track can not be rotated." +msgstr "Dieses Gleis kann nicht gedreht werden." #: advtrains/trackplacer.lua:404 -msgid "This node can't be changed using the trackworker!" +msgid "This node can't be changed using the trackworker." msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden." #: advtrains/trackplacer.lua:414 -msgid "This track can not be changed!" -msgstr "Dieses Gleis kann nicht geändert werden!" +msgid "This track can not be changed." +msgstr "Dieses Gleis kann nicht geändert werden." + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "Dieses Gleis kann nicht entfernt werden." + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "Ein Zug steht an dieser Position." + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)." + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "Hier ist ein Signal-Beeinflussungspunkt." + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1 Steigung" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block." + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "Es kann nicht platziert werden: Diese Position ist besetzt." + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "" +"Es kann nicht platziert werden: Sie haben nicht genug Steigungsblöcke, es " +"werden insgesamt @1 benötigt." + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "" +"Es kann nicht platziert werden: die Steigung der Länge @1 ist nicht " +"definiert." + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "" +"Es kann nicht platziert werden: es gibt keinen unterstützenden Block am Ende " +"der Steigung." + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" #: advtrains/wagons.lua:179 msgid "This wagon is owned by @1, you can't destroy it." msgstr "Dieser Waggon gehört @1, Sie dürfen ihn nicht abbauen." #: advtrains/wagons.lua:203 -msgid "The wagon's inventory is not empty!" -msgstr "Das Inventar dieses Waggons ist nicht leer!" +msgid "The wagon's inventory is not empty." +msgstr "Das Inventar dieses Waggons ist nicht leer." #: advtrains/wagons.lua:210 msgid "Wagon needs to be decoupled from other wagons in order to destroy it." -msgstr "" +msgstr "Der Waggon muss abgekoppelt sein, damit Sie ihn abbauen können." #: advtrains/wagons.lua:216 msgid "" @@ -163,9 +369,21 @@ msgstr "Ausstieg zwingen" msgid "(Doors closed)" msgstr "(Türen geschlossen)" +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "In diesem Waggon ist kein Sitzplatz vorhanden." + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "Der Waggon ist voll." + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "Die Türen sind geschlossen." + #: advtrains/wagons.lua:712 -msgid "Can't get on: " -msgstr "" +msgid "You can't get on this wagon." +msgstr "Sie können nicht in diesen Waggon einsteigen." #: advtrains/wagons.lua:838 msgid "Select seat:" @@ -193,195 +411,41 @@ msgstr "" #: advtrains/wagons.lua:1241 msgid "" -"Doors are closed! Use Sneak+rightclick to ignore the closed doors and get " -"off!" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." msgstr "" "Die Türen sind geschlossen. Nutzen Sie Schleichen+Rechtsklick, um trotz " "geschlossener Türen auszusteigen." -#: advtrains/trainhud.lua:305 -msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." -msgstr "" - -#: advtrains/tracks.lua:449 -msgid "This track can not be removed!" -msgstr "Dieses Gleis kann nicht entfernt werden!" - -#: advtrains/tracks.lua:616 -msgid "Position is occupied by a train." -msgstr "Ein Zug steht an dieser Position." - -#: advtrains/tracks.lua:622 -msgid "There's a Track Circuit Break here." -msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)." - -#: advtrains/tracks.lua:626 -msgid "There's a Signal Influence Point here." -msgstr "Hier ist ein Signal-Beeinflussungspunkt." - -#: advtrains/tracks.lua:637 -msgid "@1 Slope" -msgstr "@1 Steigung" - -#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 -msgid "Can't place: not pointing at node" -msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block." - -#: advtrains/tracks.lua:658 -msgid "Can't place: space occupied!" -msgstr "Es kann nicht platziert werden: diese Position ist besetzt." - -#: advtrains/tracks.lua:711 -msgid "Can't place: Not enough slope items left (@1 required)" -msgstr "" -"Es kann nicht platziert werden: Sie haben nicht genug Steigungsblöcke, es " -"werden insgesamt @1 benötigt." - -#: advtrains/tracks.lua:714 -msgid "Can't place: There's no slope of length @1" -msgstr "" -"Es kann nicht platziert werden: die Steigung der Länge @1 ist nicht " -"definiert." - -#: advtrains/tracks.lua:721 -msgid "Can't place: no supporting node at upper end." -msgstr "" -"Es kann nicht platziert werden: es gibt keinen unterstützenden Block am Ende " -"der Steigung." - -#: advtrains/signals.lua:63 -msgid "Lampless Signal" -msgstr "Mechanisches Signal" - -#: advtrains/signals.lua:127 -msgid "Signal" -msgstr "Lichtsignal" - -#: advtrains/signals.lua:191 -msgid "Wallmounted Signal (l)" -msgstr "An der linken Seite montiertes Signal" - -#: advtrains/signals.lua:192 -msgid "Wallmounted Signal (r)" -msgstr "An der rechten Seite montiertes Signal" - -#: advtrains/signals.lua:193 -msgid "Wallmounted Signal (t)" -msgstr "An der Decke montiertes Signal" - -#: advtrains/signals.lua:281 advtrains/signals.lua:322 -msgid "Andrew's Cross" -msgstr "" - -#: advtrains/couple.lua:28 -msgid "Buffer and Chain Coupler" -msgstr "Schraubenkupplung" - -#: advtrains/couple.lua:29 -msgid "Scharfenberg Coupler" -msgstr "Scharfenbergkupplung" - -#: advtrains/couple.lua:185 -msgid "" -"You are not allowed to couple trains without the train_operator privilege." -msgstr "Sie dürfen ohne das „train_builder“-Privileg keine Züge ankuppeln." - -#: advtrains/couple.lua:329 advtrains/couple.lua:333 -msgid "" -msgstr "" - -#: advtrains/couple.lua:334 -msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." -msgstr "Die Kupplungen der Züge passen nicht zueinander (@1 und @2)." - -#: advtrains/copytool.lua:8 -msgid "" -"Train copy/paste tool\n" -"\n" -"Left-click: copy train\n" -"Right-click: paste train" -msgstr "" -"Werkzeug zur Erstellung von Zugkopien\n" -"\n" -"Linksklick: Zug ins Clipboard kopieren\n" -"Right-click: Kopierten Zug einfügen" - -#: advtrains/copytool.lua:29 -msgid "You do not have the @1 privilege." -msgstr "Ihnen fehlt das „@1“-Privileg." - -#: advtrains/copytool.lua:41 -msgid "The track you are trying to place the wagon on is not long enough!" -msgstr "Das Gleis, auf dem der Waggon platziert werden woll, ist zu kurz." - -#: advtrains/copytool.lua:47 -msgid "The clipboard couldn't access the metadata. Paste failed." -msgstr "" -"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte eine Kopie des " -"Zuges nicht eingefügt werden." - -#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 -msgid "The clipboard is empty." -msgstr "Das Clipboard ist leer." - -#: advtrains/copytool.lua:74 -msgid "Back of train would end up off track, cancelling." -msgstr "Der hinterer Teil dez Zuges wäre nicht auf dem Gleis." - -#: advtrains/copytool.lua:92 -msgid "No such lua entity!" -msgstr "" -"Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden " -"kann." - -#: advtrains/copytool.lua:98 -msgid "No such wagon: @1" -msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon." - -#: advtrains/copytool.lua:104 -msgid "No such train: @1" -msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug." - -#: advtrains/copytool.lua:176 -msgid "The clipboard couldn't access the metadata. Copy failed." -msgstr "" -"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug nicht " -"kopiert werden." +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." +msgstr "Sie haben keinen Zugang zum Führerstand." -#: advtrains/copytool.lua:180 -msgid "Train copied!" -msgstr "Der Zug wurde Kopiert." +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" +msgstr "Geschwindigkeitskontrolle: @1" -#: advtrains/protection.lua:148 -msgid "" -"You are not allowed to build near tracks without the track_builder privilege." +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" msgstr "" -"Sie dürfen ohne das „track_builder“-Privileg nicht in der Nähe von Gleisen " -"bauen." -#: advtrains/protection.lua:148 -msgid "" -"You are not allowed to build tracks without the track_builder privilege." -msgstr "Sie dürfen ohne das „track_builder“-Privileg kein Gleis bauen." +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "Sie dürfen ohne das „@1“-Privileg dieses Gleis nicht konfigurieren." -#: advtrains/protection.lua:153 -msgid "You are not allowed to build near tracks at this protected position." -msgstr "Sie dürfen an geschützten Stellen nicht in der Nähe von Gleisen bauen." +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "Sie dürfen dieses Gleis nicht konfigurieren." -#: advtrains/protection.lua:153 -msgid "You are not allowed to build tracks at this protected position." -msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen." - -#: advtrains/protection.lua:184 -msgid "" -"You are not allowed to operate turnouts and signals without the " -"railway_operator privilege." -msgstr "" -"Sie dürfen ohne das „railway_operator“-Privileg keine Bahnanlage operieren." +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" +msgstr "Geschwindigkeitskontrollgleis" #: advtrains_line_automation/stoprail.lua:54 msgid "Station Code" -msgstr "Code der Haltestelle" +msgstr "Kennzeichen der Haltestelle" #: advtrains_line_automation/stoprail.lua:55 msgid "Station Name" @@ -406,65 +470,101 @@ msgstr "Wartezeit" #: advtrains_line_automation/stoprail.lua:60 msgid "Door Side" -msgstr "" +msgstr "Türseite" #: advtrains_line_automation/stoprail.lua:62 msgid "Reverse train" -msgstr "" +msgstr "Zug Umkehren" #: advtrains_line_automation/stoprail.lua:63 msgid "Kick out passengers" +msgstr "Fahrgäste zum Ausstieg zwingen" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." msgstr "" +"Die Haltestelle mit dem Kennzeichen „@1“ ist bereits vorhanden und wird von " +"@2 verwaltet." -#: advtrains_luaautomation/pcnaming.lua:26 -msgid "" -"Passive Component Naming Tool\n" -"\n" -"Right-click to name a passive component." +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." msgstr "" -"PC-Benennungswerkzeug\n" -"\n" -"Rechtsklick zur Benennung der passiven Komponente" +"Diese Haltestelle wird von @1 verwaltet. Sie dürfen sie nicht umbenennen." -#: advtrains_train_track/init.lua:31 -msgid "Y-turnout" -msgstr "Y-Weiche" +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "Gleis zur Kennzeichnung einer Haltestelle" -#: advtrains_train_track/init.lua:49 -msgid "3-way turnout" -msgstr "Dreiwegweiche" +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "Nicht konfiguierter LuaATC-Bauteil" -#: advtrains_train_track/init.lua:69 -msgid "Perpendicular Diamond Crossing Track" -msgstr "Kreuzung mit zueinander orthogonalen Gleisen" +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" -#: advtrains_train_track/init.lua:91 -msgid "90+Angle Diamond Crossing Track" -msgstr "Kreuzung mit einem achsenparallelen Gleis" +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" -#: advtrains_train_track/init.lua:132 -msgid "Diagonal Diamond Crossing Track" -msgstr "Diagonale Gleiskreuzung" +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" -#: advtrains_train_track/init.lua:179 -msgid "Bumper" -msgstr "Prellbock" +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "" +"Sie dürfen ohne das „@1“-Privileg diesen LuaATC-Bauteil nicht konfigurieren." -#: advtrains_train_track/init.lua:201 -msgid "ATC controller" -msgstr "Zugbeeinflussungsgleis" +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" -#: advtrains_train_track/init.lua:317 -msgid "Unloading Track" -msgstr "Abladungsgleis" +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" -#: advtrains_train_track/init.lua:342 -msgid "Loading Track" -msgstr "Beladungsgleis" +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "LuaATC-Bauteil mit Fehlermeldung: @1" -#: advtrains_train_track/init.lua:406 -msgid "Detector Rail" -msgstr "Detektorgleis" +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" +"Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche " +"Programme ausführen)" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"PC-Benennungswerkzeug\n" +"\n" +"Rechtsklick zur Benennung der passiven Komponente." + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "Sie dürfen ohne das „@1“ keinen passiven LuaATC-Bauteil benennen." + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" #: advtrains_train_industrial/init.lua:10 #: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 @@ -516,7 +616,7 @@ msgstr "Dampflokomotive" #: advtrains_train_steam/init.lua:159 msgid "Detailed Steam Engine" -msgstr "detaillierte Dampflokomotive" +msgstr "Detaillierte Dampflokomotive" #: advtrains_train_steam/init.lua:206 msgid "Passenger Wagon" @@ -530,27 +630,45 @@ msgstr "Güterwaggon" msgid "Subway Passenger Wagon" msgstr "U-Bahn-Waggon" -#~ msgid "This position is protected!" -#~ msgstr "Diese Position ist geschützt!" +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "Y-Weiche" -#~ msgid "Can't place: protected position!" -#~ msgstr "Es kann nicht platziert werden: diese Position ist geschützt." +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "Dreiwegweiche" -#~ msgid "Deprecated Track" -#~ msgstr "ausrangiertes Gleis, nicht verwenden." +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "Kreuzung mit zueinander orthogonalen Gleisen" -#~ msgid "Can't get on: wagon full or doors closed!" -#~ msgstr "" -#~ "Sie können nicht einsteigen: der Waggon ist voll oder die Türen sind " -#~ "geschlossen." +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "Kreuzung mit einem achsenparallelen Gleis" -#~ msgid "Use Sneak+rightclick to bypass closed doors!" -#~ msgstr "" -#~ "Nutzen Sie Schleichen+Rechtsklick, um trotz geschlossener Türen " -#~ "einzusteigen." +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "Diagonale Gleiskreuzung" -#~ msgid "Access to @1" -#~ msgstr "Zugang zu @1" +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "Prellbock" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "Zugbeeinflussungsgleis" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "Abladungsgleis" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "Beladungsgleis" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "Detektorgleis" #~ msgid "" #~ "ATC controller, mode @1\n" @@ -559,13 +677,28 @@ msgstr "U-Bahn-Waggon" #~ "Zugbeeinflussungsgleis in Betriebsart „@1“\n" #~ "Kanal: @2" -#~ msgid "Lock couples" -#~ msgstr "Kupplungen sperren" +#~ msgid "Access to @1" +#~ msgstr "Zugang zu @1" -#~ msgid "" -#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgid "Can't get on: wagon full or doors closed!" #~ msgstr "" -#~ "Sie müssen Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln." +#~ "Sie können nicht einsteigen: der Waggon ist voll oder die Türen sind " +#~ "geschlossen." + +#~ msgid "Can't place: protected position!" +#~ msgstr "Es kann nicht platziert werden: diese Position ist geschützt." + +#~ msgid "Default Seat" +#~ msgstr "Standardsitzplatz" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "Standardsitzplatz (Führerstand)" + +#~ msgid "Deprecated Track" +#~ msgstr "ausrangiertes Gleis, nicht verwenden." + +#~ msgid "Lock couples" +#~ msgstr "Kupplungen sperren" #~ msgid "Speed:" #~ msgstr "Geschw.:" @@ -573,8 +706,19 @@ msgstr "U-Bahn-Waggon" #~ msgid "Target:" #~ msgstr "Zielges.:" -#~ msgid "Default Seat" -#~ msgstr "Standardsitzplatz" +#~ msgid "This position is protected!" +#~ msgstr "Diese Position ist geschützt!" -#~ msgid "Default Seat (driver stand)" -#~ msgstr "Standardsitzplatz (Führerstand)" +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "" +#~ "Nutzen Sie Schleichen+Rechtsklick, um trotz geschlossener Türen " +#~ "einzusteigen." + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen." + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "" +#~ "Sie müssen Besitzer eines angrenzenden Waggons sein, um hier abzukuppeln." diff --git a/advtrains/po/fr.po b/advtrains/po/fr.po index 9a16799..3cb68b0 100644 --- a/advtrains/po/fr.po +++ b/advtrains/po/fr.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: advtrains\n" "Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" -"POT-Creation-Date: 2023-10-04 15:40+0200\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" "PO-Revision-Date: 2022-07-05 10:11+0200\n" "Last-Translator: Tanavit \n" "Language-Team: French\n" @@ -12,7 +12,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #: advtrains/atc.lua:109 -msgid "ATC controller, unconfigured." +msgid "Unconfigured ATC controller" msgstr "Controlleur ATC, non-configuré " #: advtrains/atc.lua:150 @@ -36,20 +36,22 @@ msgid "Digiline channel" msgstr "Canal Digiline" #: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 msgid "Save" msgstr "Sauvegarder" #: advtrains/atc.lua:236 -msgid "ATC Reverse command warning: didn't reverse train, train moving!" +#, fuzzy +msgid "ATC Reverse command warning: didn't reverse train, train moving." msgstr "" "Attention : Commande ATC de renversement impossible car le train se déplace !" #: advtrains/atc.lua:248 -msgid "ATC Kick command warning: Doors closed" +msgid "ATC Kick command warning: doors are closed." msgstr "" #: advtrains/atc.lua:252 -msgid "ATC Kick command warning: Train moving" +msgid "ATC Kick command warning: train moving." msgstr "" #: advtrains/atc.lua:322 @@ -60,12 +62,89 @@ msgstr "Erreur de syntaxe de commande ATC : instruction \"I\" incomplète : @1" msgid "ATC command parse error: Unknown command: @1" msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1" +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"Outil de copie/collage de train\n" +"\n" +"Clic-Gauche : copie\n" +"\n" +"Clic-Droit : collage" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "Vous ne possédez pas le privilège \"@1\"." + +#: advtrains/copytool.lua:41 +#, fuzzy +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "La voie sur laquelle vous tentez de placer le wagon est trop courte !" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec du collage." + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "Le presse-papier est vide." + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "La fin du train serait hors voie : annulation." + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "Pas de telle entité lua." + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "Pas de tel wagon : @1." + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "Pas de tel train : @1." + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec de la copie." + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "Train copié." + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "Attelage à tampon et vis" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Attelage Scharfenberg" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "" +"Accouplement impossible: les attelages des trains ne concordent pas (@1 et " +"@2)." + #: advtrains/craft_items.lua:3 msgid "Boiler" msgstr "Chaudière à vapeur" #: advtrains/craft_items.lua:9 -msgid "driver's cab" +msgid "Driver's cab" msgstr "Cabine de pilotage" #: advtrains/craft_items.lua:15 @@ -92,12 +171,86 @@ msgstr "Quai @1 (haut, 45°)" msgid "@1 Platform (low, 45 degree)" msgstr "Quai @1 (bas, 45°)" +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "" +"Vous ne pouvez pas construire à proximité d'une voie sans le privilège " +"\"track_builder\" (?)" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "" +"Vous ne pouvez pas construire une voie sans le privilège \"track_builder\"" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "" +"Vous ne pouvez pas construire à proximité d'une voie à cet emplacement " +"protégé" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "" +"Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège " +"\"railway_operator\" manquant)" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "Sémaphore" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "Signal mural (gauche)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "Signal mural (droit)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "Signal mural (plafond)" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "Croix de Saint André" + #: advtrains/trackplacer.lua:313 +#, fuzzy msgid "" "Track Worker Tool\n" "\n" "Left-click: change rail type (straight/curve/switch)\n" -"Right-click: rotate rail/bumper/signal/etc." +"Right-click: rotate object" msgstr "" "Outil \"Trackworker\"\n" "\n" @@ -106,28 +259,80 @@ msgstr "" "Clic-Droit : tourne le rail/butoir/signal/etc..." #: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 -msgid "This node can't be rotated using the trackworker!" +#, fuzzy +msgid "This node can't be rotated using the trackworker." msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !" #: advtrains/trackplacer.lua:350 -msgid "This track can not be rotated!" -msgstr "Cette voie ne peut pas être tournée !" +msgid "This track can not be rotated." +msgstr "Cette voie ne peut pas être tournée." #: advtrains/trackplacer.lua:404 -msgid "This node can't be changed using the trackworker!" +#, fuzzy +msgid "This node can't be changed using the trackworker." msgstr "Ce nœud ne peut être modifié avec l'outil \"Trackworker\" !" #: advtrains/trackplacer.lua:414 -msgid "This track can not be changed!" -msgstr "Cette voie ne peut pas être modifiée !" +msgid "This track can not be changed." +msgstr "Cette voie ne peut pas être modifiée." + +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "Cette voie ne peut pas être enlevée." + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "Cet emplacement est occupé par un train." + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "Il y a un \"Track Circuit Break\" ici." + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "Il y a un \"Signal Influence Point\" ici." + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "Pente @1" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +#, fuzzy +msgid "Can't place slope: not pointing at node." +msgstr "Placement impossible : ne pointe pas un nœud" + +#: advtrains/tracks.lua:658 +#, fuzzy +msgid "Can't place slope: space occupied." +msgstr "Placement impossible : espace occupé" + +#: advtrains/tracks.lua:711 +#, fuzzy +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "" +"Placement impossible : quantité insuffisante de voie pentue (@1 manquant)" + +#: advtrains/tracks.lua:714 +#, fuzzy +msgid "Can't place slope: There's no slope of length @1." +msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1" + +#: advtrains/tracks.lua:721 +#, fuzzy +msgid "Can't place slope: no supporting node at upper end." +msgstr "Placement impossible : pas de nœud d'appui à l'extrémité supérieure" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" #: advtrains/wagons.lua:179 msgid "This wagon is owned by @1, you can't destroy it." msgstr "Ce wagon est la propriété de @1, vous ne pouvez pas le détruire." #: advtrains/wagons.lua:203 -msgid "The wagon's inventory is not empty!" -msgstr "Le stock de ce wagon n'est pas vide !" +msgid "The wagon's inventory is not empty." +msgstr "Le stock de ce wagon n'est pas vide." #: advtrains/wagons.lua:210 msgid "Wagon needs to be decoupled from other wagons in order to destroy it." @@ -166,8 +371,20 @@ msgstr "Débarquer (de force)" msgid "(Doors closed)" msgstr "(Portes closes)" +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "" + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "" + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "" + #: advtrains/wagons.lua:712 -msgid "Can't get on: " +msgid "You can't get on this wagon." msgstr "" #: advtrains/wagons.lua:838 @@ -195,188 +412,39 @@ msgid "Routingcode" msgstr "Code de routage" #: advtrains/wagons.lua:1241 +#, fuzzy msgid "" -"Doors are closed! Use Sneak+rightclick to ignore the closed doors and get " -"off!" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." msgstr "" "Portes closes ! Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour " "franchir les portes et débarquer !" -#: advtrains/trainhud.lua:305 -msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." -msgstr "" - -#: advtrains/tracks.lua:449 -msgid "This track can not be removed!" -msgstr "Cette voie ne peut pas être enlevée !" - -#: advtrains/tracks.lua:616 -msgid "Position is occupied by a train." -msgstr "Cet emplacement est occupé par un train." - -#: advtrains/tracks.lua:622 -msgid "There's a Track Circuit Break here." -msgstr "Il y a un \"Track Circuit Break\" ici." - -#: advtrains/tracks.lua:626 -msgid "There's a Signal Influence Point here." -msgstr "Il y a un \"Signal Influence Point\" ici." - -#: advtrains/tracks.lua:637 -msgid "@1 Slope" -msgstr "Pente @1" - -#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 -msgid "Can't place: not pointing at node" -msgstr "Placement impossible : ne pointe pas un nœud" - -#: advtrains/tracks.lua:658 -msgid "Can't place: space occupied!" -msgstr "Placement impossible : espace occupé" - -#: advtrains/tracks.lua:711 -msgid "Can't place: Not enough slope items left (@1 required)" -msgstr "" -"Placement impossible : quantité insuffisante de voie pentue (@1 manquant)" - -#: advtrains/tracks.lua:714 -msgid "Can't place: There's no slope of length @1" -msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1" - -#: advtrains/tracks.lua:721 -msgid "Can't place: no supporting node at upper end." -msgstr "Placement impossible : pas de nœud d'appui à l'extrémité supérieure" - -#: advtrains/signals.lua:63 -msgid "Lampless Signal" -msgstr "Sémaphore" - -#: advtrains/signals.lua:127 -msgid "Signal" -msgstr "" - -#: advtrains/signals.lua:191 -msgid "Wallmounted Signal (l)" -msgstr "Signal mural (gauche)" - -#: advtrains/signals.lua:192 -msgid "Wallmounted Signal (r)" -msgstr "Signal mural (droit)" - -#: advtrains/signals.lua:193 -msgid "Wallmounted Signal (t)" -msgstr "Signal mural (plafond)" - -#: advtrains/signals.lua:281 advtrains/signals.lua:322 -msgid "Andrew's Cross" -msgstr "Croix de Saint André" - -#: advtrains/couple.lua:28 -msgid "Buffer and Chain Coupler" -msgstr "Attelage à tampon et vis" - -#: advtrains/couple.lua:29 -msgid "Scharfenberg Coupler" -msgstr "Attelage Scharfenberg" - -#: advtrains/couple.lua:185 -msgid "" -"You are not allowed to couple trains without the train_operator privilege." +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." msgstr "" -#: advtrains/couple.lua:329 advtrains/couple.lua:333 -msgid "" +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" msgstr "" -#: advtrains/couple.lua:334 -msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" msgstr "" -"Accouplement impossible: les attelages des trains ne concordent pas (@1 et " -"@2)." -#: advtrains/copytool.lua:8 -msgid "" -"Train copy/paste tool\n" -"\n" -"Left-click: copy train\n" -"Right-click: paste train" +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." msgstr "" -"Outil de copie/collage de train\n" -"\n" -"Clic-Gauche : copie\n" -"\n" -"Clic-Droit : collage" - -#: advtrains/copytool.lua:29 -msgid "You do not have the @1 privilege." -msgstr "Vous ne possédez pas le privilège \"@1\"." - -#: advtrains/copytool.lua:41 -msgid "The track you are trying to place the wagon on is not long enough!" -msgstr "La voie sur laquelle vous tentez de placer le wagon est trop courte !" - -#: advtrains/copytool.lua:47 -msgid "The clipboard couldn't access the metadata. Paste failed." -msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec du collage." -#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 -msgid "The clipboard is empty." -msgstr "Le presse-papier est vide." - -#: advtrains/copytool.lua:74 -msgid "Back of train would end up off track, cancelling." -msgstr "La fin du train serait hors voie : annulation." - -#: advtrains/copytool.lua:92 -msgid "No such lua entity!" -msgstr "Pas de telle entité lua !" - -#: advtrains/copytool.lua:98 -msgid "No such wagon: @1" -msgstr "Pas de tel wagon : @1" - -#: advtrains/copytool.lua:104 -msgid "No such train: @1" -msgstr "Pas de tel train : @1" - -#: advtrains/copytool.lua:176 -msgid "The clipboard couldn't access the metadata. Copy failed." -msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec de la copie." - -#: advtrains/copytool.lua:180 -msgid "Train copied!" -msgstr "Train copié !" - -#: advtrains/protection.lua:148 -msgid "" -"You are not allowed to build near tracks without the track_builder privilege." +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." msgstr "" -"Vous ne pouvez pas construire à proximité d'une voie sans le privilège " -"\"track_builder\" (?)" -#: advtrains/protection.lua:148 -msgid "" -"You are not allowed to build tracks without the track_builder privilege." +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" msgstr "" -"Vous ne pouvez pas construire une voie sans le privilège \"track_builder\"" - -#: advtrains/protection.lua:153 -msgid "You are not allowed to build near tracks at this protected position." -msgstr "" -"Vous ne pouvez pas construire à proximité d'une voie à cet emplacement " -"protégé" - -#: advtrains/protection.lua:153 -msgid "You are not allowed to build tracks at this protected position." -msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé" - -#: advtrains/protection.lua:184 -msgid "" -"You are not allowed to operate turnouts and signals without the " -"railway_operator privilege." -msgstr "" -"Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège " -"\"railway_operator\" manquant)" #: advtrains_line_automation/stoprail.lua:54 msgid "Station Code" @@ -415,55 +483,85 @@ msgstr "" msgid "Kick out passengers" msgstr "" -#: advtrains_luaautomation/pcnaming.lua:26 -msgid "" -"Passive Component Naming Tool\n" -"\n" -"Right-click to name a passive component." +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." msgstr "" -"Outil de nommage de composant passif\n" -"\n" -"Clic-Droit pour nommer un composant passif." -#: advtrains_train_track/init.lua:31 -msgid "Y-turnout" -msgstr "Embranchement en Y" +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." +msgstr "" -#: advtrains_train_track/init.lua:49 -msgid "3-way turnout" -msgstr "Embranchement triple" +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "" -#: advtrains_train_track/init.lua:69 -msgid "Perpendicular Diamond Crossing Track" -msgstr "Croisement perpendiculaire" +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "" -#: advtrains_train_track/init.lua:91 -msgid "90+Angle Diamond Crossing Track" -msgstr "Croisement perpendiculo-diagonal" +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" -#: advtrains_train_track/init.lua:132 -msgid "Diagonal Diamond Crossing Track" -msgstr "Croisement diagonal" +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" -#: advtrains_train_track/init.lua:179 -msgid "Bumper" -msgstr "Heurtoir" +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" -#: advtrains_train_track/init.lua:201 -msgid "ATC controller" -msgstr "Controlleur ATC" +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "" -#: advtrains_train_track/init.lua:317 -msgid "Unloading Track" -msgstr "Voie de Déchargement" +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" -#: advtrains_train_track/init.lua:342 -msgid "Loading Track" -msgstr "Voie de Chargement" +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" -#: advtrains_train_track/init.lua:406 -msgid "Detector Rail" -msgstr "Voie détectrice" +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "" + +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"Outil de nommage de composant passif\n" +"\n" +"Clic-Droit pour nommer un composant passif." + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" #: advtrains_train_industrial/init.lua:10 #: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 @@ -529,26 +627,45 @@ msgstr "Wagon de frêt" msgid "Subway Passenger Wagon" msgstr "Voiture de Métropolitain" -#~ msgid "This position is protected!" -#~ msgstr "Cet emplacement est protégé !" +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "Embranchement en Y" -#~ msgid "Can't place: protected position!" -#~ msgstr "Placement impossible : emplacement protégé" +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "Embranchement triple" -#~ msgid "Deprecated Track" -#~ msgstr "Voie déconseillée" +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "Croisement perpendiculaire" -#~ msgid "Can't get on: wagon full or doors closed!" -#~ msgstr "" -#~ "Embarquement impossible : le wagon est plein ou ses portes sont closes !" +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "Croisement perpendiculo-diagonal" -#~ msgid "Use Sneak+rightclick to bypass closed doors!" -#~ msgstr "" -#~ "Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour franchir les " -#~ "portes closes !" +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "Croisement diagonal" -#~ msgid "Access to @1" -#~ msgstr "Accès à @1" +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "Heurtoir" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "Controlleur ATC" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "Voie de Déchargement" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "Voie de Chargement" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "Voie détectrice" #~ msgid "" #~ "ATC controller, mode @1\n" @@ -557,14 +674,27 @@ msgstr "Voiture de Métropolitain" #~ "Controlleur ATC, mode @1\n" #~ "Canal : @2" -#~ msgid "Lock couples" -#~ msgstr "Verrouiller l'accouplement" +#~ msgid "Access to @1" +#~ msgstr "Accès à @1" -#~ msgid "" -#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgid "Can't get on: wagon full or doors closed!" #~ msgstr "" -#~ "Vous devez être propriétaire d'au moins un wagon voisin pour supprimer " -#~ "cet attelage." +#~ "Embarquement impossible : le wagon est plein ou ses portes sont closes !" + +#~ msgid "Can't place: protected position!" +#~ msgstr "Placement impossible : emplacement protégé" + +#~ msgid "Default Seat" +#~ msgstr "Siège par défaut" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "Siège par défaut (poste de pilotage)" + +#~ msgid "Deprecated Track" +#~ msgstr "Voie déconseillée" + +#~ msgid "Lock couples" +#~ msgstr "Verrouiller l'accouplement" #~ msgid "Speed:" #~ msgstr "Vitesse : " @@ -572,8 +702,24 @@ msgstr "Voiture de Métropolitain" #~ msgid "Target:" #~ msgstr "Destination : " -#~ msgid "Default Seat" -#~ msgstr "Siège par défaut" +#, fuzzy +#~ msgid "This node can't be rotated using the trackworker," +#~ msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !" -#~ msgid "Default Seat (driver stand)" -#~ msgstr "Siège par défaut (poste de pilotage)" +#~ msgid "This position is protected!" +#~ msgstr "Cet emplacement est protégé !" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "" +#~ "Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour franchir les " +#~ "portes closes !" + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "" +#~ "Vous devez être propriétaire d'au moins un wagon voisin pour supprimer " +#~ "cet attelage." diff --git a/advtrains/po/template.pot b/advtrains/po/template.pot deleted file mode 100644 index 23aaa6a..0000000 --- a/advtrains/po/template.pot +++ /dev/null @@ -1,505 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the advtrains package. -# FIRST AUTHOR , YEAR. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: advtrains\n" -"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" -"POT-Creation-Date: 2023-10-04 15:40+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=CHARSET\n" -"Content-Transfer-Encoding: 8bit\n" - -#: advtrains/atc.lua:109 -msgid "ATC controller, unconfigured." -msgstr "" - -#: advtrains/atc.lua:150 -msgid "" -"ATC controller, mode @1\n" -"Command: @2" -msgstr "" - -#: advtrains/atc.lua:180 -msgid "Command" -msgstr "" - -#: advtrains/atc.lua:184 -msgid "Command (on)" -msgstr "" - -#: advtrains/atc.lua:187 -msgid "Digiline channel" -msgstr "" - -#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 -msgid "Save" -msgstr "" - -#: advtrains/atc.lua:236 -msgid "ATC Reverse command warning: didn't reverse train, train moving!" -msgstr "" - -#: advtrains/atc.lua:248 -msgid "ATC Kick command warning: Doors closed" -msgstr "" - -#: advtrains/atc.lua:252 -msgid "ATC Kick command warning: Train moving" -msgstr "" - -#: advtrains/atc.lua:322 -msgid "ATC command syntax error: I statement not closed: @1" -msgstr "" - -#: advtrains/atc.lua:385 -msgid "ATC command parse error: Unknown command: @1" -msgstr "" - -#: advtrains/craft_items.lua:3 -msgid "Boiler" -msgstr "" - -#: advtrains/craft_items.lua:9 -msgid "driver's cab" -msgstr "" - -#: advtrains/craft_items.lua:15 -msgid "Wheel" -msgstr "" - -#: advtrains/craft_items.lua:21 -msgid "Chimney" -msgstr "" - -#: advtrains/misc_nodes.lua:16 -msgid "@1 Platform (low)" -msgstr "" - -#: advtrains/misc_nodes.lua:33 -msgid "@1 Platform (high)" -msgstr "" - -#: advtrains/misc_nodes.lua:59 -msgid "@1 Platform (45 degree)" -msgstr "" - -#: advtrains/misc_nodes.lua:81 -msgid "@1 Platform (low, 45 degree)" -msgstr "" - -#: advtrains/trackplacer.lua:313 -msgid "" -"Track Worker Tool\n" -"\n" -"Left-click: change rail type (straight/curve/switch)\n" -"Right-click: rotate rail/bumper/signal/etc." -msgstr "" - -#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 -msgid "This node can't be rotated using the trackworker!" -msgstr "" - -#: advtrains/trackplacer.lua:350 -msgid "This track can not be rotated!" -msgstr "" - -#: advtrains/trackplacer.lua:404 -msgid "This node can't be changed using the trackworker!" -msgstr "" - -#: advtrains/trackplacer.lua:414 -msgid "This track can not be changed!" -msgstr "" - -#: advtrains/wagons.lua:179 -msgid "This wagon is owned by @1, you can't destroy it." -msgstr "" - -#: advtrains/wagons.lua:203 -msgid "The wagon's inventory is not empty!" -msgstr "" - -#: advtrains/wagons.lua:210 -msgid "Wagon needs to be decoupled from other wagons in order to destroy it." -msgstr "" - -#: advtrains/wagons.lua:216 -msgid "" -"Warning: If you destroy this wagon, you only get some steel back! If you are " -"sure, hold Sneak and left-click the wagon." -msgstr "" - -#: advtrains/wagons.lua:649 advtrains/wagons.lua:850 -msgid "Show Inventory" -msgstr "" - -#: advtrains/wagons.lua:652 -msgid "Onboard Computer" -msgstr "" - -#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328 -msgid "Wagon properties" -msgstr "" - -#: advtrains/wagons.lua:658 -msgid "Get off" -msgstr "" - -#: advtrains/wagons.lua:661 -msgid "Get off (forced)" -msgstr "" - -#: advtrains/wagons.lua:663 -msgid "(Doors closed)" -msgstr "" - -#: advtrains/wagons.lua:712 -msgid "Can't get on: " -msgstr "" - -#: advtrains/wagons.lua:838 -msgid "Select seat:" -msgstr "" - -#: advtrains/wagons.lua:880 -msgid "Save wagon properties" -msgstr "" - -#: advtrains/wagons.lua:965 -msgid "Text displayed outside on train" -msgstr "" - -#: advtrains/wagons.lua:966 -msgid "Text displayed inside train" -msgstr "" - -#: advtrains/wagons.lua:967 -msgid "Line" -msgstr "" - -#: advtrains/wagons.lua:968 -msgid "Routingcode" -msgstr "" - -#: advtrains/wagons.lua:1241 -msgid "" -"Doors are closed! Use Sneak+rightclick to ignore the closed doors and get " -"off!" -msgstr "" - -#: advtrains/trainhud.lua:305 -msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." -msgstr "" - -#: advtrains/tracks.lua:449 -msgid "This track can not be removed!" -msgstr "" - -#: advtrains/tracks.lua:616 -msgid "Position is occupied by a train." -msgstr "" - -#: advtrains/tracks.lua:622 -msgid "There's a Track Circuit Break here." -msgstr "" - -#: advtrains/tracks.lua:626 -msgid "There's a Signal Influence Point here." -msgstr "" - -#: advtrains/tracks.lua:637 -msgid "@1 Slope" -msgstr "" - -#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 -msgid "Can't place: not pointing at node" -msgstr "" - -#: advtrains/tracks.lua:658 -msgid "Can't place: space occupied!" -msgstr "" - -#: advtrains/tracks.lua:711 -msgid "Can't place: Not enough slope items left (@1 required)" -msgstr "" - -#: advtrains/tracks.lua:714 -msgid "Can't place: There's no slope of length @1" -msgstr "" - -#: advtrains/tracks.lua:721 -msgid "Can't place: no supporting node at upper end." -msgstr "" - -#: advtrains/signals.lua:63 -msgid "Lampless Signal" -msgstr "" - -#: advtrains/signals.lua:127 -msgid "Signal" -msgstr "" - -#: advtrains/signals.lua:191 -msgid "Wallmounted Signal (l)" -msgstr "" - -#: advtrains/signals.lua:192 -msgid "Wallmounted Signal (r)" -msgstr "" - -#: advtrains/signals.lua:193 -msgid "Wallmounted Signal (t)" -msgstr "" - -#: advtrains/signals.lua:281 advtrains/signals.lua:322 -msgid "Andrew's Cross" -msgstr "" - -#: advtrains/couple.lua:28 -msgid "Buffer and Chain Coupler" -msgstr "" - -#: advtrains/couple.lua:29 -msgid "Scharfenberg Coupler" -msgstr "" - -#: advtrains/couple.lua:185 -msgid "" -"You are not allowed to couple trains without the train_operator privilege." -msgstr "" - -#: advtrains/couple.lua:329 advtrains/couple.lua:333 -msgid "" -msgstr "" - -#: advtrains/couple.lua:334 -msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." -msgstr "" - -#: advtrains/copytool.lua:8 -msgid "" -"Train copy/paste tool\n" -"\n" -"Left-click: copy train\n" -"Right-click: paste train" -msgstr "" - -#: advtrains/copytool.lua:29 -msgid "You do not have the @1 privilege." -msgstr "" - -#: advtrains/copytool.lua:41 -msgid "The track you are trying to place the wagon on is not long enough!" -msgstr "" - -#: advtrains/copytool.lua:47 -msgid "The clipboard couldn't access the metadata. Paste failed." -msgstr "" - -#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 -msgid "The clipboard is empty." -msgstr "" - -#: advtrains/copytool.lua:74 -msgid "Back of train would end up off track, cancelling." -msgstr "" - -#: advtrains/copytool.lua:92 -msgid "No such lua entity!" -msgstr "" - -#: advtrains/copytool.lua:98 -msgid "No such wagon: @1" -msgstr "" - -#: advtrains/copytool.lua:104 -msgid "No such train: @1" -msgstr "" - -#: advtrains/copytool.lua:176 -msgid "The clipboard couldn't access the metadata. Copy failed." -msgstr "" - -#: advtrains/copytool.lua:180 -msgid "Train copied!" -msgstr "" - -#: advtrains/protection.lua:148 -msgid "" -"You are not allowed to build near tracks without the track_builder privilege." -msgstr "" - -#: advtrains/protection.lua:148 -msgid "" -"You are not allowed to build tracks without the track_builder privilege." -msgstr "" - -#: advtrains/protection.lua:153 -msgid "You are not allowed to build near tracks at this protected position." -msgstr "" - -#: advtrains/protection.lua:153 -msgid "You are not allowed to build tracks at this protected position." -msgstr "" - -#: advtrains/protection.lua:184 -msgid "" -"You are not allowed to operate turnouts and signals without the " -"railway_operator privilege." -msgstr "" - -#: advtrains_line_automation/stoprail.lua:54 -msgid "Station Code" -msgstr "" - -#: advtrains_line_automation/stoprail.lua:55 -msgid "Station Name" -msgstr "" - -#: advtrains_line_automation/stoprail.lua:56 -msgid "Door Delay" -msgstr "" - -#: advtrains_line_automation/stoprail.lua:57 -msgid "Dep. Speed" -msgstr "" - -#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11 -#: advtrains_train_track/init.lua:156 -msgid "Track" -msgstr "" - -#: advtrains_line_automation/stoprail.lua:59 -msgid "Stop Time" -msgstr "" - -#: advtrains_line_automation/stoprail.lua:60 -msgid "Door Side" -msgstr "" - -#: advtrains_line_automation/stoprail.lua:62 -msgid "Reverse train" -msgstr "" - -#: advtrains_line_automation/stoprail.lua:63 -msgid "Kick out passengers" -msgstr "" - -#: advtrains_luaautomation/pcnaming.lua:26 -msgid "" -"Passive Component Naming Tool\n" -"\n" -"Right-click to name a passive component." -msgstr "" - -#: advtrains_train_track/init.lua:31 -msgid "Y-turnout" -msgstr "" - -#: advtrains_train_track/init.lua:49 -msgid "3-way turnout" -msgstr "" - -#: advtrains_train_track/init.lua:69 -msgid "Perpendicular Diamond Crossing Track" -msgstr "" - -#: advtrains_train_track/init.lua:91 -msgid "90+Angle Diamond Crossing Track" -msgstr "" - -#: advtrains_train_track/init.lua:132 -msgid "Diagonal Diamond Crossing Track" -msgstr "" - -#: advtrains_train_track/init.lua:179 -msgid "Bumper" -msgstr "" - -#: advtrains_train_track/init.lua:201 -msgid "ATC controller" -msgstr "" - -#: advtrains_train_track/init.lua:317 -msgid "Unloading Track" -msgstr "" - -#: advtrains_train_track/init.lua:342 -msgid "Loading Track" -msgstr "" - -#: advtrains_train_track/init.lua:406 -msgid "Detector Rail" -msgstr "" - -#: advtrains_train_industrial/init.lua:10 -#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 -#: advtrains_train_steam/init.lua:91 -msgid "Driver Stand (right)" -msgstr "" - -#: advtrains_train_industrial/init.lua:17 -#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14 -#: advtrains_train_steam/init.lua:85 -msgid "Driver Stand (left)" -msgstr "" - -#: advtrains_train_industrial/init.lua:40 -msgid "Industrial Train Engine" -msgstr "" - -#: advtrains_train_industrial/init.lua:79 -msgid "Big Industrial Train Engine" -msgstr "" - -#: advtrains_train_industrial/init.lua:98 -msgid "Industrial tank wagon" -msgstr "" - -#: advtrains_train_industrial/init.lua:116 -msgid "Industrial wood wagon" -msgstr "" - -#: advtrains_train_japan/init.lua:4 -msgid "Japanese Train Inter-Wagon Connection" -msgstr "" - -#: advtrains_train_japan/init.lua:37 -msgid "Driver stand" -msgstr "" - -#: advtrains_train_japan/init.lua:101 -msgid "Japanese Train Engine" -msgstr "" - -#: advtrains_train_japan/init.lua:176 -msgid "Japanese Train Wagon" -msgstr "" - -#: advtrains_train_steam/init.lua:75 -msgid "Steam Engine" -msgstr "" - -#: advtrains_train_steam/init.lua:159 -msgid "Detailed Steam Engine" -msgstr "" - -#: advtrains_train_steam/init.lua:206 -msgid "Passenger Wagon" -msgstr "" - -#: advtrains_train_steam/init.lua:226 -msgid "Box Wagon" -msgstr "" - -#: advtrains_train_subway/init.lua:144 -msgid "Subway Passenger Wagon" -msgstr "" diff --git a/advtrains/po/update-translations.sh b/advtrains/po/update-translations.sh index d86c568..3a56c7c 100755 --- a/advtrains/po/update-translations.sh +++ b/advtrains/po/update-translations.sh @@ -1,24 +1,28 @@ #!/bin/sh # NOTE: Please make sure you also have basic_trains installed, as it uses attrans for historical reasons -ATDIR=`dirname "$0"`/../.. -BTDIR="$ATDIR"/../basic_trains +PODIR=`dirname "$0"` +ATDIR="$PODIR/../.." +BTDIR="$ATDIR/../basic_trains" +POTFILE="$PODIR/advtrains.pot" xgettext \ -D "$ATDIR" \ -D "$BTDIR" \ -d advtrains \ + -o "$POTFILE" \ -p . \ -L lua \ --from-code=UTF-8 \ + --sort-by-file \ --keyword='attrans' \ --keyword='S' \ --package-name='advtrains' \ --msgid-bugs-address='advtrains-discuss@lists.sr.ht' \ `find $ATDIR $BTDIR -name '*.lua' -printf '%P\n'` \ && -mv advtrains.po template.pot && -for i in *.po; do +for i in "$PODIR"/*.po; do msgmerge -U \ - $i template.pot + --sort-by-file \ + $i "$POTFILE" done diff --git a/advtrains/po/zh_CN.po b/advtrains/po/zh_CN.po index c81cf6c..5bcc316 100644 --- a/advtrains/po/zh_CN.po +++ b/advtrains/po/zh_CN.po @@ -2,17 +2,18 @@ msgid "" msgstr "" "Project-Id-Version: advtrains\n" "Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" -"POT-Creation-Date: 2023-10-04 15:40+0200\n" -"PO-Revision-Date: 2022-11-02 15:08+0100\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2023-10-09 11:24+0200\n" "Last-Translator: Y. Wang \n" "Language-Team: Chinese (Simplified)\n" "Language: zh_CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" #: advtrains/atc.lua:109 -msgid "ATC controller, unconfigured." +msgid "Unconfigured ATC controller" msgstr "ATC 控制器 (未配置)" #: advtrains/atc.lua:150 @@ -37,20 +38,21 @@ msgid "Digiline channel" msgstr "Digiline 频道" #: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 msgid "Save" msgstr "保存" #: advtrains/atc.lua:236 -msgid "ATC Reverse command warning: didn't reverse train, train moving!" -msgstr "ATC 警告:未执行“R”命令,火车在移动" +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "ATC 警告:火车正在移动,无法改变行车方向。" #: advtrains/atc.lua:248 -msgid "ATC Kick command warning: Doors closed" -msgstr "" +msgid "ATC Kick command warning: doors are closed." +msgstr "ATC 警告:车门已关闭,无法踢出乘客。" #: advtrains/atc.lua:252 -msgid "ATC Kick command warning: Train moving" -msgstr "" +msgid "ATC Kick command warning: train moving." +msgstr "ATC 警告:火车正在移动,无法踢出乘客。" #: advtrains/atc.lua:322 msgid "ATC command syntax error: I statement not closed: @1" @@ -60,12 +62,85 @@ msgstr "ATC 语法错误:“I”命令不完整:@1" msgid "ATC command parse error: Unknown command: @1" msgstr "ATC 语法错误:未知命令:@1" +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"火车复制工具\n" +"\n" +"左键单击:复制\n" +"右键单击:粘帖" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "您没有“@1”权限。" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "轨道太短。" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "无法粘贴:剪贴板无法访问元数据。" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "剪贴板是空的。" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "火车后部不在轨道上。" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "您没有指向一个可以用火车复制工具复制的物体。" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "ID 为“@1”的车厢不存在。" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "ID 为“@1”的列车不存在。" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "无法复制:剪贴板无法访问元数据。" + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "已复制列车。" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "链式车钩" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenberg 式车钩" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "您没有“train_operator”权限,不能连接这两节车厢。" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "<没有车钩>" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。" + #: advtrains/craft_items.lua:3 msgid "Boiler" msgstr "锅炉" #: advtrains/craft_items.lua:9 -msgid "driver's cab" +msgid "Driver's cab" msgstr "驾驶室" #: advtrains/craft_items.lua:15 @@ -92,12 +167,78 @@ msgstr "较高的@1站台 (45°)" msgid "@1 Platform (low, 45 degree)" msgstr "较低的@1站台 (45°)" +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "您没有“train_operator”权限,不能在铁路附近建任何东西。" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "您没有“train_operator”权限,不能在这里建造铁路。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "这里已被保护,您不能在这里建造铁路。" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "您没有“railway_operator”权限,不能控制铁路设施。" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "臂板信号机" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "信号灯" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "壁挂式信号灯 (左侧)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "壁挂式信号灯 (右侧)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "悬挂式信号灯" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "铁路道口信号灯" + #: advtrains/trackplacer.lua:313 msgid "" "Track Worker Tool\n" "\n" "Left-click: change rail type (straight/curve/switch)\n" -"Right-click: rotate rail/bumper/signal/etc." +"Right-click: rotate object" msgstr "" "铁路调整工具\n" "\n" @@ -105,27 +246,71 @@ msgstr "" "右键单击:旋转方块" #: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 -msgid "This node can't be rotated using the trackworker!" +msgid "This node can't be rotated using the trackworker." msgstr "您不能使用铁路调整工具旋转这个方块。" #: advtrains/trackplacer.lua:350 -msgid "This track can not be rotated!" +msgid "This track can not be rotated." msgstr "您不能旋转这段轨道。" #: advtrains/trackplacer.lua:404 -msgid "This node can't be changed using the trackworker!" +msgid "This node can't be changed using the trackworker." msgstr "您不能使用铁路调整工具调整这个方块。" #: advtrains/trackplacer.lua:414 -msgid "This track can not be changed!" +msgid "This track can not be changed." msgstr "您不能调整这段轨道。" +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "您不能移除这段轨道。" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1斜坡" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "无法放置斜坡:您没有选择任何方块。" + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "无法放置斜坡:此区域已被占用。" + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "无法放置斜坡:您没有足够的铁路斜坡放置工具 (您总共需要@1个)" + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "无法放置斜坡:advtrains 不支持长度为@1米的斜坡。" + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "无法放置斜坡:较高端没有支撑方块。" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + #: advtrains/wagons.lua:179 msgid "This wagon is owned by @1, you can't destroy it." msgstr "这是 @1 的车厢,您不能摧毁它。" #: advtrains/wagons.lua:203 -msgid "The wagon's inventory is not empty!" +msgid "The wagon's inventory is not empty." msgstr "" #: advtrains/wagons.lua:210 @@ -164,13 +349,25 @@ msgstr "强制下车" msgid "(Doors closed)" msgstr "(车门已关闭)" +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "这节车厢没有座位。" + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "车厢已满。" + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "" + #: advtrains/wagons.lua:712 -msgid "Can't get on: " +msgid "You can't get on this wagon." msgstr "" #: advtrains/wagons.lua:838 msgid "Select seat:" -msgstr "请选择座位" +msgstr "请选择座位:" #: advtrains/wagons.lua:880 msgid "Save wagon properties" @@ -194,174 +391,35 @@ msgstr "路由码" #: advtrains/wagons.lua:1241 msgid "" -"Doors are closed! Use Sneak+rightclick to ignore the closed doors and get " -"off!" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." msgstr "车门已关闭,请使用潜行+右键单击下车。" -#: advtrains/trainhud.lua:305 -msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." msgstr "" -#: advtrains/tracks.lua:449 -msgid "This track can not be removed!" -msgstr "您不能移除这段轨道。" - -#: advtrains/tracks.lua:616 -msgid "Position is occupied by a train." +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" msgstr "" -#: advtrains/tracks.lua:622 -msgid "There's a Track Circuit Break here." +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" msgstr "" -#: advtrains/tracks.lua:626 -msgid "There's a Signal Influence Point here." -msgstr "" - -#: advtrains/tracks.lua:637 -msgid "@1 Slope" -msgstr "@1斜坡" - -#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 -msgid "Can't place: not pointing at node" -msgstr "无法放置:您没有选择任何方块。" - -#: advtrains/tracks.lua:658 -msgid "Can't place: space occupied!" -msgstr "无法放置:此区域已被占用。" - -#: advtrains/tracks.lua:711 -msgid "Can't place: Not enough slope items left (@1 required)" -msgstr "无法放置:您没有足够的铁路斜坡放置工具 (您总共需要@1个)" - -#: advtrains/tracks.lua:714 -msgid "Can't place: There's no slope of length @1" -msgstr "无法放置:advtrains 不支持长度为@1米的斜坡。" - -#: advtrains/tracks.lua:721 -msgid "Can't place: no supporting node at upper end." -msgstr "无法放置:较高端没有支撑方块。" - -#: advtrains/signals.lua:63 -msgid "Lampless Signal" -msgstr "臂板信号机" - -#: advtrains/signals.lua:127 -msgid "Signal" -msgstr "信号灯" - -#: advtrains/signals.lua:191 -msgid "Wallmounted Signal (l)" -msgstr "壁挂式信号灯 (左侧)" - -#: advtrains/signals.lua:192 -msgid "Wallmounted Signal (r)" -msgstr "壁挂式信号灯 (右侧)" - -#: advtrains/signals.lua:193 -msgid "Wallmounted Signal (t)" -msgstr "悬挂式信号灯" - -#: advtrains/signals.lua:281 advtrains/signals.lua:322 -msgid "Andrew's Cross" -msgstr "铁路道口信号灯" - -#: advtrains/couple.lua:28 -msgid "Buffer and Chain Coupler" -msgstr "链式车钩" - -#: advtrains/couple.lua:29 -msgid "Scharfenberg Coupler" -msgstr "Scharfenberg 式车钩" - -#: advtrains/couple.lua:185 -msgid "" -"You are not allowed to couple trains without the train_operator privilege." -msgstr "您没有“train_operator”权限,不能连接这两节车厢。" - -#: advtrains/couple.lua:329 advtrains/couple.lua:333 -msgid "" -msgstr "" +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "您没有“@1”权限,不能调整这段轨道。" -#: advtrains/couple.lua:334 -msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." -msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。" +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "您不能调整这段轨道。" -#: advtrains/copytool.lua:8 -msgid "" -"Train copy/paste tool\n" -"\n" -"Left-click: copy train\n" -"Right-click: paste train" +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" msgstr "" -"火车复制工具\n" -"\n" -"左键单击:复制\n" -"右键单击:粘帖" - -#: advtrains/copytool.lua:29 -msgid "You do not have the @1 privilege." -msgstr "您没有“@1”权限。" - -#: advtrains/copytool.lua:41 -msgid "The track you are trying to place the wagon on is not long enough!" -msgstr "轨道太短。" - -#: advtrains/copytool.lua:47 -msgid "The clipboard couldn't access the metadata. Paste failed." -msgstr "无法粘贴:剪贴板无法访问元数据。" - -#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 -msgid "The clipboard is empty." -msgstr "剪贴板是空的。" - -#: advtrains/copytool.lua:74 -msgid "Back of train would end up off track, cancelling." -msgstr "火车后部不在轨道上。" - -#: advtrains/copytool.lua:92 -msgid "No such lua entity!" -msgstr "您没有指向一个可以用火车复制工具复制的物体。" - -#: advtrains/copytool.lua:98 -msgid "No such wagon: @1" -msgstr "ID 为“@1”的车厢不存在。" - -#: advtrains/copytool.lua:104 -msgid "No such train: @1" -msgstr "ID 为“@1”的列车不存在。" - -#: advtrains/copytool.lua:176 -msgid "The clipboard couldn't access the metadata. Copy failed." -msgstr "无法复制:剪贴板无法访问元数据。" - -#: advtrains/copytool.lua:180 -msgid "Train copied!" -msgstr "已复制" - -#: advtrains/protection.lua:148 -msgid "" -"You are not allowed to build near tracks without the track_builder privilege." -msgstr "您没有“train_operator”权限,不能在铁路附近建任何东西。" - -#: advtrains/protection.lua:148 -msgid "" -"You are not allowed to build tracks without the track_builder privilege." -msgstr "您没有“train_operator”权限,不能在这里建造铁路。" - -#: advtrains/protection.lua:153 -msgid "You are not allowed to build near tracks at this protected position." -msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。" - -#: advtrains/protection.lua:153 -msgid "You are not allowed to build tracks at this protected position." -msgstr "这里已被保护,您不能在这里建造铁路。" - -#: advtrains/protection.lua:184 -msgid "" -"You are not allowed to operate turnouts and signals without the " -"railway_operator privilege." -msgstr "您没有“railway_operator”权限,不能控制铁路设施。" #: advtrains_line_automation/stoprail.lua:54 msgid "Station Code" @@ -394,61 +452,91 @@ msgstr "" #: advtrains_line_automation/stoprail.lua:62 msgid "Reverse train" -msgstr "" +msgstr "改变行车方向" #: advtrains_line_automation/stoprail.lua:63 msgid "Kick out passengers" +msgstr "踢出乘客" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." msgstr "" -#: advtrains_luaautomation/pcnaming.lua:26 -msgid "" -"Passive Component Naming Tool\n" -"\n" -"Right-click to name a passive component." +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." msgstr "" -"被动元件命名工具\n" -"\n" -"右键单击命名所选元件" -#: advtrains_train_track/init.lua:31 -msgid "Y-turnout" -msgstr "对称道岔" +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "车站轨道" -#: advtrains_train_track/init.lua:49 -msgid "3-way turnout" -msgstr "三开道岔" +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "LuaATC 部件 (未配置)" -#: advtrains_train_track/init.lua:69 -msgid "Perpendicular Diamond Crossing Track" -msgstr "垂直交叉轨道" +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" -#: advtrains_train_track/init.lua:91 -msgid "90+Angle Diamond Crossing Track" -msgstr "交叉轨道 (其中一条轨道与坐标轴平行)" +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" -#: advtrains_train_track/init.lua:132 -msgid "Diagonal Diamond Crossing Track" -msgstr "交叉轨道" +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" -#: advtrains_train_track/init.lua:179 -msgid "Bumper" -msgstr "保险杠" +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "您没有“@1”权限,不能配置这个 LuaATC 部件。" -#: advtrains_train_track/init.lua:201 -msgid "ATC controller" -msgstr "ATC 控制器" +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" -#: advtrains_train_track/init.lua:317 -msgid "Unloading Track" -msgstr "卸货轨道" +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" -#: advtrains_train_track/init.lua:342 -msgid "Loading Track" -msgstr "装货轨道" +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "" -#: advtrains_train_track/init.lua:406 -msgid "Detector Rail" -msgstr "探测轨道" +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"被动元件命名工具\n" +"\n" +"右键单击命名所选元件。" + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "您没有“@1”权限,不能命名被动元件。" + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" #: advtrains_train_industrial/init.lua:10 #: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 @@ -514,23 +602,45 @@ msgstr "货运车厢" msgid "Subway Passenger Wagon" msgstr "地铁车厢" -#~ msgid "This position is protected!" -#~ msgstr "这里已被保护。" +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "对称道岔" -#~ msgid "Can't place: protected position!" -#~ msgstr "无法放置:此区域已被保护。" +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "三开道岔" -#~ msgid "Deprecated Track" -#~ msgstr "请不要使用" +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "垂直交叉轨道" -#~ msgid "Can't get on: wagon full or doors closed!" -#~ msgstr "无法上车:车门已关闭或车厢已满。" +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "交叉轨道 (其中一条轨道与坐标轴平行)" -#~ msgid "Use Sneak+rightclick to bypass closed doors!" -#~ msgstr "请使用潜行+右键上车。" +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "交叉轨道" -#~ msgid "Access to @1" -#~ msgstr "可前往@1" +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "保险杠" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "ATC 控制器" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "卸货轨道" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "装货轨道" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "探测轨道" #~ msgid "" #~ "ATC controller, mode @1\n" @@ -540,21 +650,47 @@ msgstr "地铁车厢" #~ "模式:@1\n" #~ "频道:@2" +#~ msgid "Access to @1" +#~ msgstr "可前往@1" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "无法上车:车门已关闭或车厢已满。" + +#~ msgid "Can't place: protected position!" +#~ msgstr "无法放置:此区域已被保护。" + +#~ msgid "Default Seat" +#~ msgstr "默认座位" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "默认座位 (司机座位)" + +#~ msgid "Deprecated Track" +#~ msgstr "请不要使用" + #~ msgid "Lock couples" #~ msgstr "锁定连接处" -#~ msgid "" -#~ "You need to own at least one neighboring wagon to destroy this couple." -#~ msgstr "您必须至少拥有其中一节车厢才能分开这两节车厢。" - #~ msgid "Speed:" #~ msgstr "速度" #~ msgid "Target:" #~ msgstr "目标速度" -#~ msgid "Default Seat" -#~ msgstr "默认座位" +#, fuzzy +#~ msgid "This node can't be rotated using the trackworker," +#~ msgstr "您不能使用铁路调整工具旋转这个方块。" -#~ msgid "Default Seat (driver stand)" -#~ msgstr "默认座位 (司机座位)" +#~ msgid "This position is protected!" +#~ msgstr "这里已被保护。" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "请使用潜行+右键上车。" + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "这里已被保护,您不能在这里建造铁路。" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "您必须至少拥有其中一节车厢才能分开这两节车厢。" diff --git a/advtrains/po/zh_TW.po b/advtrains/po/zh_TW.po index 91a205f..ece82c3 100644 --- a/advtrains/po/zh_TW.po +++ b/advtrains/po/zh_TW.po @@ -2,17 +2,18 @@ msgid "" msgstr "" "Project-Id-Version: advtrains\n" "Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n" -"POT-Creation-Date: 2023-10-04 15:40+0200\n" -"PO-Revision-Date: 2022-11-02 15:08+0100\n" +"POT-Creation-Date: 2023-10-09 11:02+0200\n" +"PO-Revision-Date: 2023-10-09 11:31+0200\n" "Last-Translator: Y. Wang \n" "Language-Team: Chinese (Traditional)\n" "Language: zh_TW\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"X-Generator: Poedit 3.3.2\n" #: advtrains/atc.lua:109 -msgid "ATC controller, unconfigured." +msgid "Unconfigured ATC controller" msgstr "ATC 控制器 (未配置)" #: advtrains/atc.lua:150 @@ -37,20 +38,21 @@ msgid "Digiline channel" msgstr "Digiline 頻道" #: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65 +#: advtrains_luaautomation/active_common.lua:48 msgid "Save" msgstr "儲存" #: advtrains/atc.lua:236 -msgid "ATC Reverse command warning: didn't reverse train, train moving!" -msgstr "ATC 警告:未執行「R」命令,火車在移動" +msgid "ATC Reverse command warning: didn't reverse train, train moving." +msgstr "ATC 警告:火車正在移動,無法改變行車方向。" #: advtrains/atc.lua:248 -msgid "ATC Kick command warning: Doors closed" -msgstr "" +msgid "ATC Kick command warning: doors are closed." +msgstr "ATC 警告:車門已關閉,無法踢出乘客。" #: advtrains/atc.lua:252 -msgid "ATC Kick command warning: Train moving" -msgstr "" +msgid "ATC Kick command warning: train moving." +msgstr "ATC 警告:火車正在移動,無法踢出乘客。" #: advtrains/atc.lua:322 msgid "ATC command syntax error: I statement not closed: @1" @@ -60,12 +62,85 @@ msgstr "ATC 語法錯誤:「I」命令不完整:@1" msgid "ATC command parse error: Unknown command: @1" msgstr "ATC 語法錯誤:未知命令:@1" +#: advtrains/copytool.lua:8 +msgid "" +"Train copy/paste tool\n" +"\n" +"Left-click: copy train\n" +"Right-click: paste train" +msgstr "" +"火車複製工具\n" +"\n" +"左鍵單擊:複製\n" +"右鍵單擊:粘帖" + +#: advtrains/copytool.lua:29 +msgid "You do not have the @1 privilege." +msgstr "您沒有「@1」許可權。" + +#: advtrains/copytool.lua:41 +msgid "The track you are trying to place the wagon on is not long enough." +msgstr "軌道太短。" + +#: advtrains/copytool.lua:47 +msgid "The clipboard couldn't access the metadata. Paste failed." +msgstr "無法貼上:剪貼簿無法訪問元資料。" + +#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 +msgid "The clipboard is empty." +msgstr "剪貼簿是空的。" + +#: advtrains/copytool.lua:74 +msgid "Back of train would end up off track, cancelling." +msgstr "火車後部不在軌道上。" + +#: advtrains/copytool.lua:92 +msgid "No such lua entity." +msgstr "您沒有指向一個可以用火車複製工具複製的物體。" + +#: advtrains/copytool.lua:98 +msgid "No such wagon: @1." +msgstr "ID 為「@1」的車廂不存在。" + +#: advtrains/copytool.lua:104 +msgid "No such train: @1." +msgstr "ID 為「@1」的列車不存在。" + +#: advtrains/copytool.lua:176 +msgid "The clipboard couldn't access the metadata. Copy failed." +msgstr "無法複製:剪貼簿無法訪問元資料。" + +#: advtrains/copytool.lua:180 +msgid "Train copied." +msgstr "已複製火車。" + +#: advtrains/couple.lua:28 +msgid "Buffer and Chain Coupler" +msgstr "鏈式連結器" + +#: advtrains/couple.lua:29 +msgid "Scharfenberg Coupler" +msgstr "Scharfenberg 式連結器" + +#: advtrains/couple.lua:185 +msgid "" +"You are not allowed to couple trains without the train_operator privilege." +msgstr "您沒有「train_operator」許可權,不能連結這兩節車廂。" + +#: advtrains/couple.lua:329 advtrains/couple.lua:333 +msgid "" +msgstr "<無連結器>" + +#: advtrains/couple.lua:334 +msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." +msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。" + #: advtrains/craft_items.lua:3 msgid "Boiler" msgstr "鍋爐" #: advtrains/craft_items.lua:9 -msgid "driver's cab" +msgid "Driver's cab" msgstr "駕駛室" #: advtrains/craft_items.lua:15 @@ -92,12 +167,78 @@ msgstr "較高的@1月臺 (45°)" msgid "@1 Platform (low, 45 degree)" msgstr "較低的@1月臺 (45°)" +#: advtrains/protection.lua:7 +msgid "Can place, remove and operate trains" +msgstr "" + +#: advtrains/protection.lua:12 +msgid "" +"Can place, remove and operate any train, regardless of owner, whitelist, or " +"protection" +msgstr "" + +#: advtrains/protection.lua:18 +msgid "Can place and dig tracks in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:24 +msgid "Can operate turnouts and signals in unprotected areas" +msgstr "" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build near tracks without the track_builder privilege." +msgstr "您沒有「train_operator」許可權,不能在鐵路附近建任何東西。" + +#: advtrains/protection.lua:148 +msgid "" +"You are not allowed to build tracks without the track_builder privilege." +msgstr "您沒有「train_operator」許可權,不能在這裡建造鐵路。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build near tracks at this protected position." +msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。" + +#: advtrains/protection.lua:153 +msgid "You are not allowed to build tracks at this protected position." +msgstr "這裡已被保護,您不能在這裡建造鐵路。" + +#: advtrains/protection.lua:184 +msgid "" +"You are not allowed to operate turnouts and signals without the " +"railway_operator privilege." +msgstr "您沒有「railway_operator」許可權,不能控制鐵路設施。" + +#: advtrains/signals.lua:63 +msgid "Lampless Signal" +msgstr "臂木式號誌機" + +#: advtrains/signals.lua:127 +msgid "Signal" +msgstr "色燈號誌機" + +#: advtrains/signals.lua:191 +msgid "Wallmounted Signal (left)" +msgstr "壁掛式色燈號誌機 (左側)" + +#: advtrains/signals.lua:192 +msgid "Wallmounted Signal (right)" +msgstr "壁掛式色燈號誌機 (右側)" + +#: advtrains/signals.lua:193 +msgid "Wallmounted Signal (top)" +msgstr "懸掛式色燈號誌機" + +#: advtrains/signals.lua:281 advtrains/signals.lua:322 +msgid "Andrew's Cross" +msgstr "平交道號誌燈" + #: advtrains/trackplacer.lua:313 msgid "" "Track Worker Tool\n" "\n" "Left-click: change rail type (straight/curve/switch)\n" -"Right-click: rotate rail/bumper/signal/etc." +"Right-click: rotate object" msgstr "" "鐵路調整工具\n" "\n" @@ -105,27 +246,71 @@ msgstr "" "右鍵單擊:旋轉方塊" #: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377 -msgid "This node can't be rotated using the trackworker!" +msgid "This node can't be rotated using the trackworker." msgstr "您不能使用鐵路調整工具旋轉這個方塊。" #: advtrains/trackplacer.lua:350 -msgid "This track can not be rotated!" +msgid "This track can not be rotated." msgstr "您不能旋轉這段軌道。" #: advtrains/trackplacer.lua:404 -msgid "This node can't be changed using the trackworker!" +msgid "This node can't be changed using the trackworker." msgstr "您不能使用鐵路調整工具調整這個方塊。" #: advtrains/trackplacer.lua:414 -msgid "This track can not be changed!" +msgid "This track can not be changed." msgstr "您不能調整這段軌道。" +#: advtrains/tracks.lua:449 +msgid "This track can not be removed." +msgstr "您不能移除這段軌道。" + +#: advtrains/tracks.lua:616 +msgid "Position is occupied by a train." +msgstr "" + +#: advtrains/tracks.lua:622 +msgid "There's a Track Circuit Break here." +msgstr "" + +#: advtrains/tracks.lua:626 +msgid "There's a Signal Influence Point here." +msgstr "" + +#: advtrains/tracks.lua:637 +msgid "@1 Slope" +msgstr "@1斜坡" + +#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 +msgid "Can't place slope: not pointing at node." +msgstr "無法放置斜坡:您沒有選擇任何方塊。" + +#: advtrains/tracks.lua:658 +msgid "Can't place slope: space occupied." +msgstr "無法放置斜坡:此區域已被佔用。" + +#: advtrains/tracks.lua:711 +msgid "Can't place slope: Not enough slope items left (@1 required)." +msgstr "無法放置斜坡:您沒有足夠的鐵路斜坡放置工具 (您總共需要@1個)" + +#: advtrains/tracks.lua:714 +msgid "Can't place slope: There's no slope of length @1." +msgstr "無法放置斜坡:advtrains 不支援長度為@1米的斜坡。" + +#: advtrains/tracks.lua:721 +msgid "Can't place slope: no supporting node at upper end." +msgstr "無法放置斜坡:較高階沒有支撐方塊。" + +#: advtrains/trainhud.lua:305 +msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +msgstr "" + #: advtrains/wagons.lua:179 msgid "This wagon is owned by @1, you can't destroy it." msgstr "這是 @1 的車廂,您不能摧毀它。" #: advtrains/wagons.lua:203 -msgid "The wagon's inventory is not empty!" +msgid "The wagon's inventory is not empty." msgstr "" #: advtrains/wagons.lua:210 @@ -164,13 +349,25 @@ msgstr "強制下車" msgid "(Doors closed)" msgstr "(車門已關閉)" +#: advtrains/wagons.lua:692 +msgid "This wagon has no seats." +msgstr "這節車廂沒有座位。" + +#: advtrains/wagons.lua:703 +msgid "This wagon is full." +msgstr "車廂已滿。" + +#: advtrains/wagons.lua:706 +msgid "Doors are closed! (Try holding sneak key!)" +msgstr "" + #: advtrains/wagons.lua:712 -msgid "Can't get on: " +msgid "You can't get on this wagon." msgstr "" #: advtrains/wagons.lua:838 msgid "Select seat:" -msgstr "請選擇座位" +msgstr "請選擇座位:" #: advtrains/wagons.lua:880 msgid "Save wagon properties" @@ -194,174 +391,35 @@ msgstr "路由碼" #: advtrains/wagons.lua:1241 msgid "" -"Doors are closed! Use Sneak+rightclick to ignore the closed doors and get " -"off!" +"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get " +"off." msgstr "車門已關閉,請使用潛行+右鍵單擊下車。" -#: advtrains/trainhud.lua:305 -msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again." +#: advtrains/wagons.lua:1250 +msgid "You are not allowed to access the driver stand." msgstr "" -#: advtrains/tracks.lua:449 -msgid "This track can not be removed!" -msgstr "您不能移除這段軌道。" - -#: advtrains/tracks.lua:616 -msgid "Position is occupied by a train." +#: advtrains_interlocking/tsr_rail.lua:13 +msgid "Point speed restriction: @1" msgstr "" -#: advtrains/tracks.lua:622 -msgid "There's a Track Circuit Break here." +#: advtrains_interlocking/tsr_rail.lua:14 +msgid "Set point speed restriction:" msgstr "" -#: advtrains/tracks.lua:626 -msgid "There's a Signal Influence Point here." -msgstr "" - -#: advtrains/tracks.lua:637 -msgid "@1 Slope" -msgstr "@1斜坡" - -#: advtrains/tracks.lua:648 advtrains/tracks.lua:653 -msgid "Can't place: not pointing at node" -msgstr "無法放置:您沒有選擇任何方塊。" - -#: advtrains/tracks.lua:658 -msgid "Can't place: space occupied!" -msgstr "無法放置:此區域已被佔用。" - -#: advtrains/tracks.lua:711 -msgid "Can't place: Not enough slope items left (@1 required)" -msgstr "無法放置:您沒有足夠的鐵路斜坡放置工具 (您總共需要@1個)" - -#: advtrains/tracks.lua:714 -msgid "Can't place: There's no slope of length @1" -msgstr "無法放置:advtrains 不支援長度為@1米的斜坡。" - -#: advtrains/tracks.lua:721 -msgid "Can't place: no supporting node at upper end." -msgstr "無法放置:較高階沒有支撐方塊。" - -#: advtrains/signals.lua:63 -msgid "Lampless Signal" -msgstr "臂木式號誌機" - -#: advtrains/signals.lua:127 -msgid "Signal" -msgstr "色燈號誌機" - -#: advtrains/signals.lua:191 -msgid "Wallmounted Signal (l)" -msgstr "壁掛式色燈號誌機 (左側)" - -#: advtrains/signals.lua:192 -msgid "Wallmounted Signal (r)" -msgstr "壁掛式色燈號誌機 (右側)" - -#: advtrains/signals.lua:193 -msgid "Wallmounted Signal (t)" -msgstr "懸掛式色燈號誌機" - -#: advtrains/signals.lua:281 advtrains/signals.lua:322 -msgid "Andrew's Cross" -msgstr "平交道號誌燈" - -#: advtrains/couple.lua:28 -msgid "Buffer and Chain Coupler" -msgstr "鏈式連結器" - -#: advtrains/couple.lua:29 -msgid "Scharfenberg Coupler" -msgstr "Scharfenberg 式連結器" - -#: advtrains/couple.lua:185 -msgid "" -"You are not allowed to couple trains without the train_operator privilege." -msgstr "您沒有「train_operator」許可權,不能連結這兩節車廂。" - -#: advtrains/couple.lua:329 advtrains/couple.lua:333 -msgid "" -msgstr "" +#: advtrains_interlocking/tsr_rail.lua:30 +msgid "You are not allowed to configure this track without the @1 privilege." +msgstr "您沒有「@1」許可權,不能調整這段軌道。" -#: advtrains/couple.lua:334 -msgid "Can not couple: The couplers of the trains do not match (@1 and @2)." -msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。" +#: advtrains_interlocking/tsr_rail.lua:34 +#: advtrains_line_automation/stoprail.lua:31 +#: advtrains_line_automation/stoprail.lua:76 +msgid "You are not allowed to configure this track." +msgstr "您不能調整這段軌道。" -#: advtrains/copytool.lua:8 -msgid "" -"Train copy/paste tool\n" -"\n" -"Left-click: copy train\n" -"Right-click: paste train" +#: advtrains_interlocking/tsr_rail.lua:64 +msgid "Point Speed Restriction Track" msgstr "" -"火車複製工具\n" -"\n" -"左鍵單擊:複製\n" -"右鍵單擊:粘帖" - -#: advtrains/copytool.lua:29 -msgid "You do not have the @1 privilege." -msgstr "您沒有「@1」許可權。" - -#: advtrains/copytool.lua:41 -msgid "The track you are trying to place the wagon on is not long enough!" -msgstr "軌道太短。" - -#: advtrains/copytool.lua:47 -msgid "The clipboard couldn't access the metadata. Paste failed." -msgstr "無法貼上:剪貼簿無法訪問元資料。" - -#: advtrains/copytool.lua:52 advtrains/copytool.lua:57 -msgid "The clipboard is empty." -msgstr "剪貼簿是空的。" - -#: advtrains/copytool.lua:74 -msgid "Back of train would end up off track, cancelling." -msgstr "火車後部不在軌道上。" - -#: advtrains/copytool.lua:92 -msgid "No such lua entity!" -msgstr "您沒有指向一個可以用火車複製工具複製的物體。" - -#: advtrains/copytool.lua:98 -msgid "No such wagon: @1" -msgstr "ID 為「@1」的車廂不存在。" - -#: advtrains/copytool.lua:104 -msgid "No such train: @1" -msgstr "ID 為「@1」的列車不存在。" - -#: advtrains/copytool.lua:176 -msgid "The clipboard couldn't access the metadata. Copy failed." -msgstr "無法複製:剪貼簿無法訪問元資料。" - -#: advtrains/copytool.lua:180 -msgid "Train copied!" -msgstr "已複製" - -#: advtrains/protection.lua:148 -msgid "" -"You are not allowed to build near tracks without the track_builder privilege." -msgstr "您沒有「train_operator」許可權,不能在鐵路附近建任何東西。" - -#: advtrains/protection.lua:148 -msgid "" -"You are not allowed to build tracks without the track_builder privilege." -msgstr "您沒有「train_operator」許可權,不能在這裡建造鐵路。" - -#: advtrains/protection.lua:153 -msgid "You are not allowed to build near tracks at this protected position." -msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。" - -#: advtrains/protection.lua:153 -msgid "You are not allowed to build tracks at this protected position." -msgstr "這裡已被保護,您不能在這裡建造鐵路。" - -#: advtrains/protection.lua:184 -msgid "" -"You are not allowed to operate turnouts and signals without the " -"railway_operator privilege." -msgstr "您沒有「railway_operator」許可權,不能控制鐵路設施。" #: advtrains_line_automation/stoprail.lua:54 msgid "Station Code" @@ -394,61 +452,91 @@ msgstr "" #: advtrains_line_automation/stoprail.lua:62 msgid "Reverse train" -msgstr "" +msgstr "改變行車方向" #: advtrains_line_automation/stoprail.lua:63 msgid "Kick out passengers" +msgstr "踢出乘客" + +#: advtrains_line_automation/stoprail.lua:97 +msgid "Station code \"@1\" already exists and is owned by @2." msgstr "" -#: advtrains_luaautomation/pcnaming.lua:26 -msgid "" -"Passive Component Naming Tool\n" -"\n" -"Right-click to name a passive component." +#: advtrains_line_automation/stoprail.lua:111 +msgid "This station is owned by @1. You are not allowed to edit its name." msgstr "" -"被動元件命名工具\n" -"\n" -"右鍵單擊命名所選元件" -#: advtrains_train_track/init.lua:31 -msgid "Y-turnout" -msgstr "對稱道岔" +#: advtrains_line_automation/stoprail.lua:221 +msgid "Station/Stop Track" +msgstr "車站軌道" -#: advtrains_train_track/init.lua:49 -msgid "3-way turnout" -msgstr "三開道岔" +#: advtrains_luaautomation/active_common.lua:17 +msgid "Unconfigured LuaATC component" +msgstr "LuaATC 元件 (未配置)" -#: advtrains_train_track/init.lua:69 -msgid "Perpendicular Diamond Crossing Track" -msgstr "垂直交叉軌道" +#: advtrains_luaautomation/active_common.lua:46 +msgid "LuaATC Environment" +msgstr "" -#: advtrains_train_track/init.lua:91 -msgid "90+Angle Diamond Crossing Track" -msgstr "交叉軌道 (其中一條軌道與座標軸平行)" +#: advtrains_luaautomation/active_common.lua:49 +msgid "Clear Local Environment" +msgstr "" -#: advtrains_train_track/init.lua:132 -msgid "Diagonal Diamond Crossing Track" -msgstr "交叉軌道" +#: advtrains_luaautomation/active_common.lua:50 +msgid "Code" +msgstr "" -#: advtrains_train_track/init.lua:179 -msgid "Bumper" -msgstr "保險槓" +#: advtrains_luaautomation/active_common.lua:64 +msgid "" +"You are not allowed to configure this LuaATC component without the @1 " +"privilege." +msgstr "您沒有「@1」許可權,不能配置這個 LuaATC 元件。" -#: advtrains_train_track/init.lua:201 -msgid "ATC controller" -msgstr "ATC 控制器" +#: advtrains_luaautomation/active_common.lua:94 +msgid "LuaATC component assigned to environment '@1'" +msgstr "" -#: advtrains_train_track/init.lua:317 -msgid "Unloading Track" -msgstr "卸貨軌道" +#: advtrains_luaautomation/active_common.lua:96 +msgid "LuaATC component assigned to an invalid environment" +msgstr "" -#: advtrains_train_track/init.lua:342 -msgid "Loading Track" -msgstr "裝貨軌道" +#: advtrains_luaautomation/active_common.lua:171 +msgid "LuaATC component with error: @1" +msgstr "" -#: advtrains_train_track/init.lua:406 -msgid "Detector Rail" -msgstr "探測軌道" +#: advtrains_luaautomation/init.lua:13 +msgid "" +"Can place and configure LuaATC components, including execute potentially " +"harmful Lua code" +msgstr "" + +#: advtrains_luaautomation/mesecon_controller.lua:211 +msgid "LuaATC Mesecon Controller" +msgstr "" + +#: advtrains_luaautomation/operation_panel.lua:11 +msgid "LuaATC Operation Panel" +msgstr "" + +#: advtrains_luaautomation/pcnaming.lua:28 +msgid "" +"Passive Component Naming Tool\n" +"\n" +"Right-click to name a passive component." +msgstr "" +"被動元件命名工具\n" +"\n" +"右鍵單擊命名所選元件。" + +#: advtrains_luaautomation/pcnaming.lua:39 +msgid "" +"You are not allowed to name LuaATC passive components without the @1 " +"privilege." +msgstr "您沒有「@1」許可權,不能命名這個元件。" + +#: advtrains_luaautomation/pcnaming.lua:62 +msgid "Set name of component (empty to clear)" +msgstr "" #: advtrains_train_industrial/init.lua:10 #: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20 @@ -514,23 +602,45 @@ msgstr "貨運車廂" msgid "Subway Passenger Wagon" msgstr "地鐵車廂" -#~ msgid "This position is protected!" -#~ msgstr "這裡已被保護。" +#: advtrains_train_track/init.lua:31 +msgid "Y-turnout" +msgstr "對稱道岔" -#~ msgid "Can't place: protected position!" -#~ msgstr "無法放置:此區域已被保護。" +#: advtrains_train_track/init.lua:49 +msgid "3-way turnout" +msgstr "三開道岔" -#~ msgid "Deprecated Track" -#~ msgstr "請不要使用" +#: advtrains_train_track/init.lua:69 +msgid "Perpendicular Diamond Crossing Track" +msgstr "垂直交叉軌道" -#~ msgid "Can't get on: wagon full or doors closed!" -#~ msgstr "無法上車:車門已關閉或車廂已滿。" +#: advtrains_train_track/init.lua:91 +msgid "90+Angle Diamond Crossing Track" +msgstr "交叉軌道 (其中一條軌道與座標軸平行)" -#~ msgid "Use Sneak+rightclick to bypass closed doors!" -#~ msgstr "請使用潛行+右鍵上車。" +#: advtrains_train_track/init.lua:132 +msgid "Diagonal Diamond Crossing Track" +msgstr "交叉軌道" -#~ msgid "Access to @1" -#~ msgstr "可前往@1" +#: advtrains_train_track/init.lua:179 +msgid "Bumper" +msgstr "保險槓" + +#: advtrains_train_track/init.lua:201 +msgid "ATC controller" +msgstr "ATC 控制器" + +#: advtrains_train_track/init.lua:317 +msgid "Unloading Track" +msgstr "卸貨軌道" + +#: advtrains_train_track/init.lua:342 +msgid "Loading Track" +msgstr "裝貨軌道" + +#: advtrains_train_track/init.lua:406 +msgid "Detector Rail" +msgstr "探測軌道" #~ msgid "" #~ "ATC controller, mode @1\n" @@ -540,21 +650,47 @@ msgstr "地鐵車廂" #~ "模式:@1\n" #~ "頻道:@2" +#~ msgid "Access to @1" +#~ msgstr "可前往@1" + +#~ msgid "Can't get on: wagon full or doors closed!" +#~ msgstr "無法上車:車門已關閉或車廂已滿。" + +#~ msgid "Can't place: protected position!" +#~ msgstr "無法放置:此區域已被保護。" + +#~ msgid "Default Seat" +#~ msgstr "預設座位" + +#~ msgid "Default Seat (driver stand)" +#~ msgstr "預設座位 (司機座位)" + +#~ msgid "Deprecated Track" +#~ msgstr "請不要使用" + #~ msgid "Lock couples" #~ msgstr "鎖定連結處" -#~ msgid "" -#~ "You need to own at least one neighboring wagon to destroy this couple." -#~ msgstr "您必須至少擁有其中一節車廂才能分開這兩節車廂。" - #~ msgid "Speed:" #~ msgstr "速度" #~ msgid "Target:" #~ msgstr "目標速度" -#~ msgid "Default Seat" -#~ msgstr "預設座位" +#, fuzzy +#~ msgid "This node can't be rotated using the trackworker," +#~ msgstr "您不能使用鐵路調整工具旋轉這個方塊。" -#~ msgid "Default Seat (driver stand)" -#~ msgstr "預設座位 (司機座位)" +#~ msgid "This position is protected!" +#~ msgstr "這裡已被保護。" + +#~ msgid "Use Sneak+rightclick to bypass closed doors!" +#~ msgstr "請使用潛行+右鍵上車。" + +#, fuzzy +#~ msgid "You are not allowed to modify this protected track." +#~ msgstr "這裡已被保護,您不能在這裡建造鐵路。" + +#~ msgid "" +#~ "You need to own at least one neighboring wagon to destroy this couple." +#~ msgstr "您必須至少擁有其中一節車廂才能分開這兩節車廂。" diff --git a/advtrains/protection.lua b/advtrains/protection.lua index 89e15eb..ac1cd66 100644 --- a/advtrains/protection.lua +++ b/advtrains/protection.lua @@ -4,24 +4,24 @@ -- Privileges to control TRAIN DRIVING/COUPLING minetest.register_privilege("train_operator", { - description = "Without this privilege, a player can't do anything about trains, neither place or remove them nor drive or couple them (but he can build tracks if he has track_builder)", + description = attrans("Can place, remove and operate trains"), give_to_singleplayer= true, }); minetest.register_privilege("train_admin", { - description = "Player may drive, place or remove any trains from/to anywhere, regardless of owner, whitelist or protection", + description = attrans("Can place, remove and operate any train, regardless of owner, whitelist, or protection"), give_to_singleplayer= true, }); -- Privileges to control TRACK BUILDING minetest.register_privilege("track_builder", { - description = "Player can place and/or dig rails not protected from him. If he also has protection_bypass, he can place/dig any rails", + description = attrans("Can place and dig tracks in unprotected areas"), give_to_singleplayer= true, }); -- Privileges to control OPERATING TURNOUTS/SIGNALS minetest.register_privilege("railway_operator", { - description = "Player can operate turnouts and signals not protected from him. If he also has protection_bypass, he can operate any turnouts/signals", + description = attrans("Can operate turnouts and signals in unprotected areas"), give_to_singleplayer= true, }); diff --git a/advtrains/signals.lua b/advtrains/signals.lua index 74841d3..c03afbf 100644 --- a/advtrains/signals.lua +++ b/advtrains/signals.lua @@ -188,9 +188,9 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", --tunnel signals. no rotations. local swdesc = { -- needed for xgettext - l = attrans("Wallmounted Signal (l)"), - r = attrans("Wallmounted Signal (r)"), - t = attrans("Wallmounted Signal (t)"), + l = attrans("Wallmounted Signal (left)"), + r = attrans("Wallmounted Signal (right)"), + t = attrans("Wallmounted Signal (top)"), } for loc, sbox in pairs({l={-1/2, -1/2, -1/4, 0, 1/2, 1/4}, r={0, -1/2, -1/4, 1/2, 1/2, 1/4}, t={-1/2, 0, -1/4, 1/2, 1/2, 1/4}}) do minetest.register_node("advtrains:signal_wall_"..loc.."_"..r, { diff --git a/advtrains/trackplacer.lua b/advtrains/trackplacer.lua index fe76290..9f97171 100644 --- a/advtrains/trackplacer.lua +++ b/advtrains/trackplacer.lua @@ -310,7 +310,7 @@ end minetest.register_craftitem("advtrains:trackworker",{ - description = attrans("Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate rail/bumper/signal/etc."), + description = attrans("Track Worker Tool\n\nLeft-click: change rail type (straight/curve/switch)\nRight-click: rotate object"), groups = {cracky=1}, -- key=name, value=rating; rating=1..3. inventory_image = "advtrains_trackworker.png", wield_image = "advtrains_trackworker.png", @@ -337,7 +337,7 @@ minetest.register_craftitem("advtrains:trackworker",{ nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$") rotation = "" if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twrotate[suffix] then - minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker!")) + minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker.")) return end end @@ -347,7 +347,7 @@ minetest.register_craftitem("advtrains:trackworker",{ -- is a track, we can query local can_modify, reason = advtrains.can_dig_or_modify_track(pos) if not can_modify then - local str = attrans("This track can not be rotated!") + local str = attrans("This track can not be rotated.") if reason then str = str .. " " .. reason end @@ -374,7 +374,7 @@ minetest.register_craftitem("advtrains:trackworker",{ if v==rotation then modpos=k end end if not modpos then - minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker!")) + minetest.chat_send_player(placer:get_player_name(), attrans("This node can't be rotated using the trackworker.")) return end advtrains.ndb.swap_node(pos, {name=nnprefix.."_"..suffix..modext[modpos+1], param2=node.param2}) @@ -401,7 +401,7 @@ minetest.register_craftitem("advtrains:trackworker",{ nnprefix, suffix=string.match(node.name, "^(.+)_([^_]+)$") rotation = "" if not tp.tracks[nnprefix] or not tp.tracks[nnprefix].twcycle[suffix] then - minetest.chat_send_player(user:get_player_name(), attrans("This node can't be changed using the trackworker!")) + minetest.chat_send_player(user:get_player_name(), attrans("This node can't be changed using the trackworker.")) return end end @@ -411,7 +411,7 @@ minetest.register_craftitem("advtrains:trackworker",{ -- is a track, we can query local can_modify, reason = advtrains.can_dig_or_modify_track(pos) if not can_modify then - local str = attrans("This track can not be changed!") + local str = attrans("This track can not be changed.") if reason then str = str .. " " .. reason end diff --git a/advtrains/tracks.lua b/advtrains/tracks.lua index 3959232..ee82426 100644 --- a/advtrains/tracks.lua +++ b/advtrains/tracks.lua @@ -446,7 +446,7 @@ Depending on the number of connections: local function can_dig_callback(pos, player) local ok, reason = advtrains.can_dig_or_modify_track(pos) if not ok and player then - minetest.chat_send_player(player:get_player_name(), attrans("This track can not be removed!") .. " " .. reason) + minetest.chat_send_player(player:get_player_name(), attrans("This track can not be removed.") .. " " .. reason) end return ok end @@ -646,17 +646,17 @@ end function sl.create_slopeplacer_on_place(def, preset) return function(istack, player, pt) if not pt.type=="node" then - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: not pointing at node.")) return istack end local pos=pt.above if not pos then - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: not pointing at node")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: not pointing at node.")) return istack end local node=minetest.get_node(pos) if not minetest.registered_nodes[node.name] or not minetest.registered_nodes[node.name].buildable_to then - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: space occupied!")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: space occupied.")) return istack end if not advtrains.check_track_protection(pos, player:get_player_name()) then @@ -709,17 +709,17 @@ function sl.create_slopeplacer_on_place(def, preset) pos=vector.subtract(pos, dirvec) end else - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: Not enough slope items left (@1 required)", step)) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: Not enough slope items left (@1 required).", step)) end else - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: There's no slope of length @1",step)) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: There's no slope of length @1.",step)) end return istack end step=step+1 pos=vector.add(pos, dirvec) end - minetest.chat_send_player(player:get_player_name(), attrans("Can't place: no supporting node at upper end.")) + minetest.chat_send_player(player:get_player_name(), attrans("Can't place slope: no supporting node at upper end.")) return itemstack end end diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua index 536c8d4..993d7d3 100644 --- a/advtrains/wagons.lua +++ b/advtrains/wagons.lua @@ -213,7 +213,7 @@ function wagon:on_punch(puncher, time_from_last_punch, tool_capabilities, direct end for listname, _ in pairs(inv:get_lists()) do if not inv:is_empty(listname) then - minetest.chat_send_player(puncher:get_player_name(), attrans("The wagon's inventory is not empty!")); + minetest.chat_send_player(puncher:get_player_name(), attrans("The wagon's inventory is not empty.")); return end end @@ -711,7 +711,7 @@ function wagon:on_rightclick(clicker) end local doors_open = self:train().door_open~=0 or clicker:get_player_control().sneak - local allow, rsn=false, "Wagon has no seats!" + local allow, rsn=false, attrans("This wagon has no seats.") for _,sgr in ipairs(self.assign_to_seat_group) do allow, rsn = self:check_seat_group_access(pname, sgr) if allow then @@ -722,16 +722,16 @@ function wagon:on_rightclick(clicker) self:get_on(clicker, seatid) return else - rsn="Wagon is full." + rsn=attrans("This wagon is full.") end else - rsn="Doors are closed! (try holding sneak key!)" + rsn=attrans("Doors are closed! (Try holding sneak key!)") end end end end end - minetest.chat_send_player(pname, attrans("Can't get on: "..rsn)) + minetest.chat_send_player(pname, rsn or attrans("You can't get on this wagon.")) else self:show_get_on_form(pname) end @@ -1262,7 +1262,7 @@ function wagon:seating_from_key_helper(pname, fields, no) self:show_bordcom(pname) end if fields.dcwarn then - minetest.chat_send_player(pname, attrans("Doors are closed! Use Sneak+rightclick to ignore the closed doors and get off!")) + minetest.chat_send_player(pname, attrans("Doors are closed. Use Sneak+rightclick to ignore the closed doors and get off.")) end if fields.off then self:get_off(no) @@ -1271,7 +1271,7 @@ end function wagon:check_seat_group_access(pname, sgr) local data = advtrains.wagons[self.id] if self.seat_groups[sgr].driving_ctrl_access and not (advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist)) then - return false, "Not allowed to access a driver stand!" + return false, attrans("You are not allowed to access the driver stand.") end if self.seat_groups[sgr].driving_ctrl_access then advtrains.log("Drive", pname, self.object:getpos(), self:train().text_outside) diff --git a/advtrains_interlocking/tsr_rail.lua b/advtrains_interlocking/tsr_rail.lua index f302540..c1e3c1c 100644 --- a/advtrains_interlocking/tsr_rail.lua +++ b/advtrains_interlocking/tsr_rail.lua @@ -3,13 +3,15 @@ -- Simple rail whose only purpose is to place a TSR on the position, as a temporary solution until the timetable system covers everything. -- This code resembles the code in lines/stoprail.lua +local S = attrans + local function updateform(pos) local meta = minetest.get_meta(pos) local pe = advtrains.encode_pos(pos) local npr = advtrains.interlocking.npr_rails[pe] or 2 - meta:set_string("infotext", "Point speed restriction: "..npr) - meta:set_string("formspec", "field[npr;Set point speed restriction:;"..npr.."]") + meta:set_string("infotext", S("Point speed restriction: @1",npr)) + meta:set_string("formspec", "field[npr;"..S("Set point speed restriction:")..";"..npr.."]") end @@ -25,11 +27,11 @@ local adefunc = function(def, preset, suffix, rotation) on_receive_fields = function(pos, formname, fields, player) local pname = player:get_player_name() if not minetest.check_player_privs(pname, {interlocking=true}) then - minetest.chat_send_player(pname, "Interlocking privilege required!") + minetest.chat_send_player(pname, S("You are not allowed to configure this track without the @1 privilege.", "interlocking")) return end if minetest.is_protected(pos, pname) then - minetest.chat_send_player(pname, "This rail is protected!") + minetest.chat_send_player(pname, S("You are not allowed to configure this track.")) minetest.record_protection_violation(pos, pname) return end @@ -59,7 +61,7 @@ if minetest.get_modpath("advtrains_train_track") ~= nil then models_prefix="advtrains_dtrack", models_suffix=".b3d", shared_texture="advtrains_dtrack_shared_npr.png", - description="Point Speed Restriction Rail", + description=S("Point Speed Restriction Track"), formats={}, get_additional_definiton = adefunc, }, advtrains.trackpresets.t_30deg_straightonly) diff --git a/advtrains_line_automation/stoprail.lua b/advtrains_line_automation/stoprail.lua index 55a4785..6c74a3d 100644 --- a/advtrains_line_automation/stoprail.lua +++ b/advtrains_line_automation/stoprail.lua @@ -28,7 +28,7 @@ local function show_stoprailform(pos, player) local pe = advtrains.encode_pos(pos) local pname = player:get_player_name() if minetest.is_protected(pos, pname) then - minetest.chat_send_player(pname, "Position is protected!") + minetest.chat_send_player(pname, attrans("You are not allowed to configure this track.")) return end @@ -73,7 +73,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) local pos = advtrains.decode_pos(pe) if pos then if minetest.is_protected(pos, pname) then - minetest.chat_send_player(pname, "Position is protected!") + minetest.chat_send_player(pname, attrans("You are not allowed to configure this track.")) return end @@ -94,7 +94,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then stdata.stn = fields.stn else - minetest.chat_send_player(pname, "Station code '"..fields.stn.."' does already exist and is owned by "..stn.owner) + minetest.chat_send_player(pname, attrans("Station code \"@1\" already exists and is owned by @2.", fields.stn, stn.owner)) show_stoprailform(pos,player) return end @@ -108,7 +108,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then stn.name = fields.stnname else - minetest.chat_send_player(pname, "Not allowed to edit station name, owned by "..stn.owner) + minetest.chat_send_player(pname, attrans("This station is owned by @1. You are not allowed to edit its name.", stn.owner)) end end @@ -218,7 +218,7 @@ if minetest.get_modpath("advtrains_train_track") ~= nil then models_prefix="advtrains_dtrack", models_suffix=".b3d", shared_texture="advtrains_dtrack_shared_stop.png", - description="Station/Stop Rail", + description=attrans("Station/Stop Track"), formats={}, get_additional_definiton = adefunc, }, advtrains.trackpresets.t_30deg_straightonly) diff --git a/advtrains_luaautomation/active_common.lua b/advtrains_luaautomation/active_common.lua index 50fb2bc..1a7009f 100644 --- a/advtrains_luaautomation/active_common.lua +++ b/advtrains_luaautomation/active_common.lua @@ -1,4 +1,4 @@ - +local S = atltrans local ac = {nodes={}} @@ -14,7 +14,7 @@ end function ac.after_place_node(pos, player) local meta=minetest.get_meta(pos) meta:set_string("formspec", ac.getform(pos, meta)) - meta:set_string("infotext", "LuaATC component, unconfigured.") + meta:set_string("infotext", S("Unconfigured LuaATC component")) local ph=minetest.pos_to_string(pos) --just get first available key! for en,_ in pairs(atlatc.envs) do @@ -43,11 +43,11 @@ function ac.getform(pos, meta_p) end local form = "size["..atlatc.CODE_FORM_SIZE.."]" .."style[code;font=mono]" - .."label[0,-0.1;Environment]" + .."label[0,-0.1;"..S("LuaATC Environment").."]" .."dropdown[0,0.3;3;env;"..table.concat(envs_asvalues, ",")..";"..sel.."]" - .."button[5,0.2;2,1;save;Save]" - .."button[7,0.2;3,1;cle;Clear Local Env.]" - .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;Code;"..minetest.formspec_escape(code).."]" + .."button[5,0.2;2,1;save;"..S("Save").."]" + .."button[7,0.2;3,1;cle;"..S("Clear Local Environment").."]" + .."textarea[0.3,1.5;"..atlatc.CODE_FORM_SIZE..";code;"..S("Code")..";"..minetest.formspec_escape(code).."]" .."label["..atlatc.CODE_FORM_ERRLABELPOS..";"..err.."]" return form end @@ -61,7 +61,7 @@ end function ac.on_receive_fields(pos, formname, fields, player) if not minetest.check_player_privs(player:get_player_name(), {atlatc=true}) then - minetest.chat_send_player(player:get_player_name(), "Missing privilege: atlatc - Operation cancelled!") + minetest.chat_send_player(player:get_player_name(), S("You are not allowed to configure this LuaATC component without the @1 privilege.", "atlatc")) return end @@ -91,9 +91,9 @@ function ac.on_receive_fields(pos, formname, fields, player) meta:set_string("formspec", ac.getform(pos, meta)) if nodetbl.env then - meta:set_string("infotext", "LuaATC component, assigned to environment '"..nodetbl.env.."'") + meta:set_string("infotext", S("LuaATC component assigned to environment '@1'", nodetbl.env)) else - meta:set_string("infotext", "LuaATC component, invalid enviroment set!") + meta:set_string("infotext", S("LuaATC component assigned to an invalid environment")) end end @@ -168,7 +168,7 @@ function ac.run_in_env(pos, evtdata, customfct_p, ignore_no_code) atlatc.active.nodes[ph].err=dataout env:log("error", "LuaATC component at",ph,": LUA Error:",dataout) if meta then - meta:set_string("infotext", "LuaATC component, ERROR:"..dataout) + meta:set_string("infotext", S("LuaATC component with error: @1", dataout)) end --TODO temporary --if customfct.atc_id then diff --git a/advtrains_luaautomation/atc_rail.lua b/advtrains_luaautomation/atc_rail.lua index b98648e..f6a7823 100644 --- a/advtrains_luaautomation/atc_rail.lua +++ b/advtrains_luaautomation/atc_rail.lua @@ -220,7 +220,7 @@ advtrains.register_tracks("default", { models_prefix="advtrains_dtrack", models_suffix=".b3d", shared_texture="advtrains_dtrack_shared_atc.png", - description=atltrans("LuaATC Rail"), + description=atltrans("LuaATC Track"), formats={}, get_additional_definiton = function(def, preset, suffix, rotation) return { diff --git a/advtrains_luaautomation/init.lua b/advtrains_luaautomation/init.lua index c51aa71..b359142 100644 --- a/advtrains_luaautomation/init.lua +++ b/advtrains_luaautomation/init.lua @@ -2,15 +2,15 @@ -- Lua automation features for advtrains -- Uses global table 'atlatc' (AdvTrains_LuaATC) ---TODO: re-add localization (if merging localization, discard this hunk please) -atltrans = function(s,a,...)a={a,...}return s:gsub("@(%d+)",function(n)return a[tonumber(n)]end)end +atltrans = attrans +local S = atltrans --Privilege --Only trusted players should be enabled to build stuff which can break the server. atlatc = { envs = {}} -minetest.register_privilege("atlatc", { description = "Player can place and modify LUA ATC components. Grant with care! Allows to execute bad LUA code.", give_to_singleplayer = false, default= false }) +minetest.register_privilege("atlatc", { description = S("Can place and configure LuaATC components, including execute potentially harmful Lua code"), give_to_singleplayer = false, default= false }) --Size of code input forms in X,Y notation. Must be at least 10x10 atlatc.CODE_FORM_SIZE = "15,12" diff --git a/advtrains_luaautomation/mesecon_controller.lua b/advtrains_luaautomation/mesecon_controller.lua index bffff84..6981839 100644 --- a/advtrains_luaautomation/mesecon_controller.lua +++ b/advtrains_luaautomation/mesecon_controller.lua @@ -6,6 +6,7 @@ -- From Mesecons mod https://mesecons.net/ -- (c) Jeija and Contributors +local S = atltrans local BASENAME = "advtrains_luaautomation:mesecon_controller" local rules = { @@ -207,7 +208,7 @@ for d = 0, 1 do } minetest.register_node(node_name, { - description = "LuaATC Mesecon Controller", + description = S("LuaATC Mesecon Controller"), drawtype = "nodebox", tiles = { top, diff --git a/advtrains_luaautomation/operation_panel.lua b/advtrains_luaautomation/operation_panel.lua index c118ff3..8e12651 100644 --- a/advtrains_luaautomation/operation_panel.lua +++ b/advtrains_luaautomation/operation_panel.lua @@ -1,3 +1,4 @@ +local S = atltrans local function on_punch(pos,node,player) atlatc.interrupt.add(0, pos, {type="punch", punch=true, name=player:get_player_name()}) @@ -7,7 +8,7 @@ end minetest.register_node("advtrains_luaautomation:oppanel", { drawtype = "normal", tiles={"atlatc_oppanel.png"}, - description = "LuaATC operation panel", + description = S("LuaATC Operation Panel"), groups = { cracky = 1, save_in_at_nodedb=1, diff --git a/advtrains_luaautomation/pcnaming.lua b/advtrains_luaautomation/pcnaming.lua index 5624b74..0089ae7 100644 --- a/advtrains_luaautomation/pcnaming.lua +++ b/advtrains_luaautomation/pcnaming.lua @@ -2,6 +2,8 @@ --a.k.a Passive component naming --Allows to assign names to passive components, so they can be called like: --setstate("iamasignal", "green") +local S = atltrans + atlatc.pcnaming={name_map={}} function atlatc.pcnaming.load(stuff) if type(stuff)=="table" then @@ -26,7 +28,7 @@ end local pcrename = {} minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ - description = attrans("Passive Component Naming Tool\n\nRight-click to name a passive component."), + description = S("Passive Component Naming Tool\n\nRight-click to name a passive component."), groups = {cracky=1}, -- key=name, value=rating; rating=1..3. inventory_image = "atlatc_pcnaming.png", wield_image = "atlatc_pcnaming.png", @@ -37,7 +39,7 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ return end if not minetest.check_player_privs(pname, {atlatc=true}) then - minetest.chat_send_player(pname, "Missing privilege: atlatc") + minetest.chat_send_player(pname, S("You are not allowed to name LuaATC passive components without the @1 privilege.", "atlatc")) return end if pointed_thing.type=="node" then @@ -62,7 +64,7 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{ end end pcrename[pname] = pos - minetest.show_formspec(pname, "atlatc_naming", "field[pn;Set name of component (empty to clear);"..minetest.formspec_escape(pn).."]") + minetest.show_formspec(pname, "atlatc_naming", "field[pn;"..S("Set name of component (empty to clear)")..";"..minetest.formspec_escape(pn).."]") end end end, -- cgit v1.2.3 From 922e654b7bef51c7ddaf510ec70880d48181dd35 Mon Sep 17 00:00:00 2001 From: orwell Date: Mon, 25 Nov 2024 22:31:26 +0100 Subject: Make Buffers become implicitly their own TCBs and signals when interlocking is enabled --- advtrains/signals.lua | 8 +- advtrains/trackplacer.lua | 16 ++-- advtrains/tracks.lua | 1 + advtrains_interlocking/database.lua | 41 +++++++++- advtrains_interlocking/mod.conf | 2 +- advtrains_interlocking/route_prog.lua | 7 +- advtrains_interlocking/signal_api.lua | 23 ++++-- advtrains_interlocking/tcb_ts_ui.lua | 146 ++++++++++++++++++++++++++++++++-- advtrains_train_track/init.lua | 29 +++++++ advtrains_train_track/mod.conf | 2 +- 10 files changed, 242 insertions(+), 33 deletions(-) (limited to 'advtrains/signals.lua') diff --git a/advtrains/signals.lua b/advtrains/signals.lua index 4dec7f5..8bdd877 100644 --- a/advtrains/signals.lua +++ b/advtrains/signals.lua @@ -3,15 +3,15 @@ local mrules_wallsignal = advtrains.meseconrules -local function can_dig_func(pos) +local function can_dig_func(pos, player) if advtrains.interlocking then - return advtrains.interlocking.signal.can_dig(pos) + return advtrains.interlocking.signal.can_dig(pos, player) end return true end -local function after_dig_func(pos) +local function after_dig_func(pos, oldnode, oldmetadata, digger) if advtrains.interlocking then - return advtrains.interlocking.signal.after_dig(pos) + return advtrains.interlocking.signal.after_dig(pos, oldnode, oldmetadata, digger) end return true end diff --git a/advtrains/trackplacer.lua b/advtrains/trackplacer.lua index 6a2c7a8..1543209 100644 --- a/advtrains/trackplacer.lua +++ b/advtrains/trackplacer.lua @@ -152,12 +152,14 @@ local function check_or_bend_rail(origin, dir, pname, commit) end end -local function track_place_node(pos, node, ndef) +local function track_place_node(pos, node, ndef, pname) --atdebug("track_place_node: ",pos, node) advtrains.ndb.swap_node(pos, node) local ndef = minetest.registered_nodes[node.name] if ndef and ndef.after_place_node then - ndef.after_place_node(pos) + -- resolve player again + local player = pname and core.get_player_by_name(pname) or nil + ndef.after_place_node(pos, player) -- note: itemstack and pointed_thing are NOT available here anymore (crap!) end end @@ -191,16 +193,16 @@ function tp.place_track(pos, tpg, pname, yaw) for k1, conn1 in ipairs(cand) do for k2, conn2 in ipairs(cand) do if k1~=k2 then - -- order of conn1/conn2: prefer conn2 being in the direction of the player facing. + -- order of conn1/conn2: prefer conn1 being in the direction of the player facing. -- the combination the other way round will be run through in a later loop iteration - if advtrains.yawToDirection(yaw, conn1, conn2) == conn2 then + if advtrains.yawToDirection(yaw, conn1, conn2) == conn1 then -- does there exist a suitable double-connection rail? --atdebug("Try double conn: ",conn1, conn2) local node = g.double[conn1.."_"..conn2] if node then check_or_bend_rail(pos, conn1, pname, true) check_or_bend_rail(pos, conn2, pname, true) - track_place_node(pos, node) -- calls after_place_node implicitly + track_place_node(pos, node, pname) -- calls after_place_node implicitly return true end end @@ -220,13 +222,13 @@ function tp.place_track(pos, tpg, pname, yaw) local node = single[conn1] if node then check_or_bend_rail(pos, conn1, pname, true) - track_place_node(pos, node) -- calls after_place_node implicitly + track_place_node(pos, node, nil, pname) -- calls after_place_node implicitly return true end end -- 4. if nothing worked, set the default local node = g.default - track_place_node(pos, node) -- calls after_place_node implicitly + track_place_node(pos, node, nil, pname) -- calls after_place_node implicitly return true end diff --git a/advtrains/tracks.lua b/advtrains/tracks.lua index 661da8a..fa7b702 100644 --- a/advtrains/tracks.lua +++ b/advtrains/tracks.lua @@ -253,6 +253,7 @@ end -- Function called when a track is about to be dug or modified by the trackworker -- Returns either true (ok) or false,"translated string describing reason why it isn't allowed" +-- Impl Note: possibly duplicate code in "self contained TCB" - see interlocking/tcb_ts_ui.lua! function advtrains.can_dig_or_modify_track(pos) if advtrains.get_train_at_pos(pos) then return false, attrans("Position is occupied by a train.") diff --git a/advtrains_interlocking/database.lua b/advtrains_interlocking/database.lua index e77d073..75247de 100644 --- a/advtrains_interlocking/database.lua +++ b/advtrains_interlocking/database.lua @@ -802,10 +802,18 @@ function ildb.create_tcb_at(pos) end -- Remove TCB at the position and update/repair the now joined section -function ildb.remove_tcb_at(pos) +-- skip_tsrepair: should be set to true when the rail node at the TCB position is already gone. +-- Assumes the track sections are now separated and does not attempt the repair process. +function ildb.remove_tcb_at(pos, pname, skip_tsrepair) --atdebug("remove_tcb_at",pos) local pts = advtrains.encode_pos(pos) local old_tcb = track_circuit_breaks[pts] + -- unassign signals if defined + for connid=1,2 do + if old_tcb[connid].signal then + ildb.set_sigd_for_signal(old_tcb[connid].signal, nil) + end + end track_circuit_breaks[pts] = nil -- purge the track sections adjacent if old_tcb[1].ts_id then @@ -823,7 +831,9 @@ function ildb.remove_tcb_at(pos) end advtrains.interlocking.remove_tcb_marker(pos) -- If needed, merge the track sections here - ildb.check_and_repair_ts_at_pos(pos, nil) + if not skip_tsrepair then + ildb.check_and_repair_ts_at_pos(pos, pname) + end return true end @@ -973,11 +983,34 @@ function ildb.get_sigd_for_signal(pos) end return nil end -function ildb.set_sigd_for_signal(pos, sigd) +function ildb.set_sigd_for_signal(pos, sigd) -- do not use! local pts = advtrains.roundfloorpts(pos) signal_assignments[pts] = sigd end +-- Assign the signal at pos to the given TCB side. +function ildb.assign_signal_to_tcbs(pos, sigd) + local tcbs = ildb.get_tcbs(sigd) + assert(tcbs, "assign_signal_to_tcbs invalid sigd!") + tcbs.signal = pos + if not tcbs.routes then + tcbs.routes = {} + end + ildb.set_sigd_for_signal(pos, sigd) +end + +-- unassign the signal from the given sigd (looks in tcbs.signal for the signalpos) +function ildb.unassign_signal_for_tcbs(sigd) + local tcbs = advtrains.interlocking.db.get_tcbs(sigd) + if not tcbs then return end + local pos = tcbs.signal + if not pos then return end + ildb.set_sigd_for_signal(pos, nil) + tcbs.signal = nil + tcbs.route_aspect = nil + tcbs.route_remote = nil +end + -- checks if there's any influence point set to this position -- if purge is true, checks whether the associated signal still exists -- and deletes the ip if not. @@ -987,7 +1020,7 @@ function ildb.is_ip_at(pos, purge) if purge then -- is there still a signal assigned to it? for connid, sigpos in pairs(influence_points[pts]) do - local asp = advtrains.interlocking.signal_get_aspect(sigpos) + local asp = advtrains.interlocking.signal.get_aspect(sigpos) if not asp then atlog("Clearing orphaned signal influence point", pts, "/", connid) ildb.clear_ip_signal(pts, connid) diff --git a/advtrains_interlocking/mod.conf b/advtrains_interlocking/mod.conf index 3b2d029..9191dd9 100644 --- a/advtrains_interlocking/mod.conf +++ b/advtrains_interlocking/mod.conf @@ -4,4 +4,4 @@ description=Interlocking system for Advanced Trains author=orwell96 depends=advtrains -optional_depends=advtrains_train_track +#optional_depends=advtrains_train_track diff --git a/advtrains_interlocking/route_prog.lua b/advtrains_interlocking/route_prog.lua index 2f0f8ee..3bdf6d6 100644 --- a/advtrains_interlocking/route_prog.lua +++ b/advtrains_interlocking/route_prog.lua @@ -535,9 +535,12 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing) -- show formspec show_routing_form(pname, tcbpos) - advtrains.interlocking.visualize_route(rp.origin, rp.route, "prog_"..pname, rp.tmp_lcks, pname) - + return + elseif advtrains.interlocking.database.get_tcb(pos) then + -- the punched node itself is a TCB + show_routing_form(pname, pos) + advtrains.interlocking.visualize_route(rp.origin, rp.route, "prog_"..pname, rp.tmp_lcks, pname) return end if advtrains.is_passive(pos) then diff --git a/advtrains_interlocking/signal_api.lua b/advtrains_interlocking/signal_api.lua index 9b0479f..8347b1c 100644 --- a/advtrains_interlocking/signal_api.lua +++ b/advtrains_interlocking/signal_api.lua @@ -400,7 +400,8 @@ end -- 0: not a signal at all -- 1: signal has get_aspect_info() but the aspect is not variable (e.g. a sign) -- 2: signal has apply_aspect() but does not have main aspects (e.g. a pure distant signal) --- 3: Full capabilities, signal has main aspects and can be used as main/shunt signal (can be start/endpoint of a route) +-- 3: signal has main signal role but can only ever display a halt aspect, such as a bumper (can be endpoint, but not startpoint, of a route) +-- 4: Full capabilities, signal has main aspects and can be used as main/shunt signal (can be start/endpoint of a route) function signal.get_signal_cap_level(pos) local node = advtrains.ndb.get_node_or_nil(pos) local ndef = node and minetest.registered_nodes[node.name] @@ -408,6 +409,10 @@ function signal.get_signal_cap_level(pos) if ndefat and ndefat.get_aspect_info then if ndefat.apply_aspect then if ndefat.main_aspects then + -- if the table contains anything, 4, otherwise 3 + for _,_ in pairs(ndefat.main_aspects) do + return 4 + end return 3 end return 2 @@ -419,9 +424,17 @@ end ---------------- -function signal.can_dig(pos) +function signal.can_dig(pos, player) local sigd = advtrains.interlocking.db.get_sigd_for_signal(pos) if sigd then + -- check privileges + if not player or not minetest.check_player_privs(player:get_player_name(), "interlocking") then + if not player then -- intermediate debug to uncover hard-to-find bugz + atdebug("advtrains.interlocking.signal.can_dig(",pos,") called with player==nil!") + end + return false + end + -- check if route is set local tcbs = advtrains.interlocking.db.get_tcbs(sigd) if tcbs.routeset then return false @@ -434,11 +447,7 @@ function signal.after_dig(pos, oldnode, oldmetadata, player) -- unassign signal if necessary local sigd = advtrains.interlocking.db.get_sigd_for_signal(pos) if sigd then - local tcbs = advtrains.interlocking.db.get_tcbs(sigd) - advtrains.interlocking.db.set_sigd_for_signal(pos, nil) - tcbs.signal = nil - tcbs.route_aspect = nil - tcbs.route_remote = nil + advtrains.interlocking.db.unassign_signal_for_tcbs(sigd) minetest.chat_send_player(player:get_player_name(), "Signal has been unassigned. Name and routes are kept for reuse.") end -- TODO clear influence point diff --git a/advtrains_interlocking/tcb_ts_ui.lua b/advtrains_interlocking/tcb_ts_ui.lua index 1cdbb29..2b93234 100755 --- a/advtrains_interlocking/tcb_ts_ui.lua +++ b/advtrains_interlocking/tcb_ts_ui.lua @@ -156,7 +156,7 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing) local tcbnpos = players_assign_tcb[pname] if tcbnpos then if vector.distance(pos, tcbnpos)<=20 then - local node_ok, conns, rhe = advtrains.get_rail_info_at(pos, advtrains.all_tracktypes) + local node_ok, conns, rhe = advtrains.get_rail_info_at(pos) if node_ok and #conns == 2 then -- if there is already a tcb here, reassign it if ildb.get_tcb(pos) then @@ -189,11 +189,7 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing) if ndef and ndef.advtrains and ndef.advtrains.apply_aspect then local tcbs = ildb.get_tcbs(sigd) if tcbs then - tcbs.signal = pos - if not tcbs.routes then - tcbs.routes = {} - end - ildb.set_sigd_for_signal(pos, sigd) + ildb.assign_signal_to_tcbs(pos, sigd) minetest.chat_send_player(pname, "Configuring TCB: Successfully assigned signal.") advtrains.interlocking.show_ip_form(pos, pname, true) else @@ -212,6 +208,138 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing) end end) +-- "Self-contained TCB" +-- 2024-11-25: Buffers should become their own TCB (and signal) automatically to permit setting routes to them +-- These are support functions for this kind of node. + +-- Create an after_place_node callback for a self-contained TCB node. The parameters control additional behavior: +-- fail_silently_on_noprivs: (boolean) Does not give an error in case the placer does not have the interlocking privilege +-- auto_create_self_signal: (boolean) Automatically assign this same node as signal to the A side of the newly-created TCB +-- (this is useful for buffers as they serve both as TCB and as an always-halt signal) +function advtrains.interlocking.self_tcb_make_after_place_callback(fail_silently_on_noprivs, auto_create_self_signal) + return function(pos, player, itemstack, pointed_thing) + atdebug("selftcb apn ",pos, player, itemstack, pointed_thing) + local pname = player:get_player_name() + if not minetest.check_player_privs(pname, "interlocking") then + if not fail_silently_on_noprivs then + minetest.chat_send_player(pname, "Insufficient privileges to use this!") + end + return + end + if ildb.get_tcb(pos) then + minetest.chat_send_player(pname, "TCB already existed at this position, now linked to this node") + else + ildb.create_tcb_at(pos, pname) + end + if auto_create_self_signal then + local sigd = { p = pos, s = 1 } + local tcbs = ildb.get_tcbs(sigd) + -- make sure signal doesn't already exist + if tcbs.signal then + minetest.chat_send_player(pname, "Signal on B side already assigned!") + return + end + ildb.assign_signal_to_tcbs(pos, sigd) + -- assign influence point to itself + ildb.set_ip_signal(advtrains.roundfloorpts(pos), 1, pos) + end + end +end + +-- Create an can_dig callback for a self-contained TCB node. The parameters control additional behavior: +-- is_signal: (boolean) Whether this node is also a signal (in addition to being a TCB), e.g. when auto_create_self_signal was set. +-- Causes also the signal API's can_dig to be called +function advtrains.interlocking.self_tcb_make_can_dig_callback(is_signal) + return function(pos, player) + local pname = player and player:get_player_name() or "" + -- need to duplicate logic of the regular "can_dig_or_modify_track()" function in core/tracks.lua + if advtrains.get_train_at_pos(pos) then + minetest.chat_send_player(pname, "Can't remove track, a train is here!") + return false + end + -- end of standard checks + local tcb = ildb.get_tcb(pos) + if not tcb then + -- digging always allowed because the TCB hasn't been created (unless signal callback interjects) + if is_signal then + return advtrains.interlocking.signal.can_dig(pos, player) + else + return true + end + end + -- TCB exists + if not minetest.check_player_privs(pname, "interlocking") then + return false + end + -- fine to remove (unless signal callback interjects) + if is_signal then + return advtrains.interlocking.signal.can_dig(pos, player) + else + return true + end + end +end + +-- Create an after_dig_node callback for a self-contained TCB node. The parameters control additional behavior: +-- is_signal: (boolean) Whether this node is also a signal (in addition to being a TCB), e.g. when auto_create_self_signal was set. +-- Causes also the signal API's after_dig_node to be called +function advtrains.interlocking.self_tcb_make_after_dig_callback(is_signal) + return function(pos, oldnode, oldmetadata, player) + local pname = player:get_player_name() + if is_signal then + -- "dig" the signal first + advtrains.interlocking.signal.after_dig(pos, oldnode, oldmetadata, player) + end + if ildb.get_tcb(pos) then + -- remove the TCB + ildb.remove_tcb_at(pos, pname, true) + end + end +end + +-- Create an on_rightclick callback for a self-contained TCB node. The rightclick callback tries to repeat the TCB assignment +-- if necessary and otherwise shows the TCB formspec. The parameters control additional behavior: +-- fail_silently_on_noprivs: (boolean) Does not give an error in case the placer does not have the interlocking privilege +-- auto_create_self_signal: (boolean) Automatically assign this same node as signal to the B side of the +-- newly-created TCB if that has not already happened during place. +-- Otherwise, opens the signal dialog instead of the TCB dialog on rightclick +function advtrains.interlocking.self_tcb_make_on_rightclick_callback(fail_silently_on_noprivs, auto_create_self_signal) + return function(pos, node, player, itemstack, pointed_thing) + local pname = player:get_player_name() + if not minetest.check_player_privs(pname, "interlocking") then + if not fail_silently_on_noprivs then + minetest.chat_send_player(pname, "Insufficient privileges to use this!") + end + return + end + if ildb.get_tcb(pos) then + -- TCB already here. go on + else + -- otherwise create tcb + ildb.create_tcb_at(pos, pname) + end + if auto_create_self_signal then + local sigd = { p = pos, s = 1 } + local tcbs = ildb.get_tcbs(sigd) + -- make sure signal doesn't already exist + if not tcbs.signal then + -- go ahead and assign signal + ildb.assign_signal_to_tcbs(pos, sigd) + -- assign influence point to itself + ildb.set_ip_signal(advtrains.roundfloorpts(pos), 1, pos) + end + -- in any case open the signalling form nouw + local control = player:get_player_control() + advtrains.interlocking.show_signal_form(pos, node, pname, control.aux1) + return + else + -- not an autosignal. Then show the TCB form + advtrains.interlocking.show_tcb_form(pos, pname) + return + end + end +end + -- TCB Form local function mktcbformspec(pos, side, tcbs, offset, pname) @@ -666,7 +794,7 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle -- no route is active, and no route is so far defined if not tcbs.signal then atwarn("signalling form missing signal?!", pos) return end -- safeguard, nothing else in this function checks tcbs.signal local caps = advtrains.interlocking.signal.get_signal_cap_level(tcbs.signal) - if caps >= 3 then + if caps >= 4 then -- offer user the "block signal mode" form = form.."label[0.5,2.5;No routes are yet defined.]" if hasprivs then @@ -683,6 +811,10 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle .."Sets a route into the section ahead with auto-working set on\n" .."Short block: This signal becomes distant signal for next signal.]" end + elseif caps >= 3 then + -- it's a buffer! + form = form.."label[0.5,2.5;This is an always-halt signal (e.g. a buffer)\n" + .."No routes can be set from here.]" else -- signal caps say it cannot be route start/end form = form.."label[0.5,2.5;This is a Non-Halt signal (e.g. pure distant signal)\n" diff --git a/advtrains_train_track/init.lua b/advtrains_train_track/init.lua index 32e1235..f551ec5 100644 --- a/advtrains_train_track/init.lua +++ b/advtrains_train_track/init.lua @@ -600,6 +600,35 @@ advtrains.register_tracks("default", { --bumpers still use the old texture until the models are redone. description=attrans("Bumper"), formats={}, + get_additional_definiton = function(def, preset, suffix, rotation) + -- 2024-11-25: Bumpers get the additional feature of being both a signal and a self-contained TCB, when interlocking is used. + if advtrains.interlocking then + return { + -- use the special callbacks for self_tcb (see tcb_ts_ui.lua) + can_dig = advtrains.interlocking.self_tcb_make_can_dig_callback(true), + after_dig_node = advtrains.interlocking.self_tcb_make_after_dig_callback(true), + after_place_node = advtrains.interlocking.self_tcb_make_after_place_callback(true, true), + on_rightclick = advtrains.interlocking.self_tcb_make_on_rightclick_callback(false, true), + advtrains = { + main_aspects = { + -- No main aspects, it always shows Stop. + -- But we need to define the table so that signal caplevel is 3 + }, + apply_aspect = function(pos, node, main_aspect, rem_aspect, rem_aspinfo) + -- is a no-op for bumpers, it always shows Stop + end, + get_aspect_info = function(pos, main_aspect) + -- it always shows Stop + return advtrains.interlocking.signal.ASPI_HALT + end, + distant_support = false, -- not a distant + route_role = "end", -- the end is nigh! + } + } + else + return {} -- no additional defs when interlocking is not used + end + end, }, advtrains.ap.t_30deg_straightonly) minetest.register_craft({ output = 'advtrains:dtrack_bumper_placer 2', diff --git a/advtrains_train_track/mod.conf b/advtrains_train_track/mod.conf index 2aece3e..a7fef4d 100644 --- a/advtrains_train_track/mod.conf +++ b/advtrains_train_track/mod.conf @@ -4,4 +4,4 @@ description=Default track set for Advanced Trains author=orwell96 depends=advtrains -optional_depends=mesecons,digtron +optional_depends=mesecons,digtron,advtrains_interlocking -- cgit v1.2.3 From b2889e33ba389c936b9d6b1ca5be27ef8f147280 Mon Sep 17 00:00:00 2001 From: orwell Date: Tue, 3 Dec 2024 00:56:17 +0100 Subject: Feature to add passive components to a section as fixed locks (for level crossings) --- advtrains/p_mesecon_iface.lua | 2 +- advtrains/signals.lua | 2 +- advtrains_interlocking/database.lua | 7 ++++- advtrains_interlocking/tcb_ts_ui.lua | 59 +++++++++++++++++++++++++++++++++--- 4 files changed, 63 insertions(+), 7 deletions(-) (limited to 'advtrains/signals.lua') diff --git a/advtrains/p_mesecon_iface.lua b/advtrains/p_mesecon_iface.lua index 0b99891..0426e2b 100644 --- a/advtrains/p_mesecon_iface.lua +++ b/advtrains/p_mesecon_iface.lua @@ -46,7 +46,7 @@ minetest.override_item("mesecons_switch:mesecon_switch_on", { mesecon.receptor_off(pos) end end, - fallback_state = "off", + node_fallback_state = "off", on_updated_from_nodedb = function(pos, node) mesecon.receptor_on(pos) end, diff --git a/advtrains/signals.lua b/advtrains/signals.lua index 8bdd877..e3d75c3 100644 --- a/advtrains/signals.lua +++ b/advtrains/signals.lua @@ -310,7 +310,7 @@ minetest.register_node("advtrains:across_on", { advtrains = { node_state = "on", node_state_map = { on = "advtrains:across_on", off = "advtrains:across_off" }, - fallback_state = "off", + node_fallback_state = "off", }, on_rightclick=function(pos, node, player) if advtrains.check_turnout_signal_protection(pos, player:get_player_name()) then diff --git a/advtrains_interlocking/database.lua b/advtrains_interlocking/database.lua index c05e69a..09b1c72 100644 --- a/advtrains_interlocking/database.lua +++ b/advtrains_interlocking/database.lua @@ -758,6 +758,7 @@ function ildb.update_rs_cache(ts_id) --atdebug("Starting for ",start_tcbi, start_tcbs) local locks_found = {} local result_table = {} + recursively_find_routes(start_tcbs.p, start_tcbs.s, locks_found, result_table, TS_MAX_SCAN) -- now result_table contains found route locks. Match them with the other TCBs we have in this section for end_tcbi, end_tcbs in ipairs(ts.tc_breaks) do @@ -765,7 +766,11 @@ function ildb.update_rs_cache(ts_id) end_pkey = advtrains.encode_pos(end_tcbs.p) if result_table[end_pkey] then --atdebug("Set RSCache entry",end_pkey.."-"..end_pkey,"=",result_table[end_pkey]) - rscache[start_pkey][end_pkey] = result_table[end_pkey] + local lockstab = result_table[end_pkey] + if ts.fixed_locks then -- include the sections fixedlocks if present + for pts, st in pairs(ts.fixed_locks) do lockstab[pts] = st end + end + rscache[start_pkey][end_pkey] = lockstab result_table[end_pkey] = nil end end diff --git a/advtrains_interlocking/tcb_ts_ui.lua b/advtrains_interlocking/tcb_ts_ui.lua index 87e56ca..bc52339 100755 --- a/advtrains_interlocking/tcb_ts_ui.lua +++ b/advtrains_interlocking/tcb_ts_ui.lua @@ -4,6 +4,7 @@ local players_assign_tcb = {} local players_assign_signal = {} local players_assign_xlink = {} local players_link_ts = {} +local players_assign_fixedlocks = {} local ildb = advtrains.interlocking.db local ilrs = advtrains.interlocking.route @@ -206,6 +207,28 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing) end players_assign_signal[pname] = nil end + + -- FixedLocks assignment + local ts_id = players_assign_fixedlocks[pname] + if ts_id then + if advtrains.is_passive(pos) then + local pts = advtrains.encode_pos(pos) + local state = advtrains.getstate(pos) + local ts = ildb.get_ts(ts_id) + if ts and ts.fixed_locks then + minetest.chat_send_player(pname, minetest.pos_to_string(pos).." locks in state "..state) + ts.fixed_locks[pts] = state + else + minetest.chat_send_player(pname, "Error: TS modified, abort!") + players_assign_fixedlocks[pname] = nil + end + else + minetest.chat_send_player(pname, "Setting fixed locks finished!") + players_assign_fixedlocks[pname] = nil + ildb.update_rs_cache(ts_id) + advtrains.interlocking.show_ts_form(ts_id, pname) + end + end end) -- "Self-contained TCB" @@ -492,7 +515,7 @@ function advtrains.interlocking.show_ts_form(ts_id, pname) local ts = ildb.get_ts(ts_id) if not ts_id then return end - local form = "size[10,10]label[0.5,0.5;Track Section Detail - "..ts_id.."]" + local form = "size[10.5,10]label[0.5,0.5;Track Section Detail - "..ts_id.."]" form = form.."field[0.8,2;5.2,1;name;Section name;"..minetest.formspec_escape(ts.name or "").."]" form = form.."button[5.5,1.7;1,1;setname;Set]" local hint @@ -503,11 +526,27 @@ function advtrains.interlocking.show_ts_form(ts_id, pname) advtrains.interlocking.show_tcb_marker(sigd.p) end - form = form.."textlist[0.5,3;5,3;tcblist;"..table.concat(strtab, ",").."]" + form = form.."label[0.5,2.5;Boundary TCBs:]" + form = form.."textlist[0.5,3;4,3;tcblist;"..table.concat(strtab, ",").."]" + + -- additional route locks (e.g. for level crossings) + + strtab = {} + if ts.fixed_locks then + for pts, state in pairs(ts.fixed_locks) do + strtab[#strtab+1] = minetest.formspec_escape( + minetest.pos_to_string(advtrains.decode_pos(pts)).." = "..state) + end + end + form = form.."label[5.5,2.5;Fixed route locks (e.g. level crossings):]" + form = form.."textlist[5.5,3;4,3;fixedlocks;"..table.concat(strtab, ",").."]" if ildb.may_modify_ts(ts) then - form = form.."button[5.5,4;4,1;remove;Remove Section]" - form = form.."tooltip[dissolve;This will remove the track section and set all its end points to End Of Interlocking]" + form = form.."button[5.5,6;2,1;flk_add;Add locks]" + form = form.."button[7.5,6;2,1;flk_clear;Clear locks]" + + form = form.."button[5.5,8;4,1;remove;Remove Section]" + form = form.."tooltip[remove;This will remove the track section and set all its end points to End Of Interlocking]" else hint=3 end @@ -564,6 +603,18 @@ minetest.register_on_player_receive_fields(function(player, formname, fields) end end + if fields.flk_add then + if not ts.fixed_locks then + ts.fixed_locks = {} + end + players_assign_fixedlocks[pname] = ts_id + minetest.chat_send_player(pname, "Punch components to add fixed locks. (punch anything else = end)") + minetest.close_formspec(pname, formname) + return + elseif fields.flk_clear then + ts.fixed_locks = nil + end + if fields.reset then -- User requested resetting the section -- Show him what this means... -- cgit v1.2.3 From 0b7fdc66bc2fbc47aff7bc6b494e6bd3cff29728 Mon Sep 17 00:00:00 2001 From: orwell Date: Tue, 25 Mar 2025 20:49:55 +0100 Subject: Old builtin signals: add route_role --- advtrains/signals.lua | 3 +++ 1 file changed, 3 insertions(+) (limited to 'advtrains/signals.lua') diff --git a/advtrains/signals.lua b/advtrains/signals.lua index e3d75c3..2b7362e 100644 --- a/advtrains/signals.lua +++ b/advtrains/signals.lua @@ -102,6 +102,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", main_aspects = main_aspects, apply_aspect = simple_apply_aspect("advtrains:retrosignal_off"..rotation, "advtrains:retrosignal_on"..rotation), get_aspect_info = function() return aspect(r=="on") end, + route_role = "main", }, can_dig = can_dig_func, after_dig_node = after_dig_func, @@ -153,6 +154,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", main_aspects = main_aspects, apply_aspect = simple_apply_aspect("advtrains:signal_off"..rotation, "advtrains:signal_on"..rotation), get_aspect_info = function() return aspect(r=="on") end, + route_role = "main", node_state = f.ls, node_state_map = { red = "advtrains:signal_off"..rotation, green = "advtrains:signal_on"..rotation}, node_on_switch_state = function(pos, new_node, old_state, new_state) @@ -224,6 +226,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", main_aspects = main_aspects, apply_aspect = simple_apply_aspect("advtrains:signal_wall_"..loc.."_off", "advtrains:signal_wall_"..loc.."_on"), get_aspect_info = function() return aspect(r=="on") end, + route_role = "main", node_state = f.ls, node_state_map = { red = "advtrains:signal_wall_"..loc.."_off", green = "advtrains:signal_wall_"..loc.."_on" }, node_on_switch_state = function(pos, new_node, old_state, new_state) -- cgit v1.2.3 From 87b566cb6f63d47c8cb093cfd452bfa8c39b480c Mon Sep 17 00:00:00 2001 From: Jürgen Rühle Date: Tue, 8 Apr 2025 09:39:00 +0200 Subject: Actually show signal influence point form with AUX1 Currently a signal assigned to a TCB will always show the signalling form even when AUX1 is held. --- advtrains/signals.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'advtrains/signals.lua') diff --git a/advtrains/signals.lua b/advtrains/signals.lua index 2b7362e..35e118c 100644 --- a/advtrains/signals.lua +++ b/advtrains/signals.lua @@ -83,7 +83,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", on_rightclick=function(pos, node, player) local pname = player:get_player_name() local sigd = advtrains.interlocking and advtrains.interlocking.db.get_sigd_for_signal(pos) - if sigd then + if sigd and not player:get_player_control().aux1 then advtrains.interlocking.show_signalling_form(sigd, pname) elseif advtrains.interlocking and player:get_player_control().aux1 then advtrains.interlocking.show_ip_form(pos, pname) @@ -141,7 +141,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", on_rightclick=function(pos, node, player) local pname = player:get_player_name() local sigd = advtrains.interlocking and advtrains.interlocking.db.get_sigd_for_signal(pos) - if sigd then + if sigd and not player:get_player_control().aux1 then advtrains.interlocking.show_signalling_form(sigd, pname) elseif advtrains.interlocking and player:get_player_control().aux1 then advtrains.interlocking.show_ip_form(pos, pname) @@ -213,7 +213,7 @@ for r,f in pairs({on={as="off", ls="green", als="red"}, off={as="on", ls="red", on_rightclick=function(pos, node, player) local pname = player:get_player_name() local sigd = advtrains.interlocking and advtrains.interlocking.db.get_sigd_for_signal(pos) - if sigd then + if sigd and not player:get_player_control().aux1 then advtrains.interlocking.show_signalling_form(sigd, pname) elseif advtrains.interlocking and player:get_player_control().aux1 then advtrains.interlocking.show_ip_form(pos, pname) -- cgit v1.2.3