aboutsummaryrefslogtreecommitdiff
path: root/advtrains
diff options
context:
space:
mode:
Diffstat (limited to 'advtrains')
-rw-r--r--advtrains/couple.lua24
-rw-r--r--advtrains/crafting.lua17
-rw-r--r--advtrains/init.lua18
-rw-r--r--advtrains/occupation.lua12
-rw-r--r--advtrains/po/advtrains.pot325
-rw-r--r--advtrains/po/de.po731
-rw-r--r--advtrains/po/fr.po790
-rwxr-xr-xadvtrains/po/update-translations.sh1
-rw-r--r--advtrains/po/zh_CN.po705
-rw-r--r--advtrains/po/zh_TW.po705
-rw-r--r--advtrains/poconvert.lua2
-rw-r--r--advtrains/settingtypes.txt3
-rw-r--r--advtrains/sounds/advtrains_crossing_bell.oggbin47722 -> 24656 bytes
-rw-r--r--advtrains/spec/poconvert_spec.lua6
-rw-r--r--advtrains/spec/texture_spec.lua19
-rw-r--r--advtrains/spec/wagons_spec.lua40
-rw-r--r--advtrains/texture.lua228
-rw-r--r--advtrains/textures/advtrains_wagon_prop_tool.pngbin0 -> 779 bytes
-rw-r--r--advtrains/trackplacer.lua21
-rw-r--r--advtrains/trainhud.lua157
-rw-r--r--advtrains/trainlogic.lua47
-rw-r--r--advtrains/wagonprop_tool.lua43
-rw-r--r--advtrains/wagons.lua180
23 files changed, 2315 insertions, 1759 deletions
diff --git a/advtrains/couple.lua b/advtrains/couple.lua
index 9474dcf..4933dd8 100644
--- a/advtrains/couple.lua
+++ b/advtrains/couple.lua
@@ -28,6 +28,20 @@ end
advtrains.register_coupler_type("chain", attrans("Buffer and Chain Coupler"))
advtrains.register_coupler_type("scharfenberg", attrans("Scharfenberg Coupler"))
+for _, name in pairs {"couple", "decouple"} do
+ local t = {}
+ local function reg(f)
+ table.insert(t, f)
+ end
+ local function cb(...)
+ for _, f in ipairs(t) do
+ f(...)
+ end
+ end
+ advtrains["te_registered_on_" .. name] = t
+ advtrains["te_register_on_" .. name] = reg
+ advtrains["te_run_callbacks_on_" .. name] = cb
+end
local function create_couple_entity(pos, train1, t1_is_front, train2, t2_is_front)
local id1 = train1.id
@@ -235,6 +249,8 @@ function advtrains.couple_trains(init_train, invert_init_train, stat_train, stat
return
end
+ advtrains.te_run_callbacks_on_couple(init_train, stat_train)
+
if stat_train_opposite then
-- insert wagons in inverse order and set their wagon_flipped state
for i=1,stat_wagoncnt do
@@ -319,7 +335,7 @@ function advtrains.check_matching_coupler_types(t1, t1_front, t2, t2_front)
--atdebug("CMCT: t1",t1_cplt,"t2",t2_cplt,"")
-- if at least one of the trains has no couplers table, it always couples (fallback behavior and mode for universal shunters)
- if not t1_cplt or not t2_cplt then
+ if minetest.settings:get_bool("advtrains_universal_couplers", false) or not t1_cplt or not t2_cplt then
return true
end
@@ -437,7 +453,7 @@ minetest.register_entity("advtrains:discouple", {
self.object:remove()
return
end
- --getyaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not.
+ --get_yaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not.
if not self.wagon.object:get_yaw() then
self.object:remove()
return
@@ -484,7 +500,7 @@ minetest.register_entity("advtrains:couple", {
self.object:remove()
end,
on_step=function(self, dtime)
- if advtrains.wagon_outside_range(self.object:getpos()) then
+ if advtrains.wagon_outside_range(self.object:get_pos()) then
--atdebug("Couple Removing outside range")
self.object:remove()
return
@@ -523,7 +539,7 @@ minetest.register_entity("advtrains:couple", {
tp2=advtrains.path_get_interpolated(train2, train2.end_index)
end
local pos_median=advtrains.pos_median(tp1, tp2)
- if not vector.equals(pos_median, self.object:getpos()) then
+ if not vector.equals(pos_median, self.object:get_pos()) then
self.object:set_pos(pos_median)
end
self.position_set=true
diff --git a/advtrains/crafting.lua b/advtrains/crafting.lua
index 7626d55..9f80456 100644
--- a/advtrains/crafting.lua
+++ b/advtrains/crafting.lua
@@ -22,6 +22,14 @@ minetest.register_craft({
})
--Wallmounted Signal
minetest.register_craft({
+ output = 'advtrains:signal_wall_l_off 2',
+ recipe = {
+ {'default:steel_ingot', 'default:steel_ingot', 'dye:red'},
+ {'', 'default:steel_ingot', ''},
+ {'default:steel_ingot', 'default:steel_ingot', 'dye:dark_green'},
+ },
+})
+minetest.register_craft({
output = 'advtrains:signal_wall_r_off 2',
recipe = {
{'dye:red', 'default:steel_ingot', 'default:steel_ingot'},
@@ -29,6 +37,15 @@ minetest.register_craft({
{'dye:dark_green', 'default:steel_ingot', 'default:steel_ingot'},
},
})
+minetest.register_craft({
+ output = 'advtrains:signal_wall_t_off 2',
+ recipe = {
+ {'default:steel_ingot', '', 'default:steel_ingot'},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ {'dye:dark_green', '', 'dye:red'},
+ },
+})
+
--Wallmounted Signals can be converted into every orientation by shapeless crafting
minetest.register_craft({
diff --git a/advtrains/init.lua b/advtrains/init.lua
index a7fbc3f..4a0b928 100644
--- a/advtrains/init.lua
+++ b/advtrains/init.lua
@@ -203,12 +203,14 @@ advtrains.poconvert.from_flat("advtrains")
attrans = minetest.get_translator("advtrains")
advtrains.speed = dofile(advtrains.modpath.."/speed.lua")
+advtrains.texture = dofile(advtrains.modpath.."/texture.lua")
dofile(advtrains.modpath.."/path.lua")
dofile(advtrains.modpath.."/trainlogic.lua")
dofile(advtrains.modpath.."/trainhud.lua")
dofile(advtrains.modpath.."/trackplacer.lua")
dofile(advtrains.modpath.."/copytool.lua")
+dofile(advtrains.modpath.."/wagonprop_tool.lua")
dofile(advtrains.modpath.."/tracks.lua")
dofile(advtrains.modpath.."/occupation.lua")
dofile(advtrains.modpath.."/atc.lua")
@@ -474,6 +476,7 @@ advtrains.avt_save = function(remove_players_from_wagons)
"text_outside", "text_inside", "line", "routingcode",
"il_sections", "speed_restriction", "speed_restrictions_t", "is_shunt",
"points_split", "autocouple", "atc_wait_autocouple", "ars_disable",
+ "staticdata",
})
--then save it
tmp_trains[id]=v
@@ -737,6 +740,21 @@ minetest.register_chatcommand("at_whereis",
end
end,
})
+minetest.register_chatcommand("at_tp",
+ {
+ params = "<train id>",
+ description = "Teleports you to the position of the train with the given id",
+ privs = {train_operator = true, teleport = true},
+ func = function(name,param)
+ local train = advtrains.trains[param]
+ if not train or not train.last_pos then
+ return false, "Train "..param.." does not exist or is invalid"
+ else
+ minetest.get_player_by_name(name):set_pos(train.last_pos)
+ return true, "Teleporting to train "..param
+ end
+ end,
+})
minetest.register_chatcommand("at_disable_step",
{
params = "<yes/no>",
diff --git a/advtrains/occupation.lua b/advtrains/occupation.lua
index 6852dfa..26e1f79 100644
--- a/advtrains/occupation.lua
+++ b/advtrains/occupation.lua
@@ -159,10 +159,8 @@ function o.reverse_lookup(ppos)
local r = {}
local i = 1
while t[i] do
- if t[i]~=train_id then
- if not r[t[i]] then r[t[i]] = {} end
- table.insert(r[t[i]], t[i+1])
- end
+ if not r[t[i]] then r[t[i]] = {} end
+ table.insert(r[t[i]], t[i+1])
i = i + 2
end
return r
@@ -188,6 +186,7 @@ local OCC_CLOSE_PROXIMITY = 3
-- Gets a mapping of train id's to index of trains that have a path item at this position. Selects at most one index based on a given heuristic, or even none if it does not match the heuristic criterion
-- returns (table with train_id->index), position
-- "in_train": first index that lies between train index and end index
+-- "train_at_node": first index where the train is standing on that node (like in_train but with +-0.5 added to index)
-- "first_ahead": smallest index that is > current index
-- "before_end"(default): smallest index that is > end index
-- "close_proximity": within 3 indices close to the train index and end_index
@@ -214,6 +213,9 @@ function o.reverse_lookup_sel(pos, heuristic)
if heuristic == "in_train" and idx < otrn.index and idx > otrn.end_index then
h_value = idx
end
+ if heuristic == "train_at_node" and idx < (otrn.index+0.5) and idx > (otrn.end_index-0.5) then
+ h_value = idx
+ end
if heuristic == "close_proximity" and idx < (otrn.index + OCC_CLOSE_PROXIMITY) and idx > (otrn.end_index - OCC_CLOSE_PROXIMITY) then
h_value = idx
end
@@ -228,7 +230,7 @@ end
-- returns (table with train_id->index)
function o.get_trains_at(ppos)
local pos = advtrains.round_vector_floor_y(ppos)
- return o.reverse_lookup_sel(pos, "in_train")
+ return o.reverse_lookup_sel(pos, "train_at_node")
end
advtrains.occ = o
diff --git a/advtrains/po/advtrains.pot b/advtrains/po/advtrains.pot
index 6fda1d7..ae7fb32 100644
--- a/advtrains/po/advtrains.pot
+++ b/advtrains/po/advtrains.pot
@@ -8,7 +8,7 @@ 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"
+"POT-Creation-Date: 2024-12-06 21:17+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,54 +17,54 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: advtrains/atc.lua:109
+#: advtrains/atc.lua
msgid "Unconfigured ATC controller"
msgstr ""
-#: advtrains/atc.lua:150
+#: advtrains/atc.lua
msgid ""
"ATC controller, mode @1\n"
"Command: @2"
msgstr ""
-#: advtrains/atc.lua:180
+#: advtrains/atc.lua
msgid "Command"
msgstr ""
-#: advtrains/atc.lua:184
+#: advtrains/atc.lua
msgid "Command (on)"
msgstr ""
-#: advtrains/atc.lua:187
+#: advtrains/atc.lua
msgid "Digiline channel"
msgstr ""
-#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65
-#: advtrains_luaautomation/active_common.lua:48
+#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
+#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr ""
-#: advtrains/atc.lua:236
+#: advtrains/atc.lua
msgid "ATC Reverse command warning: didn't reverse train, train moving."
msgstr ""
-#: advtrains/atc.lua:248
+#: advtrains/atc.lua
msgid "ATC Kick command warning: doors are closed."
msgstr ""
-#: advtrains/atc.lua:252
+#: advtrains/atc.lua
msgid "ATC Kick command warning: train moving."
msgstr ""
-#: advtrains/atc.lua:322
+#: advtrains/atc.lua
msgid "ATC command syntax error: I statement not closed: @1"
msgstr ""
-#: advtrains/atc.lua:385
+#: advtrains/atc.lua
msgid "ATC command parse error: Unknown command: @1"
msgstr ""
-#: advtrains/copytool.lua:8
+#: advtrains/copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -72,166 +72,166 @@ msgid ""
"Right-click: paste train"
msgstr ""
-#: advtrains/copytool.lua:29
+#: advtrains/copytool.lua
msgid "You do not have the @1 privilege."
msgstr ""
-#: advtrains/copytool.lua:41
+#: advtrains/copytool.lua
msgid "The track you are trying to place the wagon on is not long enough."
msgstr ""
-#: advtrains/copytool.lua:47
+#: advtrains/copytool.lua
msgid "The clipboard couldn't access the metadata. Paste failed."
msgstr ""
-#: advtrains/copytool.lua:52 advtrains/copytool.lua:57
+#: advtrains/copytool.lua
msgid "The clipboard is empty."
msgstr ""
-#: advtrains/copytool.lua:74
+#: advtrains/copytool.lua
msgid "Back of train would end up off track, cancelling."
msgstr ""
-#: advtrains/copytool.lua:92
+#: advtrains/copytool.lua
msgid "No such lua entity."
msgstr ""
-#: advtrains/copytool.lua:98
+#: advtrains/copytool.lua
msgid "No such wagon: @1."
msgstr ""
-#: advtrains/copytool.lua:104
+#: advtrains/copytool.lua
msgid "No such train: @1."
msgstr ""
-#: advtrains/copytool.lua:176
+#: advtrains/copytool.lua
msgid "The clipboard couldn't access the metadata. Copy failed."
msgstr ""
-#: advtrains/copytool.lua:180
+#: advtrains/copytool.lua
msgid "Train copied."
msgstr ""
-#: advtrains/couple.lua:28
+#: advtrains/couple.lua
msgid "Buffer and Chain Coupler"
msgstr ""
-#: advtrains/couple.lua:29
+#: advtrains/couple.lua
msgid "Scharfenberg Coupler"
msgstr ""
-#: advtrains/couple.lua:185
+#: advtrains/couple.lua
msgid ""
"You are not allowed to couple trains without the train_operator privilege."
msgstr ""
-#: advtrains/couple.lua:329 advtrains/couple.lua:333
+#: advtrains/couple.lua
msgid "<No coupler>"
msgstr ""
-#: advtrains/couple.lua:334
+#: advtrains/couple.lua
msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
msgstr ""
-#: advtrains/craft_items.lua:3
+#: advtrains/craft_items.lua
msgid "Boiler"
msgstr ""
-#: advtrains/craft_items.lua:9
+#: advtrains/craft_items.lua
msgid "Driver's cab"
msgstr ""
-#: advtrains/craft_items.lua:15
+#: advtrains/craft_items.lua
msgid "Wheel"
msgstr ""
-#: advtrains/craft_items.lua:21
+#: advtrains/craft_items.lua
msgid "Chimney"
msgstr ""
-#: advtrains/misc_nodes.lua:16
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low)"
msgstr ""
-#: advtrains/misc_nodes.lua:33
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (high)"
msgstr ""
-#: advtrains/misc_nodes.lua:59
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr ""
-#: advtrains/misc_nodes.lua:81
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr ""
-#: advtrains/protection.lua:7
+#: advtrains/protection.lua
msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua:12
+#: advtrains/protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
msgstr ""
-#: advtrains/protection.lua:18
+#: advtrains/protection.lua
msgid "Can place and dig tracks in unprotected areas"
msgstr ""
-#: advtrains/protection.lua:24
+#: advtrains/protection.lua
msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr ""
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build tracks without the track_builder privilege."
msgstr ""
-#: advtrains/protection.lua:153
+#: advtrains/protection.lua
msgid "You are not allowed to build near tracks at this protected position."
msgstr ""
-#: advtrains/protection.lua:153
+#: advtrains/protection.lua
msgid "You are not allowed to build tracks at this protected position."
msgstr ""
-#: advtrains/protection.lua:184
+#: advtrains/protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
msgstr ""
-#: advtrains/signals.lua:63
+#: advtrains/signals.lua
msgid "Lampless Signal"
msgstr ""
-#: advtrains/signals.lua:127
+#: advtrains/signals.lua
msgid "Signal"
msgstr ""
-#: advtrains/signals.lua:191
+#: advtrains/signals.lua
msgid "Wallmounted Signal (left)"
msgstr ""
-#: advtrains/signals.lua:192
+#: advtrains/signals.lua
msgid "Wallmounted Signal (right)"
msgstr ""
-#: advtrains/signals.lua:193
+#: advtrains/signals.lua
msgid "Wallmounted Signal (top)"
msgstr ""
-#: advtrains/signals.lua:281 advtrains/signals.lua:322
+#: advtrains/signals.lua
msgid "Andrew's Cross"
msgstr ""
-#: advtrains/trackplacer.lua:313
+#: advtrains/trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -239,394 +239,413 @@ msgid ""
"Right-click: rotate object"
msgstr ""
-#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377
+#: advtrains/trackplacer.lua
msgid "This node can't be rotated using the trackworker."
msgstr ""
-#: advtrains/trackplacer.lua:350
+#: advtrains/trackplacer.lua
msgid "This track can not be rotated."
msgstr ""
-#: advtrains/trackplacer.lua:404
+#: advtrains/trackplacer.lua
msgid "This node can't be changed using the trackworker."
msgstr ""
-#: advtrains/trackplacer.lua:414
+#: advtrains/trackplacer.lua
msgid "This track can not be changed."
msgstr ""
-#: advtrains/tracks.lua:449
+#: advtrains/tracks.lua
msgid "This track can not be removed."
msgstr ""
-#: advtrains/tracks.lua:616
+#: advtrains/tracks.lua
msgid "Position is occupied by a train."
msgstr ""
-#: advtrains/tracks.lua:622
+#: advtrains/tracks.lua
msgid "There's a Track Circuit Break here."
msgstr ""
-#: advtrains/tracks.lua:626
+#: advtrains/tracks.lua
msgid "There's a Signal Influence Point here."
msgstr ""
-#: advtrains/tracks.lua:637
+#: advtrains/tracks.lua
msgid "@1 Slope"
msgstr ""
-#: advtrains/tracks.lua:648 advtrains/tracks.lua:653
+#: advtrains/tracks.lua
msgid "Can't place slope: not pointing at node."
msgstr ""
-#: advtrains/tracks.lua:658
+#: advtrains/tracks.lua
msgid "Can't place slope: space occupied."
msgstr ""
-#: advtrains/tracks.lua:711
+#: advtrains/tracks.lua
msgid "Can't place slope: Not enough slope items left (@1 required)."
msgstr ""
-#: advtrains/tracks.lua:714
+#: advtrains/tracks.lua
msgid "Can't place slope: There's no slope of length @1."
msgstr ""
-#: advtrains/tracks.lua:721
+#: advtrains/tracks.lua
msgid "Can't place slope: no supporting node at upper end."
msgstr ""
-#: advtrains/trainhud.lua:305
+#: advtrains/trainhud.lua
msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
msgstr ""
-#: advtrains/wagons.lua:179
+#: advtrains/wagonprop_tool.lua
+msgid ""
+"Wagon Properties Tool\n"
+"Punch a wagon to view and edit the Wagon Properties"
+msgstr ""
+
+#: advtrains/wagonprop_tool.lua
+msgid "Wagon Properties Tool"
+msgstr ""
+
+#: advtrains/wagonprop_tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr ""
+
+#: advtrains/wagons.lua
msgid "This wagon is owned by @1, you can't destroy it."
msgstr ""
-#: advtrains/wagons.lua:203
+#: advtrains/wagons.lua
msgid "The wagon's inventory is not empty."
msgstr ""
-#: advtrains/wagons.lua:210
+#: advtrains/wagons.lua
msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
msgstr ""
-#: advtrains/wagons.lua:216
+#: advtrains/wagons.lua
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
+#: advtrains/wagons.lua
msgid "Show Inventory"
msgstr ""
-#: advtrains/wagons.lua:652
+#: advtrains/wagons.lua
msgid "Onboard Computer"
msgstr ""
-#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328
+#: advtrains/wagons.lua
msgid "Wagon properties"
msgstr ""
-#: advtrains/wagons.lua:658
+#: advtrains/wagons.lua
msgid "Get off"
msgstr ""
-#: advtrains/wagons.lua:661
+#: advtrains/wagons.lua
msgid "Get off (forced)"
msgstr ""
-#: advtrains/wagons.lua:663
+#: advtrains/wagons.lua
msgid "(Doors closed)"
msgstr ""
-#: advtrains/wagons.lua:692
+#: advtrains/wagons.lua
msgid "This wagon has no seats."
msgstr ""
-#: advtrains/wagons.lua:703
+#: advtrains/wagons.lua
msgid "This wagon is full."
msgstr ""
-#: advtrains/wagons.lua:706
+#: advtrains/wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
-#: advtrains/wagons.lua:712
+#: advtrains/wagons.lua
msgid "You can't get on this wagon."
msgstr ""
-#: advtrains/wagons.lua:838
+#: advtrains/wagons.lua
msgid "Select seat:"
msgstr ""
-#: advtrains/wagons.lua:880
+#: advtrains/wagons.lua
+msgid "This Wagon ID"
+msgstr ""
+
+#: advtrains/wagons.lua
msgid "Save wagon properties"
msgstr ""
-#: advtrains/wagons.lua:965
+#: advtrains/wagons.lua
+msgid "Train ID"
+msgstr ""
+
+#: advtrains/wagons.lua
msgid "Text displayed outside on train"
msgstr ""
-#: advtrains/wagons.lua:966
+#: advtrains/wagons.lua
msgid "Text displayed inside train"
msgstr ""
-#: advtrains/wagons.lua:967
+#: advtrains/wagons.lua
msgid "Line"
msgstr ""
-#: advtrains/wagons.lua:968
+#: advtrains/wagons.lua
msgid "Routingcode"
msgstr ""
-#: advtrains/wagons.lua:1241
+#: advtrains/wagons.lua
msgid ""
"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
"off."
msgstr ""
-#: advtrains/wagons.lua:1250
+#: advtrains/wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:13
+#: advtrains_interlocking/routesetting.lua
+msgid "Route state changed."
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point speed restriction: @1"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:14
+#: advtrains_interlocking/tsr_rail.lua
msgid "Set point speed restriction:"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:30
+#: advtrains_interlocking/tsr_rail.lua
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
+#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
msgid "You are not allowed to configure this track."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:64
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point Speed Restriction Track"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:54
+#: advtrains_line_automation/stoprail.lua
msgid "Station Code"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:55
+#: advtrains_line_automation/stoprail.lua
msgid "Station Name"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:56
+#: advtrains_line_automation/stoprail.lua
msgid "Door Delay"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:57
+#: advtrains_line_automation/stoprail.lua
msgid "Dep. Speed"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11
-#: advtrains_train_track/init.lua:156
+#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
msgid "Track"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:59
+#: advtrains_line_automation/stoprail.lua
msgid "Stop Time"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:60
+#: advtrains_line_automation/stoprail.lua
msgid "Door Side"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:62
+#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:63
+#: advtrains_line_automation/stoprail.lua
msgid "Kick out passengers"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:97
+#: advtrains_line_automation/stoprail.lua
msgid "Station code \"@1\" already exists and is owned by @2."
msgstr ""
-#: advtrains_line_automation/stoprail.lua:111
+#: advtrains_line_automation/stoprail.lua
msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""
-#: advtrains_line_automation/stoprail.lua:221
+#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:17
+#: advtrains_luaautomation/active_common.lua
msgid "Unconfigured LuaATC component"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:46
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:49
+#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:50
+#: advtrains_luaautomation/active_common.lua
msgid "Code"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:64
+#: advtrains_luaautomation/active_common.lua
msgid ""
"You are not allowed to configure this LuaATC component without the @1 "
"privilege."
msgstr ""
-#: advtrains_luaautomation/active_common.lua:94
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component assigned to environment '@1'"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:96
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component assigned to an invalid environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:171
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component with error: @1"
msgstr ""
-#: advtrains_luaautomation/init.lua:13
+#: advtrains_luaautomation/init.lua
msgid ""
"Can place and configure LuaATC components, including execute potentially "
"harmful Lua code"
msgstr ""
-#: advtrains_luaautomation/mesecon_controller.lua:211
+#: advtrains_luaautomation/mesecon_controller.lua
msgid "LuaATC Mesecon Controller"
msgstr ""
-#: advtrains_luaautomation/operation_panel.lua:11
+#: advtrains_luaautomation/operation_panel.lua
msgid "LuaATC Operation Panel"
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:28
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"Passive Component Naming Tool\n"
"\n"
"Right-click to name a passive component."
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:39
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"You are not allowed to name LuaATC passive components without the @1 "
"privilege."
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:62
+#: advtrains_luaautomation/pcnaming.lua
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
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
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
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (left)"
msgstr ""
-#: advtrains_train_industrial/init.lua:40
+#: advtrains_train_industrial/init.lua
msgid "Industrial Train Engine"
msgstr ""
-#: advtrains_train_industrial/init.lua:79
+#: advtrains_train_industrial/init.lua
msgid "Big Industrial Train Engine"
msgstr ""
-#: advtrains_train_industrial/init.lua:98
+#: advtrains_train_industrial/init.lua
msgid "Industrial tank wagon"
msgstr ""
-#: advtrains_train_industrial/init.lua:116
+#: advtrains_train_industrial/init.lua
msgid "Industrial wood wagon"
msgstr ""
-#: advtrains_train_japan/init.lua:4
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Inter-Wagon Connection"
msgstr ""
-#: advtrains_train_japan/init.lua:37
+#: advtrains_train_japan/init.lua
msgid "Driver stand"
msgstr ""
-#: advtrains_train_japan/init.lua:101
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Engine"
msgstr ""
-#: advtrains_train_japan/init.lua:176
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Wagon"
msgstr ""
-#: advtrains_train_steam/init.lua:75
+#: advtrains_train_steam/init.lua
msgid "Steam Engine"
msgstr ""
-#: advtrains_train_steam/init.lua:159
+#: advtrains_train_steam/init.lua
msgid "Detailed Steam Engine"
msgstr ""
-#: advtrains_train_steam/init.lua:206
+#: advtrains_train_steam/init.lua
msgid "Passenger Wagon"
msgstr ""
-#: advtrains_train_steam/init.lua:226
+#: advtrains_train_steam/init.lua
msgid "Box Wagon"
msgstr ""
-#: advtrains_train_subway/init.lua:144
+#: advtrains_train_subway/init.lua
msgid "Subway Passenger Wagon"
msgstr ""
-#: advtrains_train_track/init.lua:31
+#: advtrains_train_track/init.lua
msgid "Y-turnout"
msgstr ""
-#: advtrains_train_track/init.lua:49
+#: advtrains_train_track/init.lua
msgid "3-way turnout"
msgstr ""
-#: advtrains_train_track/init.lua:69
+#: advtrains_train_track/init.lua
msgid "Perpendicular Diamond Crossing Track"
msgstr ""
-#: advtrains_train_track/init.lua:91
+#: advtrains_train_track/init.lua
msgid "90+Angle Diamond Crossing Track"
msgstr ""
-#: advtrains_train_track/init.lua:132
+#: advtrains_train_track/init.lua
msgid "Diagonal Diamond Crossing Track"
msgstr ""
-#: advtrains_train_track/init.lua:179
+#: advtrains_train_track/init.lua
msgid "Bumper"
msgstr ""
-#: advtrains_train_track/init.lua:201
+#: advtrains_train_track/init.lua
msgid "ATC controller"
msgstr ""
-#: advtrains_train_track/init.lua:317
+#: advtrains_train_track/init.lua
msgid "Unloading Track"
msgstr ""
-#: advtrains_train_track/init.lua:342
+#: advtrains_train_track/init.lua
msgid "Loading Track"
msgstr ""
-#: advtrains_train_track/init.lua:406
+#: advtrains_train_track/init.lua
msgid "Detector Rail"
msgstr ""
diff --git a/advtrains/po/de.po b/advtrains/po/de.po
index 8821fe3..2d43078 100644
--- a/advtrains/po/de.po
+++ b/advtrains/po/de.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-09 11:02+0200\n"
+"POT-Creation-Date: 2024-12-06 21:17+0100\n"
"PO-Revision-Date: 2023-10-09 11:18+0200\n"
"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
"Language-Team: German\n"
@@ -12,11 +12,33 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.3.2\n"
-#: advtrains/atc.lua:109
-msgid "Unconfigured ATC controller"
-msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis"
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: doors are closed."
+msgstr ""
+"Zugbeeinflussung: Wegen geschlossener Türen werden Fahrgäste nicht zum "
+"Ausstieg gezwungen."
+
+#: advtrains/atc.lua
+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:150
+#: advtrains/atc.lua
+msgid "ATC Reverse command warning: didn't reverse train, train moving."
+msgstr ""
+"Zugbeeinflussung: Der Zug befindet sich in Bewegung und kann nicht umgekehrt "
+"werden."
+
+#: advtrains/atc.lua
+msgid "ATC command parse error: Unknown command: @1"
+msgstr "Zugbeeinflussung: Unbekannter Befehl: @1"
+
+#: advtrains/atc.lua
+msgid "ATC command syntax error: I statement not closed: @1"
+msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1"
+
+#: advtrains/atc.lua
msgid ""
"ATC controller, mode @1\n"
"Command: @2"
@@ -24,50 +46,70 @@ msgstr ""
"Zugbeeinflussungsgleis in Betriebsart „@1“\n"
"Befehl: @2"
-#: advtrains/atc.lua:180
+#: advtrains/atc.lua
msgid "Command"
msgstr "Befehl"
-#: advtrains/atc.lua:184
+#: advtrains/atc.lua
msgid "Command (on)"
msgstr "Befehl (wenn aktiviert)"
-#: advtrains/atc.lua:187
+#: advtrains/atc.lua
msgid "Digiline channel"
msgstr "Digiline-Kanal"
-#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65
-#: advtrains_luaautomation/active_common.lua:48
+#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
+#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "Speichern"
-#: advtrains/atc.lua:236
-msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#: advtrains/atc.lua
+msgid "Unconfigured ATC controller"
+msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis"
+
+#: advtrains/copytool.lua
+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
+msgid "No such lua entity."
msgstr ""
-"Zugbeeinflussung: Der Zug befindet sich in Bewegung und kann nicht umgekehrt "
-"werden."
+"Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden "
+"kann."
-#: advtrains/atc.lua:248
-msgid "ATC Kick command warning: doors are closed."
+#: advtrains/copytool.lua
+msgid "No such train: @1."
+msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug."
+
+#: advtrains/copytool.lua
+msgid "No such wagon: @1."
+msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon."
+
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Copy failed."
msgstr ""
-"Zugbeeinflussung: Wegen geschlossener Türen werden Fahrgäste nicht zum "
-"Ausstieg gezwungen."
+"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug nicht "
+"kopiert werden."
-#: advtrains/atc.lua:252
-msgid "ATC Kick command warning: train moving."
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Paste failed."
msgstr ""
-"Zugbeeinflussung: Der Zug befindet sich in Bewegung, Fahrgäste werden nicht "
-"zum Ausstieg gezwungen."
+"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte eine Kopie des "
+"Zuges nicht eingefügt werden."
-#: advtrains/atc.lua:322
-msgid "ATC command syntax error: I statement not closed: @1"
-msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1"
+#: advtrains/copytool.lua
+msgid "The clipboard is empty."
+msgstr "Das Clipboard ist leer."
-#: advtrains/atc.lua:385
-msgid "ATC command parse error: Unknown command: @1"
-msgstr "Zugbeeinflussung: Unbekannter Befehl: @1"
+#: advtrains/copytool.lua
+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:8
+#: advtrains/copytool.lua
+msgid "Train copied."
+msgstr "Der Zug wurde Kopiert."
+
+#: advtrains/copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -79,175 +121,149 @@ msgstr ""
"Linksklick: Zug ins Clipboard kopieren\n"
"Right-click: Kopierten Zug einfügen"
-#: advtrains/copytool.lua:29
+#: advtrains/copytool.lua
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
+msgid "<No coupler>"
+msgstr "<Keine Kupplung vorhanden>"
-#: advtrains/couple.lua:28
+#: advtrains/couple.lua
msgid "Buffer and Chain Coupler"
msgstr "Schraubenkupplung"
-#: advtrains/couple.lua:29
+#: advtrains/couple.lua
+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/couple.lua
msgid "Scharfenberg Coupler"
msgstr "Scharfenbergkupplung"
-#: advtrains/couple.lua:185
+#: advtrains/couple.lua
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 "<No coupler>"
-msgstr "<Keine Kupplung vorhanden>"
-
-#: 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
+#: advtrains/craft_items.lua
msgid "Boiler"
msgstr ""
-#: advtrains/craft_items.lua:9
+#: advtrains/craft_items.lua
+msgid "Chimney"
+msgstr ""
+
+#: advtrains/craft_items.lua
msgid "Driver's cab"
msgstr "Führerstand"
-#: advtrains/craft_items.lua:15
+#: advtrains/craft_items.lua
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
+msgid "@1 Platform (45 degree)"
+msgstr "Hoher @1-Bahnsteig (45°)"
-#: advtrains/misc_nodes.lua:33
+#: advtrains/misc_nodes.lua
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
+msgid "@1 Platform (low)"
+msgstr "Niedriger @1-Bahnsteig"
-#: advtrains/misc_nodes.lua:81
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "Niedriger @1-Bahnsteig (45°)"
-#: advtrains/protection.lua:7
-msgid "Can place, remove and operate trains"
+#: advtrains/protection.lua
+msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua:12
+#: advtrains/protection.lua
+msgid "Can place and dig tracks in unprotected areas"
+msgstr ""
+
+#: advtrains/protection.lua
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"
+#: advtrains/protection.lua
+msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua:24
-msgid "Can operate turnouts and signals in unprotected areas"
-msgstr ""
+#: advtrains/protection.lua
+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:148
+#: advtrains/protection.lua
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
+#: advtrains/protection.lua
+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
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
+#: advtrains/protection.lua
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
+#: advtrains/signals.lua
+msgid "Andrew's Cross"
+msgstr "Andreaskreuz"
+
+#: advtrains/signals.lua
msgid "Lampless Signal"
msgstr "Mechanisches Signal"
-#: advtrains/signals.lua:127
+#: advtrains/signals.lua
msgid "Signal"
msgstr "Lichtsignal"
-#: advtrains/signals.lua:191
+#: advtrains/signals.lua
msgid "Wallmounted Signal (left)"
msgstr "An der linken Seite montiertes Signal"
-#: advtrains/signals.lua:192
+#: advtrains/signals.lua
msgid "Wallmounted Signal (right)"
msgstr "An der rechten Seite montiertes Signal"
-#: advtrains/signals.lua:193
+#: advtrains/signals.lua
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
+msgid "This node can't be changed using the trackworker."
+msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden."
-#: advtrains/trackplacer.lua:313
+#: advtrains/trackplacer.lua
+msgid "This node can't be rotated using the trackworker."
+msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden."
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be changed."
+msgstr "Dieses Gleis kann nicht geändert werden."
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be rotated."
+msgstr "Dieses Gleis kann nicht gedreht werden."
+
+#: advtrains/trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -259,278 +275,287 @@ msgstr ""
"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."
-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/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
+#: advtrains/tracks.lua
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
+#: advtrains/tracks.lua
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
+#: advtrains/tracks.lua
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
+#: advtrains/tracks.lua
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
+#: advtrains/tracks.lua
+msgid "Can't place slope: not pointing at node."
+msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block."
+
+#: advtrains/tracks.lua
+msgid "Can't place slope: space occupied."
+msgstr "Es kann nicht platziert werden: Diese Position ist besetzt."
+
+#: advtrains/tracks.lua
+msgid "Position is occupied by a train."
+msgstr "Ein Zug steht an dieser Position."
+
+#: advtrains/tracks.lua
+msgid "There's a Signal Influence Point here."
+msgstr "Hier ist ein Signal-Beeinflussungspunkt."
+
+#: advtrains/tracks.lua
+msgid "There's a Track Circuit Break here."
+msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)."
+
+#: advtrains/tracks.lua
+msgid "This track can not be removed."
+msgstr "Dieses Gleis kann nicht entfernt werden."
+
+#: advtrains/trainhud.lua
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."
+#: advtrains/wagonprop_tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr ""
-#: advtrains/wagons.lua:210
-msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
-msgstr "Der Waggon muss abgekoppelt sein, damit Sie ihn abbauen können."
+#: advtrains/wagonprop_tool.lua
+#, fuzzy
+msgid "Wagon Properties Tool"
+msgstr "Waggon-Einstellungen"
-#: advtrains/wagons.lua:216
+#: advtrains/wagonprop_tool.lua
msgid ""
-"Warning: If you destroy this wagon, you only get some steel back! If you are "
-"sure, hold Sneak and left-click the wagon."
+"Wagon Properties Tool\n"
+"Punch a wagon to view and edit the Wagon Properties"
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
+msgid "(Doors closed)"
+msgstr "(Türen geschlossen)"
-#: advtrains/wagons.lua:652
-msgid "Onboard Computer"
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Doors are closed! (Try holding sneak key!)"
+msgstr "Die Türen sind geschlossen."
-#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328
-msgid "Wagon properties"
-msgstr "Waggon-Einstellungen"
+#: advtrains/wagons.lua
+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/wagons.lua:658
+#: advtrains/wagons.lua
msgid "Get off"
msgstr "Aussteigen"
-#: advtrains/wagons.lua:661
+#: advtrains/wagons.lua
msgid "Get off (forced)"
msgstr "Ausstieg zwingen"
-#: advtrains/wagons.lua:663
-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
+msgid "Line"
+msgstr "Linie"
-#: advtrains/wagons.lua:703
-msgid "This wagon is full."
-msgstr "Der Waggon ist voll."
+#: advtrains/wagons.lua
+msgid "Onboard Computer"
+msgstr ""
-#: advtrains/wagons.lua:706
-msgid "Doors are closed! (Try holding sneak key!)"
-msgstr "Die Türen sind geschlossen."
+#: advtrains/wagons.lua
+msgid "Routingcode"
+msgstr ""
-#: advtrains/wagons.lua:712
-msgid "You can't get on this wagon."
-msgstr "Sie können nicht in diesen Waggon einsteigen."
+#: advtrains/wagons.lua
+msgid "Save wagon properties"
+msgstr "Waggon-Einstellungen speichern"
-#: advtrains/wagons.lua:838
+#: advtrains/wagons.lua
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
+msgid "Show Inventory"
+msgstr "Inventar Zeigen"
-#: advtrains/wagons.lua:965
+#: advtrains/wagons.lua
+msgid "Text displayed inside train"
+msgstr "Innere Anzeige"
+
+#: advtrains/wagons.lua
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
+msgid "The wagon's inventory is not empty."
+msgstr "Das Inventar dieses Waggons ist nicht leer."
-#: advtrains/wagons.lua:967
-msgid "Line"
-msgstr "Linie"
+#: advtrains/wagons.lua
+#, fuzzy
+msgid "This Wagon ID"
+msgstr "Der Waggon ist voll."
-#: advtrains/wagons.lua:968
-msgid "Routingcode"
+#: advtrains/wagons.lua
+msgid "This wagon has no seats."
+msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
+
+#: advtrains/wagons.lua
+msgid "This wagon is full."
+msgstr "Der Waggon ist voll."
+
+#: advtrains/wagons.lua
+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
+msgid "Train ID"
msgstr ""
-#: advtrains/wagons.lua:1241
+#: advtrains/wagons.lua
+msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
+msgstr "Der Waggon muss abgekoppelt sein, damit Sie ihn abbauen können."
+
+#: advtrains/wagons.lua
+msgid "Wagon properties"
+msgstr "Waggon-Einstellungen"
+
+#: advtrains/wagons.lua
msgid ""
-"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
-"off."
+"Warning: If you destroy this wagon, you only get some steel back! If you are "
+"sure, hold Sneak and left-click the wagon."
msgstr ""
-"Die Türen sind geschlossen. Nutzen Sie Schleichen+Rechtsklick, um trotz "
-"geschlossener Türen auszusteigen."
+"Warnung: Durch den Abbau des Waggons erhalten Sie nur etwas Stahl zurück. "
+"Nutzen Sie Schleichen+Linksklick, um dem Waggon abzubauen."
-#: advtrains/wagons.lua:1250
+#: advtrains/wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr "Sie haben keinen Zugang zum Führerstand."
-#: advtrains_interlocking/tsr_rail.lua:13
+#: advtrains/wagons.lua
+msgid "You can't get on this wagon."
+msgstr "Sie können nicht in diesen Waggon einsteigen."
+
+#: advtrains_interlocking/routesetting.lua
+msgid "Route state changed."
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr "Geschwindigkeitskontrollgleis"
+
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point speed restriction: @1"
msgstr "Geschwindigkeitskontrolle: @1"
-#: advtrains_interlocking/tsr_rail.lua:14
+#: advtrains_interlocking/tsr_rail.lua
msgid "Set point speed restriction:"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:30
+#: advtrains_interlocking/tsr_rail.lua
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_interlocking/tsr_rail.lua:34
-#: advtrains_line_automation/stoprail.lua:31
-#: advtrains_line_automation/stoprail.lua:76
+#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
msgid "You are not allowed to configure this track."
msgstr "Sie dürfen dieses Gleis nicht konfigurieren."
-#: advtrains_interlocking/tsr_rail.lua:64
-msgid "Point Speed Restriction Track"
-msgstr "Geschwindigkeitskontrollgleis"
-
-#: advtrains_line_automation/stoprail.lua:54
-msgid "Station Code"
-msgstr "Kennzeichen 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
+#: advtrains_line_automation/stoprail.lua
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
+msgid "Door Delay"
+msgstr "Zeit für die Türschließung"
-#: advtrains_line_automation/stoprail.lua:60
+#: advtrains_line_automation/stoprail.lua
msgid "Door Side"
msgstr "Türseite"
-#: advtrains_line_automation/stoprail.lua:62
+#: advtrains_line_automation/stoprail.lua
+msgid "Kick out passengers"
+msgstr "Fahrgäste zum Ausstieg zwingen"
+
+#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr "Zug Umkehren"
-#: advtrains_line_automation/stoprail.lua:63
-msgid "Kick out passengers"
-msgstr "Fahrgäste zum Ausstieg zwingen"
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Code"
+msgstr "Kennzeichen der Haltestelle"
+
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Name"
+msgstr "Name der Haltestelle"
-#: advtrains_line_automation/stoprail.lua:97
+#: advtrains_line_automation/stoprail.lua
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_line_automation/stoprail.lua:111
-msgid "This station is owned by @1. You are not allowed to edit its name."
-msgstr ""
-"Diese Haltestelle wird von @1 verwaltet. Sie dürfen sie nicht umbenennen."
-
-#: advtrains_line_automation/stoprail.lua:221
+#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
msgstr "Gleis zur Kennzeichnung einer Haltestelle"
-#: advtrains_luaautomation/active_common.lua:17
-msgid "Unconfigured LuaATC component"
-msgstr "Nicht konfiguierter LuaATC-Bauteil"
+#: advtrains_line_automation/stoprail.lua
+msgid "Stop Time"
+msgstr "Wartezeit"
-#: advtrains_luaautomation/active_common.lua:46
-msgid "LuaATC Environment"
+#: advtrains_line_automation/stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""
+"Diese Haltestelle wird von @1 verwaltet. Sie dürfen sie nicht umbenennen."
+
+#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
+msgid "Track"
+msgstr "Gleis"
-#: advtrains_luaautomation/active_common.lua:49
+#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:50
+#: advtrains_luaautomation/active_common.lua
msgid "Code"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:64
-msgid ""
-"You are not allowed to configure this LuaATC component without the @1 "
-"privilege."
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC Environment"
msgstr ""
-"Sie dürfen ohne das „@1“-Privileg diesen LuaATC-Bauteil nicht konfigurieren."
-#: advtrains_luaautomation/active_common.lua:94
-msgid "LuaATC component assigned to environment '@1'"
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC component assigned to an invalid environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:96
-msgid "LuaATC component assigned to an invalid environment"
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:171
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component with error: @1"
msgstr "LuaATC-Bauteil mit Fehlermeldung: @1"
-#: advtrains_luaautomation/init.lua:13
+#: advtrains_luaautomation/active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "Nicht konfiguierter LuaATC-Bauteil"
+
+#: advtrains_luaautomation/active_common.lua
+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_luaautomation/init.lua
msgid ""
"Can place and configure LuaATC components, including execute potentially "
"harmful Lua code"
@@ -538,15 +563,15 @@ msgstr ""
"Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche "
"Programme ausführen)"
-#: advtrains_luaautomation/mesecon_controller.lua:211
+#: advtrains_luaautomation/mesecon_controller.lua
msgid "LuaATC Mesecon Controller"
msgstr ""
-#: advtrains_luaautomation/operation_panel.lua:11
+#: advtrains_luaautomation/operation_panel.lua
msgid "LuaATC Operation Panel"
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:28
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"Passive Component Naming Tool\n"
"\n"
@@ -556,119 +581,115 @@ msgstr ""
"\n"
"Rechtsklick zur Benennung der passiven Komponente."
-#: advtrains_luaautomation/pcnaming.lua:39
+#: advtrains_luaautomation/pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr ""
+
+#: advtrains_luaautomation/pcnaming.lua
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
-#: advtrains_train_steam/init.lua:91
-msgid "Driver Stand (right)"
-msgstr "Führerstand Rechts"
+#: advtrains_train_industrial/init.lua
+msgid "Big Industrial Train Engine"
+msgstr "Große Industrielle Lokomotive"
-#: advtrains_train_industrial/init.lua:17
-#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14
-#: advtrains_train_steam/init.lua:85
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (left)"
msgstr "Führerstand Links"
-#: advtrains_train_industrial/init.lua:40
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
+msgid "Driver Stand (right)"
+msgstr "Führerstand Rechts"
+
+#: advtrains_train_industrial/init.lua
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
+#: advtrains_train_industrial/init.lua
msgid "Industrial tank wagon"
msgstr "Tankwaggon"
-#: advtrains_train_industrial/init.lua:116
+#: advtrains_train_industrial/init.lua
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
+#: advtrains_train_japan/init.lua
msgid "Driver stand"
msgstr "Führerstand"
-#: advtrains_train_japan/init.lua:101
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Engine"
msgstr "Japanische Personenzug-Lokomotive"
-#: advtrains_train_japan/init.lua:176
+#: advtrains_train_japan/init.lua
+msgid "Japanese Train Inter-Wagon Connection"
+msgstr "Waggonzwischenverbindung Japanischer Personenzüge"
+
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Wagon"
msgstr "Japanischer Personenzug-Passagierwaggon"
-#: advtrains_train_steam/init.lua:75
-msgid "Steam Engine"
-msgstr "Dampflokomotive"
+#: advtrains_train_steam/init.lua
+msgid "Box Wagon"
+msgstr "Güterwaggon"
-#: advtrains_train_steam/init.lua:159
+#: advtrains_train_steam/init.lua
msgid "Detailed Steam Engine"
msgstr "Detaillierte Dampflokomotive"
-#: advtrains_train_steam/init.lua:206
+#: advtrains_train_steam/init.lua
msgid "Passenger Wagon"
msgstr "Passagierwaggon"
-#: advtrains_train_steam/init.lua:226
-msgid "Box Wagon"
-msgstr "Güterwaggon"
+#: advtrains_train_steam/init.lua
+msgid "Steam Engine"
+msgstr "Dampflokomotive"
-#: advtrains_train_subway/init.lua:144
+#: advtrains_train_subway/init.lua
msgid "Subway Passenger Wagon"
msgstr "U-Bahn-Waggon"
-#: advtrains_train_track/init.lua:31
-msgid "Y-turnout"
-msgstr "Y-Weiche"
-
-#: advtrains_train_track/init.lua:49
+#: advtrains_train_track/init.lua
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
+#: advtrains_train_track/init.lua
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
+msgid "ATC controller"
+msgstr "Zugbeeinflussungsgleis"
-#: advtrains_train_track/init.lua:179
+#: advtrains_train_track/init.lua
msgid "Bumper"
msgstr "Prellbock"
-#: advtrains_train_track/init.lua:201
-msgid "ATC controller"
-msgstr "Zugbeeinflussungsgleis"
+#: advtrains_train_track/init.lua
+msgid "Detector Rail"
+msgstr "Detektorgleis"
-#: advtrains_train_track/init.lua:317
-msgid "Unloading Track"
-msgstr "Abladungsgleis"
+#: advtrains_train_track/init.lua
+msgid "Diagonal Diamond Crossing Track"
+msgstr "Diagonale Gleiskreuzung"
-#: advtrains_train_track/init.lua:342
+#: advtrains_train_track/init.lua
msgid "Loading Track"
msgstr "Beladungsgleis"
-#: advtrains_train_track/init.lua:406
-msgid "Detector Rail"
-msgstr "Detektorgleis"
+#: advtrains_train_track/init.lua
+msgid "Perpendicular Diamond Crossing Track"
+msgstr "Kreuzung mit zueinander orthogonalen Gleisen"
+
+#: advtrains_train_track/init.lua
+msgid "Unloading Track"
+msgstr "Abladungsgleis"
+
+#: advtrains_train_track/init.lua
+msgid "Y-turnout"
+msgstr "Y-Weiche"
#~ msgid ""
#~ "ATC controller, mode @1\n"
diff --git a/advtrains/po/fr.po b/advtrains/po/fr.po
index 3cb68b0..6404583 100644
--- a/advtrains/po/fr.po
+++ b/advtrains/po/fr.po
@@ -2,20 +2,38 @@ 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: 2022-07-05 10:11+0200\n"
+"POT-Creation-Date: 2024-12-06 21:17+0100\n"
+"PO-Revision-Date: 2024-11-02 21:31+0100\n"
"Last-Translator: Tanavit <tanavit@posto.ovh>\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"
+"X-Generator: Poedit 2.4.2\n"
-#: advtrains/atc.lua:109
-msgid "Unconfigured ATC controller"
-msgstr "Controlleur ATC, non-configuré "
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: doors are closed."
+msgstr "Avertissement commande ATC Éjecter : portes closes."
+
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: train moving."
+msgstr "Avertissement commande ATC Éjecter : train en mouvement."
+
+#: advtrains/atc.lua
+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
+msgid "ATC command parse error: Unknown command: @1"
+msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1"
+
+#: advtrains/atc.lua
+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:150
+#: advtrains/atc.lua
msgid ""
"ATC controller, mode @1\n"
"Command: @2"
@@ -23,46 +41,64 @@ msgstr ""
"Controlleur ATC, mode @1\n"
"Commande : @2"
-#: advtrains/atc.lua:180
+#: advtrains/atc.lua
msgid "Command"
msgstr "Commande"
-#: advtrains/atc.lua:184
+#: advtrains/atc.lua
msgid "Command (on)"
-msgstr "Commande (marche) "
+msgstr "Commande (marche)"
-#: advtrains/atc.lua:187
+#: advtrains/atc.lua
msgid "Digiline channel"
msgstr "Canal Digiline"
-#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65
-#: advtrains_luaautomation/active_common.lua:48
+#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
+#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "Sauvegarder"
-#: advtrains/atc.lua:236
-#, 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
+msgid "Unconfigured ATC controller"
+msgstr "Controlleur ATC, non-configuré"
-#: advtrains/atc.lua:248
-msgid "ATC Kick command warning: doors are closed."
-msgstr ""
+#: advtrains/copytool.lua
+msgid "Back of train would end up off track, cancelling."
+msgstr "La fin du train serait hors voie : annulation."
-#: advtrains/atc.lua:252
-msgid "ATC Kick command warning: train moving."
-msgstr ""
+#: advtrains/copytool.lua
+msgid "No such lua entity."
+msgstr "Pas de telle entité lua."
-#: 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/copytool.lua
+msgid "No such train: @1."
+msgstr "Pas de tel train : @1."
-#: advtrains/atc.lua:385
-msgid "ATC command parse error: Unknown command: @1"
-msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1"
+#: advtrains/copytool.lua
+msgid "No such wagon: @1."
+msgstr "Pas de tel wagon : @1."
+
+#: advtrains/copytool.lua
+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
+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
+msgid "The clipboard is empty."
+msgstr "Le presse-papier est vide."
+
+#: advtrains/copytool.lua
+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
+msgid "Train copied."
+msgstr "Train copié."
-#: advtrains/copytool.lua:8
+#: advtrains/copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -75,144 +111,113 @@ msgstr ""
"\n"
"Clic-Droit : collage"
-#: advtrains/copytool.lua:29
+#: advtrains/copytool.lua
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
+msgid "<No coupler>"
+msgstr "<Pas de coupleur>"
-#: advtrains/couple.lua:28
+#: advtrains/couple.lua
msgid "Buffer and Chain Coupler"
msgstr "Attelage à tampon et vis"
-#: advtrains/couple.lua:29
+#: advtrains/couple.lua
+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/couple.lua
msgid "Scharfenberg Coupler"
msgstr "Attelage Scharfenberg"
-#: advtrains/couple.lua:185
+#: advtrains/couple.lua
msgid ""
"You are not allowed to couple trains without the train_operator privilege."
msgstr ""
+"Vous n'êtes pas autorisé à coupler des trains sans le privilège "
+"\"train_operator\"."
-#: advtrains/couple.lua:329 advtrains/couple.lua:333
-msgid "<No coupler>"
-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
+#: advtrains/craft_items.lua
msgid "Boiler"
msgstr "Chaudière à vapeur"
-#: advtrains/craft_items.lua:9
+#: advtrains/craft_items.lua
+msgid "Chimney"
+msgstr "Cheminée"
+
+#: advtrains/craft_items.lua
msgid "Driver's cab"
msgstr "Cabine de pilotage"
-#: advtrains/craft_items.lua:15
+#: advtrains/craft_items.lua
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
+msgid "@1 Platform (45 degree)"
+msgstr "Quai @1 (haut, 45°)"
-#: advtrains/misc_nodes.lua:33
+#: advtrains/misc_nodes.lua
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
+msgid "@1 Platform (low)"
+msgstr "Quai @1 (bas)"
-#: advtrains/misc_nodes.lua:81
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "Quai @1 (bas, 45°)"
-#: advtrains/protection.lua:7
-msgid "Can place, remove and operate trains"
+#: advtrains/protection.lua
+msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
+"Possibilité d'opérer des embranchements et signaux dans les zones non "
+"protégées"
+
+#: advtrains/protection.lua
+msgid "Can place and dig tracks in unprotected areas"
+msgstr "Possibilité de poser ou retirer des voies dans les zones non protégées"
-#: advtrains/protection.lua:12
+#: advtrains/protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
msgstr ""
+"Possibilité de poser, retirer ou opérer un quelconque train, indépendamment "
+"du propriétaire, de la liste blanche ou de protection"
-#: advtrains/protection.lua:18
-msgid "Can place and dig tracks in unprotected areas"
-msgstr ""
+#: advtrains/protection.lua
+msgid "Can place, remove and operate trains"
+msgstr "Possibilité de poser, retirer ou opérer les trains"
-#: advtrains/protection.lua:24
-msgid "Can operate turnouts and signals in unprotected areas"
+#: advtrains/protection.lua
+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:148
+#: advtrains/protection.lua
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
+#: advtrains/protection.lua
+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
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é"
+"Vous ne pouvez pas construire une voie sans le privilège \"track_builder\"."
-#: 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
+#: advtrains/protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
@@ -220,32 +225,47 @@ msgstr ""
"Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège "
"\"railway_operator\" manquant)"
-#: advtrains/signals.lua:63
+#: advtrains/signals.lua
+msgid "Andrew's Cross"
+msgstr "Croix de Saint André"
+
+#: advtrains/signals.lua
msgid "Lampless Signal"
msgstr "Sémaphore"
-#: advtrains/signals.lua:127
+#: advtrains/signals.lua
msgid "Signal"
-msgstr ""
+msgstr "Signal"
-#: advtrains/signals.lua:191
+#: advtrains/signals.lua
msgid "Wallmounted Signal (left)"
msgstr "Signal mural (gauche)"
-#: advtrains/signals.lua:192
+#: advtrains/signals.lua
msgid "Wallmounted Signal (right)"
msgstr "Signal mural (droit)"
-#: advtrains/signals.lua:193
+#: advtrains/signals.lua
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
+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:313
-#, fuzzy
+#: advtrains/trackplacer.lua
+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
+msgid "This track can not be changed."
+msgstr "Cette voie ne peut pas être modifiée."
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be rotated."
+msgstr "Cette voie ne peut pas être tournée."
+
+#: advtrains/trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -256,294 +276,302 @@ msgstr ""
"\n"
"Clic-Gauche : change le type de rail (droit/courbé/aiguillage)\n"
"\n"
-"Clic-Droit : tourne le rail/butoir/signal/etc..."
+"Clic-Droit : tourne l'objet"
-#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377
-#, fuzzy
-msgid "This node can't be rotated using the trackworker."
-msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !"
+#: advtrains/tracks.lua
+msgid "@1 Slope"
+msgstr "Pente @1"
-#: advtrains/trackplacer.lua:350
-msgid "This track can not be rotated."
-msgstr "Cette voie ne peut pas être tournée."
+#: advtrains/tracks.lua
+msgid "Can't place slope: Not enough slope items left (@1 required)."
+msgstr ""
+"Placement impossible : quantité insuffisante de voie pentue (@1 manquant)."
-#: advtrains/trackplacer.lua:404
-#, fuzzy
-msgid "This node can't be changed using the trackworker."
-msgstr "Ce nœud ne peut être modifié avec l'outil \"Trackworker\" !"
+#: advtrains/tracks.lua
+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/trackplacer.lua:414
-msgid "This track can not be changed."
-msgstr "Cette voie ne peut pas être modifiée."
+#: advtrains/tracks.lua
+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/tracks.lua:449
-msgid "This track can not be removed."
-msgstr "Cette voie ne peut pas être enlevée."
+#: advtrains/tracks.lua
+msgid "Can't place slope: not pointing at node."
+msgstr "Placement impossible : ne pointe pas un nœud."
+
+#: advtrains/tracks.lua
+msgid "Can't place slope: space occupied."
+msgstr "Placement impossible : espace occupé."
-#: advtrains/tracks.lua:616
+#: advtrains/tracks.lua
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
+#: advtrains/tracks.lua
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
+msgid "There's a Track Circuit Break here."
+msgstr "Il y a un \"Track Circuit Break\" ici."
-#: advtrains/tracks.lua:658
-#, fuzzy
-msgid "Can't place slope: space occupied."
-msgstr "Placement impossible : espace occupé"
+#: advtrains/tracks.lua
+msgid "This track can not be removed."
+msgstr "Cette voie ne peut pas être enlevée."
-#: advtrains/tracks.lua:711
-#, fuzzy
-msgid "Can't place slope: Not enough slope items left (@1 required)."
+#: advtrains/trainhud.lua
+msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
msgstr ""
-"Placement impossible : quantité insuffisante de voie pentue (@1 manquant)"
+"Franchissement de signal rouge : examinez la situation et inversez le sens "
+"de marche du train."
-#: 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/wagonprop_tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr ""
-#: advtrains/tracks.lua:721
+#: advtrains/wagonprop_tool.lua
#, 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"
+msgid "Wagon Properties Tool"
+msgstr "Propriétés du wagon"
-#: advtrains/trainhud.lua:305
-msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+#: advtrains/wagonprop_tool.lua
+msgid ""
+"Wagon Properties Tool\n"
+"Punch a wagon to view and edit the Wagon Properties"
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."
+#: advtrains/wagons.lua
+msgid "(Doors closed)"
+msgstr "(Portes closes)"
-#: advtrains/wagons.lua:210
-msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Doors are closed! (Try holding sneak key!)"
+msgstr "Portes closes : (Essayez la \"sneak key\"!\")"
-#: advtrains/wagons.lua:216
+#: advtrains/wagons.lua
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"
+"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/wagons.lua:655 advtrains/wagons.lua:1328
-msgid "Wagon properties"
-msgstr "Propriétés du wagon"
-
-#: advtrains/wagons.lua:658
+#: advtrains/wagons.lua
msgid "Get off"
msgstr "Débarquer"
-#: advtrains/wagons.lua:661
+#: advtrains/wagons.lua
msgid "Get off (forced)"
msgstr "Débarquer (de force)"
-#: advtrains/wagons.lua:663
-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
+msgid "Line"
+msgstr "Ligne"
-#: advtrains/wagons.lua:712
-msgid "You can't get on this wagon."
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Onboard Computer"
+msgstr "Ordinateur embarqué"
-#: advtrains/wagons.lua:838
-msgid "Select seat:"
-msgstr "Choisir le siège"
+#: advtrains/wagons.lua
+msgid "Routingcode"
+msgstr "Code de routage"
-#: advtrains/wagons.lua:880
+#: advtrains/wagons.lua
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
+msgid "Select seat:"
+msgstr "Choisir le siège :"
-#: advtrains/wagons.lua:966
+#: advtrains/wagons.lua
+msgid "Show Inventory"
+msgstr "Montrer le stock"
+
+#: advtrains/wagons.lua
msgid "Text displayed inside train"
msgstr "Texte affiché à l'intérieur du train"
-#: advtrains/wagons.lua:967
-msgid "Line"
-msgstr "Ligne "
+#: advtrains/wagons.lua
+msgid "Text displayed outside on train"
+msgstr "Texte affiché à l'extérieur du train"
-#: advtrains/wagons.lua:968
-msgid "Routingcode"
-msgstr "Code de routage"
+#: advtrains/wagons.lua
+msgid "The wagon's inventory is not empty."
+msgstr "Le stock de ce wagon n'est pas vide."
-#: advtrains/wagons.lua:1241
+#: advtrains/wagons.lua
#, fuzzy
-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 !"
+msgid "This Wagon ID"
+msgstr "Ce wagon est plein."
-#: advtrains/wagons.lua:1250
-msgid "You are not allowed to access the driver stand."
-msgstr ""
+#: advtrains/wagons.lua
+msgid "This wagon has no seats."
+msgstr "Ce wagon n'a pas de siège."
-#: advtrains_interlocking/tsr_rail.lua:13
-msgid "Point speed restriction: @1"
+#: advtrains/wagons.lua
+msgid "This wagon is full."
+msgstr "Ce wagon est plein."
+
+#: advtrains/wagons.lua
+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
+msgid "Train ID"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:14
-msgid "Set point speed restriction:"
+#: advtrains/wagons.lua
+msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
msgstr ""
+"Les wagons doivent être désaccouplés des autres pour pouvoir être détruits."
-#: advtrains_interlocking/tsr_rail.lua:30
-msgid "You are not allowed to configure this track without the @1 privilege."
+#: advtrains/wagons.lua
+msgid "Wagon properties"
+msgstr "Propriétés du wagon"
+
+#: advtrains/wagons.lua
+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_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."
+#: advtrains/wagons.lua
+msgid "You are not allowed to access the driver stand."
+msgstr "Accès interdit au poste de pilotage."
+
+#: advtrains/wagons.lua
+msgid "You can't get on this wagon."
+msgstr "Montée impossible dans ce wagon."
+
+#: advtrains_interlocking/routesetting.lua
+msgid "Route state changed."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:64
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point Speed Restriction Track"
-msgstr ""
+msgstr "Voie de point de limitation de vitesse"
-#: advtrains_line_automation/stoprail.lua:54
-msgid "Station Code"
-msgstr "Code de Station"
+#: advtrains_interlocking/tsr_rail.lua
+msgid "Point speed restriction: @1"
+msgstr "Point de limitation de vitesse : @1"
-#: advtrains_line_automation/stoprail.lua:55
-msgid "Station Name"
-msgstr "Nom de Station"
+#: advtrains_interlocking/tsr_rail.lua
+msgid "Set point speed restriction:"
+msgstr "Placez un point de limitation de vitesse :"
-#: advtrains_line_automation/stoprail.lua:56
-msgid "Door Delay"
-msgstr "Durée d'ouverture des portes"
+#: advtrains_interlocking/tsr_rail.lua
+msgid "You are not allowed to configure this track without the @1 privilege."
+msgstr "Vous n'êtes pas autorisé à configurer cette voie sans le privilège @1."
-#: advtrains_line_automation/stoprail.lua:57
+#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
+msgid "You are not allowed to configure this track."
+msgstr "Vous n'êtes pas autorisé à configurer cette voie."
+
+#: advtrains_line_automation/stoprail.lua
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
+msgid "Door Delay"
+msgstr "Durée d'ouverture des portes"
-#: advtrains_line_automation/stoprail.lua:60
+#: advtrains_line_automation/stoprail.lua
msgid "Door Side"
-msgstr ""
+msgstr "Coté d'ouvertures des portes"
+
+#: advtrains_line_automation/stoprail.lua
+msgid "Kick out passengers"
+msgstr "Éjecter les passagers"
-#: advtrains_line_automation/stoprail.lua:62
+#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
-msgstr ""
+msgstr "Inversion du sens de marche"
-#: advtrains_line_automation/stoprail.lua:63
-msgid "Kick out passengers"
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Code"
+msgstr "Code de Station"
-#: advtrains_line_automation/stoprail.lua:97
-msgid "Station code \"@1\" already exists and is owned by @2."
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Name"
+msgstr "Nom de Station"
-#: 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
+msgid "Station code \"@1\" already exists and is owned by @2."
+msgstr "Le code de station \"@1\" existe et est possédé par @2."
-#: advtrains_line_automation/stoprail.lua:221
+#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
-msgstr ""
+msgstr "Voie d'arrêt en station"
-#: advtrains_luaautomation/active_common.lua:17
-msgid "Unconfigured LuaATC component"
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Stop Time"
+msgstr "Durée d'arrêt"
-#: advtrains_luaautomation/active_common.lua:46
-msgid "LuaATC Environment"
+#: advtrains_line_automation/stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""
+"Cette station est la propriété de @1. Vous n'êtes pas autorisé à modifier "
+"son nom."
+
+#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
+msgid "Track"
+msgstr "Voie"
-#: advtrains_luaautomation/active_common.lua:49
+#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
-msgstr ""
+msgstr "Effacer l'environnement LuaATC"
-#: advtrains_luaautomation/active_common.lua:50
+#: advtrains_luaautomation/active_common.lua
msgid "Code"
-msgstr ""
+msgstr "Code"
-#: 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
+msgid "LuaATC Environment"
+msgstr "Environnement LuaATC"
-#: advtrains_luaautomation/active_common.lua:96
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component assigned to an invalid environment"
-msgstr ""
+msgstr "Composant LuaATC assigné à un environnement invalide"
+
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr "Composant LuaATC assigné à l'environnement '@1'"
-#: advtrains_luaautomation/active_common.lua:171
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component with error: @1"
-msgstr ""
+msgstr "Erreur @1 du composant LuaATC"
+
+#: advtrains_luaautomation/active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "Composant LuaATC non configuré"
+
+#: advtrains_luaautomation/active_common.lua
+msgid ""
+"You are not allowed to configure this LuaATC component without the @1 "
+"privilege."
+msgstr "Vous ne pouvez configurer ce composant LuaATC sans le privilege @1."
-#: advtrains_luaautomation/init.lua:13
+#: advtrains_luaautomation/init.lua
msgid ""
"Can place and configure LuaATC components, including execute potentially "
"harmful Lua code"
msgstr ""
+"Permet le placement et la configuration de composants LuaATC avec risque "
+"d'exécution de code Lua dangereux"
-#: advtrains_luaautomation/mesecon_controller.lua:211
+#: advtrains_luaautomation/mesecon_controller.lua
msgid "LuaATC Mesecon Controller"
-msgstr ""
+msgstr "Commande Mesecon de LuaATC"
-#: advtrains_luaautomation/operation_panel.lua:11
+#: advtrains_luaautomation/operation_panel.lua
msgid "LuaATC Operation Panel"
-msgstr ""
+msgstr "Panneau de commande de LuaATC"
-#: advtrains_luaautomation/pcnaming.lua:28
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"Passive Component Naming Tool\n"
"\n"
@@ -553,119 +581,115 @@ msgstr ""
"\n"
"Clic-Droit pour nommer un composant passif."
-#: advtrains_luaautomation/pcnaming.lua:39
+#: advtrains_luaautomation/pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr "Nommer le composant (chaîne vide pour effacer)"
+
+#: advtrains_luaautomation/pcnaming.lua
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 ""
+msgstr "Vous ne pouvez nommer un composant LuaATC passif sans le privilege @1."
-#: 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
+msgid "Big Industrial Train Engine"
+msgstr "Grosse locomotive industrielle"
-#: advtrains_train_industrial/init.lua:17
-#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14
-#: advtrains_train_steam/init.lua:85
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (left)"
msgstr "Poste de pilotage (gauche)"
-#: advtrains_train_industrial/init.lua:40
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
+msgid "Driver Stand (right)"
+msgstr "Poste de pilotage (droit)"
+
+#: advtrains_train_industrial/init.lua
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
+#: advtrains_train_industrial/init.lua
msgid "Industrial tank wagon"
msgstr "Wagon-citerne industriel"
-#: advtrains_train_industrial/init.lua:116
+#: advtrains_train_industrial/init.lua
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
+#: advtrains_train_japan/init.lua
msgid "Driver stand"
msgstr "Poste de pilotage"
-#: advtrains_train_japan/init.lua:101
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Engine"
msgstr "Motrice Japonaise"
-#: advtrains_train_japan/init.lua:176
+#: advtrains_train_japan/init.lua
+msgid "Japanese Train Inter-Wagon Connection"
+msgstr "Passage inter-voiture de train Japonais"
+
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Wagon"
msgstr "Voiture Japonaise"
-#: advtrains_train_steam/init.lua:75
-msgid "Steam Engine"
-msgstr "Locomotive à vapeur"
+#: advtrains_train_steam/init.lua
+msgid "Box Wagon"
+msgstr "Wagon de frêt"
-#: advtrains_train_steam/init.lua:159
+#: advtrains_train_steam/init.lua
msgid "Detailed Steam Engine"
msgstr "Locomotive à vapeur complexe"
-#: advtrains_train_steam/init.lua:206
+#: advtrains_train_steam/init.lua
msgid "Passenger Wagon"
msgstr "Voiture passager"
-#: advtrains_train_steam/init.lua:226
-msgid "Box Wagon"
-msgstr "Wagon de frêt"
+#: advtrains_train_steam/init.lua
+msgid "Steam Engine"
+msgstr "Locomotive à vapeur"
-#: advtrains_train_subway/init.lua:144
+#: advtrains_train_subway/init.lua
msgid "Subway Passenger Wagon"
msgstr "Voiture de Métropolitain"
-#: advtrains_train_track/init.lua:31
-msgid "Y-turnout"
-msgstr "Embranchement en Y"
-
-#: advtrains_train_track/init.lua:49
+#: advtrains_train_track/init.lua
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
+#: advtrains_train_track/init.lua
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
+msgid "ATC controller"
+msgstr "Controlleur ATC"
-#: advtrains_train_track/init.lua:179
+#: advtrains_train_track/init.lua
msgid "Bumper"
msgstr "Heurtoir"
-#: advtrains_train_track/init.lua:201
-msgid "ATC controller"
-msgstr "Controlleur ATC"
+#: advtrains_train_track/init.lua
+msgid "Detector Rail"
+msgstr "Voie détectrice"
-#: advtrains_train_track/init.lua:317
-msgid "Unloading Track"
-msgstr "Voie de Déchargement"
+#: advtrains_train_track/init.lua
+msgid "Diagonal Diamond Crossing Track"
+msgstr "Croisement diagonal"
-#: advtrains_train_track/init.lua:342
+#: advtrains_train_track/init.lua
msgid "Loading Track"
msgstr "Voie de Chargement"
-#: advtrains_train_track/init.lua:406
-msgid "Detector Rail"
-msgstr "Voie détectrice"
+#: advtrains_train_track/init.lua
+msgid "Perpendicular Diamond Crossing Track"
+msgstr "Croisement perpendiculaire"
+
+#: advtrains_train_track/init.lua
+msgid "Unloading Track"
+msgstr "Voie de Déchargement"
+
+#: advtrains_train_track/init.lua
+msgid "Y-turnout"
+msgstr "Embranchement en Y"
#~ msgid ""
#~ "ATC controller, mode @1\n"
diff --git a/advtrains/po/update-translations.sh b/advtrains/po/update-translations.sh
index 3a56c7c..4c22c85 100755
--- a/advtrains/po/update-translations.sh
+++ b/advtrains/po/update-translations.sh
@@ -13,6 +13,7 @@ xgettext \
-o "$POTFILE" \
-p . \
-L lua \
+ --add-location=file \
--from-code=UTF-8 \
--sort-by-file \
--keyword='attrans' \
diff --git a/advtrains/po/zh_CN.po b/advtrains/po/zh_CN.po
index 5bcc316..9f5f84f 100644
--- a/advtrains/po/zh_CN.po
+++ b/advtrains/po/zh_CN.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-09 11:02+0200\n"
+"POT-Creation-Date: 2024-12-06 21:17+0100\n"
"PO-Revision-Date: 2023-10-09 11:24+0200\n"
"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
"Language-Team: Chinese (Simplified)\n"
@@ -12,11 +12,27 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.3.2\n"
-#: advtrains/atc.lua:109
-msgid "Unconfigured ATC controller"
-msgstr "ATC 控制器 (未配置)"
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: doors are closed."
+msgstr "ATC 警告:车门已关闭,无法踢出乘客。"
+
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: train moving."
+msgstr "ATC 警告:火车正在移动,无法踢出乘客。"
+
+#: advtrains/atc.lua
+msgid "ATC Reverse command warning: didn't reverse train, train moving."
+msgstr "ATC 警告:火车正在移动,无法改变行车方向。"
+
+#: advtrains/atc.lua
+msgid "ATC command parse error: Unknown command: @1"
+msgstr "ATC 语法错误:未知命令:@1"
-#: advtrains/atc.lua:150
+#: advtrains/atc.lua
+msgid "ATC command syntax error: I statement not closed: @1"
+msgstr "ATC 语法错误:“I”命令不完整:@1"
+
+#: advtrains/atc.lua
msgid ""
"ATC controller, mode @1\n"
"Command: @2"
@@ -25,44 +41,64 @@ msgstr ""
"模式:@1\n"
"命令:@2"
-#: advtrains/atc.lua:180
+#: advtrains/atc.lua
msgid "Command"
msgstr "命令"
-#: advtrains/atc.lua:184
+#: advtrains/atc.lua
msgid "Command (on)"
msgstr "命令 (激活时)"
-#: advtrains/atc.lua:187
+#: advtrains/atc.lua
msgid "Digiline channel"
msgstr "Digiline 频道"
-#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65
-#: advtrains_luaautomation/active_common.lua:48
+#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
+#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "保存"
-#: advtrains/atc.lua:236
-msgid "ATC Reverse command warning: didn't reverse train, train moving."
-msgstr "ATC 警告:火车正在移动,无法改变行车方向。"
+#: advtrains/atc.lua
+msgid "Unconfigured ATC controller"
+msgstr "ATC 控制器 (未配置)"
-#: advtrains/atc.lua:248
-msgid "ATC Kick command warning: doors are closed."
-msgstr "ATC 警告:车门已关闭,无法踢出乘客。"
+#: advtrains/copytool.lua
+msgid "Back of train would end up off track, cancelling."
+msgstr "火车后部不在轨道上。"
-#: advtrains/atc.lua:252
-msgid "ATC Kick command warning: train moving."
-msgstr "ATC 警告:火车正在移动,无法踢出乘客。"
+#: advtrains/copytool.lua
+msgid "No such lua entity."
+msgstr "您没有指向一个可以用火车复制工具复制的物体。"
-#: advtrains/atc.lua:322
-msgid "ATC command syntax error: I statement not closed: @1"
-msgstr "ATC 语法错误:“I”命令不完整:@1"
+#: advtrains/copytool.lua
+msgid "No such train: @1."
+msgstr "ID 为“@1”的列车不存在。"
-#: advtrains/atc.lua:385
-msgid "ATC command parse error: Unknown command: @1"
-msgstr "ATC 语法错误:未知命令:@1"
+#: advtrains/copytool.lua
+msgid "No such wagon: @1."
+msgstr "ID 为“@1”的车厢不存在。"
-#: advtrains/copytool.lua:8
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Copy failed."
+msgstr "无法复制:剪贴板无法访问元数据。"
+
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Paste failed."
+msgstr "无法粘贴:剪贴板无法访问元数据。"
+
+#: advtrains/copytool.lua
+msgid "The clipboard is empty."
+msgstr "剪贴板是空的。"
+
+#: advtrains/copytool.lua
+msgid "The track you are trying to place the wagon on is not long enough."
+msgstr "轨道太短。"
+
+#: advtrains/copytool.lua
+msgid "Train copied."
+msgstr "已复制列车。"
+
+#: advtrains/copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -74,166 +110,146 @@ msgstr ""
"左键单击:复制\n"
"右键单击:粘帖"
-#: advtrains/copytool.lua:29
+#: advtrains/copytool.lua
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
+msgid "<No coupler>"
+msgstr "<没有车钩>"
-#: advtrains/couple.lua:28
+#: advtrains/couple.lua
msgid "Buffer and Chain Coupler"
msgstr "链式车钩"
-#: advtrains/couple.lua:29
+#: advtrains/couple.lua
+msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。"
+
+#: advtrains/couple.lua
msgid "Scharfenberg Coupler"
msgstr "Scharfenberg 式车钩"
-#: advtrains/couple.lua:185
+#: advtrains/couple.lua
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 "<No coupler>"
-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
+#: advtrains/craft_items.lua
msgid "Boiler"
msgstr "锅炉"
-#: advtrains/craft_items.lua:9
+#: advtrains/craft_items.lua
+msgid "Chimney"
+msgstr "烟囱"
+
+#: advtrains/craft_items.lua
msgid "Driver's cab"
msgstr "驾驶室"
-#: advtrains/craft_items.lua:15
+#: advtrains/craft_items.lua
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
+msgid "@1 Platform (45 degree)"
+msgstr "较高的@1站台 (45°)"
-#: advtrains/misc_nodes.lua:33
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (high)"
msgstr "较高的@1站台"
-#: advtrains/misc_nodes.lua:59
-msgid "@1 Platform (45 degree)"
-msgstr "较高的@1站台 (45°)"
+#: advtrains/misc_nodes.lua
+msgid "@1 Platform (low)"
+msgstr "较低的@1站台"
-#: advtrains/misc_nodes.lua:81
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "较低的@1站台 (45°)"
-#: advtrains/protection.lua:7
-msgid "Can place, remove and operate trains"
+#: advtrains/protection.lua
+msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua:12
+#: advtrains/protection.lua
+msgid "Can place and dig tracks in unprotected areas"
+msgstr ""
+
+#: advtrains/protection.lua
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"
+#: advtrains/protection.lua
+msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua:24
-msgid "Can operate turnouts and signals in unprotected areas"
-msgstr ""
+#: advtrains/protection.lua
+msgid "You are not allowed to build near tracks at this protected position."
+msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。"
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr "您没有“train_operator”权限,不能在铁路附近建任何东西。"
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
+msgid "You are not allowed to build tracks at this protected position."
+msgstr "这里已被保护,您不能在这里建造铁路。"
+
+#: advtrains/protection.lua
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
+#: advtrains/protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
msgstr "您没有“railway_operator”权限,不能控制铁路设施。"
-#: advtrains/signals.lua:63
+#: advtrains/signals.lua
+msgid "Andrew's Cross"
+msgstr "铁路道口信号灯"
+
+#: advtrains/signals.lua
msgid "Lampless Signal"
msgstr "臂板信号机"
-#: advtrains/signals.lua:127
+#: advtrains/signals.lua
msgid "Signal"
msgstr "信号灯"
-#: advtrains/signals.lua:191
+#: advtrains/signals.lua
msgid "Wallmounted Signal (left)"
msgstr "壁挂式信号灯 (左侧)"
-#: advtrains/signals.lua:192
+#: advtrains/signals.lua
msgid "Wallmounted Signal (right)"
msgstr "壁挂式信号灯 (右侧)"
-#: advtrains/signals.lua:193
+#: advtrains/signals.lua
msgid "Wallmounted Signal (top)"
msgstr "悬挂式信号灯"
-#: advtrains/signals.lua:281 advtrains/signals.lua:322
-msgid "Andrew's Cross"
-msgstr "铁路道口信号灯"
+#: advtrains/trackplacer.lua
+msgid "This node can't be changed using the trackworker."
+msgstr "您不能使用铁路调整工具调整这个方块。"
+
+#: advtrains/trackplacer.lua
+msgid "This node can't be rotated using the trackworker."
+msgstr "您不能使用铁路调整工具旋转这个方块。"
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be changed."
+msgstr "您不能调整这段轨道。"
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be rotated."
+msgstr "您不能旋转这段轨道。"
-#: advtrains/trackplacer.lua:313
+#: advtrains/trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -245,280 +261,289 @@ msgstr ""
"左键单击:切换轨道类型\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/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
+#: advtrains/tracks.lua
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
+#: advtrains/tracks.lua
msgid "Can't place slope: Not enough slope items left (@1 required)."
msgstr "无法放置斜坡:您没有足够的铁路斜坡放置工具 (您总共需要@1个)"
-#: advtrains/tracks.lua:714
+#: advtrains/tracks.lua
msgid "Can't place slope: There's no slope of length @1."
msgstr "无法放置斜坡:advtrains 不支持长度为@1米的斜坡。"
-#: advtrains/tracks.lua:721
+#: advtrains/tracks.lua
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."
+#: advtrains/tracks.lua
+msgid "Can't place slope: not pointing at node."
+msgstr "无法放置斜坡:您没有选择任何方块。"
+
+#: advtrains/tracks.lua
+msgid "Can't place slope: space occupied."
+msgstr "无法放置斜坡:此区域已被占用。"
+
+#: advtrains/tracks.lua
+msgid "Position is occupied by a train."
msgstr ""
-#: advtrains/wagons.lua:179
-msgid "This wagon is owned by @1, you can't destroy it."
-msgstr "这是 @1 的车厢,您不能摧毁它。"
+#: advtrains/tracks.lua
+msgid "There's a Signal Influence Point here."
+msgstr ""
-#: advtrains/wagons.lua:203
-msgid "The wagon's inventory is not empty."
+#: advtrains/tracks.lua
+msgid "There's a Track Circuit Break here."
msgstr ""
-#: advtrains/wagons.lua:210
-msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
+#: advtrains/tracks.lua
+msgid "This track can not be removed."
+msgstr "您不能移除这段轨道。"
+
+#: advtrains/trainhud.lua
+msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+msgstr ""
+
+#: advtrains/wagonprop_tool.lua
+msgid "Insufficient privileges to use this!"
msgstr ""
-#: advtrains/wagons.lua:216
+#: advtrains/wagonprop_tool.lua
+#, fuzzy
+msgid "Wagon Properties Tool"
+msgstr "车厢属性"
+
+#: advtrains/wagonprop_tool.lua
msgid ""
-"Warning: If you destroy this wagon, you only get some steel back! If you are "
-"sure, hold Sneak and left-click the wagon."
+"Wagon Properties Tool\n"
+"Punch a wagon to view and edit the Wagon Properties"
msgstr ""
-"警告:如果您摧毁此车厢,您只能拿到一些钢方块。如果您确定要摧毁这节车厢,请按"
-"潜行键并左键单击此车厢。"
-#: advtrains/wagons.lua:649 advtrains/wagons.lua:850
-msgid "Show Inventory"
-msgstr "显示物品栏"
+#: advtrains/wagons.lua
+msgid "(Doors closed)"
+msgstr "(车门已关闭)"
-#: advtrains/wagons.lua:652
-msgid "Onboard Computer"
+#: advtrains/wagons.lua
+msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
-#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328
-msgid "Wagon properties"
-msgstr "车厢属性"
+#: advtrains/wagons.lua
+msgid ""
+"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+"off."
+msgstr "车门已关闭,请使用潜行+右键单击下车。"
-#: advtrains/wagons.lua:658
+#: advtrains/wagons.lua
msgid "Get off"
msgstr "下车"
-#: advtrains/wagons.lua:661
+#: advtrains/wagons.lua
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
+msgid "Line"
+msgstr "火车线路"
-#: advtrains/wagons.lua:706
-msgid "Doors are closed! (Try holding sneak key!)"
+#: advtrains/wagons.lua
+msgid "Onboard Computer"
msgstr ""
-#: advtrains/wagons.lua:712
-msgid "You can't get on this wagon."
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Routingcode"
+msgstr "路由码"
+
+#: advtrains/wagons.lua
+msgid "Save wagon properties"
+msgstr "保存车厢属性"
-#: advtrains/wagons.lua:838
+#: advtrains/wagons.lua
msgid "Select seat:"
msgstr "请选择座位:"
-#: advtrains/wagons.lua:880
-msgid "Save wagon properties"
-msgstr "保存车厢属性"
+#: advtrains/wagons.lua
+msgid "Show Inventory"
+msgstr "显示物品栏"
+
+#: advtrains/wagons.lua
+msgid "Text displayed inside train"
+msgstr "车厢内部显示"
-#: advtrains/wagons.lua:965
+#: advtrains/wagons.lua
msgid "Text displayed outside on train"
msgstr "车厢外部显示"
-#: advtrains/wagons.lua:966
-msgid "Text displayed inside train"
-msgstr "车厢内部显示"
+#: advtrains/wagons.lua
+msgid "The wagon's inventory is not empty."
+msgstr ""
-#: advtrains/wagons.lua:967
-msgid "Line"
-msgstr "火车线路"
+#: advtrains/wagons.lua
+#, fuzzy
+msgid "This Wagon ID"
+msgstr "车厢已满。"
-#: advtrains/wagons.lua:968
-msgid "Routingcode"
-msgstr "路由码"
+#: advtrains/wagons.lua
+msgid "This wagon has no seats."
+msgstr "这节车厢没有座位。"
-#: advtrains/wagons.lua:1241
+#: advtrains/wagons.lua
+msgid "This wagon is full."
+msgstr "车厢已满。"
+
+#: advtrains/wagons.lua
+msgid "This wagon is owned by @1, you can't destroy it."
+msgstr "这是 @1 的车厢,您不能摧毁它。"
+
+#: advtrains/wagons.lua
+msgid "Train ID"
+msgstr ""
+
+#: advtrains/wagons.lua
+msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
+msgstr ""
+
+#: advtrains/wagons.lua
+msgid "Wagon properties"
+msgstr "车厢属性"
+
+#: advtrains/wagons.lua
msgid ""
-"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
-"off."
-msgstr "车门已关闭,请使用潜行+右键单击下车。"
+"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:1250
+#: advtrains/wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:13
+#: advtrains/wagons.lua
+msgid "You can't get on this wagon."
+msgstr ""
+
+#: advtrains_interlocking/routesetting.lua
+msgid "Route state changed."
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point speed restriction: @1"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:14
+#: advtrains_interlocking/tsr_rail.lua
msgid "Set point speed restriction:"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:30
+#: advtrains_interlocking/tsr_rail.lua
msgid "You are not allowed to configure this track without the @1 privilege."
msgstr "您没有“@1”权限,不能调整这段轨道。"
-#: advtrains_interlocking/tsr_rail.lua:34
-#: advtrains_line_automation/stoprail.lua:31
-#: advtrains_line_automation/stoprail.lua:76
+#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
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
+#: advtrains_line_automation/stoprail.lua
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
+msgid "Door Delay"
+msgstr "车门关闭时间"
-#: advtrains_line_automation/stoprail.lua:60
+#: advtrains_line_automation/stoprail.lua
msgid "Door Side"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:62
+#: advtrains_line_automation/stoprail.lua
+msgid "Kick out passengers"
+msgstr "踢出乘客"
+
+#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr "改变行车方向"
-#: advtrains_line_automation/stoprail.lua:63
-msgid "Kick out passengers"
-msgstr "踢出乘客"
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Code"
+msgstr "车站代码"
-#: advtrains_line_automation/stoprail.lua:97
-msgid "Station code \"@1\" already exists and is owned by @2."
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Name"
+msgstr "车站名称"
-#: advtrains_line_automation/stoprail.lua:111
-msgid "This station is owned by @1. You are not allowed to edit its name."
+#: advtrains_line_automation/stoprail.lua
+msgid "Station code \"@1\" already exists and is owned by @2."
msgstr ""
-#: advtrains_line_automation/stoprail.lua:221
+#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
msgstr "车站轨道"
-#: advtrains_luaautomation/active_common.lua:17
-msgid "Unconfigured LuaATC component"
-msgstr "LuaATC 部件 (未配置)"
+#: advtrains_line_automation/stoprail.lua
+msgid "Stop Time"
+msgstr "停站时间"
-#: advtrains_luaautomation/active_common.lua:46
-msgid "LuaATC Environment"
+#: advtrains_line_automation/stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""
-#: advtrains_luaautomation/active_common.lua:49
+#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
+msgid "Track"
+msgstr "轨道"
+
+#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:50
+#: advtrains_luaautomation/active_common.lua
msgid "Code"
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_luaautomation/active_common.lua:94
-msgid "LuaATC component assigned to environment '@1'"
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:96
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component assigned to an invalid environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:171
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr ""
+
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component with error: @1"
msgstr ""
-#: advtrains_luaautomation/init.lua:13
+#: advtrains_luaautomation/active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "LuaATC 部件 (未配置)"
+
+#: advtrains_luaautomation/active_common.lua
+msgid ""
+"You are not allowed to configure this LuaATC component without the @1 "
+"privilege."
+msgstr "您没有“@1”权限,不能配置这个 LuaATC 部件。"
+
+#: advtrains_luaautomation/init.lua
msgid ""
"Can place and configure LuaATC components, including execute potentially "
"harmful Lua code"
msgstr ""
-#: advtrains_luaautomation/mesecon_controller.lua:211
+#: advtrains_luaautomation/mesecon_controller.lua
msgid "LuaATC Mesecon Controller"
msgstr ""
-#: advtrains_luaautomation/operation_panel.lua:11
+#: advtrains_luaautomation/operation_panel.lua
msgid "LuaATC Operation Panel"
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:28
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"Passive Component Naming Tool\n"
"\n"
@@ -528,119 +553,115 @@ msgstr ""
"\n"
"右键单击命名所选元件。"
-#: advtrains_luaautomation/pcnaming.lua:39
+#: advtrains_luaautomation/pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr ""
+
+#: advtrains_luaautomation/pcnaming.lua
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
-#: advtrains_train_steam/init.lua:91
-msgid "Driver Stand (right)"
-msgstr "右侧司机座位"
+#: advtrains_train_industrial/init.lua
+msgid "Big Industrial Train Engine"
+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
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (left)"
msgstr "左侧司机座位"
-#: advtrains_train_industrial/init.lua:40
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
+msgid "Driver Stand (right)"
+msgstr "右侧司机座位"
+
+#: advtrains_train_industrial/init.lua
msgid "Industrial Train Engine"
msgstr "工业用火车头"
-#: advtrains_train_industrial/init.lua:79
-msgid "Big Industrial Train Engine"
-msgstr "大型工业用火车头"
-
-#: advtrains_train_industrial/init.lua:98
+#: advtrains_train_industrial/init.lua
msgid "Industrial tank wagon"
msgstr "液体运输车厢"
-#: advtrains_train_industrial/init.lua:116
+#: advtrains_train_industrial/init.lua
msgid "Industrial wood wagon"
msgstr "木材运输车厢"
-#: advtrains_train_japan/init.lua:4
-msgid "Japanese Train Inter-Wagon Connection"
-msgstr "日本火车车钩"
-
-#: advtrains_train_japan/init.lua:37
+#: advtrains_train_japan/init.lua
msgid "Driver stand"
msgstr "司机座位"
-#: advtrains_train_japan/init.lua:101
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Engine"
msgstr "高速列车车头"
-#: advtrains_train_japan/init.lua:176
+#: advtrains_train_japan/init.lua
+msgid "Japanese Train Inter-Wagon Connection"
+msgstr "日本火车车钩"
+
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Wagon"
msgstr "高速列车车厢"
-#: advtrains_train_steam/init.lua:75
-msgid "Steam Engine"
-msgstr "蒸汽机车"
+#: advtrains_train_steam/init.lua
+msgid "Box Wagon"
+msgstr "货运车厢"
-#: advtrains_train_steam/init.lua:159
+#: advtrains_train_steam/init.lua
msgid "Detailed Steam Engine"
msgstr "精细的蒸汽机车"
-#: advtrains_train_steam/init.lua:206
+#: advtrains_train_steam/init.lua
msgid "Passenger Wagon"
msgstr "客车"
-#: advtrains_train_steam/init.lua:226
-msgid "Box Wagon"
-msgstr "货运车厢"
+#: advtrains_train_steam/init.lua
+msgid "Steam Engine"
+msgstr "蒸汽机车"
-#: advtrains_train_subway/init.lua:144
+#: advtrains_train_subway/init.lua
msgid "Subway Passenger Wagon"
msgstr "地铁车厢"
-#: advtrains_train_track/init.lua:31
-msgid "Y-turnout"
-msgstr "对称道岔"
-
-#: advtrains_train_track/init.lua:49
+#: advtrains_train_track/init.lua
msgid "3-way turnout"
msgstr "三开道岔"
-#: advtrains_train_track/init.lua:69
-msgid "Perpendicular Diamond Crossing Track"
-msgstr "垂直交叉轨道"
-
-#: advtrains_train_track/init.lua:91
+#: advtrains_train_track/init.lua
msgid "90+Angle Diamond Crossing Track"
msgstr "交叉轨道 (其中一条轨道与坐标轴平行)"
-#: advtrains_train_track/init.lua:132
-msgid "Diagonal Diamond Crossing Track"
-msgstr "交叉轨道"
+#: advtrains_train_track/init.lua
+msgid "ATC controller"
+msgstr "ATC 控制器"
-#: advtrains_train_track/init.lua:179
+#: advtrains_train_track/init.lua
msgid "Bumper"
msgstr "保险杠"
-#: advtrains_train_track/init.lua:201
-msgid "ATC controller"
-msgstr "ATC 控制器"
+#: advtrains_train_track/init.lua
+msgid "Detector Rail"
+msgstr "探测轨道"
-#: advtrains_train_track/init.lua:317
-msgid "Unloading Track"
-msgstr "卸货轨道"
+#: advtrains_train_track/init.lua
+msgid "Diagonal Diamond Crossing Track"
+msgstr "交叉轨道"
-#: advtrains_train_track/init.lua:342
+#: advtrains_train_track/init.lua
msgid "Loading Track"
msgstr "装货轨道"
-#: advtrains_train_track/init.lua:406
-msgid "Detector Rail"
-msgstr "探测轨道"
+#: advtrains_train_track/init.lua
+msgid "Perpendicular Diamond Crossing Track"
+msgstr "垂直交叉轨道"
+
+#: advtrains_train_track/init.lua
+msgid "Unloading Track"
+msgstr "卸货轨道"
+
+#: advtrains_train_track/init.lua
+msgid "Y-turnout"
+msgstr "对称道岔"
#~ msgid ""
#~ "ATC controller, mode @1\n"
diff --git a/advtrains/po/zh_TW.po b/advtrains/po/zh_TW.po
index ece82c3..97dab1b 100644
--- a/advtrains/po/zh_TW.po
+++ b/advtrains/po/zh_TW.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-09 11:02+0200\n"
+"POT-Creation-Date: 2024-12-06 21:17+0100\n"
"PO-Revision-Date: 2023-10-09 11:31+0200\n"
"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
"Language-Team: Chinese (Traditional)\n"
@@ -12,11 +12,27 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.3.2\n"
-#: advtrains/atc.lua:109
-msgid "Unconfigured ATC controller"
-msgstr "ATC 控制器 (未配置)"
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: doors are closed."
+msgstr "ATC 警告:車門已關閉,無法踢出乘客。"
+
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: train moving."
+msgstr "ATC 警告:火車正在移動,無法踢出乘客。"
+
+#: advtrains/atc.lua
+msgid "ATC Reverse command warning: didn't reverse train, train moving."
+msgstr "ATC 警告:火車正在移動,無法改變行車方向。"
+
+#: advtrains/atc.lua
+msgid "ATC command parse error: Unknown command: @1"
+msgstr "ATC 語法錯誤:未知命令:@1"
-#: advtrains/atc.lua:150
+#: advtrains/atc.lua
+msgid "ATC command syntax error: I statement not closed: @1"
+msgstr "ATC 語法錯誤:「I」命令不完整:@1"
+
+#: advtrains/atc.lua
msgid ""
"ATC controller, mode @1\n"
"Command: @2"
@@ -25,44 +41,64 @@ msgstr ""
"模式:@1\n"
"命令:@2"
-#: advtrains/atc.lua:180
+#: advtrains/atc.lua
msgid "Command"
msgstr "命令"
-#: advtrains/atc.lua:184
+#: advtrains/atc.lua
msgid "Command (on)"
msgstr "命令 (啟用時)"
-#: advtrains/atc.lua:187
+#: advtrains/atc.lua
msgid "Digiline channel"
msgstr "Digiline 頻道"
-#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65
-#: advtrains_luaautomation/active_common.lua:48
+#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
+#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "儲存"
-#: advtrains/atc.lua:236
-msgid "ATC Reverse command warning: didn't reverse train, train moving."
-msgstr "ATC 警告:火車正在移動,無法改變行車方向。"
+#: advtrains/atc.lua
+msgid "Unconfigured ATC controller"
+msgstr "ATC 控制器 (未配置)"
-#: advtrains/atc.lua:248
-msgid "ATC Kick command warning: doors are closed."
-msgstr "ATC 警告:車門已關閉,無法踢出乘客。"
+#: advtrains/copytool.lua
+msgid "Back of train would end up off track, cancelling."
+msgstr "火車後部不在軌道上。"
-#: advtrains/atc.lua:252
-msgid "ATC Kick command warning: train moving."
-msgstr "ATC 警告:火車正在移動,無法踢出乘客。"
+#: advtrains/copytool.lua
+msgid "No such lua entity."
+msgstr "您沒有指向一個可以用火車複製工具複製的物體。"
-#: advtrains/atc.lua:322
-msgid "ATC command syntax error: I statement not closed: @1"
-msgstr "ATC 語法錯誤:「I」命令不完整:@1"
+#: advtrains/copytool.lua
+msgid "No such train: @1."
+msgstr "ID 為「@1」的列車不存在。"
-#: advtrains/atc.lua:385
-msgid "ATC command parse error: Unknown command: @1"
-msgstr "ATC 語法錯誤:未知命令:@1"
+#: advtrains/copytool.lua
+msgid "No such wagon: @1."
+msgstr "ID 為「@1」的車廂不存在。"
-#: advtrains/copytool.lua:8
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Copy failed."
+msgstr "無法複製:剪貼簿無法訪問元資料。"
+
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Paste failed."
+msgstr "無法貼上:剪貼簿無法訪問元資料。"
+
+#: advtrains/copytool.lua
+msgid "The clipboard is empty."
+msgstr "剪貼簿是空的。"
+
+#: advtrains/copytool.lua
+msgid "The track you are trying to place the wagon on is not long enough."
+msgstr "軌道太短。"
+
+#: advtrains/copytool.lua
+msgid "Train copied."
+msgstr "已複製火車。"
+
+#: advtrains/copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -74,166 +110,146 @@ msgstr ""
"左鍵單擊:複製\n"
"右鍵單擊:粘帖"
-#: advtrains/copytool.lua:29
+#: advtrains/copytool.lua
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
+msgid "<No coupler>"
+msgstr "<無連結器>"
-#: advtrains/couple.lua:28
+#: advtrains/couple.lua
msgid "Buffer and Chain Coupler"
msgstr "鏈式連結器"
-#: advtrains/couple.lua:29
+#: advtrains/couple.lua
+msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。"
+
+#: advtrains/couple.lua
msgid "Scharfenberg Coupler"
msgstr "Scharfenberg 式連結器"
-#: advtrains/couple.lua:185
+#: advtrains/couple.lua
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 "<No coupler>"
-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
+#: advtrains/craft_items.lua
msgid "Boiler"
msgstr "鍋爐"
-#: advtrains/craft_items.lua:9
+#: advtrains/craft_items.lua
+msgid "Chimney"
+msgstr "煙囪"
+
+#: advtrains/craft_items.lua
msgid "Driver's cab"
msgstr "駕駛室"
-#: advtrains/craft_items.lua:15
+#: advtrains/craft_items.lua
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
+msgid "@1 Platform (45 degree)"
+msgstr "較高的@1月臺 (45°)"
-#: advtrains/misc_nodes.lua:33
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (high)"
msgstr "較高的@1月臺"
-#: advtrains/misc_nodes.lua:59
-msgid "@1 Platform (45 degree)"
-msgstr "較高的@1月臺 (45°)"
+#: advtrains/misc_nodes.lua
+msgid "@1 Platform (low)"
+msgstr "較低的@1月臺"
-#: advtrains/misc_nodes.lua:81
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "較低的@1月臺 (45°)"
-#: advtrains/protection.lua:7
-msgid "Can place, remove and operate trains"
+#: advtrains/protection.lua
+msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua:12
+#: advtrains/protection.lua
+msgid "Can place and dig tracks in unprotected areas"
+msgstr ""
+
+#: advtrains/protection.lua
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"
+#: advtrains/protection.lua
+msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua:24
-msgid "Can operate turnouts and signals in unprotected areas"
-msgstr ""
+#: advtrains/protection.lua
+msgid "You are not allowed to build near tracks at this protected position."
+msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。"
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr "您沒有「train_operator」許可權,不能在鐵路附近建任何東西。"
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
+msgid "You are not allowed to build tracks at this protected position."
+msgstr "這裡已被保護,您不能在這裡建造鐵路。"
+
+#: advtrains/protection.lua
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
+#: advtrains/protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
msgstr "您沒有「railway_operator」許可權,不能控制鐵路設施。"
-#: advtrains/signals.lua:63
+#: advtrains/signals.lua
+msgid "Andrew's Cross"
+msgstr "平交道號誌燈"
+
+#: advtrains/signals.lua
msgid "Lampless Signal"
msgstr "臂木式號誌機"
-#: advtrains/signals.lua:127
+#: advtrains/signals.lua
msgid "Signal"
msgstr "色燈號誌機"
-#: advtrains/signals.lua:191
+#: advtrains/signals.lua
msgid "Wallmounted Signal (left)"
msgstr "壁掛式色燈號誌機 (左側)"
-#: advtrains/signals.lua:192
+#: advtrains/signals.lua
msgid "Wallmounted Signal (right)"
msgstr "壁掛式色燈號誌機 (右側)"
-#: advtrains/signals.lua:193
+#: advtrains/signals.lua
msgid "Wallmounted Signal (top)"
msgstr "懸掛式色燈號誌機"
-#: advtrains/signals.lua:281 advtrains/signals.lua:322
-msgid "Andrew's Cross"
-msgstr "平交道號誌燈"
+#: advtrains/trackplacer.lua
+msgid "This node can't be changed using the trackworker."
+msgstr "您不能使用鐵路調整工具調整這個方塊。"
+
+#: advtrains/trackplacer.lua
+msgid "This node can't be rotated using the trackworker."
+msgstr "您不能使用鐵路調整工具旋轉這個方塊。"
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be changed."
+msgstr "您不能調整這段軌道。"
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be rotated."
+msgstr "您不能旋轉這段軌道。"
-#: advtrains/trackplacer.lua:313
+#: advtrains/trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -245,280 +261,289 @@ msgstr ""
"左鍵單擊:切換軌道型別\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/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
+#: advtrains/tracks.lua
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
+#: advtrains/tracks.lua
msgid "Can't place slope: Not enough slope items left (@1 required)."
msgstr "無法放置斜坡:您沒有足夠的鐵路斜坡放置工具 (您總共需要@1個)"
-#: advtrains/tracks.lua:714
+#: advtrains/tracks.lua
msgid "Can't place slope: There's no slope of length @1."
msgstr "無法放置斜坡:advtrains 不支援長度為@1米的斜坡。"
-#: advtrains/tracks.lua:721
+#: advtrains/tracks.lua
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."
+#: advtrains/tracks.lua
+msgid "Can't place slope: not pointing at node."
+msgstr "無法放置斜坡:您沒有選擇任何方塊。"
+
+#: advtrains/tracks.lua
+msgid "Can't place slope: space occupied."
+msgstr "無法放置斜坡:此區域已被佔用。"
+
+#: advtrains/tracks.lua
+msgid "Position is occupied by a train."
msgstr ""
-#: advtrains/wagons.lua:179
-msgid "This wagon is owned by @1, you can't destroy it."
-msgstr "這是 @1 的車廂,您不能摧毀它。"
+#: advtrains/tracks.lua
+msgid "There's a Signal Influence Point here."
+msgstr ""
-#: advtrains/wagons.lua:203
-msgid "The wagon's inventory is not empty."
+#: advtrains/tracks.lua
+msgid "There's a Track Circuit Break here."
msgstr ""
-#: advtrains/wagons.lua:210
-msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
+#: advtrains/tracks.lua
+msgid "This track can not be removed."
+msgstr "您不能移除這段軌道。"
+
+#: advtrains/trainhud.lua
+msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+msgstr ""
+
+#: advtrains/wagonprop_tool.lua
+msgid "Insufficient privileges to use this!"
msgstr ""
-#: advtrains/wagons.lua:216
+#: advtrains/wagonprop_tool.lua
+#, fuzzy
+msgid "Wagon Properties Tool"
+msgstr "車廂屬性"
+
+#: advtrains/wagonprop_tool.lua
msgid ""
-"Warning: If you destroy this wagon, you only get some steel back! If you are "
-"sure, hold Sneak and left-click the wagon."
+"Wagon Properties Tool\n"
+"Punch a wagon to view and edit the Wagon Properties"
msgstr ""
-"警告:如果您摧毀此車廂,您只能拿到一些鋼方塊。如果您確定要摧毀這節車廂,請按"
-"潛行鍵並左鍵單擊此車廂。"
-#: advtrains/wagons.lua:649 advtrains/wagons.lua:850
-msgid "Show Inventory"
-msgstr "顯示物品欄"
+#: advtrains/wagons.lua
+msgid "(Doors closed)"
+msgstr "(車門已關閉)"
-#: advtrains/wagons.lua:652
-msgid "Onboard Computer"
+#: advtrains/wagons.lua
+msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
-#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328
-msgid "Wagon properties"
-msgstr "車廂屬性"
+#: advtrains/wagons.lua
+msgid ""
+"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+"off."
+msgstr "車門已關閉,請使用潛行+右鍵單擊下車。"
-#: advtrains/wagons.lua:658
+#: advtrains/wagons.lua
msgid "Get off"
msgstr "下車"
-#: advtrains/wagons.lua:661
+#: advtrains/wagons.lua
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
+msgid "Line"
+msgstr "火車線路"
-#: advtrains/wagons.lua:706
-msgid "Doors are closed! (Try holding sneak key!)"
+#: advtrains/wagons.lua
+msgid "Onboard Computer"
msgstr ""
-#: advtrains/wagons.lua:712
-msgid "You can't get on this wagon."
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Routingcode"
+msgstr "路由碼"
+
+#: advtrains/wagons.lua
+msgid "Save wagon properties"
+msgstr "儲存車廂屬性"
-#: advtrains/wagons.lua:838
+#: advtrains/wagons.lua
msgid "Select seat:"
msgstr "請選擇座位:"
-#: advtrains/wagons.lua:880
-msgid "Save wagon properties"
-msgstr "儲存車廂屬性"
+#: advtrains/wagons.lua
+msgid "Show Inventory"
+msgstr "顯示物品欄"
+
+#: advtrains/wagons.lua
+msgid "Text displayed inside train"
+msgstr "車廂內部顯示"
-#: advtrains/wagons.lua:965
+#: advtrains/wagons.lua
msgid "Text displayed outside on train"
msgstr "車廂外部顯示"
-#: advtrains/wagons.lua:966
-msgid "Text displayed inside train"
-msgstr "車廂內部顯示"
+#: advtrains/wagons.lua
+msgid "The wagon's inventory is not empty."
+msgstr ""
-#: advtrains/wagons.lua:967
-msgid "Line"
-msgstr "火車線路"
+#: advtrains/wagons.lua
+#, fuzzy
+msgid "This Wagon ID"
+msgstr "車廂已滿。"
-#: advtrains/wagons.lua:968
-msgid "Routingcode"
-msgstr "路由碼"
+#: advtrains/wagons.lua
+msgid "This wagon has no seats."
+msgstr "這節車廂沒有座位。"
-#: advtrains/wagons.lua:1241
+#: advtrains/wagons.lua
+msgid "This wagon is full."
+msgstr "車廂已滿。"
+
+#: advtrains/wagons.lua
+msgid "This wagon is owned by @1, you can't destroy it."
+msgstr "這是 @1 的車廂,您不能摧毀它。"
+
+#: advtrains/wagons.lua
+msgid "Train ID"
+msgstr ""
+
+#: advtrains/wagons.lua
+msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
+msgstr ""
+
+#: advtrains/wagons.lua
+msgid "Wagon properties"
+msgstr "車廂屬性"
+
+#: advtrains/wagons.lua
msgid ""
-"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
-"off."
-msgstr "車門已關閉,請使用潛行+右鍵單擊下車。"
+"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:1250
+#: advtrains/wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:13
+#: advtrains/wagons.lua
+msgid "You can't get on this wagon."
+msgstr ""
+
+#: advtrains_interlocking/routesetting.lua
+msgid "Route state changed."
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point speed restriction: @1"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:14
+#: advtrains_interlocking/tsr_rail.lua
msgid "Set point speed restriction:"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:30
+#: advtrains_interlocking/tsr_rail.lua
msgid "You are not allowed to configure this track without the @1 privilege."
msgstr "您沒有「@1」許可權,不能調整這段軌道。"
-#: advtrains_interlocking/tsr_rail.lua:34
-#: advtrains_line_automation/stoprail.lua:31
-#: advtrains_line_automation/stoprail.lua:76
+#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
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
+#: advtrains_line_automation/stoprail.lua
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
+msgid "Door Delay"
+msgstr "車門關閉時間"
-#: advtrains_line_automation/stoprail.lua:60
+#: advtrains_line_automation/stoprail.lua
msgid "Door Side"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:62
+#: advtrains_line_automation/stoprail.lua
+msgid "Kick out passengers"
+msgstr "踢出乘客"
+
+#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr "改變行車方向"
-#: advtrains_line_automation/stoprail.lua:63
-msgid "Kick out passengers"
-msgstr "踢出乘客"
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Code"
+msgstr "車站碼"
-#: advtrains_line_automation/stoprail.lua:97
-msgid "Station code \"@1\" already exists and is owned by @2."
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Name"
+msgstr "車站名稱"
-#: advtrains_line_automation/stoprail.lua:111
-msgid "This station is owned by @1. You are not allowed to edit its name."
+#: advtrains_line_automation/stoprail.lua
+msgid "Station code \"@1\" already exists and is owned by @2."
msgstr ""
-#: advtrains_line_automation/stoprail.lua:221
+#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
msgstr "車站軌道"
-#: advtrains_luaautomation/active_common.lua:17
-msgid "Unconfigured LuaATC component"
-msgstr "LuaATC 元件 (未配置)"
+#: advtrains_line_automation/stoprail.lua
+msgid "Stop Time"
+msgstr "停站時間"
-#: advtrains_luaautomation/active_common.lua:46
-msgid "LuaATC Environment"
+#: advtrains_line_automation/stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""
-#: advtrains_luaautomation/active_common.lua:49
+#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
+msgid "Track"
+msgstr "軌道"
+
+#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:50
+#: advtrains_luaautomation/active_common.lua
msgid "Code"
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_luaautomation/active_common.lua:94
-msgid "LuaATC component assigned to environment '@1'"
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:96
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component assigned to an invalid environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:171
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr ""
+
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component with error: @1"
msgstr ""
-#: advtrains_luaautomation/init.lua:13
+#: advtrains_luaautomation/active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "LuaATC 元件 (未配置)"
+
+#: advtrains_luaautomation/active_common.lua
+msgid ""
+"You are not allowed to configure this LuaATC component without the @1 "
+"privilege."
+msgstr "您沒有「@1」許可權,不能配置這個 LuaATC 元件。"
+
+#: advtrains_luaautomation/init.lua
msgid ""
"Can place and configure LuaATC components, including execute potentially "
"harmful Lua code"
msgstr ""
-#: advtrains_luaautomation/mesecon_controller.lua:211
+#: advtrains_luaautomation/mesecon_controller.lua
msgid "LuaATC Mesecon Controller"
msgstr ""
-#: advtrains_luaautomation/operation_panel.lua:11
+#: advtrains_luaautomation/operation_panel.lua
msgid "LuaATC Operation Panel"
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:28
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"Passive Component Naming Tool\n"
"\n"
@@ -528,119 +553,115 @@ msgstr ""
"\n"
"右鍵單擊命名所選元件。"
-#: advtrains_luaautomation/pcnaming.lua:39
+#: advtrains_luaautomation/pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr ""
+
+#: advtrains_luaautomation/pcnaming.lua
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
-#: advtrains_train_steam/init.lua:91
-msgid "Driver Stand (right)"
-msgstr "右側司機座位"
+#: advtrains_train_industrial/init.lua
+msgid "Big Industrial Train Engine"
+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
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (left)"
msgstr "左側司機座位"
-#: advtrains_train_industrial/init.lua:40
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
+msgid "Driver Stand (right)"
+msgstr "右側司機座位"
+
+#: advtrains_train_industrial/init.lua
msgid "Industrial Train Engine"
msgstr "工業用火車頭"
-#: advtrains_train_industrial/init.lua:79
-msgid "Big Industrial Train Engine"
-msgstr "大型工業用火車頭"
-
-#: advtrains_train_industrial/init.lua:98
+#: advtrains_train_industrial/init.lua
msgid "Industrial tank wagon"
msgstr "液體運輸車廂"
-#: advtrains_train_industrial/init.lua:116
+#: advtrains_train_industrial/init.lua
msgid "Industrial wood wagon"
msgstr "木材運輸車廂"
-#: advtrains_train_japan/init.lua:4
-msgid "Japanese Train Inter-Wagon Connection"
-msgstr "日本火車連結器"
-
-#: advtrains_train_japan/init.lua:37
+#: advtrains_train_japan/init.lua
msgid "Driver stand"
msgstr "司機座位"
-#: advtrains_train_japan/init.lua:101
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Engine"
msgstr "高速列車車頭"
-#: advtrains_train_japan/init.lua:176
+#: advtrains_train_japan/init.lua
+msgid "Japanese Train Inter-Wagon Connection"
+msgstr "日本火車連結器"
+
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Wagon"
msgstr "高速列車車廂"
-#: advtrains_train_steam/init.lua:75
-msgid "Steam Engine"
-msgstr "蒸汽機車"
+#: advtrains_train_steam/init.lua
+msgid "Box Wagon"
+msgstr "貨運車廂"
-#: advtrains_train_steam/init.lua:159
+#: advtrains_train_steam/init.lua
msgid "Detailed Steam Engine"
msgstr "精細的蒸汽機車"
-#: advtrains_train_steam/init.lua:206
+#: advtrains_train_steam/init.lua
msgid "Passenger Wagon"
msgstr "客車"
-#: advtrains_train_steam/init.lua:226
-msgid "Box Wagon"
-msgstr "貨運車廂"
+#: advtrains_train_steam/init.lua
+msgid "Steam Engine"
+msgstr "蒸汽機車"
-#: advtrains_train_subway/init.lua:144
+#: advtrains_train_subway/init.lua
msgid "Subway Passenger Wagon"
msgstr "地鐵車廂"
-#: advtrains_train_track/init.lua:31
-msgid "Y-turnout"
-msgstr "對稱道岔"
-
-#: advtrains_train_track/init.lua:49
+#: advtrains_train_track/init.lua
msgid "3-way turnout"
msgstr "三開道岔"
-#: advtrains_train_track/init.lua:69
-msgid "Perpendicular Diamond Crossing Track"
-msgstr "垂直交叉軌道"
-
-#: advtrains_train_track/init.lua:91
+#: advtrains_train_track/init.lua
msgid "90+Angle Diamond Crossing Track"
msgstr "交叉軌道 (其中一條軌道與座標軸平行)"
-#: advtrains_train_track/init.lua:132
-msgid "Diagonal Diamond Crossing Track"
-msgstr "交叉軌道"
+#: advtrains_train_track/init.lua
+msgid "ATC controller"
+msgstr "ATC 控制器"
-#: advtrains_train_track/init.lua:179
+#: advtrains_train_track/init.lua
msgid "Bumper"
msgstr "保險槓"
-#: advtrains_train_track/init.lua:201
-msgid "ATC controller"
-msgstr "ATC 控制器"
+#: advtrains_train_track/init.lua
+msgid "Detector Rail"
+msgstr "探測軌道"
-#: advtrains_train_track/init.lua:317
-msgid "Unloading Track"
-msgstr "卸貨軌道"
+#: advtrains_train_track/init.lua
+msgid "Diagonal Diamond Crossing Track"
+msgstr "交叉軌道"
-#: advtrains_train_track/init.lua:342
+#: advtrains_train_track/init.lua
msgid "Loading Track"
msgstr "裝貨軌道"
-#: advtrains_train_track/init.lua:406
-msgid "Detector Rail"
-msgstr "探測軌道"
+#: advtrains_train_track/init.lua
+msgid "Perpendicular Diamond Crossing Track"
+msgstr "垂直交叉軌道"
+
+#: advtrains_train_track/init.lua
+msgid "Unloading Track"
+msgstr "卸貨軌道"
+
+#: advtrains_train_track/init.lua
+msgid "Y-turnout"
+msgstr "對稱道岔"
#~ msgid ""
#~ "ATC controller, mode @1\n"
diff --git a/advtrains/poconvert.lua b/advtrains/poconvert.lua
index 3075282..74f962e 100644
--- a/advtrains/poconvert.lua
+++ b/advtrains/poconvert.lua
@@ -13,7 +13,7 @@ do
local function replace_single(pfx, c)
local pl = #pfx
if pl % 2 == 0 then
- return pfx:sub(1, pl/2) .. c
+ return string.sub(pfx, 1, pl/2) .. c
end
return string.sub(pfx, 1, math.floor(pl/2)) .. (schartbl[c] or c)
end
diff --git a/advtrains/settingtypes.txt b/advtrains/settingtypes.txt
index 2b627cb..a495d1e 100644
--- a/advtrains/settingtypes.txt
+++ b/advtrains/settingtypes.txt
@@ -61,3 +61,6 @@ advtrains_save_interval (Save Interval) int 60 20 3600
# If enabled, trains only collide with nodes with "normal" drawtype.
advtrains_forgiving_collision (Forgiving Collision mode) bool false
+# Enable universal couplers for wagons
+# If enabled, wagons will bypass the checks that compare the coupler types when coupling.
+advtrains_universal_couplers (Universal Couplers) bool false \ No newline at end of file
diff --git a/advtrains/sounds/advtrains_crossing_bell.ogg b/advtrains/sounds/advtrains_crossing_bell.ogg
index 74df669..2b441ae 100644
--- a/advtrains/sounds/advtrains_crossing_bell.ogg
+++ b/advtrains/sounds/advtrains_crossing_bell.ogg
Binary files differ
diff --git a/advtrains/spec/poconvert_spec.lua b/advtrains/spec/poconvert_spec.lua
index 7b2ceea..51f33e7 100644
--- a/advtrains/spec/poconvert_spec.lua
+++ b/advtrains/spec/poconvert_spec.lua
@@ -10,7 +10,7 @@ describe("PO file converter", function()
foo=bar
baz=
#@=wh\at\\@n=@=w\as\\@n
-multiline@nstrings=
+multiline@nstrings=multiline@nresult
with context?=oder doch nicht]], poconvert.from_string("foo", [[
msgid ""
msgstr "whatever metadata"
@@ -28,7 +28,9 @@ msgstr "=w\\as\\\\\n"
msgid "multi"
"line\n"
"strings"
-msgstr ""
+msgstr "multi"
+"line\n"
+"result"
msgctxt "i18n context"
msgid "with context?"
diff --git a/advtrains/spec/texture_spec.lua b/advtrains/spec/texture_spec.lua
new file mode 100644
index 0000000..2e3bd5d
--- /dev/null
+++ b/advtrains/spec/texture_spec.lua
@@ -0,0 +1,19 @@
+package.path = "../?.lua;" .. package.path
+local T = require "texture"
+
+describe("Texture creation", function()
+ it("works", function()
+ assert.same("^.png", tostring(T.raw"^.png"))
+ assert.same("foo\\:bar.png", tostring(T"foo:bar.png"))
+ end)
+end)
+
+describe("Texture modifiers", function()
+ it("work", function()
+ assert.same("x^[colorize:c", tostring(T"x":colorize"c"))
+ assert.same("x^[colorize:c:alpha", tostring(T"x":colorize("c", "alpha")))
+ assert.same("x^[multiply:c", tostring(T"x":multiply"c"))
+ assert.same("x^[resize:2x3", tostring(T"x":resize(2, 3)))
+ assert.same("x^[transformI", tostring(T"x":transform"I"))
+ end)
+end)
diff --git a/advtrains/spec/wagons_spec.lua b/advtrains/spec/wagons_spec.lua
new file mode 100644
index 0000000..df0687b
--- /dev/null
+++ b/advtrains/spec/wagons_spec.lua
@@ -0,0 +1,40 @@
+require "mineunit"
+mineunit "core"
+
+_G.advtrains = {
+ wagon_load_range = 32
+}
+sourcefile "wagons"
+
+local myproto = {_test = true}
+advtrains.register_wagon(":mywagon", myproto, "My wagon", "", false)
+advtrains.register_wagon_alias(":myalias", ":mywagon")
+advtrains.register_wagon_alias(":myotheralias", ":myalias")
+
+local myotherproto = {_other = true}
+advtrains.register_wagon(":noalias", myotherproto, "Not aliased wagon", "", false)
+advtrains.register_wagon_alias(":noalias", ":mywagon")
+
+advtrains.register_wagon_alias(":nilalias", ":nil")
+
+advtrains.register_wagon_alias(":R1", ":R2")
+advtrains.register_wagon_alias(":R2", ":R3")
+advtrains.register_wagon_alias(":R3", ":R1")
+
+describe("wagon alias system", function()
+ it("should work", function()
+ assert.same({":mywagon", myproto}, {advtrains.resolve_wagon_alias(":myalias")})
+ assert.equal(myproto, advtrains.wagon_prototypes[":myalias"])
+ assert.same({":mywagon", myproto}, {advtrains.resolve_wagon_alias(":myotheralias")})
+ end)
+ it("should respect wagon registration", function()
+ assert.same({":noalias", myotherproto}, {advtrains.resolve_wagon_alias(":noalias")})
+ end)
+ it("should handle recursive loops", function()
+ assert.same({}, {advtrains.resolve_wagon_alias(":R1")})
+ end)
+ it("should return nil for missing entries", function()
+ assert.same({}, {advtrains.resolve_wagon_alias(":what")})
+ assert.same({}, {advtrains.resolve_wagon_alias(":nilalias")})
+ end)
+end)
diff --git a/advtrains/texture.lua b/advtrains/texture.lua
new file mode 100644
index 0000000..e6d83b0
--- /dev/null
+++ b/advtrains/texture.lua
@@ -0,0 +1,228 @@
+local tx = {}
+setmetatable(tx, {__call = function(_, ...) return tx.base(...) end})
+
+function tx.escape(str)
+ return (string.gsub(tostring(str), [[([%^:\])]], [[\%1]]))
+end
+
+local function getargs(...)
+ return select("#", ...), {...}
+end
+
+local function curry(f, x)
+ return function(...)
+ return f(x, ...)
+ end
+end
+
+local function xmkmodifier(func)
+ return function(self, ...)
+ table.insert(self, (func(...)))
+ return self
+ end
+end
+
+local function mkmodifier(fmt, spec)
+ return xmkmodifier(function(...)
+ local count = select("#", ...)
+ local args = {...}
+ for k, f in pairs(spec) do
+ args[k] = f(args[k])
+ end
+ return string.format(fmt, unpack(args, 1, count))
+ end)
+end
+
+-- Texture object
+local tx_lib = {}
+local tx_mt = {
+ __index = tx_lib,
+ __tostring = function(self)
+ return table.concat(self, "^")
+ end,
+ __concat = function(a, b)
+ return tx.raw(("%s^%s"):format(tostring(a), tostring(b)))
+ end,
+}
+
+function tx.raw(str)
+ return setmetatable({str}, tx_mt)
+end
+function tx.base(str)
+ return tx.raw(tx.escape(str))
+end
+-- TODO: use [fill when 5.8.0 becomes widely used client-side
+function tx.fill(w, h, color)
+ return tx"advtrains_hud_bg.png":resize(w, h):colorize(color)
+end
+
+-- Most texture modifiers
+tx_lib.colorize = xmkmodifier(function(c, a)
+ local str = ("[colorize:%s"):format(tx.escape(c))
+ if a then
+ str = str .. ":" .. a
+ end
+ return str
+end)
+tx_lib.multiply = mkmodifier("[multiply:%s", {tx.escape})
+tx_lib.resize = mkmodifier("[resize:%dx%d", {})
+tx_lib.transform = mkmodifier("[transform%s", {tx.escape})
+
+-- [combine
+
+local combine = {}
+
+function combine:add(x, y, ent)
+ table.insert(self.st, ([[%d,%d=%s]]):format(x, y, tx.escape(tostring(ent))))
+ return self
+end
+
+local combine_mt = {
+ __index = combine,
+ __tostring = function(self)
+ return table.concat(self.st, ":")
+ end,
+}
+
+function tx.combine(w, h, bg)
+ local base = ("[combine:%dx%d"):format(w, h)
+ local obj = setmetatable({width = w, height = h, st = {base}}, combine_mt)
+ if bg then
+ obj:add_fill(0, 0, w, h, bg)
+ end
+ return obj
+end
+
+function combine:add_fill(x, y, ...)
+ return self:add(x, y, tx.fill(...))
+end
+
+local function add_multicolor_fill(n, self, x, y, w, h, ...)
+ local argc, argv = getargs(...)
+ local t = 0
+ for k = 1, argc, 2 do
+ t = t + argv[k]
+ end
+ local newargs = {x, y, w, h}
+ local sk, wk = n, n+2
+ local s = newargs[wk]/t
+ for k = 1, argc, 2 do
+ local v = argv[k] * s
+ newargs[wk] = v
+ newargs[5] = argv[k+1]
+ self:add_fill(unpack(newargs))
+ newargs[sk] = newargs[sk] + v
+ end
+ return self
+end
+combine.add_multicolor_fill_topdown = curry(add_multicolor_fill, 2)
+combine.add_multicolor_fill_leftright = curry(add_multicolor_fill, 1)
+
+local function add_segmentbar(n, self, x, y, w, h, m, c, ...)
+ local argc, argv = getargs(...)
+ local baseargs = {x, y, w, h}
+ local ss = (baseargs[n+2]+m)/c
+ local bs = ss - m
+ for k = 1, argc, 3 do
+ local lower, upper, fill = argv[k], argv[k+1], argv[k+2]
+ lower = math.max(0, math.floor(lower))+1
+ upper = math.min(c, math.floor(upper))
+ if lower <= upper then
+ local args = {x, y, w, h, fill}
+ args[n+2] = bs
+ args[n] = args[n] + ss*(lower-1)
+ for i = lower, upper do
+ self:add_fill(unpack(args))
+ args[n] = args[n] + ss
+ end
+ end
+ end
+ return self
+end
+combine.add_segmentbar_topdown = curry(add_segmentbar, 2)
+combine.add_segmentbar_leftright = curry(add_segmentbar, 1)
+
+local function add_lever(n, self, x, y, w, h, hs, ss, val, hf, sf)
+ local baseargs = {x, y, w, h}
+ local sargs = {x, y, w, h, sf}
+ sargs[5-n] = ss
+ sargs[n+2] = baseargs[n+2] + ss - hs
+ for k = 1, 2 do
+ sargs[k] = baseargs[k] + (baseargs[k+2] - sargs[k+2])/2
+ end
+ self:add_fill(unpack(sargs))
+ local hargs = {x, y, w, h, hf}
+ hargs[n+2] = hs
+ hargs[n] = baseargs[n] + (baseargs[n+2]-hs)*val
+ self:add_fill(unpack(hargs))
+ return self
+end
+combine.add_lever_topdown = curry(add_lever, 2)
+combine.add_lever_leftright = curry(add_lever, 1)
+
+--[[ Seven-segment display
+ -1-
+6 2
+ -7-
+5 3
+ -4-
+--]]
+local sevenseg_digits = {
+ ["0"] = {1, 2, 3, 4, 5, 6},
+ ["1"] = {2, 3},
+ ["2"] = {1, 2, 4, 5, 7},
+ ["3"] = {1, 2, 3, 4, 7},
+ ["4"] = {2, 3, 6, 7},
+ ["5"] = {1, 3, 4, 6, 7},
+ ["6"] = {1, 3, 4, 5, 6, 7},
+ ["7"] = {1, 2, 3},
+ ["8"] = {1, 2, 3, 4, 5, 6, 7},
+ ["9"] = {1, 2, 3, 4, 6, 7},
+}
+
+function combine:add_str7seg(x0, y0, tw, th, str, fill)
+ --[[ w and h (as width/height of individual (horizontal) segments) have the following properties:
+ tw = n(w+3h)-h
+ th = 2w+3h
+ --]]
+ local len = #str
+ local h = (2*tw-len*th)/(3*len-2)
+ local w = (th-3*h)/2
+ local ws = w+3*h
+ local segs = {
+ {h, 0, w, h},
+ {w+h, h, h, w},
+ {w+h, w+2*h, h, w},
+ {h, 2*(w+h), w, h},
+ {0, w+2*h, h, w},
+ {0, h, h, w},
+ {h, w+h, w, h},
+ }
+ for i = 1, len do
+ for _, k in pairs(sevenseg_digits[string.sub(str, i, i)] or {}) do
+ local s = segs[k]
+ self:add_fill(s[1]+x0, s[2]+y0, s[3], s[4], fill)
+ end
+ x0 = x0 + ws
+ end
+ return self
+end
+
+function combine:add_n7seg(x, y, w, h, n, prec, ...)
+ if not (type(n) == "number" and type(prec) == "number") then
+ error("passed non-numeric value or precision to numeric display")
+ elseif prec < 0 then
+ error("negative length")
+ end
+ local pfx = ""
+ if n >= 0 then
+ n = math.min(10^prec-1, n)
+ else
+ n = math.min(10^(prec-1)-1, -n)
+ pfx = "-"
+ end
+ local str = ("%d"):format(n)
+ return self:add_str7seg(x, y, w, h, pfx .. ("0"):rep(prec-#str-#pfx) .. str, ...)
+end
+
+return tx
diff --git a/advtrains/textures/advtrains_wagon_prop_tool.png b/advtrains/textures/advtrains_wagon_prop_tool.png
new file mode 100644
index 0000000..6352c55
--- /dev/null
+++ b/advtrains/textures/advtrains_wagon_prop_tool.png
Binary files differ
diff --git a/advtrains/trackplacer.lua b/advtrains/trackplacer.lua
index 9f97171..2588088 100644
--- a/advtrains/trackplacer.lua
+++ b/advtrains/trackplacer.lua
@@ -275,11 +275,24 @@ function tp.register_track_placer(nnprefix, imgprefix, dispname, def)
groups={advtrains_trackplacer=1, digtron_on_place=1},
liquids_pointable = def.liquids_pointable,
on_place = function(itemstack, placer, pointed_thing)
- local name = placer:get_player_name()
- if not name then
- return itemstack, false
- end
if pointed_thing.type=="node" then
+ do
+ local pointed_pos = pointed_thing.under
+ local pointed_node = minetest.get_node(pointed_pos)
+ local pointed_def = minetest.registered_nodes[pointed_node.name]
+ if pointed_def and pointed_def.on_rightclick then
+ local controls = placer:get_player_control()
+ if not controls.sneak then
+ return pointed_def.on_rightclick(pointed_pos, pointed_node, placer, itemstack, pointed_thing)
+ end
+ end
+ end
+
+ local name = placer:get_player_name()
+ if not name then
+ return itemstack, false
+ end
+
local pos=pointed_thing.above
local upos=vector.subtract(pointed_thing.above, {x=0, y=1, z=0})
if not advtrains.check_track_protection(pos, name) then
diff --git a/advtrains/trainhud.lua b/advtrains/trainhud.lua
index 22aa6cf..ce4b913 100644
--- a/advtrains/trainhud.lua
+++ b/advtrains/trainhud.lua
@@ -1,5 +1,7 @@
--trainhud.lua: holds all the code for train controlling
+local T = advtrains.texture
+
advtrains.hud = {}
advtrains.hhud = {}
@@ -8,6 +10,8 @@ advtrains.hud[player:get_player_name()] = nil
advtrains.hhud[player:get_player_name()] = nil
end)
+local hud_type_key = minetest.features.hud_def_type_field and "type" or "hud_elem_type"
+
local mletter={[1]="F", [-1]="R", [0]="N"}
function advtrains.on_control_change(pc, train, flip)
@@ -101,19 +105,21 @@ function advtrains.set_trainhud(name, text, driver)
if not player then
return
end
+ local drivertext = driver or ""
local driverhud = {
- hud_elem_type = "image",
+ [hud_type_key] = "image",
name = "ADVTRAINS_DRIVER",
position = {x=0.5, y=1},
offset = {x=0,y=-170},
- text = driver or "",
+ text = drivertext,
alignment = {x=0,y=-1},
- scale = {x=1,y=1},}
+ scale = {x=1,y=1},
+ }
if not hud then
- hud = {["driver"]={}}
+ hud = {}
advtrains.hud[name] = hud
hud.id = player:hud_add({
- hud_elem_type = "text",
+ [hud_type_key] = "text",
name = "ADVTRAINS",
number = 0xFFFFFF,
position = {x=0.5, y=1},
@@ -122,17 +128,22 @@ function advtrains.set_trainhud(name, text, driver)
scale = {x=200, y=60},
alignment = {x=0, y=-1},
})
- hud.oldText=text
hud.driver = player:hud_add(driverhud)
+ hud.oldText = text
+ hud.oldDriver = drivertext
else
if hud.oldText ~= text then
player:hud_change(hud.id, "text", text)
hud.oldText=text
end
if hud.driver then
- player:hud_change(hud.driver, "text", driver or "")
+ if hud.oldDriver ~= drivertext then
+ player:hud_change(hud.driver, "text", drivertext)
+ hud.oldDriver = drivertext
+ end
elseif driver then
hud.driver = player:hud_add(driverhud)
+ hud.oldDriver = drivertext
end
end
end
@@ -147,7 +158,7 @@ function advtrains.set_help_hud(name, text)
hud = {}
advtrains.hhud[name] = hud
hud.id = player:hud_add({
- hud_elem_type = "text",
+ [hud_type_key] = "text",
name = "ADVTRAINS_HELP",
number = 0xFFFFFF,
position = {x=1, y=0.3},
@@ -184,138 +195,94 @@ function advtrains.hud_train_format(train, flip)
local vel = advtrains.abs_ceil(train.velocity)
local vel_kmh=advtrains.abs_ceil(advtrains.ms_to_kmh(train.velocity))
- local tlev=train.lever or 1
+ local tlev=train.lever or 3
if train.velocity==0 and not train.active_control then tlev=1 end
if train.hud_lzb_effect_tmr then
tlev=1
end
- local ht = {"[combine:440x110:0,0=(advtrains_hud_bg.png^[resize\\:440x110)"}
+ local hud = T.combine(440, 110, "black")
local st = {}
if train.debug then st = {train.debug} end
- -- seven-segment display
- local function sevenseg(digit, x, y, w, h, m)
- --[[
- -1-
- 2 3
- -4-
- 5 6
- -7-
- ]]
- local segs = {
- {h, 0, w, h},
- {0, h, h, w},
- {w+h, h, h, w},
- {h, w+h, w, h},
- {0, w+2*h, h, w},
- {w+h, w+2*h, h, w},
- {h, 2*(w+h), w, h}}
- local trans = {
- [0] = {true, true, true, false, true, true, true},
- [1] = {false, false, true, false, false, true, false},
- [2] = {true, false, true, true, true, false, true},
- [3] = {true, false, true, true, false, true, true},
- [4] = {false, true, true, true, false, true, false},
- [5] = {true, true, false, true, false, true, true},
- [6] = {true, true, false, true, true, true, true},
- [7] = {true, false, true, false, false, true, false},
- [8] = {true, true, true, true, true, true, true},
- [9] = {true, true, true, true, false, true, true}}
- local ent = trans[digit or 10]
- if not ent then return end
- for i = 1, 7, 1 do
- if ent[i] then
- local s = segs[i]
- ht[#ht+1] = sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^%s)",x+s[1], y+s[2], s[3], s[4], m)
- end
- end
- end
-
-- lever
- ht[#ht+1] = "275,10=(advtrains_hud_bg.png^[colorize\\:cyan^[resize\\:5x18)"
- ht[#ht+1] = "275,28=(advtrains_hud_bg.png^[colorize\\:white^[resize\\:5x18)"
- ht[#ht+1] = "275,46=(advtrains_hud_bg.png^[colorize\\:orange^[resize\\:5x36)"
- ht[#ht+1] = "275,82=(advtrains_hud_bg.png^[colorize\\:red^[resize\\:5x18)"
- ht[#ht+1] = "292,16=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:6x78)"
- ht[#ht+1] = sformat("280,%s=(advtrains_hud_bg.png^[colorize\\:gray^[resize\\:30x18)",18*(4-tlev)+10)
+ hud:add_multicolor_fill_topdown(275, 10, 5, 90, 1, "cyan", 1, "white", 2, "orange", 1, "red")
+ hud:add_lever_topdown(280, 10, 30, 90, 18, 6, (4-tlev)/4, "gray", "darkslategray")
-- reverser
- ht[#ht+1] = sformat("245,10=(advtrains_hud_arrow.png^[transformFY%s)", flip and "" or "^[multiply\\:cyan")
- ht[#ht+1] = sformat("245,85=(advtrains_hud_arrow.png%s)", flip and "^[multiply\\:orange" or "")
- ht[#ht+1] = "250,35=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:5x40)"
- ht[#ht+1] = sformat("240,%s=(advtrains_hud_bg.png^[resize\\:25x15^[colorize\\:gray)", flip and 65 or 30)
+ hud:add(245, 10, T"advtrains_hud_arrow.png":transform"FY":multiply(flip and "gray" or "cyan"))
+ hud:add(245, 85, T"advtrains_hud_arrow.png":multiply(flip and "orange" or "gray"))
+ hud:add_lever_topdown(240, 30, 25, 50, 15, 5, flip and 1 or 0, "gray", "darkslategray")
-- train control/safety indication
- if train.tarvelocity or train.atc_command then
- ht[#ht+1] = "10,10=(advtrains_hud_atc.png^[resize\\:30x30^[multiply\\:cyan)"
- end
- if train.hud_lzb_effect_tmr then
- ht[#ht+1] = "50,10=(advtrains_hud_lzb.png^[resize\\:30x30^[multiply\\:red)"
- end
- if train.is_shunt then
- ht[#ht+1] = "90,10=(advtrains_hud_shunt.png^[resize\\:30x30^[multiply\\:orange)"
- end
+ hud:add(10, 10, T"advtrains_hud_atc.png":resize(30, 30):multiply((train.tarvelocity or train.atc_command) and "cyan" or "darkslategray"))
+ hud:add(50, 10, T"advtrains_hud_lzb.png":resize(30, 30):multiply(train.hud_lzb_effect_tmr and "red" or "darkslategray"))
+ hud:add(90, 10, T"advtrains_hud_shunt.png":resize(30, 30):multiply(train.is_shunt and "orange" or "darkslategray"))
-- door
- ht[#ht+1] = "187,10=(advtrains_hud_bg.png^[resize\\:26x30^[colorize\\:white)"
- ht[#ht+1] = "189,12=(advtrains_hud_bg.png^[resize\\:22x11)"
- ht[#ht+1] = sformat("170,10=(advtrains_hud_bg.png^[resize\\:15x30^[colorize\\:%s)", train.door_open==-1 and "white" or "darkslategray")
- ht[#ht+1] = "172,12=(advtrains_hud_bg.png^[resize\\:11x11)"
- ht[#ht+1] = sformat("215,10=(advtrains_hud_bg.png^[resize\\:15x30^[colorize\\:%s)", train.door_open==1 and "white" or "darkslategray")
- ht[#ht+1] = "217,12=(advtrains_hud_bg.png^[resize\\:11x11)"
+ hud:add_fill(187, 10, 26, 30, "white"):add_fill(189, 12, 22, 11, "black")
+ hud:add_fill(170, 10, 15, 30, train.door_open==-1 and "white" or "darkslategray"):add_fill(172, 12, 11, 11, "black")
+ hud:add_fill(215, 10, 15, 30, train.door_open==1 and "white" or "darkslategray"):add_fill(217, 12, 11, 11, "black")
-- speed indication(s)
- sevenseg(math.floor(vel/10), 320, 10, 30, 10, "[colorize\\:red\\:255")
- sevenseg(vel%10, 380, 10, 30, 10, "[colorize\\:red\\:255")
- for i = 1, vel, 1 do
- ht[#ht+1] = sformat("%d,65=(advtrains_hud_bg.png^[resize\\:8x20^[colorize\\:white)", i*11-1)
- end
- for i = max+1, 20, 1 do
- ht[#ht+1] = sformat("%d,65=(advtrains_hud_bg.png^[resize\\:8x20^[colorize\\:darkslategray)", i*11-1)
- end
+ hud:add_n7seg(320, 10, 110, 90, vel, 2, "red")
+ hud:add_segmentbar_leftright(10, 65, 217, 20, 3, 20, max, 20, "darkslategray", 0, vel, "white")
if res and res > 0 then
- ht[#ht+1] = sformat("%d,60=(advtrains_hud_bg.png^[resize\\:3x30^[colorize\\:red\\:255)", 7+res*11)
+ hud:add_fill(7+res*11, 60, 3, 30, "red")
end
if train.tarvelocity then
- ht[#ht+1] = sformat("%d,85=(advtrains_hud_arrow.png^[multiply\\:cyan^[transformFY^[makealpha\\:#000000)", 1+train.tarvelocity*11)
+ hud:add(1+train.tarvelocity*11, 85, T"advtrains_hud_arrow.png":transform"FY":multiply"cyan")
end
+ local lzbdisp
local lzb = train.lzb
if lzb and lzb.checkpoints then
local oc = lzb.checkpoints
for i = 1, #oc do
+ if advtrains.interlocking then
+ local udata = oc[i].udata
+ if udata and udata.signal_pos then
+ local sigd = advtrains.interlocking.db.get_sigd_for_signal(udata.signal_pos)
+ if sigd then
+ local tcbs = advtrains.interlocking.db.get_tcbs(sigd) or {}
+ if tcbs.route_rsn then
+ table.insert(st, ("%s: %s"):format(minetest.pos_to_string(sigd.p), tcbs.route_rsn))
+ end
+ end
+ end
+ end
local spd = oc[i].speed
spd = advtrains.speed.min(spd, train.speed_restriction)
if spd == -1 then spd = nil end
local c = not spd and "lime" or (type(spd) == "number" and (spd == 0) and "red" or "orange") or nil
if c then
- ht[#ht+1] = sformat("130,10=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c)
- ht[#ht+1] = sformat("130,35=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c)
if spd and spd~=0 then
- ht[#ht+1] = sformat("%d,50=(advtrains_hud_arrow.png^[multiply\\:red^[makealpha\\:#000000)", 1+spd*11)
+ hud:add(1+spd*11, 50, T"advtrains_hud_arrow.png":multiply"red")
end
- local floor = math.floor
- local dist = floor(((oc[i].index or train.index)-train.index))
+ local dist = math.floor(((oc[i].index or train.index)-train.index))
dist = math.max(0, math.min(999, dist))
- for j = 1, 3, 1 do
- sevenseg(floor((dist/10^(3-j))%10), 119+j*11, 18, 4, 2, "[colorize\\:"..c)
- end
+ lzbdisp = {c = c, d = dist}
break
end
end
end
+ if not lzbdisp then
+ lzbdisp = {c = "darkslategray", d = 888}
+ end
+ hud:add_fill(130, 10, 30, 5, lzbdisp.c)
+ hud:add_fill(130, 35, 30, 5, lzbdisp.c)
+ hud:add_n7seg(131, 18, 28, 14, lzbdisp.d, 3, lzbdisp.c)
if res and res == 0 then
- st[#st+1] = attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again.")
+ table.insert(st, attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again."))
end
if train.atc_command then
- st[#st+1] = sformat("ATC: %s%s", train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or "")
+ table.insert(st, ("ATC: %s%s"):format(train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or ""))
end
- return table.concat(st,"\n"), table.concat(ht,":")
+ return table.concat(st,"\n"), tostring(hud)
end
local _, texture = advtrains.hud_train_format { -- dummy train object to demonstrate the train hud
max_speed = 15, speed_restriction = 15, velocity = 15, tarvelocity = 12,
active_control = true, lever = 3, ctrl = {lzb = true}, is_shunt = true,
- door_open = 1, lzb = {oncoming = {{spd=6, idx=125.7}}}, index = 0,
+ door_open = 1, lzb = {checkpoints = {{speed=6, index=125.7}}}, index = 100,
}
minetest.register_node("advtrains:hud_demo",{
diff --git a/advtrains/trainlogic.lua b/advtrains/trainlogic.lua
index f136577..ed49a4c 100644
--- a/advtrains/trainlogic.lua
+++ b/advtrains/trainlogic.lua
@@ -142,13 +142,8 @@ minetest.register_on_joinplayer(function(player)
local pname = player:get_player_name()
local id=advtrains.player_to_train_mapping[pname]
if id then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id then
- local wdata = advtrains.wagons[wagon.id]
- if wdata and wdata.train_id == id then
- wagon:reattach_all()
- end
- end
+ for _, wagon in advtrains.wagon_entity_pairs_in_train(id) do
+ wagon:reattach_all()
end
end
end)
@@ -160,12 +155,10 @@ minetest.register_on_dieplayer(function(player)
if id then
local train=advtrains.trains[id]
if not train then advtrains.player_to_train_mapping[pname]=nil return end
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.train_id==id then
- --when player dies, detach him from the train
- --call get_off_plr on every wagon since we don't know which one he's on.
- wagon:get_off_plr(pname)
- end
+ for _, wagon in advtrains.wagon_entity_pairs_in_train(id) do
+ --when player dies, detach him from the train
+ --call get_off_plr on every wagon since we don't know which one he's on.
+ wagon:get_off_plr(pname)
end
-- just in case no wagon felt responsible for this player: clear train mapping
advtrains.player_to_train_mapping[pname] = nil
@@ -270,6 +263,10 @@ function advtrains.train_ensure_init(id, train)
atwarn(debug.traceback())
return nil
end
+
+ if not train.staticdata then
+ train.staticdata = {}
+ end
train.dirty = true
if train.no_step then
@@ -803,9 +800,12 @@ function advtrains.train_step_c(id, train, dtime)
if is_loaded_area then
local objs = minetest.get_objects_inside_radius(rcollpos, 2)
for _,obj in ipairs(objs) do
- if not obj:is_player() and obj:get_armor_groups().fleshy and obj:get_armor_groups().fleshy > 0
- and obj:get_luaentity() and obj:get_luaentity().name~="signs_lib:text" then
- obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil)
+ if not obj:is_player() then
+ local armor = obj:get_armor_groups()
+ local luaentity = obj:get_luaentity()
+ if armor.fleshy and armor.fleshy > 0 and luaentity and luaentity.name ~= "signs_lib:text" then
+ obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil)
+ end
end
end
end
@@ -1117,8 +1117,17 @@ function advtrains.spawn_wagons(train_id)
if advtrains.position_in_range(pos, ablkrng) then
--atdebug("wagon",w_id,"spawning")
local wt = advtrains.get_wagon_prototype(data)
- local wagon = minetest.add_entity(pos, wt):get_luaentity()
- wagon:set_id(w_id)
+ local wobj = minetest.add_entity(pos, wt)
+ if not wobj then
+ atwarn("Failed to spawn wagon", w_id, "of type", wt)
+ else
+ local wagon = wobj:get_luaentity()
+ if not wagon then
+ atwarn("Wagon", w_id, "of type", wt, "spawned with nil luaentity")
+ else
+ wagon:set_id(w_id)
+ end
+ end
end
end
else
@@ -1185,6 +1194,8 @@ function advtrains.split_train_at_index(train, index)
newtrain.points_split = advtrains.merge_tables(train.points_split)
newtrain.autocouple = train.autocouple
+ advtrains.te_run_callbacks_on_decouple(train, newtrain, index)
+
return newtrain_id -- return new train ID, so new train can be manipulated
end
diff --git a/advtrains/wagonprop_tool.lua b/advtrains/wagonprop_tool.lua
new file mode 100644
index 0000000..2a4a9e2
--- /dev/null
+++ b/advtrains/wagonprop_tool.lua
@@ -0,0 +1,43 @@
+minetest.register_craftitem("advtrains:wagon_prop_tool",{ --craftitem because it does nothing on its own
+ description = attrans("Wagon Properties Tool\nPunch a wagon to view and edit the Wagon Properties"),
+ short_description = attrans("Wagon Properties Tool"),
+ groups = {},
+ inventory_image = "advtrains_wagon_prop_tool.png",
+ wield_image = "advtrains_wagon_prop_tool.png",
+ stack_max = 1,
+ on_use = function(itemstack, user, pointed_thing)
+ local pname = user:get_player_name()
+ if not pname or pname == "" then
+ return
+ end
+
+ --sanity checks in case of clicking the wrong entity/node/nothing
+ if pointed_thing.type ~= "object" then return end --not an entity
+ local object = pointed_thing.ref:get_luaentity()
+ if not object.id then return end --entity doesn't have an id field
+
+ local wagon = advtrains.wagons[object.id] --check if wagon exists in advtrains
+ if not wagon then --not a wagon
+ return
+ end --end sanity checks
+
+ --whitelist protection check
+ if not advtrains.check_driving_couple_protection(pname,wagon.owner,wagon.whitelist) then
+ minetest.chat_send_player(pname, attrans("Insufficient privileges to use this!"))
+ return
+ end
+ object:show_wagon_properties(pname)
+ return itemstack
+ end,
+})
+
+if minetest.get_modpath("default") then --register recipe
+ minetest.register_craft({
+ output = "advtrains:wagon_prop_tool",
+ recipe = {
+ {"advtrains:dtrack_placer","dye:black","default:paper"},
+ {"screwdriver:screwdriver","default:paper","default:paper"},
+ {"","","group:wood"},
+ }
+ })
+end \ No newline at end of file
diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua
index f9b29bb..cf15871 100644
--- a/advtrains/wagons.lua
+++ b/advtrains/wagons.lua
@@ -13,7 +13,13 @@ local GETOFF_TP_DELAY = 0.5
local IGNORE_WORLD = advtrains.IGNORE_WORLD
advtrains.wagons = {}
-advtrains.wagon_prototypes = {}
+advtrains.wagon_alias = {}
+advtrains.wagon_prototypes = setmetatable({}, {
+ __index = function(t, k)
+ local _, proto = advtrains.resolve_wagon_alias(k)
+ return proto
+ end
+})
advtrains.wagon_objects = {}
local unload_wgn_range = advtrains.wagon_load_range + 32
@@ -280,7 +286,7 @@ function wagon:on_step(dtime)
local data = advtrains.wagons[self.id]
if not pos then
- --atdebug("["..self.id.."][fatal] missing position (object:getpos() returned nil)")
+ --atdebug("["..self.id.."][fatal] missing position (object:get_pos() returned nil)")
return
end
@@ -814,8 +820,8 @@ function wagon:get_off(seatno)
end
--if not door_entry, or paths missing, fall back to old method
--atdebug("using fallback")
- local objpos=advtrains.round_vector_floor_y(self.object:getpos())
- local yaw=self.object:getyaw()
+ local objpos=advtrains.round_vector_floor_y(self.object:get_pos())
+ local yaw=self.object:get_yaw()
local isx=(yaw < math.pi/4) or (yaw > 3*math.pi/4 and yaw < 5*math.pi/4) or (yaw > 7*math.pi/4)
local offp
--abuse helper function
@@ -868,6 +874,7 @@ function wagon:show_wagon_properties(pname)
]]
local data = advtrains.wagons[self.id]
local form="size[5,5]"
+ form=form.."label[0.2,0;"..attrans("This Wagon ID")..": "..self.id.."]"
form = form .. "field[0.5,1;4.5,1;whitelist;Allow these players to access your wagon:;"..minetest.formspec_escape(data.whitelist or "").."]"
form = form .. "field[0.5,2;4.5,1;roadnumber;Wagon road number:;"..minetest.formspec_escape(data.roadnumber or "").."]"
local fc = ""
@@ -892,7 +899,7 @@ end
--BordCom
local function checkcouple(ent)
- if not ent or not ent:getyaw() then
+ if not ent or not ent:get_yaw() then
return nil
end
local le = ent:get_luaentity()
@@ -971,6 +978,7 @@ function wagon:show_bordcom(pname)
local linhei
local form = "size[11,9]label[0.5,0;AdvTrains Boardcom v0.1]"
+ form=form.."textarea[7.5,0.05;10,1;;"..attrans("Train ID")..": "..(minetest.formspec_escape(train.id or ""))..";]"
form=form.."textarea[0.5,1.5;7,1;text_outside;"..attrans("Text displayed outside on train")..";"..(minetest.formspec_escape(train.text_outside or "")).."]"
form=form.."textarea[0.5,3;7,1;text_inside;"..attrans("Text displayed inside train")..";"..(minetest.formspec_escape(train.text_inside or "")).."]"
form=form.."field[7.5,1.75;3,1;line;"..attrans("Line")..";"..(minetest.formspec_escape(train.line or "")).."]"
@@ -1088,12 +1096,11 @@ function wagon:handle_bordcom_fields(pname, formname, fields)
for i, tpid in ipairs(train.trainparts) do
if fields["dcpl_"..i] then
advtrains.safe_decouple_wagon(tpid, pname)
- elseif fields["wgprp"..i] then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id==tpid and data.owner==pname then
- wagon:show_wagon_properties(pname)
- return
- end
+ elseif fields["wgprp"..i] and data.owner==pname then
+ local wagon = advtrains.get_wagon_entity(tpid)
+ if wagon then
+ wagon:show_wagon_properties(pname)
+ return
end
end
end
@@ -1139,44 +1146,48 @@ end
minetest.register_on_player_receive_fields(function(player, formname, fields)
local uid=string.match(formname, "^advtrains_geton_(.+)$")
if uid then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id==uid then
- local data = advtrains.wagons[wagon.id]
- if fields.inv then
- if wagon.has_inventory and wagon.get_inventory_formspec then
- minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid)))
- end
- elseif fields.seat then
- local val=minetest.explode_textlist_event(fields.seat)
- if val and val.type~="INV" and not data.seatp[player:get_player_name()] then
- --get on
- wagon:get_on(player, val.index)
- --will work with the new close_formspec functionality. close exactly this formspec.
- minetest.show_formspec(player:get_player_name(), formname, "")
- end
+ local wagon = advtrains.get_wagon_entity(uid)
+ if wagon then
+ local data = advtrains.wagons[wagon.id]
+ if fields.inv then
+ if wagon.has_inventory and wagon.get_inventory_formspec then
+ minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid)))
+ end
+ elseif fields.seat then
+ local val=minetest.explode_textlist_event(fields.seat)
+ if val and val.type~="INV" and not data.seatp[player:get_player_name()] then
+ --get on
+ wagon:get_on(player, val.index)
+ --will work with the new close_formspec functionality. close exactly this formspec.
+ minetest.show_formspec(player:get_player_name(), formname, "")
end
end
end
+ return true
end
+
uid=string.match(formname, "^advtrains_seating_(.+)$")
if uid then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id==uid then
- local pname=player:get_player_name()
- local no=wagon:get_seatno(pname)
- if no then
- if wagon.seat_groups then
- wagon:seating_from_key_helper(pname, fields, no)
- end
+ local wagon = advtrains.get_wagon_entity(uid)
+ if wagon then
+ local pname=player:get_player_name()
+ local no=wagon:get_seatno(pname)
+ if no then
+ if wagon.seat_groups then
+ wagon:seating_from_key_helper(pname, fields, no)
end
end
end
+ return true
end
+
uid=string.match(formname, "^advtrains_prop_(.+)$")
if uid then
local pname=player:get_player_name()
local data = advtrains.wagons[uid]
- if pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then
+ if not data then
+ return true
+ elseif pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then
return true
end
if fields.save or not fields.quit then
@@ -1198,29 +1209,32 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
wagon.show_wagon_properties({id=uid}, pname)
end
end
+ return true
end
uid=string.match(formname, "^advtrains_bordcom_(.+)$")
if uid then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id==uid then
- wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
- end
+ local wagon = advtrains.get_wagon_entity(uid)
+ if wagon then
+ wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
end
+ return true
end
+
uid=string.match(formname, "^advtrains_inv_(.+)$")
if uid then
local pname=player:get_player_name()
local data = advtrains.wagons[uid]
if fields.prop and data.owner==pname then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id==uid and data.owner==pname then
- wagon:show_wagon_properties(pname)
- --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
- end
+ local wagon = advtrains.get_wagon_entity(uid)
+ if wagon then
+ wagon:show_wagon_properties(pname)
+ --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
end
end
+ return true
end
end)
+
function wagon:seating_from_key_helper(pname, fields, no)
local data = advtrains.wagons[self.id]
local sgr=self.seats[no].group
@@ -1259,7 +1273,7 @@ function wagon:check_seat_group_access(pname, sgr)
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)
+ advtrains.log("Drive", pname, self.object:get_pos(), self:train().text_outside)
end
return true
end
@@ -1317,11 +1331,33 @@ function advtrains.get_wagon_prototype(data)
data.type = data.entity_name
data.entity_name = nil
end
- if not wt or not advtrains.wagon_prototypes[wt] then
+ local rt, proto = advtrains.resolve_wagon_alias(wt)
+ if not rt then
atwarn("Unable to load wagon type",wt,", using placeholder")
- wt="advtrains:wagon_placeholder"
+ rt = "advtrains:wagon_placeholder"
+ proto = advtrains.wagon_prototypes[rt]
end
- return wt, advtrains.wagon_prototypes[wt]
+ return rt, proto
+end
+
+function advtrains.register_wagon_alias(src, dst)
+ advtrains.wagon_alias[src] = dst
+end
+
+local function recursive_resolve_alias(name, seen)
+ local prototype = rawget(advtrains.wagon_prototypes, name)
+ if prototype then
+ return name, prototype
+ end
+ local resolved = advtrains.wagon_alias[name]
+ if resolved and not seen[resolved] then
+ seen[name] = true
+ return recursive_resolve_alias(resolved, seen)
+ end
+end
+
+function advtrains.resolve_wagon_alias(name)
+ return recursive_resolve_alias(name, {})
end
function advtrains.standard_inventory_formspec(self, pname, invname)
@@ -1368,13 +1404,23 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati
groups = wagon_groups,
on_place = function(itemstack, placer, pointed_thing)
- if not pointed_thing.type == "node" then
+ if pointed_thing.type ~= "node" then
return
end
+
+ local pos = pointed_thing.under
+ local node = minetest.get_node(pos)
+ local pointed_def = minetest.registered_nodes[node.name]
+ if pointed_def and pointed_def.on_rightclick then
+ local controls = placer:get_player_control()
+ if not controls.sneak then
+ return pointed_def.on_rightclick(pos, node, placer, itemstack, pointed_thing)
+ end
+ end
+
local pname = placer:get_player_name()
- local node=minetest.get_node_or_nil(pointed_thing.under)
- if not node then atprint("[advtrains]Ignore at placer position") return itemstack end
+ if node.name == "ignore" then atprint("[advtrains]Ignore at placer position") return itemstack end
local nodename=node.name
if(not advtrains.is_track_and_drives_on(nodename, prototype.drives_on)) then
atprint("no track here, not placing.")
@@ -1384,14 +1430,14 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati
minetest.chat_send_player(pname, "You don't have the train_operator privilege.")
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
+ if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pos, placer:get_player_name()) then
return itemstack
end
local tconns=advtrains.get_track_connections(node.name, node.param2)
local yaw = placer:get_look_horizontal()
local plconnid = advtrains.yawToClosestConn(yaw, tconns)
- local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, prototype.drives_on)
+ local prevpos = advtrains.get_adjacent_rail(pos, tconns, plconnid, prototype.drives_on)
if not prevpos then
minetest.chat_send_player(pname, "The track you are trying to place the wagon on is not long enough!")
return
@@ -1399,7 +1445,7 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati
local wid = advtrains.create_wagon(sysname, pname)
- local id=advtrains.create_new_train_at(pointed_thing.under, plconnid, 0, {wid})
+ local id=advtrains.create_new_train_at(pos, plconnid, 0, {wid})
if not advtrains.is_creative(pname) then
itemstack:take_item()
@@ -1487,4 +1533,28 @@ function advtrains.get_wagon_at_index(train_id, w_index)
end
-- nothing found, dist must be further back
return nil
-end \ No newline at end of file
+end
+
+function advtrains.get_wagon_entity(wagon_id)
+ if not advtrains.wagons[wagon_id] then return end
+ local object = advtrains.wagon_objects[wagon_id]
+ if object then
+ return object:get_luaentity()
+ end
+end
+
+function advtrains.next_wagon_entity_in_train(train, i)
+ local wagon_id = train.trainparts[i + 1]
+ if wagon_id then
+ local wagon = advtrains.get_wagon_entity(wagon_id)
+ if wagon then
+ return i + 1, wagon
+ end
+ end
+end
+
+function advtrains.wagon_entity_pairs_in_train(train_id)
+ local train = advtrains.trains[train_id]
+ if not train then return function() end end
+ return advtrains.next_wagon_entity_in_train, train, 0
+end