~gpcf/advtrains-devel

Translations improvement. v1 PROPOSED

Tanavit: 1
 Translations improvement.

 10 files changed, 1349 insertions(+), 117 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~gpcf/advtrains-devel/patches/56514/mbox | git am -3
Learn more about email & git

[PATCH v1] Translations improvement. Export this patch

File :
- advtrains : init.lua wagons.lua
- advtrains_line_automation : scheduler.lua stoprail.lua

Actions :

- Conversion of attrans() to S()
- Insertion of S() function calls where needed.

Miscellaneous :
- Removing of personnal tries on update-translastions.sh which should
not have been committed.
---
 advtrains/init.lua                      |  50 ++---
 advtrains/po/advtrains.pot              | 244 +++++++++++++++++++++-
 advtrains/po/de.po                      | 248 +++++++++++++++++++++-
 advtrains/po/fr.po                      | 264 +++++++++++++++++++++++-
 advtrains/po/update-translations.sh     |   1 -
 advtrains/po/zh_CN.po                   | 248 +++++++++++++++++++++-
 advtrains/po/zh_TW.po                   | 248 +++++++++++++++++++++-
 advtrains/wagons.lua                    | 119 +++++------
 advtrains_line_automation/scheduler.lua |   2 +-
 advtrains_line_automation/stoprail.lua  |  42 ++--
 10 files changed, 1349 insertions(+), 117 deletions(-)

diff --git a/advtrains/init.lua b/advtrains/init.lua
index 4a0b928..4881e15 100644
--- a/advtrains/init.lua
+++ b/advtrains/init.lua
@@ -67,7 +67,7 @@ end
local no_action=false

local function reload_saves()
	atwarn("Restoring saved state in 1 second...")
	atwarn(S("Restoring saved state in 1 second..."))
	no_action=true
	advtrains.lock_path_inval = false
	--read last save state and continue, as if server was restarted
@@ -78,7 +78,7 @@ local function reload_saves()
	end
	minetest.after(1, function()
		advtrains.load()
		atwarn("Reload successful!")
		atwarn(S("Reload successful!"))
		advtrains.ndb.restore_all()
	end)
end
@@ -338,7 +338,7 @@ function advtrains.avt_load()
				end
			end
			for wid, _ in pairs(todel) do
				atwarn("Removing unused wagon", wid, "from wagon_save table.")
				atwarn(S("Removing unused wagon"), wid, S("from wagon_save table."))
				advtrains.wagon_save[wid]=nil
			end
		else
@@ -403,7 +403,7 @@ function advtrains.load_version_4()
			end
		end
		for wid, _ in pairs(todel) do
			atwarn("Removing unused wagon", wid, "from wagon_save table.")
			atwarn(S("Removing unused wagon"), wid, S("from wagon_save table."))
			advtrains.wagon_save[wid]=nil
		end
	end
@@ -481,7 +481,7 @@ advtrains.avt_save = function(remove_players_from_wagons)
			--then save it
			tmp_trains[id]=v
		else
			atwarn("Train",id,"had no wagons left because of some bug. It is being deleted. Wave it goodbye!")
			atwarn(S("Train"),id,S("had no wagons left because of some bug. It is being deleted. Wave it goodbye!"))
			advtrains.remove_train(id)
		end
	end
@@ -562,7 +562,7 @@ advtrains.avt_save = function(remove_players_from_wagons)
	local succ, err = serialize_lib.save_atomic_multiple(parts_table, advtrains.fpath.."_", callbacks_table)
	
	if not succ then
		atwarn("Saving failed: "..err)
		atwarn(S("Saving failed: ")..err)
	else
		-- store version
		advtrains.save_component(4, "version")
@@ -665,7 +665,7 @@ end
function advtrains.save(remove_players_from_wagons)
	if not init_load then
		--wait... we haven't loaded yet?!
		atwarn("Instructed to save() but load() was never called!")
		atwarn(S("Instructed to save() but load() was never called!"))
		return
	end
	
@@ -694,7 +694,7 @@ function advtrains.save(remove_players_from_wagons)
end
minetest.register_on_shutdown(function()
	if within_mainstep then
		atwarn("Crash during advtrains main step - skipping the shutdown save operation to not save inconsistent data!")
		atwarn(S("Crash during advtrains main step - skipping the shutdown save operation to not save inconsistent data!"))
	else
		advtrains.save()
	end
@@ -706,10 +706,10 @@ end)
minetest.register_chatcommand("at_empty_seats",
	{
        params = "", -- Short parameter description
        description = "Detach all players, especially the offline ones, from all trains. Use only when no one serious is on a train.", -- Full description
        description = S("Detach all players, especially the offline ones, from all trains. Use only when no one serious is on a train."), -- Full description
        privs = {train_operator=true, server=true}, -- Require the "privs" privilege to run
        func = function(name, param)
				atwarn("Data is being saved. While saving, advtrains will remove the players from trains. Save files will be reloaded afterwards!")
				atwarn(S("Data is being saved. While saving, advtrains will remove the players from trains. Save files will be reloaded afterwards!"))
				advtrains.save(true)
				reload_saves()
        end,
@@ -718,60 +718,60 @@ minetest.register_chatcommand("at_empty_seats",
minetest.register_chatcommand("at_reroute",
	{
        params = "", 
        description = "Delete all train routes, force them to recalculate", 
        description = S("Delete all train routes, force them to recalculate"), 
        privs = {train_operator=true}, -- Only train operator is required, since this is relatively safe.
        func = function(name, param)
				advtrains.invalidate_all_paths()
				return true, "Successfully invalidated train routes"
				return true, S("Successfully invalidated train routes")
        end,
})

minetest.register_chatcommand("at_whereis",
	{
		params = "<train id>",
		description = "Returns the position of the train with the given id",
		description = S("Returns the position of the train with the given id"),
		privs = {train_operator = 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"
				return false, S("Train ")..param..S(" does not exist or is invalid")
			else
				return true, "Train "..param.." is at "..minetest.pos_to_string(train.last_pos)
				return true, S("Train ")..param..S(" is at ")..minetest.pos_to_string(train.last_pos)
			end
		end,
})
minetest.register_chatcommand("at_tp",
	{
		params = "<train id>",
		description = "Teleports you to the position of the train with the given id",
		description = S("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"
				return false, S("Train ")..param..S(" does not exist or is invalid")
			else
				minetest.get_player_by_name(name):set_pos(train.last_pos)
				return true, "Teleporting to train "..param
				return true, S("Teleporting to train ")..param
			end
		end,
})
minetest.register_chatcommand("at_disable_step",
	{
        params = "<yes/no>", 
        description = "Disable the advtrains globalstep temporarily", 
        description = S("Disable the advtrains globalstep temporarily"), 
        privs = {server=true},
        func = function(name, param)
			if minetest.is_yes(param) then
				-- disable everything, and turn off saving
				no_action = true;
				atwarn("The advtrains globalstep has been disabled. Trains are not moving, and no data is saved! Run '/at_disable_step no' to enable again!")
				return true, "Disabled advtrains successfully"
				atwarn(S("The advtrains globalstep has been disabled. Trains are not moving, and no data is saved! Run '/at_disable_step no' to enable again!"))
				return true, S("Disabled advtrains successfully")
			elseif no_action then
				atwarn("Re-enabling advtrains globalstep...")
				atwarn(S("Re-enabling advtrains globalstep..."))
				reload_saves()
				return true
			else
				return false, "Advtrains is already running normally!"
				return false, S("Advtrains is already running normally!")
			end
        end,
})
@@ -779,10 +779,10 @@ minetest.register_chatcommand("at_disable_step",
minetest.register_chatcommand("at_status",
	{
        params = "", 
        description = "Print advtrains status info", 
        description = S("Print advtrains status info"), 
        privs = {train_operator = true},
        func = function(name, param)
			return true, advtrains.print_concat_table({"Advtrains Status: no_action",no_action,"slowdown",advtrains.global_slowdown,"(log",math.log(advtrains.global_slowdown),")"})
			return true, advtrains.print_concat_table({S("Advtrains Status: no_action"),no_action,S("slowdown"),advtrains.global_slowdown,S("(log"),math.log(advtrains.global_slowdown),")"})
        end,
})

diff --git a/advtrains/po/advtrains.pot b/advtrains/po/advtrains.pot
index ade6a33..2d6ce43 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: 2024-12-08 15:21+0100\n"
"POT-Creation-Date: 2024-12-09 18:15+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"
@@ -39,7 +39,8 @@ msgstr ""
msgid "Digiline channel"
msgstr ""

#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
#: advtrains/atc.lua advtrains/wagons.lua
#: advtrains_line_automation/stoprail.lua
#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr ""
@@ -149,6 +150,127 @@ msgstr ""
msgid "Chimney"
msgstr ""

#: advtrains/init.lua
msgid "Restoring saved state in 1 second..."
msgstr ""

#: advtrains/init.lua
msgid "Reload successful!"
msgstr ""

#: advtrains/init.lua
msgid "Removing unused wagon"
msgstr ""

#: advtrains/init.lua
msgid "from wagon_save table."
msgstr ""

#: advtrains/init.lua
msgid "Train"
msgstr ""

#: advtrains/init.lua
msgid ""
"had no wagons left because of some bug. It is being deleted. Wave it goodbye!"
msgstr ""

#: advtrains/init.lua
msgid "Saving failed: "
msgstr ""

#: advtrains/init.lua
msgid "Instructed to save() but load() was never called!"
msgstr ""

#: advtrains/init.lua
msgid ""
"Crash during advtrains main step - skipping the shutdown save operation to "
"not save inconsistent data!"
msgstr ""

#: advtrains/init.lua
msgid ""
"Detach all players, especially the offline ones, from all trains. Use only "
"when no one serious is on a train."
msgstr ""

#: advtrains/init.lua
msgid ""
"Data is being saved. While saving, advtrains will remove the players from "
"trains. Save files will be reloaded afterwards!"
msgstr ""

#: advtrains/init.lua
msgid "Delete all train routes, force them to recalculate"
msgstr ""

#: advtrains/init.lua
msgid "Successfully invalidated train routes"
msgstr ""

#: advtrains/init.lua
msgid "Returns the position of the train with the given id"
msgstr ""

#: advtrains/init.lua
msgid " does not exist or is invalid"
msgstr ""

#: advtrains/init.lua
msgid "Train "
msgstr ""

#: advtrains/init.lua
msgid " is at "
msgstr ""

#: advtrains/init.lua
msgid "Teleports you to the position of the train with the given id"
msgstr ""

#: advtrains/init.lua
msgid "Teleporting to train "
msgstr ""

#: advtrains/init.lua
msgid "Disable the advtrains globalstep temporarily"
msgstr ""

#: advtrains/init.lua
msgid ""
"The advtrains globalstep has been disabled. Trains are not moving, and no "
"data is saved! Run '/at_disable_step no' to enable again!"
msgstr ""

#: advtrains/init.lua
msgid "Disabled advtrains successfully"
msgstr ""

#: advtrains/init.lua
msgid "Re-enabling advtrains globalstep..."
msgstr ""

#: advtrains/init.lua
msgid "Advtrains is already running normally!"
msgstr ""

#: advtrains/init.lua
msgid "Print advtrains status info"
msgstr ""

#: advtrains/init.lua
msgid "(log"
msgstr ""

#: advtrains/init.lua
msgid "Advtrains Status: no_action"
msgstr ""

#: advtrains/init.lua
msgid "slowdown"
msgstr ""

#: advtrains/misc_nodes.lua
msgid "@1 Platform (low)"
msgstr ""
@@ -313,10 +435,24 @@ msgstr ""
msgid "Insufficient privileges to use this!"
msgstr ""

#: advtrains/wagons.lua
msgid "Uninitialized init="
msgstr ""

#: advtrains/wagons.lua
msgid "Uninitialized, removing"
msgstr ""

#: advtrains/wagons.lua
msgid "This wagon is owned by @1, you can't destroy it."
msgstr ""

#: advtrains/wagons.lua
msgid ""
"Destroying wagon with inventory, but inventory is not found? Shouldn't "
"happen!"
msgstr ""

#: advtrains/wagons.lua
msgid "The wagon's inventory is not empty."
msgstr ""
@@ -331,6 +467,26 @@ msgid ""
"sure, hold Sneak and left-click the wagon."
msgstr ""

#: advtrains/wagons.lua
msgid " wagon:destroy(): data is not set!"
msgstr ""

#: advtrains/wagons.lua
msgid "!!! Train off track !!!"
msgstr ""

#: advtrains/wagons.lua
msgid " units"
msgstr ""

#: advtrains/wagons.lua
msgid "Liquid: "
msgstr ""

#: advtrains/wagons.lua
msgid "Liquid: empty"
msgstr ""

#: advtrains/wagons.lua
msgid "Show Inventory"
msgstr ""
@@ -379,6 +535,30 @@ msgstr ""
msgid "This Wagon ID"
msgstr ""

#: advtrains/wagons.lua
msgid "Allow these players to access your wagon:"
msgstr ""

#: advtrains/wagons.lua
msgid "Wagon road number:"
msgstr ""

#: advtrains/wagons.lua
msgid "Freight Code:"
msgstr ""

#: advtrains/wagons.lua
msgid "Prev FC"
msgstr ""

#: advtrains/wagons.lua
msgid "Current FC: "
msgstr ""

#: advtrains/wagons.lua
msgid "Next FC:"
msgstr ""

#: advtrains/wagons.lua
msgid "Save wagon properties"
msgstr ""
@@ -403,6 +583,22 @@ msgstr ""
msgid "Routingcode"
msgstr ""

#: advtrains/wagons.lua
msgid "Train overview /coupling control:"
msgstr ""

#: advtrains/wagons.lua
msgid "Train overview / coupling control is only shown when the train stands."
msgstr ""

#: advtrains/wagons.lua
msgid "Remote Routesetting"
msgstr ""

#: advtrains/wagons.lua
msgid "Clear 'Disable ARS' flag"
msgstr ""

#: advtrains/wagons.lua
msgid ""
"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
@@ -413,6 +609,30 @@ msgstr ""
msgid "You are not allowed to access the driver stand."
msgstr ""

#: advtrains/wagons.lua
msgid "Missing train_operator privilege"
msgstr ""

#: advtrains/wagons.lua
msgid "Not allowed to do this."
msgstr ""

#: advtrains/wagons.lua
msgid ", using placeholder"
msgstr ""

#: advtrains/wagons.lua
msgid "Unable to load wagon type"
msgstr ""

#: advtrains/wagons.lua
msgid "You don't have the train_operator privilege."
msgstr ""

#: advtrains/wagons.lua
msgid "The track you are trying to place the wagon on is not long enough!"
msgstr ""

#: advtrains_interlocking/routesetting.lua
msgid "Route state changed."
msgstr ""
@@ -437,6 +657,10 @@ msgstr ""
msgid "Point Speed Restriction Track"
msgstr ""

#: advtrains_line_automation/scheduler.lua
msgid "No callback to handle schedule"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Station Code"
msgstr ""
@@ -465,6 +689,10 @@ msgstr ""
msgid "Door Side"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Left,Right,Closed;"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr ""
@@ -473,6 +701,10 @@ msgstr ""
msgid "Kick out passengers"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Trains stopping here (ARS rules);"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Station code \"@1\" already exists and is owned by @2."
msgstr ""
@@ -481,6 +713,14 @@ msgstr ""
msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Unknown Station"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Next Stop:\n"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
msgstr ""
diff --git a/advtrains/po/de.po b/advtrains/po/de.po
index 8a7e009..4bdb0b1 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: 2024-12-08 15:21+0100\n"
"POT-Creation-Date: 2024-12-09 18:15+0100\n"
"PO-Revision-Date: 2023-10-09 11:18+0200\n"
"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
"Language-Team: German\n"
@@ -58,7 +58,8 @@ msgstr "Befehl (wenn aktiviert)"
msgid "Digiline channel"
msgstr "Digiline-Kanal"

#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
#: advtrains/atc.lua advtrains/wagons.lua
#: advtrains_line_automation/stoprail.lua
#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "Speichern"
@@ -162,6 +163,128 @@ msgstr "Führerstand"
msgid "Wheel"
msgstr ""

#: advtrains/init.lua
msgid " does not exist or is invalid"
msgstr ""

#: advtrains/init.lua
msgid " is at "
msgstr ""

#: advtrains/init.lua
msgid "(log"
msgstr ""

#: advtrains/init.lua
msgid "Advtrains Status: no_action"
msgstr ""

#: advtrains/init.lua
msgid "Advtrains is already running normally!"
msgstr ""

#: advtrains/init.lua
msgid ""
"Crash during advtrains main step - skipping the shutdown save operation to "
"not save inconsistent data!"
msgstr ""

#: advtrains/init.lua
msgid ""
"Data is being saved. While saving, advtrains will remove the players from "
"trains. Save files will be reloaded afterwards!"
msgstr ""

#: advtrains/init.lua
msgid "Delete all train routes, force them to recalculate"
msgstr ""

#: advtrains/init.lua
msgid ""
"Detach all players, especially the offline ones, from all trains. Use only "
"when no one serious is on a train."
msgstr ""

#: advtrains/init.lua
msgid "Disable the advtrains globalstep temporarily"
msgstr ""

#: advtrains/init.lua
msgid "Disabled advtrains successfully"
msgstr ""

#: advtrains/init.lua
msgid "Instructed to save() but load() was never called!"
msgstr ""

#: advtrains/init.lua
msgid "Print advtrains status info"
msgstr ""

#: advtrains/init.lua
msgid "Re-enabling advtrains globalstep..."
msgstr ""

#: advtrains/init.lua
msgid "Reload successful!"
msgstr ""

#: advtrains/init.lua
msgid "Removing unused wagon"
msgstr ""

#: advtrains/init.lua
msgid "Restoring saved state in 1 second..."
msgstr ""

#: advtrains/init.lua
msgid "Returns the position of the train with the given id"
msgstr ""

#: advtrains/init.lua
msgid "Saving failed: "
msgstr ""

#: advtrains/init.lua
msgid "Successfully invalidated train routes"
msgstr ""

#: advtrains/init.lua
msgid "Teleporting to train "
msgstr ""

#: advtrains/init.lua
msgid "Teleports you to the position of the train with the given id"
msgstr ""

#: advtrains/init.lua
msgid ""
"The advtrains globalstep has been disabled. Trains are not moving, and no "
"data is saved! Run '/at_disable_step no' to enable again!"
msgstr ""

#: advtrains/init.lua
msgid "Train"
msgstr ""

#: advtrains/init.lua
#, fuzzy
msgid "Train "
msgstr "Der Zug wurde Kopiert."

#: advtrains/init.lua
msgid "from wagon_save table."
msgstr ""

#: advtrains/init.lua
msgid ""
"had no wagons left because of some bug. It is being deleted. Wave it goodbye!"
msgstr ""

#: advtrains/init.lua
msgid "slowdown"
msgstr ""

#: advtrains/misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr "Hoher @1-Bahnsteig (45°)"
@@ -340,10 +463,44 @@ msgid ""
"Punch a wagon to view and edit the Wagon Properties"
msgstr ""

#: advtrains/wagons.lua
msgid " units"
msgstr ""

#: advtrains/wagons.lua
msgid " wagon:destroy(): data is not set!"
msgstr ""

#: advtrains/wagons.lua
msgid "!!! Train off track !!!"
msgstr ""

#: advtrains/wagons.lua
msgid "(Doors closed)"
msgstr "(Türen geschlossen)"

#: advtrains/wagons.lua
msgid ", using placeholder"
msgstr ""

#: advtrains/wagons.lua
msgid "Allow these players to access your wagon:"
msgstr ""

#: advtrains/wagons.lua
msgid "Clear 'Disable ARS' flag"
msgstr ""

#: advtrains/wagons.lua
msgid "Current FC: "
msgstr ""

#: advtrains/wagons.lua
msgid ""
"Destroying wagon with inventory, but inventory is not found? Shouldn't "
"happen!"
msgstr ""

#: advtrains/wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
msgstr "Die Türen sind geschlossen."
@@ -356,6 +513,10 @@ msgstr ""
"Die Türen sind geschlossen. Nutzen Sie Schleichen+Rechtsklick, um trotz "
"geschlossener Türen auszusteigen."

#: advtrains/wagons.lua
msgid "Freight Code:"
msgstr ""

#: advtrains/wagons.lua
msgid "Get off"
msgstr "Aussteigen"
@@ -368,10 +529,39 @@ msgstr "Ausstieg zwingen"
msgid "Line"
msgstr "Linie"

#: advtrains/wagons.lua
msgid "Liquid: "
msgstr ""

#: advtrains/wagons.lua
msgid "Liquid: empty"
msgstr ""

#: advtrains/wagons.lua
msgid "Missing train_operator privilege"
msgstr ""

#: advtrains/wagons.lua
msgid "Next FC:"
msgstr ""

#: advtrains/wagons.lua
#, fuzzy
msgid "Not allowed to do this."
msgstr "Sie dürfen dieses Gleis nicht konfigurieren."

#: advtrains/wagons.lua
msgid "Onboard Computer"
msgstr ""

#: advtrains/wagons.lua
msgid "Prev FC"
msgstr ""

#: advtrains/wagons.lua
msgid "Remote Routesetting"
msgstr ""

#: advtrains/wagons.lua
msgid "Routingcode"
msgstr ""
@@ -396,6 +586,11 @@ msgstr "Innere Anzeige"
msgid "Text displayed outside on train"
msgstr "Äußere Anzeige"

#: advtrains/wagons.lua
#, fuzzy
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/wagons.lua
msgid "The wagon's inventory is not empty."
msgstr "Das Inventar dieses Waggons ist nicht leer."
@@ -421,6 +616,26 @@ msgstr "Dieser Waggon gehört @1, Sie dürfen ihn nicht abbauen."
msgid "Train ID"
msgstr ""

#: advtrains/wagons.lua
msgid "Train overview / coupling control is only shown when the train stands."
msgstr ""

#: advtrains/wagons.lua
msgid "Train overview /coupling control:"
msgstr ""

#: advtrains/wagons.lua
msgid "Unable to load wagon type"
msgstr ""

#: advtrains/wagons.lua
msgid "Uninitialized init="
msgstr ""

#: advtrains/wagons.lua
msgid "Uninitialized, removing"
msgstr ""

#: 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."
@@ -429,6 +644,10 @@ msgstr "Der Waggon muss abgekoppelt sein, damit Sie ihn abbauen können."
msgid "Wagon properties"
msgstr "Waggon-Einstellungen"

#: advtrains/wagons.lua
msgid "Wagon road number:"
msgstr ""

#: advtrains/wagons.lua
msgid ""
"Warning: If you destroy this wagon, you only get some steel back! If you are "
@@ -445,6 +664,11 @@ msgstr "Sie haben keinen Zugang zum Führerstand."
msgid "You can't get on this wagon."
msgstr "Sie können nicht in diesen Waggon einsteigen."

#: advtrains/wagons.lua
#, fuzzy
msgid "You don't have the train_operator privilege."
msgstr "Ihnen fehlt das „@1“-Privileg."

#: advtrains_interlocking/routesetting.lua
msgid "Route state changed."
msgstr ""
@@ -469,6 +693,10 @@ msgstr "Sie dürfen ohne das „@1“-Privileg dieses Gleis nicht konfigurieren.
msgid "You are not allowed to configure this track."
msgstr "Sie dürfen dieses Gleis nicht konfigurieren."

#: advtrains_line_automation/scheduler.lua
msgid "No callback to handle schedule"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Dep. Speed"
msgstr "Zielgeschwindigkeit bei Abfahrt"
@@ -485,6 +713,14 @@ msgstr "Türseite"
msgid "Kick out passengers"
msgstr "Fahrgäste zum Ausstieg zwingen"

#: advtrains_line_automation/stoprail.lua
msgid "Left,Right,Closed;"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Next Stop:\n"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr "Zug Umkehren"
@@ -520,6 +756,14 @@ msgstr ""
msgid "Track"
msgstr "Gleis"

#: advtrains_line_automation/stoprail.lua
msgid "Trains stopping here (ARS rules);"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Unknown Station"
msgstr ""

#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
diff --git a/advtrains/po/fr.po b/advtrains/po/fr.po
index 3c8f5f6..985f8af 100644
--- a/advtrains/po/fr.po
+++ b/advtrains/po/fr.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: advtrains\n"
"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
"POT-Creation-Date: 2024-12-08 15:21+0100\n"
"PO-Revision-Date: 2024-12-04 15:55+0100\n"
"POT-Creation-Date: 2024-12-09 18:15+0100\n"
"PO-Revision-Date: 2024-12-09 18:17+0100\n"
"Last-Translator: Tanavit <tanavit@posto.ovh>\n"
"Language-Team: French\n"
"Language: fr\n"
@@ -53,7 +53,8 @@ msgstr "Commande (marche)"
msgid "Digiline channel"
msgstr "Canal Digiline"

#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
#: advtrains/atc.lua advtrains/wagons.lua
#: advtrains_line_automation/stoprail.lua
#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "Sauvegarder"
@@ -156,6 +157,141 @@ msgstr "Cabine de pilotage"
msgid "Wheel"
msgstr "Roue"

#: advtrains/init.lua
msgid " does not exist or is invalid"
msgstr " n'existe pas ou est invalide"

#: advtrains/init.lua
msgid " is at "
msgstr " est à la position "

#: advtrains/init.lua
msgid "(log"
msgstr "(log"

#: advtrains/init.lua
msgid "Advtrains Status: no_action"
msgstr "État d'advtrains : aucune action"

#: advtrains/init.lua
msgid "Advtrains is already running normally!"
msgstr "Advtrains fonctionne déjà correctement !"

#: advtrains/init.lua
msgid ""
"Crash during advtrains main step - skipping the shutdown save operation to "
"not save inconsistent data!"
msgstr ""
"Crash durant le pas principal d'advtrains - saut de l'opération de "
"sauvegarde de terminaison pour éviter l'enregistrement de données "
"corrompues !"

#: advtrains/init.lua
msgid ""
"Data is being saved. While saving, advtrains will remove the players from "
"trains. Save files will be reloaded afterwards!"
msgstr ""
"Données en cours de sauvegarde. Durant cette phase, advtrains débarquera les "
"joueurs des trains. Les fichiers de sauvegarde seront ultérieurement "
"rechargés !"

# Routage est il le bon terme ?
#: advtrains/init.lua
msgid "Delete all train routes, force them to recalculate"
msgstr "Suppression et recalcul de tous les routages"

#: advtrains/init.lua
msgid ""
"Detach all players, especially the offline ones, from all trains. Use only "
"when no one serious is on a train."
msgstr ""
"Débarque tous les joueurs, en particulier ceux déconnectés, de tous les "
"trains. À n'utiliser que quand aucun joueur sérieux n'a embarqué."

#: advtrains/init.lua
msgid "Disable the advtrains globalstep temporarily"
msgstr "Désactive temporairement le pas global d'advtrains"

#: advtrains/init.lua
msgid "Disabled advtrains successfully"
msgstr "Succès de la désactivation d'advtrains"

#: advtrains/init.lua
msgid "Instructed to save() but load() was never called!"
msgstr "Appel de save() requis sans appel préalable de load() !"

#: advtrains/init.lua
msgid "Print advtrains status info"
msgstr "Affiche les informations d'état d'advtrains"

#: advtrains/init.lua
msgid "Re-enabling advtrains globalstep..."
msgstr "Réacivation du pas global d'advtrains..."

#: advtrains/init.lua
msgid "Reload successful!"
msgstr "Succès du rechargement !"

#: advtrains/init.lua
msgid "Removing unused wagon"
msgstr "Suppression d'un wagon inutilisé"

#: advtrains/init.lua
msgid "Restoring saved state in 1 second..."
msgstr "Restauration du l'état sauvegardé dans une seconde..."

#: advtrains/init.lua
msgid "Returns the position of the train with the given id"
msgstr "Affiche la position du train identifié"

#: advtrains/init.lua
msgid "Saving failed: "
msgstr "Échec de sauvegarde : "

# Routage est il le bon terme ?
#: advtrains/init.lua
msgid "Successfully invalidated train routes"
msgstr "Succès d'invalidation des routages des trains"

#: advtrains/init.lua
msgid "Teleporting to train "
msgstr "Téléportation au train "

#: advtrains/init.lua
msgid "Teleports you to the position of the train with the given id"
msgstr "Vous téléporte à la position du train identifié"

#: advtrains/init.lua
msgid ""
"The advtrains globalstep has been disabled. Trains are not moving, and no "
"data is saved! Run '/at_disable_step no' to enable again!"
msgstr ""
"Le pas global d'advtrains est désactivé. Les trains sont immobiles et aucune "
"donnée n'est sauvegardée. Exécutez '/at_disable_step no ' pour le réactiver !"

#: advtrains/init.lua
msgid "Train"
msgstr "Identificateur du train"

#: advtrains/init.lua
msgid "Train "
msgstr "Identificateur du train "

#: advtrains/init.lua
msgid "from wagon_save table."
msgstr "de la table wagon_save."

#: advtrains/init.lua
msgid ""
"had no wagons left because of some bug. It is being deleted. Wave it goodbye!"
msgstr ""
"n'a plus de wagon à cause d'un bug quelconque. Il est détruit. Faites lui "
"coucou !"

#: advtrains/init.lua
msgid "slowdown"
msgstr "ralentissement"

#: advtrains/misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr "Quai @1 (haut, 45°)"
@@ -341,10 +477,44 @@ msgstr ""
"Outil de propriété du wagon\n"
"Frappez un wagon pour voir et modifier ses propriétés"

#: advtrains/wagons.lua
msgid " units"
msgstr " Unités"

#: advtrains/wagons.lua
msgid " wagon:destroy(): data is not set!"
msgstr " Appel de wagon:destroy() : données non définies !"

#: advtrains/wagons.lua
msgid "!!! Train off track !!!"
msgstr "!!! Train hors voie !!!"

#: advtrains/wagons.lua
msgid "(Doors closed)"
msgstr "(Portes closes)"

#: advtrains/wagons.lua
msgid ", using placeholder"
msgstr ", dans un espace réservé"

#: advtrains/wagons.lua
msgid "Allow these players to access your wagon:"
msgstr "Autoriser ces joueurs à embarquer :"

#: advtrains/wagons.lua
msgid "Clear 'Disable ARS' flag"
msgstr "Effacer le drapeau \"Désactiver l'ARS\""

#: advtrains/wagons.lua
msgid "Current FC: "
msgstr "Code de fret courant: "

#: advtrains/wagons.lua
msgid ""
"Destroying wagon with inventory, but inventory is not found? Shouldn't "
"happen!"
msgstr "Desctruction d'un wagon avec inventaire introuvable ? Anomalie !"

#: advtrains/wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
msgstr "Portes closes : (Essayez la \"sneak key\"!\")"
@@ -357,6 +527,10 @@ msgstr ""
"Portes closes ! Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour "
"franchir les portes et débarquer."

#: advtrains/wagons.lua
msgid "Freight Code:"
msgstr "Code de frêt :"

#: advtrains/wagons.lua
msgid "Get off"
msgstr "Débarquer"
@@ -369,10 +543,38 @@ msgstr "Débarquer (de force)"
msgid "Line"
msgstr "Ligne"

#: advtrains/wagons.lua
msgid "Liquid: "
msgstr "Liquide : "

#: advtrains/wagons.lua
msgid "Liquid: empty"
msgstr "Liquide : vide"

#: advtrains/wagons.lua
msgid "Missing train_operator privilege"
msgstr "Privilège \"train_operator\" manquant"

#: advtrains/wagons.lua
msgid "Next FC:"
msgstr "Code de fret suivant :"

#: advtrains/wagons.lua
msgid "Not allowed to do this."
msgstr "Vous n'êtes pas autorisé effectuer ceci."

#: advtrains/wagons.lua
msgid "Onboard Computer"
msgstr "Ordinateur embarqué"

#: advtrains/wagons.lua
msgid "Prev FC"
msgstr "Code de fret précédent"

#: advtrains/wagons.lua
msgid "Remote Routesetting"
msgstr "Routage à distance"

#: advtrains/wagons.lua
msgid "Routingcode"
msgstr "Code de routage"
@@ -397,6 +599,10 @@ msgstr "Texte affiché à l'intérieur du train"
msgid "Text displayed outside on train"
msgstr "Texte affiché à l'extérieur du train"

#: advtrains/wagons.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/wagons.lua
msgid "The wagon's inventory is not empty."
msgstr "Le stock de ce wagon n'est pas vide."
@@ -421,6 +627,28 @@ msgstr "Ce wagon est la propriété de @1, vous ne pouvez pas le détruire."
msgid "Train ID"
msgstr "Identificateur du train"

#: advtrains/wagons.lua
msgid "Train overview / coupling control is only shown when the train stands."
msgstr ""
"Aperçu du train / commande d'accouplement montré uniquement à l'arrêt du "
"train."

#: advtrains/wagons.lua
msgid "Train overview /coupling control:"
msgstr "Aperçu du train / commande d'accouplement :"

#: advtrains/wagons.lua
msgid "Unable to load wagon type"
msgstr "Impossible de charger le type du wagon"

#: advtrains/wagons.lua
msgid "Uninitialized init="
msgstr "Variable init non initialisée"

#: advtrains/wagons.lua
msgid "Uninitialized, removing"
msgstr "Non initialisé, retiré"

#: advtrains/wagons.lua
msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
msgstr ""
@@ -430,6 +658,10 @@ msgstr ""
msgid "Wagon properties"
msgstr "Propriétés du wagon"

#: advtrains/wagons.lua
msgid "Wagon road number:"
msgstr "Immatriculation du wagon :"

#: advtrains/wagons.lua
msgid ""
"Warning: If you destroy this wagon, you only get some steel back! If you are "
@@ -447,9 +679,13 @@ msgstr "Accès interdit au poste de pilotage."
msgid "You can't get on this wagon."
msgstr "Montée impossible dans ce wagon."

#: advtrains/wagons.lua
msgid "You don't have the train_operator privilege."
msgstr "Vous ne possédez pas le privilège \"train_operator\"."

#: advtrains_interlocking/routesetting.lua
msgid "Route state changed."
msgstr ""
msgstr "Changement d'état de l'itinéraire."

#: advtrains_interlocking/tsr_rail.lua
msgid "Point Speed Restriction Track"
@@ -471,6 +707,10 @@ msgstr "Vous n'êtes pas autorisé à configurer cette voie sans le privilège @
msgid "You are not allowed to configure this track."
msgstr "Vous n'êtes pas autorisé à configurer cette voie."

#: advtrains_line_automation/scheduler.lua
msgid "No callback to handle schedule"
msgstr "Absence de fonction de gestion de planning"

#: advtrains_line_automation/stoprail.lua
msgid "Dep. Speed"
msgstr "Vitesse de départ"
@@ -487,6 +727,14 @@ msgstr "Coté d'ouvertures des portes"
msgid "Kick out passengers"
msgstr "Éjecter les passagers"

#: advtrains_line_automation/stoprail.lua
msgid "Left,Right,Closed;"
msgstr "Gauche,Droit,Fermé;"

#: advtrains_line_automation/stoprail.lua
msgid "Next Stop:\n"
msgstr "Prochain arrêt :\n"

#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr "Inversion du sens de marche"
@@ -521,6 +769,14 @@ msgstr ""
msgid "Track"
msgstr "Voie"

#: advtrains_line_automation/stoprail.lua
msgid "Trains stopping here (ARS rules);"
msgstr "Trains marquant l'arrêt (règles ARS) ;"

#: advtrains_line_automation/stoprail.lua
msgid "Unknown Station"
msgstr "Gare inconnue"

#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr "Effacer l'environnement LuaATC"
diff --git a/advtrains/po/update-translations.sh b/advtrains/po/update-translations.sh
index 1b919d9..4c22c85 100755
--- a/advtrains/po/update-translations.sh
+++ b/advtrains/po/update-translations.sh
@@ -7,7 +7,6 @@ BTDIR="$ATDIR/../basic_trains"
POTFILE="$PODIR/advtrains.pot"

xgettext \
	-v -v -v \
	-D "$ATDIR" \
	-D "$BTDIR" \
	-d advtrains \
diff --git a/advtrains/po/zh_CN.po b/advtrains/po/zh_CN.po
index 1dbf08f..4cfd9dd 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: 2024-12-08 15:21+0100\n"
"POT-Creation-Date: 2024-12-09 18:15+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"
@@ -53,7 +53,8 @@ msgstr "命令 (激活时)"
msgid "Digiline channel"
msgstr "Digiline 频道"

#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
#: advtrains/atc.lua advtrains/wagons.lua
#: advtrains_line_automation/stoprail.lua
#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "保存"
@@ -151,6 +152,128 @@ msgstr "驾驶室"
msgid "Wheel"
msgstr "车轮"

#: advtrains/init.lua
msgid " does not exist or is invalid"
msgstr ""

#: advtrains/init.lua
msgid " is at "
msgstr ""

#: advtrains/init.lua
msgid "(log"
msgstr ""

#: advtrains/init.lua
msgid "Advtrains Status: no_action"
msgstr ""

#: advtrains/init.lua
msgid "Advtrains is already running normally!"
msgstr ""

#: advtrains/init.lua
msgid ""
"Crash during advtrains main step - skipping the shutdown save operation to "
"not save inconsistent data!"
msgstr ""

#: advtrains/init.lua
msgid ""
"Data is being saved. While saving, advtrains will remove the players from "
"trains. Save files will be reloaded afterwards!"
msgstr ""

#: advtrains/init.lua
msgid "Delete all train routes, force them to recalculate"
msgstr ""

#: advtrains/init.lua
msgid ""
"Detach all players, especially the offline ones, from all trains. Use only "
"when no one serious is on a train."
msgstr ""

#: advtrains/init.lua
msgid "Disable the advtrains globalstep temporarily"
msgstr ""

#: advtrains/init.lua
msgid "Disabled advtrains successfully"
msgstr ""

#: advtrains/init.lua
msgid "Instructed to save() but load() was never called!"
msgstr ""

#: advtrains/init.lua
msgid "Print advtrains status info"
msgstr ""

#: advtrains/init.lua
msgid "Re-enabling advtrains globalstep..."
msgstr ""

#: advtrains/init.lua
msgid "Reload successful!"
msgstr ""

#: advtrains/init.lua
msgid "Removing unused wagon"
msgstr ""

#: advtrains/init.lua
msgid "Restoring saved state in 1 second..."
msgstr ""

#: advtrains/init.lua
msgid "Returns the position of the train with the given id"
msgstr ""

#: advtrains/init.lua
msgid "Saving failed: "
msgstr ""

#: advtrains/init.lua
msgid "Successfully invalidated train routes"
msgstr ""

#: advtrains/init.lua
msgid "Teleporting to train "
msgstr ""

#: advtrains/init.lua
msgid "Teleports you to the position of the train with the given id"
msgstr ""

#: advtrains/init.lua
msgid ""
"The advtrains globalstep has been disabled. Trains are not moving, and no "
"data is saved! Run '/at_disable_step no' to enable again!"
msgstr ""

#: advtrains/init.lua
msgid "Train"
msgstr ""

#: advtrains/init.lua
#, fuzzy
msgid "Train "
msgstr "已复制列车。"

#: advtrains/init.lua
msgid "from wagon_save table."
msgstr ""

#: advtrains/init.lua
msgid ""
"had no wagons left because of some bug. It is being deleted. Wave it goodbye!"
msgstr ""

#: advtrains/init.lua
msgid "slowdown"
msgstr ""

#: advtrains/misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr "较高的@1站台 (45°)"
@@ -320,10 +443,44 @@ msgid ""
"Punch a wagon to view and edit the Wagon Properties"
msgstr ""

#: advtrains/wagons.lua
msgid " units"
msgstr ""

#: advtrains/wagons.lua
msgid " wagon:destroy(): data is not set!"
msgstr ""

#: advtrains/wagons.lua
msgid "!!! Train off track !!!"
msgstr ""

#: advtrains/wagons.lua
msgid "(Doors closed)"
msgstr "(车门已关闭)"

#: advtrains/wagons.lua
msgid ", using placeholder"
msgstr ""

#: advtrains/wagons.lua
msgid "Allow these players to access your wagon:"
msgstr ""

#: advtrains/wagons.lua
msgid "Clear 'Disable ARS' flag"
msgstr ""

#: advtrains/wagons.lua
msgid "Current FC: "
msgstr ""

#: advtrains/wagons.lua
msgid ""
"Destroying wagon with inventory, but inventory is not found? Shouldn't "
"happen!"
msgstr ""

#: advtrains/wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
@@ -334,6 +491,10 @@ msgid ""
"off."
msgstr "车门已关闭,请使用潜行+右键单击下车。"

#: advtrains/wagons.lua
msgid "Freight Code:"
msgstr ""

#: advtrains/wagons.lua
msgid "Get off"
msgstr "下车"
@@ -346,10 +507,39 @@ msgstr "强制下车"
msgid "Line"
msgstr "火车线路"

#: advtrains/wagons.lua
msgid "Liquid: "
msgstr ""

#: advtrains/wagons.lua
msgid "Liquid: empty"
msgstr ""

#: advtrains/wagons.lua
msgid "Missing train_operator privilege"
msgstr ""

#: advtrains/wagons.lua
msgid "Next FC:"
msgstr ""

#: advtrains/wagons.lua
#, fuzzy
msgid "Not allowed to do this."
msgstr "您不能调整这段轨道。"

#: advtrains/wagons.lua
msgid "Onboard Computer"
msgstr ""

#: advtrains/wagons.lua
msgid "Prev FC"
msgstr ""

#: advtrains/wagons.lua
msgid "Remote Routesetting"
msgstr ""

#: advtrains/wagons.lua
msgid "Routingcode"
msgstr "路由码"
@@ -374,6 +564,11 @@ msgstr "车厢内部显示"
msgid "Text displayed outside on train"
msgstr "车厢外部显示"

#: advtrains/wagons.lua
#, fuzzy
msgid "The track you are trying to place the wagon on is not long enough!"
msgstr "轨道太短。"

#: advtrains/wagons.lua
msgid "The wagon's inventory is not empty."
msgstr ""
@@ -399,6 +594,26 @@ msgstr "这是 @1 的车厢,您不能摧毁它。"
msgid "Train ID"
msgstr ""

#: advtrains/wagons.lua
msgid "Train overview / coupling control is only shown when the train stands."
msgstr ""

#: advtrains/wagons.lua
msgid "Train overview /coupling control:"
msgstr ""

#: advtrains/wagons.lua
msgid "Unable to load wagon type"
msgstr ""

#: advtrains/wagons.lua
msgid "Uninitialized init="
msgstr ""

#: advtrains/wagons.lua
msgid "Uninitialized, removing"
msgstr ""

#: advtrains/wagons.lua
msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
msgstr ""
@@ -407,6 +622,10 @@ msgstr ""
msgid "Wagon properties"
msgstr "车厢属性"

#: advtrains/wagons.lua
msgid "Wagon road number:"
msgstr ""

#: advtrains/wagons.lua
msgid ""
"Warning: If you destroy this wagon, you only get some steel back! If you are "
@@ -423,6 +642,11 @@ msgstr ""
msgid "You can't get on this wagon."
msgstr ""

#: advtrains/wagons.lua
#, fuzzy
msgid "You don't have the train_operator privilege."
msgstr "您没有“@1”权限。"

#: advtrains_interlocking/routesetting.lua
msgid "Route state changed."
msgstr ""
@@ -447,6 +671,10 @@ msgstr "您没有“@1”权限,不能调整这段轨道。"
msgid "You are not allowed to configure this track."
msgstr "您不能调整这段轨道。"

#: advtrains_line_automation/scheduler.lua
msgid "No callback to handle schedule"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Dep. Speed"
msgstr "出发速度"
@@ -463,6 +691,14 @@ msgstr ""
msgid "Kick out passengers"
msgstr "踢出乘客"

#: advtrains_line_automation/stoprail.lua
msgid "Left,Right,Closed;"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Next Stop:\n"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr "改变行车方向"
@@ -495,6 +731,14 @@ msgstr ""
msgid "Track"
msgstr "轨道"

#: advtrains_line_automation/stoprail.lua
msgid "Trains stopping here (ARS rules);"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Unknown Station"
msgstr ""

#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
diff --git a/advtrains/po/zh_TW.po b/advtrains/po/zh_TW.po
index 56b6531..3eaf1b5 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: 2024-12-08 15:21+0100\n"
"POT-Creation-Date: 2024-12-09 18:15+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"
@@ -53,7 +53,8 @@ msgstr "命令 (啟用時)"
msgid "Digiline channel"
msgstr "Digiline 頻道"

#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
#: advtrains/atc.lua advtrains/wagons.lua
#: advtrains_line_automation/stoprail.lua
#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "儲存"
@@ -151,6 +152,128 @@ msgstr "駕駛室"
msgid "Wheel"
msgstr "車輪"

#: advtrains/init.lua
msgid " does not exist or is invalid"
msgstr ""

#: advtrains/init.lua
msgid " is at "
msgstr ""

#: advtrains/init.lua
msgid "(log"
msgstr ""

#: advtrains/init.lua
msgid "Advtrains Status: no_action"
msgstr ""

#: advtrains/init.lua
msgid "Advtrains is already running normally!"
msgstr ""

#: advtrains/init.lua
msgid ""
"Crash during advtrains main step - skipping the shutdown save operation to "
"not save inconsistent data!"
msgstr ""

#: advtrains/init.lua
msgid ""
"Data is being saved. While saving, advtrains will remove the players from "
"trains. Save files will be reloaded afterwards!"
msgstr ""

#: advtrains/init.lua
msgid "Delete all train routes, force them to recalculate"
msgstr ""

#: advtrains/init.lua
msgid ""
"Detach all players, especially the offline ones, from all trains. Use only "
"when no one serious is on a train."
msgstr ""

#: advtrains/init.lua
msgid "Disable the advtrains globalstep temporarily"
msgstr ""

#: advtrains/init.lua
msgid "Disabled advtrains successfully"
msgstr ""

#: advtrains/init.lua
msgid "Instructed to save() but load() was never called!"
msgstr ""

#: advtrains/init.lua
msgid "Print advtrains status info"
msgstr ""

#: advtrains/init.lua
msgid "Re-enabling advtrains globalstep..."
msgstr ""

#: advtrains/init.lua
msgid "Reload successful!"
msgstr ""

#: advtrains/init.lua
msgid "Removing unused wagon"
msgstr ""

#: advtrains/init.lua
msgid "Restoring saved state in 1 second..."
msgstr ""

#: advtrains/init.lua
msgid "Returns the position of the train with the given id"
msgstr ""

#: advtrains/init.lua
msgid "Saving failed: "
msgstr ""

#: advtrains/init.lua
msgid "Successfully invalidated train routes"
msgstr ""

#: advtrains/init.lua
msgid "Teleporting to train "
msgstr ""

#: advtrains/init.lua
msgid "Teleports you to the position of the train with the given id"
msgstr ""

#: advtrains/init.lua
msgid ""
"The advtrains globalstep has been disabled. Trains are not moving, and no "
"data is saved! Run '/at_disable_step no' to enable again!"
msgstr ""

#: advtrains/init.lua
msgid "Train"
msgstr ""

#: advtrains/init.lua
#, fuzzy
msgid "Train "
msgstr "已複製火車。"

#: advtrains/init.lua
msgid "from wagon_save table."
msgstr ""

#: advtrains/init.lua
msgid ""
"had no wagons left because of some bug. It is being deleted. Wave it goodbye!"
msgstr ""

#: advtrains/init.lua
msgid "slowdown"
msgstr ""

#: advtrains/misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr "較高的@1月臺 (45°)"
@@ -320,10 +443,44 @@ msgid ""
"Punch a wagon to view and edit the Wagon Properties"
msgstr ""

#: advtrains/wagons.lua
msgid " units"
msgstr ""

#: advtrains/wagons.lua
msgid " wagon:destroy(): data is not set!"
msgstr ""

#: advtrains/wagons.lua
msgid "!!! Train off track !!!"
msgstr ""

#: advtrains/wagons.lua
msgid "(Doors closed)"
msgstr "(車門已關閉)"

#: advtrains/wagons.lua
msgid ", using placeholder"
msgstr ""

#: advtrains/wagons.lua
msgid "Allow these players to access your wagon:"
msgstr ""

#: advtrains/wagons.lua
msgid "Clear 'Disable ARS' flag"
msgstr ""

#: advtrains/wagons.lua
msgid "Current FC: "
msgstr ""

#: advtrains/wagons.lua
msgid ""
"Destroying wagon with inventory, but inventory is not found? Shouldn't "
"happen!"
msgstr ""

#: advtrains/wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
@@ -334,6 +491,10 @@ msgid ""
"off."
msgstr "車門已關閉,請使用潛行+右鍵單擊下車。"

#: advtrains/wagons.lua
msgid "Freight Code:"
msgstr ""

#: advtrains/wagons.lua
msgid "Get off"
msgstr "下車"
@@ -346,10 +507,39 @@ msgstr "強制下車"
msgid "Line"
msgstr "火車線路"

#: advtrains/wagons.lua
msgid "Liquid: "
msgstr ""

#: advtrains/wagons.lua
msgid "Liquid: empty"
msgstr ""

#: advtrains/wagons.lua
msgid "Missing train_operator privilege"
msgstr ""

#: advtrains/wagons.lua
msgid "Next FC:"
msgstr ""

#: advtrains/wagons.lua
#, fuzzy
msgid "Not allowed to do this."
msgstr "您不能調整這段軌道。"

#: advtrains/wagons.lua
msgid "Onboard Computer"
msgstr ""

#: advtrains/wagons.lua
msgid "Prev FC"
msgstr ""

#: advtrains/wagons.lua
msgid "Remote Routesetting"
msgstr ""

#: advtrains/wagons.lua
msgid "Routingcode"
msgstr "路由碼"
@@ -374,6 +564,11 @@ msgstr "車廂內部顯示"
msgid "Text displayed outside on train"
msgstr "車廂外部顯示"

#: advtrains/wagons.lua
#, fuzzy
msgid "The track you are trying to place the wagon on is not long enough!"
msgstr "軌道太短。"

#: advtrains/wagons.lua
msgid "The wagon's inventory is not empty."
msgstr ""
@@ -399,6 +594,26 @@ msgstr "這是 @1 的車廂,您不能摧毀它。"
msgid "Train ID"
msgstr ""

#: advtrains/wagons.lua
msgid "Train overview / coupling control is only shown when the train stands."
msgstr ""

#: advtrains/wagons.lua
msgid "Train overview /coupling control:"
msgstr ""

#: advtrains/wagons.lua
msgid "Unable to load wagon type"
msgstr ""

#: advtrains/wagons.lua
msgid "Uninitialized init="
msgstr ""

#: advtrains/wagons.lua
msgid "Uninitialized, removing"
msgstr ""

#: advtrains/wagons.lua
msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
msgstr ""
@@ -407,6 +622,10 @@ msgstr ""
msgid "Wagon properties"
msgstr "車廂屬性"

#: advtrains/wagons.lua
msgid "Wagon road number:"
msgstr ""

#: advtrains/wagons.lua
msgid ""
"Warning: If you destroy this wagon, you only get some steel back! If you are "
@@ -423,6 +642,11 @@ msgstr ""
msgid "You can't get on this wagon."
msgstr ""

#: advtrains/wagons.lua
#, fuzzy
msgid "You don't have the train_operator privilege."
msgstr "您沒有「@1」許可權。"

#: advtrains_interlocking/routesetting.lua
msgid "Route state changed."
msgstr ""
@@ -447,6 +671,10 @@ msgstr "您沒有「@1」許可權,不能調整這段軌道。"
msgid "You are not allowed to configure this track."
msgstr "您不能調整這段軌道。"

#: advtrains_line_automation/scheduler.lua
msgid "No callback to handle schedule"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Dep. Speed"
msgstr "出發速度"
@@ -463,6 +691,14 @@ msgstr ""
msgid "Kick out passengers"
msgstr "踢出乘客"

#: advtrains_line_automation/stoprail.lua
msgid "Left,Right,Closed;"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Next Stop:\n"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr "改變行車方向"
@@ -495,6 +731,14 @@ msgstr ""
msgid "Track"
msgstr "軌道"

#: advtrains_line_automation/stoprail.lua
msgid "Trains stopping here (ARS rules);"
msgstr ""

#: advtrains_line_automation/stoprail.lua
msgid "Unknown Station"
msgstr ""

#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua
index cf15871..13374a0 100644
--- a/advtrains/wagons.lua
+++ b/advtrains/wagons.lua
@@ -7,6 +7,9 @@
-- An entity is ONLY spawned by update_trainpart_properties when it finds it useful.
-- Only data that are only important to the entity itself are stored in the luaentity

-- Translation
S = attrans

-- TP delay when getting off wagon
local GETOFF_TP_DELAY = 0.5

@@ -154,12 +157,12 @@ function wagon:ensure_init()
		end
	end
	if not self.noninitticks then
		atwarn("wagon",self.id,"uninitialized init=",self.initialized)
		atwarn("Wagon",self.id,S("Uninitialized init="),self.initialized)
		self.noninitticks=0
	end
	self.noninitticks=self.noninitticks+1
	if self.noninitticks>20 then
		atwarn("wagon",self.id,"uninitialized, removing")
		atwarn("Wagon",self.id,S("Uninitialized, removing"))
		self:destroy()
	else
		self.object:set_velocity({x=0,y=0,z=0})
@@ -182,7 +185,7 @@ function wagon:on_punch(puncher, time_from_last_punch, tool_capabilities, direct
			return
		end
		if data.owner and puncher:get_player_name()~=data.owner and (not minetest.check_player_privs(puncher, {train_admin = true })) then
		   minetest.chat_send_player(puncher:get_player_name(), attrans("This wagon is owned by @1, you can't destroy it.", data.owner));
		   minetest.chat_send_player(puncher:get_player_name(), S("This wagon is owned by @1, you can't destroy it.", data.owner));
		   return
		end
		
@@ -201,25 +204,25 @@ function wagon:on_punch(puncher, time_from_last_punch, tool_capabilities, direct
		if self.has_inventory then
			local inv=minetest.get_inventory({type="detached", name="advtrains_wgn_"..self.id})
			if not inv then -- inventory is not initialized when wagon was never loaded - should never happen
				atwarn("Destroying wagon with inventory, but inventory is not found? Shouldn't happen!")
				atwarn(S("Destroying wagon with inventory, but inventory is not found? Shouldn't happen!"))
				return
			end
			for listname, _ in pairs(inv:get_lists()) do
				if not inv:is_empty(listname) then
					minetest.chat_send_player(puncher:get_player_name(), attrans("The wagon's inventory is not empty."));
					minetest.chat_send_player(puncher:get_player_name(), S("The wagon's inventory is not empty."));
					return
				end
			end
		end
		
		if #(self:train().trainparts)>1 then
		   minetest.chat_send_player(puncher:get_player_name(), attrans("Wagon needs to be decoupled from other wagons in order to destroy it."));
		   minetest.chat_send_player(puncher:get_player_name(), S("Wagon needs to be decoupled from other wagons in order to destroy it."));
		   return
		end

		local pc=puncher:get_player_control()
		if not pc.sneak then
			minetest.chat_send_player(puncher:get_player_name(), attrans("Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon."))
			minetest.chat_send_player(puncher:get_player_name(), S("Warning: If you destroy this wagon, you only get some steel back! If you are sure, hold Sneak and left-click the wagon."))
			return
		end
		
@@ -240,7 +243,7 @@ function wagon:destroy()
	if self.id then
		local data = advtrains.wagons[self.id]
		if not data then
			atwarn("wagon:destroy(): data is not set!")
			atwarn(S(" wagon:destroy(): data is not set!"))
			return
		end
		
@@ -367,15 +370,15 @@ function wagon:on_step(dtime)
		
		--show off-track information in outside text instead of notifying the whole server about this
		if train.off_track then
			outside = outside .."\n!!! Train off track !!!"
			outside = outside .."\n"..S("!!! Train off track !!!")
		end
		
		-- liquid container: display liquid contents in infotext
		if self.techage_liquid_capacity then
			if data.techage_liquid and data.techage_liquid.name then
				outside = outside .."\nLiquid: "..data.techage_liquid.name..", "..data.techage_liquid.amount.." units"
				outside = outside .."\n"..S("Liquid: ")..data.techage_liquid.name..", "..data.techage_liquid.amount..S(" units")
			else
				outside = outside .."\nLiquid: empty"
				outside = outside .."\n"..S("Liquid: empty")
			end
		end
		
@@ -661,21 +664,21 @@ function wagon:on_rightclick(clicker)
					end
				end
				if self.has_inventory and self.get_inventory_formspec and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) then
					poss[#poss+1]={name=attrans("Show Inventory"), key="inv"}
					poss[#poss+1]={name=S("Show Inventory"), key="inv"}
				end
				if self.seat_groups[sgr].driving_ctrl_access and advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist) then
					poss[#poss+1]={name=attrans("Onboard Computer"), key="bordcom"}
					poss[#poss+1]={name=S("Onboard Computer"), key="bordcom"}
				end
				if data.owner==pname then
					poss[#poss+1]={name=attrans("Wagon properties"), key="prop"}
					poss[#poss+1]={name=S("Wagon properties"), key="prop"}
				end
				if not self.seat_groups[sgr].require_doors_open or self:train().door_open~=0 then
					poss[#poss+1]={name=attrans("Get off"), key="off"}
					poss[#poss+1]={name=S("Get off"), key="off"}
				else
					if clicker:get_player_control().sneak then
						poss[#poss+1]={name=attrans("Get off (forced)"), key="off"}
						poss[#poss+1]={name=S("Get off (forced)"), key="off"}
					else
						poss[#poss+1]={name=attrans("(Doors closed)"), key="dcwarn"}
						poss[#poss+1]={name=S("(Doors closed)"), key="dcwarn"}
					end
				end
				if #poss==0 then
@@ -685,7 +688,7 @@ function wagon:on_rightclick(clicker)
				else
					local form = "size[5,"..1+(#poss).."]"
					for pos,ent in ipairs(poss) do
						form = form .. "button_exit[0.5,"..(pos-0.5)..";4,1;"..ent.key..";"..ent.name.."]"
						form = form.. "button_exit[0.5,"..(pos-0.5)..";4,1;"..ent.key..";"..ent.name.."]"
					end
					minetest.show_formspec(pname, "advtrains_seating_"..self.id, form)
				end
@@ -704,7 +707,7 @@ function wagon:on_rightclick(clicker)
				end
				
				local doors_open = self:train().door_open~=0 or clicker:get_player_control().sneak
				local allow, rsn=false, attrans("This wagon has no seats.")
				local allow, rsn=false, S("This wagon has no seats.")
				for _,sgr in ipairs(self.assign_to_seat_group) do
					allow, rsn = self:check_seat_group_access(pname, sgr)
					if allow then
@@ -715,16 +718,16 @@ function wagon:on_rightclick(clicker)
										self:get_on(clicker, seatid)
										return
									else
										rsn=attrans("This wagon is full.")
										rsn=S("This wagon is full.")
									end
								else
									rsn=attrans("Doors are closed! (Try holding sneak key!)")
									rsn=S("Doors are closed! (Try holding sneak key!)")
								end
							end
						end
					end
				end
				minetest.chat_send_player(pname, rsn or attrans("You can't get on this wagon."))
				minetest.chat_send_player(pname, rsn or S("You can't get on this wagon."))
			else
				self:show_get_on_form(pname)
			end
@@ -850,7 +853,7 @@ function wagon:show_get_on_form(pname)
		end
		return
	end
	local form, comma="size[5,8]label[0.5,0.5;"..attrans("Select seat:").."]textlist[0.5,1;4,6;seat;", ""
	local form, comma="size[5,8]label[0.5,0.5;"..S("Select seat:").."]textlist[0.5,1;4,6;seat;", ""
	for seatno, seattbl in ipairs(self.seats) do
		local addtext, colorcode="", ""
		if data.seatp and data.seatp[seatno] then
@@ -862,7 +865,7 @@ function wagon:show_get_on_form(pname)
	end
	form=form..";0,false]"
	if self.has_inventory and self.get_inventory_formspec then
		form=form.."button_exit[1,7;3,1;inv;"..attrans("Show Inventory").."]"
		form=form.."button_exit[1,7;3,1;inv;"..S("Show Inventory").."]"
	end
	minetest.show_formspec(pname, "advtrains_geton_"..self.id, form)
end
@@ -874,26 +877,26 @@ 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 "").."]"
	form=form.."label[0.2,0;"..S("This Wagon ID")..": "..self.id.."]"
	form = form.. "field[0.5,1;4.5,1;whitelist;"..S("Allow these players to access your wagon:")..";"..minetest.formspec_escape(data.whitelist or "").."]"
	form = form.. "field[0.5,2;4.5,1;roadnumber;"..S("Wagon road number:")..";"..minetest.formspec_escape(data.roadnumber or "").."]"
	local fc = ""
	if data.fc then
		fc = table.concat(data.fc, "!")
	end
	form = form .. "field[0.5,3;4.5,1;fc;Freight Code:;"..fc.."]"
	form = form.. "field[0.5,3;4.5,1;fc;"..S("Freight Code:")..";"..fc.."]"
	if data.fc then
		if not data.fcind then data.fcind = 1 end
		if data.fcind > 1 then
			form=form.."button[0.5,3.5;1,1;fcp;prev FC]"
			form=form.."button[0.5,3.5;1,1;fcp;"..S("Prev FC").."]"
		end
		form=form.."label[1.5,3.5;Current FC:]"
		form=form.."label[1.5,3.5;"..S("Current FC: ").."]"

		local cur = data.fc[data.fcind] or ""
		form=form.."label[1.5,3.75;"..minetest.formspec_escape(cur).."]"
		form=form.."button[3.5,3.5;1,1;fcn;next FC]"
		form=form.."button[3.5,3.5;1,1;fcn;"..S("Next FC:").."]"
	end
	form=form.."button_exit[0.5,4.5;4,1;save;"..attrans("Save wagon properties").."]"
	form=form.."button_exit[0.5,4.5;4,1;save;"..S("Save wagon properties").."]"
	minetest.show_formspec(pname, "advtrains_prop_"..self.id, form)
end

@@ -978,30 +981,30 @@ 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 "")).."]"
	form=form.."field[7.5,3.25;3,1;routingcode;"..attrans("Routingcode")..";"..(minetest.formspec_escape(train.routingcode or "")).."]"
	form=form.."textarea[7.5,0.05;10,1;;"..S("Train ID")..": "..(minetest.formspec_escape(train.id or ""))..";]"
	form=form.."textarea[0.5,1.5;7,1;text_outside;"..S("Text displayed outside on train")..";"..(minetest.formspec_escape(train.text_outside or "")).."]"
	form=form.."textarea[0.5,3;7,1;text_inside;"..S("Text displayed inside train")..";"..(minetest.formspec_escape(train.text_inside or "")).."]"
	form=form.."field[7.5,1.75;3,1;line;"..S("Line")..";"..(minetest.formspec_escape(train.line or "")).."]"
	form=form.."field[7.5,3.25;3,1;routingcode;"..S("Routingcode")..";"..(minetest.formspec_escape(train.routingcode or "")).."]"
	--row 5 : train overview and autocoupling
	if train.velocity==0 then
		form=form.."label[0.5,4;Train overview /coupling control:]"
		form=form.."label[0.5,4;"..S("Train overview /coupling control:").."])"
		linhei=5
		local pre_own, pre_wl, owns_any = nil, nil, minetest.check_player_privs(pname, "train_admin")
		for i, tpid in ipairs(train.trainparts) do
			local ent = advtrains.wagons[tpid]
			if ent then
				local roadnumber = ent.roadnumber or ""
				form = form .. string.format("button[%d,%d;%d,%d;%s;%s]", i, linhei, 1, 0.2, "wgprp"..i, roadnumber)
				form = form.. string.format("button[%d,%d;%d,%d;%s;%s]", i, linhei, 1, 0.2, "wgprp"..i, roadnumber)
				local ename = ent.type
				form = form .. "item_image["..i..","..(linhei+0.5)..";1,1;"..ename.."]"
				form = form.. "item_image["..i..","..(linhei+0.5)..";1,1;"..ename.."]"
				if i~=1 then
					if checklock(pname, ent.owner, pre_own, ent.whitelist, pre_wl) then
						form = form .. "image_button["..(i-0.5)..","..(linhei+1.5)..";1,1;advtrains_discouple.png;dcpl_"..i..";]"
						form = form.. "image_button["..(i-0.5)..","..(linhei+1.5)..";1,1;advtrains_discouple.png;dcpl_"..i..";]"
					end
				end
				if i == data.pos_in_trainparts then
					form = form .. "box["..(i-0.1)..","..(linhei+0.4)..";1,1;green]"
					form = form.. "box["..(i-0.1)..","..(linhei+0.4)..";1,1;green]"
				end
				pre_own = ent.owner
				pre_wl = ent.whitelist
@@ -1010,24 +1013,24 @@ function wagon:show_bordcom(pname)
		end
		
		if train.movedir==1 then
			form = form .. "label["..(#train.trainparts+1)..","..(linhei)..";-->]"
			form = form.. "label["..(#train.trainparts+1)..","..(linhei)..";-->]"
		else
			form = form .. "label[0.5,"..(linhei)..";<--]"
			form = form.. "label[0.5,"..(linhei)..";<--]"
		end
		--check cpl_eid_front and _back of train
		local couple_front = checkcouple(train.cpl_front)
		local couple_back = checkcouple(train.cpl_back)
		if couple_front then
			form = form .. "image_button[0.5,"..(linhei+1)..";1,1;advtrains_couple.png;cpl_f;]"
			form = form.. "image_button[0.5,"..(linhei+1)..";1,1;advtrains_couple.png;cpl_f;]"
		end
		if couple_back then
			form = form .. "image_button["..(#train.trainparts+0.5)..","..(linhei+1)..";1,1;advtrains_couple.png;cpl_b;]"
			form = form.. "image_button["..(#train.trainparts+0.5)..","..(linhei+1)..";1,1;advtrains_couple.png;cpl_b;]"
		end
		
	else
		form=form.."label[0.5,4.5;Train overview / coupling control is only shown when the train stands.]"
		form=form.."label[0.5,4.5;"..S("Train overview / coupling control is only shown when the train stands.").."]"
	end
	form = form .. "button[0.5,8;3,1;save;Save]"
	form = form.. "button[0.5,8;3,1;save;"..S("Save").."]"
	
	-- Interlocking functionality: If the interlocking module is loaded, you can set the signal aspect
	-- from inside the train
@@ -1037,14 +1040,14 @@ function wagon:show_bordcom(pname)
			local oci = train.lzb.checkpoints[i]
			if oci.udata and oci.udata.signal_pos then
				if advtrains.interlocking.db.get_sigd_for_signal(oci.udata.signal_pos) then
					form = form .. "button[4.5,8;5,1;ilrs;Remote Routesetting]"
					form = form.. "button[4.5,8;5,1;ilrs;"..S("Remote Routesetting").."]"
					break
				end
			end
			i=i+1
		end
		if train.ars_disable then
			form = form .. "button[4.5,7;5,1;ilarsenable;Clear 'Disable ARS' flag]"
			form = form.. "button[4.5,7;5,1;ilarsenable;"..S("Clear 'Disable ARS' flag").."]"
		end
	end
	
@@ -1261,7 +1264,7 @@ function wagon:seating_from_key_helper(pname, fields, no)
		self:show_bordcom(pname)
	end
	if fields.dcwarn then
		minetest.chat_send_player(pname, attrans("Doors are closed. Use Sneak+rightclick to ignore the closed doors and get off."))
		minetest.chat_send_player(pname, S("Doors are closed. Use Sneak+rightclick to ignore the closed doors and get off."))
	end
	if fields.off then
		self:get_off(no)
@@ -1270,7 +1273,7 @@ end
function wagon:check_seat_group_access(pname, sgr)
	local data = advtrains.wagons[self.id]
	if self.seat_groups[sgr].driving_ctrl_access and not (advtrains.check_driving_couple_protection(pname, data.owner, data.whitelist)) then
		return false, attrans("You are not allowed to access the driver stand.")
		return false, S("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:get_pos(), self:train().text_outside)
@@ -1290,7 +1293,7 @@ end

function advtrains.safe_decouple_wagon(w_id, pname, try_run)
	if not minetest.check_player_privs(pname, "train_operator") then
		minetest.chat_send_player(pname, "Missing train_operator privilege")
		minetest.chat_send_player(pname, S("Missing train_operator privilege"))
		return false
	end
	local data = advtrains.wagons[w_id]
@@ -1308,7 +1311,7 @@ function advtrains.safe_decouple_wagon(w_id, pname, try_run)
	end
	
	if not checklock(pname, data.owner, owdata.owner, data.whitelist, owdata.whitelist) then
		minetest.chat_send_player(pname, "Not allowed to do this.")
		minetest.chat_send_player(pname, S("Not allowed to do this."))
		return false
	end
	
@@ -1333,7 +1336,7 @@ function advtrains.get_wagon_prototype(data)
	end
	local rt, proto = advtrains.resolve_wagon_alias(wt)
	if not rt then
		atwarn("Unable to load wagon type",wt,", using placeholder")
		atwarn(S("Unable to load wagon type"),wt,S(", using placeholder"))
		rt = "advtrains:wagon_placeholder"
		proto = advtrains.wagon_prototypes[rt]
	end
@@ -1370,7 +1373,7 @@ function advtrains.standard_inventory_formspec(self, pname, invname)
	local r = "size[8,11]"..
			"list["..invname..";box;0,0;8,3;]"
	if data.owner==pname then
		r = r .. "button_exit[0,9;4,1;prop;"..attrans("Wagon properties").."]"
		r = r .. "button_exit[0,9;4,1;prop;"..S("Wagon properties").."]"
	end
	r = r .. "list[current_player;main;0,5;8,4;]"..
			"listring[]"
@@ -1427,7 +1430,7 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati
					return itemstack
				end
				if not minetest.check_player_privs(placer, {train_operator = true }) then
					minetest.chat_send_player(pname, "You don't have the train_operator privilege.")
					minetest.chat_send_player(pname, S("You don't have the train_operator privilege."))
					return itemstack
				end
				if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pos, placer:get_player_name()) then
@@ -1439,7 +1442,7 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati
				
				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!")
					minetest.chat_send_player(pname, S("The track you are trying to place the wagon on is not long enough!"))
					return
				end
				
diff --git a/advtrains_line_automation/scheduler.lua b/advtrains_line_automation/scheduler.lua
index 6025b02..5cba0a0 100644
--- a/advtrains_line_automation/scheduler.lua
+++ b/advtrains_line_automation/scheduler.lua
@@ -59,7 +59,7 @@ function sched.run()
				-- run it
				callbacks[elem.e](elem.d)
			else
				atwarn("[lines][scheduler] No callback to handle schedule",elem)
				atwarn("[lines][scheduler] "..S("No callback to handle schedule"),elem)
			end
			cnt=cnt+1
			ucn = units_cnt[elem.u]
diff --git a/advtrains_line_automation/stoprail.lua b/advtrains_line_automation/stoprail.lua
index 6c74a3d..4616e07 100644
--- a/advtrains_line_automation/stoprail.lua
+++ b/advtrains_line_automation/stoprail.lua
@@ -1,6 +1,8 @@
-- stoprail.lua
-- adds "stop rail". Recognized by lzb. (part of behavior is implemented there)

-- Translation
S = attrans

local function to_int(n)
	--- Disallow floating-point numbers
@@ -28,7 +30,7 @@ local function show_stoprailform(pos, player)
	local pe = advtrains.encode_pos(pos)
	local pname = player:get_player_name()
	if minetest.is_protected(pos, pname) then
		minetest.chat_send_player(pname, attrans("You are not allowed to configure this track."))
		minetest.chat_send_player(pname, S("You are not allowed to configure this track."))
		return
	end
	
@@ -51,18 +53,18 @@ local function show_stoprailform(pos, player)
	
	local form = "size[8,7]"
	form = form.."style[stn,ars;font=mono]"
	form = form.."field[0.8,0.8;2,1;stn;"..attrans("Station Code")..";"..minetest.formspec_escape(stdata.stn).."]"
	form = form.."field[2.8,0.8;5,1;stnname;"..attrans("Station Name")..";"..minetest.formspec_escape(stnname).."]"
	form = form.."field[0.80,2.0;1.75,1;ddelay;"..attrans("Door Delay")..";"..minetest.formspec_escape(stdata.ddelay).."]"
	form = form.."field[2.55,2.0;1.75,1;speed;"..attrans("Dep. Speed")..";"..minetest.formspec_escape(stdata.speed).."]"
	form = form.."field[4.30,2.0;1.75,1;track;"..attrans("Track")..";"..minetest.formspec_escape(stdata.track).."]"
	form = form.."field[6.05,2.0;1.75,1;wait;"..attrans("Stop Time")..";"..stdata.wait.."]"
	form = form.."label[0.5,2.6;"..attrans("Door Side").."]"
	form = form.."dropdown[0.51,3.0;2;doors;Left,Right,Closed;"..door_dropdown[stdata.doors].."]"
	form = form.."checkbox[3.00,2.7;reverse;"..attrans("Reverse train")..";"..(stdata.reverse and "true" or "false").."]"
	form = form.."checkbox[3.00,3.1;kick;"..attrans("Kick out passengers")..";"..(stdata.kick and "true" or "false").."]"
	form = form.."textarea[0.8,4.2;7,2;ars;Trains stopping here (ARS rules);"..advtrains.interlocking.ars_to_text(stdata.ars).."]"
	form = form.."button[0.5,6;7,1;save;"..attrans("Save").."]"
	form = form.."field[0.8,0.8;2,1;stn;"..S("Station Code")..";"..minetest.formspec_escape(stdata.stn).."]"
	form = form.."field[2.8,0.8;5,1;stnname;"..S("Station Name")..";"..minetest.formspec_escape(stnname).."]"
	form = form.."field[0.80,2.0;1.75,1;ddelay;"..S("Door Delay")..";"..minetest.formspec_escape(stdata.ddelay).."]"
	form = form.."field[2.55,2.0;1.75,1;speed;"..S("Dep. Speed")..";"..minetest.formspec_escape(stdata.speed).."]"
	form = form.."field[4.30,2.0;1.75,1;track;"..S("Track")..";"..minetest.formspec_escape(stdata.track).."]"
	form = form.."field[6.05,2.0;1.75,1;wait;"..S("Stop Time")..";"..stdata.wait.."]"
	form = form.."label[0.5,2.6;"..S("Door Side").."]"
	form = form.."dropdown[0.51,3.0;2;doors;"..S("Left,Right,Closed;")..door_dropdown[stdata.doors].."]"
	form = form.."checkbox[3.00,2.7;reverse;"..S("Reverse train")..";"..(stdata.reverse and "true" or "false").."]"
	form = form.."checkbox[3.00,3.1;kick;"..S("Kick out passengers")..";"..(stdata.kick and "true" or "false").."]"
	form = form.."textarea[0.8,4.2;7,2;ars;"..S("Trains stopping here (ARS rules);")..advtrains.interlocking.ars_to_text(stdata.ars).."]"
	form = form.."button[0.5,6;7,1;save;"..S("Save").."]"
	
	minetest.show_formspec(pname, "at_lines_stop_"..pe, form)
end
@@ -73,7 +75,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
	local pos = advtrains.decode_pos(pe)
	if pos then
		if minetest.is_protected(pos, pname) then
			minetest.chat_send_player(pname, attrans("You are not allowed to configure this track."))
			minetest.chat_send_player(pname, S("You are not allowed to configure this track."))
			return
		end
		
@@ -94,7 +96,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
					if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then
						stdata.stn = fields.stn
					else
						minetest.chat_send_player(pname, attrans("Station code \"@1\" already exists and is owned by @2.", fields.stn, stn.owner))
						minetest.chat_send_player(pname, S("Station code \"@1\" already exists and is owned by @2.", fields.stn, stn.owner))
						show_stoprailform(pos,player)
						return
					end
@@ -108,7 +110,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
				if (stn.owner == pname or minetest.check_player_privs(pname, "train_admin")) then
					stn.name = fields.stnname
				else
					minetest.chat_send_player(pname, attrans("This station is owned by @1. You are not allowed to edit its name.", stn.owner))
					minetest.chat_send_player(pname, S("This station is owned by @1. You are not allowed to edit its name.", stn.owner))
				end
			end
			
@@ -179,8 +181,8 @@ local adefunc = function(def, preset, suffix, rotation)
							if stdata.ars and (stdata.ars.default or advtrains.interlocking.ars_check_rule_match(stdata.ars, train) ) then
								advtrains.lzb_add_checkpoint(train, index, 2, nil)
								local stn = advtrains.lines.stations[stdata.stn]
								local stnname = stn and stn.name or "Unknown Station"
								train.text_inside = "Next Stop:\n"..stnname
								local stnname = stn and stn.name or S("Unknown Station")
								train.text_inside = S("Next Stop:\n")..stnname
								advtrains.interlocking.ars_set_disable(train, true)
							end
						end
@@ -196,7 +198,7 @@ local adefunc = function(def, preset, suffix, rotation)
						
						if stdata.ars and (stdata.ars.default or advtrains.interlocking.ars_check_rule_match(stdata.ars, train) ) then
							local stn = advtrains.lines.stations[stdata.stn]
							local stnname = stn and stn.name or "Unknown Station"
							local stnname = stn and stn.name or S("Unknown Station")
							
							-- Send ATC command and set text
							advtrains.atc.train_set_command(train, "B0 W O"..stdata.doors..(stdata.kick and "K" or "").." D"..stdata.wait.." OC "..(stdata.reverse and "R" or "").."D"..(stdata.ddelay or 1) .. " A1 S" ..(stdata.speed or "M"), true)
@@ -218,7 +220,7 @@ if minetest.get_modpath("advtrains_train_track") ~= nil then
		models_prefix="advtrains_dtrack",
		models_suffix=".b3d",
		shared_texture="advtrains_dtrack_shared_stop.png",
		description=attrans("Station/Stop Track"),
		description=S("Station/Stop Track"),
		formats={},
		get_additional_definiton = adefunc,
	}, advtrains.trackpresets.t_30deg_straightonly)
-- 
2.30.2